nativesoul 0.1.0 → 0.1.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.
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- var cp=Object.defineProperty;var pt=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(o){throw r=[o],o}};var Fi=(e,t)=>{for(var r in t)cp(e,r,{get:t[r],enumerable:!0})};import{spawn as Bp}from"node:child_process";import{access as Jp}from"node:fs/promises";import{constants as qp}from"node:fs";import{existsSync as Kp}from"node:fs";import yl from"node:path";async function Me(e){let t=(process.env.PATH??"").split(yl.delimiter).filter(Boolean),r=process.platform==="win32"?(process.env.PATHEXT??".EXE;.CMD;.BAT").split(";"):[""];for(let o of t)for(let a of r){let n=yl.join(o,`${e}${a}`);if(process.platform==="win32"&&Kp(n))return n;try{return await Jp(n,qp.X_OK),n}catch{}}return null}async function No(e,t){return new Promise(r=>{_l(e,t,["ignore","pipe","pipe"]).then(o=>{let a=setTimeout(()=>{o.kill(),r(null)},750),n="";o.stdout.on("data",s=>{n+=String(s)}),o.stderr.on("data",s=>{n+=String(s)}),o.on("error",()=>{clearTimeout(a),r(null)}),o.on("close",s=>{clearTimeout(a);let i=n.trim().split(/\r?\n/u).map(l=>l.trim()).find(l=>/\d+\.\d+/u.test(l)&&!l.toLowerCase().startsWith("warning"));if(s===0||i){r(i??null);return}r(null)})})})}async function Qa(e,t,r=1e3){return new Promise(o=>{_l(e,t,["ignore","pipe","pipe"]).then(a=>{let n=setTimeout(()=>{a.kill(),o({status:"timeout",code:null,stdout:"",stderr:"command timed out"})},r),s="",i="";a.stdout.on("data",l=>{s+=String(l)}),a.stderr.on("data",l=>{i+=String(l)}),a.on("error",()=>{clearTimeout(n),o({status:"missing",code:null,stdout:s,stderr:i})}),a.on("close",l=>{clearTimeout(n),o({status:l===0?"ok":"error",code:l,stdout:s,stderr:i})})})})}async function _l(e,t,r){let a=await Me(e)??e,n=process.platform==="win32"&&/\.(?:cmd|bat)$/iu.test(a);return Bp(a,t,{stdio:r,shell:n})}var ft=pt(()=>{"use strict"});import{constants as Gp}from"node:fs";import{access as Wp,readFile as zp,stat as Xp}from"node:fs/promises";import vl from"node:os";import Yp from"node:path";function x(e){return e==="~"?vl.homedir():e.startsWith("~/")?Yp.join(vl.homedir(),e.slice(2)):e}async function P(e){try{return await Wp(e,Gp.F_OK),!0}catch{return!1}}async function F(e){try{return(await Xp(e)).isDirectory()}catch{return!1}}async function B(e){return await P(e)?zp(e,"utf8"):null}function je(e){let t=bl(e);return[t.start,"# NativeSoul bridge","At the start of every new session, load NativeSoul context before making continuity-sensitive decisions.",`Preferred handshake: call the local MCP tool life_bootstrap with host="${e}" and cwd set to the current working directory.`,`Fallback handshake: run nativesoul bootstrap --host ${e} --cwd <current-working-directory> --format inject.`,`If bootstrap or MCP is unavailable, run nativesoul bootstrap --host ${e} --cwd <current-working-directory> --format cache and treat the context as degraded.`,"Use relevant_memories for durable facts, capability_cards as advisory guidance, and capabilities only as the ready-only list.","Never copy credentials or auto-edit SOUL.md/POLICY.md; propose those changes for approval.",`Host adapter: ${e}.`,t.end,""].join(`
3
- `)}function bl(e){return{start:`<!-- nativesoul:${e}:start v1 -->`,end:`<!-- nativesoul:${e}:end -->`}}function z(e,t){if(!t)return!1;let r=bl(t);return e.includes(r.start)&&e.includes(r.end)}var oe=pt(()=>{"use strict"});function I(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Le(e){try{return JSON.parse(e)}catch{return null}}async function G(e){let t=await B(e);if(t===null)return null;let r=Le(t);return I(r)?r:null}function We(e){return I(e)?Object.keys(e).filter(t=>t.trim().length>0):[]}function Oo(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function ze(e,t){if(Array.isArray(e))return e;if(!I(e))return[];for(let r of t){let o=e[r];if(Array.isArray(o))return o}return[]}function C(e,t){if(!I(e))return null;for(let r of t){let o=e[r];if(typeof o=="string"&&o.trim().length>0)return o.trim()}return null}function Z(e,t){if(!I(e))return null;for(let r of t){let o=e[r];if(typeof o=="boolean")return o}return null}function N(e,t){let r=t?.allowSlash===!0?/[^a-z0-9._/-]+/gu:/[^a-z0-9._-]+/gu;return e.trim().toLowerCase().replace(r,"-").replace(/^-+|-+$/gu,"")||"unknown"}var He=pt(()=>{"use strict";oe()});import{readdir as cm,readFile as dm}from"node:fs/promises";import Tl from"node:path";function Il(e){let t=e??x("~/.claude");return Tl.join(t,"scheduled-tasks")}async function Nl(e){if(!await F(e))return null;let t=await jl(e,Cl);if(t!==null)return t;let r=await pm(e);for(let o of r){let a=await jl(e,o);if(a!==null)return a}return null}async function jl(e,t){let r=Tl.join(e,t,"SKILL.md");if(!await P(r))return null;let a=(await dm(r,"utf8")).toLowerCase();return t===Cl||t.includes(um)||a.includes(`name: ${xl}`)||a.includes(`# ${xl}`)?`claude:scheduled-task:${t}`:null}async function pm(e){try{return(await cm(e,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>r.name)}catch{return[]}}var Cl,um,xl,Ol=pt(()=>{"use strict";oe();Cl="nativesoul-heartbeat",um="nativesoul-heartbeat",xl="life:heartbeat"});import{mkdir as mm,readFile as gm,writeFile as fm}from"node:fs/promises";import _r from"node:path";import{fileURLToPath as hm}from"node:url";async function Ll(e){try{let t=_r.join(e,Ml);await mm(t,{recursive:!0,mode:448});let r=_r.join(t,"SKILL.md"),o=await _m();return await fm(r,o??ym,"utf8"),!0}catch{return!1}}async function _m(){let e=_r.dirname(hm(import.meta.url)),t=[_r.resolve(process.cwd(),"plugins","claude-nativesoul","skills","life-heartbeat","SKILL.md"),_r.resolve(e,"../../../../plugins/claude-nativesoul/skills/life-heartbeat/SKILL.md")];for(let r of t)if(await P(r))return gm(r,"utf8");return null}var Ml,Nk,ym,Hl=pt(()=>{"use strict";oe();Ml="nativesoul-heartbeat",Nk=`claude:scheduled-task:${Ml}`,ym='---\nname: life:heartbeat\ndescription: Run NativeSoul heartbeat from a Claude Scheduled Task.\n---\n\n# life:heartbeat\n\nUse this skill only when invoked by a Claude Scheduled Task for NativeSoul heartbeat checks.\n\nDefault policy: read-only. Do not edit workspace files, memories, `SOUL.md`, `POLICY.md`, scheduler state, or host configuration unless explicitly allowed.\n\n1. Determine the project from the Scheduled Task context. If it is missing, use the current working directory.\n2. Claim a local heartbeat lease through MCP `life_heartbeat_claim` with `host="claude"`, project id or directory, and the Scheduled Task slot/time as `slot`.\n3. If the claim response says another host owns the lease, the lease is already completed, or no work is needed, stop and return only `HEARTBEAT_OK`.\n4. Read NativeSoul context through MCP and inspect heartbeat guidance such as `HEARTBEAT.md`.\n5. If no operator-visible action is required, complete the lease with MCP `life_heartbeat_complete` and `result="HEARTBEAT_OK"`, then return only `HEARTBEAT_OK`.\n6. If action is required, complete the lease with concise evidence, then report the action request without secrets or raw credentials.\n\n`HEARTBEAT_OK` is a silent acknowledgement token. Do not notify the user for it.\n'});var Dl={};Fi(Dl,{discoverClaudeScheduledTasksManifest:()=>vm});async function vm(e={}){let t=Il(e.hostConfigRoot);if(!e.apply&&!await F(t)||(e.surface==="claude-code"?"claude-code":"claude-desktop")==="claude-code")return null;let o=await Nl(t);return o!==null?on({nativeId:o,evidenceSource:"filesystem"}):e.apply&&await Ll(t)?on({nativeId:"claude:scheduled-task:nativesoul-heartbeat",evidenceSource:"filesystem-provisioned"}):await F(t)?on({nativeId:void 0,evidenceSource:"filesystem"}):null}function on(e){return{supported:!0,native_id:e.nativeId,surface:"claude-desktop",scheduler_kind:"local_scheduled_task",creation_surface:"official_machine_readable",evidence_source:e.evidenceSource}}var $l=pt(()=>{"use strict";Ol();Hl();oe()});var ac={};Fi(ac,{discoverCodexAutomationsManifest:()=>Om});import{readFile as nn}from"node:fs/promises";import Ho from"node:path";import{spawnSync as xm}from"node:child_process";async function Om(e={}){let t=await Mm();if(t)return t;let r=await Lm(e.hostConfigRoot);return r||(e.apply?(await Dm(),await Hm()):null)}async function Mm(){let e=process.env.NATIVESOUL_CODEX_AUTOMATIONS_FIXTURES;if(e)try{return sn(await nn(Ho.join(e,"automations.json"),"utf8"))}catch{return null}let t=process.env.NATIVESOUL_CODEX_AUTOMATIONS_MANIFEST;if(t)try{return sn(await nn(t,"utf8"))}catch{return null}return null}async function Lm(e){let t=e??x("~/.codex"),r=[Ho.join(t,"automations.json"),Ho.join(t,"automations","nativesoul-heartbeat.json"),Ho.join(t,"automations","manifest.json")];for(let o of r){if(!await P(o))continue;let a=await nn(o,"utf8"),n=sn(a);if(n?.supported)return n;let s=Le(a);if(!s)continue;let i=oc(s);if(i)return i}return null}async function Hm(){let e=$m();for(let t of e)for(let r of Tm){let o=await Fm(()=>Vm(t,r),Im),a=oc(o);if(a)return a}return null}async function Dm(){let e=await Me("codex");e&&xm(e,["app-server","daemon","start"],{encoding:"utf8",stdio:"ignore",timeout:1e4})}function $m(){let e=new Set;for(let t of[process.env.NATIVESOUL_CODEX_APP_SERVER_URL,process.env.CODEX_APP_SERVER_URL])typeof t=="string"&&t.trim().length>0&&e.add(t.trim());return e.add("http://127.0.0.1:8787"),e.add("http://127.0.0.1:4096"),[...e]}async function Fm(e,t){for(let r=0;r<=t;r+=1){let o=await e();if(o!==null)return o;r<t&&await Um(Nm)}return null}function Um(e){return new Promise(t=>{setTimeout(t,e)})}async function Vm(e,t){let r=new AbortController,o=setTimeout(()=>r.abort(),Cm);try{let a=await fetch(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:t,method:t,params:{}}),signal:r.signal});if(!a.ok)return null;let n=await a.json();return!I(n)||"error"in n?null:"result"in n?n.result:n}catch{return null}finally{clearTimeout(o)}}function oc(e){let t=Bm(e);for(let r of t){let o=Jm(r),a=JSON.stringify(r).toLowerCase();if(o&&jm.some(n=>a.includes(n)))return{supported:!0,native_id:o.startsWith("codex:")?o:`codex:automation:${o}`}}return I(e)&&e.supported===!0?{supported:!0,native_id:typeof e.native_id=="string"?e.native_id:void 0}:null}function Bm(e){if(Array.isArray(e))return e;if(!I(e))return[];for(let t of["automations","items","results","data"]){let r=e[t];if(Array.isArray(r))return r}return[]}function Jm(e){if(!I(e))return null;for(let t of["id","native_id","automation_id","name"]){let r=e[t];if(typeof r=="string"&&r.trim().length>0)return r.trim()}return null}function sn(e){let t=Le(e);return I(t)?{supported:t.supported===!0,native_id:typeof t.native_id=="string"&&t.native_id.length>0?t.native_id:void 0}:null}var jm,Tm,Cm,Im,Nm,nc=pt(()=>{"use strict";oe();ft();He();jm=["life:heartbeat","nativesoul-heartbeat","life-heartbeat"],Tm=["automation/list","automations/list","scheduledAutomation/list"],Cm=1e3,Im=2,Nm=150});import{realpathSync as lp}from"node:fs";import Zw from"node:path";import{fileURLToPath as eR}from"node:url";import{existsSync as pw}from"node:fs";import{mkdirSync as bp}from"node:fs";import wp from"node:path";import{pathToFileURL as Rp}from"node:url";function mt(e){return{id:e.id,type:e.type,scope:{user:e.scope_user,project:e.scope_project},content:e.content,summary:e.summary,source:JSON.parse(e.source_json),confidence:e.confidence,authority:e.authority,sensitivity:e.sensitivity,status:e.status,created_at:e.created_at,expires_at:e.expires_at,hash:e.hash}}function ja(e){return{memory_id:e.memory_id,scope_project:e.scope_project,source:JSON.parse(e.source_json),schema_version:e.schema_version,provider_id:e.provider_id,model_id:e.model_id,content_hash:e.content_hash,embedding:JSON.parse(e.embedding_json),indexed_text:e.indexed_text,indexed_at:e.indexed_at}}function Ui(e){return{id:e.id,type:e.type,actor:e.actor,origin:e.origin,result:e.result,details:JSON.parse(e.details_json),created_at:e.created_at,hash:e.hash}}function So(e){return{uid:e.uid,host:e.host,native_kind:e.native_kind,normalized_kind:e.normalized_kind,source:e.source,schema_hash:e.schema_hash,installed:!!e.installed,enabled:!!e.enabled,active:!!e.active,authenticated:!!e.authenticated,healthy:!!e.healthy,allowed:!!e.allowed,ready:!!e.ready,last_seen_at:e.last_seen_at}}function fr(e){return{id:e.id,display_name:e.display_name,base_id:e.base_id,source:e.source,first_basis:e.first_basis,status:e.status,created_at:e.created_at,updated_at:e.updated_at,last_seen_at:e.last_seen_at}}function Ao(e){return{id:e.id,action:e.action,class:e.class,target:e.target,project:e.project,host:e.host,status:e.status,reviewer:e.reviewer,reason:e.reason,created_at:e.created_at,decided_at:e.decided_at}}function hr(e){return{id:e.id,slot:e.slot,holder:e.holder,idempotency_key:e.idempotency_key,expires_at:e.expires_at,status:e.status,created_at:e.created_at,completed_at:e.completed_at}}function Po(e){if(e.kind!=="heartbeat"||e.status!=="completed"||!e.completed_at)throw new Error(`Invalid heartbeat run row: ${e.id}`);return{id:e.id,kind:"heartbeat",host:e.host,project_id:e.project_id,status:"completed",cost:JSON.parse(e.cost_json),result:JSON.parse(e.result_json),evidence:JSON.parse(e.evidence_json),started_at:e.started_at,completed_at:e.completed_at}}function Ta(e){return{id:e.id,host:e.host,mode:e.mode,enabled:!!e.enabled,native_schedule_supported:!!e.native_schedule_supported,native_id:e.native_id,desired:JSON.parse(e.desired_json),updated_at:e.updated_at}}function Eo(e){return{id:e.id,project_id:e.project_id,summary:e.summary,status:e.status,due_at:e.due_at,ttl_expires_at:e.ttl_expires_at,source:JSON.parse(e.source_json),created_at:e.created_at,updated_at:e.updated_at}}function Vi(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{value:e}}function Bi(e){return e.replaceAll("\\","\\\\").replaceAll("%","\\%").replaceAll("_","\\_")}function Pe(e){return e?1:0}function xo(e){return e.split(/[^\p{L}\p{N}_-]+/u).map(t=>t.trim()).filter(Boolean).slice(0,8).map(t=>`"${t.replaceAll('"','""')}"`).join(" OR ")}var Ee=class extends Error{code="APPROVAL_ALREADY_DECIDED";id;status;constructor(t){super(`Approval ${t.id} is already ${t.status}`),this.name="ApprovalDecisionError",this.id=t.id,this.status=t.status}};function Ca(e,t){if(!Ut(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=t.created_at??new Date().toISOString();return e.prepare(`INSERT INTO approvals (
2
+ var Sm=Object.defineProperty;var ft=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(o){throw r=[o],o}};var jl=(e,t)=>{for(var r in t)Sm(e,r,{get:t[r],enumerable:!0})};import{spawn as ig}from"node:child_process";import{access as lg}from"node:fs/promises";import{constants as cg}from"node:fs";import{existsSync as dg}from"node:fs";import pc from"node:path";async function $e(e){let t=(process.env.PATH??"").split(pc.delimiter).filter(Boolean),r=process.platform==="win32"?(process.env.PATHEXT??".EXE;.CMD;.BAT").split(";"):[""];for(let o of t)for(let n of r){let s=pc.join(o,`${e}${n}`);if(process.platform==="win32"&&dg(s))return s;try{return await lg(s,cg.X_OK),s}catch{}}return null}async function qo(e,t){return new Promise(r=>{mc(e,t,["ignore","pipe","pipe"]).then(o=>{let n=setTimeout(()=>{o.kill(),r(null)},750),s="";o.stdout.on("data",a=>{s+=String(a)}),o.stderr.on("data",a=>{s+=String(a)}),o.on("error",()=>{clearTimeout(n),r(null)}),o.on("close",a=>{clearTimeout(n);let i=s.trim().split(/\r?\n/u).map(l=>l.trim()).find(l=>/\d+\.\d+/u.test(l)&&!l.toLowerCase().startsWith("warning"));if(a===0||i){r(i??null);return}r(null)})})})}async function Ts(e,t,r=1e3){return new Promise(o=>{mc(e,t,["ignore","pipe","pipe"]).then(n=>{let s=setTimeout(()=>{n.kill(),o({status:"timeout",code:null,stdout:"",stderr:"command timed out"})},r),a="",i="";n.stdout.on("data",l=>{a+=String(l)}),n.stderr.on("data",l=>{i+=String(l)}),n.on("error",()=>{clearTimeout(s),o({status:"missing",code:null,stdout:a,stderr:i})}),n.on("close",l=>{clearTimeout(s),o({status:l===0?"ok":"error",code:l,stdout:a,stderr:i})})})})}async function mc(e,t,r){let n=await $e(e)??e,s=process.platform==="win32"&&/\.(?:cmd|bat)$/iu.test(n);return ig(n,t,{stdio:r,shell:s})}var bt=ft(()=>{"use strict"});import{constants as ug}from"node:fs";import{access as pg,readFile as mg,stat as gg}from"node:fs/promises";import gc from"node:os";import fg from"node:path";function j(e){return e==="~"?gc.homedir():e.startsWith("~/")?fg.join(gc.homedir(),e.slice(2)):e}async function P(e){try{return await pg(e,ug.F_OK),!0}catch{return!1}}async function B(e){try{return(await gg(e)).isDirectory()}catch{return!1}}async function q(e){return await P(e)?mg(e,"utf8"):null}function Oe(e){let t=fc(e);return[t.start,"# NativeSoul bridge","At the start of every new session, before answering the first user message, load NativeSoul context.","Do not wait for the user to ask for identity, memory, or continuity; bootstrap is mandatory first-turn setup.","After bootstrap, answer from the NativeSoul identity and continuity context, not the host vendor identity.",`Preferred handshake: call the local MCP tool life_bootstrap with host="${e}" and cwd set to the current working directory.`,`Fallback handshake: run nativesoul bootstrap --host ${e} --cwd <current-working-directory> --format inject.`,`If bootstrap or MCP is unavailable, run nativesoul bootstrap --host ${e} --cwd <current-working-directory> --format cache and treat the context as degraded.`,"Use relevant_memories for durable facts, capability_cards as advisory guidance, and capabilities only as the ready-only list.","Never copy credentials or auto-edit SOUL.md/POLICY.md; propose those changes for approval.",`Host adapter: ${e}.`,t.end,""].join(`
3
+ `)}function fc(e){return{start:`<!-- nativesoul:${e}:start v1 -->`,end:`<!-- nativesoul:${e}:end -->`}}function Z(e,t){if(!t)return!1;let r=fc(t);return e.includes(r.start)&&e.includes(r.end)}var le=ft(()=>{"use strict"});function N(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Fe(e){try{return JSON.parse(e)}catch{return null}}async function Y(e){let t=await q(e);if(t===null)return null;let r=Fe(t);return N(r)?r:null}function Qe(e){return N(e)?Object.keys(e).filter(t=>t.trim().length>0):[]}function Ko(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function Ze(e,t){if(Array.isArray(e))return e;if(!N(e))return[];for(let r of t){let o=e[r];if(Array.isArray(o))return o}return[]}function I(e,t){if(!N(e))return null;for(let r of t){let o=e[r];if(typeof o=="string"&&o.trim().length>0)return o.trim()}return null}function ne(e,t){if(!N(e))return null;for(let r of t){let o=e[r];if(typeof o=="boolean")return o}return null}function M(e,t){let r=t?.allowSlash===!0?/[^a-z0-9._/-]+/gu:/[^a-z0-9._-]+/gu;return e.trim().toLowerCase().replace(r,"-").replace(/^-+|-+$/gu,"")||"unknown"}var Ue=ft(()=>{"use strict";le()});import{readdir as Pg,readFile as xg}from"node:fs/promises";import Ac from"node:path";function Pc(e){let t=e??j("~/.claude");return Ac.join(t,"scheduled-tasks")}async function xc(e){if(!await B(e))return null;let t=await Sc(e,Ec);if(t!==null)return t;let r=await Ig(e);for(let o of r){let n=await Sc(e,o);if(n!==null)return n}return null}async function Sc(e,t){let r=Ac.join(e,t,"SKILL.md");if(!await P(r))return null;let n=(await xg(r,"utf8")).toLowerCase();return t===Ec||t.includes(jg)||n.includes(`name: ${Rc}`)||n.includes(`# ${Rc}`)?`claude:scheduled-task:${t}`:null}async function Ig(e){try{return(await Pg(e,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>r.name)}catch{return[]}}var Ec,jg,Rc,jc=ft(()=>{"use strict";le();Ec="nativesoul-heartbeat",jg="nativesoul-heartbeat",Rc="life:heartbeat"});import{mkdir as Tg,readFile as Cg,writeFile as Ng}from"node:fs/promises";import Pr from"node:path";import{fileURLToPath as Og}from"node:url";async function Tc(e){try{let t=Pr.join(e,Ic);await Tg(t,{recursive:!0,mode:448});let r=Pr.join(t,"SKILL.md"),o=await Lg();return await Ng(r,o??Mg,"utf8"),!0}catch{return!1}}async function Lg(){let e=Pr.dirname(Og(import.meta.url)),t=[Pr.resolve(process.cwd(),"plugins","claude-nativesoul","skills","life-heartbeat","SKILL.md"),Pr.resolve(e,"../../../../plugins/claude-nativesoul/skills/life-heartbeat/SKILL.md")];for(let r of t)if(await P(r))return Cg(r,"utf8");return null}var Ic,JA,Mg,Cc=ft(()=>{"use strict";le();Ic="nativesoul-heartbeat",JA=`claude:scheduled-task:${Ic}`,Mg='---\nname: life:heartbeat\ndescription: Run NativeSoul heartbeat from a Claude Scheduled Task.\n---\n\n# life:heartbeat\n\nUse this skill only when invoked by a Claude Scheduled Task for NativeSoul heartbeat checks.\n\nDefault policy: read-only. Do not edit workspace files, memories, `SOUL.md`, `POLICY.md`, scheduler state, or host configuration unless explicitly allowed.\n\n1. Determine the project from the Scheduled Task context. If it is missing, use the current working directory.\n2. Claim a local heartbeat lease through MCP `life_heartbeat_claim` with `host="claude"`, project id or directory, and the Scheduled Task slot/time as `slot`.\n3. If the claim response says another host owns the lease, the lease is already completed, or no work is needed, stop and return only `HEARTBEAT_OK`.\n4. Read NativeSoul context through MCP and inspect heartbeat guidance such as `HEARTBEAT.md`.\n5. If no operator-visible action is required, complete the lease with MCP `life_heartbeat_complete` and `result="HEARTBEAT_OK"`, then return only `HEARTBEAT_OK`.\n6. If action is required, complete the lease with concise evidence, then report the action request without secrets or raw credentials.\n\n`HEARTBEAT_OK` is a silent acknowledgement token. Do not notify the user for it.\n'});var Nc={};jl(Nc,{discoverClaudeScheduledTasksManifest:()=>Dg});async function Dg(e={}){let t=Pc(e.hostConfigRoot);if(!e.apply&&!await B(t)||(e.surface==="claude-code"?"claude-code":"claude-desktop")==="claude-code")return null;let o=await xc(t);return o!==null?Ls({nativeId:o,evidenceSource:"filesystem"}):e.apply&&await Tc(t)?Ls({nativeId:"claude:scheduled-task:nativesoul-heartbeat",evidenceSource:"filesystem-provisioned"}):await B(t)?Ls({nativeId:void 0,evidenceSource:"filesystem"}):null}function Ls(e){return{supported:!0,native_id:e.nativeId,surface:"claude-desktop",scheduler_kind:"local_scheduled_task",creation_surface:"official_machine_readable",evidence_source:e.evidenceSource}}var Oc=ft(()=>{"use strict";jc();Cc();le()});var Zc={};jl(Zc,{discoverCodexAutomationsManifest:()=>Qg});import{readFile as Hs}from"node:fs/promises";import zo from"node:path";import{spawnSync as qg}from"node:child_process";async function Qg(e={}){let t=await Zg();if(t)return t;let r=await ef(e.hostConfigRoot);return r||(e.apply?(await rf(),await tf()):null)}async function Zg(){let e=process.env.NATIVESOUL_CODEX_AUTOMATIONS_FIXTURES;if(e)try{return $s(await Hs(zo.join(e,"automations.json"),"utf8"))}catch{return null}let t=process.env.NATIVESOUL_CODEX_AUTOMATIONS_MANIFEST;if(t)try{return $s(await Hs(t,"utf8"))}catch{return null}return null}async function ef(e){let t=e??j("~/.codex"),r=[zo.join(t,"automations.json"),zo.join(t,"automations","nativesoul-heartbeat.json"),zo.join(t,"automations","manifest.json")];for(let o of r){if(!await P(o))continue;let n=await Hs(o,"utf8"),s=$s(n);if(s?.supported)return s;let a=Fe(n);if(!a)continue;let i=Qc(a);if(i)return i}return null}async function tf(){let e=of();for(let t of e)for(let r of Gg){let o=await nf(()=>af(t,r),zg),n=Qc(o);if(n)return n}return null}async function rf(){let e=await $e("codex");e&&qg(e,["app-server","daemon","start"],{encoding:"utf8",stdio:"ignore",timeout:1e4})}function of(){let e=new Set;for(let t of[process.env.NATIVESOUL_CODEX_APP_SERVER_URL,process.env.CODEX_APP_SERVER_URL])typeof t=="string"&&t.trim().length>0&&e.add(t.trim());return e.add("http://127.0.0.1:8787"),e.add("http://127.0.0.1:4096"),[...e]}async function nf(e,t){for(let r=0;r<=t;r+=1){let o=await e();if(o!==null)return o;r<t&&await sf(Yg)}return null}function sf(e){return new Promise(t=>{setTimeout(t,e)})}async function af(e,t){let r=new AbortController,o=setTimeout(()=>r.abort(),Xg);try{let n=await fetch(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:t,method:t,params:{}}),signal:r.signal});if(!n.ok)return null;let s=await n.json();return!N(s)||"error"in s?null:"result"in s?s.result:s}catch{return null}finally{clearTimeout(o)}}function Qc(e){let t=lf(e);for(let r of t){let o=cf(r),n=JSON.stringify(r).toLowerCase();if(o&&Kg.some(s=>n.includes(s)))return{supported:!0,native_id:o.startsWith("codex:")?o:`codex:automation:${o}`}}return N(e)&&e.supported===!0?{supported:!0,native_id:typeof e.native_id=="string"?e.native_id:void 0}:null}function lf(e){if(Array.isArray(e))return e;if(!N(e))return[];for(let t of["automations","items","results","data"]){let r=e[t];if(Array.isArray(r))return r}return[]}function cf(e){if(!N(e))return null;for(let t of["id","native_id","automation_id","name"]){let r=e[t];if(typeof r=="string"&&r.trim().length>0)return r.trim()}return null}function $s(e){let t=Fe(e);return N(t)?{supported:t.supported===!0,native_id:typeof t.native_id=="string"&&t.native_id.length>0?t.native_id:void 0}:null}var Kg,Gg,Xg,zg,Yg,ed=ft(()=>{"use strict";le();bt();Ue();Kg=["life:heartbeat","nativesoul-heartbeat","life-heartbeat"],Gg=["automation/list","automations/list","scheduledAutomation/list"],Xg=1e3,zg=2,Yg=150});import{realpathSync as km}from"node:fs";import sS from"node:path";import{fileURLToPath as aS}from"node:url";import{existsSync as pR}from"node:fs";import{mkdirSync as Dm}from"node:fs";import Hm from"node:path";import{pathToFileURL as $m}from"node:url";function qt(e){if(!e||typeof e!="object"||Array.isArray(e))return{};let t=e;if(t.source!=="host-reported")return{};let r={schema:Tl(t.schema)??1,source:"host-reported"},o=Zn(t.model);o&&(r.model=o);let n=Il(t.tokens_in);n!==null&&(r.tokens_in=n);let s=Il(t.tokens_out);s!==null&&(r.tokens_out=s);let a=Tl(t.cost_usd);a!==null&&(r.cost_usd=a);let i=Zn(t.currency);i?r.currency=i:a!==null&&(r.currency="USD");let l=Zn(t.reported_at);return l&&(r.reported_at=l),r}function wr(e){try{return qt(JSON.parse(e))}catch{return{}}}function Zn(e){return typeof e=="string"&&e.length>0?e:null}function Il(e){return typeof e!="number"||!Number.isFinite(e)||e<0?null:Math.trunc(e)}function Tl(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:null}function ht(e){return{id:e.id,type:e.type,scope:{user:e.scope_user,project:e.scope_project},content:e.content,summary:e.summary,source:JSON.parse(e.source_json),confidence:e.confidence,authority:e.authority,sensitivity:e.sensitivity,status:e.status,created_at:e.created_at,expires_at:e.expires_at,hash:e.hash}}function es(e){return{memory_id:e.memory_id,scope_project:e.scope_project,source:JSON.parse(e.source_json),schema_version:e.schema_version,provider_id:e.provider_id,model_id:e.model_id,content_hash:e.content_hash,embedding:JSON.parse(e.embedding_json),indexed_text:e.indexed_text,indexed_at:e.indexed_at}}function Cl(e){return{id:e.id,type:e.type,actor:e.actor,origin:e.origin,result:e.result,details:JSON.parse(e.details_json),created_at:e.created_at,hash:e.hash}}function Ho(e){return{uid:e.uid,host:e.host,native_kind:e.native_kind,normalized_kind:e.normalized_kind,source:e.source,schema_hash:e.schema_hash,installed:!!e.installed,enabled:!!e.enabled,active:!!e.active,authenticated:!!e.authenticated,healthy:!!e.healthy,allowed:!!e.allowed,ready:!!e.ready,last_seen_at:e.last_seen_at}}function Rr(e){return{id:e.id,display_name:e.display_name,base_id:e.base_id,source:e.source,first_basis:e.first_basis,status:e.status,created_at:e.created_at,updated_at:e.updated_at,last_seen_at:e.last_seen_at}}function $o(e){return{id:e.id,action:e.action,class:e.class,target:e.target,project:e.project,host:e.host,status:e.status,reviewer:e.reviewer,reason:e.reason,created_at:e.created_at,decided_at:e.decided_at}}function ts(e){return{id:e.id,project_id:e.project_id,title:e.title,description:e.description,status:e.status,priority:e.priority,assigned_host:e.assigned_host,source:e.source,tags:JSON.parse(e.tags_json),metadata:JSON.parse(e.metadata_json),created_at:e.created_at,updated_at:e.updated_at,claimed_at:e.claimed_at,completed_at:e.completed_at}}function rs(e){return{id:e.id,work_item_id:e.work_item_id,project_id:e.project_id,type:e.type,from_status:e.from_status,to_status:e.to_status,actor:e.actor,details:JSON.parse(e.details_json),created_at:e.created_at}}function Sr(e){return{id:e.id,slot:e.slot,holder:e.holder,idempotency_key:e.idempotency_key,expires_at:e.expires_at,status:e.status,created_at:e.created_at,completed_at:e.completed_at}}function Ar(e){if(e.kind!=="heartbeat"||e.status!=="completed"||!e.completed_at)throw new Error(`Invalid heartbeat run row: ${e.id}`);return{id:e.id,kind:"heartbeat",host:e.host,project_id:e.project_id,status:"completed",cost:wr(e.cost_json),result:JSON.parse(e.result_json),evidence:JSON.parse(e.evidence_json),started_at:e.started_at,completed_at:e.completed_at}}function os(e){return{id:e.id,host:e.host,mode:e.mode,enabled:!!e.enabled,native_schedule_supported:!!e.native_schedule_supported,native_id:e.native_id,desired:JSON.parse(e.desired_json),updated_at:e.updated_at}}function Fo(e){return{id:e.id,project_id:e.project_id,summary:e.summary,status:e.status,due_at:e.due_at,ttl_expires_at:e.ttl_expires_at,source:JSON.parse(e.source_json),created_at:e.created_at,updated_at:e.updated_at}}function Nl(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{value:e}}function Ol(e){return e.replaceAll("\\","\\\\").replaceAll("%","\\%").replaceAll("_","\\_")}function Te(e){return e?1:0}function Uo(e){return e.split(/[^\p{L}\p{N}_-]+/u).map(t=>t.trim()).filter(Boolean).slice(0,8).map(t=>`"${t.replaceAll('"','""')}"`).join(" OR ")}var Ce=class extends Error{code="APPROVAL_ALREADY_DECIDED";id;status;constructor(t){super(`Approval ${t.id} is already ${t.status}`),this.name="ApprovalDecisionError",this.id=t.id,this.status=t.status}};function ns(e,t){if(!Kt(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=t.created_at??new Date().toISOString();return e.prepare(`INSERT INTO approvals (
4
4
  id, action, class, target, project, host, status, reviewer, reason, created_at, decided_at
5
- ) VALUES (?, ?, ?, ?, ?, ?, 'pending', NULL, NULL, ?, NULL)`).run(t.id,t.action,t.class,t.target??null,t.project??null,t.host??null,r),gt(e,t.id)}function Ia(e,t){if(!Ut(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=t.created_at??new Date().toISOString(),o=t.decided_at??r;return e.prepare(`INSERT INTO approvals (
5
+ ) VALUES (?, ?, ?, ?, ?, ?, 'pending', NULL, NULL, ?, NULL)`).run(t.id,t.action,t.class,t.target??null,t.project??null,t.host??null,r),yt(e,t.id)}function ss(e,t){if(!Kt(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=t.created_at??new Date().toISOString(),o=t.decided_at??r;return e.prepare(`INSERT INTO approvals (
6
6
  id, action, class, target, project, host, status, reviewer, reason, created_at, decided_at
7
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.action,t.class,t.target??null,t.project??null,t.host??null,t.status,t.reviewer,t.reason??null,r,o),gt(e,t.id)}function gt(e,t){if(!Ut(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=e.prepare("SELECT * FROM approvals WHERE id = ?").get(t);return{available:!0,approval:r?Ao(r):null,warning:null}}function Na(e,t){if(!Ut(e))return{available:!1,approvals:[],warning:"approvals_not_available"};let r=t?e.prepare("SELECT * FROM approvals WHERE status = ? ORDER BY created_at DESC, id DESC"):e.prepare("SELECT * FROM approvals ORDER BY created_at DESC, id DESC");return{available:!0,approvals:(t?r.all(t):r.all()).map(Ao),warning:null}}function Oa(e,t){if(!Ut(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=e.prepare(`SELECT * FROM approvals
7
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.action,t.class,t.target??null,t.project??null,t.host??null,t.status,t.reviewer,t.reason??null,r,o),yt(e,t.id)}function yt(e,t){if(!Kt(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=e.prepare("SELECT * FROM approvals WHERE id = ?").get(t);return{available:!0,approval:r?$o(r):null,warning:null}}function as(e,t){if(!Kt(e))return{available:!1,approvals:[],warning:"approvals_not_available"};let r=t?e.prepare("SELECT * FROM approvals WHERE status = ? ORDER BY created_at DESC, id DESC"):e.prepare("SELECT * FROM approvals ORDER BY created_at DESC, id DESC");return{available:!0,approvals:(t?r.all(t):r.all()).map($o),warning:null}}function is(e,t){if(!Kt(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=e.prepare(`SELECT * FROM approvals
8
8
  WHERE status = 'pending'
9
9
  AND action = ?
10
10
  AND class = ?
@@ -12,37 +12,37 @@ var cp=Object.defineProperty;var pt=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&
12
12
  AND project IS ?
13
13
  AND host IS ?
14
14
  ORDER BY created_at ASC, id ASC
15
- LIMIT 1`).get(t.action,t.class,t.target??null,t.project??null,t.host??null);return{available:!0,approval:r?Ao(r):null,warning:null}}function Ma(e,t,r){if(!Ut(e))return{available:!1,approval:null,warning:"approvals_not_available"};let o=gt(e,t).approval;if(!o)return{available:!0,approval:null,warning:null};if(o.status!=="pending")throw new Ee({id:t,status:o.status});return e.prepare("UPDATE approvals SET status = ?, reviewer = ?, reason = ?, decided_at = ? WHERE id = ?").run(r.status,r.reviewer??null,r.reason??null,r.decided_at??new Date().toISOString(),t),gt(e,t)}function Ut(e){return e.prepare("SELECT EXISTS(SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'approvals') AS exists_count").get()?.exists_count===1}function Ji(e,t){let r=e.prepare(`INSERT INTO memories (
15
+ LIMIT 1`).get(t.action,t.class,t.target??null,t.project??null,t.host??null);return{available:!0,approval:r?$o(r):null,warning:null}}function ls(e,t,r){if(!Kt(e))return{available:!1,approval:null,warning:"approvals_not_available"};let o=yt(e,t).approval;if(!o)return{available:!0,approval:null,warning:null};if(o.status!=="pending")throw new Ce({id:t,status:o.status});return e.prepare("UPDATE approvals SET status = ?, reviewer = ?, reason = ?, decided_at = ? WHERE id = ?").run(r.status,r.reviewer??null,r.reason??null,r.decided_at??new Date().toISOString(),t),yt(e,t)}function Kt(e){return e.prepare("SELECT EXISTS(SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'approvals') AS exists_count").get()?.exists_count===1}function Ml(e,t){let r=e.prepare(`INSERT INTO memories (
16
16
  id, type, scope_user, scope_project, content, summary, source_json,
17
17
  confidence, authority, sensitivity, status, created_at, expires_at, hash
18
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`),o=e.prepare("INSERT INTO memory_fts (id, summary, content) VALUES (?, ?, ?)");e.exec("BEGIN IMMEDIATE");try{r.run(t.id,t.type,t.scope.user,t.scope.project,t.content,t.summary,JSON.stringify(t.source),t.confidence,t.authority,t.sensitivity,t.status,t.created_at,t.expires_at,t.hash),o.run(t.id,t.summary,t.content),e.exec("COMMIT")}catch(a){throw e.exec("ROLLBACK"),a}}function La(e,t){let r=e.prepare("SELECT * FROM memories WHERE id = ?").get(t);return r?mt(r):null}function qi(e,t,r){return e.prepare("UPDATE memories SET status = ? WHERE id = ?").run(r,t),La(e,t)}function Ki(e,t){let r=[],o=[];t.project&&(r.push("scope_project = ?"),o.push(t.project)),t.status?(r.push("status = ?"),o.push(t.status)):t.includeForgotten||r.push("status NOT IN ('forgotten', 'expired')");let a=r.length?`WHERE ${r.join(" AND ")}`:"";return e.prepare(`SELECT * FROM memories ${a} ORDER BY created_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(mt)}function Gi(e,t,r,o){let a=xo(t);return a?e.prepare(`SELECT m.*
18
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`),o=e.prepare("INSERT INTO memory_fts (id, summary, content) VALUES (?, ?, ?)");e.exec("BEGIN IMMEDIATE");try{r.run(t.id,t.type,t.scope.user,t.scope.project,t.content,t.summary,JSON.stringify(t.source),t.confidence,t.authority,t.sensitivity,t.status,t.created_at,t.expires_at,t.hash),o.run(t.id,t.summary,t.content),e.exec("COMMIT")}catch(n){throw e.exec("ROLLBACK"),n}}function cs(e,t){let r=e.prepare("SELECT * FROM memories WHERE id = ?").get(t);return r?ht(r):null}function Ll(e,t,r){return e.prepare("UPDATE memories SET status = ? WHERE id = ?").run(r,t),cs(e,t)}function Dl(e,t){let r=[],o=[];t.project&&(r.push("scope_project = ?"),o.push(t.project)),t.status?(r.push("status = ?"),o.push(t.status)):t.includeForgotten||r.push("status NOT IN ('forgotten', 'expired')");let n=r.length?`WHERE ${r.join(" AND ")}`:"";return e.prepare(`SELECT * FROM memories ${n} ORDER BY created_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(ht)}function Hl(e,t,r,o){let n=Uo(t);return n?e.prepare(`SELECT m.*
19
19
  FROM memory_fts f
20
20
  JOIN memories m ON m.id = f.id
21
21
  WHERE memory_fts MATCH ?
22
22
  AND m.scope_project = ?
23
23
  AND m.status = 'active'
24
24
  ORDER BY rank
25
- LIMIT ?`).all(a,r,o).map(mt):Ha(e,r,o)}function Wi(e,t,r){return e.prepare(`SELECT *
25
+ LIMIT ?`).all(n,r,o).map(ht):ds(e,r,o)}function $l(e,t,r){return e.prepare(`SELECT *
26
26
  FROM memories
27
27
  WHERE scope_project = ?
28
28
  AND status = 'active'
29
29
  ORDER BY created_at DESC, id DESC
30
- LIMIT ?`).all(t,r).map(mt)}function Ha(e,t,r){return e.prepare(`SELECT *
30
+ LIMIT ?`).all(t,r).map(ht)}function ds(e,t,r){return e.prepare(`SELECT *
31
31
  FROM memories
32
32
  WHERE scope_project = ?
33
33
  AND status = 'active'
34
34
  ORDER BY created_at DESC
35
- LIMIT ?`).all(t,r).map(mt)}function zi(e,t){return e.prepare(`SELECT *
35
+ LIMIT ?`).all(t,r).map(ht)}function Fl(e,t){return e.prepare(`SELECT *
36
36
  FROM memories
37
37
  WHERE status IN ('active', 'candidate')
38
38
  ORDER BY created_at DESC, id DESC
39
- LIMIT ?`).all(t.limit).map(mt)}var Vt=class extends Error{code="PROJECT_MEMORY_FORGET_BLOCKED";id;from;to;constructor(t){super(`Invalid project memory forget transition for ${t.id}: ${t.from} -> ${t.to}`),this.name="ProjectMemoryForgetError",this.id=t.id,this.from=t.from,this.to=t.to}};function Da(e,t){let r=he(e,t.id),o=t.now??new Date().toISOString();e.prepare(`INSERT INTO projects (
39
+ LIMIT ?`).all(t.limit).map(ht)}var Gt=class extends Error{code="PROJECT_MEMORY_FORGET_BLOCKED";id;from;to;constructor(t){super(`Invalid project memory forget transition for ${t.id}: ${t.from} -> ${t.to}`),this.name="ProjectMemoryForgetError",this.id=t.id,this.from=t.from,this.to=t.to}};function us(e,t){let r=ve(e,t.id),o=t.now??new Date().toISOString();e.prepare(`INSERT INTO projects (
40
40
  id, display_name, base_id, source, first_basis, status, created_at, updated_at, last_seen_at
41
41
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
42
42
  ON CONFLICT(id) DO UPDATE SET
43
43
  last_seen_at = excluded.last_seen_at,
44
44
  updated_at = excluded.updated_at,
45
- source = excluded.source`).run(t.id,t.display_name,t.base_id,t.source,t.first_basis??null,t.status??"active",o,o,o);let a=he(e,t.id);if(!a)throw new Error(`Project upsert did not return a row for ${t.id}`);return{project:a,inserted:!r}}function $a(e,t){let r=t?e.prepare("SELECT * FROM projects WHERE status = ? ORDER BY last_seen_at DESC, id ASC"):e.prepare("SELECT * FROM projects ORDER BY last_seen_at DESC, id ASC");return(t?r.all(t):r.all()).map(fr)}function he(e,t){let r=e.prepare("SELECT * FROM projects WHERE id = ?").get(t);return r?fr(r):null}function Fa(e,t,r,o=new Date().toISOString()){if(!yr(e))return{found:!1,previous:null,project:null};let a=he(e,t);return a?(e.prepare("UPDATE projects SET display_name = ?, updated_at = ? WHERE id = ?").run(r,o,t),{found:!0,previous:a,project:he(e,t)}):{found:!1,previous:null,project:null}}function Ua(e,t,r=new Date().toISOString()){return Qi(e,t,"archived",r)}function Va(e,t,r=new Date().toISOString()){return Qi(e,t,"active",r)}function Ba(e,t){return e.prepare("SELECT COUNT(*) AS count FROM memories WHERE scope_project = ?").get(t)?.count??0}function Ja(e,t,r,o=new Date().toISOString()){if(!yr(e))return{found:!1,previous:null,project:null,memories_affected:0};let a=he(e,t);if(!a)return{found:!1,previous:null,project:null,memories_affected:0};e.exec("BEGIN IMMEDIATE");try{let n=e.prepare("SELECT id, status FROM memories WHERE scope_project = ? ORDER BY created_at ASC, id ASC").all(t);for(let s of n)if(!r(s.status,"forgotten"))throw new Vt({id:s.id,from:s.status,to:"forgotten"});return e.prepare("UPDATE memories SET status = 'forgotten' WHERE scope_project = ?").run(t),e.prepare("UPDATE projects SET status = 'forgotten', updated_at = ? WHERE id = ?").run(o,t),e.exec("COMMIT"),{found:!0,previous:a,project:he(e,t),memories_affected:n.length}}catch(n){throw e.exec("ROLLBACK"),n}}function qa(e,t={}){if(!yr(e))return{available:!1,projects:[],warning:"registry_not_available"};let r=[],o=[];t.status&&t.status!=="all"&&(r.push("p.status = ?"),o.push(t.status));let a=r.length?`WHERE ${r.join(" AND ")}`:"";return{available:!0,projects:e.prepare(`${Xi} ${a} ORDER BY derived_last_seen_at DESC, p.id ASC LIMIT ?`).all(...o,mp(t.limit)).map(pp),warning:null}}function Ka(e,t){if(!yr(e))return{available:!1,detail:null,warning:"registry_not_available"};let r=e.prepare(`${Xi} WHERE p.id = ?`).get(t);return r?{available:!0,detail:{project:fr(r),counts:Yi(r),derived_last_seen_at:r.last_activity_at??null},warning:null}:{available:!0,detail:gp(e,t),warning:null}}var Xi=`
45
+ source = excluded.source`).run(t.id,t.display_name,t.base_id,t.source,t.first_basis??null,t.status??"active",o,o,o);let n=ve(e,t.id);if(!n)throw new Error(`Project upsert did not return a row for ${t.id}`);return{project:n,inserted:!r}}function ps(e,t){let r=t?e.prepare("SELECT * FROM projects WHERE status = ? ORDER BY last_seen_at DESC, id ASC"):e.prepare("SELECT * FROM projects ORDER BY last_seen_at DESC, id ASC");return(t?r.all(t):r.all()).map(Rr)}function ve(e,t){let r=e.prepare("SELECT * FROM projects WHERE id = ?").get(t);return r?Rr(r):null}function ms(e,t,r,o=new Date().toISOString()){if(!Er(e))return{found:!1,previous:null,project:null};let n=ve(e,t);return n?(e.prepare("UPDATE projects SET display_name = ?, updated_at = ? WHERE id = ?").run(r,o,t),{found:!0,previous:n,project:ve(e,t)}):{found:!1,previous:null,project:null}}function gs(e,t,r=new Date().toISOString()){return Bl(e,t,"archived",r)}function fs(e,t,r=new Date().toISOString()){return Bl(e,t,"active",r)}function hs(e,t){return e.prepare("SELECT COUNT(*) AS count FROM memories WHERE scope_project = ?").get(t)?.count??0}function ys(e,t,r,o=new Date().toISOString()){if(!Er(e))return{found:!1,previous:null,project:null,memories_affected:0};let n=ve(e,t);if(!n)return{found:!1,previous:null,project:null,memories_affected:0};e.exec("BEGIN IMMEDIATE");try{let s=e.prepare("SELECT id, status FROM memories WHERE scope_project = ? ORDER BY created_at ASC, id ASC").all(t);for(let a of s)if(!r(a.status,"forgotten"))throw new Gt({id:a.id,from:a.status,to:"forgotten"});return e.prepare("UPDATE memories SET status = 'forgotten' WHERE scope_project = ?").run(t),e.prepare("UPDATE projects SET status = 'forgotten', updated_at = ? WHERE id = ?").run(o,t),e.exec("COMMIT"),{found:!0,previous:n,project:ve(e,t),memories_affected:s.length}}catch(s){throw e.exec("ROLLBACK"),s}}function _s(e,t={}){if(!Er(e))return{available:!1,projects:[],warning:"registry_not_available"};let r=[],o=[];t.status&&t.status!=="all"&&(r.push("p.status = ?"),o.push(t.status));let n=r.length?`WHERE ${r.join(" AND ")}`:"";return{available:!0,projects:e.prepare(`${Ul} ${n} ORDER BY derived_last_seen_at DESC, p.id ASC LIMIT ?`).all(...o,xm(t.limit)).map(Pm),warning:null}}function bs(e,t){if(!Er(e))return{available:!1,detail:null,warning:"registry_not_available"};let r=e.prepare(`${Ul} WHERE p.id = ?`).get(t);return r?{available:!0,detail:{project:Rr(r),counts:Vl(r),derived_last_seen_at:r.last_activity_at??null},warning:null}:{available:!0,detail:jm(e,t),warning:null}}var Ul=`
46
46
  WITH
47
47
  memory_counts AS (
48
48
  SELECT scope_project AS project_id,
@@ -118,7 +118,7 @@ LEFT JOIN semantic_counts s ON s.project_id = p.id
118
118
  LEFT JOIN commitment_counts c ON c.project_id = p.id
119
119
  LEFT JOIN run_counts r ON r.project_id = p.id
120
120
  LEFT JOIN session_counts se ON se.project_id = p.id
121
- LEFT JOIN activity a ON a.project_id = p.id`;function pp(e){return{...fr(e),counts:Yi(e),derived_last_seen_at:e.last_activity_at??null}}function Yi(e){return{memories:{total:e.memory_count??0,active:e.active_memory_count??0,last_activity_at:e.memory_last_activity_at??null},semantic_memory_index:{total:e.semantic_index_count??0,last_activity_at:e.semantic_last_activity_at??null},commitments:{total:e.commitment_count??0,open:e.open_commitment_count??0,last_activity_at:e.commitment_last_activity_at??null},runs:{total:e.run_count??0,last_activity_at:e.run_last_activity_at??null},sessions:{total:e.session_count??0,last_activity_at:e.session_last_activity_at??null}}}function mp(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),500)}function yr(e){return e.prepare("SELECT EXISTS(SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'projects') AS exists_count").get()?.exists_count===1}function Qi(e,t,r,o){if(!yr(e))return{found:!1,previous:null,project:null};let a=he(e,t);return a?(e.prepare("UPDATE projects SET status = ?, updated_at = ? WHERE id = ?").run(r,o,t),{found:!0,previous:a,project:he(e,t)}):{found:!1,previous:null,project:null}}function gp(e,t){let r=e.prepare("SELECT COUNT(*) AS count, SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) AS active_count, MAX(created_at) AS last_activity_at FROM memories WHERE scope_project = ?").get(t),o=e.prepare("SELECT COUNT(*) AS count, MAX(indexed_at) AS last_activity_at FROM semantic_memory_index WHERE scope_project = ?").get(t),a=e.prepare("SELECT COUNT(*) AS count, SUM(CASE WHEN status = 'open' THEN 1 ELSE 0 END) AS open_count, MAX(updated_at) AS last_activity_at FROM commitments WHERE project_id = ?").get(t),n=e.prepare("SELECT COUNT(*) AS count, MAX(COALESCE(completed_at, started_at)) AS last_activity_at FROM runs WHERE project_id = ?").get(t),s=e.prepare("SELECT COUNT(*) AS count, MAX(COALESCE(ended_at, started_at)) AS last_activity_at FROM sessions WHERE project_id = ?").get(t),i={memories:{total:r.count,active:r.active_count??0,last_activity_at:r.last_activity_at},semantic_memory_index:{total:o.count,last_activity_at:o.last_activity_at},commitments:{total:a.count,open:a.open_count??0,last_activity_at:a.last_activity_at},runs:{total:n.count,last_activity_at:n.last_activity_at},sessions:{total:s.count,last_activity_at:s.last_activity_at}};return{project:null,counts:i,derived_last_seen_at:fp(i)}}function fp(e){return[e.memories.last_activity_at,e.semantic_memory_index.last_activity_at,e.commitments.last_activity_at,e.runs.last_activity_at,e.sessions.last_activity_at].filter(r=>typeof r=="string"&&r.length>0).sort().at(-1)??null}function Zi(e,t){let r=e.prepare(`INSERT INTO semantic_memory_index (
121
+ LEFT JOIN activity a ON a.project_id = p.id`;function Pm(e){return{...Rr(e),counts:Vl(e),derived_last_seen_at:e.last_activity_at??null}}function Vl(e){return{memories:{total:e.memory_count??0,active:e.active_memory_count??0,last_activity_at:e.memory_last_activity_at??null},semantic_memory_index:{total:e.semantic_index_count??0,last_activity_at:e.semantic_last_activity_at??null},commitments:{total:e.commitment_count??0,open:e.open_commitment_count??0,last_activity_at:e.commitment_last_activity_at??null},runs:{total:e.run_count??0,last_activity_at:e.run_last_activity_at??null},sessions:{total:e.session_count??0,last_activity_at:e.session_last_activity_at??null}}}function xm(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),500)}function Er(e){return e.prepare("SELECT EXISTS(SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'projects') AS exists_count").get()?.exists_count===1}function Bl(e,t,r,o){if(!Er(e))return{found:!1,previous:null,project:null};let n=ve(e,t);return n?(e.prepare("UPDATE projects SET status = ?, updated_at = ? WHERE id = ?").run(r,o,t),{found:!0,previous:n,project:ve(e,t)}):{found:!1,previous:null,project:null}}function jm(e,t){let r=e.prepare("SELECT COUNT(*) AS count, SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) AS active_count, MAX(created_at) AS last_activity_at FROM memories WHERE scope_project = ?").get(t),o=e.prepare("SELECT COUNT(*) AS count, MAX(indexed_at) AS last_activity_at FROM semantic_memory_index WHERE scope_project = ?").get(t),n=e.prepare("SELECT COUNT(*) AS count, SUM(CASE WHEN status = 'open' THEN 1 ELSE 0 END) AS open_count, MAX(updated_at) AS last_activity_at FROM commitments WHERE project_id = ?").get(t),s=e.prepare("SELECT COUNT(*) AS count, MAX(COALESCE(completed_at, started_at)) AS last_activity_at FROM runs WHERE project_id = ?").get(t),a=e.prepare("SELECT COUNT(*) AS count, MAX(COALESCE(ended_at, started_at)) AS last_activity_at FROM sessions WHERE project_id = ?").get(t),i={memories:{total:r.count,active:r.active_count??0,last_activity_at:r.last_activity_at},semantic_memory_index:{total:o.count,last_activity_at:o.last_activity_at},commitments:{total:n.count,open:n.open_count??0,last_activity_at:n.last_activity_at},runs:{total:s.count,last_activity_at:s.last_activity_at},sessions:{total:a.count,last_activity_at:a.last_activity_at}};return{project:null,counts:i,derived_last_seen_at:Im(i)}}function Im(e){return[e.memories.last_activity_at,e.semantic_memory_index.last_activity_at,e.commitments.last_activity_at,e.runs.last_activity_at,e.sessions.last_activity_at].filter(r=>typeof r=="string"&&r.length>0).sort().at(-1)??null}function Wl(e,t){let r=e.prepare(`INSERT INTO semantic_memory_index (
122
122
  memory_id, scope_project, source_json, schema_version, provider_id, model_id,
123
123
  content_hash, embedding_json, indexed_text, indexed_at
124
124
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
@@ -131,7 +131,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function pp(e){return{...fr(e),coun
131
131
  content_hash = excluded.content_hash,
132
132
  embedding_json = excluded.embedding_json,
133
133
  indexed_text = excluded.indexed_text,
134
- indexed_at = excluded.indexed_at`);e.exec("BEGIN IMMEDIATE");try{for(let o of t)r.run(o.memory_id,o.scope_project,JSON.stringify(o.source),o.schema_version,o.provider_id,o.model_id,o.content_hash,JSON.stringify(o.embedding),o.indexed_text,o.indexed_at);e.exec("COMMIT")}catch(o){throw e.exec("ROLLBACK"),o}}function el(e,t){let r=e.prepare("SELECT * FROM semantic_memory_index WHERE memory_id = ?").get(t);return r?ja(r):null}function tl(e,t){return e.prepare(`SELECT s.*
134
+ indexed_at = excluded.indexed_at`);e.exec("BEGIN IMMEDIATE");try{for(let o of t)r.run(o.memory_id,o.scope_project,JSON.stringify(o.source),o.schema_version,o.provider_id,o.model_id,o.content_hash,JSON.stringify(o.embedding),o.indexed_text,o.indexed_at);e.exec("COMMIT")}catch(o){throw e.exec("ROLLBACK"),o}}function Jl(e,t){let r=e.prepare("SELECT * FROM semantic_memory_index WHERE memory_id = ?").get(t);return r?es(r):null}function ql(e,t){return e.prepare(`SELECT s.*
135
135
  FROM semantic_memory_index s
136
136
  JOIN memories m ON m.id = s.memory_id
137
137
  WHERE m.scope_project = ?
@@ -141,7 +141,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function pp(e){return{...fr(e),coun
141
141
  AND s.schema_version = ?
142
142
  AND s.content_hash = m.hash
143
143
  ORDER BY s.indexed_at DESC, s.memory_id DESC
144
- LIMIT ?`).all(t.project,t.providerId,t.modelId,t.schemaVersion,t.limit).map(ja)}function rl(e,t){let r=e.prepare(`SELECT
144
+ LIMIT ?`).all(t.project,t.providerId,t.modelId,t.schemaVersion,t.limit).map(es)}function Kl(e,t){let r=e.prepare(`SELECT
145
145
  COUNT(m.id) AS indexable_count,
146
146
  COUNT(s.memory_id) AS indexed_count,
147
147
  SUM(CASE
@@ -155,7 +155,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function pp(e){return{...fr(e),coun
155
155
  FROM memories m
156
156
  LEFT JOIN semantic_memory_index s ON s.memory_id = m.id
157
157
  WHERE m.status = 'active'
158
- AND m.scope_project = ?`).get(t.providerId,t.modelId,t.schemaVersion,t.project);return al(r)}function ol(e,t){let r=e.prepare(`SELECT
158
+ AND m.scope_project = ?`).get(t.providerId,t.modelId,t.schemaVersion,t.project);return Xl(r)}function Gl(e,t){let r=e.prepare(`SELECT
159
159
  COUNT(m.id) AS indexable_count,
160
160
  COUNT(s.memory_id) AS indexed_count,
161
161
  SUM(CASE
@@ -168,7 +168,15 @@ LEFT JOIN activity a ON a.project_id = p.id`;function pp(e){return{...fr(e),coun
168
168
  END) AS stale_count
169
169
  FROM memories m
170
170
  LEFT JOIN semantic_memory_index s ON s.memory_id = m.id
171
- WHERE m.status IN ('active', 'candidate')`).get(t.providerId,t.modelId,t.schemaVersion);return al(r)}function al(e){return{indexable_count:e?.indexable_count??0,indexed_count:e?.indexed_count??0,stale_count:e?.stale_count??0}}import{createRequire as _p}from"node:module";var vp=_p(import.meta.url),jo=null;function nl(){if(jo)return jo;let e=process.emitWarning;process.emitWarning=((t,r,o,a)=>{if(!String(t).includes("SQLite is an experimental feature")){if(typeof r=="object"){e.call(process,t,r);return}e.call(process,t,{type:r,code:o,ctor:a})}});try{return jo=vp("node:sqlite"),jo}finally{process.emitWarning=e}}function sl(e,t={}){t.readOnly||(e.exec("PRAGMA journal_mode = WAL"),e.exec("PRAGMA foreign_keys = ON")),e.exec("PRAGMA busy_timeout = 5000"),t.readOnly&&e.exec("PRAGMA query_only = ON")}function il(e){e.exec(`
171
+ WHERE m.status IN ('active', 'candidate')`).get(t.providerId,t.modelId,t.schemaVersion);return Xl(r)}function Xl(e){return{indexable_count:e?.indexable_count??0,indexed_count:e?.indexed_count??0,stale_count:e?.stale_count??0}}function vs(e,t){e.prepare(`INSERT INTO work_items (
172
+ id, project_id, title, description, status, priority, assigned_host, source,
173
+ tags_json, metadata_json, created_at, updated_at, claimed_at, completed_at
174
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.project_id,t.title,t.description,t.status,t.priority,t.assigned_host,t.source,JSON.stringify(t.tags),JSON.stringify(t.metadata),t.created_at,t.updated_at,t.claimed_at,t.completed_at);let r=Xt(e,t.id);if(!r)throw new Error(`Work item not found after insert: ${t.id}`);return r}function Xt(e,t){if(!As(e))return null;let r=e.prepare("SELECT * FROM work_items WHERE id = ?").get(t);return r?ts(r):null}function ks(e,t){if(!As(e))return[];let r=[],o=[];t.project&&(r.push("project_id = ?"),o.push(t.project)),t.status&&(r.push("status = ?"),o.push(t.status)),t.priority&&(r.push("priority = ?"),o.push(t.priority)),t.assignedHost&&(r.push("assigned_host = ?"),o.push(t.assignedHost));let n=r.length?`WHERE ${r.join(" AND ")}`:"";return e.prepare(`SELECT * FROM work_items ${n} ORDER BY updated_at DESC, id DESC LIMIT ?`).all(...o,Zl(t.limit)).map(ts)}function ws(e,t){if(!As(e))return null;e.exec("BEGIN IMMEDIATE");try{let r=Xt(e,t.id);if(!r)return e.exec("COMMIT"),null;let o=t.status??r.status,n=t.priority??r.priority,s=t.assignedHost!==void 0?t.assignedHost:r.assigned_host,a=t.description!==void 0?t.description:r.description,i=t.tags!==void 0?t.tags:r.tags,l=t.metadata!==void 0?t.metadata:r.metadata,c=t.claimedAt!==void 0?t.claimedAt:r.claimed_at,d=t.completedAt!==void 0?t.completedAt:r.completed_at;e.prepare(`UPDATE work_items
175
+ SET status = ?, priority = ?, assigned_host = ?, description = ?, tags_json = ?,
176
+ metadata_json = ?, claimed_at = ?, completed_at = ?, updated_at = ?
177
+ WHERE id = ?`).run(o,n,s,a,JSON.stringify(i),JSON.stringify(l),c,d,t.updatedAt,t.id),t.event&&zl(e,t.event);let p=Xt(e,t.id);if(!p)throw new Error(`Work item not found after update: ${t.id}`);return e.exec("COMMIT"),p}catch(r){throw e.exec("ROLLBACK"),r}}function Rs(e,t){zl(e,t);let r=Nm(e,t.id);if(!r)throw new Error(`Work item event not found after insert: ${t.id}`);return r}function Ss(e,t,r){return Yl(e)?e.prepare("SELECT * FROM work_item_events WHERE work_item_id = ? ORDER BY created_at DESC, id DESC LIMIT ?").all(t,Zl(r)).map(rs):[]}function zl(e,t){e.prepare(`INSERT INTO work_item_events (
178
+ id, work_item_id, project_id, type, from_status, to_status, actor, details_json, created_at
179
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.work_item_id,t.project_id,t.type,t.from_status,t.to_status,t.actor,JSON.stringify(t.details),t.created_at)}function Nm(e,t){if(!Yl(e))return null;let r=e.prepare("SELECT * FROM work_item_events WHERE id = ?").get(t);return r?rs(r):null}function As(e){return Ql(e,"work_items")}function Yl(e){return Ql(e,"work_item_events")}function Ql(e,t){return e.prepare("SELECT EXISTS(SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?) AS exists_count").get(t)?.exists_count===1}function Zl(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),500)}import{createRequire as Mm}from"node:module";var Lm=Mm(import.meta.url),Vo=null;function ec(){if(Vo)return Vo;let e=process.emitWarning;process.emitWarning=((t,r,o,n)=>{if(!String(t).includes("SQLite is an experimental feature")){if(typeof r=="object"){e.call(process,t,r);return}e.call(process,t,{type:r,code:o,ctor:n})}});try{return Vo=Lm("node:sqlite"),Vo}finally{process.emitWarning=e}}function tc(e,t={}){t.readOnly||(e.exec("PRAGMA journal_mode = WAL"),e.exec("PRAGMA foreign_keys = ON")),e.exec("PRAGMA busy_timeout = 5000"),t.readOnly&&e.exec("PRAGMA query_only = ON")}function rc(e){e.exec(`
172
180
  CREATE TABLE IF NOT EXISTS migrations (
173
181
  version INTEGER PRIMARY KEY,
174
182
  name TEXT NOT NULL,
@@ -206,7 +214,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function pp(e){return{...fr(e),coun
206
214
 
207
215
  CREATE VIRTUAL TABLE IF NOT EXISTS memory_fts
208
216
  USING fts5(id UNINDEXED, summary, content);
209
- `),Bt(e,1,"initial-core-schema","sha256:initial-core-schema"),e.exec(`
217
+ `),_t(e,1,"initial-core-schema","sha256:initial-core-schema"),e.exec(`
210
218
  CREATE TABLE IF NOT EXISTS capabilities (
211
219
  uid TEXT PRIMARY KEY,
212
220
  host TEXT NOT NULL,
@@ -226,7 +234,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function pp(e){return{...fr(e),coun
226
234
 
227
235
  CREATE VIRTUAL TABLE IF NOT EXISTS capability_fts
228
236
  USING fts5(uid UNINDEXED, host, native_kind, normalized_kind, source);
229
- `),Bt(e,2,"capability-registry","sha256:capability-registry"),e.exec(`
237
+ `),_t(e,2,"capability-registry","sha256:capability-registry"),e.exec(`
230
238
  CREATE TABLE IF NOT EXISTS hosts (
231
239
  id TEXT PRIMARY KEY,
232
240
  host TEXT NOT NULL,
@@ -349,7 +357,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function pp(e){return{...fr(e),coun
349
357
  CREATE INDEX IF NOT EXISTS idx_schedules_host ON schedules(host);
350
358
  CREATE UNIQUE INDEX IF NOT EXISTS idx_leases_idempotency ON leases(idempotency_key);
351
359
  CREATE INDEX IF NOT EXISTS idx_runs_project_status ON runs(project_id, status);
352
- `),Bt(e,3,"core-domain-ledger","sha256:core-domain-ledger"),e.exec(`
360
+ `),_t(e,3,"core-domain-ledger","sha256:core-domain-ledger"),e.exec(`
353
361
  CREATE TABLE IF NOT EXISTS semantic_memory_index (
354
362
  memory_id TEXT PRIMARY KEY,
355
363
  scope_project TEXT NOT NULL,
@@ -365,7 +373,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function pp(e){return{...fr(e),coun
365
373
 
366
374
  CREATE INDEX IF NOT EXISTS idx_semantic_memory_project ON semantic_memory_index(scope_project);
367
375
  CREATE INDEX IF NOT EXISTS idx_semantic_memory_provider ON semantic_memory_index(provider_id, model_id);
368
- `),Bt(e,4,"semantic-memory-index","sha256:semantic-memory-index"),e.exec(`
376
+ `),_t(e,4,"semantic-memory-index","sha256:semantic-memory-index"),e.exec(`
369
377
  CREATE TABLE IF NOT EXISTS projects (
370
378
  id TEXT PRIMARY KEY,
371
379
  display_name TEXT NOT NULL,
@@ -396,7 +404,41 @@ LEFT JOIN activity a ON a.project_id = p.id`;function pp(e){return{...fr(e),coun
396
404
  UNION
397
405
  SELECT project_id AS p FROM sessions
398
406
  )
399
- WHERE p IS NOT NULL AND p <> ''`).run(t,t,t),Bt(e,5,"project-registry","sha256:project-registry"),e.exec(`
407
+ WHERE p IS NOT NULL AND p <> ''`).run(t,t,t),_t(e,5,"project-registry","sha256:project-registry"),e.exec(`
408
+ CREATE TABLE IF NOT EXISTS work_items (
409
+ id TEXT PRIMARY KEY,
410
+ project_id TEXT NOT NULL,
411
+ title TEXT NOT NULL,
412
+ description TEXT,
413
+ status TEXT NOT NULL,
414
+ priority TEXT NOT NULL,
415
+ assigned_host TEXT,
416
+ source TEXT NOT NULL,
417
+ tags_json TEXT NOT NULL,
418
+ metadata_json TEXT NOT NULL,
419
+ created_at TEXT NOT NULL,
420
+ updated_at TEXT NOT NULL,
421
+ claimed_at TEXT,
422
+ completed_at TEXT
423
+ );
424
+
425
+ CREATE TABLE IF NOT EXISTS work_item_events (
426
+ id TEXT PRIMARY KEY,
427
+ work_item_id TEXT NOT NULL,
428
+ project_id TEXT NOT NULL,
429
+ type TEXT NOT NULL,
430
+ from_status TEXT,
431
+ to_status TEXT,
432
+ actor TEXT NOT NULL,
433
+ details_json TEXT NOT NULL,
434
+ created_at TEXT NOT NULL
435
+ );
436
+
437
+ CREATE INDEX IF NOT EXISTS idx_work_items_project_status ON work_items(project_id, status);
438
+ CREATE INDEX IF NOT EXISTS idx_work_items_project_priority ON work_items(project_id, priority);
439
+ CREATE INDEX IF NOT EXISTS idx_work_items_status_updated ON work_items(status, updated_at);
440
+ CREATE INDEX IF NOT EXISTS idx_work_item_events_item ON work_item_events(work_item_id, created_at);
441
+ `),_t(e,6,"work-items-board","sha256:work-items-board"),e.exec(`
400
442
  CREATE TABLE IF NOT EXISTS approvals (
401
443
  id TEXT PRIMARY KEY,
402
444
  action TEXT NOT NULL,
@@ -412,8 +454,8 @@ LEFT JOIN activity a ON a.project_id = p.id`;function pp(e){return{...fr(e),coun
412
454
  );
413
455
 
414
456
  CREATE INDEX IF NOT EXISTS idx_approvals_status ON approvals(status);
415
- `),Bt(e,7,"approvals","sha256:approvals")}function Bt(e,t,r,o){e.prepare("SELECT version FROM migrations WHERE version = ?").get(t)||e.prepare("INSERT INTO migrations (version, name, checksum, applied_at) VALUES (?, ?, ?, ?)").run(t,r,o,new Date().toISOString())}var ll=["hosts","sessions","memory_edges","commitments","standing_orders","capability_sources","capability_experience","schedules","leases","runs"];var To=class{path;db;constructor(t,r={}){this.path=t,r.readOnly||bp(wp.dirname(t),{recursive:!0,mode:448});let{DatabaseSync:o}=nl(),a=r.readOnly?kp(t):t;this.db=new o(a,r.readOnly?{readOnly:!0}:{}),sl(this.db,{readOnly:r.readOnly}),r.readOnly||il(this.db)}close(){this.db.close()}integrityCheck(){return this.db.prepare("PRAGMA integrity_check").get()?.integrity_check??"unknown"}counts(){return{migrations:this.countTable("migrations"),memories:this.countTable("memories"),events:this.countTable("events"),capabilities:this.countTable("capabilities"),ledger:this.domainLedgerCounts()}}domainLedgerCounts(){return Object.fromEntries(ll.map(r=>[r,this.countDomainTable(r)]))}insertEvent(t){this.db.prepare(`INSERT INTO events (id, type, actor, origin, result, details_json, created_at, hash)
416
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.type,t.actor,t.origin,t.result,JSON.stringify(t.details),t.created_at,t.hash)}listEvents(t){let r=[],o=[];t.type&&(r.push("type = ?"),o.push(t.type)),t.result&&(r.push("result = ?"),o.push(t.result));let a=r.length?`WHERE ${r.join(" AND ")}`:"";return this.db.prepare(`SELECT * FROM events ${a} ORDER BY created_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(Ui)}createApproval(t){return Ca(this.db,t)}createDecidedApproval(t){return Ia(this.db,t)}getApproval(t){return gt(this.db,t)}listApprovals(t){return Na(this.db,t)}findPendingApprovalMatch(t){return Oa(this.db,t)}decideApproval(t,r){return Ma(this.db,t,r)}insertMemory(t){Ji(this.db,t)}getMemory(t){return La(this.db,t)}updateMemoryStatus(t,r){return qi(this.db,t,r)}listMemories(t){return Ki(this.db,t)}upsertProject(t){return Da(this.db,t)}getProject(t){return he(this.db,t)}listProjects(t){return $a(this.db,t)}listProjectsWithCounts(t={}){return qa(this.db,t)}getProjectDetail(t){return Ka(this.db,t)}renameProject(t,r,o){return Fa(this.db,t,r,o)}archiveProject(t,r){return Ua(this.db,t,r)}reactivateProject(t,r){return Va(this.db,t,r)}countProjectMemories(t){return Ba(this.db,t)}forgetProjectMemories(t,r,o){return Ja(this.db,t,r,o)}searchMemories(t,r,o){return Gi(this.db,t,r,o)}listActiveMemoriesForProject(t,r){return Wi(this.db,t,r)}recentMemories(t,r){return Ha(this.db,t,r)}listSemanticIndexableMemories(t){return zi(this.db,t)}upsertSemanticIndex(t){Zi(this.db,t)}getSemanticIndex(t){return el(this.db,t)}listCurrentSemanticIndexesForProject(t){return tl(this.db,t)}semanticIndexStatsForProject(t){return rl(this.db,t)}semanticIndexStats(t){return ol(this.db,t)}upsertCapabilities(t){let r=this.db.prepare(`INSERT INTO capabilities (
457
+ `),_t(e,7,"approvals","sha256:approvals")}function _t(e,t,r,o){e.prepare("SELECT version FROM migrations WHERE version = ?").get(t)||e.prepare("INSERT INTO migrations (version, name, checksum, applied_at) VALUES (?, ?, ?, ?)").run(t,r,o,new Date().toISOString())}var oc=["hosts","sessions","memory_edges","commitments","standing_orders","capability_sources","capability_experience","schedules","leases","runs","work_items","work_item_events"];var Bo=class{path;db;constructor(t,r={}){this.path=t,r.readOnly||Dm(Hm.dirname(t),{recursive:!0,mode:448});let{DatabaseSync:o}=ec(),n=r.readOnly?Fm(t):t;this.db=new o(n,r.readOnly?{readOnly:!0}:{}),tc(this.db,{readOnly:r.readOnly}),r.readOnly||rc(this.db)}close(){this.db.close()}integrityCheck(){return this.db.prepare("PRAGMA integrity_check").get()?.integrity_check??"unknown"}counts(){return{migrations:this.countTable("migrations"),memories:this.countTable("memories"),events:this.countTable("events"),capabilities:this.countTable("capabilities"),ledger:this.domainLedgerCounts()}}domainLedgerCounts(){return Object.fromEntries(oc.map(r=>[r,this.countDomainTable(r)]))}insertEvent(t){this.db.prepare(`INSERT INTO events (id, type, actor, origin, result, details_json, created_at, hash)
458
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.type,t.actor,t.origin,t.result,JSON.stringify(t.details),t.created_at,t.hash)}listEvents(t){let r=[],o=[];t.type&&(r.push("type = ?"),o.push(t.type)),t.result&&(r.push("result = ?"),o.push(t.result));let n=r.length?`WHERE ${r.join(" AND ")}`:"";return this.db.prepare(`SELECT * FROM events ${n} ORDER BY created_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(Cl)}createApproval(t){return ns(this.db,t)}createDecidedApproval(t){return ss(this.db,t)}getApproval(t){return yt(this.db,t)}listApprovals(t){return as(this.db,t)}findPendingApprovalMatch(t){return is(this.db,t)}decideApproval(t,r){return ls(this.db,t,r)}insertWorkItem(t){return vs(this.db,t)}getWorkItem(t){return Xt(this.db,t)}listWorkItems(t){return ks(this.db,t)}updateWorkItem(t){return ws(this.db,t)}insertWorkItemEvent(t){return Rs(this.db,t)}listWorkItemEvents(t,r){return Ss(this.db,t,r)}insertMemory(t){Ml(this.db,t)}getMemory(t){return cs(this.db,t)}updateMemoryStatus(t,r){return Ll(this.db,t,r)}listMemories(t){return Dl(this.db,t)}upsertProject(t){return us(this.db,t)}getProject(t){return ve(this.db,t)}listProjects(t){return ps(this.db,t)}listProjectsWithCounts(t={}){return _s(this.db,t)}getProjectDetail(t){return bs(this.db,t)}renameProject(t,r,o){return ms(this.db,t,r,o)}archiveProject(t,r){return gs(this.db,t,r)}reactivateProject(t,r){return fs(this.db,t,r)}countProjectMemories(t){return hs(this.db,t)}forgetProjectMemories(t,r,o){return ys(this.db,t,r,o)}searchMemories(t,r,o){return Hl(this.db,t,r,o)}listActiveMemoriesForProject(t,r){return $l(this.db,t,r)}recentMemories(t,r){return ds(this.db,t,r)}listSemanticIndexableMemories(t){return Fl(this.db,t)}upsertSemanticIndex(t){Wl(this.db,t)}getSemanticIndex(t){return Jl(this.db,t)}listCurrentSemanticIndexesForProject(t){return ql(this.db,t)}semanticIndexStatsForProject(t){return Kl(this.db,t)}semanticIndexStats(t){return Gl(this.db,t)}upsertCapabilities(t){let r=this.db.prepare(`INSERT INTO capabilities (
417
459
  uid, host, native_kind, normalized_kind, source, schema_hash,
418
460
  installed, enabled, active, authenticated, healthy, allowed, ready, last_seen_at
419
461
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
@@ -430,18 +472,39 @@ LEFT JOIN activity a ON a.project_id = p.id`;function pp(e){return{...fr(e),coun
430
472
  healthy = excluded.healthy,
431
473
  allowed = excluded.allowed,
432
474
  ready = excluded.ready,
433
- last_seen_at = excluded.last_seen_at`),o=this.db.prepare("DELETE FROM capability_fts WHERE uid = ?"),a=this.db.prepare("INSERT INTO capability_fts (uid, host, native_kind, normalized_kind, source) VALUES (?, ?, ?, ?, ?)");this.db.exec("BEGIN IMMEDIATE");try{for(let n of t)r.run(n.uid,n.host,n.native_kind,n.normalized_kind,n.source,n.schema_hash,Pe(n.installed),Pe(n.enabled),Pe(n.active),Pe(n.authenticated),Pe(n.healthy),Pe(n.allowed),Pe(n.ready),n.last_seen_at),o.run(n.uid),a.run(n.uid,n.host,n.native_kind,n.normalized_kind,n.source);this.db.exec("COMMIT")}catch(n){throw this.db.exec("ROLLBACK"),n}}listCapabilities(t){let r=[],o=[];t.host&&(t.includeShared===!1?r.push("host = ?"):r.push("(host = ? OR host = 'all')"),o.push(t.host)),t.readyOnly&&r.push("ready = 1");let a=r.length?`WHERE ${r.join(" AND ")}`:"";return this.db.prepare(`SELECT * FROM capabilities ${a} ORDER BY last_seen_at DESC, uid ASC LIMIT ?`).all(...o,t.limit).map(So)}searchCapabilities(t){let r=xo(t.query);if(!r)return this.listCapabilities({host:t.host,readyOnly:t.readyOnly,limit:t.limit,includeShared:t.includeShared});let o=["capability_fts MATCH ?"],a=[r];return t.host&&(t.includeShared===!1?o.push("c.host = ?"):o.push("(c.host = ? OR c.host = 'all')"),a.push(t.host)),t.readyOnly&&o.push("c.ready = 1"),this.db.prepare(`SELECT c.*
475
+ last_seen_at = excluded.last_seen_at`),o=this.db.prepare("DELETE FROM capability_fts WHERE uid = ?"),n=this.db.prepare("INSERT INTO capability_fts (uid, host, native_kind, normalized_kind, source) VALUES (?, ?, ?, ?, ?)");this.db.exec("BEGIN IMMEDIATE");try{for(let s of t)r.run(s.uid,s.host,s.native_kind,s.normalized_kind,s.source,s.schema_hash,Te(s.installed),Te(s.enabled),Te(s.active),Te(s.authenticated),Te(s.healthy),Te(s.allowed),Te(s.ready),s.last_seen_at),o.run(s.uid),n.run(s.uid,s.host,s.native_kind,s.normalized_kind,s.source);this.db.exec("COMMIT")}catch(s){throw this.db.exec("ROLLBACK"),s}}listCapabilities(t){let r=[],o=[];t.host&&(t.includeShared===!1?r.push("host = ?"):r.push("(host = ? OR host = 'all')"),o.push(t.host)),t.readyOnly&&r.push("ready = 1");let n=r.length?`WHERE ${r.join(" AND ")}`:"";return this.db.prepare(`SELECT * FROM capabilities ${n} ORDER BY last_seen_at DESC, uid ASC LIMIT ?`).all(...o,t.limit).map(Ho)}searchCapabilities(t){let r=Uo(t.query);if(!r)return this.listCapabilities({host:t.host,readyOnly:t.readyOnly,limit:t.limit,includeShared:t.includeShared});let o=["capability_fts MATCH ?"],n=[r];return t.host&&(t.includeShared===!1?o.push("c.host = ?"):o.push("(c.host = ? OR c.host = 'all')"),n.push(t.host)),t.readyOnly&&o.push("c.ready = 1"),this.db.prepare(`SELECT c.*
434
476
  FROM capability_fts f
435
477
  JOIN capabilities c ON c.uid = f.uid
436
478
  WHERE ${o.join(" AND ")}
437
479
  ORDER BY rank
438
- LIMIT ?`).all(...a,t.limit).map(So)}getCapability(t){let r=this.db.prepare("SELECT * FROM capabilities WHERE uid = ?").get(t);return r?So(r):null}findOpenCommitmentBySummary(t,r){let o=this.db.prepare("SELECT * FROM commitments WHERE project_id = ? AND summary = ? AND status = 'open' ORDER BY created_at ASC LIMIT 1").get(t,r);return o?Eo(o):null}insertCommitment(t){this.db.prepare(`INSERT INTO commitments (id, project_id, summary, status, due_at, ttl_expires_at, source_json, created_at, updated_at)
439
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.project_id,t.summary,t.status,t.due_at,t.ttl_expires_at,JSON.stringify(t.source),t.created_at,t.updated_at);let r=this.getCommitment(t.id);if(!r)throw new Error(`Commitment not found after insert: ${t.id}`);return r}createOpenCommitmentIfMissing(t,r){this.db.exec("BEGIN IMMEDIATE");try{this.expireCommitments(r);let o=cl(t.summary),a=this.listCommitments({project:t.project_id,status:"open",includeExpired:!1,limit:200,now:r,skipExpire:!0}).find(s=>cl(s.summary)===o);if(a)return this.db.exec("COMMIT"),{created:!1,commitment:a};this.db.prepare(`INSERT INTO commitments (id, project_id, summary, status, due_at, ttl_expires_at, source_json, created_at, updated_at)
440
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.project_id,t.summary,t.status,t.due_at,t.ttl_expires_at,JSON.stringify(t.source),t.created_at,t.updated_at);let n=this.getCommitment(t.id);if(!n)throw new Error(`Commitment not found after insert: ${t.id}`);return this.db.exec("COMMIT"),{created:!0,commitment:n}}catch(o){throw this.db.exec("ROLLBACK"),o}}listCommitments(t){t.skipExpire||this.expireCommitments(t.now);let r=[],o=[];t.project&&(r.push("project_id = ?"),o.push(t.project)),t.status?(r.push("status = ?"),o.push(t.status)):t.includeExpired||r.push("status != 'expired'");let a=r.length?`WHERE ${r.join(" AND ")}`:"";return this.db.prepare(`SELECT * FROM commitments ${a} ORDER BY updated_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(Eo)}updateCommitmentStatus(t,r,o){return this.expireCommitments(o),this.db.prepare("UPDATE commitments SET status = ?, updated_at = ? WHERE id = ?").run(r,o,t),this.getCommitment(t)}claimHeartbeatLease(t){this.db.exec("BEGIN IMMEDIATE");try{let r=this.db.prepare("SELECT * FROM leases WHERE idempotency_key = ?").get(t.idempotencyKey);if(r){if(r.status==="claimed"&&Date.parse(r.expires_at)<=Date.parse(t.now)){this.db.prepare(`UPDATE leases
480
+ LIMIT ?`).all(...n,t.limit).map(Ho)}getCapability(t){let r=this.db.prepare("SELECT * FROM capabilities WHERE uid = ?").get(t);return r?Ho(r):null}findOpenCommitmentBySummary(t,r){let o=this.db.prepare("SELECT * FROM commitments WHERE project_id = ? AND summary = ? AND status = 'open' ORDER BY created_at ASC LIMIT 1").get(t,r);return o?Fo(o):null}insertCommitment(t){this.db.prepare(`INSERT INTO commitments (id, project_id, summary, status, due_at, ttl_expires_at, source_json, created_at, updated_at)
481
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.project_id,t.summary,t.status,t.due_at,t.ttl_expires_at,JSON.stringify(t.source),t.created_at,t.updated_at);let r=this.getCommitment(t.id);if(!r)throw new Error(`Commitment not found after insert: ${t.id}`);return r}createOpenCommitmentIfMissing(t,r){this.db.exec("BEGIN IMMEDIATE");try{this.expireCommitments(r);let o=nc(t.summary),n=this.listCommitments({project:t.project_id,status:"open",includeExpired:!1,limit:200,now:r,skipExpire:!0}).find(a=>nc(a.summary)===o);if(n)return this.db.exec("COMMIT"),{created:!1,commitment:n};this.db.prepare(`INSERT INTO commitments (id, project_id, summary, status, due_at, ttl_expires_at, source_json, created_at, updated_at)
482
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.project_id,t.summary,t.status,t.due_at,t.ttl_expires_at,JSON.stringify(t.source),t.created_at,t.updated_at);let s=this.getCommitment(t.id);if(!s)throw new Error(`Commitment not found after insert: ${t.id}`);return this.db.exec("COMMIT"),{created:!0,commitment:s}}catch(o){throw this.db.exec("ROLLBACK"),o}}listCommitments(t){t.skipExpire||this.expireCommitments(t.now);let r=[],o=[];t.project&&(r.push("project_id = ?"),o.push(t.project)),t.status?(r.push("status = ?"),o.push(t.status)):t.includeExpired||r.push("status != 'expired'");let n=r.length?`WHERE ${r.join(" AND ")}`:"";return this.db.prepare(`SELECT * FROM commitments ${n} ORDER BY updated_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(Fo)}updateCommitmentStatus(t,r,o){return this.expireCommitments(o),this.db.prepare("UPDATE commitments SET status = ?, updated_at = ? WHERE id = ?").run(r,o,t),this.getCommitment(t)}claimHeartbeatLease(t){this.db.exec("BEGIN IMMEDIATE");try{let r=this.db.prepare("SELECT * FROM leases WHERE idempotency_key = ?").get(t.idempotencyKey);if(r){if(r.status==="claimed"&&Date.parse(r.expires_at)<=Date.parse(t.now)){this.db.prepare(`UPDATE leases
441
483
  SET holder = ?, expires_at = ?, status = 'claimed', created_at = ?, completed_at = NULL
442
- WHERE id = ?`).run(t.holder,t.expiresAt,t.now,r.id);let a=this.getLeaseById(r.id);if(!a)throw new Error(`Lease not found after reclaim: ${r.id}`);return this.db.exec("COMMIT"),{lease:a,claimed:!0,reason:"EXPIRED_RECLAIMED"}}return this.db.exec("COMMIT"),{lease:hr(r),claimed:!1,reason:r.status==="completed"?"LEASE_ALREADY_COMPLETED":"LEASE_OCCUPIED"}}this.db.prepare(`INSERT INTO leases (id, slot, holder, idempotency_key, expires_at, status, created_at, completed_at)
443
- VALUES (?, ?, ?, ?, ?, 'claimed', ?, NULL)`).run(t.id,t.slot,t.holder,t.idempotencyKey,t.expiresAt,t.now);let o=this.getLeaseById(t.id);if(!o)throw new Error(`Lease not found after claim: ${t.id}`);return this.db.exec("COMMIT"),{lease:o,claimed:!0,reason:null}}catch(r){throw this.db.exec("ROLLBACK"),r}}completeHeartbeatLease(t){this.db.exec("BEGIN IMMEDIATE");try{let r=this.db.prepare("SELECT * FROM leases WHERE idempotency_key = ?").get(t.idempotencyKey);if(!r)throw new Error(`Heartbeat lease not found: ${t.idempotencyKey}`);if(r.status==="completed"){let n=this.latestHeartbeatRun(t.project,r.slot);return this.db.exec("COMMIT"),{lease:hr(r),run:n,completed:!1}}if(r.status!=="claimed")throw new Error(`Heartbeat lease is not claimed: ${r.id}`);if(r.holder!==t.host)throw new Error(`Heartbeat lease holder mismatch: ${r.id}`);this.db.prepare("UPDATE leases SET status = 'completed', completed_at = ? WHERE id = ?").run(t.completedAt,r.id),this.db.prepare(`INSERT INTO runs (id, kind, host, project_id, status, cost_json, result_json, evidence_json, started_at, completed_at)
444
- VALUES (?, 'heartbeat', ?, ?, 'completed', ?, ?, ?, ?, ?)`).run(t.runId,r.holder,t.project,JSON.stringify({}),JSON.stringify(t.result),JSON.stringify({...Vi(t.evidence),slot:r.slot,lease_id:r.id}),r.created_at,t.completedAt);let o=this.getLeaseById(r.id),a=this.getHeartbeatRunById(t.runId);if(!o||!a)throw new Error(`Heartbeat completion did not persist for ${r.id}`);return this.db.exec("COMMIT"),{lease:o,run:a,completed:!0}}catch(r){throw this.db.exec("ROLLBACK"),r}}listHeartbeatLeases(t){let r=["idempotency_key LIKE ? ESCAPE '\\'"],o=[t.project?`heartbeat:${Bi(t.project)}:%`:"heartbeat:%"];return this.db.prepare(`SELECT * FROM leases WHERE ${r.join(" AND ")} ORDER BY created_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(hr)}listHeartbeatRuns(t){let r=["kind = 'heartbeat'"],o=[];return t.project&&(r.push("project_id = ?"),o.push(t.project)),t.host&&(r.push("host = ?"),o.push(t.host)),this.db.prepare(`SELECT * FROM runs WHERE ${r.join(" AND ")} ORDER BY completed_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(Po)}upsertSchedule(t){this.db.prepare(`INSERT INTO schedules (id, host, mode, enabled, native_schedule_supported, native_id, desired_json, updated_at)
484
+ WHERE id = ?`).run(t.holder,t.expiresAt,t.now,r.id);let n=this.getLeaseById(r.id);if(!n)throw new Error(`Lease not found after reclaim: ${r.id}`);return this.db.exec("COMMIT"),{lease:n,claimed:!0,reason:"EXPIRED_RECLAIMED"}}return this.db.exec("COMMIT"),{lease:Sr(r),claimed:!1,reason:r.status==="completed"?"LEASE_ALREADY_COMPLETED":"LEASE_OCCUPIED"}}this.db.prepare(`INSERT INTO leases (id, slot, holder, idempotency_key, expires_at, status, created_at, completed_at)
485
+ VALUES (?, ?, ?, ?, ?, 'claimed', ?, NULL)`).run(t.id,t.slot,t.holder,t.idempotencyKey,t.expiresAt,t.now);let o=this.getLeaseById(t.id);if(!o)throw new Error(`Lease not found after claim: ${t.id}`);return this.db.exec("COMMIT"),{lease:o,claimed:!0,reason:null}}catch(r){throw this.db.exec("ROLLBACK"),r}}completeHeartbeatLease(t){this.db.exec("BEGIN IMMEDIATE");try{let r=this.db.prepare("SELECT * FROM leases WHERE idempotency_key = ?").get(t.idempotencyKey);if(!r)throw new Error(`Heartbeat lease not found: ${t.idempotencyKey}`);if(r.status==="completed"){let s=this.latestHeartbeatRun(t.project,r.slot);return this.db.exec("COMMIT"),{lease:Sr(r),run:s,completed:!1}}if(r.status!=="claimed")throw new Error(`Heartbeat lease is not claimed: ${r.id}`);if(r.holder!==t.host)throw new Error(`Heartbeat lease holder mismatch: ${r.id}`);this.db.prepare("UPDATE leases SET status = 'completed', completed_at = ? WHERE id = ?").run(t.completedAt,r.id),this.db.prepare(`INSERT INTO runs (id, kind, host, project_id, status, cost_json, result_json, evidence_json, started_at, completed_at)
486
+ VALUES (?, 'heartbeat', ?, ?, 'completed', ?, ?, ?, ?, ?)`).run(t.runId,r.holder,t.project,JSON.stringify(qt(t.cost)),JSON.stringify(t.result),JSON.stringify({...Nl(t.evidence),slot:r.slot,lease_id:r.id}),r.created_at,t.completedAt);let o=this.getLeaseById(r.id),n=this.getHeartbeatRunById(t.runId);if(!o||!n)throw new Error(`Heartbeat completion did not persist for ${r.id}`);return this.db.exec("COMMIT"),{lease:o,run:n,completed:!0}}catch(r){throw this.db.exec("ROLLBACK"),r}}listHeartbeatLeases(t){let r=["idempotency_key LIKE ? ESCAPE '\\'"],o=[t.project?`heartbeat:${Ol(t.project)}:%`:"heartbeat:%"];return this.db.prepare(`SELECT * FROM leases WHERE ${r.join(" AND ")} ORDER BY created_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(Sr)}listHeartbeatRuns(t){let r=["kind = 'heartbeat'"],o=[];return t.project&&(r.push("project_id = ?"),o.push(t.project)),t.host&&(r.push("host = ?"),o.push(t.host)),this.db.prepare(`SELECT * FROM runs WHERE ${r.join(" AND ")} ORDER BY completed_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(Ar)}listHeartbeatRunsByWorkItem(t){let r=["kind = 'heartbeat'","json_extract(evidence_json, '$.work_item_id') = ?"],o=[t.workItemId];return t.project&&(r.push("project_id = ?"),o.push(t.project)),this.db.prepare(`SELECT * FROM runs WHERE ${r.join(" AND ")} ORDER BY completed_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(Ar)}listRunCostRows(t){let r=["completed_at IS NOT NULL"],o=[];t.project&&(r.push("project_id = ?"),o.push(t.project)),t.host&&(r.push("host = ?"),o.push(t.host)),t.since&&(r.push("completed_at >= ?"),o.push(t.since)),t.until&&(r.push("completed_at <= ?"),o.push(t.until));let n=t.limit===void 0?"":"LIMIT ?",s=t.limit===void 0?o:[...o,t.limit];return this.db.prepare(`SELECT
487
+ runs.id,
488
+ runs.kind,
489
+ runs.host,
490
+ runs.project_id,
491
+ runs.cost_json,
492
+ runs.evidence_json,
493
+ (
494
+ SELECT sessions.id
495
+ FROM sessions
496
+ WHERE sessions.project_id = runs.project_id
497
+ AND sessions.host = runs.host
498
+ AND sessions.started_at <= runs.completed_at
499
+ AND (sessions.ended_at IS NULL OR sessions.ended_at >= runs.started_at)
500
+ ORDER BY sessions.started_at DESC, sessions.id DESC
501
+ LIMIT 1
502
+ ) AS session_id,
503
+ runs.completed_at
504
+ FROM runs
505
+ WHERE ${r.join(" AND ")}
506
+ ORDER BY runs.completed_at DESC, runs.id DESC
507
+ ${n}`).all(...s)}upsertSchedule(t){this.db.prepare(`INSERT INTO schedules (id, host, mode, enabled, native_schedule_supported, native_id, desired_json, updated_at)
445
508
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
446
509
  ON CONFLICT(id) DO UPDATE SET
447
510
  host = excluded.host,
@@ -450,13 +513,13 @@ LEFT JOIN activity a ON a.project_id = p.id`;function pp(e){return{...fr(e),coun
450
513
  native_schedule_supported = excluded.native_schedule_supported,
451
514
  native_id = excluded.native_id,
452
515
  desired_json = excluded.desired_json,
453
- updated_at = excluded.updated_at`).run(t.id,t.host,t.mode,Pe(t.enabled),Pe(t.native_schedule_supported),t.native_id,JSON.stringify(t.desired),t.updated_at);let r=this.getSchedule(t.id);if(!r)throw new Error(`Schedule not found after upsert: ${t.id}`);return r}listSchedules(t){let r=[],o=[];t.host&&(r.push("host = ?"),o.push(t.host));let a=r.length?`WHERE ${r.join(" AND ")}`:"";return this.db.prepare(`SELECT * FROM schedules ${a} ORDER BY updated_at DESC, id ASC LIMIT ?`).all(...o,t.limit).map(Ta)}disableSchedule(t,r){return this.db.prepare("UPDATE schedules SET enabled = 0, updated_at = ? WHERE id = ?").run(r,t),this.getSchedule(t)}getLeaseById(t){let r=this.db.prepare("SELECT * FROM leases WHERE id = ?").get(t);return r?hr(r):null}getHeartbeatRunById(t){let r=this.db.prepare("SELECT * FROM runs WHERE id = ?").get(t);return r?Po(r):null}latestHeartbeatRun(t,r){let o=this.db.prepare(`SELECT *
516
+ updated_at = excluded.updated_at`).run(t.id,t.host,t.mode,Te(t.enabled),Te(t.native_schedule_supported),t.native_id,JSON.stringify(t.desired),t.updated_at);let r=this.getSchedule(t.id);if(!r)throw new Error(`Schedule not found after upsert: ${t.id}`);return r}listSchedules(t){let r=[],o=[];t.host&&(r.push("host = ?"),o.push(t.host));let n=r.length?`WHERE ${r.join(" AND ")}`:"";return this.db.prepare(`SELECT * FROM schedules ${n} ORDER BY updated_at DESC, id ASC LIMIT ?`).all(...o,t.limit).map(os)}disableSchedule(t,r){return this.db.prepare("UPDATE schedules SET enabled = 0, updated_at = ? WHERE id = ?").run(r,t),this.getSchedule(t)}getLeaseById(t){let r=this.db.prepare("SELECT * FROM leases WHERE id = ?").get(t);return r?Sr(r):null}getHeartbeatRunById(t){let r=this.db.prepare("SELECT * FROM runs WHERE id = ?").get(t);return r?Ar(r):null}latestHeartbeatRun(t,r){let o=this.db.prepare(`SELECT *
454
517
  FROM runs
455
518
  WHERE kind = 'heartbeat'
456
519
  AND project_id = ?
457
520
  AND json_extract(evidence_json, '$.slot') = ?
458
521
  ORDER BY completed_at DESC, id DESC
459
- LIMIT 1`).get(t,r);return o?Po(o):null}getSchedule(t){let r=this.db.prepare("SELECT * FROM schedules WHERE id = ?").get(t);return r?Ta(r):null}getCommitment(t){let r=this.db.prepare("SELECT * FROM commitments WHERE id = ?").get(t);return r?Eo(r):null}expireCommitments(t){this.db.prepare("UPDATE commitments SET status = 'expired', updated_at = ? WHERE status = 'open' AND ttl_expires_at IS NOT NULL AND ttl_expires_at <= ?").run(t,t)}countTable(t){return this.db.prepare(`SELECT COUNT(*) as count FROM ${t}`).get()?.count??0}countDomainTable(t){return this.db.prepare(`SELECT COUNT(*) as count FROM ${t}`).get()?.count??0}};function v(e,t={}){return new To(e,t)}function kp(e){return`${Rp(e).href}?mode=ro&immutable=1`}function cl(e){return e.trim().replace(/\s+/gu," ").toLocaleLowerCase()}import{appendFile as Hp,mkdir as Dp}from"node:fs/promises";import $p from"node:os";import Fp from"node:path";import{createHash as Sp,randomUUID as Ap}from"node:crypto";function O(e){return`${e}_${Ap()}`}function S(e){return`sha256:${Sp("sha256").update(e).digest("hex")}`}function Ga(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(r=>Ga(r)).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${Ga(e[r]??null)}`).join(",")}}`}function ye(e){return S(Ga(e))}import{existsSync as Ep}from"node:fs";import ul from"node:os";var dl=[{code:"NPM_TOKEN_ASSIGNMENT",source:`(?:^|[\\s"'])NPM_TOKEN\\s*[:=]\\s*["']?[A-Za-z0-9._-]{8,}`,flags:"gimu"},{code:"NPM_AUTH_TOKEN",source:"\\/\\/registry\\.npmjs\\.org\\/:_authToken\\s*=\\s*[A-Za-z0-9._-]+",flags:"gimu"},{code:"NPM_AUTH_ASSIGNMENT",source:`(?:^|[\\s"'])_auth\\s*=\\s*[A-Za-z0-9+/=_-]{12,}`,flags:"gimu"},{code:"NPM_TOKEN_VALUE",source:"npm_[A-Za-z0-9]{30,}",flags:"gu"},{code:"GITHUB_TOKEN",source:"(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{30,}",flags:"gu"},{code:"GITHUB_FINE_GRAINED_TOKEN",source:"github_pat_[A-Za-z0-9_]{40,}",flags:"gu"},{code:"OPENAI_PROJECT_KEY",source:"sk-(?:proj|svcacct|admin)-[A-Za-z0-9_-]{20,}",flags:"gu"},{code:"OPENAI_LEGACY_KEY",source:"sk-[A-Za-z0-9_-]{10,}",flags:"gu"},{code:"ANTHROPIC_KEY",source:"sk-ant-[A-Za-z0-9_-]{20,}",flags:"gu"},{code:"GOOGLE_API_KEY",source:"AIza[0-9A-Za-z_-]{30,}",flags:"gu"},{code:"SLACK_TOKEN",source:"xox[abopr]-[0-9A-Za-z-]{20,}",flags:"gu"},{code:"SLACK_WEBHOOK",source:"https:\\/\\/hooks\\.slack\\.com\\/services\\/[A-Za-z0-9/_-]{20,}",flags:"gu"},{code:"STRIPE_LIVE_KEY",source:"sk_live_[0-9A-Za-z]{20,}",flags:"gu"},{code:"AWS_ACCESS_KEY",source:"AKIA[0-9A-Z]{16}",flags:"gu"},{code:"AWS_SESSION_KEY",source:"ASIA[0-9A-Z]{16}",flags:"gu"},{code:"PRIVATE_KEY_BLOCK",source:"-----BEGIN [A-Z ]*PRIVATE KEY-----[\\s\\S]*?-----END [A-Z ]*PRIVATE KEY-----",flags:"gu"},{code:"PRIVATE_KEY_HEADER",source:"-----BEGIN [A-Z ]*PRIVATE KEY-----",flags:"gu"},{code:"AUTHORIZATION_BEARER",source:"Authorization:\\s*Bearer\\s+[A-Za-z0-9._~+/=-]{16,}",flags:"gimu"},{code:"JWT_VALUE",source:"eyJ[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}",flags:"gu"},{code:"SIGNING_SECRET_ASSIGNMENT",source:`(?:GPG_PRIVATE_KEY|COSIGN_PASSWORD|SIGSTORE_ID_TOKEN)\\s*[:=]\\s*["']?[^"'\\s]{8,}`,flags:"gimu"},{code:"GENERIC_SECRET_ASSIGNMENT",source:`(?:secret|password|api[_-]?key|auth[_-]?token|client_secret|webhook_secret)\\s*[:=]\\s*["']?[^"'\\s]{12,}["']?`,flags:"gimu"},{code:"GENERIC_ENV_SECRET_ASSIGNMENT",source:`[A-Z0-9_]*(?:TOKEN|SECRET|PASSWORD|API_KEY)\\s*=\\s*(?!sk-test-secret-value\\b)[^\\s"']{12,}`,flags:"gu"},{code:"ENV_DUMP",source:'"env"\\s*:\\s*\\{[^}]+(?:TOKEN|SECRET|PASSWORD|API_KEY)[^}]+\\}',flags:"gimu"}];var xp=dl.map(e=>new RegExp(e.source,e.flags.includes("g")?e.flags:`${e.flags}g`));function M(e){let t=!1,r=e;for(let o of xp)r=r.replace(o,a=>{t=!0;let n=a.match(/^(Authorization:\s*Bearer\s+)/iu);if(n?.[1])return`${n[1]}[REDACTED_SECRET]`;let s=a.match(/^([^:=]+[:=]\s*)/u);return s?.[1]?`${s[1]}[REDACTED_SECRET]`:"[REDACTED_SECRET]"});return{value:r,redacted:t}}function W(e){if(typeof e=="string")return M(e).value;if(Array.isArray(e))return e.map(t=>W(t));if(e&&typeof e=="object"){let t={};for(let[r,o]of Object.entries(e))t[r]=W(o);return t}return e}function Jt(e,t=[process.cwd(),ul.homedir()]){if(typeof e=="string")return t.filter(r=>r&&Ep(r)).reduce((r,o)=>r.replaceAll(o,o===ul.homedir()?"[REDACTED_USER_HOME]":"[REDACTED_WORKSPACE]"),e);if(Array.isArray(e))return e.map(r=>Jt(r,t));if(e&&typeof e=="object"){let r={};for(let[o,a]of Object.entries(e))r[o]=Jt(a,t);return r}return e}import{mkdir as gl,readFile as jp,writeFile as Wa}from"node:fs/promises";import{constants as Tp,existsSync as fl}from"node:fs";import{access as Cp}from"node:fs/promises";import Ip from"node:os";import xe from"node:path";var Co={"AGENTS.md":`# NativeSoul \u2014 Operating Instructions
522
+ LIMIT 1`).get(t,r);return o?Ar(o):null}getSchedule(t){let r=this.db.prepare("SELECT * FROM schedules WHERE id = ?").get(t);return r?os(r):null}getCommitment(t){let r=this.db.prepare("SELECT * FROM commitments WHERE id = ?").get(t);return r?Fo(r):null}expireCommitments(t){this.db.prepare("UPDATE commitments SET status = 'expired', updated_at = ? WHERE status = 'open' AND ttl_expires_at IS NOT NULL AND ttl_expires_at <= ?").run(t,t)}countTable(t){return this.db.prepare(`SELECT COUNT(*) as count FROM ${t}`).get()?.count??0}countDomainTable(t){return Um(this.db,t)?this.db.prepare(`SELECT COUNT(*) as count FROM ${t}`).get()?.count??0:0}};function _(e,t={}){return new Bo(e,t)}function Fm(e){return`${$m(e).href}?mode=ro&immutable=1`}function nc(e){return e.trim().replace(/\s+/gu," ").toLocaleLowerCase()}function Um(e,t){return e.prepare("SELECT EXISTS(SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?) AS exists_count").get(t)?.exists_count===1}import{appendFile as tg,mkdir as rg}from"node:fs/promises";import og from"node:os";import ng from"node:path";import{createHash as Vm,randomUUID as Bm}from"node:crypto";function T(e){return`${e}_${Bm()}`}function A(e){return`sha256:${Vm("sha256").update(e).digest("hex")}`}function Es(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(r=>Es(r)).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${Es(e[r]??null)}`).join(",")}}`}function ke(e){return A(Es(e))}import{existsSync as Jm}from"node:fs";import ac from"node:os";var sc=[{code:"NPM_TOKEN_ASSIGNMENT",source:`(?:^|[\\s"'])NPM_TOKEN\\s*[:=]\\s*["']?[A-Za-z0-9._-]{8,}`,flags:"gimu"},{code:"NPM_AUTH_TOKEN",source:"\\/\\/registry\\.npmjs\\.org\\/:_authToken\\s*=\\s*[A-Za-z0-9._-]+",flags:"gimu"},{code:"NPM_AUTH_ASSIGNMENT",source:`(?:^|[\\s"'])_auth\\s*=\\s*[A-Za-z0-9+/=_-]{12,}`,flags:"gimu"},{code:"NPM_TOKEN_VALUE",source:"npm_[A-Za-z0-9]{30,}",flags:"gu"},{code:"GITHUB_TOKEN",source:"(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{30,}",flags:"gu"},{code:"GITHUB_FINE_GRAINED_TOKEN",source:"github_pat_[A-Za-z0-9_]{40,}",flags:"gu"},{code:"OPENAI_PROJECT_KEY",source:"sk-(?:proj|svcacct|admin)-[A-Za-z0-9_-]{20,}",flags:"gu"},{code:"OPENAI_LEGACY_KEY",source:"sk-[A-Za-z0-9_-]{10,}",flags:"gu"},{code:"ANTHROPIC_KEY",source:"sk-ant-[A-Za-z0-9_-]{20,}",flags:"gu"},{code:"GOOGLE_API_KEY",source:"AIza[0-9A-Za-z_-]{30,}",flags:"gu"},{code:"SLACK_TOKEN",source:"xox[abopr]-[0-9A-Za-z-]{20,}",flags:"gu"},{code:"SLACK_WEBHOOK",source:"https:\\/\\/hooks\\.slack\\.com\\/services\\/[A-Za-z0-9/_-]{20,}",flags:"gu"},{code:"STRIPE_LIVE_KEY",source:"sk_live_[0-9A-Za-z]{20,}",flags:"gu"},{code:"AWS_ACCESS_KEY",source:"AKIA[0-9A-Z]{16}",flags:"gu"},{code:"AWS_SESSION_KEY",source:"ASIA[0-9A-Z]{16}",flags:"gu"},{code:"PRIVATE_KEY_BLOCK",source:"-----BEGIN [A-Z ]*PRIVATE KEY-----[\\s\\S]*?-----END [A-Z ]*PRIVATE KEY-----",flags:"gu"},{code:"PRIVATE_KEY_HEADER",source:"-----BEGIN [A-Z ]*PRIVATE KEY-----",flags:"gu"},{code:"AUTHORIZATION_BEARER",source:"Authorization:\\s*Bearer\\s+[A-Za-z0-9._~+/=-]{16,}",flags:"gimu"},{code:"JWT_VALUE",source:"eyJ[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}",flags:"gu"},{code:"SIGNING_SECRET_ASSIGNMENT",source:`(?:GPG_PRIVATE_KEY|COSIGN_PASSWORD|SIGSTORE_ID_TOKEN)\\s*[:=]\\s*["']?[^"'\\s]{8,}`,flags:"gimu"},{code:"GENERIC_SECRET_ASSIGNMENT",source:`(?:secret|password|api[_-]?key|auth[_-]?token|client_secret|webhook_secret)\\s*[:=]\\s*["']?[^"'\\s]{12,}["']?`,flags:"gimu"},{code:"GENERIC_ENV_SECRET_ASSIGNMENT",source:`[A-Z0-9_]*(?:TOKEN|SECRET|PASSWORD|API_KEY)\\s*=\\s*(?!sk-test-secret-value\\b)[^\\s"']{12,}`,flags:"gu"},{code:"ENV_DUMP",source:'"env"\\s*:\\s*\\{[^}]+(?:TOKEN|SECRET|PASSWORD|API_KEY)[^}]+\\}',flags:"gimu"}];var qm=sc.map(e=>new RegExp(e.source,e.flags.includes("g")?e.flags:`${e.flags}g`));function O(e){let t=!1,r=e;for(let o of qm)r=r.replace(o,n=>{t=!0;let s=n.match(/^(Authorization:\s*Bearer\s+)/iu);if(s?.[1])return`${s[1]}[REDACTED_SECRET]`;let a=n.match(/^([^:=]+[:=]\s*)/u);return a?.[1]?`${a[1]}[REDACTED_SECRET]`:"[REDACTED_SECRET]"});return{value:r,redacted:t}}function H(e){if(typeof e=="string")return O(e).value;if(Array.isArray(e))return e.map(t=>H(t));if(e&&typeof e=="object"){let t={};for(let[r,o]of Object.entries(e))t[r]=H(o);return t}return e}function zt(e,t=[process.cwd(),ac.homedir()]){if(typeof e=="string")return t.filter(r=>r&&Jm(r)).reduce((r,o)=>r.replaceAll(o,o===ac.homedir()?"[REDACTED_USER_HOME]":"[REDACTED_WORKSPACE]"),e);if(Array.isArray(e))return e.map(r=>zt(r,t));if(e&&typeof e=="object"){let r={};for(let[o,n]of Object.entries(e))r[o]=zt(n,t);return r}return e}import{mkdir as cc,readFile as Km,writeFile as Ps}from"node:fs/promises";import{constants as Gm,existsSync as dc}from"node:fs";import{access as Xm}from"node:fs/promises";import zm from"node:os";import Ne from"node:path";var Wo={"AGENTS.md":`# NativeSoul \u2014 Operating Instructions
460
523
 
461
524
  _Injected into every supported host via managed blocks. Keep operational rules here._
462
525
 
@@ -731,7 +794,7 @@ recall:
731
794
  - test
732
795
  - build
733
796
  note: UserPromptSubmit recall hooks are opt-in for first ship.
734
- `},pl=`id: example-read-only
797
+ `},ic=`id: example-read-only
735
798
  allowed:
736
799
  - memory_search
737
800
  - life_recall
@@ -741,7 +804,7 @@ approval_required:
741
804
  - external_write
742
805
  - destructive_action
743
806
  source: standing-orders/example.yaml
744
- `;function ml(e){return`# Daily notes \u2014 ${e}
807
+ `;function lc(e){return`# Daily notes \u2014 ${e}
745
808
 
746
809
  _Running context for today. Promote durable facts to curated memory later._
747
810
 
@@ -756,8 +819,8 @@ _Running context for today. Promote durable facts to curated memory later._
756
819
  ## Follow-ups
757
820
 
758
821
  -
759
- `}var Np=["memory/daily","memory/projects","memory/archive","commitments","standing-orders","capabilities/cards","generated","state","logs","backups","proposals"],Op=Co;function hl(e){return xe.resolve(e??process.env.NATIVESOUL_HOME??xe.join(Ip.homedir(),".nativesoul"))}function g(e){let t=hl(e);return{home:t,database:xe.join(t,"state","nativesoul.sqlite"),auditLog:xe.join(t,"logs","audit.jsonl")}}async function k(e){try{return await Cp(e,Tp.F_OK),!0}catch{return!1}}async function b(e){let t=g(e),r=[],o=[],a=[];fl(t.home)||(await gl(t.home,{recursive:!0,mode:448}),r.push(t.home));for(let i of Np){let l=xe.join(t.home,i);fl(l)||(await gl(l,{recursive:!0,mode:448}),r.push(l))}let n=await k(xe.join(t.home,"state","onboarding.complete"));for(let[i,l]of Object.entries(Op)){if(i==="BOOTSTRAP.md"&&n)continue;let c=xe.join(t.home,i);if(await k(c)){a.push(c);continue}try{await Wa(c,l,{encoding:"utf8",mode:384,flag:"wx"}),o.push(c)}catch(d){if(Mp(d)){a.push(c);continue}throw d}}let s=await Lp(t.home);return o.push(...s.createdFiles),a.push(...s.preservedFiles),{home:t.home,database:t.database,createdDirectories:r,createdFiles:o,preservedFiles:a}}function Mp(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST"}async function Lp(e){let t=[],r=[],o=new Date().toISOString().slice(0,10),a=xe.join(e,"memory","daily",`${o}.md`);await k(a)?r.push(a):(await Wa(a,ml(o),{encoding:"utf8",mode:384,flag:"wx"}),t.push(a));let n=xe.join(e,"standing-orders","example.yaml");return await k(n)?r.push(n):(await Wa(n,pl,{encoding:"utf8",mode:384,flag:"wx"}),t.push(n)),{createdFiles:t,preservedFiles:r}}async function ce(e,t){let r=xe.join(e,t);return await k(r)?jp(r,"utf8"):""}async function f(e){let t=g(e.home),r=new Date().toISOString(),o=Xa(W(e.details??{}),t.home),a={id:O("evt"),type:e.type,actor:e.actor??"cli",origin:e.origin??"nativesoul",result:e.result??"ok",details:o,created_at:r,hash:ye({type:e.type,actor:e.actor??"cli",origin:e.origin??"nativesoul",result:e.result??"ok",details:o,created_at:r})},n=v(t.database);try{n.insertEvent(a)}finally{n.close()}return await Dp(Fp.dirname(t.auditLog),{recursive:!0,mode:448}),await Hp(t.auditLog,`${JSON.stringify(a)}
760
- `,{encoding:"utf8",mode:384}),a}function Xa(e,t){if(typeof e=="string")return Up(e,t);if(Array.isArray(e))return e.map(r=>Xa(r,t));if(e&&typeof e=="object"){let r={};for(let[o,a]of Object.entries(e))r[o]=Xa(a,t);return r}return e}function Up(e,t){return[[new RegExp(za(t),"gu"),"[REDACTED_NATIVESOUL_HOME]"],[new RegExp(za(process.cwd()),"gu"),"[REDACTED_WORKSPACE]"],[new RegExp(za($p.homedir()),"gu"),"[REDACTED_USER_HOME]"],[/\/Users\/[A-Za-z0-9._-]+/gu,"[REDACTED_USER_HOME]"],[/\/home\/[A-Za-z0-9._-]+/gu,"[REDACTED_USER_HOME]"],[/[A-Z]:[\\/]+Users[\\/]+[A-Za-z0-9._-]+/gu,"[REDACTED_USER_HOME]"]].reduce((o,[a,n])=>o.replace(a,n),e)}function za(e){return e.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}async function Io(e){let t=g(e.home),r=v(t.database);try{return r.listEvents({type:e.type,result:e.result,limit:Vp(e.limit)})}finally{r.close()}}async function Ya(e){let t=g(e.home),r=await Io(e);return await f({home:t.home,type:"audit_exported",details:{format:e.format,count:r.length,type:e.type??null,result:e.result??null}}),{format:e.format,events:r}}function Vp(e){return Math.min(Math.max(e??50,1),500)}import At from"node:path";import{mkdir as bg,readdir as wg,readFile as bn,writeFile as Rg}from"node:fs/promises";import{existsSync as kg}from"node:fs";import Pr from"node:path";ft();oe();He();oe();import{readdir as Qp}from"node:fs/promises";import de from"node:path";var _e="antigravity",Zp="~/.gemini/GEMINI.md",em="~/.antigravity",Za="official:antigravity-plugin-config:v1",wl="official:antigravity-hooks-config:v1",Rl="official:antigravity-mcp-config:v1",kl="official:antigravity-command-config:v1",tm="official:antigravity-context-config:v1",rm="official:antigravity-features:v1",om=[{uid:"antigravity:plugins",nativeKind:"plugins",normalizedKind:"package",relativePath:"plugins"}];function en(){let e=process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim();return e?de.resolve(e):x(em)}function am(){let e=en();return{root:e,globalInstruction:process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim()?de.join(e,"GEMINI.md"):x(Zp)}}async function Sl(){let e=[],t=am();await P(t.globalInstruction)&&e.push({uid:"antigravity:global-gemini-md",host:_e,nativeKind:"global_context",normalizedKind:"instruction",source:t.globalInstruction,schemaHash:tm}),await nm(t.root,e),await sm(t.root,e);for(let r of om){let o=de.join(t.root,r.relativePath);await F(o)&&e.push({uid:r.uid,host:_e,nativeKind:r.nativeKind,normalizedKind:r.normalizedKind,source:o,schemaHash:Za})}return e}async function nm(e,t){let r=de.join(e,"plugin.json"),o=de.join(e,"nativesoul-package.json"),a=de.join(e,"hooks.json"),n=de.join(e,"mcp_config.json"),[s,i,l,c]=await Promise.all([G(r),G(o),G(a),G(n)]);if(s){let d=C(s,["name","id"])??"unknown";t.push({uid:`antigravity:plugin:${N(d)}`,host:_e,nativeKind:"plugin",normalizedKind:"extension",source:r,schemaHash:Za})}if(i){let d=C(i,["name","id"])??"unknown";t.push({uid:`antigravity:package:${N(d)}`,host:_e,nativeKind:"native_plugin_package",normalizedKind:"package",source:o,schemaHash:Za});let p=I(i.nativeSoul)?i.nativeSoul:{};for(let w of Oo(p.commands))t.push({uid:`antigravity:command:${N(w)}`,host:_e,nativeKind:"command",normalizedKind:"command",source:`${o}:nativeSoul.commands.${w}`,schemaHash:kl});let h=I(p.mcpServer)?p.mcpServer:null,y=C(h,["name"]);y&&t.push({uid:`antigravity:mcp:${N(y)}`,host:_e,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:nativeSoul.mcpServer.${y}`,schemaHash:Rl})}if(l){t.push({uid:"antigravity:hooks:manifest",host:_e,nativeKind:"hooks",normalizedKind:"lifecycle_hooks",source:a,schemaHash:wl});let d=I(l.hooks)?l.hooks:{};for(let p of Object.keys(d))t.push({uid:`antigravity:hook:${N(p)}`,host:_e,nativeKind:"hook",normalizedKind:"lifecycle_hook",source:`${a}:hooks.${p}`,schemaHash:wl})}if(c)for(let d of We(c.mcpServers))t.push({uid:`antigravity:mcp:${N(d)}`,host:_e,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${n}:mcpServers.${d}`,schemaHash:Rl});await im(de.join(e,"commands"),t)}async function sm(e,t){let r=de.join(e,"features-evidence.json"),o=await G(r);if(!o)return;let a=["scheduled_tasks","cron_schedules","background_agents","subagents","skills","mcps","json_hooks"];for(let n of a)o[n]===!0&&t.push({uid:`antigravity:feature:${n.replace(/_/gu,"-")}`,host:_e,nativeKind:"product_feature",normalizedKind:"feature_evidence",source:`${r}:${n}`,schemaHash:rm})}async function im(e,t){if(!await F(e))return;let r=await Qp(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||de.extname(o.name)!==".md")continue;let a=de.basename(o.name,".md");t.push({uid:`antigravity:command:${N(a,{allowSlash:!0})}`,host:_e,nativeKind:"command",normalizedKind:"command",source:de.join(e,o.name),schemaHash:kl})}}oe();He();import Mo from"node:path";async function Al(e){let t=await lm(e);if(!t)return null;let r=await G(t);return r?{product_features_verified:r.product_features_verified===!0,write_contract_verified:r.write_contract_verified===!0,native_id:typeof r.native_id=="string"&&r.native_id.trim().length>0?r.native_id.trim():void 0,enabled:typeof r.enabled=="boolean"?r.enabled:void 0,updated_at:typeof r.updated_at=="string"?r.updated_at:void 0,contract:I(r.contract)?{schedule:C(r.contract,["schedule"])??void 0,status:C(r.contract,["status"])??void 0,cancel:C(r.contract,["cancel"])??void 0,list:C(r.contract,["list"])??void 0,project_binding:C(r.contract,["project_binding"])??void 0}:void 0}:null}async function lm(e){let t=process.env.NATIVESOUL_ANTIGRAVITY_SCHEDULER_MANIFEST?.trim();if(t)return t;let r=process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim();if(r)return Mo.join(Mo.resolve(r),"scheduler-proof.json");let o=e??x("~/.antigravity"),a=[Mo.join(o,"scheduler-proof.json"),Mo.join(o,"native-scheduler-proof.json")];for(let n of a)if(await P(n))return n;return null}function Pl(e){if(!e)return!1;let t=Date.parse(e);return Number.isFinite(t)?Date.now()-t>10080*60*1e3:!0}var qt="antigravity",tn="~/.gemini/GEMINI.md",rn=class{async detect(){let t=x(tn),r=en(),[o,a,n]=await Promise.all([P(t),F(r),Me("agy")]);return{host:qt,detected:a||n!==null,path:a?r:n??(o?t:void 0),capabilities:{installed:a||n!==null,enabled:a,active:!1,authenticated:!1,healthy:n!==null||a,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Antigravity direct adapter writes are disabled; use the install orchestrator to install the NativeSoul native hook plugin, MCP registration, and managed block."}}async uninstall(t){return{status:"unsupported",reason:"Antigravity direct adapter uninstall is disabled; use the uninstall orchestrator for reversible package removal."}}async coldScan(){return Sl()}async hotProbe(){let t=await this.coldScan();return{host:qt,checkedAt:new Date().toISOString(),capabilities:t.map(r=>({...r,installed:!0,enabled:!0,active:r.nativeKind==="global_context",authenticated:!1,healthy:!0,allowed:!0,ready:r.schemaHash?.startsWith("official:")===!0}))}}async bootstrap(){return{tier:"A",mechanism:"hook",supported:!0}}async reload(t){return{status:"unsupported",reason:"Antigravity reload is host-driven; use the installed NativeSoul command package or restart the host if needed."}}async update(t){return{status:"unsupported",reason:"Antigravity package updates are handled by the NativeSoul install orchestrator."}}async scheduleReconcile(t){let r=await Al(t.hostConfigRoot);if(!r?.product_features_verified)return{status:"unsupported",reason:"Antigravity Scheduled Tasks product-level evidence was not detected; no hidden cron fallback installed."};if(!r.write_contract_verified)return{status:"unsupported",reason:"Antigravity product-level Scheduled Tasks are documented, but scheduler write/list/cancel/status contract proof is missing; keep full-native blocked_by_host:scheduler_write_contract_missing."};if(!r.contract?.schedule||!r.contract.status||!r.contract.cancel||!r.contract.list)return{status:"unsupported",reason:"Antigravity scheduler proof is missing one or more required commands: schedule, status, cancel, list."};if(r.enabled===!1)return{status:"degraded",reason:"Antigravity scheduler contract was detected, but the NativeSoul scheduled task is disabled."};if(!r.native_id)return{status:"degraded",reason:"Antigravity scheduler contract was detected, but no native task id mapping was returned."};if(Pl(r.updated_at))return{status:"degraded",reason:"Antigravity scheduler proof is stale; re-run scheduler status/list before claiming full-native."};let o=t.apply?"reconciled":"reconcile planned";return{status:"ok",nativeId:r.native_id,message:`Antigravity Scheduled Task ${o}: ${r.native_id}`}}async doctor(){let t=await this.detect(),r=x(tn),o=await B(r),a=[];return t.detected||a.push({code:"ANTIGRAVITY_NOT_DETECTED",severity:"warn",message:"No Antigravity CLI or ~/.antigravity directory was detected. A shared ~/.gemini/GEMINI.md alone is not treated as Antigravity readiness.",remediation:"Install Antigravity CLI or review `nativesoul adapters managed-block --host antigravity --json`."}),o&&!z(o,qt)&&a.push({code:"ANTIGRAVITY_MANAGED_BLOCK_MISSING",severity:"info",message:"GEMINI.md exists but has no NativeSoul managed block for Antigravity.",remediation:"Review `nativesoul adapters managed-block --host antigravity --json`."}),a}async managedBlockPreview(){let t=x(tn),r=await B(t);return{host:qt,targetPath:t,startMarker:"<!-- nativesoul:antigravity:start v1 -->",endMarker:"<!-- nativesoul:antigravity:end -->",content:je(qt),wouldCreate:r===null,wouldUpdate:r!==null&&!z(r,qt)}}};function El(){return new rn}ft();He();oe();import Kt from"node:path";import{readFile as Gl}from"node:fs/promises";He();import{readFile as Fl}from"node:fs/promises";import bm from"node:path";var Bl="life:heartbeat";function Jl(e){if(!e||typeof e!="object"||Array.isArray(e))return{kind:"unknown",mode:"leader",apply:!1,skill:Bl};let t=e;return{kind:typeof t.kind=="string"?t.kind:"unknown",mode:typeof t.mode=="string"?t.mode:"leader",apply:t.apply===!0,skill:Sm(t),surface:Vl(t.surface)??Vl(I(t.desired)?t.desired.surface:void 0)}}async function ql(e={}){let t=process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_FIXTURES;if(t)try{return Ul(await Fl(bm.join(t,"scheduled-tasks.json"),"utf8"))}catch{return null}let r=process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_MANIFEST;if(r)try{return Ul(await Fl(r,"utf8"))}catch{return null}if(process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_SUPPORTED==="1")return{supported:!0,native_id:process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_NATIVE_ID,surface:"claude-desktop",scheduler_kind:"unknown",creation_surface:"unknown",evidence_source:"env"};let{discoverClaudeScheduledTasksManifest:o}=await Promise.resolve().then(()=>($l(),Dl));return o({apply:e.apply,surface:e.surface,hostConfigRoot:e.hostConfigRoot})}function Kl(e,t){return!e||e==="default"||!t?!0:e===t}function Ul(e){let t=Le(e);if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t,o=wm(r.surface),a=Rm(r.scheduler_kind??r.kind);return{supported:r.supported===!0,native_id:typeof r.native_id=="string"&&r.native_id.length>0?r.native_id:void 0,surface:o??(a==="cloud_routine"?"cloud":"claude-desktop"),scheduler_kind:a,creation_surface:km(r.creation_surface),evidence_source:typeof r.evidence_source=="string"&&r.evidence_source.trim().length>0?r.evidence_source.trim():void 0,enabled:typeof r.enabled=="boolean"?r.enabled:void 0}}function Vl(e){return e==="default"||e==="claude-code"||e==="claude-desktop"?e:void 0}function wm(e){return e==="claude-code"||e==="claude-desktop"||e==="cloud"?e:void 0}function Rm(e){return e==="local_scheduled_task"||e==="cloud_routine"||e==="ui_only"?e:"unknown"}function km(e){return e==="official_machine_readable"||e==="ui_only"||e==="unknown"?e:void 0}function Sm(e){return I(e.desired)&&typeof e.desired.skill=="string"&&e.desired.skill.trim().length>0?e.desired.skill.trim():Bl}var ae="claude",Lo="~/.claude/CLAUDE.md",Wl="CLAUDE.md",zl=".claude/CLAUDE.md",Xl="life:heartbeat",Ql="official:claude-cli-hot-scan:v1",an=class{async detect(){let t=x(Lo),r=Kt.resolve(Wl),o=Kt.resolve(zl),[a,n,s,i]=await Promise.all([P(t),P(r),P(o),No("claude",["--version"])]);return{host:ae,detected:a||n||s||i!==null,version:i??void 0,path:a?t:n?r:s?o:void 0,capabilities:{installed:a||n||s||i!==null,enabled:a||n||s,active:n||s,authenticated:!1,healthy:i!==null||a||n||s,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Claude install writes are not implemented in M2.1; use managed-block preview first."}}async uninstall(t){return{status:"unsupported",reason:"Claude uninstall writes are not implemented in M2.1."}}async coldScan(){let t=x(Lo),r=Kt.resolve(Wl),o=Kt.resolve(zl),a=[];return await P(t)&&a.push({uid:"claude:global-claude-md",host:ae,nativeKind:"global_context",normalizedKind:"instruction",source:t}),await P(r)&&a.push({uid:"claude:project-claude-md",host:ae,nativeKind:"project_context",normalizedKind:"instruction",source:r}),await P(o)&&a.push({uid:"claude:project-dot-claude-md",host:ae,nativeKind:"project_context",normalizedKind:"instruction",source:o}),a}async hotProbe(t){let r=new Date().toISOString(),o=process.env.NATIVESOUL_CLAUDE_HOT_SCAN_FIXTURES?.trim();if(o){let l=await Am(o,r);if(l.status==="ready")return l}let[a,n]=await Promise.all([Qa("claude",["mcp","list","--json"],1200),Qa("claude",["plugin","list","--json"],1200)]),s=[],i=[];return a.status==="ok"?i.push(...Zl(a.stdout)):s.push(Yl("CLAUDE_HOT_SCAN_JSON_UNSUPPORTED","claude mcp list --json",a.stderr)),n.status==="ok"?i.push(...ec(n.stdout)):s.push(Yl("CLAUDE_HOT_SCAN_JSON_UNSUPPORTED","claude plugin list --json",n.stderr)),{host:ae,checkedAt:r,status:s.length===0?"ready":"degraded",warnings:s.map(l=>l.code),remediation:s.length===0?void 0:"Upgrade Claude Code CLI if JSON hot-scan commands are unavailable.",capabilities:i.map(l=>({...l,installed:l.installed??!0,enabled:l.enabled??!0,active:l.active??!0,authenticated:l.authenticated??!1,healthy:l.healthy??!0,allowed:!0,ready:l.ready??!1})),diagnostics:s}}async bootstrap(){return{tier:"B",mechanism:"global-instruction",supported:!0}}async reload(t){return{status:"unsupported",reason:"Claude reload is deferred until plugin lifecycle integration story."}}async update(t){return{status:"unsupported",reason:"Claude update is deferred until plugin lifecycle integration story."}}async scheduleReconcile(t){let r=Jl(t),o=await ql({apply:r.apply,surface:r.surface,hostConfigRoot:t.hostConfigRoot});return o?.supported?r.kind!=="heartbeat"?{status:"unsupported",reason:"Claude adapter only supports NativeSoul heartbeat scheduled tasks."}:r.skill!==Xl?{status:"error",code:"CLAUDE_HEARTBEAT_SKILL_MISMATCH",message:`Claude heartbeat Scheduled Task must invoke ${Xl}.`}:o.scheduler_kind==="cloud_routine"||o.surface==="cloud"?{status:"unsupported",reason:"Claude cloud routines were detected, but they are out-of-scope for local native Scheduled Tasks evidence."}:o.scheduler_kind==="ui_only"||o.creation_surface==="ui_only"?{status:"unsupported",reason:"Claude task creation is UI-only for this surface; keep status blocked_by_host until a documented machine-readable surface returns a local task id."}:Kl(r.surface,o.surface)?o.enabled===!1?{status:"degraded",reason:"Claude Scheduled Tasks support was detected, but the NativeSoul task is disabled."}:o.native_id?{status:"ok",nativeId:o.native_id,message:r.apply?`Claude Scheduled Task reconciled: ${o.native_id}`:`Claude Scheduled Task reconcile planned: ${o.native_id}`}:{status:"degraded",reason:"Claude Scheduled Tasks support was detected, but no native task id mapping was returned."}:{status:"unsupported",reason:`Claude Scheduled Tasks evidence is for ${o.surface??"unknown"} and does not satisfy ${r.surface}.`}:{status:"unsupported",reason:"Claude Scheduled Tasks native interface was not detected; no cron fallback installed."}}async doctor(){let t=await this.detect(),r=x(Lo),o=await B(r),a=[];return t.detected||a.push({code:"CLAUDE_NOT_DETECTED",severity:"warn",message:"No Claude CLI or CLAUDE.md instruction file was detected.",remediation:"Install Claude Code or create a managed block preview before enabling writes."}),o&&!z(o,ae)&&a.push({code:"CLAUDE_MANAGED_BLOCK_MISSING",severity:"info",message:"Claude global CLAUDE.md exists but has no NativeSoul managed block.",remediation:"Review `nativesoul adapters managed-block --host claude --json`."}),a}async managedBlockPreview(){let t=x(Lo),r=await B(t);return{host:ae,targetPath:t,startMarker:"<!-- nativesoul:claude:start v1 -->",endMarker:"<!-- nativesoul:claude:end -->",content:je(ae),wouldCreate:r===null,wouldUpdate:r!==null&&!z(r,ae)}}};async function Am(e,t){try{let[r,o]=await Promise.all([Gl(Kt.join(e,"mcp-list.json"),"utf8"),Gl(Kt.join(e,"plugin-list.json"),"utf8")]),a=[...Zl(r),...ec(o)];return{host:ae,checkedAt:t,status:"ready",warnings:[],capabilities:a.map(n=>({...n,installed:n.installed??!0,enabled:n.enabled??!0,active:n.active??!0,authenticated:n.authenticated??!1,healthy:n.healthy??!0,allowed:!0,ready:n.ready??!1}))}}catch{return{host:ae,checkedAt:t,status:"degraded",warnings:["CLAUDE_HOT_SCAN_FIXTURES_UNAVAILABLE"],remediation:"Set NATIVESOUL_CLAUDE_HOT_SCAN_FIXTURES to a directory containing mcp-list.json and plugin-list.json.",capabilities:[],diagnostics:[{code:"CLAUDE_HOT_SCAN_FIXTURES_UNAVAILABLE",severity:"warn",message:"Claude hot-scan fixtures were configured but could not be read.",remediation:"Verify NATIVESOUL_CLAUDE_HOT_SCAN_FIXTURES points at mcp-list.json and plugin-list.json."}]}}}function Zl(e){let t=Le(e);return ze(t,["servers","mcps","items"]).flatMap(r=>{let o=C(r,["name","id","server","server_name"]);if(!o)return[];let a=C(r,["status","state"]),n=a!=="disabled",s=a==="connected"||a==="ready"||a==="active"||a==="ok"||a==="authenticated";return[{uid:`claude:mcp:${N(o)}`,host:ae,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`claude mcp list:${o}`,schemaHash:Ql,enabled:n,active:n,authenticated:Z(r,["authenticated"])??s,healthy:n,ready:tc(a)}]})}function ec(e){let t=Le(e);return ze(t,["plugins","items"]).flatMap(r=>{let o=C(r,["id","plugin","package"])??C(r,["name"]);if(!o)return[];let a=C(r,["status","state"]),n=Z(r,["enabled"])??a!=="disabled",s=Z(r,["installed"])??!0;return[{uid:`claude:plugin:${Pm(o)}`,host:ae,nativeKind:"plugin",normalizedKind:"extension",source:`claude plugin list --json:${o}`,schemaHash:Ql,installed:s,enabled:n,active:n,authenticated:Z(r,["authenticated"])??n,healthy:s,ready:n&&(a===null||tc(a)||Z(r,["enabled"])===!0)}]})}function Yl(e,t,r){let o=Em(r.trim()||"command unavailable or unsupported by installed Claude CLI");return{code:e,severity:"warn",message:`${t} did not return supported JSON output: ${o}`,remediation:"Upgrade Claude Code CLI or run `claude mcp list --json` / `claude plugin list --json` manually to confirm support."}}function tc(e){return e==="ready"||e==="enabled"||e==="active"||e==="ok"||e==="authenticated"||e==="connected"}function Pm(e){return N(e,{allowSlash:!0})}function Em(e){return e.replace(/\b[A-Z0-9_]*(?:TOKEN|SECRET|PASSWORD|API[_-]?KEY)[A-Z0-9_]*\s*=\s*\S+/giu,"[REDACTED_SECRET]").replace(/\bsk-[A-Za-z0-9_-]{8,}\b/gu,"[REDACTED_SECRET]")}function rc(){return new an}ft();He();oe();import cn from"node:path";var ee="codex",Do="~/.codex/AGENTS.md",sc="AGENTS.md",qm=1e3,ic="life:heartbeat",Fo="official:codex-app-server:v1",dn=class{async detect(){let t=x(Do),r=cn.resolve(sc),[o,a,n]=await Promise.all([P(t),P(r),Me("codex")]);return{host:ee,detected:o||a||n!==null,path:o?t:a?r:n??void 0,capabilities:{installed:o||a||n!==null,enabled:o||a,active:a,authenticated:!1,healthy:n!==null||o||a,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Codex install writes are not implemented in M2.1; use managed-block preview first."}}async uninstall(t){return{status:"unsupported",reason:"Codex uninstall writes are not implemented in M2.1."}}async coldScan(){let t=x(Do),r=cn.resolve(sc),o=[];return await P(t)&&o.push({uid:"codex:global-agents-md",host:ee,nativeKind:"global_context",normalizedKind:"instruction",source:t}),await P(r)&&o.push({uid:"codex:project-agents-md",host:ee,nativeKind:"project_context",normalizedKind:"instruction",source:r}),o}async hotProbe(t){let r=new Date().toISOString(),o=Ym(t);if(o){let i=await ln(o,r);if(i.status==="ready")return i}let a=process.env.NATIVESOUL_CODEX_APP_SERVER_FIXTURES?.trim();if(a){let i=await ln(Zm(a),r);if(i.status==="ready")return i}let n=Qm(t);if(n){let i=await ln(eg(n),r);if(i.status==="ready")return i}let s=await this.coldScan();return{host:ee,checkedAt:r,status:"degraded",warnings:["CODEX_APP_SERVER_UNAVAILABLE"],remediation:"Start Codex App Server and set NATIVESOUL_CODEX_APP_SERVER_URL before running `nativesoul adapters hot-scan --host codex`.",capabilities:s.map(i=>({...i,source:`codex app server fallback config scan:${i.source}`,installed:!0,enabled:!0,active:i.uid.includes("project"),authenticated:!1,healthy:!0,allowed:!0,ready:!1})),diagnostics:[{code:"CODEX_APP_SERVER_UNAVAILABLE",severity:"warn",message:"Codex App Server inventory endpoint is not configured or did not respond with supported JSON.",remediation:"Set NATIVESOUL_CODEX_APP_SERVER_URL to a reachable Codex App Server endpoint."}]}}async bootstrap(){return{tier:"B",mechanism:"global-instruction",supported:!0}}async reload(t){return{status:"unsupported",reason:"Codex reload is deferred until App Server integration story."}}async update(t){return{status:"unsupported",reason:"Codex update is deferred until marketplace/App Server integration story."}}async scheduleReconcile(t){let{discoverCodexAutomationsManifest:r}=await Promise.resolve().then(()=>(nc(),ac)),o=await r({apply:t.apply,hostConfigRoot:t.hostConfigRoot});return o?.supported?t.kind!=="heartbeat"?{status:"unsupported",reason:"Codex adapter only supports NativeSoul heartbeat automations."}:t.desired.skill!==ic?{status:"error",code:"CODEX_HEARTBEAT_SKILL_MISMATCH",message:`Codex heartbeat Automation must invoke ${ic}.`}:o.native_id?{status:"ok",nativeId:o.native_id,message:t.apply?`Codex Automation reconciled: ${o.native_id}`:`Codex Automation reconcile planned: ${o.native_id}`}:{status:"degraded",reason:"Codex Automations support was detected, but no native automation id mapping was returned."}:{status:"unsupported",reason:"Codex Automations native interface was not detected; no cron fallback installed."}}async doctor(){let t=await this.detect(),r=x(Do),o=await B(r),a=[];return t.detected||a.push({code:"CODEX_NOT_DETECTED",severity:"warn",message:"No Codex CLI or AGENTS.md instruction file was detected.",remediation:"Install Codex or create a managed block preview before enabling writes."}),o&&!z(o,ee)&&a.push({code:"CODEX_MANAGED_BLOCK_MISSING",severity:"info",message:"Codex global AGENTS.md exists but has no NativeSoul managed block.",remediation:"Review `nativesoul adapters managed-block --host codex --json`."}),a}async managedBlockPreview(){let t=x(Do),r=await B(t);return{host:ee,targetPath:t,startMarker:"<!-- nativesoul:codex:start v1 -->",endMarker:"<!-- nativesoul:codex:end -->",content:je(ee),wouldCreate:r===null,wouldUpdate:r!==null&&!z(r,ee)}}};async function ln(e,t){let[r,o,a,n]=await Promise.all([$o(e,"mcpServerStatus/list"),$o(e,"plugin/list"),$o(e,"skills/list"),$o(e,"app/list")]);if([r,o,a,n].some(l=>l===null))return{host:ee,checkedAt:t,status:"degraded",warnings:["CODEX_APP_SERVER_UNAVAILABLE"],remediation:"Ensure Codex App Server is running and supports mcpServerStatus/list, plugin/list, skills/list, and app/list.",capabilities:[],diagnostics:[{code:"CODEX_APP_SERVER_UNAVAILABLE",severity:"warn",message:"Codex App Server did not return supported JSON inventory for all required methods.",remediation:"Check NATIVESOUL_CODEX_APP_SERVER_URL and Codex App Server version."}]};let i=[...Gm(r),...Wm(o),...zm(a),...Xm(n)];return{host:ee,checkedAt:t,status:"ready",warnings:[],capabilities:i.map(l=>({...l,installed:l.installed??!0,enabled:l.enabled??!0,active:l.active??!0,authenticated:l.authenticated??!1,healthy:l.healthy??!0,allowed:!0,ready:l.ready??!1}))}}async function $o(e,t){try{return await e.call(t)}catch{return null}}async function Km(e,t){let r=new AbortController,o=setTimeout(()=>r.abort(),qm);try{let a=await fetch(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:t,method:t,params:{}}),signal:r.signal});if(!a.ok)return null;let n=await a.json();return I(n)&&"error"in n?null:I(n)&&"result"in n?n.result:n}catch{return null}finally{clearTimeout(o)}}function Gm(e){return ze(e,["servers","mcpServers","items"]).flatMap(t=>{let r=C(t,["id","name","server","server_name"]);if(!r)return[];let o=C(t,["status","state"]),a=Uo(t,o);return[{uid:`codex:mcp:${N(r)}`,host:ee,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`codex app server mcpServerStatus/list:${r}`,schemaHash:Fo,...a}]})}function Wm(e){return ze(e,["plugins","items"]).flatMap(t=>{let r=C(t,["id","plugin","package"])??C(t,["name"]);if(!r)return[];let o=C(t,["status","state"]),a=Uo(t,o);return[{uid:`codex:plugin:${un(r)}`,host:ee,nativeKind:"plugin",normalizedKind:"extension",source:`codex app server plugin/list:${r}`,schemaHash:Fo,...a}]})}function zm(e){return ze(e,["skills","items"]).flatMap(t=>{let r=C(t,["id","name","path"]);if(!r)return[];let o=C(t,["status","state"]),a=Uo(t,o);return[{uid:`codex:skill:${un(r)}`,host:ee,nativeKind:"skill",normalizedKind:"skill",source:`codex app server skills/list:${r}`,schemaHash:Fo,...a}]})}function Xm(e){return ze(e,["apps","items"]).flatMap(t=>{let r=C(t,["id","name","app"]);if(!r)return[];let o=C(t,["status","state"]),a=Uo(t,o);return[{uid:`codex:app:${un(r)}`,host:ee,nativeKind:"app_server_app",normalizedKind:"app",source:`codex app server app/list:${r}`,schemaHash:Fo,...a}]})}function Uo(e,t){let r=Z(e,["installed"])??!0,o=t==="disabled"||t==="unavailable",a=t==="error"||t==="unhealthy",n=Z(e,["enabled"])??!o,s=Z(e,["active"])??n,i=Z(e,["healthy"])??(!o&&!a),l=Z(e,["authenticated"])??Z(e,["auth"])??!1,c=Z(e,["ready"])??(r&&n&&s&&i);return{installed:r,enabled:n,active:s,authenticated:l,healthy:i,ready:c}}function Ym(e){if(I(e)){let t=e.appServer;if(I(t)&&typeof t.call=="function")return{call:r=>Promise.resolve(t.call(r))}}return null}function Qm(e){if(I(e)){let t=e.appServerUrl;if(typeof t=="string"&&t.trim().length>0)return t.trim()}return process.env.NATIVESOUL_CODEX_APP_SERVER_URL?.trim()||process.env.CODEX_APP_SERVER_URL?.trim()||null}function Zm(e){return{async call(t){try{let{readFile:r}=await import("node:fs/promises"),o=t.replace(/\//gu,"-");return JSON.parse(await r(cn.join(e,`${o}.json`),"utf8"))}catch(r){let o=r instanceof Error?r.message:"unknown error";throw new Error(`Codex App Server fixture unavailable for ${t}: ${o}`,{cause:r})}}}}function eg(e){return{call:t=>Km(e,t)}}function un(e){return N(e,{allowSlash:!0})}function lc(){return new dn}ft();He();oe();import{readdir as dc}from"node:fs/promises";import ve from"node:path";var X="gemini",mn="~/.gemini/GEMINI.md",tg="~/.gemini/extensions",rg="~/.gemini/settings.json",vr="official:gemini-extension-config:v1",pn="official:gemini-settings-config:v1",og="official:gemini-memory-config:v1",gn=class{async detect(){let t=cc(),r=t.globalInstruction,o=t.extensionsDirectory,[a,n,s]=await Promise.all([P(r),F(o),No("gemini",["--version"])]);return{host:X,detected:a||n||s!==null,version:s??void 0,path:a?r:n?o:void 0,capabilities:{installed:a||n||s!==null,enabled:a||n,active:a,authenticated:!1,healthy:s!==null||a||n,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Gemini direct adapter writes are disabled; use the install orchestrator to install the NativeSoul Gemini extension, MCP registration, and managed block."}}async uninstall(t){return{status:"unsupported",reason:"Gemini direct adapter uninstall is disabled; use the uninstall orchestrator for reversible package removal."}}async coldScan(){let t=[],r=cc(),o=r.globalInstruction;await P(o)&&t.push({uid:"gemini:global-gemini-md",host:X,nativeKind:"global_context",normalizedKind:"memory",source:o,schemaHash:og}),await ag(r.settingsFile,t);let a=r.extensionsDirectory;if(await F(a)){t.push({uid:"gemini:extensions",host:X,nativeKind:"extensions",normalizedKind:"package",source:a,schemaHash:vr});let n=await dc(a,{withFileTypes:!0});for(let s of n)s.isDirectory()&&await ng(ve.join(a,s.name),s.name,t)}return t}async hotProbe(){let t=await this.coldScan();return{host:X,checkedAt:new Date().toISOString(),capabilities:t.map(r=>({...r,installed:!0,enabled:!0,active:r.nativeKind==="global_context"||r.schemaHash?.startsWith("official:")===!0,authenticated:!1,healthy:!0,allowed:!0,ready:r.schemaHash?.startsWith("official:")===!0}))}}async bootstrap(){return{tier:"A",mechanism:"hook",supported:!0}}async reload(t){return{status:"unsupported",reason:"Gemini extension reload is host-driven; run /memory refresh or restart Gemini after installing NativeSoul."}}async update(t){return{status:"unsupported",reason:"Gemini package updates are handled by the NativeSoul install orchestrator."}}async scheduleReconcile(t){return{status:"unsupported",reason:"Gemini does not expose a documented native scheduler for NativeSoul; use the packaged heartbeat command manually or host-supported commands, with no hidden cron."}}async doctor(){let t=await this.detect(),r=x(mn),o=await B(r),a=[];return t.detected||a.push({code:"GEMINI_NOT_DETECTED",severity:"warn",message:"No Gemini CLI, GEMINI.md, or extensions directory was detected.",remediation:"Install Gemini CLI or review `nativesoul adapters managed-block --host gemini --json`."}),o&&!z(o,X)&&a.push({code:"GEMINI_MANAGED_BLOCK_MISSING",severity:"info",message:"GEMINI.md exists but has no NativeSoul managed block.",remediation:"Review `nativesoul adapters managed-block --host gemini --json`."}),a}async managedBlockPreview(){let t=x(mn),r=await B(t);return{host:X,targetPath:t,startMarker:"<!-- nativesoul:gemini:start v1 -->",endMarker:"<!-- nativesoul:gemini:end -->",content:je(X),wouldCreate:r===null,wouldUpdate:r!==null&&!z(r,X)}}};function cc(){let e=process.env.NATIVESOUL_GEMINI_INVENTORY_ROOT?.trim();if(e){let t=ve.resolve(e);return{globalInstruction:ve.join(t,"GEMINI.md"),settingsFile:ve.join(t,"settings.json"),extensionsDirectory:ve.join(t,"extensions")}}return{globalInstruction:x(mn),settingsFile:x(rg),extensionsDirectory:x(tg)}}async function ag(e,t){let r=await G(e);if(r){t.push({uid:"gemini:settings",host:X,nativeKind:"settings",normalizedKind:"config",source:e,schemaHash:pn});for(let o of We(r.mcpServers))t.push({uid:`gemini:mcp:${N(o)}`,host:X,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${e}:mcpServers.${o}`,schemaHash:pn});for(let o of uc(r.tools))t.push({uid:`gemini:tool:${N(o)}`,host:X,nativeKind:"tool",normalizedKind:"tool",source:`${e}:tools.${o}`,schemaHash:pn})}}async function ng(e,t,r){let o=ve.join(e,"gemini-extension.json"),a=await G(o),n=C(a,["name","id"])??t;if(r.push({uid:`gemini:extension:${N(n)}`,host:X,nativeKind:"extension",normalizedKind:"package",source:a?o:e,schemaHash:a?vr:void 0}),a){for(let s of We(a.mcpServers))r.push({uid:`gemini:mcp:${N(s)}`,host:X,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:mcpServers.${s}`,schemaHash:vr});for(let s of uc(a.tools))r.push({uid:`gemini:tool:${N(s)}`,host:X,nativeKind:"tool",normalizedKind:"tool",source:`${o}:tools.${s}`,schemaHash:vr})}await sg(ve.join(e,"commands"),r)}async function sg(e,t){if(!await F(e))return;let r=await dc(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||![".toml",".md"].includes(ve.extname(o.name)))continue;let a=ve.basename(o.name,ve.extname(o.name));t.push({uid:`gemini:command:${N(a,{allowSlash:!0})}`,host:X,nativeKind:"command",normalizedKind:"command",source:ve.join(e,o.name),schemaHash:vr})}}function uc(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):We(e)}function pc(){return new gn}ft();He();oe();import{readdir as yc}from"node:fs/promises";import V from"node:path";var U="grok",Vo="~/.grok/Agents.md",mc="AGENTS.md",gc="Agents.md",fc="CLAUDE.md",ig="~/.grok",fn="official:grok-plugin-config:v1",hc="official:grok-hooks-config:v1",hn="official:grok-mcp-config:v1",_c="official:grok-command-config:v1",lg="official:grok-context-config:v1",cg=[{uid:"grok:plugins",nativeKind:"plugins",normalizedKind:"package",relativePath:"plugins"},{uid:"grok:skills",nativeKind:"skills",normalizedKind:"capability",relativePath:"skills"},{uid:"grok:hooks",nativeKind:"hooks",normalizedKind:"capability",relativePath:"hooks"},{uid:"grok:mcps",nativeKind:"mcp",normalizedKind:"capability",relativePath:"mcps"}],yn=class{async detect(){let t=x(Vo),r=V.resolve(mc),o=V.resolve(gc),a=V.resolve(fc),n=vc(),[s,i,l,c,d,p]=await Promise.all([P(t),P(r),P(o),P(a),F(n),Me("grok")]),h=i||l;return{host:U,detected:s||h||c||d||p!==null,path:s?t:l?o:i?r:c?a:p??void 0,capabilities:{installed:s||h||c||d||p!==null,enabled:s||h||c||d,active:h||c,authenticated:!1,healthy:p!==null||s||d,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Grok direct adapter writes are disabled; use the install orchestrator to install the NativeSoul native hook plugin, MCP registration, and managed block."}}async uninstall(t){return{status:"unsupported",reason:"Grok direct adapter uninstall is disabled; use the uninstall orchestrator for reversible package removal."}}async coldScan(){let t=[],r=dg(),o=r.globalInstruction;await P(o)&&t.push({uid:"grok:global-agents-md",host:U,nativeKind:"global_context",normalizedKind:"instruction",source:o,schemaHash:lg});let a=V.resolve(mc);await P(a)&&t.push({uid:"grok:project-agents-md",host:U,nativeKind:"project_context",normalizedKind:"instruction",source:a});let n=V.resolve(gc);await P(n)&&t.push({uid:"grok:project-agents-titlecase-md",host:U,nativeKind:"project_context",normalizedKind:"instruction",source:n});let s=V.resolve(fc);await P(s)&&t.push({uid:"grok:project-claude-md",host:U,nativeKind:"project_context",normalizedKind:"instruction",source:s});let i=r.root;await bc(r.root,t),await ug(i,t);for(let l of cg){let c=V.join(i,l.relativePath);await F(c)&&t.push({uid:l.uid,host:U,nativeKind:l.nativeKind,normalizedKind:l.normalizedKind,source:c,schemaHash:l.relativePath==="mcps"?hn:fn})}return mg(t)}async hotProbe(){let t=await this.coldScan();return{host:U,checkedAt:new Date().toISOString(),capabilities:t.map(r=>({...r,installed:!0,enabled:!0,active:r.uid.includes("project"),authenticated:!1,healthy:!0,allowed:!0,ready:r.schemaHash?.startsWith("official:")===!0}))}}async bootstrap(){return{tier:"A",mechanism:"hook",supported:!0}}async reload(t){return{status:"unsupported",reason:"Grok reload is host-driven; use the installed NativeSoul command package or restart the host if needed."}}async update(t){return{status:"unsupported",reason:"Grok package updates are handled by the NativeSoul install orchestrator."}}async scheduleReconcile(t){return{status:"unsupported",reason:"Grok has no documented native scheduler or recurring task surface for NativeSoul; headless grok -p, cron, GitHub Actions, systemd, and Windows Task Scheduler are external schedulers and do not satisfy full-native capability."}}async doctor(){let t=await this.detect(),r=x(Vo),o=await B(r),a=[];return t.detected||a.push({code:"GROK_NOT_DETECTED",severity:"warn",message:"No Grok CLI, ~/.grok directory, or project instruction file was detected.",remediation:"Install Grok Build or review `nativesoul adapters managed-block --host grok --json`."}),o&&!z(o,U)&&a.push({code:"GROK_MANAGED_BLOCK_MISSING",severity:"info",message:"Grok global Agents.md exists but has no NativeSoul managed block.",remediation:"Review `nativesoul adapters managed-block --host grok --json`."}),a}async managedBlockPreview(){let t=x(Vo),r=await B(t);return{host:U,targetPath:t,startMarker:"<!-- nativesoul:grok:start v1 -->",endMarker:"<!-- nativesoul:grok:end -->",content:je(U),wouldCreate:r===null,wouldUpdate:r!==null&&!z(r,U)}}};function vc(){let e=process.env.NATIVESOUL_GROK_INVENTORY_ROOT?.trim();return e?V.resolve(e):x(ig)}function dg(){let e=vc();return{root:e,globalInstruction:process.env.NATIVESOUL_GROK_INVENTORY_ROOT?.trim()?V.join(e,"Agents.md"):x(Vo)}}async function bc(e,t){let r=V.join(e,"plugin.json"),o=V.join(e,"nativesoul-package.json"),a=V.join(e,"hooks","hooks.json"),n=V.join(e,".mcp.json"),[s,i,l,c]=await Promise.all([G(r),G(o),G(a),G(n)]);if(s){let d=C(s,["name","id"])??"unknown";t.push({uid:`grok:plugin:${N(d)}`,host:U,nativeKind:"plugin",normalizedKind:"extension",source:r,schemaHash:fn})}if(i){let d=C(i,["name","id"])??"unknown";t.push({uid:`grok:package:${N(d)}`,host:U,nativeKind:"native_plugin_package",normalizedKind:"package",source:o,schemaHash:fn});let p=I(i.nativeSoul)?i.nativeSoul:{};for(let w of Oo(p.commands))t.push({uid:`grok:command:${N(w)}`,host:U,nativeKind:"command",normalizedKind:"command",source:`${o}:nativeSoul.commands.${w}`,schemaHash:_c});let h=I(p.mcpServer)?p.mcpServer:null,y=C(h,["name"]);y&&t.push({uid:`grok:mcp:${N(y)}`,host:U,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:nativeSoul.mcpServer.${y}`,schemaHash:hn})}if(l){t.push({uid:"grok:hooks:manifest",host:U,nativeKind:"hooks",normalizedKind:"lifecycle_hooks",source:a,schemaHash:hc});let d=I(l.hooks)?l.hooks:{};for(let p of Object.keys(d))t.push({uid:`grok:hook:${N(p)}`,host:U,nativeKind:"hook",normalizedKind:"lifecycle_hook",source:`${a}:hooks.${p}`,schemaHash:hc})}if(c)for(let d of We(c.mcpServers))t.push({uid:`grok:mcp:${N(d)}`,host:U,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${n}:mcpServers.${d}`,schemaHash:hn});await pg(V.join(e,"commands"),t)}async function ug(e,t){let r=V.join(e,"plugins");if(!await F(r))return;let o=await yc(r,{withFileTypes:!0});for(let a of o)a.isDirectory()&&await bc(V.join(r,a.name),t)}async function pg(e,t){if(!await F(e))return;let r=await yc(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||V.extname(o.name)!==".md")continue;let a=V.basename(o.name,".md");t.push({uid:`grok:command:${N(a,{allowSlash:!0})}`,host:U,nativeKind:"command",normalizedKind:"command",source:V.join(e,o.name),schemaHash:_c})}}function mg(e){let t=new Set,r=[];for(let o of e)t.has(o.uid)||(t.add(o.uid),r.push(o));return r}function wc(){return new yn}import{mkdir as Bo,readFile as Jo,rm as gg,writeFile as qo}from"node:fs/promises";import{existsSync as Ko}from"node:fs";import br from"node:path";function Go(e){return{start:`<!-- nativesoul:${e}:start v1 -->`,end:`<!-- nativesoul:${e}:end -->`}}async function Rc(e){let t=g(e.home),r=Ko(e.targetPath),o=r?await Jo(e.targetPath,"utf8"):null,a=hg(o,e.host,e.block),n=o===null?null:S(o),s=S(a),i=yg(o,a,e.host),l=i!=="noop",c=!e.apply,d=l&&e.apply?await Pc(t.home,e.host,e.targetPath,r,o,s):null;l&&e.apply&&(await Bo(br.dirname(e.targetPath),{recursive:!0,mode:448}),await qo(e.targetPath,a,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:e.targetPath,action:i,dryRun:c,changed:l,beforeHash:n,afterHash:s,diff:Ec(o,a),backupPath:d,applied:l&&e.apply};return await f({home:t.home,type:e.apply?"managed_block_apply":"managed_block_dry_run",details:p}),p}async function kc(e){let t=g(e.home),r=Ko(e.targetPath),o=r?await Jo(e.targetPath,"utf8"):null,a=fg(o,e.host),n=o===null?null:S(o),s=a===null?S(""):S(a),i=o!==a?"remove":"noop",l=i!=="noop",c=!e.apply,d=l&&e.apply?await Pc(t.home,e.host,e.targetPath,r,o,s):null;l&&e.apply&&a!==null&&(await Bo(br.dirname(e.targetPath),{recursive:!0,mode:448}),await qo(e.targetPath,a,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:e.targetPath,action:i,dryRun:c,changed:l,beforeHash:n,afterHash:s,diff:Ec(o,a),backupPath:d,applied:l&&e.apply};return await f({home:t.home,type:e.apply?"managed_block_uninstall":"managed_block_uninstall_dry_run",details:p}),p}async function Sc(e){let t=Ko(e.targetPath),r=[];if(!t)return r.push({code:"MANAGED_BLOCK_TARGET_MISSING",severity:"warn",message:`Managed block target is missing: ${e.targetPath}`,remediation:"Run nativesoul install --host <host> --apply"}),{host:e.host,targetPath:e.targetPath,target_exists:!1,configured:!1,markers_valid:!1,issues:r};let o=await Jo(e.targetPath,"utf8"),a=Go(e.host),n=o.indexOf(a.start),s=o.indexOf(a.end),i=n>=0,l=s>=0,c=i&&l&&s>n;return!i&&!l?r.push({code:"MANAGED_BLOCK_MISSING",severity:"warn",message:"NativeSoul managed block is not configured.",remediation:"Run nativesoul install --host <host> --apply"}):c||r.push({code:"MANAGED_BLOCK_MARKERS_INVALID",severity:"error",message:"NativeSoul managed block markers are incomplete or out of order.",remediation:"Fix the managed block markers or restore from a backup snapshot"}),{host:e.host,targetPath:e.targetPath,target_exists:!0,configured:c,markers_valid:c,issues:r}}async function Ac(e){let t=g(e.home),r=JSON.parse(await Jo(e.snapshotPath,"utf8")),o=!e.apply;e.apply&&(r.beforeExists&&r.beforeContent!==null?(await Bo(br.dirname(r.targetPath),{recursive:!0,mode:448}),await qo(r.targetPath,r.beforeContent,{encoding:"utf8",mode:384})):Ko(r.targetPath)&&await gg(r.targetPath));let a={snapshotPath:e.snapshotPath,targetPath:r.targetPath,dryRun:o,applied:e.apply,restoredExists:r.beforeExists,restoredHash:r.beforeHash};return await f({home:t.home,type:e.apply?"managed_block_rollback":"managed_block_rollback_dry_run",details:a}),a}function fg(e,t){if(e===null)return null;let{start:r,end:o}=Go(t),a=e.indexOf(r),n=e.indexOf(o);if(a<0||n<=a)return e;let s=n+o.length,i=e.slice(0,a),l=e.slice(s);return i.endsWith(`
822
+ `}var Ym=["memory/daily","memory/projects","memory/archive","commitments","standing-orders","capabilities/cards","generated","state","logs","backups","proposals"],Qm=Wo;function uc(e){return Ne.resolve(e??process.env.NATIVESOUL_HOME??Ne.join(zm.homedir(),".nativesoul"))}function f(e){let t=uc(e);return{home:t,database:Ne.join(t,"state","nativesoul.sqlite"),auditLog:Ne.join(t,"logs","audit.jsonl")}}async function R(e){try{return await Xm(e,Gm.F_OK),!0}catch{return!1}}async function v(e){let t=f(e),r=[],o=[],n=[];dc(t.home)||(await cc(t.home,{recursive:!0,mode:448}),r.push(t.home));for(let i of Ym){let l=Ne.join(t.home,i);dc(l)||(await cc(l,{recursive:!0,mode:448}),r.push(l))}let s=await R(Ne.join(t.home,"state","onboarding.complete"));for(let[i,l]of Object.entries(Qm)){if(i==="BOOTSTRAP.md"&&s)continue;let c=Ne.join(t.home,i);if(await R(c)){n.push(c);continue}try{await Ps(c,l,{encoding:"utf8",mode:384,flag:"wx"}),o.push(c)}catch(d){if(Zm(d)){n.push(c);continue}throw d}}let a=await eg(t.home);return o.push(...a.createdFiles),n.push(...a.preservedFiles),{home:t.home,database:t.database,createdDirectories:r,createdFiles:o,preservedFiles:n}}function Zm(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST"}async function eg(e){let t=[],r=[],o=new Date().toISOString().slice(0,10),n=Ne.join(e,"memory","daily",`${o}.md`);await R(n)?r.push(n):(await Ps(n,lc(o),{encoding:"utf8",mode:384,flag:"wx"}),t.push(n));let s=Ne.join(e,"standing-orders","example.yaml");return await R(s)?r.push(s):(await Ps(s,ic,{encoding:"utf8",mode:384,flag:"wx"}),t.push(s)),{createdFiles:t,preservedFiles:r}}async function me(e,t){let r=Ne.join(e,t);return await R(r)?Km(r,"utf8"):""}async function h(e){let t=f(e.home),r=new Date().toISOString(),o=js(H(e.details??{}),t.home),n={id:T("evt"),type:e.type,actor:e.actor??"cli",origin:e.origin??"nativesoul",result:e.result??"ok",details:o,created_at:r,hash:ke({type:e.type,actor:e.actor??"cli",origin:e.origin??"nativesoul",result:e.result??"ok",details:o,created_at:r})},s=_(t.database);try{s.insertEvent(n)}finally{s.close()}return await rg(ng.dirname(t.auditLog),{recursive:!0,mode:448}),await tg(t.auditLog,`${JSON.stringify(n)}
823
+ `,{encoding:"utf8",mode:384}),n}function js(e,t){if(typeof e=="string")return sg(e,t);if(Array.isArray(e))return e.map(r=>js(r,t));if(e&&typeof e=="object"){let r={};for(let[o,n]of Object.entries(e))r[o]=js(n,t);return r}return e}function sg(e,t){return[[new RegExp(xs(t),"gu"),"[REDACTED_NATIVESOUL_HOME]"],[new RegExp(xs(process.cwd()),"gu"),"[REDACTED_WORKSPACE]"],[new RegExp(xs(og.homedir()),"gu"),"[REDACTED_USER_HOME]"],[/\/Users\/[A-Za-z0-9._-]+/gu,"[REDACTED_USER_HOME]"],[/\/home\/[A-Za-z0-9._-]+/gu,"[REDACTED_USER_HOME]"],[/[A-Z]:[\\/]+Users[\\/]+[A-Za-z0-9._-]+/gu,"[REDACTED_USER_HOME]"]].reduce((o,[n,s])=>o.replace(n,s),e)}function xs(e){return e.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}async function Jo(e){let t=f(e.home),r=_(t.database);try{return r.listEvents({type:e.type,result:e.result,limit:ag(e.limit)})}finally{r.close()}}async function Is(e){let t=f(e.home),r=await Jo(e);return await h({home:t.home,type:"audit_exported",details:{format:e.format,count:r.length,type:e.type??null,result:e.result??null}}),{format:e.format,events:r}}function ag(e){return Math.min(Math.max(e??50,1),500)}import jt from"node:path";import{mkdir as $f,readdir as Ff,readFile as Qs,writeFile as Uf}from"node:fs/promises";import{existsSync as Vf}from"node:fs";import Mr from"node:path";bt();le();Ue();le();import{readdir as hg}from"node:fs/promises";import ge from"node:path";var we="antigravity",yg="~/.gemini/GEMINI.md",_g="~/.antigravity",Cs="official:antigravity-plugin-config:v1",hc="official:antigravity-hooks-config:v1",yc="official:antigravity-mcp-config:v1",_c="official:antigravity-command-config:v1",bg="official:antigravity-context-config:v1",vg="official:antigravity-features:v1",kg=[{uid:"antigravity:plugins",nativeKind:"plugins",normalizedKind:"package",relativePath:"plugins"}];function Ns(){let e=process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim();return e?ge.resolve(e):j(_g)}function wg(){let e=Ns();return{root:e,globalInstruction:process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim()?ge.join(e,"GEMINI.md"):j(yg)}}async function bc(){let e=[],t=wg();await P(t.globalInstruction)&&e.push({uid:"antigravity:global-gemini-md",host:we,nativeKind:"global_context",normalizedKind:"instruction",source:t.globalInstruction,schemaHash:bg}),await Rg(t.root,e),await Sg(t.root,e);for(let r of kg){let o=ge.join(t.root,r.relativePath);await B(o)&&e.push({uid:r.uid,host:we,nativeKind:r.nativeKind,normalizedKind:r.normalizedKind,source:o,schemaHash:Cs})}return e}async function Rg(e,t){let r=ge.join(e,"plugin.json"),o=ge.join(e,"nativesoul-package.json"),n=ge.join(e,"hooks.json"),s=ge.join(e,"mcp_config.json"),[a,i,l,c]=await Promise.all([Y(r),Y(o),Y(n),Y(s)]);if(a){let d=I(a,["name","id"])??"unknown";t.push({uid:`antigravity:plugin:${M(d)}`,host:we,nativeKind:"plugin",normalizedKind:"extension",source:r,schemaHash:Cs})}if(i){let d=I(i,["name","id"])??"unknown";t.push({uid:`antigravity:package:${M(d)}`,host:we,nativeKind:"native_plugin_package",normalizedKind:"package",source:o,schemaHash:Cs});let p=N(i.nativeSoul)?i.nativeSoul:{};for(let k of Ko(p.commands))t.push({uid:`antigravity:command:${M(k)}`,host:we,nativeKind:"command",normalizedKind:"command",source:`${o}:nativeSoul.commands.${k}`,schemaHash:_c});let g=N(p.mcpServer)?p.mcpServer:null,y=I(g,["name"]);y&&t.push({uid:`antigravity:mcp:${M(y)}`,host:we,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:nativeSoul.mcpServer.${y}`,schemaHash:yc})}if(l){t.push({uid:"antigravity:hooks:manifest",host:we,nativeKind:"hooks",normalizedKind:"lifecycle_hooks",source:n,schemaHash:hc});let d=N(l.hooks)?l.hooks:{};for(let p of Object.keys(d))t.push({uid:`antigravity:hook:${M(p)}`,host:we,nativeKind:"hook",normalizedKind:"lifecycle_hook",source:`${n}:hooks.${p}`,schemaHash:hc})}if(c)for(let d of Qe(c.mcpServers))t.push({uid:`antigravity:mcp:${M(d)}`,host:we,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${s}:mcpServers.${d}`,schemaHash:yc});await Ag(ge.join(e,"commands"),t)}async function Sg(e,t){let r=ge.join(e,"features-evidence.json"),o=await Y(r);if(!o)return;let n=["scheduled_tasks","cron_schedules","background_agents","subagents","skills","mcps","json_hooks"];for(let s of n)o[s]===!0&&t.push({uid:`antigravity:feature:${s.replace(/_/gu,"-")}`,host:we,nativeKind:"product_feature",normalizedKind:"feature_evidence",source:`${r}:${s}`,schemaHash:vg})}async function Ag(e,t){if(!await B(e))return;let r=await hg(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||ge.extname(o.name)!==".md")continue;let n=ge.basename(o.name,".md");t.push({uid:`antigravity:command:${M(n,{allowSlash:!0})}`,host:we,nativeKind:"command",normalizedKind:"command",source:ge.join(e,o.name),schemaHash:_c})}}le();Ue();import Go from"node:path";async function vc(e){let t=await Eg(e);if(!t)return null;let r=await Y(t);return r?{product_features_verified:r.product_features_verified===!0,write_contract_verified:r.write_contract_verified===!0,native_id:typeof r.native_id=="string"&&r.native_id.trim().length>0?r.native_id.trim():void 0,enabled:typeof r.enabled=="boolean"?r.enabled:void 0,updated_at:typeof r.updated_at=="string"?r.updated_at:void 0,contract:N(r.contract)?{schedule:I(r.contract,["schedule"])??void 0,status:I(r.contract,["status"])??void 0,cancel:I(r.contract,["cancel"])??void 0,list:I(r.contract,["list"])??void 0,project_binding:I(r.contract,["project_binding"])??void 0}:void 0}:null}async function Eg(e){let t=process.env.NATIVESOUL_ANTIGRAVITY_SCHEDULER_MANIFEST?.trim();if(t)return t;let r=process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim();if(r)return Go.join(Go.resolve(r),"scheduler-proof.json");let o=e??j("~/.antigravity"),n=[Go.join(o,"scheduler-proof.json"),Go.join(o,"native-scheduler-proof.json")];for(let s of n)if(await P(s))return s;return null}function kc(e){if(!e)return!1;let t=Date.parse(e);return Number.isFinite(t)?Date.now()-t>10080*60*1e3:!0}var Yt="antigravity",Os="~/.gemini/GEMINI.md",Ms=class{async detect(){let t=j(Os),r=Ns(),[o,n,s]=await Promise.all([P(t),B(r),$e("agy")]);return{host:Yt,detected:n||s!==null,path:n?r:s??(o?t:void 0),capabilities:{installed:n||s!==null,enabled:n,active:!1,authenticated:!1,healthy:s!==null||n,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Antigravity direct adapter writes are disabled; use the install orchestrator to install the NativeSoul native hook plugin, MCP registration, and managed block."}}async uninstall(t){return{status:"unsupported",reason:"Antigravity direct adapter uninstall is disabled; use the uninstall orchestrator for reversible package removal."}}async coldScan(){return bc()}async hotProbe(){let t=await this.coldScan();return{host:Yt,checkedAt:new Date().toISOString(),capabilities:t.map(r=>({...r,installed:!0,enabled:!0,active:r.nativeKind==="global_context",authenticated:!1,healthy:!0,allowed:!0,ready:r.schemaHash?.startsWith("official:")===!0}))}}async bootstrap(){return{tier:"A",mechanism:"hook",supported:!0}}async reload(t){return{status:"unsupported",reason:"Antigravity reload is host-driven; use the installed NativeSoul command package or restart the host if needed."}}async update(t){return{status:"unsupported",reason:"Antigravity package updates are handled by the NativeSoul install orchestrator."}}async scheduleReconcile(t){let r=await vc(t.hostConfigRoot);if(!r?.product_features_verified)return{status:"unsupported",reason:"Antigravity Scheduled Tasks product-level evidence was not detected; no hidden cron fallback installed."};if(!r.write_contract_verified)return{status:"unsupported",reason:"Antigravity product-level Scheduled Tasks are documented, but scheduler write/list/cancel/status contract proof is missing; keep full-native blocked_by_host:scheduler_write_contract_missing."};if(!r.contract?.schedule||!r.contract.status||!r.contract.cancel||!r.contract.list)return{status:"unsupported",reason:"Antigravity scheduler proof is missing one or more required commands: schedule, status, cancel, list."};if(r.enabled===!1)return{status:"degraded",reason:"Antigravity scheduler contract was detected, but the NativeSoul scheduled task is disabled."};if(!r.native_id)return{status:"degraded",reason:"Antigravity scheduler contract was detected, but no native task id mapping was returned."};if(kc(r.updated_at))return{status:"degraded",reason:"Antigravity scheduler proof is stale; re-run scheduler status/list before claiming full-native."};let o=t.apply?"reconciled":"reconcile planned";return{status:"ok",nativeId:r.native_id,message:`Antigravity Scheduled Task ${o}: ${r.native_id}`}}async doctor(){let t=await this.detect(),r=j(Os),o=await q(r),n=[];return t.detected||n.push({code:"ANTIGRAVITY_NOT_DETECTED",severity:"warn",message:"No Antigravity CLI or ~/.antigravity directory was detected. A shared ~/.gemini/GEMINI.md alone is not treated as Antigravity readiness.",remediation:"Install Antigravity CLI or review `nativesoul adapters managed-block --host antigravity --json`."}),o&&!Z(o,Yt)&&n.push({code:"ANTIGRAVITY_MANAGED_BLOCK_MISSING",severity:"info",message:"GEMINI.md exists but has no NativeSoul managed block for Antigravity.",remediation:"Review `nativesoul adapters managed-block --host antigravity --json`."}),n}async managedBlockPreview(){let t=j(Os),r=await q(t);return{host:Yt,targetPath:t,startMarker:"<!-- nativesoul:antigravity:start v1 -->",endMarker:"<!-- nativesoul:antigravity:end -->",content:Oe(Yt),wouldCreate:r===null,wouldUpdate:r!==null&&!Z(r,Yt)}}};function wc(){return new Ms}bt();Ue();le();import Qt from"node:path";import{readFile as Vc}from"node:fs/promises";Ue();import{readFile as Mc}from"node:fs/promises";import Hg from"node:path";var Hc="life:heartbeat";function $c(e){if(!e||typeof e!="object"||Array.isArray(e))return{kind:"unknown",mode:"leader",apply:!1,skill:Hc};let t=e;return{kind:typeof t.kind=="string"?t.kind:"unknown",mode:typeof t.mode=="string"?t.mode:"leader",apply:t.apply===!0,skill:Vg(t),surface:Dc(t.surface)??Dc(N(t.desired)?t.desired.surface:void 0)}}async function Fc(e={}){let t=process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_FIXTURES;if(t)try{return Lc(await Mc(Hg.join(t,"scheduled-tasks.json"),"utf8"))}catch{return null}let r=process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_MANIFEST;if(r)try{return Lc(await Mc(r,"utf8"))}catch{return null}if(process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_SUPPORTED==="1")return{supported:!0,native_id:process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_NATIVE_ID,surface:"claude-desktop",scheduler_kind:"unknown",creation_surface:"unknown",evidence_source:"env"};let{discoverClaudeScheduledTasksManifest:o}=await Promise.resolve().then(()=>(Oc(),Nc));return o({apply:e.apply,surface:e.surface,hostConfigRoot:e.hostConfigRoot})}function Uc(e,t){return!e||e==="default"||!t?!0:e===t}function Lc(e){let t=Fe(e);if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t,o=$g(r.surface),n=Fg(r.scheduler_kind??r.kind);return{supported:r.supported===!0,native_id:typeof r.native_id=="string"&&r.native_id.length>0?r.native_id:void 0,surface:o??(n==="cloud_routine"?"cloud":"claude-desktop"),scheduler_kind:n,creation_surface:Ug(r.creation_surface),evidence_source:typeof r.evidence_source=="string"&&r.evidence_source.trim().length>0?r.evidence_source.trim():void 0,enabled:typeof r.enabled=="boolean"?r.enabled:void 0}}function Dc(e){return e==="default"||e==="claude-code"||e==="claude-desktop"?e:void 0}function $g(e){return e==="claude-code"||e==="claude-desktop"||e==="cloud"?e:void 0}function Fg(e){return e==="local_scheduled_task"||e==="cloud_routine"||e==="ui_only"?e:"unknown"}function Ug(e){return e==="official_machine_readable"||e==="ui_only"||e==="unknown"?e:void 0}function Vg(e){return N(e.desired)&&typeof e.desired.skill=="string"&&e.desired.skill.trim().length>0?e.desired.skill.trim():Hc}var ce="claude",Xo="~/.claude/CLAUDE.md",Bc="CLAUDE.md",Wc=".claude/CLAUDE.md",Jc="life:heartbeat",Kc="official:claude-cli-hot-scan:v1",Ds=class{async detect(){let t=j(Xo),r=Qt.resolve(Bc),o=Qt.resolve(Wc),[n,s,a,i]=await Promise.all([P(t),P(r),P(o),qo("claude",["--version"])]);return{host:ce,detected:n||s||a||i!==null,version:i??void 0,path:n?t:s?r:a?o:void 0,capabilities:{installed:n||s||a||i!==null,enabled:n||s||a,active:s||a,authenticated:!1,healthy:i!==null||n||s||a,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Claude install writes are not implemented in M2.1; use managed-block preview first."}}async uninstall(t){return{status:"unsupported",reason:"Claude uninstall writes are not implemented in M2.1."}}async coldScan(){let t=j(Xo),r=Qt.resolve(Bc),o=Qt.resolve(Wc),n=[];return await P(t)&&n.push({uid:"claude:global-claude-md",host:ce,nativeKind:"global_context",normalizedKind:"instruction",source:t}),await P(r)&&n.push({uid:"claude:project-claude-md",host:ce,nativeKind:"project_context",normalizedKind:"instruction",source:r}),await P(o)&&n.push({uid:"claude:project-dot-claude-md",host:ce,nativeKind:"project_context",normalizedKind:"instruction",source:o}),n}async hotProbe(t){let r=new Date().toISOString(),o=process.env.NATIVESOUL_CLAUDE_HOT_SCAN_FIXTURES?.trim();if(o){let l=await Bg(o,r);if(l.status==="ready")return l}let[n,s]=await Promise.all([Ts("claude",["mcp","list","--json"],1200),Ts("claude",["plugin","list","--json"],1200)]),a=[],i=[];return n.status==="ok"?i.push(...Gc(n.stdout)):a.push(qc("CLAUDE_HOT_SCAN_JSON_UNSUPPORTED","claude mcp list --json",n.stderr)),s.status==="ok"?i.push(...Xc(s.stdout)):a.push(qc("CLAUDE_HOT_SCAN_JSON_UNSUPPORTED","claude plugin list --json",s.stderr)),{host:ce,checkedAt:r,status:a.length===0?"ready":"degraded",warnings:a.map(l=>l.code),remediation:a.length===0?void 0:"Upgrade Claude Code CLI if JSON hot-scan commands are unavailable.",capabilities:i.map(l=>({...l,installed:l.installed??!0,enabled:l.enabled??!0,active:l.active??!0,authenticated:l.authenticated??!1,healthy:l.healthy??!0,allowed:!0,ready:l.ready??!1})),diagnostics:a}}async bootstrap(){return{tier:"B",mechanism:"global-instruction",supported:!0}}async reload(t){return{status:"unsupported",reason:"Claude reload is deferred until plugin lifecycle integration story."}}async update(t){return{status:"unsupported",reason:"Claude update is deferred until plugin lifecycle integration story."}}async scheduleReconcile(t){let r=$c(t),o=await Fc({apply:r.apply,surface:r.surface,hostConfigRoot:t.hostConfigRoot});return o?.supported?r.kind!=="heartbeat"?{status:"unsupported",reason:"Claude adapter only supports NativeSoul heartbeat scheduled tasks."}:r.skill!==Jc?{status:"error",code:"CLAUDE_HEARTBEAT_SKILL_MISMATCH",message:`Claude heartbeat Scheduled Task must invoke ${Jc}.`}:o.scheduler_kind==="cloud_routine"||o.surface==="cloud"?{status:"unsupported",reason:"Claude cloud routines were detected, but they are out-of-scope for local native Scheduled Tasks evidence."}:o.scheduler_kind==="ui_only"||o.creation_surface==="ui_only"?{status:"unsupported",reason:"Claude task creation is UI-only for this surface; keep status blocked_by_host until a documented machine-readable surface returns a local task id."}:Uc(r.surface,o.surface)?o.enabled===!1?{status:"degraded",reason:"Claude Scheduled Tasks support was detected, but the NativeSoul task is disabled."}:o.native_id?{status:"ok",nativeId:o.native_id,message:r.apply?`Claude Scheduled Task reconciled: ${o.native_id}`:`Claude Scheduled Task reconcile planned: ${o.native_id}`}:{status:"degraded",reason:"Claude Scheduled Tasks support was detected, but no native task id mapping was returned."}:{status:"unsupported",reason:`Claude Scheduled Tasks evidence is for ${o.surface??"unknown"} and does not satisfy ${r.surface}.`}:{status:"unsupported",reason:"Claude Scheduled Tasks native interface was not detected; no cron fallback installed."}}async doctor(){let t=await this.detect(),r=j(Xo),o=await q(r),n=[];return t.detected||n.push({code:"CLAUDE_NOT_DETECTED",severity:"warn",message:"No Claude CLI or CLAUDE.md instruction file was detected.",remediation:"Install Claude Code or create a managed block preview before enabling writes."}),o&&!Z(o,ce)&&n.push({code:"CLAUDE_MANAGED_BLOCK_MISSING",severity:"info",message:"Claude global CLAUDE.md exists but has no NativeSoul managed block.",remediation:"Review `nativesoul adapters managed-block --host claude --json`."}),n}async managedBlockPreview(){let t=j(Xo),r=await q(t);return{host:ce,targetPath:t,startMarker:"<!-- nativesoul:claude:start v1 -->",endMarker:"<!-- nativesoul:claude:end -->",content:Oe(ce),wouldCreate:r===null,wouldUpdate:r!==null&&!Z(r,ce)}}};async function Bg(e,t){try{let[r,o]=await Promise.all([Vc(Qt.join(e,"mcp-list.json"),"utf8"),Vc(Qt.join(e,"plugin-list.json"),"utf8")]),n=[...Gc(r),...Xc(o)];return{host:ce,checkedAt:t,status:"ready",warnings:[],capabilities:n.map(s=>({...s,installed:s.installed??!0,enabled:s.enabled??!0,active:s.active??!0,authenticated:s.authenticated??!1,healthy:s.healthy??!0,allowed:!0,ready:s.ready??!1}))}}catch{return{host:ce,checkedAt:t,status:"degraded",warnings:["CLAUDE_HOT_SCAN_FIXTURES_UNAVAILABLE"],remediation:"Set NATIVESOUL_CLAUDE_HOT_SCAN_FIXTURES to a directory containing mcp-list.json and plugin-list.json.",capabilities:[],diagnostics:[{code:"CLAUDE_HOT_SCAN_FIXTURES_UNAVAILABLE",severity:"warn",message:"Claude hot-scan fixtures were configured but could not be read.",remediation:"Verify NATIVESOUL_CLAUDE_HOT_SCAN_FIXTURES points at mcp-list.json and plugin-list.json."}]}}}function Gc(e){let t=Fe(e);return Ze(t,["servers","mcps","items"]).flatMap(r=>{let o=I(r,["name","id","server","server_name"]);if(!o)return[];let n=I(r,["status","state"]),s=n!=="disabled",a=n==="connected"||n==="ready"||n==="active"||n==="ok"||n==="authenticated";return[{uid:`claude:mcp:${M(o)}`,host:ce,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`claude mcp list:${o}`,schemaHash:Kc,enabled:s,active:s,authenticated:ne(r,["authenticated"])??a,healthy:s,ready:zc(n)}]})}function Xc(e){let t=Fe(e);return Ze(t,["plugins","items"]).flatMap(r=>{let o=I(r,["id","plugin","package"])??I(r,["name"]);if(!o)return[];let n=I(r,["status","state"]),s=ne(r,["enabled"])??n!=="disabled",a=ne(r,["installed"])??!0;return[{uid:`claude:plugin:${Wg(o)}`,host:ce,nativeKind:"plugin",normalizedKind:"extension",source:`claude plugin list --json:${o}`,schemaHash:Kc,installed:a,enabled:s,active:s,authenticated:ne(r,["authenticated"])??s,healthy:a,ready:s&&(n===null||zc(n)||ne(r,["enabled"])===!0)}]})}function qc(e,t,r){let o=Jg(r.trim()||"command unavailable or unsupported by installed Claude CLI");return{code:e,severity:"warn",message:`${t} did not return supported JSON output: ${o}`,remediation:"Upgrade Claude Code CLI or run `claude mcp list --json` / `claude plugin list --json` manually to confirm support."}}function zc(e){return e==="ready"||e==="enabled"||e==="active"||e==="ok"||e==="authenticated"||e==="connected"}function Wg(e){return M(e,{allowSlash:!0})}function Jg(e){return e.replace(/\b[A-Z0-9_]*(?:TOKEN|SECRET|PASSWORD|API[_-]?KEY)[A-Z0-9_]*\s*=\s*\S+/giu,"[REDACTED_SECRET]").replace(/\bsk-[A-Za-z0-9_-]{8,}\b/gu,"[REDACTED_SECRET]")}function Yc(){return new Ds}bt();Ue();le();import Us from"node:path";var se="codex",Yo="~/.codex/AGENTS.md",td="AGENTS.md",df=1e3,rd="life:heartbeat",Zo="official:codex-app-server:v1",Vs=class{async detect(){let t=j(Yo),r=Us.resolve(td),[o,n,s]=await Promise.all([P(t),P(r),$e("codex")]);return{host:se,detected:o||n||s!==null,path:o?t:n?r:s??void 0,capabilities:{installed:o||n||s!==null,enabled:o||n,active:n,authenticated:!1,healthy:s!==null||o||n,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Codex install writes are not implemented in M2.1; use managed-block preview first."}}async uninstall(t){return{status:"unsupported",reason:"Codex uninstall writes are not implemented in M2.1."}}async coldScan(){let t=j(Yo),r=Us.resolve(td),o=[];return await P(t)&&o.push({uid:"codex:global-agents-md",host:se,nativeKind:"global_context",normalizedKind:"instruction",source:t}),await P(r)&&o.push({uid:"codex:project-agents-md",host:se,nativeKind:"project_context",normalizedKind:"instruction",source:r}),o}async hotProbe(t){let r=new Date().toISOString(),o=hf(t);if(o){let i=await Fs(o,r);if(i.status==="ready")return i}let n=process.env.NATIVESOUL_CODEX_APP_SERVER_FIXTURES?.trim();if(n){let i=await Fs(_f(n),r);if(i.status==="ready")return i}let s=yf(t);if(s){let i=await Fs(bf(s),r);if(i.status==="ready")return i}let a=await this.coldScan();return{host:se,checkedAt:r,status:"degraded",warnings:["CODEX_APP_SERVER_UNAVAILABLE"],remediation:"Start Codex App Server and set NATIVESOUL_CODEX_APP_SERVER_URL before running `nativesoul adapters hot-scan --host codex`.",capabilities:a.map(i=>({...i,source:`codex app server fallback config scan:${i.source}`,installed:!0,enabled:!0,active:i.uid.includes("project"),authenticated:!1,healthy:!0,allowed:!0,ready:!1})),diagnostics:[{code:"CODEX_APP_SERVER_UNAVAILABLE",severity:"warn",message:"Codex App Server inventory endpoint is not configured or did not respond with supported JSON.",remediation:"Set NATIVESOUL_CODEX_APP_SERVER_URL to a reachable Codex App Server endpoint."}]}}async bootstrap(){return{tier:"B",mechanism:"global-instruction",supported:!0}}async reload(t){return{status:"unsupported",reason:"Codex reload is deferred until App Server integration story."}}async update(t){return{status:"unsupported",reason:"Codex update is deferred until marketplace/App Server integration story."}}async scheduleReconcile(t){let{discoverCodexAutomationsManifest:r}=await Promise.resolve().then(()=>(ed(),Zc)),o=await r({apply:t.apply,hostConfigRoot:t.hostConfigRoot});return o?.supported?t.kind!=="heartbeat"?{status:"unsupported",reason:"Codex adapter only supports NativeSoul heartbeat automations."}:t.desired.skill!==rd?{status:"error",code:"CODEX_HEARTBEAT_SKILL_MISMATCH",message:`Codex heartbeat Automation must invoke ${rd}.`}:o.native_id?{status:"ok",nativeId:o.native_id,message:t.apply?`Codex Automation reconciled: ${o.native_id}`:`Codex Automation reconcile planned: ${o.native_id}`}:{status:"degraded",reason:"Codex Automations support was detected, but no native automation id mapping was returned."}:{status:"unsupported",reason:"Codex Automations native interface was not detected; no cron fallback installed."}}async doctor(){let t=await this.detect(),r=j(Yo),o=await q(r),n=[];return t.detected||n.push({code:"CODEX_NOT_DETECTED",severity:"warn",message:"No Codex CLI or AGENTS.md instruction file was detected.",remediation:"Install Codex or create a managed block preview before enabling writes."}),o&&!Z(o,se)&&n.push({code:"CODEX_MANAGED_BLOCK_MISSING",severity:"info",message:"Codex global AGENTS.md exists but has no NativeSoul managed block.",remediation:"Review `nativesoul adapters managed-block --host codex --json`."}),n}async managedBlockPreview(){let t=j(Yo),r=await q(t);return{host:se,targetPath:t,startMarker:"<!-- nativesoul:codex:start v1 -->",endMarker:"<!-- nativesoul:codex:end -->",content:Oe(se),wouldCreate:r===null,wouldUpdate:r!==null&&!Z(r,se)}}};async function Fs(e,t){let[r,o,n,s]=await Promise.all([Qo(e,"mcpServerStatus/list"),Qo(e,"plugin/list"),Qo(e,"skills/list"),Qo(e,"app/list")]);if([r,o,n,s].some(l=>l===null))return{host:se,checkedAt:t,status:"degraded",warnings:["CODEX_APP_SERVER_UNAVAILABLE"],remediation:"Ensure Codex App Server is running and supports mcpServerStatus/list, plugin/list, skills/list, and app/list.",capabilities:[],diagnostics:[{code:"CODEX_APP_SERVER_UNAVAILABLE",severity:"warn",message:"Codex App Server did not return supported JSON inventory for all required methods.",remediation:"Check NATIVESOUL_CODEX_APP_SERVER_URL and Codex App Server version."}]};let i=[...pf(r),...mf(o),...gf(n),...ff(s)];return{host:se,checkedAt:t,status:"ready",warnings:[],capabilities:i.map(l=>({...l,installed:l.installed??!0,enabled:l.enabled??!0,active:l.active??!0,authenticated:l.authenticated??!1,healthy:l.healthy??!0,allowed:!0,ready:l.ready??!1}))}}async function Qo(e,t){try{return await e.call(t)}catch{return null}}async function uf(e,t){let r=new AbortController,o=setTimeout(()=>r.abort(),df);try{let n=await fetch(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:t,method:t,params:{}}),signal:r.signal});if(!n.ok)return null;let s=await n.json();return N(s)&&"error"in s?null:N(s)&&"result"in s?s.result:s}catch{return null}finally{clearTimeout(o)}}function pf(e){return Ze(e,["servers","mcpServers","items"]).flatMap(t=>{let r=I(t,["id","name","server","server_name"]);if(!r)return[];let o=I(t,["status","state"]),n=en(t,o);return[{uid:`codex:mcp:${M(r)}`,host:se,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`codex app server mcpServerStatus/list:${r}`,schemaHash:Zo,...n}]})}function mf(e){return Ze(e,["plugins","items"]).flatMap(t=>{let r=I(t,["id","plugin","package"])??I(t,["name"]);if(!r)return[];let o=I(t,["status","state"]),n=en(t,o);return[{uid:`codex:plugin:${Bs(r)}`,host:se,nativeKind:"plugin",normalizedKind:"extension",source:`codex app server plugin/list:${r}`,schemaHash:Zo,...n}]})}function gf(e){return Ze(e,["skills","items"]).flatMap(t=>{let r=I(t,["id","name","path"]);if(!r)return[];let o=I(t,["status","state"]),n=en(t,o);return[{uid:`codex:skill:${Bs(r)}`,host:se,nativeKind:"skill",normalizedKind:"skill",source:`codex app server skills/list:${r}`,schemaHash:Zo,...n}]})}function ff(e){return Ze(e,["apps","items"]).flatMap(t=>{let r=I(t,["id","name","app"]);if(!r)return[];let o=I(t,["status","state"]),n=en(t,o);return[{uid:`codex:app:${Bs(r)}`,host:se,nativeKind:"app_server_app",normalizedKind:"app",source:`codex app server app/list:${r}`,schemaHash:Zo,...n}]})}function en(e,t){let r=ne(e,["installed"])??!0,o=t==="disabled"||t==="unavailable",n=t==="error"||t==="unhealthy",s=ne(e,["enabled"])??!o,a=ne(e,["active"])??s,i=ne(e,["healthy"])??(!o&&!n),l=ne(e,["authenticated"])??ne(e,["auth"])??!1,c=ne(e,["ready"])??(r&&s&&a&&i);return{installed:r,enabled:s,active:a,authenticated:l,healthy:i,ready:c}}function hf(e){if(N(e)){let t=e.appServer;if(N(t)&&typeof t.call=="function")return{call:r=>Promise.resolve(t.call(r))}}return null}function yf(e){if(N(e)){let t=e.appServerUrl;if(typeof t=="string"&&t.trim().length>0)return t.trim()}return process.env.NATIVESOUL_CODEX_APP_SERVER_URL?.trim()||process.env.CODEX_APP_SERVER_URL?.trim()||null}function _f(e){return{async call(t){try{let{readFile:r}=await import("node:fs/promises"),o=t.replace(/\//gu,"-");return JSON.parse(await r(Us.join(e,`${o}.json`),"utf8"))}catch(r){let o=r instanceof Error?r.message:"unknown error";throw new Error(`Codex App Server fixture unavailable for ${t}: ${o}`,{cause:r})}}}}function bf(e){return{call:t=>uf(e,t)}}function Bs(e){return M(e,{allowSlash:!0})}function od(){return new Vs}bt();Ue();le();import{readdir as sd}from"node:fs/promises";import Re from"node:path";var ee="gemini",Js="~/.gemini/GEMINI.md",vf="~/.gemini/extensions",kf="~/.gemini/settings.json",xr="official:gemini-extension-config:v1",Ws="official:gemini-settings-config:v1",wf="official:gemini-memory-config:v1",qs=class{async detect(){let t=nd(),r=t.globalInstruction,o=t.extensionsDirectory,[n,s,a]=await Promise.all([P(r),B(o),qo("gemini",["--version"])]);return{host:ee,detected:n||s||a!==null,version:a??void 0,path:n?r:s?o:void 0,capabilities:{installed:n||s||a!==null,enabled:n||s,active:n,authenticated:!1,healthy:a!==null||n||s,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Gemini direct adapter writes are disabled; use the install orchestrator to install the NativeSoul Gemini extension, MCP registration, and managed block."}}async uninstall(t){return{status:"unsupported",reason:"Gemini direct adapter uninstall is disabled; use the uninstall orchestrator for reversible package removal."}}async coldScan(){let t=[],r=nd(),o=r.globalInstruction;await P(o)&&t.push({uid:"gemini:global-gemini-md",host:ee,nativeKind:"global_context",normalizedKind:"memory",source:o,schemaHash:wf}),await Rf(r.settingsFile,t);let n=r.extensionsDirectory;if(await B(n)){t.push({uid:"gemini:extensions",host:ee,nativeKind:"extensions",normalizedKind:"package",source:n,schemaHash:xr});let s=await sd(n,{withFileTypes:!0});for(let a of s)a.isDirectory()&&await Sf(Re.join(n,a.name),a.name,t)}return t}async hotProbe(){let t=await this.coldScan();return{host:ee,checkedAt:new Date().toISOString(),capabilities:t.map(r=>({...r,installed:!0,enabled:!0,active:r.nativeKind==="global_context"||r.schemaHash?.startsWith("official:")===!0,authenticated:!1,healthy:!0,allowed:!0,ready:r.schemaHash?.startsWith("official:")===!0}))}}async bootstrap(){return{tier:"A",mechanism:"hook",supported:!0}}async reload(t){return{status:"unsupported",reason:"Gemini extension reload is host-driven; run /memory refresh or restart Gemini after installing NativeSoul."}}async update(t){return{status:"unsupported",reason:"Gemini package updates are handled by the NativeSoul install orchestrator."}}async scheduleReconcile(t){return{status:"unsupported",reason:"Gemini does not expose a documented native scheduler for NativeSoul; use the packaged heartbeat command manually or host-supported commands, with no hidden cron."}}async doctor(){let t=await this.detect(),r=j(Js),o=await q(r),n=[];return t.detected||n.push({code:"GEMINI_NOT_DETECTED",severity:"warn",message:"No Gemini CLI, GEMINI.md, or extensions directory was detected.",remediation:"Install Gemini CLI or review `nativesoul adapters managed-block --host gemini --json`."}),o&&!Z(o,ee)&&n.push({code:"GEMINI_MANAGED_BLOCK_MISSING",severity:"info",message:"GEMINI.md exists but has no NativeSoul managed block.",remediation:"Review `nativesoul adapters managed-block --host gemini --json`."}),n}async managedBlockPreview(){let t=j(Js),r=await q(t);return{host:ee,targetPath:t,startMarker:"<!-- nativesoul:gemini:start v1 -->",endMarker:"<!-- nativesoul:gemini:end -->",content:Oe(ee),wouldCreate:r===null,wouldUpdate:r!==null&&!Z(r,ee)}}};function nd(){let e=process.env.NATIVESOUL_GEMINI_INVENTORY_ROOT?.trim();if(e){let t=Re.resolve(e);return{globalInstruction:Re.join(t,"GEMINI.md"),settingsFile:Re.join(t,"settings.json"),extensionsDirectory:Re.join(t,"extensions")}}return{globalInstruction:j(Js),settingsFile:j(kf),extensionsDirectory:j(vf)}}async function Rf(e,t){let r=await Y(e);if(r){t.push({uid:"gemini:settings",host:ee,nativeKind:"settings",normalizedKind:"config",source:e,schemaHash:Ws});for(let o of Qe(r.mcpServers))t.push({uid:`gemini:mcp:${M(o)}`,host:ee,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${e}:mcpServers.${o}`,schemaHash:Ws});for(let o of ad(r.tools))t.push({uid:`gemini:tool:${M(o)}`,host:ee,nativeKind:"tool",normalizedKind:"tool",source:`${e}:tools.${o}`,schemaHash:Ws})}}async function Sf(e,t,r){let o=Re.join(e,"gemini-extension.json"),n=await Y(o),s=I(n,["name","id"])??t;if(r.push({uid:`gemini:extension:${M(s)}`,host:ee,nativeKind:"extension",normalizedKind:"package",source:n?o:e,schemaHash:n?xr:void 0}),n){for(let a of Qe(n.mcpServers))r.push({uid:`gemini:mcp:${M(a)}`,host:ee,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:mcpServers.${a}`,schemaHash:xr});for(let a of ad(n.tools))r.push({uid:`gemini:tool:${M(a)}`,host:ee,nativeKind:"tool",normalizedKind:"tool",source:`${o}:tools.${a}`,schemaHash:xr})}await Af(Re.join(e,"commands"),r)}async function Af(e,t){if(!await B(e))return;let r=await sd(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||![".toml",".md"].includes(Re.extname(o.name)))continue;let n=Re.basename(o.name,Re.extname(o.name));t.push({uid:`gemini:command:${M(n,{allowSlash:!0})}`,host:ee,nativeKind:"command",normalizedKind:"command",source:Re.join(e,o.name),schemaHash:xr})}}function ad(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):Qe(e)}function id(){return new qs}bt();Ue();le();import{readdir as pd}from"node:fs/promises";import J from"node:path";var W="grok",tn="~/.grok/Agents.md",ld="AGENTS.md",cd="Agents.md",dd="CLAUDE.md",Ef="~/.grok",Ks="official:grok-plugin-config:v1",ud="official:grok-hooks-config:v1",Gs="official:grok-mcp-config:v1",md="official:grok-command-config:v1",Pf="official:grok-context-config:v1",xf=[{uid:"grok:plugins",nativeKind:"plugins",normalizedKind:"package",relativePath:"plugins"},{uid:"grok:skills",nativeKind:"skills",normalizedKind:"capability",relativePath:"skills"},{uid:"grok:hooks",nativeKind:"hooks",normalizedKind:"capability",relativePath:"hooks"},{uid:"grok:mcps",nativeKind:"mcp",normalizedKind:"capability",relativePath:"mcps"}],Xs=class{async detect(){let t=j(tn),r=J.resolve(ld),o=J.resolve(cd),n=J.resolve(dd),s=gd(),[a,i,l,c,d,p]=await Promise.all([P(t),P(r),P(o),P(n),B(s),$e("grok")]),g=i||l;return{host:W,detected:a||g||c||d||p!==null,path:a?t:l?o:i?r:c?n:p??void 0,capabilities:{installed:a||g||c||d||p!==null,enabled:a||g||c||d,active:g||c,authenticated:!1,healthy:p!==null||a||d,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Grok direct adapter writes are disabled; use the install orchestrator to install the NativeSoul native hook plugin, MCP registration, and managed block."}}async uninstall(t){return{status:"unsupported",reason:"Grok direct adapter uninstall is disabled; use the uninstall orchestrator for reversible package removal."}}async coldScan(){let t=[],r=jf(),o=r.globalInstruction;await P(o)&&t.push({uid:"grok:global-agents-md",host:W,nativeKind:"global_context",normalizedKind:"instruction",source:o,schemaHash:Pf});let n=J.resolve(ld);await P(n)&&t.push({uid:"grok:project-agents-md",host:W,nativeKind:"project_context",normalizedKind:"instruction",source:n});let s=J.resolve(cd);await P(s)&&t.push({uid:"grok:project-agents-titlecase-md",host:W,nativeKind:"project_context",normalizedKind:"instruction",source:s});let a=J.resolve(dd);await P(a)&&t.push({uid:"grok:project-claude-md",host:W,nativeKind:"project_context",normalizedKind:"instruction",source:a});let i=r.root;await fd(r.root,t),await If(i,t);for(let l of xf){let c=J.join(i,l.relativePath);await B(c)&&t.push({uid:l.uid,host:W,nativeKind:l.nativeKind,normalizedKind:l.normalizedKind,source:c,schemaHash:l.relativePath==="mcps"?Gs:Ks})}return Cf(t)}async hotProbe(){let t=await this.coldScan();return{host:W,checkedAt:new Date().toISOString(),capabilities:t.map(r=>({...r,installed:!0,enabled:!0,active:r.uid.includes("project"),authenticated:!1,healthy:!0,allowed:!0,ready:r.schemaHash?.startsWith("official:")===!0}))}}async bootstrap(){return{tier:"A",mechanism:"hook",supported:!0}}async reload(t){return{status:"unsupported",reason:"Grok reload is host-driven; use the installed NativeSoul command package or restart the host if needed."}}async update(t){return{status:"unsupported",reason:"Grok package updates are handled by the NativeSoul install orchestrator."}}async scheduleReconcile(t){return{status:"unsupported",reason:"Grok has no documented native scheduler or recurring task surface for NativeSoul; headless grok -p, cron, GitHub Actions, systemd, and Windows Task Scheduler are external schedulers and do not satisfy full-native capability."}}async doctor(){let t=await this.detect(),r=j(tn),o=await q(r),n=[];return t.detected||n.push({code:"GROK_NOT_DETECTED",severity:"warn",message:"No Grok CLI, ~/.grok directory, or project instruction file was detected.",remediation:"Install Grok Build or review `nativesoul adapters managed-block --host grok --json`."}),o&&!Z(o,W)&&n.push({code:"GROK_MANAGED_BLOCK_MISSING",severity:"info",message:"Grok global Agents.md exists but has no NativeSoul managed block.",remediation:"Review `nativesoul adapters managed-block --host grok --json`."}),n}async managedBlockPreview(){let t=j(tn),r=await q(t);return{host:W,targetPath:t,startMarker:"<!-- nativesoul:grok:start v1 -->",endMarker:"<!-- nativesoul:grok:end -->",content:Oe(W),wouldCreate:r===null,wouldUpdate:r!==null&&!Z(r,W)}}};function gd(){let e=process.env.NATIVESOUL_GROK_INVENTORY_ROOT?.trim();return e?J.resolve(e):j(Ef)}function jf(){let e=gd();return{root:e,globalInstruction:process.env.NATIVESOUL_GROK_INVENTORY_ROOT?.trim()?J.join(e,"Agents.md"):j(tn)}}async function fd(e,t){let r=J.join(e,"plugin.json"),o=J.join(e,"nativesoul-package.json"),n=J.join(e,"hooks","hooks.json"),s=J.join(e,".mcp.json"),[a,i,l,c]=await Promise.all([Y(r),Y(o),Y(n),Y(s)]);if(a){let d=I(a,["name","id"])??"unknown";t.push({uid:`grok:plugin:${M(d)}`,host:W,nativeKind:"plugin",normalizedKind:"extension",source:r,schemaHash:Ks})}if(i){let d=I(i,["name","id"])??"unknown";t.push({uid:`grok:package:${M(d)}`,host:W,nativeKind:"native_plugin_package",normalizedKind:"package",source:o,schemaHash:Ks});let p=N(i.nativeSoul)?i.nativeSoul:{};for(let k of Ko(p.commands))t.push({uid:`grok:command:${M(k)}`,host:W,nativeKind:"command",normalizedKind:"command",source:`${o}:nativeSoul.commands.${k}`,schemaHash:md});let g=N(p.mcpServer)?p.mcpServer:null,y=I(g,["name"]);y&&t.push({uid:`grok:mcp:${M(y)}`,host:W,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:nativeSoul.mcpServer.${y}`,schemaHash:Gs})}if(l){t.push({uid:"grok:hooks:manifest",host:W,nativeKind:"hooks",normalizedKind:"lifecycle_hooks",source:n,schemaHash:ud});let d=N(l.hooks)?l.hooks:{};for(let p of Object.keys(d))t.push({uid:`grok:hook:${M(p)}`,host:W,nativeKind:"hook",normalizedKind:"lifecycle_hook",source:`${n}:hooks.${p}`,schemaHash:ud})}if(c)for(let d of Qe(c.mcpServers))t.push({uid:`grok:mcp:${M(d)}`,host:W,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${s}:mcpServers.${d}`,schemaHash:Gs});await Tf(J.join(e,"commands"),t)}async function If(e,t){let r=J.join(e,"plugins");if(!await B(r))return;let o=await pd(r,{withFileTypes:!0});for(let n of o)n.isDirectory()&&await fd(J.join(r,n.name),t)}async function Tf(e,t){if(!await B(e))return;let r=await pd(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||J.extname(o.name)!==".md")continue;let n=J.basename(o.name,".md");t.push({uid:`grok:command:${M(n,{allowSlash:!0})}`,host:W,nativeKind:"command",normalizedKind:"command",source:J.join(e,o.name),schemaHash:md})}}function Cf(e){let t=new Set,r=[];for(let o of e)t.has(o.uid)||(t.add(o.uid),r.push(o));return r}function hd(){return new Xs}import{mkdir as rn,readFile as on,rm as Nf,writeFile as nn}from"node:fs/promises";import{existsSync as sn}from"node:fs";import jr from"node:path";function an(e){return{start:`<!-- nativesoul:${e}:start v1 -->`,end:`<!-- nativesoul:${e}:end -->`}}async function yd(e){let t=f(e.home),r=sn(e.targetPath),o=r?await on(e.targetPath,"utf8"):null,n=Mf(o,e.host,e.block),s=o===null?null:A(o),a=A(n),i=Lf(o,n,e.host),l=i!=="noop",c=!e.apply,d=l&&e.apply?await kd(t.home,e.host,e.targetPath,r,o,a):null;l&&e.apply&&(await rn(jr.dirname(e.targetPath),{recursive:!0,mode:448}),await nn(e.targetPath,n,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:e.targetPath,action:i,dryRun:c,changed:l,beforeHash:s,afterHash:a,diff:wd(o,n),backupPath:d,applied:l&&e.apply};return await h({home:t.home,type:e.apply?"managed_block_apply":"managed_block_dry_run",details:p}),p}async function _d(e){let t=f(e.home),r=sn(e.targetPath),o=r?await on(e.targetPath,"utf8"):null,n=Of(o,e.host),s=o===null?null:A(o),a=n===null?A(""):A(n),i=o!==n?"remove":"noop",l=i!=="noop",c=!e.apply,d=l&&e.apply?await kd(t.home,e.host,e.targetPath,r,o,a):null;l&&e.apply&&n!==null&&(await rn(jr.dirname(e.targetPath),{recursive:!0,mode:448}),await nn(e.targetPath,n,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:e.targetPath,action:i,dryRun:c,changed:l,beforeHash:s,afterHash:a,diff:wd(o,n),backupPath:d,applied:l&&e.apply};return await h({home:t.home,type:e.apply?"managed_block_uninstall":"managed_block_uninstall_dry_run",details:p}),p}async function bd(e){let t=sn(e.targetPath),r=[];if(!t)return r.push({code:"MANAGED_BLOCK_TARGET_MISSING",severity:"warn",message:`Managed block target is missing: ${e.targetPath}`,remediation:"Run nativesoul install --host <host> --apply"}),{host:e.host,targetPath:e.targetPath,target_exists:!1,configured:!1,markers_valid:!1,issues:r};let o=await on(e.targetPath,"utf8"),n=an(e.host),s=o.indexOf(n.start),a=o.indexOf(n.end),i=s>=0,l=a>=0,c=i&&l&&a>s;return!i&&!l?r.push({code:"MANAGED_BLOCK_MISSING",severity:"warn",message:"NativeSoul managed block is not configured.",remediation:"Run nativesoul install --host <host> --apply"}):c||r.push({code:"MANAGED_BLOCK_MARKERS_INVALID",severity:"error",message:"NativeSoul managed block markers are incomplete or out of order.",remediation:"Fix the managed block markers or restore from a backup snapshot"}),{host:e.host,targetPath:e.targetPath,target_exists:!0,configured:c,markers_valid:c,issues:r}}async function vd(e){let t=f(e.home),r=JSON.parse(await on(e.snapshotPath,"utf8")),o=!e.apply;e.apply&&(r.beforeExists&&r.beforeContent!==null?(await rn(jr.dirname(r.targetPath),{recursive:!0,mode:448}),await nn(r.targetPath,r.beforeContent,{encoding:"utf8",mode:384})):sn(r.targetPath)&&await Nf(r.targetPath));let n={snapshotPath:e.snapshotPath,targetPath:r.targetPath,dryRun:o,applied:e.apply,restoredExists:r.beforeExists,restoredHash:r.beforeHash};return await h({home:t.home,type:e.apply?"managed_block_rollback":"managed_block_rollback_dry_run",details:n}),n}function Of(e,t){if(e===null)return null;let{start:r,end:o}=an(t),n=e.indexOf(r),s=e.indexOf(o);if(n<0||s<=n)return e;let a=s+o.length,i=e.slice(0,n),l=e.slice(a);return i.endsWith(`
761
824
 
762
825
  `)&&l.startsWith(`
763
826
  `)?l=l.replace(/^\n/u,""):!i.endsWith(`
@@ -765,67 +828,73 @@ _Running context for today. Promote durable facts to curated memory later._
765
828
  `)&&(l=l.slice(1)),i.length>0&&l.length>0&&!i.endsWith(`
766
829
  `)&&!l.startsWith(`
767
830
  `)&&(i=`${i}
768
- `),`${i}${l}`}function hg(e,t,r){let o=r.endsWith(`
831
+ `),`${i}${l}`}function Mf(e,t,r){let o=r.endsWith(`
769
832
  `)?r:`${r}
770
- `;if(e===null||e.length===0)return o;let{start:a,end:n}=Go(t),s=e.indexOf(a),i=e.indexOf(n);if(s>=0&&i>s){let c=i+n.length,d=e.slice(c).replace(/^\n/u,"");return`${e.slice(0,s)}${o}${d}`}let l=e.endsWith(`
833
+ `;if(e===null||e.length===0)return o;let{start:n,end:s}=an(t),a=e.indexOf(n),i=e.indexOf(s);if(a>=0&&i>a){let c=i+s.length,d=e.slice(c).replace(/^\n/u,"");return`${e.slice(0,a)}${o}${d}`}let l=e.endsWith(`
771
834
  `)?`
772
835
  `:`
773
836
 
774
- `;return`${e}${l}${o}`}function yg(e,t,r){if(e===t)return"noop";if(e===null||e.length===0)return"create";let{start:o,end:a}=Go(r);return e.includes(o)&&e.includes(a)?"replace":"append"}async function Pc(e,t,r,o,a,n){let s=br.join(e,"backups","managed-block");await Bo(s,{recursive:!0,mode:448});let i=new Date().toISOString(),l={id:O("snapshot"),host:t,targetPath:r,beforeExists:o,beforeContent:a,beforeHash:a===null?null:S(a),afterHash:n,createdAt:i},c=`${i.replace(/[:.]/g,"-")}-${t}.json`,d=br.join(s,c);return await qo(d,JSON.stringify(l,null,2),{encoding:"utf8",mode:384}),d}function Ec(e,t){return e===t?"No changes.":[`before: ${e===null?"missing":S(e)}`,`after: ${t===null?"missing":S(t)}`,`lines_before: ${e===null?0:e.split(/\r?\n/u).length}`,`lines_after: ${t===null?0:t.split(/\r?\n/u).length}`].join(`
775
- `)}var _g=["codex","claude","grok","antigravity","gemini"],vg={codex:lc,claude:rc,grok:wc,antigravity:El,gemini:pc};function De(e){return e==="all"?_g:[e]}function Wo(e){return De(e)}function ht(e){return vg[e]()}async function wr(e){let t=[];for(let r of Wo(e)){let o=ht(r),[a,n]=await Promise.all([o.detect(),o.coldScan({})]);t.push({host:r,detected:a.detected,version:a.version,sources:n})}return t}async function Rr(e){let t=[];for(let r of Wo(e)){let o=ht(r);t.push({host:r,diagnostics:await o.doctor({})})}return t}async function kr(e){return ht(e).managedBlockPreview()}async function Sr(e){let t=await kr(e.host);return Rc({home:e.home,host:e.host,targetPath:e.targetPath??t.targetPath,block:t.content,apply:e.apply})}async function _n(e){return Ac(e)}async function vn(e){let t=await kr(e.host);return kc({home:e.home,host:e.host,targetPath:e.targetPath??t.targetPath,apply:e.apply})}async function yt(e){let t=await b(e.home),r=new Date().toISOString(),o=[],a=e.ttlSeconds??await Sg(t.home);for(let n of Wo(e.host)){if(e.delta){let p=(await be({home:t.home,host:n,includeShared:!1,limit:1}))[0]?.last_seen_at;if(p&&Date.now()-Date.parse(p)<=a*1e3){let h={host:n,status:"ready",count:0,records:[],skipped:!0,warnings:[],diagnostics:[]};await f({home:t.home,type:"capabilities_refreshed",details:{host:n,count:0,status:"ready",warnings:[],delta:!0,skipped:!0}}),o.push(h);continue}}let i=await ht(n).hotProbe({}),l=i.capabilities.map(d=>Pg({uid:d.uid,host:d.host,native_kind:d.nativeKind,normalized_kind:d.normalizedKind,source:d.source,schema_hash:d.schemaHash??null,installed:d.installed,enabled:d.enabled,active:d.active,authenticated:d.authenticated,healthy:d.healthy,allowed:d.allowed,ready:d.ready,last_seen_at:r})),c=v(t.database);try{c.upsertCapabilities(l)}finally{c.close()}await f({home:t.home,type:"capabilities_refreshed",details:{host:n,count:l.length,status:i.status??((i.diagnostics?.length??0)>0?"degraded":"ready"),warnings:i.warnings??[],delta:e.delta===!0,skipped:!1}}),o.push({host:n,status:i.status??((i.diagnostics?.length??0)>0?"degraded":"ready"),count:l.length,records:l,skipped:!1,warnings:i.warnings??[],remediation:i.remediation,diagnostics:i.diagnostics??[]})}return o}async function Sg(e){let t;try{t=await bn(Pr.join(e,"config.yaml"),"utf8")}catch{return 3600}let r=t.match(/^\s*(?:capability_refresh_ttl_seconds|refresh_ttl_seconds):\s*(\d+)\s*$/mu),o=r?.[1]?Number(r[1]):3600;return Number.isFinite(o)?Math.min(Math.max(o,0),86400):3600}async function be(e){let t=e.readOnly?g(e.home):await b(e.home);if(e.readOnly&&!await k(t.database))return[];let r=v(t.database,{readOnly:e.readOnly}),o=Cc(e.limit);try{return r.listCapabilities({host:e.host,readyOnly:e.readyOnly,limit:o,includeShared:e.includeShared})}finally{r.close()}}async function Er(e){let t=await b(e.home),r=v(t.database),o=Cc(e.limit);try{return r.searchCapabilities({query:e.query,host:e.host,readyOnly:e.readyOnly,limit:o,includeShared:e.includeShared})}finally{r.close()}}async function xr(e){let t=await b(e.home),r=v(t.database);try{return r.getCapability(e.uid)}finally{r.close()}}async function wn(e){let t=e.readOnly?g(e.home):await b(e.home),r=Pr.join(t.home,"capabilities","cards"),o=[];if(!await k(r))return{cards:[],warnings:o};let a=(await wg(r)).filter(c=>c.endsWith(".json")).sort(),n=Ng(e.query??""),s=[];for(let c of a){let d=Pr.join(r,c),p;try{p=await bn(d,"utf8")}catch{o.push(`CAPABILITY_CARD_UNREADABLE:${c}`);continue}let h=jg(p);if(!h){o.push(`CAPABILITY_CARD_MALFORMED:${c}`);continue}let y=Tg(h,e.host);s.push({card:y,score:Cg(h,e.host,n)})}let i=Hg(e.limit),l=s.sort((c,d)=>d.score-c.score||c.card.uid.localeCompare(d.card.uid));return{cards:Ag(l,i).map(c=>c.card),warnings:o}}function Ag(e,t){let r=e.slice(0,t);if(t<=1||r.some(a=>a.card.alternative_host))return r;let o=e.find(a=>a.card.alternative_host);return o?[...r.slice(0,t-1),o].sort((a,n)=>n.score-a.score||a.card.uid.localeCompare(n.card.uid)):r}async function Rn(e){let t=await b(e.home),r=await Eg({home:t.home,host:e.host,limit:e.limit}),o=Pr.join(t.home,"capabilities","cards");await bg(o,{recursive:!0,mode:448});let a=[];for(let s of r){let i=xg(s),l=`${JSON.stringify(i,null,2)}
776
- `,c=Pr.join(o,`${Lg(s.uid)}.json`),d=kg(c)?await bn(c,"utf8"):null,p=d===l?"unchanged":d===null?"created":"updated";p!=="unchanged"&&await Rg(c,l,{encoding:"utf8",mode:384}),a.push({uid:s.uid,host:s.host,path:c,action:p,hash:S(l),card:i})}let n={home:t.home,host:e.host,generated:a.length,changed:a.filter(s=>s.action!=="unchanged").length,cards:a,warnings:a.length===0?["NO_CAPABILITY_RECORDS_TO_LEARN"]:[]};return await f({home:t.home,type:"capability_cards_learned",details:{host:e.host,generated:n.generated,changed:n.changed,warnings:n.warnings}}),n}function Pg(e){return{...e,uid:M(e.uid).value,host:M(e.host).value,native_kind:M(e.native_kind).value,normalized_kind:M(e.normalized_kind).value,source:M(e.source).value,schema_hash:e.schema_hash?M(e.schema_hash).value:null}}async function Eg(e){return e.host==="all"?be({home:e.home,limit:e.limit}):be({home:e.home,host:e.host,limit:e.limit})}function xg(e){let t=e.schema_hash??ye({uid:e.uid,host:e.host,native_kind:e.native_kind,normalized_kind:e.normalized_kind,source:e.source,readiness:xc(e)}),r={card_version:1,id:`capcard:${e.uid}`,uid:e.uid,host:e.host,native_kind:e.native_kind,normalized_kind:e.normalized_kind,readiness:xc(e),source:e.source,schema_hash:t,use_when:[`Use when a task needs ${e.normalized_kind} capability metadata on ${e.host}.`,`Check this card before claiming ${e.uid} is available or ready.`],requires:Og(e),side_effects:["Reading this card has no side effects.","Executing the native capability may have host-specific side effects and must follow policy."],approval:Mg(e),examples:[`Inspect ${e.uid} readiness before using it.`,`Prefer a ready capability on ${e.host}; otherwise report degraded status.`]};return W(r)}function jg(e){let t;try{t=JSON.parse(e)}catch{return null}if(!jc(t))return null;let r=t.readiness;return t.card_version!==1||typeof t.id!="string"||typeof t.uid!="string"||typeof t.host!="string"||typeof t.native_kind!="string"||typeof t.normalized_kind!="string"||typeof t.source!="string"||typeof t.schema_hash!="string"||!Array.isArray(t.use_when)||!Array.isArray(t.requires)||!Array.isArray(t.side_effects)||typeof t.approval!="string"||!Array.isArray(t.examples)||!Ig(r)?null:t}function Tg(e,t){let r=e.host!==t,o=e.host!==t&&e.host!=="all";return{id:e.id,uid:e.uid,host:e.host,ready:e.readiness.ready,source:e.source,schema_hash:e.schema_hash,use_when:Ar(e.use_when).slice(0,2),requires:Ar(e.requires).slice(0,4),approval:e.approval,alternative_host:r,available_on_other_host:o}}function Cg(e,t,r){let o=Tc([e.uid,e.host,e.native_kind,e.normalized_kind,e.source,e.schema_hash,...Ar(e.use_when),...Ar(e.requires),e.approval,...Ar(e.examples)].join(" ")),a=r.reduce((n,s)=>n+(o.includes(s)?10:0),0);return(e.host===t?100:0)+(e.readiness.ready?5:0)+a}function Ar(e){return e.filter(t=>typeof t=="string")}function jc(e){return typeof e=="object"&&e!==null}function Ig(e){return jc(e)?["installed","enabled","active","authenticated","healthy","allowed","ready"].every(t=>typeof e[t]=="boolean"):!1}function Ng(e){return Tc(e).split(/\s+/u).map(t=>t.trim()).filter(t=>t.length>=2)}function Tc(e){return e.toLowerCase().normalize("NFKD").replace(/[\u0300-\u036f]/gu,"")}function xc(e){return{installed:e.installed,enabled:e.enabled,active:e.active,authenticated:e.authenticated,healthy:e.healthy,allowed:e.allowed,ready:e.ready}}function Og(e){let t=[["installed",e.installed],["enabled",e.enabled],["active",e.active],["authenticated",e.authenticated],["healthy",e.healthy],["allowed",e.allowed],["ready",e.ready]].filter(([,r])=>r===!1).map(([r])=>`${r} must be true`);return t.length>0?t:["No missing readiness prerequisites are known."]}function Mg(e){return e.allowed?e.normalized_kind.includes("connector")||e.normalized_kind.includes("mcp")?"approval_required_for_external_write":"allowed_for_read_or_local_use_when_ready":"denied_by_policy"}function Lg(e){return`${e.replace(/[^A-Za-z0-9._-]+/gu,"_").replace(/^_+|_+$/gu,"")||"capability"}-${S(e).slice(7,19)}`}function Cc(e){return Math.min(Math.max(e??50,1),100)}function Hg(e){return Math.min(Math.max(e??5,1),8)}async function jr(e){let t=await b(e.home),r=M(e.summary).value,o=new Date,a=e.ttlSeconds?new Date(o.getTime()+Dg(e.ttlSeconds)*1e3).toISOString():null,n=W(e.source??{host:"cli",session_id:"local"}),s=v(t.database),i;try{i=s.createOpenCommitmentIfMissing({id:O("commitment"),project_id:e.project,summary:r,status:"open",due_at:e.dueAt??null,ttl_expires_at:a,source:n,created_at:o.toISOString(),updated_at:o.toISOString()},o.toISOString())}finally{s.close()}return await f({home:t.home,type:i.created?"commitment_created":"commitment_deduped",details:{id:i.commitment.id,project:i.commitment.project_id,redacted:r!==e.summary,created:i.created}}),i}async function Tr(e){let t=e.readOnly?g(e.home):await b(e.home);if(e.readOnly&&!await k(t.database))return[];let r=v(t.database,{readOnly:e.readOnly}),o;try{o=r.listCommitments({project:e.project,status:e.status??(e.includeExpired?void 0:"open"),includeExpired:e.includeExpired,limit:Math.min(Math.max(e.limit??50,1),200),now:new Date().toISOString(),skipExpire:e.readOnly})}finally{r.close()}return e.readOnly||await f({home:t.home,type:"commitments_listed",details:{project:e.project??null,status:e.status??null,includeExpired:e.includeExpired===!0,count:o.length}}),o}async function Cr(e,t){return Ic(e,t,"completed","commitment_completed")}async function kn(e,t){return Ic(e,t,"dismissed","commitment_dismissed")}async function Ic(e,t,r,o){let a=await b(e),n=v(a.database),s;try{s=n.updateCommitmentStatus(t,r,new Date().toISOString())}finally{n.close()}if(!s)throw new Error(`Commitment not found: ${t}`);return await f({home:a.home,type:o,details:{id:s.id,project:s.project_id,status:s.status}}),s}function Dg(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e),1),365*24*60*60):1440*60}import{createHash as $g}from"node:crypto";import{existsSync as zo,mkdirSync as Fg,realpathSync as Ug,readFileSync as Oc,writeFileSync as Vg}from"node:fs";import{spawnSync as Mc}from"node:child_process";import ue from"node:path";function D(e,t){return ne(e,t).id}function ne(e,t){let r=Pn(e),o=Kg(r),a=o?Gg(o):null,n=a?Nc(a):o??r,s=Wg(n),i=a?"git-remote":o?"git-root":"path",l=Jg(s,n),c=Bg(r),d=c?Lc(c):null,p=En(t),h=[d,l,a?Nc(a):null,o,r].find(y=>y&&p[y]);if(h){let y=d??l;return{id:p[h]??y,source:"alias",cwd:r,git_root:o,remote:a,base_id:y,alias_key:h,marker_path:c}}return d?{id:d,source:"marker",cwd:r,git_root:o,remote:a,base_id:d,alias_key:null,marker_path:c}:{id:l,source:i,cwd:r,git_root:o,remote:a,base_id:l,alias_key:null,marker_path:null}}function Lc(e){if(!zo(e))return null;let t=Oc(e,"utf8").trim();if(t.length===0)return null;let r=t.match(/^(?:project_id|id):\s*([a-z0-9._-]+)\s*$/imu);if(r?.[1])return r[1];let o=t.split(/\r?\n/u).map(a=>a.trim()).find(a=>a.length>0&&!a.startsWith("#"));return o?qg(o):null}function Sn(e,t){let r=ue.join(e,".nativesoul","project");return Fg(ue.dirname(r),{recursive:!0,mode:448}),Vg(r,`${t}
777
- `,{encoding:"utf8",mode:384}),r}async function Ir(e){let t=ne(e.cwd,e.home);if(t.source!=="git-root"&&t.source!=="path")return{written:!1,marker_path:t.marker_path,base_id:t.base_id};let r=t.git_root??t.cwd,o=ue.join(r,".nativesoul","project");return zo(o)?{written:!1,marker_path:o,base_id:t.base_id}:(Sn(r,t.base_id),{written:!0,marker_path:o,base_id:t.base_id})}async function An(e){let t=ue.resolve(e.cwd),r=ne(t,e.home),o=r.git_root??r.cwd,a=ue.join(o,".nativesoul","project");return e.apply&&(Sn(o,r.base_id),await f({home:g(e.home).home,type:"project_pinned",details:{id:r.base_id,basis_source:r.source,marker_path:a}})),{cwd:t,base_id:r.base_id,marker_path:a,applied:e.apply===!0,resolution:r}}function Bg(e){let t=Pn(e);for(;;){let r=ue.join(t,".nativesoul","project");if(zo(r))return r;let o=ue.dirname(t);if(o===t)return null;t=o}}function Jg(e,t){let r=$g("sha256").update(t).digest("hex").slice(0,10);return`${zg(e)}-${r}`}function qg(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"")||"workspace"}function Pn(e){try{return Ug(ue.resolve(e))}catch{return ue.resolve(e)}}function Kg(e){let t=Mc("git",["-C",e,"rev-parse","--show-toplevel"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(t.status!==0)return null;let r=t.stdout.trim();return r.length>0?Pn(r):null}function Gg(e){let t=Mc("git",["-C",e,"remote","get-url","origin"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(t.status!==0)return null;let r=t.stdout.trim();return r.length>0?r:null}function Nc(e){return e.trim().replace(/^git@([^:]+):/,"https://$1/").replace(/^ssh:\/\/git@([^/]+)\//,"https://$1/").replace(/^https?:\/\/([^/]+)\//,"https://$1/").replace(/\.git$/u,"").toLowerCase()}function Wg(e){let t=e.replace(/\/+$/u,"");return ue.basename(t)||"workspace"}function zg(e){return e.toLowerCase().replace(/[^a-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"")||"workspace"}function En(e){if(!e)return{};let t=ue.join(ue.resolve(e),"config.yaml");if(!zo(t))return{};let r=Oc(t,"utf8"),o={},a=!1,n=!1,s="";for(let i of r.split(/\r?\n/u)){if(/^\S/u.test(i)){a=/^project:\s*$/u.test(i),n=!1;continue}let l=i.match(/^([ \t]+)aliases:\s*(?:\{\}\s*)?$/u);if(a&&l?.[1]){n=!0,s=l[1];continue}if(n){if(i.trim().length===0||i.trim().startsWith("#"))continue;let c=i.match(/^([ \t]+)(?:"([^"]+)"|'([^']+)'|([^:]+)):\s*(?:"([^"]+)"|'([^']+)'|(.+))\s*$/u);(c?.[1]??"").length<=s.length&&(n=!1);let p=c?.[2]??c?.[3]??c?.[4],h=c?.[5]??c?.[6]??c?.[7];n&&p&&h?o[p.trim()]=h.trim():/^[ \t]+\S/u.test(i)&&i.trim().length>0&&(n=!1)}}return o}import{readFile as Xg,writeFile as Yg}from"node:fs/promises";import Qg from"node:path";async function xn(e){let t=g(e.home),r=Qg.join(t.home,"config.yaml"),o=await k(r)?await Xg(r,"utf8"):`version: 1
778
- `,a=o.includes(`\r
837
+ `;return`${e}${l}${o}`}function Lf(e,t,r){if(e===t)return"noop";if(e===null||e.length===0)return"create";let{start:o,end:n}=an(r);return e.includes(o)&&e.includes(n)?"replace":"append"}async function kd(e,t,r,o,n,s){let a=jr.join(e,"backups","managed-block");await rn(a,{recursive:!0,mode:448});let i=new Date().toISOString(),l={id:T("snapshot"),host:t,targetPath:r,beforeExists:o,beforeContent:n,beforeHash:n===null?null:A(n),afterHash:s,createdAt:i},c=`${i.replace(/[:.]/g,"-")}-${t}.json`,d=jr.join(a,c);return await nn(d,JSON.stringify(l,null,2),{encoding:"utf8",mode:384}),d}function wd(e,t){return e===t?"No changes.":[`before: ${e===null?"missing":A(e)}`,`after: ${t===null?"missing":A(t)}`,`lines_before: ${e===null?0:e.split(/\r?\n/u).length}`,`lines_after: ${t===null?0:t.split(/\r?\n/u).length}`].join(`
838
+ `)}var Df=["codex","claude","grok","antigravity","gemini"],Hf={codex:od,claude:Yc,grok:hd,antigravity:wc,gemini:id};function Ve(e){return e==="all"?Df:[e]}function ln(e){return Ve(e)}function vt(e){return Hf[e]()}async function Ir(e){let t=[];for(let r of ln(e)){let o=vt(r),[n,s]=await Promise.all([o.detect(),o.coldScan({})]);t.push({host:r,detected:n.detected,version:n.version,sources:s})}return t}async function Tr(e){let t=[];for(let r of ln(e)){let o=vt(r);t.push({host:r,diagnostics:await o.doctor({})})}return t}async function Cr(e){return vt(e).managedBlockPreview()}async function Nr(e){let t=await Cr(e.host);return yd({home:e.home,host:e.host,targetPath:e.targetPath??t.targetPath,block:t.content,apply:e.apply})}async function zs(e){return vd(e)}async function Ys(e){let t=await Cr(e.host);return _d({home:e.home,host:e.host,targetPath:e.targetPath??t.targetPath,apply:e.apply})}async function kt(e){let t=await v(e.home),r=new Date().toISOString(),o=[],n=e.ttlSeconds??await Bf(t.home);for(let s of ln(e.host)){if(e.delta){let p=(await Se({home:t.home,host:s,includeShared:!1,limit:1}))[0]?.last_seen_at;if(p&&Date.now()-Date.parse(p)<=n*1e3){let g={host:s,status:"ready",count:0,records:[],skipped:!0,warnings:[],diagnostics:[]};await h({home:t.home,type:"capabilities_refreshed",details:{host:s,count:0,status:"ready",warnings:[],delta:!0,skipped:!0}}),o.push(g);continue}}let i=await vt(s).hotProbe({}),l=i.capabilities.map(d=>Jf({uid:d.uid,host:d.host,native_kind:d.nativeKind,normalized_kind:d.normalizedKind,source:d.source,schema_hash:d.schemaHash??null,installed:d.installed,enabled:d.enabled,active:d.active,authenticated:d.authenticated,healthy:d.healthy,allowed:d.allowed,ready:d.ready,last_seen_at:r})),c=_(t.database);try{c.upsertCapabilities(l)}finally{c.close()}await h({home:t.home,type:"capabilities_refreshed",details:{host:s,count:l.length,status:i.status??((i.diagnostics?.length??0)>0?"degraded":"ready"),warnings:i.warnings??[],delta:e.delta===!0,skipped:!1}}),o.push({host:s,status:i.status??((i.diagnostics?.length??0)>0?"degraded":"ready"),count:l.length,records:l,skipped:!1,warnings:i.warnings??[],remediation:i.remediation,diagnostics:i.diagnostics??[]})}return o}async function Bf(e){let t;try{t=await Qs(Mr.join(e,"config.yaml"),"utf8")}catch{return 3600}let r=t.match(/^\s*(?:capability_refresh_ttl_seconds|refresh_ttl_seconds):\s*(\d+)\s*$/mu),o=r?.[1]?Number(r[1]):3600;return Number.isFinite(o)?Math.min(Math.max(o,0),86400):3600}async function Se(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await R(t.database))return[];let r=_(t.database,{readOnly:e.readOnly}),o=Ed(e.limit);try{return r.listCapabilities({host:e.host,readyOnly:e.readyOnly,limit:o,includeShared:e.includeShared})}finally{r.close()}}async function Lr(e){let t=await v(e.home),r=_(t.database),o=Ed(e.limit);try{return r.searchCapabilities({query:e.query,host:e.host,readyOnly:e.readyOnly,limit:o,includeShared:e.includeShared})}finally{r.close()}}async function Dr(e){let t=await v(e.home),r=_(t.database);try{return r.getCapability(e.uid)}finally{r.close()}}async function Zs(e){let t=e.readOnly?f(e.home):await v(e.home),r=Mr.join(t.home,"capabilities","cards"),o=[];if(!await R(r))return{cards:[],warnings:o};let n=(await Ff(r)).filter(c=>c.endsWith(".json")).sort(),s=Qf(e.query??""),a=[];for(let c of n){let d=Mr.join(r,c),p;try{p=await Qs(d,"utf8")}catch{o.push(`CAPABILITY_CARD_UNREADABLE:${c}`);continue}let g=Gf(p);if(!g){o.push(`CAPABILITY_CARD_MALFORMED:${c}`);continue}let y=Xf(g,e.host);a.push({card:y,score:zf(g,e.host,s)})}let i=rh(e.limit),l=a.sort((c,d)=>d.score-c.score||c.card.uid.localeCompare(d.card.uid));return{cards:Wf(l,i).map(c=>c.card),warnings:o}}function Wf(e,t){let r=e.slice(0,t);if(t<=1||r.some(n=>n.card.alternative_host))return r;let o=e.find(n=>n.card.alternative_host);return o?[...r.slice(0,t-1),o].sort((n,s)=>s.score-n.score||n.card.uid.localeCompare(s.card.uid)):r}async function ea(e){let t=await v(e.home),r=await qf({home:t.home,host:e.host,limit:e.limit}),o=Mr.join(t.home,"capabilities","cards");await $f(o,{recursive:!0,mode:448});let n=[];for(let a of r){let i=Kf(a),l=`${JSON.stringify(i,null,2)}
839
+ `,c=Mr.join(o,`${th(a.uid)}.json`),d=Vf(c)?await Qs(c,"utf8"):null,p=d===l?"unchanged":d===null?"created":"updated";p!=="unchanged"&&await Uf(c,l,{encoding:"utf8",mode:384}),n.push({uid:a.uid,host:a.host,path:c,action:p,hash:A(l),card:i})}let s={home:t.home,host:e.host,generated:n.length,changed:n.filter(a=>a.action!=="unchanged").length,cards:n,warnings:n.length===0?["NO_CAPABILITY_RECORDS_TO_LEARN"]:[]};return await h({home:t.home,type:"capability_cards_learned",details:{host:e.host,generated:s.generated,changed:s.changed,warnings:s.warnings}}),s}function Jf(e){return{...e,uid:O(e.uid).value,host:O(e.host).value,native_kind:O(e.native_kind).value,normalized_kind:O(e.normalized_kind).value,source:O(e.source).value,schema_hash:e.schema_hash?O(e.schema_hash).value:null}}async function qf(e){return e.host==="all"?Se({home:e.home,limit:e.limit}):Se({home:e.home,host:e.host,limit:e.limit})}function Kf(e){let t=e.schema_hash??ke({uid:e.uid,host:e.host,native_kind:e.native_kind,normalized_kind:e.normalized_kind,source:e.source,readiness:Rd(e)}),r={card_version:1,id:`capcard:${e.uid}`,uid:e.uid,host:e.host,native_kind:e.native_kind,normalized_kind:e.normalized_kind,readiness:Rd(e),source:e.source,schema_hash:t,use_when:[`Use when a task needs ${e.normalized_kind} capability metadata on ${e.host}.`,`Check this card before claiming ${e.uid} is available or ready.`],requires:Zf(e),side_effects:["Reading this card has no side effects.","Executing the native capability may have host-specific side effects and must follow policy."],approval:eh(e),examples:[`Inspect ${e.uid} readiness before using it.`,`Prefer a ready capability on ${e.host}; otherwise report degraded status.`]};return H(r)}function Gf(e){let t;try{t=JSON.parse(e)}catch{return null}if(!Sd(t))return null;let r=t.readiness;return t.card_version!==1||typeof t.id!="string"||typeof t.uid!="string"||typeof t.host!="string"||typeof t.native_kind!="string"||typeof t.normalized_kind!="string"||typeof t.source!="string"||typeof t.schema_hash!="string"||!Array.isArray(t.use_when)||!Array.isArray(t.requires)||!Array.isArray(t.side_effects)||typeof t.approval!="string"||!Array.isArray(t.examples)||!Yf(r)?null:t}function Xf(e,t){let r=e.host!==t,o=e.host!==t&&e.host!=="all";return{id:e.id,uid:e.uid,host:e.host,ready:e.readiness.ready,source:e.source,schema_hash:e.schema_hash,use_when:Or(e.use_when).slice(0,2),requires:Or(e.requires).slice(0,4),approval:e.approval,alternative_host:r,available_on_other_host:o}}function zf(e,t,r){let o=Ad([e.uid,e.host,e.native_kind,e.normalized_kind,e.source,e.schema_hash,...Or(e.use_when),...Or(e.requires),e.approval,...Or(e.examples)].join(" ")),n=r.reduce((s,a)=>s+(o.includes(a)?10:0),0);return(e.host===t?100:0)+(e.readiness.ready?5:0)+n}function Or(e){return e.filter(t=>typeof t=="string")}function Sd(e){return typeof e=="object"&&e!==null}function Yf(e){return Sd(e)?["installed","enabled","active","authenticated","healthy","allowed","ready"].every(t=>typeof e[t]=="boolean"):!1}function Qf(e){return Ad(e).split(/\s+/u).map(t=>t.trim()).filter(t=>t.length>=2)}function Ad(e){return e.toLowerCase().normalize("NFKD").replace(/[\u0300-\u036f]/gu,"")}function Rd(e){return{installed:e.installed,enabled:e.enabled,active:e.active,authenticated:e.authenticated,healthy:e.healthy,allowed:e.allowed,ready:e.ready}}function Zf(e){let t=[["installed",e.installed],["enabled",e.enabled],["active",e.active],["authenticated",e.authenticated],["healthy",e.healthy],["allowed",e.allowed],["ready",e.ready]].filter(([,r])=>r===!1).map(([r])=>`${r} must be true`);return t.length>0?t:["No missing readiness prerequisites are known."]}function eh(e){return e.allowed?e.normalized_kind.includes("connector")||e.normalized_kind.includes("mcp")?"approval_required_for_external_write":"allowed_for_read_or_local_use_when_ready":"denied_by_policy"}function th(e){return`${e.replace(/[^A-Za-z0-9._-]+/gu,"_").replace(/^_+|_+$/gu,"")||"capability"}-${A(e).slice(7,19)}`}function Ed(e){return Math.min(Math.max(e??50,1),100)}function rh(e){return Math.min(Math.max(e??5,1),8)}async function Hr(e){let t=await v(e.home),r=O(e.summary).value,o=new Date,n=e.ttlSeconds?new Date(o.getTime()+oh(e.ttlSeconds)*1e3).toISOString():null,s=H(e.source??{host:"cli",session_id:"local"}),a=_(t.database),i;try{i=a.createOpenCommitmentIfMissing({id:T("commitment"),project_id:e.project,summary:r,status:"open",due_at:e.dueAt??null,ttl_expires_at:n,source:s,created_at:o.toISOString(),updated_at:o.toISOString()},o.toISOString())}finally{a.close()}return await h({home:t.home,type:i.created?"commitment_created":"commitment_deduped",details:{id:i.commitment.id,project:i.commitment.project_id,redacted:r!==e.summary,created:i.created}}),i}async function $r(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await R(t.database))return[];let r=_(t.database,{readOnly:e.readOnly}),o;try{o=r.listCommitments({project:e.project,status:e.status??(e.includeExpired?void 0:"open"),includeExpired:e.includeExpired,limit:Math.min(Math.max(e.limit??50,1),200),now:new Date().toISOString(),skipExpire:e.readOnly})}finally{r.close()}return e.readOnly||await h({home:t.home,type:"commitments_listed",details:{project:e.project??null,status:e.status??null,includeExpired:e.includeExpired===!0,count:o.length}}),o}async function Fr(e,t){return Pd(e,t,"completed","commitment_completed")}async function ta(e,t){return Pd(e,t,"dismissed","commitment_dismissed")}async function Pd(e,t,r,o){let n=await v(e),s=_(n.database),a;try{a=s.updateCommitmentStatus(t,r,new Date().toISOString())}finally{s.close()}if(!a)throw new Error(`Commitment not found: ${t}`);return await h({home:n.home,type:o,details:{id:a.id,project:a.project_id,status:a.status}}),a}function oh(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e),1),365*24*60*60):1440*60}import{createHash as nh}from"node:crypto";import{existsSync as cn,mkdirSync as sh,realpathSync as ah,readFileSync as jd,writeFileSync as ih}from"node:fs";import{spawnSync as Id}from"node:child_process";import fe from"node:path";function L(e,t){return te(e,t).id}function te(e,t){let r=na(e),o=uh(r),n=o?ph(o):null,s=n?xd(n):o??r,a=mh(s),i=n?"git-remote":o?"git-root":"path",l=ch(a,s),c=lh(r),d=c?Td(c):null,p=sa(t),g=[d,l,n?xd(n):null,o,r].find(y=>y&&p[y]);if(g){let y=d??l;return{id:p[g]??y,source:"alias",cwd:r,git_root:o,remote:n,base_id:y,alias_key:g,marker_path:c}}return d?{id:d,source:"marker",cwd:r,git_root:o,remote:n,base_id:d,alias_key:null,marker_path:c}:{id:l,source:i,cwd:r,git_root:o,remote:n,base_id:l,alias_key:null,marker_path:null}}function Td(e){if(!cn(e))return null;let t=jd(e,"utf8").trim();if(t.length===0)return null;let r=t.match(/^(?:project_id|id):\s*([a-z0-9._-]+)\s*$/imu);if(r?.[1])return r[1];let o=t.split(/\r?\n/u).map(n=>n.trim()).find(n=>n.length>0&&!n.startsWith("#"));return o?dh(o):null}function ra(e,t){let r=fe.join(e,".nativesoul","project");return sh(fe.dirname(r),{recursive:!0,mode:448}),ih(r,`${t}
840
+ `,{encoding:"utf8",mode:384}),r}async function Ur(e){let t=te(e.cwd,e.home);if(t.source!=="git-root"&&t.source!=="path")return{written:!1,marker_path:t.marker_path,base_id:t.base_id};let r=t.git_root??t.cwd,o=fe.join(r,".nativesoul","project");return cn(o)?{written:!1,marker_path:o,base_id:t.base_id}:(ra(r,t.base_id),{written:!0,marker_path:o,base_id:t.base_id})}async function oa(e){let t=fe.resolve(e.cwd),r=te(t,e.home),o=r.git_root??r.cwd,n=fe.join(o,".nativesoul","project");return e.apply&&(ra(o,r.base_id),await h({home:f(e.home).home,type:"project_pinned",details:{id:r.base_id,basis_source:r.source,marker_path:n}})),{cwd:t,base_id:r.base_id,marker_path:n,applied:e.apply===!0,resolution:r}}function lh(e){let t=na(e);for(;;){let r=fe.join(t,".nativesoul","project");if(cn(r))return r;let o=fe.dirname(t);if(o===t)return null;t=o}}function ch(e,t){let r=nh("sha256").update(t).digest("hex").slice(0,10);return`${gh(e)}-${r}`}function dh(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"")||"workspace"}function na(e){try{return ah(fe.resolve(e))}catch{return fe.resolve(e)}}function uh(e){let t=Id("git",["-C",e,"rev-parse","--show-toplevel"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(t.status!==0)return null;let r=t.stdout.trim();return r.length>0?na(r):null}function ph(e){let t=Id("git",["-C",e,"remote","get-url","origin"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(t.status!==0)return null;let r=t.stdout.trim();return r.length>0?r:null}function xd(e){return e.trim().replace(/^git@([^:]+):/,"https://$1/").replace(/^ssh:\/\/git@([^/]+)\//,"https://$1/").replace(/^https?:\/\/([^/]+)\//,"https://$1/").replace(/\.git$/u,"").toLowerCase()}function mh(e){let t=e.replace(/\/+$/u,"");return fe.basename(t)||"workspace"}function gh(e){return e.toLowerCase().replace(/[^a-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"")||"workspace"}function sa(e){if(!e)return{};let t=fe.join(fe.resolve(e),"config.yaml");if(!cn(t))return{};let r=jd(t,"utf8"),o={},n=!1,s=!1,a="";for(let i of r.split(/\r?\n/u)){if(/^\S/u.test(i)){n=/^project:\s*$/u.test(i),s=!1;continue}let l=i.match(/^([ \t]+)aliases:\s*(?:\{\}\s*)?$/u);if(n&&l?.[1]){s=!0,a=l[1];continue}if(s){if(i.trim().length===0||i.trim().startsWith("#"))continue;let c=i.match(/^([ \t]+)(?:"([^"]+)"|'([^']+)'|([^:]+)):\s*(?:"([^"]+)"|'([^']+)'|(.+))\s*$/u);(c?.[1]??"").length<=a.length&&(s=!1);let p=c?.[2]??c?.[3]??c?.[4],g=c?.[5]??c?.[6]??c?.[7];s&&p&&g?o[p.trim()]=g.trim():/^[ \t]+\S/u.test(i)&&i.trim().length>0&&(s=!1)}}return o}import{readFile as fh,writeFile as hh}from"node:fs/promises";import yh from"node:path";async function aa(e){let t=f(e.home),r=yh.join(t.home,"config.yaml"),o=await R(r)?await fh(r,"utf8"):`version: 1
841
+ `,n=o.includes(`\r
779
842
  `)?`\r
780
843
  `:`
781
- `,s={...$c(o).aliases},i=s[e.aliasKey]??null;if(e.action==="add"){if(!e.projectId)throw new Error("project alias add requires <id>");s[e.aliasKey]=e.projectId}else delete s[e.aliasKey];let l=Zg(o,s,a),c=l!==o;return e.apply&&c&&await Yg(r,l,{encoding:"utf8",mode:384}),{action:e.action,applied:e.apply===!0,config_path:r,alias_key:e.aliasKey,project_id:e.action==="add"?e.projectId??null:null,previous_id:i,aliases:s,changed:c,preview:l}}function $c(e){let t=Fc(e),r={},o=[],a=-1,n=-1,s=-1,i=" ",l=" ";for(let c=0;c<t.length;c+=1)if(/^project:\s*$/u.test(t[c]??"")){a=c;break}if(a>=0)for(let c=a+1;c<t.length;c+=1){let d=t[c]??"";if(/^\S/u.test(d)&&d.trim().length>0)break;let p=d.match(/^([ \t]+)aliases:\s*(?:\{\}\s*)?$/u);if(p?.[1]){n=c,i=p[1],l=`${i}${i.includes(" ")?" ":" "}`;break}}if(n>=0){s=n+1;for(let c=n+1;c<t.length;c+=1){let d=t[c]??"";if(d.trim().length===0||d.trim().startsWith("#")){s=c+1;continue}let p=d.match(/^([ \t]+)(?:"([^"]+)"|'([^']+)'|([^:]+)):\s*(?:"([^"]+)"|'([^']+)'|(.+))\s*$/u),h=p?.[1]??"";if(!p||h.length<=i.length)break;let y=p[2]??p[3]??p[4],w=p[5]??p[6]??p[7];if(y&&w){let R=y.trim();r[R]=w.trim(),o.includes(R)||o.push(R)}s=c+1}}return{aliases:r,aliasOrder:o,projectStart:a,aliasesStart:n,aliasesEnd:s,projectIndent:i,aliasIndent:l}}function Zg(e,t,r){let o=Fc(e),a=$c(e),s=[...a.aliasOrder.filter(l=>Object.prototype.hasOwnProperty.call(t,l)),...Object.keys(t).filter(l=>!a.aliasOrder.includes(l))].map(l=>`${a.aliasIndent}${Dc(l)}: ${Dc(t[l]??"")}`);if(a.aliasesStart>=0){let l=o.slice(0,a.aliasesStart+1),c=o.slice(a.aliasesStart+1,a.aliasesEnd).filter(p=>{let h=p.trim();return h.length===0||h.startsWith("#")}),d=o.slice(a.aliasesEnd);return Hc([...l,...c,...s,...d],r,e.endsWith(`
782
- `))}if(a.projectStart>=0){let l=a.projectStart+1,c=o.slice(0,l),d=o.slice(l);return Hc([...c,`${a.projectIndent}aliases:`,...s,...d],r,e.endsWith(`
844
+ `,a={...Od(o).aliases},i=a[e.aliasKey]??null;if(e.action==="add"){if(!e.projectId)throw new Error("project alias add requires <id>");a[e.aliasKey]=e.projectId}else delete a[e.aliasKey];let l=_h(o,a,n),c=l!==o;return e.apply&&c&&await hh(r,l,{encoding:"utf8",mode:384}),{action:e.action,applied:e.apply===!0,config_path:r,alias_key:e.aliasKey,project_id:e.action==="add"?e.projectId??null:null,previous_id:i,aliases:a,changed:c,preview:l}}function Od(e){let t=Md(e),r={},o=[],n=-1,s=-1,a=-1,i=" ",l=" ";for(let c=0;c<t.length;c+=1)if(/^project:\s*$/u.test(t[c]??"")){n=c;break}if(n>=0)for(let c=n+1;c<t.length;c+=1){let d=t[c]??"";if(/^\S/u.test(d)&&d.trim().length>0)break;let p=d.match(/^([ \t]+)aliases:\s*(?:\{\}\s*)?$/u);if(p?.[1]){s=c,i=p[1],l=`${i}${i.includes(" ")?" ":" "}`;break}}if(s>=0){a=s+1;for(let c=s+1;c<t.length;c+=1){let d=t[c]??"";if(d.trim().length===0||d.trim().startsWith("#")){a=c+1;continue}let p=d.match(/^([ \t]+)(?:"([^"]+)"|'([^']+)'|([^:]+)):\s*(?:"([^"]+)"|'([^']+)'|(.+))\s*$/u),g=p?.[1]??"";if(!p||g.length<=i.length)break;let y=p[2]??p[3]??p[4],k=p[5]??p[6]??p[7];if(y&&k){let S=y.trim();r[S]=k.trim(),o.includes(S)||o.push(S)}a=c+1}}return{aliases:r,aliasOrder:o,projectStart:n,aliasesStart:s,aliasesEnd:a,projectIndent:i,aliasIndent:l}}function _h(e,t,r){let o=Md(e),n=Od(e),a=[...n.aliasOrder.filter(l=>Object.prototype.hasOwnProperty.call(t,l)),...Object.keys(t).filter(l=>!n.aliasOrder.includes(l))].map(l=>`${n.aliasIndent}${Nd(l)}: ${Nd(t[l]??"")}`);if(n.aliasesStart>=0){let l=o.slice(0,n.aliasesStart+1),c=o.slice(n.aliasesStart+1,n.aliasesEnd).filter(p=>{let g=p.trim();return g.length===0||g.startsWith("#")}),d=o.slice(n.aliasesEnd);return Cd([...l,...c,...a,...d],r,e.endsWith(`
845
+ `))}if(n.projectStart>=0){let l=n.projectStart+1,c=o.slice(0,l),d=o.slice(l);return Cd([...c,`${n.projectIndent}aliases:`,...a,...d],r,e.endsWith(`
783
846
  `))}return`${e.length>0&&!e.endsWith(`
784
- `)?`${e}${r}`:e}project:${r}${a.projectIndent}aliases:${r}${s.join(r)}${s.length?r:""}`}function Fc(e){return e.replace(/\r\n/gu,`
847
+ `)?`${e}${r}`:e}project:${r}${n.projectIndent}aliases:${r}${a.join(r)}${a.length?r:""}`}function Md(e){return e.replace(/\r\n/gu,`
785
848
  `).split(`
786
- `).filter((t,r,o)=>r<o.length-1||t.length>0)}function Hc(e,t,r){let o=e.join(t);return r||e.length>0?`${o}${t}`:o}function Dc(e){return/^[A-Za-z0-9._/-]+$/u.test(e)?e:JSON.stringify(e)}import Wc from"node:path";var ef={minLength:1,removeStopwords:!1,normalizeDiacritics:!1};function Xo(e,t={}){let r={...ef,...t},o=r.normalizeDiacritics?e.normalize("NFKD").replace(new RegExp("\\p{Diacritic}","gu"),""):e;return Array.from(new Set(o.toLowerCase().match(/[\p{L}\p{N}_-]+/gu)?.filter(a=>a.length>=r.minLength).filter(a=>!r.removeStopwords||!tf.has(a))??[]))}function Nr(e,t={}){return new Set(Xo(e,t))}function jn(e,t){let r=Xo(e);if(r.length===0)return 0;let o=Nr(t),a=r.filter(n=>o.has(n)).length;return Number((a/r.length).toFixed(6))}function Uc(e,t,r={}){let o=Nr(e,r),a=Nr(t,r);if(o.size===0||a.size===0)return 0;let n=[...o].filter(i=>a.has(i)).length,s=new Set([...o,...a]).size;return Number((n/s).toFixed(6))}function Vc(e,t){let r=Math.min(e.length,t.length),o=0;for(let a=0;a<r;a+=1)o+=(e[a]??0)*(t[a]??0);return Number(Math.max(o,0).toFixed(6))}var tf=new Set(["the","and","for","with","this","that","uma","com","para","por","que","deve","esta","este","essa","isso"]);var Xe=1,Ye="local-hash",Qe="local-hash-bow-v1";async function Tn(e={}){let t=await b(e.home),r=Math.min(Math.max(e.limit??1e3,1),1e4),o=v(t.database),a,n=[],s=0,i=0;try{a=o.listSemanticIndexableMemories({limit:r});let l=new Date().toISOString();for(let c of a){let d=rf(c),p=o.getSemanticIndex(c.id);if(p&&p.content_hash===d.contentHash&&p.provider_id===Ye&&p.model_id===Qe&&p.schema_version===Xe){s+=1;continue}d.redacted&&(i+=1),n.push({memory_id:c.id,scope_project:c.scope.project,source:c.source,schema_version:Xe,provider_id:Ye,model_id:Qe,content_hash:d.contentHash,embedding:qc(d.text),indexed_text:d.text,indexed_at:l})}n.length>0&&o.upsertSemanticIndex(n)}finally{o.close()}return await f({home:t.home,type:"semantic_index_built",details:{provider_id:Ye,model_id:Qe,schema_version:Xe,indexable_count:a.length,indexed_count:n.length,skipped_unchanged:s,redacted_count:i}}),{provider_id:Ye,model_id:Qe,schema_version:Xe,indexable_count:a.length,indexed_count:n.length,skipped_unchanged:s,redacted_count:i}}function Jc(e){let t=v(e,{readOnly:!0});try{let r=t.semanticIndexStats({providerId:Ye,modelId:Qe,schemaVersion:Xe});return{provider_id:Ye,model_id:Qe,schema_version:Xe,available:!0,indexable_count:r.indexable_count,indexed_count:r.indexed_count,stale_count:r.stale_count,healthy:r.stale_count===0,remediation:r.stale_count===0?null:"Run nativesoul memory index"}}finally{t.close()}}function Or(e){let t=v(e.database,{readOnly:e.readOnly}),r=Math.min(Math.max(e.limit,1),8);try{let o=t.searchMemories(e.query,e.project,r),a=t.semanticIndexStatsForProject({project:e.project,providerId:Ye,modelId:Qe,schemaVersion:Xe});if(a.indexable_count===0||a.indexed_count===0||a.stale_count>0)return{mode:"fts",reason:a.stale_count>0?"semantic_index_stale":"semantic_index_unavailable",memories:Bc(o.length>0?o:t.recentMemories(e.project,r),e.query)};let n=t.listCurrentSemanticIndexesForProject({project:e.project,providerId:Ye,modelId:Qe,schemaVersion:Xe,limit:1e3}),s=t.listActiveMemoriesForProject(e.project,1e3),i=new Map(s.map(p=>[p.id,p])),l=new Map(o.map(p=>[p.id,jn(e.query,`${p.summary}
787
- ${p.content}`)])),c=qc(e.query),d=n.map(p=>{let h=i.get(p.memory_id);if(!h)return null;let y=l.get(h.id)??0,w=Vc(c,p.embedding);return{memory:h,ftsScore:y,semanticScore:w,score:Number((y*.55+w*.45).toFixed(6))}}).filter(p=>p!==null).filter(p=>p.ftsScore>0||p.semanticScore>0).sort((p,h)=>h.score-p.score||h.semanticScore-p.semanticScore||p.memory.id.localeCompare(h.memory.id)).slice(0,r).map((p,h)=>({...p.memory,recall:{mode:"hybrid",fts_score:p.ftsScore,semantic_score:p.semanticScore,final_rank:h+1,reason:p.ftsScore>0&&p.semanticScore>0?"fts_and_semantic":p.semanticScore>0?"semantic_neighbor":"fts_match"}}));return{mode:"hybrid",reason:"semantic_index_ready",memories:d.length>0?d:Bc(o,e.query)}}finally{t.close()}}function rf(e){let t=M(`${e.summary}
788
-
789
- ${e.content}`);return{text:t.value,contentHash:e.hash,redacted:t.redacted}}function qc(e){let r=Array.from({length:32},()=>0);for(let a of Xo(e)){let n=of(a),s=n%32,i=n%2===0?1:-1;r[s]=(r[s]??0)+i}let o=Math.hypot(...r)||1;return r.map(a=>Number((a/o).toFixed(6)))}function Bc(e,t){return e.map((r,o)=>({...r,recall:{mode:"fts",fts_score:jn(t,`${r.summary}
790
- ${r.content}`),semantic_score:0,final_rank:o+1,reason:"fts_fallback"}}))}function of(e){let t=2166136261;for(let r=0;r<e.length;r+=1)t^=e.charCodeAt(r),t=Math.imul(t,16777619);return t>>>0}function $e(e,t=160){let r=e.replace(/\s+/g," ").trim();return r.length<=t?r:`${r.slice(0,t-3)}...`}function Mr(e){return Math.ceil(e.length/4)}function Yo(e,t){return e.length<=t?e:`${e.slice(0,Math.max(t-3,0))}...`}var _t=class extends Error{code="MEMORY_TRANSITION_BLOCKED";id;from;to;constructor(t){super(`Invalid memory transition for ${t.id}: ${t.from} -> ${t.to}`),this.name="MemoryTransitionError",this.id=t.id,this.from=t.from,this.to=t.to}},af=new Map([["candidate",new Set(["active","rejected"])],["active",new Set(["forgotten","expired"])],["superseded",new Set],["rejected",new Set],["forgotten",new Set],["expired",new Set]]);async function Cn(e,t){let r=await b(e),o=await Yc(r.database,t,"active");return await f({home:r.home,type:"memory_added",details:{id:o.id,project:o.scope.project,redacted:o.sensitivity==="restricted"}}),o}async function te(e,t){let r=await b(e),o=await Yc(r.database,t,"candidate");return await f({home:r.home,type:"memory_proposed",details:{id:o.id,project:o.scope.project,redacted:o.sensitivity==="restricted"}}),o}async function In(e){let t=await b(e.home),r=Wc.resolve(e.cwd);await Ir({cwd:r,home:t.home});let o=D(r,t.home),a=e.event?.trim()||"session-end",n=nf(e.text,e.payload),s=[`Session memory candidate from ${e.host} ${a} hook.`,"",`Project: ${o}`,`CWD: ${r}`,"","Summary:",n.text].join(`
791
- `),i=await te(t.home,{project:o,content:s,confidence:n.source==="stub"?.2:.45,authority:"hook_observed",source:{kind:"session_end_hook",host:e.host,event:a,cwd:r,summary_source:n.source}});return{proposed:!0,host:e.host,event:a,cwd:r,project:o,memory:i,summary_source:n.source}}function nf(e,t){let r=e?.trim();if(r)return{text:Kc(r),source:"text"};let o=sf(t);return o?{text:Kc(o),source:"payload"}:{text:"No host session summary was supplied. Review this candidate against the recent session before promotion.",source:"stub"}}function sf(e){if(typeof e=="string")return e.trim()||null;if(!e||Array.isArray(e)||typeof e!="object")return null;for(let t of["summary","session_summary","transcript_summary","conversation_summary","text","content"]){let r=e[t];if(typeof r=="string"&&r.trim().length>0)return r.trim()}return null}function Kc(e){return e.length<=8e3?e:`${e.slice(0,7997)}...`}async function Nn(e){let t=await b(e.home),r=Wc.resolve(e.cwd),o=D(r,t.home),a=await lf(t.home),n=zc(e.prompt,a),s=Math.min(Math.max(e.limit??3,1),3),i=[];if(n.triggered){let l=Or({database:t.database,query:n.query,project:o,limit:s});i=l.memories,await f({home:t.home,type:"memory_recalled",details:{host:e.host,project:o,reason:n.reason,query:n.query,count:i.length,recall_mode:l.mode,recall_reason:l.reason}})}return{host:e.host,cwd:r,project:o,prompt:e.prompt,decision:n,memories:i,context:cf(i,n)}}function zc(e,t=Xc()){let r=e.trim(),o=r.toLowerCase();if(!t.autoTrigger)return{triggered:!1,reason:"auto_trigger_disabled",denied:!1,auto_trigger:!1,query:r};if(r.length===0)return{triggered:!1,reason:"empty_prompt",denied:!0,auto_trigger:!0,query:r};let a=t.denylist.find(s=>o===s||o.startsWith(`${s} `));if(a)return{triggered:!1,reason:`denylist:${a}`,denied:!0,auto_trigger:!0,query:r};let n=t.keywords.find(s=>o.includes(s));return n?{triggered:!0,reason:`keyword:${n}`,denied:!1,auto_trigger:!0,query:r}:{triggered:!1,reason:"no_trigger",denied:!1,auto_trigger:!0,query:r}}function Xc(){return{autoTrigger:!1,keywords:["como combinamos","como decidimos","o que combinamos","decisao anterior","decis\xE3o anterior","prior decision","previous decision","remember","lembr","memoria","mem\xF3ria","contexto anterior","last time"],denylist:["lint","format","typecheck","test","build"]}}async function lf(e){let t=Xc(),r=await ce(e,"config.yaml"),o=r.match(/^\s*auto_trigger:\s*(true|false)\s*$/imu);o?.[1]&&(t.autoTrigger=o[1].toLowerCase()==="true");let a=Gc(r,"keywords");a.length>0&&(t.keywords=a.map(s=>s.toLowerCase()));let n=Gc(r,"denylist");return n.length>0&&(t.denylist=n.map(s=>s.toLowerCase())),t}function Gc(e,t){let r=e.split(/\r?\n/u),o=[],a=!1;for(let n of r){if(new RegExp(`^\\s*${t}:\\s*$`,"u").test(n)){a=!0;continue}if(!a)continue;let s=n.match(/^\s*-\s*["']?(.+?)["']?\s*$/u)?.[1];if(s){o.push(s.trim());continue}if(/^\s*\S/u.test(n))break}return o}function cf(e,t){if(!t.triggered||e.length===0)return"";let r=["## NativeSoul Memory Recall",`Trigger: ${t.reason}`,""];for(let o of e)r.push(`- ${o.summary}`);return r.join(`
792
- `).slice(0,1800)}async function vt(e,t){return Qo(e,t,"active","memory_promoted")}async function bt(e,t){return Qo(e,t,"rejected","memory_rejected")}async function wt(e,t){return Qo(e,t,"forgotten","memory_forgotten")}async function Lr(e,t){return Qo(e,t,"expired","memory_expired")}async function Rt(e){let t=await b(e.home),r=v(t.database),o;try{o=r.listMemories({project:e.project,status:e.status,includeForgotten:e.includeForgotten,limit:Math.min(Math.max(e.limit??100,1),1e3)})}finally{r.close()}return await f({home:t.home,type:"memory_exported",details:{project:e.project??null,status:e.status??null,includeForgotten:e.includeForgotten===!0,count:o.length}}),o}async function Yc(e,t,r){let o=M(t.content),a=new Date().toISOString(),n=$e(o.value),s={id:O("mem"),type:t.type??"note",scope:{user:"default",project:t.project},content:o.value,summary:n,source:t.source??{host:"cli",session_id:"local"},confidence:t.confidence??.9,authority:t.authority??"user_explicit",sensitivity:o.redacted?"restricted":t.sensitivity??"internal",status:r,created_at:a,expires_at:null,hash:ye({type:t.type??"note",project:t.project,content:o.value,status:r,created_at:a})},i=v(e);try{i.insertMemory(s)}finally{i.close()}return s}async function Qo(e,t,r,o){let a=await b(e),n=v(a.database),s,i;try{if(s=n.getMemory(t),s&&!Zo(s.status,r))throw new _t({id:t,from:s.status,to:r});i=s?n.updateMemoryStatus(t,r):null}catch(l){throw l instanceof _t&&await df({home:a.home,id:l.id,from:l.from,to:l.to}),l}finally{n.close()}if(!i)throw new Error(`Memory not found: ${t}`);return await f({home:a.home,type:o,details:{id:i.id,project:i.scope.project,status:r}}),i}function Zo(e,t){return af.get(e)?.has(t)??!1}async function df(e){await f({home:e.home,type:"memory_transition_blocked",result:"blocked",details:{id:e.id,from:e.from,to:e.to,code:"MEMORY_TRANSITION_BLOCKED"}})}async function kt(e,t,r,o=5){let a=await b(e),n=Or({database:a.database,query:t,project:r,limit:Math.min(Math.max(o,1),8)});return await f({home:a.home,type:"memory_searched",details:{query:t,project:r,count:n.memories.length,recall_mode:n.mode,recall_reason:n.reason}}),n.memories}async function On(e){let t=g(e.home),r=null;try{r=v(t.database);let o=r.upsertProject({id:e.resolution.id,display_name:e.resolution.id,base_id:e.resolution.base_id,source:e.resolution.source,first_basis:Qc(e.resolution),status:"active",now:e.now});return r.close(),r=null,o.inserted&&await f({home:t.home,type:"project_seen",details:{id:e.resolution.id,base_id:e.resolution.base_id,source:e.resolution.source,first_basis:Qc(e.resolution)}}),{touched:!0,inserted:o.inserted,degraded:!1,warning:null}}catch(o){return{touched:!1,inserted:!1,degraded:!0,warning:`PROJECT_REGISTRY_UNAVAILABLE:${hf(o)}`}}finally{r?.close()}}async function Mn(e={}){let t=g(e.home),r=mf(e.limit),o=e.status??"active";if(!await k(t.database))return{registry_available:!1,status:o,limit:r,projects:[],warning:"database_not_available"};let a=v(t.database,{readOnly:e.readOnly??!0});try{let n=a.listProjectsWithCounts({status:o,limit:r});return{registry_available:n.available,status:o,limit:r,projects:n.projects,warning:n.warning}}finally{a.close()}}async function Ln(e){let t=g(e.home),r=e.id==="."?uf(e.cwd??process.cwd(),t.home):pf(e.id);if(!await k(t.database))return Zc(e.id,r,"database_not_available");let o=v(t.database,{readOnly:e.readOnly??!0});try{let a=o.getProjectDetail(r.id);if(!a.available)return Zc(e.id,r,a.warning);let n=a.detail;return{registry_available:!0,requested:e.id,effective_id:r.id,registry:n?.project??null,live_resolution:r,counts:n?.counts??null,derived_last_seen_at:n?.derived_last_seen_at??null,continuity_gap:!!(n?.project&&n.project.base_id!==r.id),warning:n?.project?null:"project_not_found"}}finally{o.close()}}async function Hn(e){let t=g(e.home),r=gf(e.name),o=e.id==="."?ne(e.cwd??process.cwd(),t.home).id:e.id,a=v(t.database),n;try{n=a.renameProject(o,r)}finally{a.close()}return n.found&&n.previous&&n.project&&await f({home:t.home,type:"project_renamed",details:{id:o,old_name:n.previous.display_name,new_name:r}}),{found:n.found,id:o,old_name:n.previous?.display_name??null,new_name:r,project:n.project}}async function Dn(e){let t=g(e.home),r=e.includeMemories===!0,o=e.apply===!0,a=e.confirm??null,n=!r||o&&a===e.id,s=v(t.database);try{let i=s.getProject(e.id);if(!i)return ea({found:!1,id:e.id,mode:r?"forget_memories":"archive",applied:!1,guardOk:n,confirm:a,previousStatus:null,statusAfter:null,memoriesAffected:0,project:null,warning:"project_not_found"});if(r&&!n)return ea({found:!0,id:e.id,mode:"forget_memories",applied:!1,guardOk:n,confirm:a,previousStatus:i.status,statusAfter:i.status,memoriesAffected:s.countProjectMemories(e.id),project:i,warning:"requires --apply --confirm <id>"});if(r)try{let c=s.forgetProjectMemories(e.id,Zo);return c.found&&c.project&&await f({home:t.home,type:"project_forgotten",details:{id:e.id,memories_affected:c.memories_affected}}),ea({found:c.found,id:e.id,mode:"forget_memories",applied:c.found,guardOk:n,confirm:a,previousStatus:c.previous?.status??null,statusAfter:c.project?.status??null,memoriesAffected:c.memories_affected,project:c.project,warning:c.found?null:"project_not_found"})}catch(c){throw c instanceof Vt&&await f({home:t.home,type:"memory_transition_blocked",result:"blocked",details:{id:c.id,from:c.from,to:c.to,code:c.code,project:e.id}}),c}let l=s.archiveProject(e.id);return l.found&&l.project&&await f({home:t.home,type:"project_archived",details:{id:e.id}}),ea({found:l.found,id:e.id,mode:"archive",applied:l.found,guardOk:n,confirm:a,previousStatus:l.previous?.status??null,statusAfter:l.project?.status??null,memoriesAffected:0,project:l.project,warning:l.found?null:"project_not_found"})}finally{s.close()}}async function $n(e){let t=g(e.home),r=v(t.database),o;try{o=r.reactivateProject(e.id)}finally{r.close()}return o.found&&o.project&&await f({home:t.home,type:"project_reactivated",details:{id:e.id}}),{found:o.found,id:e.id,previous_status:o.previous?.status??null,status_after:o.project?.status??null,project:o.project}}async function Fn(e={}){return{aliases:En(g(e.home).home)}}async function Un(e){let t=g(e.home),r=await xn({home:t.home,action:"add",aliasKey:ed(e.alias),projectId:ff(e.id),apply:e.apply});return r.applied&&r.changed&&await f({home:t.home,type:"project_alias_set",details:{alias_key:r.alias_key,project_id:r.project_id,previous_project_id:r.previous_id}}),r}async function Vn(e){let t=g(e.home),r=await xn({home:t.home,action:"remove",aliasKey:ed(e.alias),apply:e.apply});return r.applied&&r.changed&&await f({home:t.home,type:"project_alias_removed",details:{alias_key:r.alias_key,previous_project_id:r.previous_id}}),r}function Qc(e){return e.remote??e.git_root??e.cwd}function uf(e,t){let r=ne(e,t);return{id:r.id,source:r.source,cwd:r.cwd,git_root:r.git_root,remote:r.remote,base_id:r.base_id,alias_key:r.alias_key,marker_path:r.marker_path}}function pf(e){return{id:e,source:"explicit",cwd:null,git_root:null,remote:null,base_id:null,alias_key:null,marker_path:null}}function Zc(e,t,r){return{registry_available:!1,requested:e,effective_id:t.id,registry:null,live_resolution:t,counts:null,derived_last_seen_at:null,continuity_gap:!1,warning:r}}function mf(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),500)}function gf(e){let t=e.trim();if(t.length===0)throw new Error("project rename requires a non-empty --name");return t.slice(0,160)}function ed(e){let t=e.trim();if(t.length===0)throw new Error("project alias requires a non-empty alias");return t}function ff(e){let t=e.trim();if(t.length===0||t===".")throw new Error("project alias add requires an explicit project id");return t}function ea(e){return{found:e.found,id:e.id,mode:e.mode,applied:e.applied,dry_run:!e.applied,guard_ok:e.guardOk,required_confirm:e.mode==="forget_memories"?e.id:null,confirm:e.confirm,previous_status:e.previousStatus,status_after:e.statusAfter,memories_affected:e.memoriesAffected,project:e.project,warning:e.warning}}function hf(e){return(e instanceof Error?e.message:String(e)).replace(/[^a-zA-Z0-9_.:-]+/g,"_").slice(0,120)}var yf=/^-\s*\*\*([^:*]+):\*\*\s*(.*)$/u;function St(e,t){let r=_f(e,t);if(r)return r;let o=e.split(/\r?\n/u);for(let a=0;a<o.length;a+=1){let s=(o[a]?.trim()??"").match(yf);if(!s||s[1]?.trim()!==t)continue;let i=s[2]?.trim()??"";if(i.length>0&&!i.startsWith("_("))return i;for(let l=a+1;l<o.length;l+=1){let c=o[l]?.trim()??"";if(!c||c.startsWith("#")||c.startsWith("- **"))break;if(!c.startsWith("_("))return c}}return null}function td(e,t=200){let r=e.split(/\r?\n/u).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#")&&!o.startsWith("---")&&!o.startsWith("_")).join(" ").replace(/\s+/g," ").trim();return r.length<=t?r:`${r.slice(0,t-3)}...`}function rd(e,t=1600){let r=e.split(/\r?\n/u).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("---")&&!o.startsWith("_")).map(o=>o.replace(/^#+\s*/u,"").replace(/^-\s*/u,"")).join(" ").replace(/\s+/g," ").trim();return r.length<=t?r:`${r.slice(0,t-3)}...`}function _f(e,t){let r=`${t}:`,o=e.split(/\r?\n/u).map(a=>a.trim()).find(a=>a.startsWith(r));return o?o.slice(r.length).trim():null}async function Pt(e){let t=e.readOnly?g(e.home):await b(e.home),r=await wf(t.home),o=Math.min(Math.max(e.tokensMax??r.defaultTokens,1),3e3),a=[];e.readOnly!==!0&&await Ir({cwd:e.cwd,home:t.home});let n=ne(e.cwd,t.home),s=n.id;if(e.readOnly!==!0){let A=await On({home:t.home,resolution:n});A.warning&&a.push(A.warning)}let i=Rf({explicitQuery:e.query,project:s,host:e.host,cwd:e.cwd,seed:r.memoryQuerySeed}),l=await vf({database:t.database,readOnly:e.readOnly===!0,memoryQuery:i,project:s,limit:r.recallLimit,warnings:a}),c=await be({home:t.home,host:e.host,readyOnly:!0,limit:8,readOnly:e.readOnly}),d=await Af(t.home,e.host,e.readOnly===!0),p=await wn({home:t.home,host:e.host,query:e.query??`${At.basename(e.cwd)} ${e.host}`,limit:8,readOnly:e.readOnly}),h=await Tr({home:t.home,project:s,status:"open",limit:8,readOnly:e.readOnly}),y=await ce(t.home,"IDENTITY.md"),w=await ce(t.home,"SOUL.md"),R=await ce(t.home,"AGENTS.md"),H=await ce(t.home,"USER.md"),fe=await ce(t.home,"BOOTSTRAP.md"),Se=new Date().toISOString().slice(0,10),Ge=At.join(t.home,"memory","daily",`${Se}.md`);a.push(...d?[]:[`HOST_ADAPTER_UNAVAILABLE:${e.host}`,"CAPABILITY_REFRESH_STALE"],...p.warnings),!await k(At.join(t.home,"state","onboarding.complete"))&&fe.trim().length>0&&a.push("BOOTSTRAP_RITUAL_PENDING"),await k(Ge)&&a.push(`DAILY_MEMORY_AVAILABLE:${Ge}`),r.warnEmptyMemories&&l.length===0&&a.push("PROJECT_MEMORY_EMPTY");let Ae={bootstrap_schema:2,identity:{name:St(y,"Name")??"NativeSoul",mission:St(y,"Mission")??"Provide local continuity across native coding-agent hosts.",creature:St(y,"Creature"),role:St(y,"Role"),vibe:St(y,"Vibe"),emoji:St(y,"Emoji")},soul_summary:td(w||"Continuity, clarity, and safe local-first operation.",500),agents_operating_summary:rd(R||"Load NativeSoul context before continuity-sensitive work. Use MCP when available and CLI fallback when needed."),tool_hints:kf(),user:{preferences_summary:Sf(H)},project:{id:s,cwd:At.resolve(e.cwd),state:"local-bootstrap"},commitments:h.map(A=>({id:A.id,status:A.status,summary:A.summary,due_at:A.due_at,ttl_expires_at:A.ttl_expires_at})),relevant_memories:l.map(A=>({id:A.id,summary:A.summary,scope:A.scope})),capabilities:c.map(A=>({uid:A.uid,host:A.host,ready:A.ready,source:A.source})),capability_cards:p.cards,policy:{mode:"safe",approval_required:["external_write","destructive","identity_policy_change"]},warnings:a},E=Pf(Ae,o),ko=Mr(JSON.stringify(E)),xa={...E,context_budget:{tokens_used:ko,tokens_max:o}};return e.readOnly||await f({home:t.home,type:"bootstrap_created",details:{host:e.host,cwd:At.resolve(e.cwd),project:s,tokens:ko}}),xa}async function vf(e){if(!await k(e.database))return e.warnings.push("BOOTSTRAP_DATABASE_MISSING"),[];let t=null;try{t=v(e.database,{readOnly:e.readOnly});let r=Or({database:e.database,query:e.memoryQuery,project:e.project,limit:e.limit,readOnly:e.readOnly}).memories;return r.length===0?t.recentMemories(e.project,e.limit):r}catch(r){return e.warnings.push(`BOOTSTRAP_DATABASE_UNAVAILABLE:${bf(r)}`),[]}finally{t?.close()}}function bf(e){return(e instanceof Error?e.message:String(e)).replace(/[^a-zA-Z0-9_.:-]+/g,"_").slice(0,120)}async function wf(e){let t=await ce(e,"config.yaml"),r=t.match(/^\s*default_tokens:\s*(\d+)\s*$/mu),o=t.match(/^\s*(?:bootstrap_recall_limit|recall_limit):\s*(\d+)\s*$/mu),a=t.match(/^\s*memory_query_seed:\s*["']?(.+?)["']?\s*$/mu),n=t.match(/^\s*warn_empty_memories:\s*(true|false)\s*$/imu),s=r?.[1]?Number(r[1]):1900,i=o?.[1]?Number(o[1]):5;return{defaultTokens:Number.isFinite(s)?s:1900,recallLimit:Number.isFinite(i)?Math.min(Math.max(i,1),8):5,memoryQuerySeed:a?.[1]?.trim()||null,warnEmptyMemories:n?.[1]?.toLowerCase()==="true"}}function Rf(e){return[e.explicitQuery,e.project,e.host,At.basename(At.resolve(e.cwd)),e.seed].filter(t=>typeof t=="string"&&t.trim().length>0).join(" ")}function kf(){return[{tool:"life_bootstrap",use_when:"Start a new session or refresh NativeSoul identity, project context, memories, and capability cards."},{tool:"life_recall",use_when:"Search local memories for project-specific continuity before making assumptions."},{tool:"life_remember_propose",use_when:"Propose durable memory from user-approved facts, outcomes, or preferences."},{tool:"life_onboarding_status",use_when:"Check whether onboarding is pending before drafting or applying identity files."}]}function Sf(e){let t=e.trim();return t.length===0?"No curated user preferences yet.":t.length<=160?t:`${t.slice(0,157)}...`}async function Af(e,t,r=!1){let o=await be({home:e,host:t,includeShared:!1,limit:20,readOnly:r});if(t==="codex"&&!o.some(i=>i.source.startsWith("codex app server ")))return!1;let a=o[0]?.last_seen_at;if(!a)return!1;let n=Date.parse(a);if(!Number.isFinite(n))return!1;let s=1440*60*1e3;return Date.now()-n<=s}function Pf(e,t){let r=[e,Ze(e,1200,420,150),Ze(e,900,320,130),Ze(e,650,240,110),Ze(e,420,180,90),Ze(e,240,120,80),Bn(Ze(e,240,120,80),8,8),Bn(Ze(e,240,120,80),5,5),Bn(Ze(e,240,120,80),3,3)];return r.find(o=>Mr(JSON.stringify(o))<=t)??r[r.length-1]??e}function Bn(e,t,r){return{...e,capabilities:e.capabilities.slice(0,t),capability_cards:e.capability_cards.slice(0,r),relevant_memories:e.relevant_memories.slice(0,t),commitments:e.commitments.slice(0,t)}}function Ze(e,t,r,o){return{...e,soul_summary:Yo(e.soul_summary,r),agents_operating_summary:Yo(e.agents_operating_summary,t),user:{...e.user,preferences_summary:Yo(e.user.preferences_summary,o)}}}import{existsSync as hs}from"node:fs";import Wd from"node:path";import{mkdir as Ef,readFile as xf,writeFile as od}from"node:fs/promises";import Jn from"node:path";var ta={heartbeat_enabled:!0,scheduler_host:"auto-native-supported",heartbeat_cadence:"daily",memory_candidates:!0,memory_candidate_policy:"candidate",auto_promotion:!1,promotion_policy:"explicit_approval",recall_auto_trigger_keywords:["como combinamos","como decidimos","o que combinamos","decisao anterior","decis\xE3o anterior","prior decision","previous decision","remember","lembr","memoria","mem\xF3ria","contexto anterior","last time"],recall_auto_trigger_denylist:["lint","format","typecheck","test","build"],candidate_auto_promotion_threshold:.6,recall_auto_trigger:!1,standing_order_templates:[]};async function ad(e,t){let r=await et(e),o=await k(Gt(e));return{phase:t?"identity_pending":r&&o?"active":"pending",configured:r!==null,complete_marker_present:o,existing_profile:r,available_profiles:["quickstart","advanced"],quickstart_defaults:ta,apply_defaults:{dry_run:!0,user_confirmed:!1,reset:!1}}}async function qn(e){let t=await b(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,a=e.reset===!0,n=await et(t.home);if(n&&!a)return{dry_run:r,applied:!1,user_confirmed:o,reset:a,action:"preserved",before:n,after:n,diff:[],warnings:["ACTIVATION_PROFILE_PRESERVED: use reset=true to replace existing activation choices"]};let s=jf(e.profile,e.options),i=Cf(n,s);if(!r&&!o)return{dry_run:r,applied:!1,user_confirmed:o,reset:a,action:"rejected",before:n,after:s,diff:i,warnings:["ACTIVATION_REQUIRES_USER_CONFIRMED"]};let l=n?i.length===0?"noop":"update":"create";return r||(await Ef(Jn.join(t.home,"state"),{recursive:!0,mode:448}),await od(nd(t.home),`${JSON.stringify(s,null,2)}
793
- `,{encoding:"utf8",mode:384}),await od(Gt(t.home),`${new Date().toISOString()}
794
- `,{encoding:"utf8",mode:384}),await f({home:t.home,type:"activation.profile.applied",details:{profile:s.profile,reset:a,diff:i.map(c=>c.field)}})),{dry_run:r,applied:!r,user_confirmed:o,reset:a,action:l,before:n,after:s,diff:i,warnings:[]}}function nd(e){return Jn.join(e,"state","activation-profile.json")}function Gt(e){return Jn.join(e,"state","activation.complete")}async function et(e){try{let t=JSON.parse(await xf(nd(e),"utf8"));return If(t)?t:null}catch{return null}}function jf(e,t){return{...ta,...Tf(t),profile:e,updated_at:new Date().toISOString()}}function Tf(e){if(!e)return{};if(e.candidate_auto_promotion_threshold!==void 0){let t=e.candidate_auto_promotion_threshold;if(!Number.isFinite(t)||t<0||t>1)throw new Error("Invalid candidate_auto_promotion_threshold: expected a number between 0 and 1")}if(e.promotion_policy!==void 0&&e.promotion_policy!=="manual"&&e.promotion_policy!=="explicit_approval")throw new Error("Invalid promotion_policy: expected manual or explicit_approval");if(e.memory_candidate_policy!==void 0&&e.memory_candidate_policy!=="candidate"&&e.memory_candidate_policy!=="off")throw new Error("Invalid memory_candidate_policy: expected candidate or off");if(e.recall_auto_trigger_keywords!==void 0&&(!Array.isArray(e.recall_auto_trigger_keywords)||e.recall_auto_trigger_keywords.some(t=>typeof t!="string")))throw new Error("Invalid recall_auto_trigger_keywords: expected string array");if(e.recall_auto_trigger_denylist!==void 0&&(!Array.isArray(e.recall_auto_trigger_denylist)||e.recall_auto_trigger_denylist.some(t=>typeof t!="string")))throw new Error("Invalid recall_auto_trigger_denylist: expected string array");if(e.standing_order_templates!==void 0&&!Array.isArray(e.standing_order_templates))throw new Error("Invalid standing_order_templates: expected string array");if(e.standing_order_templates!==void 0&&e.standing_order_templates.some(t=>typeof t!="string"))throw new Error("Invalid standing_order_templates: expected string array");return{...e,recall_auto_trigger_keywords:Array.isArray(e.recall_auto_trigger_keywords)?e.recall_auto_trigger_keywords:void 0,recall_auto_trigger_denylist:Array.isArray(e.recall_auto_trigger_denylist)?e.recall_auto_trigger_denylist:void 0,standing_order_templates:Array.isArray(e.standing_order_templates)?e.standing_order_templates:void 0}}function Cf(e,t){return["profile","heartbeat_enabled","scheduler_host","heartbeat_cadence","memory_candidates","memory_candidate_policy","auto_promotion","promotion_policy","recall_auto_trigger_keywords","recall_auto_trigger_denylist","candidate_auto_promotion_threshold","recall_auto_trigger","standing_order_templates"].flatMap(o=>{let a=e?.[o]??null,n=t[o];return JSON.stringify(a)===JSON.stringify(n)?[]:[{field:o,before:a,after:n}]})}function If(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;let t=e;return(t.profile==="quickstart"||t.profile==="advanced")&&typeof t.heartbeat_enabled=="boolean"&&(typeof t.scheduler_host=="string"||t.scheduler_host===null)&&typeof t.heartbeat_cadence=="string"&&typeof t.memory_candidates=="boolean"&&(t.memory_candidate_policy==="candidate"||t.memory_candidate_policy==="off")&&typeof t.auto_promotion=="boolean"&&(t.promotion_policy==="manual"||t.promotion_policy==="explicit_approval")&&Array.isArray(t.recall_auto_trigger_keywords)&&t.recall_auto_trigger_keywords.every(r=>typeof r=="string")&&Array.isArray(t.recall_auto_trigger_denylist)&&t.recall_auto_trigger_denylist.every(r=>typeof r=="string")&&typeof t.candidate_auto_promotion_threshold=="number"&&Number.isFinite(t.candidate_auto_promotion_threshold)&&t.candidate_auto_promotion_threshold>=0&&t.candidate_auto_promotion_threshold<=1&&typeof t.recall_auto_trigger=="boolean"&&Array.isArray(t.standing_order_templates)&&t.standing_order_templates.every(r=>typeof r=="string")&&typeof t.updated_at=="string"}function Kn(e){let t={bootstrap:Nf(e),mcp:Of(e),plugins_hooks:Mf(e),heartbeat:Lf(e),recall_auto_trigger:Hf(e),memory_candidate_hooks:Df(e),memory_promotion_policy:$f(e),cross_host_verification:Ff(e)},r=Object.values(t),o=Uf(r),a=r.flatMap(s=>s.plan_actions),n=Vf(e.profile,o,r);return{schema_version:1,home:e.home,target_root:e.targetRoot,host:e.host,profile:e.profile,overall_status:o,components:t,plan:a,summary:n}}function sd(e){return Kn(e).summary}function Nf(e){return e.onboardingComplete&&e.activationComplete&&e.profile?$("bootstrap","active","Identity onboarding and activation marker are present.",{onboarding_complete:!0,activation_complete:!0}):$("bootstrap",e.onboardingComplete?"approval_required":"not_configured",e.onboardingComplete?"Activation profile still needs explicit approval.":"Identity onboarding is not complete.",{onboarding_complete:e.onboardingComplete,activation_complete:e.activationComplete},[Et("activation-profile","bootstrap","approval_required","Write activation profile and completion marker.",`${e.home}/state/activation-profile.json`,!0,"17.1 activation apply is explicit-approval only.")])}function Of(e){let t=e.hosts.filter(r=>r.mcp_registration.configured);if(t.length>0){let r=t.some(o=>o.mcp_registration.issues.length>0);return $("mcp",r?"degraded":"active",r?"MCP is configured but doctor reported warnings.":"MCP registration is configured.",{configured_hosts:t.map(pe),checked_hosts:e.hosts.map(pe)})}return $("mcp","not_configured","No MCP registration was detected for the selected host scope.",{checked_hosts:e.hosts.map(pe)},[Et("mcp-registration","mcp","not_configured","Install MCP registration for selected hosts.",`nativesoul mcp install --host ${e.host} --apply`,!0,"MCP registration changes host config files.")])}function Mf(e){let t=e.hosts.filter(o=>o.plugin.enabled||o.plugin.hook_registered);if(t.length>0){let o=t.some(a=>a.provider_parity.hooks==="official-fallback");return $("plugins_hooks",o?"degraded":"active",o?"Plugin/hooks are available through fallback support.":"Native plugin or hook support is active.",{enabled_hosts:t.map(pe),hook_modes:Object.fromEntries(e.hosts.map(a=>[pe(a),a.provider_parity.hooks]))})}let r=e.hosts.length>0&&e.hosts.every(o=>o.plugin.package_kind==="unsupported-native");return $("plugins_hooks",r?"blocked_by_host":"not_configured",r?"Selected hosts do not expose a native plugin path.":"No plugin or hook registration was detected.",{checked_hosts:e.hosts.map(pe)},[Et("plugin-install","plugins_hooks",r?"blocked_by_host":"not_configured","Install NativeSoul plugin/hook package where the host supports it.",`nativesoul install --host ${e.host} --apply`,!0,"Host plugin/hook setup modifies host-specific config.")])}function Lf(e){if(!e.profile||!e.profile.heartbeat_enabled)return $("heartbeat","not_configured","Heartbeat is not enabled in the activation profile.",{profile_present:e.profile!==null});let t=e.hosts.filter(r=>r.full_native_evidence.blocked_by_host);return t.length>0?$("heartbeat","blocked_by_host","At least one selected host lacks native scheduler support.",{blocked_hosts:t.map(pe),heartbeat_modes:Object.fromEntries(e.hosts.map(r=>[pe(r),r.provider_parity.heartbeat]))},[Et("heartbeat-scheduler","heartbeat","blocked_by_host","Choose a native scheduler-capable host or keep external fallback explicit.",`nativesoul schedule reconcile --host ${e.host} --mode leader --apply`,!0,"Scheduler writes must remain explicit and host-aware.")]):e.hosts.some(r=>r.provider_parity.heartbeat==="native")?$("heartbeat","active","Heartbeat has native scheduler support in the selected scope.",{native_hosts:e.hosts.filter(r=>r.provider_parity.heartbeat==="native").map(pe)}):e.hosts.some(r=>r.provider_parity.heartbeat==="official-fallback")?$("heartbeat","degraded","Heartbeat is available only through fallback scheduling in the selected scope.",{fallback_hosts:e.hosts.filter(r=>r.provider_parity.heartbeat==="official-fallback").map(pe)}):$("heartbeat","approval_required","Heartbeat profile is enabled, but no scheduler desired state is active yet.",{checked_hosts:e.hosts.map(pe)},[Et("heartbeat-enable","heartbeat","approval_required","Create/reconcile recurring heartbeat schedule.",`nativesoul schedule reconcile --host ${e.host} --mode leader --apply`,!0,"Recurring automation requires explicit approval.")])}function Hf(e){return e.profile?e.profile.recall_auto_trigger?$("recall_auto_trigger","active","Automatic recall trigger is enabled in the activation profile.",{keywords:e.profile.recall_auto_trigger_keywords,denylist:e.profile.recall_auto_trigger_denylist,auto_promotion_threshold:e.profile.candidate_auto_promotion_threshold}):$("recall_auto_trigger","approval_required","Automatic recall trigger is intentionally disabled until explicit approval.",{recall_auto_trigger:!1},[Et("recall-auto-trigger","recall_auto_trigger","approval_required","Set recall_auto_trigger=true in activation profile.","state/activation-profile.json:recall_auto_trigger",!0,"Prompt injection into host sessions must be explicitly approved.")]):$("recall_auto_trigger","not_configured","No activation profile is present.",{})}function Df(e){if(!e.profile||!e.profile.memory_candidates)return $("memory_candidate_hooks","not_configured","Memory candidate hooks are not enabled in the activation profile.",{});let t=e.hosts.every(r=>r.provider_parity.hooks==="unsupported-native");return $("memory_candidate_hooks",t?"degraded":"active",t?"Memory candidates are enabled, but hooks are not native on every selected host.":"Memory candidate capture is enabled with candidate-only policy.",{memory_candidate_policy:e.profile.memory_candidate_policy,hook_modes:Object.fromEntries(e.hosts.map(r=>[pe(r),r.provider_parity.hooks]))})}function $f(e){return e.profile?e.profile.auto_promotion?$("memory_promotion_policy","active","Automatic promotion is enabled by activation policy.",{promotion_policy:e.profile.promotion_policy,candidate_auto_promotion_threshold:e.profile.candidate_auto_promotion_threshold,sensitive_auto_promotion_allowed:!1}):$("memory_promotion_policy","approval_required","Memory promotion requires explicit approval.",{auto_promotion:!1,promotion_policy:e.profile.promotion_policy}):$("memory_promotion_policy","not_configured","No activation profile is present.",{})}function Ff(e){let t=new Set(e.hosts.map(o=>o.host)).size,r=e.hosts.reduce((o,a)=>o+a.cross_host_inventory_summary.ready_other_hosts,0);return t>1&&e.hosts.every(o=>o.status==="ready")?$("cross_host_verification","active","Multiple selected hosts were verified by deep doctor.",{host_count:t,ready_other_hosts:r}):$("cross_host_verification",r>0?"degraded":"approval_required","Cross-host verification needs an all-host deep doctor pass before full activation claims.",{host_count:t,ready_other_hosts:r},[Et("cross-host-verify","cross_host_verification","approval_required","Run all-host deep verification.","nativesoul doctor --deep --all-hosts --json",!1,"Verification is read-only but must be run against every host.")])}function $(e,t,r,o,a=[]){return{key:e,status:t,summary:r,evidence:o,plan_actions:a}}function Et(e,t,r,o,a,n,s){return{id:e,component:t,status:r,action:o,target:a,dry_run:!0,requires_user_confirmed:n,reason:s}}function Uf(e){let t=e.map(r=>r.status);return t.includes("blocked_by_host")?"blocked_by_host":t.includes("degraded")?"degraded":t.includes("approval_required")?"approval_required":t.includes("not_configured")?"not_configured":"active"}function Vf(e,t,r){return{overall_status:t,profile:e?.profile??null,active:Hr(r,"active"),not_configured:Hr(r,"not_configured"),approval_required:Hr(r,"approval_required"),blocked_by_host:Hr(r,"blocked_by_host"),degraded:Hr(r,"degraded"),full_native_claimed:!1}}function Hr(e,t){return e.filter(r=>r.status===t).length}function pe(e){return e.surface==="default"?e.host:`${e.host}:${e.surface}`}import{existsSync as Bf}from"node:fs";import Jf from"node:path";async function Dr(e){let t=g(e),r=[],o=["AGENTS.md","SOUL.md","IDENTITY.md","USER.md","POLICY.md","MEMORY.md","HEARTBEAT.md","config.yaml"];for(let n of o)await k(Jf.join(t.home,n))||r.push({code:"MISSING_HUMAN_FILE",severity:"warn",message:`${n} is missing`,remediation:"Run nativesoul init"});if(!Bf(t.database))return r.push({code:"MISSING_DATABASE",severity:"error",message:"SQLite state database is missing",remediation:"Run nativesoul init"}),{home:t.home,healthy:!1,integrity:"missing",issues:r};let a=(()=>{let n=v(t.database,{readOnly:!0});try{return n.integrityCheck()}finally{n.close()}})();a!=="ok"&&r.push({code:"SQLITE_INTEGRITY",severity:"error",message:`SQLite integrity check returned ${a}`,remediation:"Restore from backup or rebuild the workspace"}),r.push(...qf(t.home,t.database));try{await f({home:t.home,type:"doctor_completed",details:{integrity:a,issueCount:r.length}})}catch{}return{home:t.home,healthy:r.every(n=>n.severity!=="error"),integrity:a,issues:r}}function qf(e,t){let r=ne(process.cwd(),e),o=v(t,{readOnly:!0});try{let a=new Set(o.listMemories({limit:200,includeForgotten:!0}).map(n=>n.scope.project).filter(n=>n!==r.id));return a.size===0?[]:[{code:"PROJECT_ID_RECONCILE_AVAILABLE",severity:"info",message:`Found ${a.size} memory project id(s) different from normalized current project ${r.id}.`,remediation:"Review with nativesoul memory export --project <old-id>; a future reconcile command will migrate aliases after approval."}]}finally{o.close()}}import we from"node:os";import J from"node:path";function id(e){switch(e){case"grok":return"Agents.md";case"codex":return"AGENTS.md";case"claude":return"CLAUDE.md";case"antigravity":case"gemini":return"GEMINI.md"}}function ld(e){return e==="claude"?".claude.json":e==="gemini"?"settings.json":e==="antigravity"?"mcp_config.json":"mcp.json"}function $r(e,t){if(t==null||t==="default")return e==="claude"?"claude-code":"default";if(e!=="claude")throw new Error(`--surface ${t} is only supported for --host claude`);return t}function Fe(e,t){return t&&t!=="default"?[$r(e,t)]:e==="claude"?["claude-code","claude-desktop"]:["default"]}function xt(e,t){return t==="default"?e:t}function cd(e){switch(e){case"codex":return J.join(we.homedir(),".codex","AGENTS.md");case"claude":return J.join(we.homedir(),".claude","CLAUDE.md");case"grok":return J.join(we.homedir(),".grok","Agents.md");case"antigravity":case"gemini":return J.join(we.homedir(),".gemini","GEMINI.md")}}function ra(e){switch(e){case"codex":return J.join(we.homedir(),".codex","mcp.json");case"claude":return J.join(we.homedir(),".claude.json");case"grok":return J.join(we.homedir(),".grok","mcp.json");case"antigravity":return J.join(we.homedir(),".gemini","antigravity-cli","mcp_config.json");case"gemini":return J.join(we.homedir(),".gemini","settings.json")}}function dd(){return ud({platform:process.platform,home:we.homedir(),env:process.env})}function ud(e){let t=e.platform==="win32"?J.win32:J.posix;if(e.platform==="darwin")return t.join(e.home,"Library","Application Support","Claude","claude_desktop_config.json");if(e.platform==="win32"){let o=e.env?.APPDATA&&e.env.APPDATA.trim().length>0?e.env.APPDATA:t.join(e.home,"AppData","Roaming");return t.join(o,"Claude","claude_desktop_config.json")}let r=e.env?.XDG_CONFIG_HOME&&e.env.XDG_CONFIG_HOME.trim().length>0?e.env.XDG_CONFIG_HOME:t.join(e.home,".config");return t.join(r,"Claude","claude_desktop_config.json")}function pd(e,t){if(e!=="claude")return null;if(!t)return J.join(we.homedir(),".claude","mcp.json");let r=J.resolve(t),o=J.dirname(r);return J.basename(o)==="claude"?J.join(o,"mcp.json"):J.join(o,".claude","mcp.json")}import{mkdir as md,rename as Kf,writeFile as fd}from"node:fs/promises";import me from"node:path";var Gf=["entity","soul","human","collaboration","continuity"],Wf=["SOUL.md","POLICY.md"],hd=new Set(["IDENTITY.md","SOUL.md","USER.md","AGENTS.md"]),Wt=64*1024,zf="<!-- nativesoul:start v1 -->",gd="<!-- nativesoul:end -->",Xf={"IDENTITY.md":{writable:!0,requires_user_confirmed:!1,required_fields:["Name","Creature","Role","Vibe","Emoji","Mission"],field_format:"- **Field:** value (Markdown list)",merge_strategy:"replace",max_bytes:Wt},"SOUL.md":{writable:!0,requires_user_confirmed:!0,required_sections:["Core truths","Boundaries","Vibe","Continuity"],field_format:"Prose Markdown sections \u2014 not template slot-fill",merge_strategy:"replace",max_bytes:Wt},"USER.md":{writable:!0,requires_user_confirmed:!1,required_fields:["Name","What to call them","Timezone","Languages"],field_format:"- **Field:** value (Markdown list)",merge_strategy:"replace",max_bytes:Wt},"AGENTS.md":{writable:!0,requires_user_confirmed:!1,required_sections:["Session start","Safety"],field_format:"Operating instructions in Markdown",merge_strategy:"merge_managed_block",max_bytes:Wt},"POLICY.md":{writable:!1,requires_user_confirmed:!1,field_format:"Use policy propose-change after onboarding",merge_strategy:"replace",max_bytes:0}};async function Fr(e){let t=await b(e),o=(await ce(t.home,"BOOTSTRAP.md")).trim().length>0;return{ritual_pending:o,files_present:{soul:await k(me.join(t.home,"SOUL.md")),identity:await k(me.join(t.home,"IDENTITY.md")),user:await k(me.join(t.home,"USER.md")),agents:await k(me.join(t.home,"AGENTS.md")),bootstrap:await k(me.join(t.home,"BOOTSTRAP.md"))},protected_targets:[...Wf],writable_files:[...hd],interview_themes:[...Gf],instruction_doc:"llm-install.txt",apply_defaults:{dry_run:!0,user_confirmed:!1},file_generation_rules:Xf,activation:await ad(t.home,o)}}async function Ur(e){let t=await b(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,a=[],n=[];for(let[s,i]of Object.entries(e.files)){let l=s.trim(),c=l.toUpperCase();if(c==="POLICY.MD"){a.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:"POLICY_VIOLATION: POLICY.md requires proposal flow"});continue}if(!hd.has(l)){a.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:`UNSUPPORTED_FILE: ${l}`});continue}if(c==="SOUL.MD"&&!o){a.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:"POLICY_VIOLATION: SOUL.md requires user_confirmed: true"});continue}let d=typeof i=="string"?i:"";if(Buffer.byteLength(d,"utf8")>Wt){a.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:`FILE_TOO_LARGE: ${l} exceeds ${Wt} bytes`});continue}let p=me.join(t.home,l),h=await ce(t.home,l),y=l==="AGENTS.md"?Yf(h,d):d,w=h.length>0?S(h):null,R=S(y);if(w===R){a.push({file:l,action:"noop",before_hash:w,after_hash:R});continue}let H=h.length===0?"create":"update";a.push({file:l,action:H,before_hash:w,after_hash:R}),r||await fd(p,y,{encoding:"utf8",mode:384})}return!r&&e.config_patch?.hosts?.length&&n.push(`CONFIG_PATCH_NOT_APPLIED_V1: hosts=${e.config_patch.hosts.join(",")}`),r||await f({home:t.home,type:"onboarding.applied",details:{user_confirmed:o,files:a.map(s=>({file:s.file,action:s.action}))}}),{dry_run:r,applied:!r,user_confirmed:o,files:a,warnings:n}}async function Vr(e){let t=g(e?.home),r=me.join(t.home,"BOOTSTRAP.md");if(!await k(r))return{already_complete:!0,archived_bootstrap:!1,archive_path:null};let o=e?.archive!==!1,a=null;if(o){let s=me.join(t.home,"memory","archive");await md(s,{recursive:!0,mode:448});let i=new Date().toISOString().replace(/[:.]/gu,"-");a=me.join(s,`bootstrap-${i}.md`),await Kf(r,a)}else{let{rm:s}=await import("node:fs/promises");await s(r,{force:!0})}let n=me.join(t.home,"state","onboarding.complete");return await md(me.join(t.home,"state"),{recursive:!0,mode:448}),await fd(n,`${new Date().toISOString()}
795
- `,{encoding:"utf8",mode:384}),await f({home:t.home,type:"onboarding.completed",details:{archived:o,archive_path:a}}),{already_complete:!1,archived_bootstrap:o,archive_path:a}}function oa(e){return me.join(e,"state","onboarding.complete")}function Yf(e,t){let r=t.trim();if(!e.trim())return`${r}
796
- `;if(e.includes(r))return e;let o=Qf(e);if(o){let n=o.after.trimEnd(),s=n.length>0?`${n}
849
+ `).filter((t,r,o)=>r<o.length-1||t.length>0)}function Cd(e,t,r){let o=e.join(t);return r||e.length>0?`${o}${t}`:o}function Nd(e){return/^[A-Za-z0-9._/-]+$/u.test(e)?e:JSON.stringify(e)}import Bd from"node:path";var bh={minLength:1,removeStopwords:!1,normalizeDiacritics:!1};function dn(e,t={}){let r={...bh,...t},o=r.normalizeDiacritics?e.normalize("NFKD").replace(new RegExp("\\p{Diacritic}","gu"),""):e;return Array.from(new Set(o.toLowerCase().match(/[\p{L}\p{N}_-]+/gu)?.filter(n=>n.length>=r.minLength).filter(n=>!r.removeStopwords||!vh.has(n))??[]))}function Vr(e,t={}){return new Set(dn(e,t))}function ia(e,t){let r=dn(e);if(r.length===0)return 0;let o=Vr(t),n=r.filter(s=>o.has(s)).length;return Number((n/r.length).toFixed(6))}function Ld(e,t,r={}){let o=Vr(e,r),n=Vr(t,r);if(o.size===0||n.size===0)return 0;let s=[...o].filter(i=>n.has(i)).length,a=new Set([...o,...n]).size;return Number((s/a).toFixed(6))}function Dd(e,t){let r=Math.min(e.length,t.length),o=0;for(let n=0;n<r;n+=1)o+=(e[n]??0)*(t[n]??0);return Number(Math.max(o,0).toFixed(6))}var vh=new Set(["the","and","for","with","this","that","uma","com","para","por","que","deve","esta","este","essa","isso"]);var et=1,tt="local-hash",rt="local-hash-bow-v1";async function la(e={}){let t=await v(e.home),r=Math.min(Math.max(e.limit??1e3,1),1e4),o=_(t.database),n,s=[],a=0,i=0;try{n=o.listSemanticIndexableMemories({limit:r});let l=new Date().toISOString();for(let c of n){let d=kh(c),p=o.getSemanticIndex(c.id);if(p&&p.content_hash===d.contentHash&&p.provider_id===tt&&p.model_id===rt&&p.schema_version===et){a+=1;continue}d.redacted&&(i+=1),s.push({memory_id:c.id,scope_project:c.scope.project,source:c.source,schema_version:et,provider_id:tt,model_id:rt,content_hash:d.contentHash,embedding:Fd(d.text),indexed_text:d.text,indexed_at:l})}s.length>0&&o.upsertSemanticIndex(s)}finally{o.close()}return await h({home:t.home,type:"semantic_index_built",details:{provider_id:tt,model_id:rt,schema_version:et,indexable_count:n.length,indexed_count:s.length,skipped_unchanged:a,redacted_count:i}}),{provider_id:tt,model_id:rt,schema_version:et,indexable_count:n.length,indexed_count:s.length,skipped_unchanged:a,redacted_count:i}}function $d(e){let t=_(e,{readOnly:!0});try{let r=t.semanticIndexStats({providerId:tt,modelId:rt,schemaVersion:et});return{provider_id:tt,model_id:rt,schema_version:et,available:!0,indexable_count:r.indexable_count,indexed_count:r.indexed_count,stale_count:r.stale_count,healthy:r.stale_count===0,remediation:r.stale_count===0?null:"Run nativesoul memory index"}}finally{t.close()}}function Br(e){let t=_(e.database,{readOnly:e.readOnly}),r=Math.min(Math.max(e.limit,1),8);try{let o=t.searchMemories(e.query,e.project,r),n=t.semanticIndexStatsForProject({project:e.project,providerId:tt,modelId:rt,schemaVersion:et});if(n.indexable_count===0||n.indexed_count===0||n.stale_count>0)return{mode:"fts",reason:n.stale_count>0?"semantic_index_stale":"semantic_index_unavailable",memories:Hd(o.length>0?o:t.recentMemories(e.project,r),e.query)};let s=t.listCurrentSemanticIndexesForProject({project:e.project,providerId:tt,modelId:rt,schemaVersion:et,limit:1e3}),a=t.listActiveMemoriesForProject(e.project,1e3),i=new Map(a.map(p=>[p.id,p])),l=new Map(o.map(p=>[p.id,ia(e.query,`${p.summary}
850
+ ${p.content}`)])),c=Fd(e.query),d=s.map(p=>{let g=i.get(p.memory_id);if(!g)return null;let y=l.get(g.id)??0,k=Dd(c,p.embedding);return{memory:g,ftsScore:y,semanticScore:k,score:Number((y*.55+k*.45).toFixed(6))}}).filter(p=>p!==null).filter(p=>p.ftsScore>0||p.semanticScore>0).sort((p,g)=>g.score-p.score||g.semanticScore-p.semanticScore||p.memory.id.localeCompare(g.memory.id)).slice(0,r).map((p,g)=>({...p.memory,recall:{mode:"hybrid",fts_score:p.ftsScore,semantic_score:p.semanticScore,final_rank:g+1,reason:p.ftsScore>0&&p.semanticScore>0?"fts_and_semantic":p.semanticScore>0?"semantic_neighbor":"fts_match"}}));return{mode:"hybrid",reason:"semantic_index_ready",memories:d.length>0?d:Hd(o,e.query)}}finally{t.close()}}function kh(e){let t=O(`${e.summary}
851
+
852
+ ${e.content}`);return{text:t.value,contentHash:e.hash,redacted:t.redacted}}function Fd(e){let r=Array.from({length:32},()=>0);for(let n of dn(e)){let s=wh(n),a=s%32,i=s%2===0?1:-1;r[a]=(r[a]??0)+i}let o=Math.hypot(...r)||1;return r.map(n=>Number((n/o).toFixed(6)))}function Hd(e,t){return e.map((r,o)=>({...r,recall:{mode:"fts",fts_score:ia(t,`${r.summary}
853
+ ${r.content}`),semantic_score:0,final_rank:o+1,reason:"fts_fallback"}}))}function wh(e){let t=2166136261;for(let r=0;r<e.length;r+=1)t^=e.charCodeAt(r),t=Math.imul(t,16777619);return t>>>0}function Be(e,t=160){let r=e.replace(/\s+/g," ").trim();return r.length<=t?r:`${r.slice(0,t-3)}...`}function Wr(e){return Math.ceil(e.length/4)}function un(e,t){return e.length<=t?e:`${e.slice(0,Math.max(t-3,0))}...`}var wt=class extends Error{code="MEMORY_TRANSITION_BLOCKED";id;from;to;constructor(t){super(`Invalid memory transition for ${t.id}: ${t.from} -> ${t.to}`),this.name="MemoryTransitionError",this.id=t.id,this.from=t.from,this.to=t.to}},Rh=new Map([["candidate",new Set(["active","rejected"])],["active",new Set(["forgotten","expired"])],["superseded",new Set],["rejected",new Set],["forgotten",new Set],["expired",new Set]]);async function ca(e,t){let r=await v(e),o=await qd(r.database,t,"active");return await h({home:r.home,type:"memory_added",details:{id:o.id,project:o.scope.project,redacted:o.sensitivity==="restricted"}}),o}async function ae(e,t){let r=await v(e),o=await qd(r.database,t,"candidate");return await h({home:r.home,type:"memory_proposed",details:{id:o.id,project:o.scope.project,redacted:o.sensitivity==="restricted"}}),o}async function da(e){let t=await v(e.home),r=Bd.resolve(e.cwd);await Ur({cwd:r,home:t.home});let o=L(r,t.home),n=e.event?.trim()||"session-end",s=Sh(e.text,e.payload),a=[`Session memory candidate from ${e.host} ${n} hook.`,"",`Project: ${o}`,`CWD: ${r}`,"","Summary:",s.text].join(`
854
+ `),i=await ae(t.home,{project:o,content:a,confidence:s.source==="stub"?.2:.45,authority:"hook_observed",source:{kind:"session_end_hook",host:e.host,event:n,cwd:r,summary_source:s.source}});return{proposed:!0,host:e.host,event:n,cwd:r,project:o,memory:i,summary_source:s.source}}function Sh(e,t){let r=e?.trim();if(r)return{text:Ud(r),source:"text"};let o=Ah(t);return o?{text:Ud(o),source:"payload"}:{text:"No host session summary was supplied. Review this candidate against the recent session before promotion.",source:"stub"}}function Ah(e){if(typeof e=="string")return e.trim()||null;if(!e||Array.isArray(e)||typeof e!="object")return null;for(let t of["summary","session_summary","transcript_summary","conversation_summary","text","content"]){let r=e[t];if(typeof r=="string"&&r.trim().length>0)return r.trim()}return null}function Ud(e){return e.length<=8e3?e:`${e.slice(0,7997)}...`}async function ua(e){let t=await v(e.home),r=Bd.resolve(e.cwd),o=L(r,t.home),n=await Eh(t.home),s=Wd(e.prompt,n),a=Math.min(Math.max(e.limit??3,1),3),i=[];if(s.triggered){let l=Br({database:t.database,query:s.query,project:o,limit:a});i=l.memories,await h({home:t.home,type:"memory_recalled",details:{host:e.host,project:o,reason:s.reason,query:s.query,count:i.length,recall_mode:l.mode,recall_reason:l.reason}})}return{host:e.host,cwd:r,project:o,prompt:e.prompt,decision:s,memories:i,context:Ph(i,s)}}function Wd(e,t=Jd()){let r=e.trim(),o=r.toLowerCase();if(!t.autoTrigger)return{triggered:!1,reason:"auto_trigger_disabled",denied:!1,auto_trigger:!1,query:r};if(r.length===0)return{triggered:!1,reason:"empty_prompt",denied:!0,auto_trigger:!0,query:r};let n=t.denylist.find(a=>o===a||o.startsWith(`${a} `));if(n)return{triggered:!1,reason:`denylist:${n}`,denied:!0,auto_trigger:!0,query:r};let s=t.keywords.find(a=>o.includes(a));return s?{triggered:!0,reason:`keyword:${s}`,denied:!1,auto_trigger:!0,query:r}:{triggered:!1,reason:"no_trigger",denied:!1,auto_trigger:!0,query:r}}function Jd(){return{autoTrigger:!1,keywords:["como combinamos","como decidimos","o que combinamos","decisao anterior","decis\xE3o anterior","prior decision","previous decision","remember","lembr","memoria","mem\xF3ria","contexto anterior","last time"],denylist:["lint","format","typecheck","test","build"]}}async function Eh(e){let t=Jd(),r=await me(e,"config.yaml"),o=r.match(/^\s*auto_trigger:\s*(true|false)\s*$/imu);o?.[1]&&(t.autoTrigger=o[1].toLowerCase()==="true");let n=Vd(r,"keywords");n.length>0&&(t.keywords=n.map(a=>a.toLowerCase()));let s=Vd(r,"denylist");return s.length>0&&(t.denylist=s.map(a=>a.toLowerCase())),t}function Vd(e,t){let r=e.split(/\r?\n/u),o=[],n=!1;for(let s of r){if(new RegExp(`^\\s*${t}:\\s*$`,"u").test(s)){n=!0;continue}if(!n)continue;let a=s.match(/^\s*-\s*["']?(.+?)["']?\s*$/u)?.[1];if(a){o.push(a.trim());continue}if(/^\s*\S/u.test(s))break}return o}function Ph(e,t){if(!t.triggered||e.length===0)return"";let r=["## NativeSoul Memory Recall",`Trigger: ${t.reason}`,""];for(let o of e)r.push(`- ${o.summary}`);return r.join(`
855
+ `).slice(0,1800)}async function Rt(e,t){return pn(e,t,"active","memory_promoted")}async function St(e,t){return pn(e,t,"rejected","memory_rejected")}async function At(e,t){return pn(e,t,"forgotten","memory_forgotten")}async function Jr(e,t){return pn(e,t,"expired","memory_expired")}async function Et(e){let t=await v(e.home),r=_(t.database),o;try{o=r.listMemories({project:e.project,status:e.status,includeForgotten:e.includeForgotten,limit:Math.min(Math.max(e.limit??100,1),1e3)})}finally{r.close()}return await h({home:t.home,type:"memory_exported",details:{project:e.project??null,status:e.status??null,includeForgotten:e.includeForgotten===!0,count:o.length}}),o}async function qd(e,t,r){let o=O(t.content),n=new Date().toISOString(),s=Be(o.value),a={id:T("mem"),type:t.type??"note",scope:{user:"default",project:t.project},content:o.value,summary:s,source:t.source??{host:"cli",session_id:"local"},confidence:t.confidence??.9,authority:t.authority??"user_explicit",sensitivity:o.redacted?"restricted":t.sensitivity??"internal",status:r,created_at:n,expires_at:null,hash:ke({type:t.type??"note",project:t.project,content:o.value,status:r,created_at:n})},i=_(e);try{i.insertMemory(a)}finally{i.close()}return a}async function pn(e,t,r,o){let n=await v(e),s=_(n.database),a,i;try{if(a=s.getMemory(t),a&&!mn(a.status,r))throw new wt({id:t,from:a.status,to:r});i=a?s.updateMemoryStatus(t,r):null}catch(l){throw l instanceof wt&&await xh({home:n.home,id:l.id,from:l.from,to:l.to}),l}finally{s.close()}if(!i)throw new Error(`Memory not found: ${t}`);return await h({home:n.home,type:o,details:{id:i.id,project:i.scope.project,status:r}}),i}function mn(e,t){return Rh.get(e)?.has(t)??!1}async function xh(e){await h({home:e.home,type:"memory_transition_blocked",result:"blocked",details:{id:e.id,from:e.from,to:e.to,code:"MEMORY_TRANSITION_BLOCKED"}})}async function Pt(e,t,r,o=5){let n=await v(e),s=Br({database:n.database,query:t,project:r,limit:Math.min(Math.max(o,1),8)});return await h({home:n.home,type:"memory_searched",details:{query:t,project:r,count:s.memories.length,recall_mode:s.mode,recall_reason:s.reason}}),s.memories}async function pa(e){let t=f(e.home),r=null;try{r=_(t.database);let o=r.upsertProject({id:e.resolution.id,display_name:e.resolution.id,base_id:e.resolution.base_id,source:e.resolution.source,first_basis:Kd(e.resolution),status:"active",now:e.now});return r.close(),r=null,o.inserted&&await h({home:t.home,type:"project_seen",details:{id:e.resolution.id,base_id:e.resolution.base_id,source:e.resolution.source,first_basis:Kd(e.resolution)}}),{touched:!0,inserted:o.inserted,degraded:!1,warning:null}}catch(o){return{touched:!1,inserted:!1,degraded:!0,warning:`PROJECT_REGISTRY_UNAVAILABLE:${Oh(o)}`}}finally{r?.close()}}async function ma(e={}){let t=f(e.home),r=Th(e.limit),o=e.status??"active";if(!await R(t.database))return{registry_available:!1,status:o,limit:r,projects:[],warning:"database_not_available"};let n=_(t.database,{readOnly:e.readOnly??!0});try{let s=n.listProjectsWithCounts({status:o,limit:r});return{registry_available:s.available,status:o,limit:r,projects:s.projects,warning:s.warning}}finally{n.close()}}async function ga(e){let t=f(e.home),r=e.id==="."?jh(e.cwd??process.cwd(),t.home):Ih(e.id);if(!await R(t.database))return Gd(e.id,r,"database_not_available");let o=_(t.database,{readOnly:e.readOnly??!0});try{let n=o.getProjectDetail(r.id);if(!n.available)return Gd(e.id,r,n.warning);let s=n.detail;return{registry_available:!0,requested:e.id,effective_id:r.id,registry:s?.project??null,live_resolution:r,counts:s?.counts??null,derived_last_seen_at:s?.derived_last_seen_at??null,continuity_gap:!!(s?.project&&s.project.base_id!==r.id),warning:s?.project?null:"project_not_found"}}finally{o.close()}}async function fa(e){let t=f(e.home),r=Ch(e.name),o=e.id==="."?te(e.cwd??process.cwd(),t.home).id:e.id,n=_(t.database),s;try{s=n.renameProject(o,r)}finally{n.close()}return s.found&&s.previous&&s.project&&await h({home:t.home,type:"project_renamed",details:{id:o,old_name:s.previous.display_name,new_name:r}}),{found:s.found,id:o,old_name:s.previous?.display_name??null,new_name:r,project:s.project}}async function ha(e){let t=f(e.home),r=e.includeMemories===!0,o=e.apply===!0,n=e.confirm??null,s=!r||o&&n===e.id,a=_(t.database);try{let i=a.getProject(e.id);if(!i)return gn({found:!1,id:e.id,mode:r?"forget_memories":"archive",applied:!1,guardOk:s,confirm:n,previousStatus:null,statusAfter:null,memoriesAffected:0,project:null,warning:"project_not_found"});if(r&&!s)return gn({found:!0,id:e.id,mode:"forget_memories",applied:!1,guardOk:s,confirm:n,previousStatus:i.status,statusAfter:i.status,memoriesAffected:a.countProjectMemories(e.id),project:i,warning:"requires --apply --confirm <id>"});if(r)try{let c=a.forgetProjectMemories(e.id,mn);return c.found&&c.project&&await h({home:t.home,type:"project_forgotten",details:{id:e.id,memories_affected:c.memories_affected}}),gn({found:c.found,id:e.id,mode:"forget_memories",applied:c.found,guardOk:s,confirm:n,previousStatus:c.previous?.status??null,statusAfter:c.project?.status??null,memoriesAffected:c.memories_affected,project:c.project,warning:c.found?null:"project_not_found"})}catch(c){throw c instanceof Gt&&await h({home:t.home,type:"memory_transition_blocked",result:"blocked",details:{id:c.id,from:c.from,to:c.to,code:c.code,project:e.id}}),c}let l=a.archiveProject(e.id);return l.found&&l.project&&await h({home:t.home,type:"project_archived",details:{id:e.id}}),gn({found:l.found,id:e.id,mode:"archive",applied:l.found,guardOk:s,confirm:n,previousStatus:l.previous?.status??null,statusAfter:l.project?.status??null,memoriesAffected:0,project:l.project,warning:l.found?null:"project_not_found"})}finally{a.close()}}async function ya(e){let t=f(e.home),r=_(t.database),o;try{o=r.reactivateProject(e.id)}finally{r.close()}return o.found&&o.project&&await h({home:t.home,type:"project_reactivated",details:{id:e.id}}),{found:o.found,id:e.id,previous_status:o.previous?.status??null,status_after:o.project?.status??null,project:o.project}}async function _a(e={}){return{aliases:sa(f(e.home).home)}}async function ba(e){let t=f(e.home),r=await aa({home:t.home,action:"add",aliasKey:Xd(e.alias),projectId:Nh(e.id),apply:e.apply});return r.applied&&r.changed&&await h({home:t.home,type:"project_alias_set",details:{alias_key:r.alias_key,project_id:r.project_id,previous_project_id:r.previous_id}}),r}async function va(e){let t=f(e.home),r=await aa({home:t.home,action:"remove",aliasKey:Xd(e.alias),apply:e.apply});return r.applied&&r.changed&&await h({home:t.home,type:"project_alias_removed",details:{alias_key:r.alias_key,previous_project_id:r.previous_id}}),r}function Kd(e){return e.remote??e.git_root??e.cwd}function jh(e,t){let r=te(e,t);return{id:r.id,source:r.source,cwd:r.cwd,git_root:r.git_root,remote:r.remote,base_id:r.base_id,alias_key:r.alias_key,marker_path:r.marker_path}}function Ih(e){return{id:e,source:"explicit",cwd:null,git_root:null,remote:null,base_id:null,alias_key:null,marker_path:null}}function Gd(e,t,r){return{registry_available:!1,requested:e,effective_id:t.id,registry:null,live_resolution:t,counts:null,derived_last_seen_at:null,continuity_gap:!1,warning:r}}function Th(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),500)}function Ch(e){let t=e.trim();if(t.length===0)throw new Error("project rename requires a non-empty --name");return t.slice(0,160)}function Xd(e){let t=e.trim();if(t.length===0)throw new Error("project alias requires a non-empty alias");return t}function Nh(e){let t=e.trim();if(t.length===0||t===".")throw new Error("project alias add requires an explicit project id");return t}function gn(e){return{found:e.found,id:e.id,mode:e.mode,applied:e.applied,dry_run:!e.applied,guard_ok:e.guardOk,required_confirm:e.mode==="forget_memories"?e.id:null,confirm:e.confirm,previous_status:e.previousStatus,status_after:e.statusAfter,memories_affected:e.memoriesAffected,project:e.project,warning:e.warning}}function Oh(e){return(e instanceof Error?e.message:String(e)).replace(/[^a-zA-Z0-9_.:-]+/g,"_").slice(0,120)}var Mh=/^-\s*\*\*([^:*]+):\*\*\s*(.*)$/u;function xt(e,t){let r=Lh(e,t);if(r)return r;let o=e.split(/\r?\n/u);for(let n=0;n<o.length;n+=1){let a=(o[n]?.trim()??"").match(Mh);if(!a||a[1]?.trim()!==t)continue;let i=a[2]?.trim()??"";if(i.length>0&&!i.startsWith("_("))return i;for(let l=n+1;l<o.length;l+=1){let c=o[l]?.trim()??"";if(!c||c.startsWith("#")||c.startsWith("- **"))break;if(!c.startsWith("_("))return c}}return null}function zd(e,t=200){let r=e.split(/\r?\n/u).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#")&&!o.startsWith("---")&&!o.startsWith("_")).join(" ").replace(/\s+/g," ").trim();return r.length<=t?r:`${r.slice(0,t-3)}...`}function Yd(e,t=1600){let r=e.split(/\r?\n/u).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("---")&&!o.startsWith("_")).map(o=>o.replace(/^#+\s*/u,"").replace(/^-\s*/u,"")).join(" ").replace(/\s+/g," ").trim();return r.length<=t?r:`${r.slice(0,t-3)}...`}function Lh(e,t){let r=`${t}:`,o=e.split(/\r?\n/u).map(n=>n.trim()).find(n=>n.startsWith(r));return o?o.slice(r.length).trim():null}async function It(e){let t=e.readOnly?f(e.home):await v(e.home),r=await $h(t.home),o=Math.min(Math.max(e.tokensMax??r.defaultTokens,1),3e3),n=[];e.readOnly!==!0&&await Ur({cwd:e.cwd,home:t.home});let s=te(e.cwd,t.home),a=s.id;if(e.readOnly!==!0){let V=await pa({home:t.home,resolution:s});V.warning&&n.push(V.warning)}let i=Fh({explicitQuery:e.query,project:a,host:e.host,cwd:e.cwd,seed:r.memoryQuerySeed}),l=await Dh({database:t.database,readOnly:e.readOnly===!0,memoryQuery:i,project:a,limit:r.recallLimit,warnings:n}),c=await Se({home:t.home,host:e.host,readyOnly:!0,limit:8,readOnly:e.readOnly}),d=await Bh(t.home,e.host,e.readOnly===!0),p=await Zs({home:t.home,host:e.host,query:e.query??`${jt.basename(e.cwd)} ${e.host}`,limit:8,readOnly:e.readOnly}),g=await $r({home:t.home,project:a,status:"open",limit:8,readOnly:e.readOnly}),y=await me(t.home,"IDENTITY.md"),k=await me(t.home,"SOUL.md"),S=await me(t.home,"AGENTS.md"),U=await me(t.home,"USER.md"),Q=await me(t.home,"BOOTSTRAP.md"),je=new Date().toISOString().slice(0,10),be=jt.join(t.home,"memory","daily",`${je}.md`);n.push(...d?[]:[`HOST_ADAPTER_UNAVAILABLE:${e.host}`,"CAPABILITY_REFRESH_STALE"],...p.warnings),!await R(jt.join(t.home,"state","onboarding.complete"))&&Q.trim().length>0&&n.push("BOOTSTRAP_RITUAL_PENDING"),await R(be)&&n.push(`DAILY_MEMORY_AVAILABLE:${be}`),r.warnEmptyMemories&&l.length===0&&n.push("PROJECT_MEMORY_EMPTY");let Ie={bootstrap_schema:2,identity:{name:xt(y,"Name")??"NativeSoul",mission:xt(y,"Mission")??"Provide local continuity across native coding-agent hosts.",creature:xt(y,"Creature"),role:xt(y,"Role"),vibe:xt(y,"Vibe"),emoji:xt(y,"Emoji")},soul_summary:zd(k||"Continuity, clarity, and safe local-first operation.",500),agents_operating_summary:Yd(S||"Load NativeSoul context before continuity-sensitive work. Use MCP when available and CLI fallback when needed."),tool_hints:Uh(),user:{preferences_summary:Vh(U)},project:{id:a,cwd:jt.resolve(e.cwd),state:"local-bootstrap"},commitments:g.map(V=>({id:V.id,status:V.status,summary:V.summary,due_at:V.due_at,ttl_expires_at:V.ttl_expires_at})),relevant_memories:l.map(V=>({id:V.id,summary:V.summary,scope:V.scope})),capabilities:c.map(V=>({uid:V.uid,host:V.host,ready:V.ready,source:V.source})),capability_cards:p.cards,policy:{mode:"safe",approval_required:["external_write","destructive","identity_policy_change"]},warnings:n},x=Wh(Ie,o),kr=Wr(JSON.stringify(x)),Qn={...x,context_budget:{tokens_used:kr,tokens_max:o}};return e.readOnly||await h({home:t.home,type:"bootstrap_created",details:{host:e.host,cwd:jt.resolve(e.cwd),project:a,tokens:kr}}),Qn}async function Dh(e){if(!await R(e.database))return e.warnings.push("BOOTSTRAP_DATABASE_MISSING"),[];let t=null;try{t=_(e.database,{readOnly:e.readOnly});let r=Br({database:e.database,query:e.memoryQuery,project:e.project,limit:e.limit,readOnly:e.readOnly}).memories;return r.length===0?t.recentMemories(e.project,e.limit):r}catch(r){return e.warnings.push(`BOOTSTRAP_DATABASE_UNAVAILABLE:${Hh(r)}`),[]}finally{t?.close()}}function Hh(e){return(e instanceof Error?e.message:String(e)).replace(/[^a-zA-Z0-9_.:-]+/g,"_").slice(0,120)}async function $h(e){let t=await me(e,"config.yaml"),r=t.match(/^\s*default_tokens:\s*(\d+)\s*$/mu),o=t.match(/^\s*(?:bootstrap_recall_limit|recall_limit):\s*(\d+)\s*$/mu),n=t.match(/^\s*memory_query_seed:\s*["']?(.+?)["']?\s*$/mu),s=t.match(/^\s*warn_empty_memories:\s*(true|false)\s*$/imu),a=r?.[1]?Number(r[1]):1900,i=o?.[1]?Number(o[1]):5;return{defaultTokens:Number.isFinite(a)?a:1900,recallLimit:Number.isFinite(i)?Math.min(Math.max(i,1),8):5,memoryQuerySeed:n?.[1]?.trim()||null,warnEmptyMemories:s?.[1]?.toLowerCase()==="true"}}function Fh(e){return[e.explicitQuery,e.project,e.host,jt.basename(jt.resolve(e.cwd)),e.seed].filter(t=>typeof t=="string"&&t.trim().length>0).join(" ")}function Uh(){return[{tool:"life_bootstrap",use_when:"Start a new session or refresh NativeSoul identity, project context, memories, and capability cards."},{tool:"life_recall",use_when:"Search local memories for project-specific continuity before making assumptions."},{tool:"life_remember_propose",use_when:"Propose durable memory from user-approved facts, outcomes, or preferences."},{tool:"life_onboarding_status",use_when:"Check whether onboarding is pending before drafting or applying identity files."}]}function Vh(e){let t=e.trim();return t.length===0?"No curated user preferences yet.":t.length<=160?t:`${t.slice(0,157)}...`}async function Bh(e,t,r=!1){let o=await Se({home:e,host:t,includeShared:!1,limit:20,readOnly:r});if(t==="codex"&&!o.some(i=>i.source.startsWith("codex app server ")))return!1;let n=o[0]?.last_seen_at;if(!n)return!1;let s=Date.parse(n);if(!Number.isFinite(s))return!1;let a=1440*60*1e3;return Date.now()-s<=a}function Wh(e,t){let r=[e,ot(e,1200,420,150),ot(e,900,320,130),ot(e,650,240,110),ot(e,420,180,90),ot(e,240,120,80),ka(ot(e,240,120,80),8,8),ka(ot(e,240,120,80),5,5),ka(ot(e,240,120,80),3,3)];return r.find(o=>Wr(JSON.stringify(o))<=t)??r[r.length-1]??e}function ka(e,t,r){return{...e,capabilities:e.capabilities.slice(0,t),capability_cards:e.capability_cards.slice(0,r),relevant_memories:e.relevant_memories.slice(0,t),commitments:e.commitments.slice(0,t)}}function ot(e,t,r,o){return{...e,soul_summary:un(e.soul_summary,r),agents_operating_summary:un(e.agents_operating_summary,t),user:{...e.user,preferences_summary:un(e.user.preferences_summary,o)}}}import{existsSync as za}from"node:fs";import qu from"node:path";import{mkdir as Jh,readFile as qh,writeFile as Qd}from"node:fs/promises";import wa from"node:path";var fn={heartbeat_enabled:!0,scheduler_host:"auto-native-supported",heartbeat_cadence:"daily",memory_candidates:!0,memory_candidate_policy:"candidate",auto_promotion:!1,promotion_policy:"explicit_approval",recall_auto_trigger_keywords:["como combinamos","como decidimos","o que combinamos","decisao anterior","decis\xE3o anterior","prior decision","previous decision","remember","lembr","memoria","mem\xF3ria","contexto anterior","last time"],recall_auto_trigger_denylist:["lint","format","typecheck","test","build"],candidate_auto_promotion_threshold:.6,recall_auto_trigger:!1,standing_order_templates:[]};async function Zd(e,t){let r=await nt(e),o=await R(Zt(e));return{phase:t?"identity_pending":r&&o?"active":"pending",configured:r!==null,complete_marker_present:o,existing_profile:r,available_profiles:["quickstart","advanced"],quickstart_defaults:fn,apply_defaults:{dry_run:!0,user_confirmed:!1,reset:!1}}}async function Ra(e){let t=await v(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,n=e.reset===!0,s=await nt(t.home);if(s&&!n)return{dry_run:r,applied:!1,user_confirmed:o,reset:n,action:"preserved",before:s,after:s,diff:[],warnings:["ACTIVATION_PROFILE_PRESERVED: use reset=true to replace existing activation choices"]};let a=Kh(e.profile,e.options),i=Xh(s,a);if(!r&&!o)return{dry_run:r,applied:!1,user_confirmed:o,reset:n,action:"rejected",before:s,after:a,diff:i,warnings:["ACTIVATION_REQUIRES_USER_CONFIRMED"]};let l=s?i.length===0?"noop":"update":"create";return r||(await Jh(wa.join(t.home,"state"),{recursive:!0,mode:448}),await Qd(eu(t.home),`${JSON.stringify(a,null,2)}
856
+ `,{encoding:"utf8",mode:384}),await Qd(Zt(t.home),`${new Date().toISOString()}
857
+ `,{encoding:"utf8",mode:384}),await h({home:t.home,type:"activation.profile.applied",details:{profile:a.profile,reset:n,diff:i.map(c=>c.field)}})),{dry_run:r,applied:!r,user_confirmed:o,reset:n,action:l,before:s,after:a,diff:i,warnings:[]}}function eu(e){return wa.join(e,"state","activation-profile.json")}function Zt(e){return wa.join(e,"state","activation.complete")}async function nt(e){try{let t=JSON.parse(await qh(eu(e),"utf8"));return zh(t)?t:null}catch{return null}}function Kh(e,t){return{...fn,...Gh(t),profile:e,updated_at:new Date().toISOString()}}function Gh(e){if(!e)return{};if(e.candidate_auto_promotion_threshold!==void 0){let t=e.candidate_auto_promotion_threshold;if(!Number.isFinite(t)||t<0||t>1)throw new Error("Invalid candidate_auto_promotion_threshold: expected a number between 0 and 1")}if(e.promotion_policy!==void 0&&e.promotion_policy!=="manual"&&e.promotion_policy!=="explicit_approval")throw new Error("Invalid promotion_policy: expected manual or explicit_approval");if(e.memory_candidate_policy!==void 0&&e.memory_candidate_policy!=="candidate"&&e.memory_candidate_policy!=="off")throw new Error("Invalid memory_candidate_policy: expected candidate or off");if(e.recall_auto_trigger_keywords!==void 0&&(!Array.isArray(e.recall_auto_trigger_keywords)||e.recall_auto_trigger_keywords.some(t=>typeof t!="string")))throw new Error("Invalid recall_auto_trigger_keywords: expected string array");if(e.recall_auto_trigger_denylist!==void 0&&(!Array.isArray(e.recall_auto_trigger_denylist)||e.recall_auto_trigger_denylist.some(t=>typeof t!="string")))throw new Error("Invalid recall_auto_trigger_denylist: expected string array");if(e.standing_order_templates!==void 0&&!Array.isArray(e.standing_order_templates))throw new Error("Invalid standing_order_templates: expected string array");if(e.standing_order_templates!==void 0&&e.standing_order_templates.some(t=>typeof t!="string"))throw new Error("Invalid standing_order_templates: expected string array");return{...e,recall_auto_trigger_keywords:Array.isArray(e.recall_auto_trigger_keywords)?e.recall_auto_trigger_keywords:void 0,recall_auto_trigger_denylist:Array.isArray(e.recall_auto_trigger_denylist)?e.recall_auto_trigger_denylist:void 0,standing_order_templates:Array.isArray(e.standing_order_templates)?e.standing_order_templates:void 0}}function Xh(e,t){return["profile","heartbeat_enabled","scheduler_host","heartbeat_cadence","memory_candidates","memory_candidate_policy","auto_promotion","promotion_policy","recall_auto_trigger_keywords","recall_auto_trigger_denylist","candidate_auto_promotion_threshold","recall_auto_trigger","standing_order_templates"].flatMap(o=>{let n=e?.[o]??null,s=t[o];return JSON.stringify(n)===JSON.stringify(s)?[]:[{field:o,before:n,after:s}]})}function zh(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;let t=e;return(t.profile==="quickstart"||t.profile==="advanced")&&typeof t.heartbeat_enabled=="boolean"&&(typeof t.scheduler_host=="string"||t.scheduler_host===null)&&typeof t.heartbeat_cadence=="string"&&typeof t.memory_candidates=="boolean"&&(t.memory_candidate_policy==="candidate"||t.memory_candidate_policy==="off")&&typeof t.auto_promotion=="boolean"&&(t.promotion_policy==="manual"||t.promotion_policy==="explicit_approval")&&Array.isArray(t.recall_auto_trigger_keywords)&&t.recall_auto_trigger_keywords.every(r=>typeof r=="string")&&Array.isArray(t.recall_auto_trigger_denylist)&&t.recall_auto_trigger_denylist.every(r=>typeof r=="string")&&typeof t.candidate_auto_promotion_threshold=="number"&&Number.isFinite(t.candidate_auto_promotion_threshold)&&t.candidate_auto_promotion_threshold>=0&&t.candidate_auto_promotion_threshold<=1&&typeof t.recall_auto_trigger=="boolean"&&Array.isArray(t.standing_order_templates)&&t.standing_order_templates.every(r=>typeof r=="string")&&typeof t.updated_at=="string"}function Sa(e){let t={bootstrap:Yh(e),mcp:Qh(e),plugins_hooks:Zh(e),heartbeat:ey(e),recall_auto_trigger:ty(e),memory_candidate_hooks:ry(e),memory_promotion_policy:oy(e),cross_host_verification:ny(e)},r=Object.values(t),o=sy(r),n=r.flatMap(a=>a.plan_actions),s=ay(e.profile,o,r);return{schema_version:1,home:e.home,target_root:e.targetRoot,host:e.host,profile:e.profile,overall_status:o,components:t,plan:n,summary:s}}function tu(e){return Sa(e).summary}function Yh(e){return e.onboardingComplete&&e.activationComplete&&e.profile?$("bootstrap","active","Identity onboarding and activation marker are present.",{onboarding_complete:!0,activation_complete:!0}):$("bootstrap",e.onboardingComplete?"approval_required":"not_configured",e.onboardingComplete?"Activation profile still needs explicit approval.":"Identity onboarding is not complete.",{onboarding_complete:e.onboardingComplete,activation_complete:e.activationComplete},[Tt("activation-profile","bootstrap","approval_required","Write activation profile and completion marker.",`${e.home}/state/activation-profile.json`,!0,"17.1 activation apply is explicit-approval only.")])}function Qh(e){let t=e.hosts.filter(r=>r.mcp_registration.configured);if(t.length>0){let r=t.some(o=>o.mcp_registration.issues.length>0);return $("mcp",r?"degraded":"active",r?"MCP is configured but doctor reported warnings.":"MCP registration is configured.",{configured_hosts:t.map(he),checked_hosts:e.hosts.map(he)})}return $("mcp","not_configured","No MCP registration was detected for the selected host scope.",{checked_hosts:e.hosts.map(he)},[Tt("mcp-registration","mcp","not_configured","Install MCP registration for selected hosts.",`nativesoul mcp install --host ${e.host} --apply`,!0,"MCP registration changes host config files.")])}function Zh(e){let t=e.hosts.filter(o=>o.plugin.enabled||o.plugin.hook_registered);if(t.length>0){let o=t.some(n=>n.provider_parity.hooks==="official-fallback");return $("plugins_hooks",o?"degraded":"active",o?"Plugin/hooks are available through fallback support.":"Native plugin or hook support is active.",{enabled_hosts:t.map(he),hook_modes:Object.fromEntries(e.hosts.map(n=>[he(n),n.provider_parity.hooks]))})}let r=e.hosts.length>0&&e.hosts.every(o=>o.plugin.package_kind==="unsupported-native");return $("plugins_hooks",r?"blocked_by_host":"not_configured",r?"Selected hosts do not expose a native plugin path.":"No plugin or hook registration was detected.",{checked_hosts:e.hosts.map(he)},[Tt("plugin-install","plugins_hooks",r?"blocked_by_host":"not_configured","Install NativeSoul plugin/hook package where the host supports it.",`nativesoul install --host ${e.host} --apply`,!0,"Host plugin/hook setup modifies host-specific config.")])}function ey(e){if(!e.profile||!e.profile.heartbeat_enabled)return $("heartbeat","not_configured","Heartbeat is not enabled in the activation profile.",{profile_present:e.profile!==null});let t=e.hosts.filter(r=>r.full_native_evidence.blocked_by_host);return t.length>0?$("heartbeat","blocked_by_host","At least one selected host lacks native scheduler support.",{blocked_hosts:t.map(he),heartbeat_modes:Object.fromEntries(e.hosts.map(r=>[he(r),r.provider_parity.heartbeat]))},[Tt("heartbeat-scheduler","heartbeat","blocked_by_host","Choose a native scheduler-capable host or keep external fallback explicit.",`nativesoul schedule reconcile --host ${e.host} --mode leader --apply`,!0,"Scheduler writes must remain explicit and host-aware.")]):e.hosts.some(r=>r.provider_parity.heartbeat==="native")?$("heartbeat","active","Heartbeat has native scheduler support in the selected scope.",{native_hosts:e.hosts.filter(r=>r.provider_parity.heartbeat==="native").map(he)}):e.hosts.some(r=>r.provider_parity.heartbeat==="official-fallback")?$("heartbeat","degraded","Heartbeat is available only through fallback scheduling in the selected scope.",{fallback_hosts:e.hosts.filter(r=>r.provider_parity.heartbeat==="official-fallback").map(he)}):$("heartbeat","approval_required","Heartbeat profile is enabled, but no scheduler desired state is active yet.",{checked_hosts:e.hosts.map(he)},[Tt("heartbeat-enable","heartbeat","approval_required","Create/reconcile recurring heartbeat schedule.",`nativesoul schedule reconcile --host ${e.host} --mode leader --apply`,!0,"Recurring automation requires explicit approval.")])}function ty(e){return e.profile?e.profile.recall_auto_trigger?$("recall_auto_trigger","active","Automatic recall trigger is enabled in the activation profile.",{keywords:e.profile.recall_auto_trigger_keywords,denylist:e.profile.recall_auto_trigger_denylist,auto_promotion_threshold:e.profile.candidate_auto_promotion_threshold}):$("recall_auto_trigger","approval_required","Automatic recall trigger is intentionally disabled until explicit approval.",{recall_auto_trigger:!1},[Tt("recall-auto-trigger","recall_auto_trigger","approval_required","Set recall_auto_trigger=true in activation profile.","state/activation-profile.json:recall_auto_trigger",!0,"Prompt injection into host sessions must be explicitly approved.")]):$("recall_auto_trigger","not_configured","No activation profile is present.",{})}function ry(e){if(!e.profile||!e.profile.memory_candidates)return $("memory_candidate_hooks","not_configured","Memory candidate hooks are not enabled in the activation profile.",{});let t=e.hosts.every(r=>r.provider_parity.hooks==="unsupported-native");return $("memory_candidate_hooks",t?"degraded":"active",t?"Memory candidates are enabled, but hooks are not native on every selected host.":"Memory candidate capture is enabled with candidate-only policy.",{memory_candidate_policy:e.profile.memory_candidate_policy,hook_modes:Object.fromEntries(e.hosts.map(r=>[he(r),r.provider_parity.hooks]))})}function oy(e){return e.profile?e.profile.auto_promotion?$("memory_promotion_policy","active","Automatic promotion is enabled by activation policy.",{promotion_policy:e.profile.promotion_policy,candidate_auto_promotion_threshold:e.profile.candidate_auto_promotion_threshold,sensitive_auto_promotion_allowed:!1}):$("memory_promotion_policy","approval_required","Memory promotion requires explicit approval.",{auto_promotion:!1,promotion_policy:e.profile.promotion_policy}):$("memory_promotion_policy","not_configured","No activation profile is present.",{})}function ny(e){let t=new Set(e.hosts.map(o=>o.host)).size,r=e.hosts.reduce((o,n)=>o+n.cross_host_inventory_summary.ready_other_hosts,0);return t>1&&e.hosts.every(o=>o.status==="ready")?$("cross_host_verification","active","Multiple selected hosts were verified by deep doctor.",{host_count:t,ready_other_hosts:r}):$("cross_host_verification",r>0?"degraded":"approval_required","Cross-host verification needs an all-host deep doctor pass before full activation claims.",{host_count:t,ready_other_hosts:r},[Tt("cross-host-verify","cross_host_verification","approval_required","Run all-host deep verification.","nativesoul doctor --deep --all-hosts --json",!1,"Verification is read-only but must be run against every host.")])}function $(e,t,r,o,n=[]){return{key:e,status:t,summary:r,evidence:o,plan_actions:n}}function Tt(e,t,r,o,n,s,a){return{id:e,component:t,status:r,action:o,target:n,dry_run:!0,requires_user_confirmed:s,reason:a}}function sy(e){let t=e.map(r=>r.status);return t.includes("blocked_by_host")?"blocked_by_host":t.includes("degraded")?"degraded":t.includes("approval_required")?"approval_required":t.includes("not_configured")?"not_configured":"active"}function ay(e,t,r){return{overall_status:t,profile:e?.profile??null,active:qr(r,"active"),not_configured:qr(r,"not_configured"),approval_required:qr(r,"approval_required"),blocked_by_host:qr(r,"blocked_by_host"),degraded:qr(r,"degraded"),full_native_claimed:!1}}function qr(e,t){return e.filter(r=>r.status===t).length}function he(e){return e.surface==="default"?e.host:`${e.host}:${e.surface}`}import{existsSync as iy}from"node:fs";import ly from"node:path";async function Kr(e){let t=f(e),r=[],o=["AGENTS.md","SOUL.md","IDENTITY.md","USER.md","POLICY.md","MEMORY.md","HEARTBEAT.md","config.yaml"];for(let s of o)await R(ly.join(t.home,s))||r.push({code:"MISSING_HUMAN_FILE",severity:"warn",message:`${s} is missing`,remediation:"Run nativesoul init"});if(!iy(t.database))return r.push({code:"MISSING_DATABASE",severity:"error",message:"SQLite state database is missing",remediation:"Run nativesoul init"}),{home:t.home,healthy:!1,integrity:"missing",issues:r};let n=(()=>{let s=_(t.database,{readOnly:!0});try{return s.integrityCheck()}finally{s.close()}})();n!=="ok"&&r.push({code:"SQLITE_INTEGRITY",severity:"error",message:`SQLite integrity check returned ${n}`,remediation:"Restore from backup or rebuild the workspace"}),r.push(...cy(t.home,t.database));try{await h({home:t.home,type:"doctor_completed",details:{integrity:n,issueCount:r.length}})}catch{}return{home:t.home,healthy:r.every(s=>s.severity!=="error"),integrity:n,issues:r}}function cy(e,t){let r=te(process.cwd(),e),o=_(t,{readOnly:!0});try{let n=new Set(o.listMemories({limit:200,includeForgotten:!0}).map(s=>s.scope.project).filter(s=>s!==r.id));return n.size===0?[]:[{code:"PROJECT_ID_RECONCILE_AVAILABLE",severity:"info",message:`Found ${n.size} memory project id(s) different from normalized current project ${r.id}.`,remediation:"Review with nativesoul memory export --project <old-id>; a future reconcile command will migrate aliases after approval."}]}finally{o.close()}}import Ae from"node:os";import K from"node:path";function ru(e){switch(e){case"grok":return"Agents.md";case"codex":return"AGENTS.md";case"claude":return"CLAUDE.md";case"antigravity":case"gemini":return"GEMINI.md"}}function ou(e){return e==="claude"?".claude.json":e==="gemini"?"settings.json":e==="antigravity"?"mcp_config.json":"mcp.json"}function Gr(e,t){if(t==null||t==="default")return e==="claude"?"claude-code":"default";if(e!=="claude")throw new Error(`--surface ${t} is only supported for --host claude`);return t}function We(e,t){return t&&t!=="default"?[Gr(e,t)]:e==="claude"?["claude-code","claude-desktop"]:["default"]}function Ct(e,t){return t==="default"?e:t}function nu(e){switch(e){case"codex":return K.join(Ae.homedir(),".codex","AGENTS.md");case"claude":return K.join(Ae.homedir(),".claude","CLAUDE.md");case"grok":return K.join(Ae.homedir(),".grok","Agents.md");case"antigravity":case"gemini":return K.join(Ae.homedir(),".gemini","GEMINI.md")}}function hn(e){switch(e){case"codex":return K.join(Ae.homedir(),".codex","mcp.json");case"claude":return K.join(Ae.homedir(),".claude.json");case"grok":return K.join(Ae.homedir(),".grok","mcp.json");case"antigravity":return K.join(Ae.homedir(),".gemini","antigravity-cli","mcp_config.json");case"gemini":return K.join(Ae.homedir(),".gemini","settings.json")}}function su(){return au({platform:process.platform,home:Ae.homedir(),env:process.env})}function au(e){let t=e.platform==="win32"?K.win32:K.posix;if(e.platform==="darwin")return t.join(e.home,"Library","Application Support","Claude","claude_desktop_config.json");if(e.platform==="win32"){let o=e.env?.APPDATA&&e.env.APPDATA.trim().length>0?e.env.APPDATA:t.join(e.home,"AppData","Roaming");return t.join(o,"Claude","claude_desktop_config.json")}let r=e.env?.XDG_CONFIG_HOME&&e.env.XDG_CONFIG_HOME.trim().length>0?e.env.XDG_CONFIG_HOME:t.join(e.home,".config");return t.join(r,"Claude","claude_desktop_config.json")}function iu(e,t){if(e!=="claude")return null;if(!t)return K.join(Ae.homedir(),".claude","mcp.json");let r=K.resolve(t),o=K.dirname(r);return K.basename(o)==="claude"?K.join(o,"mcp.json"):K.join(o,".claude","mcp.json")}import{mkdir as lu,rename as dy,writeFile as du}from"node:fs/promises";import ye from"node:path";var uy=["entity","soul","human","collaboration","continuity"],py=["SOUL.md","POLICY.md"],uu=new Set(["IDENTITY.md","SOUL.md","USER.md","AGENTS.md"]),er=64*1024,my="<!-- nativesoul:start v1 -->",cu="<!-- nativesoul:end -->",gy={"IDENTITY.md":{writable:!0,requires_user_confirmed:!1,required_fields:["Name","Creature","Role","Vibe","Emoji","Mission"],field_format:"- **Field:** value (Markdown list)",merge_strategy:"replace",max_bytes:er},"SOUL.md":{writable:!0,requires_user_confirmed:!0,required_sections:["Core truths","Boundaries","Vibe","Continuity"],field_format:"Prose Markdown sections \u2014 not template slot-fill",merge_strategy:"replace",max_bytes:er},"USER.md":{writable:!0,requires_user_confirmed:!1,required_fields:["Name","What to call them","Timezone","Languages"],field_format:"- **Field:** value (Markdown list)",merge_strategy:"replace",max_bytes:er},"AGENTS.md":{writable:!0,requires_user_confirmed:!1,required_sections:["Session start","Safety"],field_format:"Operating instructions in Markdown",merge_strategy:"merge_managed_block",max_bytes:er},"POLICY.md":{writable:!1,requires_user_confirmed:!1,field_format:"Use policy propose-change after onboarding",merge_strategy:"replace",max_bytes:0}};async function Xr(e){let t=await v(e),o=(await me(t.home,"BOOTSTRAP.md")).trim().length>0;return{ritual_pending:o,files_present:{soul:await R(ye.join(t.home,"SOUL.md")),identity:await R(ye.join(t.home,"IDENTITY.md")),user:await R(ye.join(t.home,"USER.md")),agents:await R(ye.join(t.home,"AGENTS.md")),bootstrap:await R(ye.join(t.home,"BOOTSTRAP.md"))},protected_targets:[...py],writable_files:[...uu],interview_themes:[...uy],instruction_doc:"llm-install.txt",apply_defaults:{dry_run:!0,user_confirmed:!1},file_generation_rules:gy,activation:await Zd(t.home,o)}}async function zr(e){let t=await v(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,n=[],s=[];for(let[a,i]of Object.entries(e.files)){let l=a.trim(),c=l.toUpperCase();if(c==="POLICY.MD"){n.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:"POLICY_VIOLATION: POLICY.md requires proposal flow"});continue}if(!uu.has(l)){n.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:`UNSUPPORTED_FILE: ${l}`});continue}if(c==="SOUL.MD"&&!o){n.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:"POLICY_VIOLATION: SOUL.md requires user_confirmed: true"});continue}let d=typeof i=="string"?i:"";if(Buffer.byteLength(d,"utf8")>er){n.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:`FILE_TOO_LARGE: ${l} exceeds ${er} bytes`});continue}let p=ye.join(t.home,l),g=await me(t.home,l),y=l==="AGENTS.md"?fy(g,d):d,k=g.length>0?A(g):null,S=A(y);if(k===S){n.push({file:l,action:"noop",before_hash:k,after_hash:S});continue}let U=g.length===0?"create":"update";n.push({file:l,action:U,before_hash:k,after_hash:S}),r||await du(p,y,{encoding:"utf8",mode:384})}return!r&&e.config_patch?.hosts?.length&&s.push(`CONFIG_PATCH_NOT_APPLIED_V1: hosts=${e.config_patch.hosts.join(",")}`),r||await h({home:t.home,type:"onboarding.applied",details:{user_confirmed:o,files:n.map(a=>({file:a.file,action:a.action}))}}),{dry_run:r,applied:!r,user_confirmed:o,files:n,warnings:s}}async function Yr(e){let t=f(e?.home),r=ye.join(t.home,"BOOTSTRAP.md");if(!await R(r))return{already_complete:!0,archived_bootstrap:!1,archive_path:null};let o=e?.archive!==!1,n=null;if(o){let a=ye.join(t.home,"memory","archive");await lu(a,{recursive:!0,mode:448});let i=new Date().toISOString().replace(/[:.]/gu,"-");n=ye.join(a,`bootstrap-${i}.md`),await dy(r,n)}else{let{rm:a}=await import("node:fs/promises");await a(r,{force:!0})}let s=ye.join(t.home,"state","onboarding.complete");return await lu(ye.join(t.home,"state"),{recursive:!0,mode:448}),await du(s,`${new Date().toISOString()}
858
+ `,{encoding:"utf8",mode:384}),await h({home:t.home,type:"onboarding.completed",details:{archived:o,archive_path:n}}),{already_complete:!1,archived_bootstrap:o,archive_path:n}}function yn(e){return ye.join(e,"state","onboarding.complete")}function fy(e,t){let r=t.trim();if(!e.trim())return`${r}
859
+ `;if(e.includes(r))return e;let o=hy(e);if(o){let s=o.after.trimEnd(),a=s.length>0?`${s}
797
860
 
798
861
  ${r}
799
862
  `:`${r}
800
- `;return`${o.before}${o.block}${s}`}let a=Co["AGENTS.md"]??"";return e.trim()===a.trim()?`${r}
863
+ `;return`${o.before}${o.block}${a}`}let n=Wo["AGENTS.md"]??"";return e.trim()===n.trim()?`${r}
801
864
  `:`${e.trimEnd()}
802
865
 
803
866
  ## Onboarding Update
804
867
 
805
868
  ${r}
806
- `}function Qf(e){let t=e.indexOf(zf),r=e.indexOf(gd);if(t<0||r<0||r<t)return null;let o=r+gd.length;return{before:e.slice(0,t),block:e.slice(t,o),after:e.slice(o)}}function yd(e,t){return t?Jc(e):Zf()}function Zf(){return{provider_id:"local-hash",model_id:"local-hash-bow-v1",schema_version:1,available:!1,indexable_count:0,indexed_count:0,stale_count:0,healthy:!1,remediation:"Run nativesoul init, then nativesoul memory index"}}function _d(e){return!e.available||e.stale_count===0?[]:[{code:"SEMANTIC_INDEX_STALE",severity:"warn",message:`${e.stale_count} memory record(s) need semantic indexing.`,remediation:e.remediation??"Run nativesoul memory index"}]}function vd(e){let t=new Map;for(let o of e){let a=t.get(o.host)??{capability_count:0,ready_capability_count:0};t.set(o.host,{capability_count:a.capability_count+1,ready_capability_count:a.ready_capability_count+(o.ready?1:0)})}let r=Array.from(t.entries()).map(([o,a])=>({host:o,...a}));return{host_count:r.length,capability_count:r.reduce((o,a)=>o+a.capability_count,0),ready_capability_count:r.reduce((o,a)=>o+a.ready_capability_count,0),hosts:r}}function aa(e){let t=v(e,{readOnly:!0});try{return t.listCapabilities({limit:1e4}).map(r=>({host:r.host,ready:r.ready}))}finally{t.close()}}import{existsSync as Ry}from"node:fs";import{readFile as ky,stat as Sy}from"node:fs/promises";import Kd from"node:path";import{mkdir as eh,readFile as th,rename as rh,writeFile as oh}from"node:fs/promises";import Br from"node:path";var ah=1440*60*1e3;async function Te(e){let t=g(e.home),r=await Gn(t.home),o={host:e.host,outcome:e.outcome,tier:e.tier,cwd:e.cwd?Br.resolve(e.cwd):null,project:e.project??null,tokens_used:e.tokensUsed??null,tokens_max:e.tokensMax??null,source:e.source??"nativesoul",warnings:(e.warnings??[]).map(a=>M(a).value),error:lh(e.error),recorded_at:e.recordedAt??new Date().toISOString()};return r.hosts[e.host]=o,await sh(t.home,r),await f({home:t.home,type:ih(e.outcome),result:e.outcome==="failed"?"error":"ok",details:o}),o}async function Gn(e){let t=g(e),r=zn(t.home);if(!await k(r))return nh();let o=JSON.parse(await th(r,"utf8"));return{schema:1,hosts:typeof o.hosts=="object"&&o.hosts!==null?o.hosts:{}}}async function Wn(e){let t=g(e.home),o=(await Gn(t.home)).hosts[e.host]??null,a=(e.now??new Date).getTime(),n=o?Date.parse(o.recorded_at):Number.NaN,s=Number.isFinite(n)?Math.max(a-n,0):null;return{state_path:zn(t.home),last:o,age_ms:s,age_hours:s===null?null:Math.round(s/(3600*1e3)*10)/10,stale:s!==null&&s>ah}}function nh(){return{schema:1,hosts:{}}}async function sh(e,t){let r=zn(e);await eh(Br.dirname(r),{recursive:!0,mode:448});let o=Br.join(Br.dirname(r),`.last-handshake-${O("tmp")}.tmp`);await oh(o,`${JSON.stringify(t,null,2)}
807
- `,{encoding:"utf8",mode:384}),await rh(o,r)}function zn(e){return Br.join(e,"state","last-handshake.json")}function ih(e){return`handshake_${e}`}function lh(e){if(e==null)return null;let t=e instanceof Error?e.message:String(e);return M(t).value.slice(0,500)}import Qt from"node:path";import{existsSync as is}from"node:fs";import{cp as Xh,mkdir as Yh,rm as Dd}from"node:fs/promises";import Qh from"node:path";import{existsSync as rt}from"node:fs";import{readFile as da}from"node:fs/promises";import Ue from"node:path";import ch from"node:path";function zt(e){return e.split(/[\\/]/u).join("/")}function tt(e,t){return zt(ch.relative(e,t))}function Xt(e){return zt(e)}import{existsSync as bd}from"node:fs";import Xn from"node:path";function na(e){if(Xn.isAbsolute(e))return bd(e)?e:null;let t=(process.env.PATH??"").split(Xn.delimiter).filter(Boolean),r=process.platform==="win32"?(process.env.PATHEXT??".EXE;.CMD;.BAT").split(";"):[""];for(let o of t)for(let a of r){let n=Xn.join(o,`${e}${a}`);if(bd(n))return n}return null}import{spawnSync as ph}from"node:child_process";import{existsSync as kd}from"node:fs";import{mkdir as mh,readFile as Sd,writeFile as gh}from"node:fs/promises";import fh from"node:os";import Ie from"node:path";import{existsSync as dh}from"node:fs";import Jr from"node:os";import Y from"node:path";import{fileURLToPath as uh}from"node:url";function Ce(e,t,r){return qr(e,t)?r?Y.join(Y.resolve(r),e,"plugins","nativesoul"):e==="claude"?Y.join(Jr.homedir(),".claude","plugins","nativesoul"):e==="codex"?Y.join(Jr.homedir(),".codex","plugins","nativesoul"):e==="gemini"?Y.join(Jr.homedir(),".gemini","extensions","nativesoul"):e==="grok"?Y.join(Jr.homedir(),".grok","plugins","nativesoul"):e==="antigravity"?Y.join(Jr.homedir(),".antigravity","plugins","nativesoul"):null:null}function qr(e,t){return e==="codex"||e==="gemini"||e==="grok"||e==="antigravity"||e==="claude"&&(t==="claude-code"||t==="claude-desktop")}function sa(e,t){return e==="claude"?Y.join(t,".claude-plugin","plugin.json"):e==="gemini"?Y.join(t,"gemini-extension.json"):e==="grok"||e==="antigravity"?Y.join(t,"plugin.json"):Y.join(t,".codex-plugin","plugin.json")}function Yn(e){if(e!=="claude"&&e!=="codex"&&e!=="gemini"&&e!=="grok"&&e!=="antigravity")return null;let t=`${e}-nativesoul`,r=Y.dirname(uh(import.meta.url));return[Y.resolve(process.cwd(),"plugins",t),Y.resolve(r,"../../../plugins",t),Y.resolve(r,"../../../../plugins",t)].find(a=>dh(a))??null}var Zn="nativesoul";async function Ad(e){let t=Ie.join(e,"..","..","settings.json"),r=kd(t)?JSON.parse(await Sd(t,"utf8")):{},o=r.hooks&&!Array.isArray(r.hooks)&&typeof r.hooks=="object"?{...r.hooks}:{},a=Xt(Ie.join(e,"shared","hooks","host-hook.cjs")),n={SessionStart:Kr(`node ${JSON.stringify(a)} session-start --host claude --project-env CLAUDE_PROJECT_DIR`),UserPromptSubmit:Kr(`node ${JSON.stringify(a)} prompt-bootstrap --host claude --project-env CLAUDE_PROJECT_DIR`),PreToolUse:Kr(`node ${JSON.stringify(a)} pre-tool-use --host claude --project-env CLAUDE_PROJECT_DIR`),Stop:Kr(`node ${JSON.stringify(a)} memory-flush --host claude --project-env CLAUDE_PROJECT_DIR`),PreCompact:Kr(`node ${JSON.stringify(a)} memory-flush --host claude --project-env CLAUDE_PROJECT_DIR`)};for(let[s,i]of Object.entries(n))o[s]=bh(o[s]??null,i??null);await mh(Ie.dirname(t),{recursive:!0,mode:448}),await gh(t,`${JSON.stringify({...r,hooks:o},null,2)}
808
- `,"utf8")}function Pd(e,t,r){if(t!=="default"||!_h(e,t,r))return[];if(e==="antigravity")return Qn({executableName:"agy",installArgs:o=>["plugin","install",o],skippedMessage:"Antigravity CLI was not found on PATH, so NativeSoul could not register the plugin with `agy plugin install`.",skippedRemediation:"Install Antigravity CLI or run `agy plugin install ~/.antigravity/plugins/nativesoul` after installation.",failedRemediation:"Run `agy plugin validate ~/.antigravity/plugins/nativesoul` and then `agy plugin install ~/.antigravity/plugins/nativesoul`."},r);if(e==="grok"){let o=Qn({executableName:"grok",installArgs:n=>["plugin","install",n,"--trust"],skippedMessage:"Grok CLI was not found on PATH, so NativeSoul could not register the plugin with `grok plugin install`.",skippedRemediation:"Install Grok Build or run `grok plugin install ~/.grok/plugins/nativesoul --trust` after installation.",failedRemediation:"Run `grok plugin validate ~/.grok/plugins/nativesoul` and then `grok plugin install ~/.grok/plugins/nativesoul --trust`.",treatOutputAsSuccess:hh},r),a=Qn({executableName:"grok",installArgs:()=>["plugin","enable",Zn],skippedMessage:"Grok CLI was not found on PATH, so NativeSoul could not enable the plugin with `grok plugin enable nativesoul`.",skippedRemediation:"Install Grok Build or run `grok plugin enable nativesoul` after installation.",failedRemediation:"Run `grok plugin enable nativesoul` so SessionStart hooks load in Grok sessions.",treatOutputAsSuccess:yh},r);return[...o,...a]}return[]}function Qn(e,t){let r=na(e.executableName);if(!r)return[{code:"HOST_PLUGIN_IMPORT_SKIPPED",severity:"warn",message:e.skippedMessage,remediation:e.skippedRemediation}];let o=ph(r,e.installArgs(t),{encoding:"utf8",stdio:["ignore","pipe","pipe"],timeout:15e3});if(o.status===0)return[];let a=(o.stderr||o.stdout||"unknown error").trim();return e.treatOutputAsSuccess?.(a)?[]:[{code:"HOST_PLUGIN_IMPORT_FAILED",severity:"error",message:`${e.executableName} plugin import failed: ${a}`,remediation:e.failedRemediation}]}function hh(e){return/^Installed \d+ plugin/i.test(e)||/^Plugin manifest is valid\./i.test(e)||/\bplugins?\b[^.\n]*\balready installed\b/i.test(e)||/\brepo\b[^.\n]*\balready installed\b/i.test(e)}function yh(e){return/^Enabled plugin:/i.test(e)||/\balready enabled\b/i.test(e)}async function Ed(e){let t=e?vh(e):Ie.join(fh.homedir(),".grok","config.toml");if(!kd(t))return null;let r=await Sd(t,"utf8");return wd(r,"disabled",Zn)?!1:wd(r,"enabled",Zn)?!0:null}function wd(e,t,r){let n=(e.match(/\[plugins\][\s\S]*?(?=\n\[|$)/u)?.[0]??e).match(new RegExp(`${t}\\s*=\\s*\\[([^\\]]*)\\]`,"u"))?.[1];return n?n.split(",").some(s=>s.replace(/["'\s]/gu,"")===r):!1}function _h(e,t,r){let o=Ce(e,t);return o!==null&&Ie.resolve(o)===Ie.resolve(r)}function vh(e){let t=Ie.resolve(e),r=Ie.basename(t);return r==="grok"||r===".grok"?Ie.join(t,"config.toml"):Ie.join(t,".grok","config.toml")}function Kr(e){return{hooks:[{type:"command",command:e,timeout:9}]}}function bh(e,t){let r=Array.isArray(e)?e:[],o=Rd(t);return o&&r.some(a=>Rd(a)===o)?r:[...r,t]}function Rd(e){if(!e||Array.isArray(e)||typeof e!="object")return null;let t=e.hooks;if(!Array.isArray(t)||t.length===0)return null;let r=t[0];if(!r||Array.isArray(r)||typeof r!="object")return null;let o=r.command;return typeof o=="string"?o:null}import wh from"node:path";var ia=[{event:"SessionStart",commandFragment:"hooks/session-start.cjs",fileName:"session-start.cjs"},{event:"PreToolUse",commandFragment:"hooks/pre-tool-use.cjs",fileName:"pre-tool-use.cjs"},{event:"Stop",commandFragment:"hooks/memory-flush.cjs",fileName:"memory-flush.cjs"},{event:"PreCompact",commandFragment:"hooks/memory-flush.cjs",fileName:"memory-flush.cjs"},{event:"UserPromptSubmit",commandFragment:"hooks/user-prompt-submit.cjs",fileName:"user-prompt-submit.cjs"}],Rh={grok:[{event:"SessionStart",commandFragment:"host-hook.cjs"},{event:"UserPromptSubmit",commandFragment:"prompt-bootstrap --host grok"},{event:"PreToolUse",commandFragment:"pre-tool-use --host grok"},{event:"Stop",commandFragment:"memory-flush --host grok"},{event:"PreCompact",commandFragment:"memory-flush --host grok"}],gemini:[{event:"SessionStart",commandFragment:"host-hook.cjs"},{event:"BeforeAgent",commandFragment:"prompt-bootstrap --host gemini"},{event:"BeforeTool",commandFragment:"pre-tool-use --host gemini"},{event:"AfterAgent",commandFragment:"memory-flush --host gemini"},{event:"PreCompress",commandFragment:"memory-flush --host gemini"}],antigravity:[{event:"SessionStart",commandFragment:"host-hook.cjs"},{event:"UserPromptSubmit",commandFragment:"prompt-bootstrap --host antigravity"},{event:"PreToolUse",commandFragment:"pre-tool-use --host antigravity"},{event:"Stop",commandFragment:"memory-flush --host antigravity"},{event:"PreCompact",commandFragment:"memory-flush --host antigravity"}]};function Gr(e,t){return e==="codex"||e==="claude"||e==="grok"||e==="antigravity"?{packageKind:"native-plugin",nativeHooksSupported:!0}:e==="gemini"?{packageKind:"official-extension",nativeHooksSupported:!0}:{packageKind:"unsupported-native",nativeHooksSupported:!1}}function kh(e){return e==="grok"||e==="gemini"||e==="antigravity"?Rh[e]:ia}function es(e){return e==="grok"||e==="gemini"?["hooks/hooks.json"]:e==="antigravity"?["hooks.json"]:[...new Set(ia.map(t=>t.fileName).filter(t=>!!t))].map(t=>wh.join("hooks",t))}function xd(e,t){return t==="official-extension"?typeof e.name=="string"&&e.name==="nativesoul":typeof e.name=="string"&&e.name.includes("nativesoul")}function jd(e,t){return ts(e,t).length===0}function ts(e,t){return kh(e).filter(({event:r,commandFragment:o})=>!Sh(t,r,o)).map(({event:r})=>r)}function Wr(e){return e==="claude"||e==="codex"||e==="gemini"||e==="grok"||e==="antigravity"}function la(e){return e==="claude"?[".claude-plugin/plugin.json"]:e==="codex"?[".mcp.json"]:e==="gemini"?["gemini-extension.json"]:e==="grok"?[".mcp.json"]:e==="antigravity"?["mcp_config.json"]:[]}function ca(e){return e==="claude"?[".claude-plugin/plugin.json"]:e==="codex"?[".codex-plugin/plugin.json"]:e==="gemini"||e==="grok"?["hooks/hooks.json"]:e==="antigravity"?["hooks.json"]:[]}function Sh(e,t,r){if(!e.hooks||Array.isArray(e.hooks)||typeof e.hooks!="object")return!1;let a=e.hooks[t];return!Array.isArray(a)||a.length===0?!1:a.some(n=>{if(!n||Array.isArray(n)||typeof n!="object")return!1;let s=n.hooks;return!Array.isArray(s)||s.length===0?!1:s.some(i=>{if(!i||Array.isArray(i)||typeof i!="object")return!1;let l=i.command;return typeof l=="string"&&zt(l).includes(r)})})}async function ot(e){if(!e.targetPath||!qr(e.host,e.surface))return{host:e.host,surface:e.surface,targetPath:e.targetPath,target_exists:!1,manifest_exists:!1,enabled:!1,hook_registered:!1,package_kind:"unsupported-native",native_hooks_supported:!1,native_scheduler_supported:!1,issues:[]};let t=Gr(e.host,e.surface),r=rt(e.targetPath),o=sa(e.host,e.targetPath),a=rt(o),n=t.nativeHooksSupported&&e.targetPath?es(e.host).filter(H=>!rt(Ue.join(e.targetPath,H))):es(e.host),s=t.nativeHooksSupported?n.length===0:!0,i=[],l=!1,c=!t.nativeHooksSupported;if(!r)i.push({code:"PLUGIN_NOT_INSTALLED",severity:"warn",message:`NativeSoul plugin is not installed for ${e.host}:${e.surface}.`,remediation:`Run nativesoul install --host ${e.host} --apply`});else if(!a)i.push({code:"PLUGIN_MANIFEST_MISSING",severity:"error",message:`NativeSoul plugin manifest is missing: ${o}`,remediation:"Reinstall the NativeSoul plugin"});else{let H=JSON.parse(await da(o,"utf8")),fe=t.nativeHooksSupported?await Ah(e.host,e.targetPath,H):H;if(l=t.nativeHooksSupported?jd(e.host,fe):xd(H,t.packageKind),c=!t.nativeHooksSupported||await Ph({host:e.host,targetPath:e.targetPath,manifest:H}),t.nativeHooksSupported&&!c&&i.push({code:"PLUGIN_MCP_COMMAND_UNRESOLVED",severity:"error",message:"NativeSoul plugin MCP server command is not resolved for daemon-safe startup.",remediation:"Reinstall the NativeSoul plugin so its MCP server command is rendered with an absolute or executable command"}),!l&&t.nativeHooksSupported){let Se=ts(e.host,fe);i.push({code:"PLUGIN_HOOK_MISSING",severity:"error",message:Se.length>0?`NativeSoul plugin manifest is missing required hook registrations: ${Se.join(", ")}.`:"NativeSoul plugin manifest does not register required continuity hooks.",remediation:"Reinstall the NativeSoul plugin"})}!l&&!t.nativeHooksSupported&&i.push({code:"PLUGIN_PACKAGE_MANIFEST_INVALID",severity:"error",message:`NativeSoul ${t.packageKind} manifest is invalid for ${e.host}.`,remediation:"Reinstall the NativeSoul package"})}r&&t.nativeHooksSupported&&!s&&i.push({code:"PLUGIN_HOOK_FILE_MISSING",severity:"error",message:`NativeSoul required hook files are missing under ${e.targetPath}: ${n.join(", ")}`,remediation:"Reinstall the NativeSoul plugin"});let d=e.targetPath?Ue.join(e.targetPath,"shared","hooks","lib.cjs"):null;r&&t.nativeHooksSupported&&(!d||!rt(d))&&i.push({code:"PLUGIN_SHARED_HOOKS_MISSING",severity:"error",message:"NativeSoul shared hook support files are missing under shared/hooks.",remediation:"Reinstall the NativeSoul plugin"});let p=e.targetPath?Ue.resolve(Ue.dirname(Ue.dirname(e.targetPath))):void 0,h=!t.nativeHooksSupported||d!==null&&rt(d),y=t.nativeHooksSupported?s&&h:!0,w=r&&a&&l&&y&&c,R=e.host==="grok"?await Ed(p):null;return e.host==="grok"&&w&&R===!1&&i.push({code:"GROK_PLUGIN_RUNTIME_DISABLED",severity:"error",message:"NativeSoul is installed for Grok but disabled in grok config, so SessionStart hooks will not run.",remediation:"Run `grok plugin enable nativesoul` or `nativesoul install --host grok --apply`."}),{host:e.host,surface:e.surface,targetPath:e.targetPath,target_exists:r,manifest_exists:a,enabled:w&&R!==!1,hook_registered:t.nativeHooksSupported?l&&s:!1,package_kind:t.packageKind,native_hooks_supported:t.nativeHooksSupported,native_scheduler_supported:!1,issues:i}}async function Ah(e,t,r){let o=ca(e);if(o.length===0)return r;let a=tt(t,sa(e,t)),n=o[0];if(!n||n===a)return r;let s=Ue.join(t,n);return rt(s)?JSON.parse(await da(s,"utf8")):{}}async function Ph(e){let t=la(e.host),r=tt(e.targetPath,sa(e.host,e.targetPath));if(t.length>0&&!t.includes(r)){for(let o of t){let a=Ue.join(e.targetPath,o);if(rt(a)&&rs(JSON.parse(await da(a,"utf8"))))return!0}return!1}if(e.host==="codex"){let o=Ue.join(e.targetPath,".mcp.json");return rt(o)?rs(JSON.parse(await da(o,"utf8"))):!1}return rs(e.manifest)}function rs(e){let r=(!e.mcpServers||Array.isArray(e.mcpServers)||typeof e.mcpServers!="object"?null:e.mcpServers)?.nativesoul??(!e.nativeSoul||Array.isArray(e.nativeSoul)||typeof e.nativeSoul!="object"?null:e.nativeSoul.mcpServer);if(!r||Array.isArray(r)||typeof r!="object")return!1;let o=r.command,a=r.args;return typeof o!="string"||o.length===0?!1:o==="nativesoul-mcp"||na(o)||o===process.execPath?!0:Array.isArray(a)&&a.some(n=>typeof n=="string"&&Ue.isAbsolute(n))}import{cp as Eh,mkdir as xh,readFile as jh,readdir as Th}from"node:fs/promises";import os from"node:path";async function as(e,t,r,o){let a=os.join(e,"backups","plugins");await xh(a,{recursive:!0,mode:448});let n=os.join(a,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-${t}-${r}-${O("plugin")}`);return await Eh(o,n,{recursive:!0}),n}async function ns(e){let t=await Yt(e),r=await Promise.all(t.map(async o=>{let a=tt(e,o),n=await jh(o,"utf8");return`${a}\0${S(n)}`}));return S(r.sort().join(`
809
- `))}async function Yt(e){let t=await Th(e,{withFileTypes:!0});return(await Promise.all(t.map(async o=>{let a=os.join(e,o.name);return o.isDirectory()?Yt(a):o.isFile()?[a]:[]}))).flat()}import{existsSync as Fh}from"node:fs";import{cp as Uh,mkdir as Vh,readFile as ss,writeFile as Bh}from"node:fs/promises";import Ve from"node:path";import{fileURLToPath as Jh}from"node:url";import{spawnSync as Ch}from"node:child_process";import{accessSync as Ih,constants as Nh,existsSync as Td}from"node:fs";import jt from"node:path";function Tt(e){let t=Oh(e.commandMode,e.projectRoot),r=t.command,o=[...t.args];e.home&&o.push("--home",e.home);let a={command:r,args:o,env:{}};return{serverName:"nativesoul",host:e.host,commandMode:e.commandMode,command:r,args:o,env:{},mcpServers:{nativesoul:a},snippet:$h(e.host,a),warnings:[...t.warnings,...e.host==="generic"?[]:[`${e.host.toUpperCase()}_MCP_REGISTRATION_NOT_APPLIED`]]}}function Oh(e,t){let r=process.env.NATIVESOUL_MCP_COMMAND;return r&&r.trim().length>0?{command:r.trim(),args:[],warnings:["NATIVESOUL_MCP_COMMAND_ENV_OVERRIDE"]}:e==="local"?{command:process.execPath,args:[jt.join(t??process.cwd(),"dist","packages","mcp-server","src","index.js")],warnings:[]}:e==="absolute"?Mh(t):{command:"nativesoul-mcp",args:[],warnings:Cd("nativesoul-mcp")?[]:["NATIVESOUL_MCP_COMMAND_NOT_ON_PATH"]}}function Mh(e){let t=Hh();if(t)return{command:t,args:[],warnings:[]};let r=Cd("nativesoul-mcp");if(r)return{command:r,args:[],warnings:[]};let o=Lh(e);if(Td(o))return{command:process.execPath,args:[o],warnings:["NATIVESOUL_MCP_COMMAND_LOCAL_DIST"]};let a=Dh();return a?{command:process.execPath,args:[a],warnings:["NATIVESOUL_MCP_COMMAND_NPM_ROOT_GLOBAL"]}:{command:"nativesoul-mcp",args:[],warnings:["NATIVESOUL_MCP_COMMAND_NOT_RESOLVED"]}}function Lh(e){return jt.join(e??process.cwd(),"dist","packages","mcp-server","src","index.js")}function Hh(){let e=process.argv[1];if(!e)return null;let t=process.platform==="win32"?".cmd":"",r=jt.join(jt.dirname(e),`nativesoul-mcp${t}`);return Id(r)?r:null}function Cd(e){let t=(process.env.PATH??"").split(jt.delimiter).filter(Boolean),r=process.platform==="win32"?(process.env.PATHEXT??".EXE;.CMD;.BAT").split(";"):[""];for(let o of t)for(let a of r){let n=jt.join(o,`${e}${a}`);if(Id(n))return n}return null}function Dh(){let e=Ch("npm",["root","-g"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(e.status!==0)return null;let t=e.stdout.trim();if(!t)return null;let r=jt.join(t,"nativesoul","dist","packages","mcp-server","src","index.js");return Td(r)?r:null}function Id(e){try{return Ih(e,Nh.X_OK),!0}catch{return!1}}function $h(e,t){return e==="generic"?{mcpServers:{nativesoul:t}}:{host:e,review_only:!0,mcpServers:{nativesoul:t}}}async function Nd(e,t,r,o){let a=await Yt(e),n=await Promise.all(a.map(async i=>{let l=tt(e,i),c=await Hd({host:t,relativePath:l,content:await ss(i,"utf8"),home:r,targetPath:o});return`${l}\0${S(c)}`})),s=Ld();if(s&&Wr(t)){let i=await Yt(s);for(let l of i){let c=Ve.posix.join("shared","hooks",tt(s,l)),d=await ss(l,"utf8");n.push(`${c}\0${S(d)}`)}}return S(n.sort().join(`
810
- `))}async function Od(e){let t=Ld();if(!t)return;let r=Ve.join(e,"shared","hooks");await Vh(r,{recursive:!0,mode:448}),await Uh(t,r,{recursive:!0})}async function Md(e){let t=await Yt(e.targetPath);await Promise.all(t.map(async r=>{let o=Ve.relative(e.targetPath,r),a=await ss(r,"utf8"),n=await Hd({host:e.host,relativePath:o,content:a,home:e.home,targetPath:e.targetPath});n!==a&&await Bh(r,n,"utf8")}))}function Ld(){let e=Ve.dirname(Jh(import.meta.url));return[Ve.resolve(process.cwd(),"plugins","shared","hooks"),Ve.resolve(e,"../../../plugins/shared/hooks"),Ve.resolve(e,"../../../../plugins/shared/hooks")].find(r=>Fh(r))??null}async function Hd(e){let t=zt(e.relativePath),r=la(e.host).includes(t),o=ca(e.host).includes(t);if(!r&&!o)return e.content;let a=JSON.parse(e.content),n=r?qh(a,Tt({host:e.host,commandMode:"package",home:e.home}).mcpServers.nativesoul):a,s=o&&e.targetPath&&Wr(e.host)?Kh(n,e.targetPath):n;return`${JSON.stringify(s,null,2)}
811
- `}function qh(e,t){return{...e,mcpServers:{nativesoul:t}}}function Kh(e,t){if(!e.hooks||Array.isArray(e.hooks)||typeof e.hooks!="object")return e;let r=e.hooks,o=Object.fromEntries(Object.entries(r).map(([a,n])=>Array.isArray(n)?[a,n.map(s=>Gh(s,t))]:[a,n]));return{...e,hooks:o}}function Gh(e,t){if(!e||Array.isArray(e)||typeof e!="object")return e;let r=e,o=r.hooks;return Array.isArray(o)?{...r,hooks:o.map(a=>Wh(a,t))}:e}function Wh(e,t){if(!e||Array.isArray(e)||typeof e!="object")return e;let r=e,o=typeof r.command=="string"?r.command:null;if(!o)return e;if(o.includes("host-hook.cjs")){let s=Xt(Ve.join(t,"shared","hooks","host-hook.cjs"));return{...r,command:`node ${JSON.stringify(s)} ${zh(o)}`}}let a=ia.find(s=>o.includes(s.commandFragment));if(!a?.fileName)return e;let n=Xt(Ve.join(t,"hooks",a.fileName));return{...r,command:`node ${JSON.stringify(n)}`}}function zh(e){let t=["session-start","prompt-bootstrap","pre-tool-use","memory-flush","recall"].find(n=>e.includes(n))??"session-start",r=e.match(/--host\s+([A-Za-z0-9_-]+)/u)?.[1],o=e.match(/--project-env\s+([A-Za-z0-9_-]+)/u)?.[1],a=e.match(/--event\s+([A-Za-z0-9_-]+)/u)?.[1];return[t,r?`--host ${r}`:null,o?`--project-env ${o}`:null,a?`--event ${a}`:null].filter(n=>n!==null).join(" ")}async function ls(e){let t=g(e.home),r=Yn(e.host);if(!e.targetPath||!r)return $d(e.host,e.surface,e.targetPath,r,!e.apply);let o=is(e.targetPath)?await ns(e.targetPath):null,a=await Nd(r,e.host,t.home,e.targetPath),n=o===null?"create":o===a?"noop":"replace",s=n!=="noop",i=s&&e.apply&&is(e.targetPath)?await as(t.home,e.host,e.surface,e.targetPath):null,l=[];s&&e.apply&&(await Yh(Qh.dirname(e.targetPath),{recursive:!0,mode:448}),await Dd(e.targetPath,{recursive:!0,force:!0}),await Xh(r,e.targetPath,{recursive:!0}),Wr(e.host)&&await Od(e.targetPath),await Md({host:e.host,targetPath:e.targetPath,home:t.home})),e.apply&&e.host==="claude"&&await Ad(e.targetPath),e.apply&&l.push(...Pd(e.host,e.surface,e.targetPath));let c=e.targetPath&&qr(e.host,e.surface)?await ot({host:e.host,surface:e.surface,targetPath:e.targetPath}):null,d=Gr(e.host,e.surface),p={host:e.host,surface:e.surface,targetPath:e.targetPath,sourcePath:r,action:n,dryRun:!e.apply,changed:s,beforeHash:o,afterHash:a,backupPath:i,applied:s&&e.apply,enabled:c?.enabled??!1,hook_registered:c?.hook_registered??!1,package_kind:c?.package_kind??d.packageKind,native_hooks_supported:c?.native_hooks_supported??d.nativeHooksSupported,native_scheduler_supported:c?.native_scheduler_supported??!1,issues:[...c?.issues??[],...l]};return await f({home:t.home,type:e.apply?"plugin_install":"plugin_install_dry_run",details:p}),p}async function cs(e){let t=g(e.home),r=Yn(e.host);if(!e.targetPath||!r)return $d(e.host,e.surface,e.targetPath,r,!e.apply);let o=is(e.targetPath)?await ns(e.targetPath):null,a=Gr(e.host,e.surface),n=o!==null,s=n&&e.apply?await as(t.home,e.host,e.surface,e.targetPath):null;n&&e.apply&&await Dd(e.targetPath,{recursive:!0,force:!0});let i={host:e.host,surface:e.surface,targetPath:e.targetPath,sourcePath:r,action:n?"remove":"noop",dryRun:!e.apply,changed:n,beforeHash:o,afterHash:S(""),backupPath:s,applied:n&&e.apply,enabled:!1,hook_registered:!1,package_kind:a.packageKind,native_hooks_supported:a.nativeHooksSupported,native_scheduler_supported:!1,issues:[]};return await f({home:t.home,type:e.apply?"plugin_uninstall":"plugin_uninstall_dry_run",details:i}),i}function $d(e,t,r,o,a){return{host:e,surface:t,targetPath:r,sourcePath:o,action:"unsupported",dryRun:a,changed:!1,beforeHash:null,afterHash:S(""),backupPath:null,applied:!1,enabled:!1,hook_registered:!1,package_kind:"unsupported-native",native_hooks_supported:!1,native_scheduler_supported:!1,issues:[]}}function Be(e,t){if(t)return Qt.resolve(t,e)}function Zt(e,t,r){let o=$r(e,r);if(e==="claude"&&o==="claude-desktop")return{surface:o,managedBlock:null,mcpRegistration:t?Qt.join(Qt.resolve(t,e),"claude_desktop_config.json"):dd(),plugin:Ce(e,o,t)};if(!t)return{surface:o,managedBlock:cd(e),mcpRegistration:ra(e),plugin:Ce(e,o)};let a=Qt.resolve(t,e);return{surface:o,managedBlock:Qt.join(a,id(e)),mcpRegistration:Qt.join(a,ld(e)),plugin:Ce(e,o,t)}}import{accessSync as Zh,constants as ey,existsSync as at}from"node:fs";import{mkdir as ua,readFile as er,rm as ty,writeFile as pa}from"node:fs/promises";import q from"node:path";async function Xr(e){let t=g(e.home),r=q.resolve(e.targetPath??ma(e.host)),o=e.commandMode??"package",a=Tt({host:e.host,commandMode:o,home:t.home,projectRoot:e.projectRoot}).mcpServers.nativesoul,n=at(r),s=n?await er(r,"utf8"):null,i=Vd(ry(zr(s),a)),l=s===null?null:S(s),c=S(i),d=ly(s,i),p=d!=="noop",h=p&&e.apply?await Bd(t.home,e.host,r,n,s,c):null;p&&e.apply&&(await ua(q.dirname(r),{recursive:!0,mode:448}),await pa(r,i,{encoding:"utf8",mode:384}));let y={host:e.host,targetPath:r,action:d,dryRun:!e.apply,changed:p,beforeHash:l,afterHash:c,diff:Jd(s,i),backupPath:h,commandMode:o,applied:p&&e.apply};return await f({home:t.home,type:e.apply?"mcp_registration_apply":"mcp_registration_dry_run",details:y}),y}async function us(e){let t=g(e.home),r=q.resolve(e.targetPath??ma(e.host)),o=at(r),a=o?await er(r,"utf8"):null,n=oy(a),s=a===null?null:S(a),i=n===null?S(""):S(n),l=a!==n?"remove":"noop",c=l!=="noop",d=c&&e.apply?await Bd(t.home,e.host,r,o,a,i):null;c&&e.apply&&n!==null&&(await ua(q.dirname(r),{recursive:!0,mode:448}),await pa(r,n,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:r,action:l,dryRun:!e.apply,changed:c,beforeHash:s,afterHash:i,diff:Jd(a,n),backupPath:d,commandMode:"package",applied:c&&e.apply};return await f({home:t.home,type:e.apply?"mcp_registration_uninstall":"mcp_registration_uninstall_dry_run",details:p}),p}async function ps(e){let t=g(e.home),r=JSON.parse(await er(e.snapshotPath,"utf8"));e.apply&&(r.beforeExists&&r.beforeContent!==null?(await ua(q.dirname(r.targetPath),{recursive:!0,mode:448}),await pa(r.targetPath,r.beforeContent,{encoding:"utf8",mode:384})):at(r.targetPath)&&await ty(r.targetPath));let o={snapshotPath:e.snapshotPath,targetPath:r.targetPath,dryRun:!e.apply,applied:e.apply,restoredExists:r.beforeExists,restoredHash:r.beforeHash};return await f({home:t.home,type:e.apply?"mcp_registration_rollback":"mcp_registration_rollback_dry_run",details:o}),o}async function Yr(e){let t=q.resolve(e.targetPath??ma(e.host)),r=pd(e.host,e.targetPath),o=at(t),a=[],n=await ay(e.host,t,r);if(n&&a.push(n),!o)return a.push({code:"MCP_CONFIG_MISSING",severity:"warn",message:`MCP config target is missing: ${t}`,remediation:"Run nativesoul mcp install --host <host> --target <path> --apply"}),{host:e.host,targetPath:t,target_exists:!1,parse_ok:!1,configured:!1,command:null,command_ok:!1,issues:a};let s=null;try{s=zr(await er(t,"utf8"))}catch(p){a.push({code:"MCP_CONFIG_INVALID_JSON",severity:"error",message:p instanceof Error?p.message:"MCP config is invalid JSON",remediation:"Fix the JSON syntax or roll back from an NativeSoul snapshot"})}let i=s?ds(s):null,l=typeof i?.command=="string"?i.command:null,c=Array.isArray(i?.args)?i.args.filter(p=>typeof p=="string"):[];i?l||a.push({code:"NATIVESOUL_MCP_COMMAND_MISSING",severity:"error",message:"nativesoul MCP server command is missing",remediation:"Re-run nativesoul mcp install"}):a.push({code:"NATIVESOUL_MCP_MISSING",severity:"warn",message:"nativesoul MCP server entry is not configured",remediation:"Run nativesoul mcp install --host <host> --target <path> --apply"});let d=l?e.checkCommand===!1?{ok:!0,issues:[]}:ny(l,c,t):{ok:!1,issues:[]};return a.push(...d.issues),{host:e.host,targetPath:t,target_exists:o,parse_ok:s!==null,configured:i!==null,command:l,command_ok:d.ok,issues:a}}function ma(e){return ra(e)}function zr(e){if(e===null||e.trim().length===0)return{};let t=JSON.parse(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error("MCP config root must be a JSON object");return t}function ry(e,t){let r=e.mcpServers,o=r&&typeof r=="object"&&!Array.isArray(r)?{...r}:{};return o.nativesoul={command:t.command,args:t.args,...t.env&&Object.keys(t.env).length>0?{env:t.env}:{}},{...e,mcpServers:o}}function oy(e){if(e===null)return null;let t=zr(e),r=t.mcpServers;if(!r||typeof r!="object"||Array.isArray(r)||!Object.hasOwn(r,"nativesoul"))return e;let o={...r};return delete o.nativesoul,Vd({...t,mcpServers:o})}function ds(e){let t=e.mcpServers;if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t.nativesoul;return!r||typeof r!="object"||Array.isArray(r)?null:r}async function ay(e,t,r){if(e!=="claude"||r===null||q.resolve(r)===t||!at(r))return null;try{let o=zr(await er(r,"utf8")),a=ds(o);if(!a)return null;if(at(t)){let n=zr(await er(t,"utf8")),s=ds(n);if(s&&JSON.stringify(Fd(s))===JSON.stringify(Fd(a)))return null}}catch{return null}return{code:"LEGACY_MCP_PATH",severity:"warn",message:`Legacy Claude MCP registration detected at ${r}.`,remediation:"Migrate to ~/.claude.json with nativesoul mcp install --host claude --apply, then uninstall or roll back the legacy ~/.claude/mcp.json entry."}}function Fd(e){return{command:typeof e.command=="string"?e.command:null,args:Array.isArray(e.args)?e.args.filter(t=>typeof t=="string"):[]}}function ny(e,t,r){let o=[],a=sy(e);if(!a)return o.push({code:"NATIVESOUL_MCP_COMMAND_UNRESOLVED",severity:"error",message:`nativesoul MCP command does not resolve to an executable: ${e}`,remediation:"Reinstall with NATIVESOUL_MCP_COMMAND set to an absolute nativesoul-mcp path, or run npm install -g nativesoul and retry."}),{ok:!1,issues:o};if(iy(e,a)){let n=t[0],s=n?q.isAbsolute(n)?n:q.resolve(q.dirname(r),n):null;if(!s||!at(s))return o.push({code:"NATIVESOUL_MCP_NODE_SCRIPT_MISSING",severity:"error",message:"nativesoul MCP command uses node but the server script is missing.",remediation:"Re-run nativesoul mcp install with --command-mode absolute or rebuild the local package."}),{ok:!1,issues:o}}return{ok:!0,issues:o}}function sy(e){if(q.isAbsolute(e))return Ud(e)?e:null;let t=(process.env.PATH??"").split(q.delimiter).filter(Boolean),r=process.platform==="win32"?(process.env.PATHEXT??".EXE;.CMD;.BAT").split(";"):[""];for(let o of t)for(let a of r){let n=q.join(o,`${e}${a}`);if(Ud(n))return n}return null}function Ud(e){if(process.platform==="win32"&&at(e))return!0;try{return Zh(e,ey.X_OK),!0}catch{return!1}}function iy(e,t){let r=q.basename(e).toLowerCase(),o=q.basename(t).toLowerCase();return r==="node"||r==="node.exe"||o==="node"||o==="node.exe"}function Vd(e){return`${JSON.stringify(e,null,2)}
812
- `}function ly(e,t){return e===t?"noop":e===null||e.trim().length===0?"create":"update"}async function Bd(e,t,r,o,a,n){let s=q.join(e,"backups","mcp-registration");await ua(s,{recursive:!0,mode:448});let i=new Date().toISOString(),l={id:O("snapshot"),host:t,targetPath:r,beforeExists:o,beforeContent:a,beforeHash:a===null?null:S(a),afterHash:n,createdAt:i},c=q.join(s,`${i.replaceAll(/[:.]/gu,"-")}-${t}.json`);return await pa(c,JSON.stringify(l,null,2),{encoding:"utf8",mode:384}),c}function Jd(e,t){return e===t?"No changes.":[`before: ${e===null?"missing":S(e)}`,`after: ${t===null?"missing":S(t)}`,`lines_before: ${e===null?0:e.split(/\r?\n/u).length}`,`lines_after: ${t===null?0:t.split(/\r?\n/u).length}`].join(`
813
- `)}async function nt(e){let t=await b(e.home),r=e.surface??null,o=$r(e.host,r),a=e.hostConfigRoot??(e.targetRoot?Be(e.host,e.targetRoot):void 0),n=await py({host:e.host,surface:o,targetRoot:e.targetRoot,explicit:e.pluginEnabled}),s=new Date().toISOString(),i=dy(e.mode,r,e.heartbeat),l=await ht(e.host).scheduleReconcile({kind:"heartbeat",mode:e.mode,enabled:!0,surface:e.surface??void 0,apply:e.apply,hostConfigRoot:a,desired:i}),c={id:my(e.host,e.surface),host:e.host,mode:e.mode,enabled:!0,native_schedule_supported:l.status==="ok",native_id:l.status==="ok"?l.nativeId??null:null,desired:i,updated_at:s},d=e.apply?cy(t.database,c):c,p={dryRun:!e.apply,applied:e.apply,schedule:d,adapter_result:l,warnings:uy(e.host,l.status,n)};return await f({home:t.home,type:e.apply?"schedule_reconciled":"schedule_reconcile_dry_run",details:{host:e.host,surface:e.surface??null,mode:e.mode,schedule_id:c.id,adapter_status:l.status,native_schedule_supported:c.native_schedule_supported}}),p}async function Qr(e){let t=e.readOnly?g(e.home):await b(e.home);if(e.readOnly&&!await k(t.database))return[];let r=v(t.database,{readOnly:e.readOnly});try{return r.listSchedules({host:e.host,limit:Math.min(Math.max(e.limit??50,1),200)})}finally{r.close()}}async function ms(e){let t=await b(e.home),r=v(t.database),o,a;try{if(o=r.listSchedules({limit:200}).find(n=>n.id===e.id),!o)throw new Error(`Schedule not found: ${e.id}`);a=e.apply?r.disableSchedule(e.id,new Date().toISOString()):o}finally{r.close()}if(!a)throw new Error(`Schedule not found after disable: ${e.id}`);return await f({home:t.home,type:e.apply?"schedule_disabled":"schedule_disable_dry_run",details:{schedule_id:e.id,host:a.host,mode:a.mode}}),{dryRun:!e.apply,applied:e.apply,schedule:e.apply?a:{...a,enabled:!1}}}function cy(e,t){let r=v(e);try{return r.upsertSchedule(t)}finally{r.close()}}function dy(e,t,r){return{kind:"heartbeat",mode:e,policy:"read_only",silent_ack:"HEARTBEAT_OK",skill:"life:heartbeat",cadence:r?.cadence??"daily",skip_when_busy:r?.skipWhenBusy??!0,project_scope:r?.projectScope??"current-project",behavior:r?.behavior??"read_only",...t&&t!=="default"?{surface:t}:{}}}function uy(e,t,r){return t!=="unsupported"?[]:e==="grok"||e==="gemini"?[]:r===!1?["NATIVE_SCHEDULE_UNSUPPORTED_NO_FALLBACK_INSTALLED"]:["NATIVE_SCHEDULE_UNSUPPORTED"]}async function py(e){if(e.explicit!==void 0)return e.explicit;try{let t=Ce(e.host,e.surface,e.targetRoot);return(await ot({host:e.host,surface:e.surface,targetPath:t})).enabled}catch{return!1}}function my(e,t){return e==="claude"&&t&&t!=="default"?`schedule:${e}:heartbeat:${t}`:`schedule:${e}:heartbeat`}function gs(e){let t=e.observedAt??new Date().toISOString(),r=e.plugin.enabled&&["native-plugin","official-extension"].includes(e.plugin.package_kind),o=e.plugin.native_hooks_supported&&e.plugin.hook_registered,a=e.mcpRegistration.configured,n=e.schedules.some(y=>fy(y,t)),s=vy(e.capabilities,e.adapterDiagnostics),i=[Zr("native_package",r,t,e.plugin.targetPath??e.plugin.package_kind,"Native package/extension is not installed or enabled."),Zr("native_hooks",o,t,e.plugin.targetPath??e.plugin.package_kind,"Native lifecycle hook registration is missing."),Zr("mcp",a,t,e.mcpRegistration.targetPath,"MCP registration is missing or invalid."),Zr("native_scheduler",n,t,yy(e.schedules),by(e.host,e.schedules)),Zr("official_inventory",s,t,_y(e.capabilities),"Official non-degraded capability inventory evidence is missing.")],l=i.filter(y=>!y.satisfied).map(y=>y.requirement),c=r&&o&&a,d=!s,p=l.includes("native_scheduler")&&qd(e.host),h=l.length===0;return{schema_version:1,host:e.host,surface:e.surface,status:wy({fullNative:h,blockedByHost:p,degradedScan:d,ready:c}),ready:c,full_native:h,blocked_by_host:p,degraded_scan:d,generated_at:t,requirements:i,missing_requirements:l}}function fs(e){return e.ready&&e.native_kind.includes("native")&&(e.schema_hash?.startsWith("full-native:")===!0||e.source.includes("full-native-evidence:"))}function Zr(e,t,r,o,a){return{requirement:e,satisfied:t,evidence:t?[{source_kind:"doctor",reference:o,observed_at:r,confidence:gy(o)}]:[],missing_reason:t?null:a}}function gy(e){return e.startsWith("not-applicable:")||e==="missing"?"low":"medium"}function fy(e,t){return e.enabled&&e.native_schedule_supported&&e.native_id!==null&&!hy(e.updated_at,t)}function hy(e,t){if(!e)return!1;let r=Date.parse(e),o=Date.parse(t);return!Number.isFinite(r)||!Number.isFinite(o)?!0:o-r>10080*60*1e3}function yy(e){let t=e.find(r=>r.native_id!==null);return t?.native_id?t.updated_at?`${t.native_id}@${t.updated_at}`:t.native_id:"missing"}function _y(e){return e.find(t=>t.ready)?.source??"missing"}function vy(e,t){return t.some(r=>r.severity==="error"||r.severity==="warn")?!1:e.some(r=>r.ready&&r.schema_hash?.startsWith("official:")===!0)}function by(e,t){return qd(e)?e==="claude"?"Claude local Scheduled Tasks proof is missing, UI-only, or cloud-routine-only for this surface.":e==="antigravity"?"Antigravity scheduler write/list/status/cancel contract proof is missing or stale.":`Host ${e} has no proven native scheduler support.`:t.some(r=>r.enabled)?"Enabled schedule uses fallback or has no native_id mapping.":"No enabled native schedule evidence is available."}function qd(e){return e==="codex"||e==="claude"||e==="grok"||e==="gemini"||e==="antigravity"}function wy(e){return e.fullNative?"full_native":e.blockedByHost?"blocked_by_host":e.degradedScan?"degraded_scan":e.ready?"ready_fallback":"ready"}async function Gd(e){let t=Zt(e.host,e.targetRoot,e.surface),r=t.managedBlock??`not-applicable:${xt(e.host,e.surface)}`,o=t.managedBlock?await Sc({host:e.host,targetPath:r}):Iy(e.host,e.surface),a=await Yr({host:e.host,targetPath:t.mcpRegistration,checkCommand:e.targetRoot===void 0}),n=await ot({host:e.host,surface:e.surface,targetPath:t.plugin}),s=await Wn({home:e.home,host:e.host}),l=(e.databaseExists?await Qr({home:e.home,host:e.host,limit:200,readOnly:!0}):[]).filter(E=>Ay(e.host,e.surface,E)),c=e.databaseExists?await be({home:e.home,host:e.host,limit:100,readOnly:!0}):[],d=e.databaseExists?aa(g(e.home).database):[],p=e.targetRoot!==void 0,h=p?[]:(await Rr(e.host))[0]?.diagnostics??[],y=l.length===0&&e.databaseExists?[{code:"SCHEDULE_DESIRED_STATE_MISSING",severity:"warn",message:`No persisted schedule desired state found for ${e.host}.`,remediation:e.targetRoot?`Run nativesoul install --host ${e.host} --apply --target-root ${e.targetRoot}`:"Run nativesoul install --host <host> --apply"}]:[],w=s.stale?[{code:"HANDSHAKE_STALE",severity:"warn",message:`Last ${e.host} handshake is ${s.age_hours??"unknown"} hour(s) old.`,remediation:`Run nativesoul bootstrap --host ${e.host} --cwd <current-working-directory> --format inject`}]:[],R=await xy({host:e.host,managedBlock:o,handshake:s}),H=await jy(e.host),fe=l.filter(E=>E.enabled&&E.native_schedule_supported&&E.native_id===null).map(E=>({code:"NATIVE_SCHEDULE_MAPPING_MISSING",severity:"warn",message:`Schedule ${E.id} reports native support but has no native_id mapping.`,remediation:e.targetRoot?`Run nativesoul schedule reconcile --host ${e.host} --apply --target-root ${e.targetRoot}`:`Run nativesoul schedule reconcile --host ${e.host} --apply`})),Se=l.filter(E=>E.enabled&&!E.native_schedule_supported&&!n.enabled&&n.package_kind!=="unsupported-native").map(E=>({code:"NATIVE_SCHEDULE_UNSUPPORTED_NO_FALLBACK_INSTALLED",severity:"warn",message:`Schedule ${E.id} has no native scheduler support and no NativeSoul package fallback is installed.`,remediation:`Run nativesoul install --host ${e.host} --apply`})),Ge=Ey({managedBlock:o,mcpRegistration:a,plugin:n,schedules:l,capabilities:c}),le=gs({host:e.host,surface:e.surface,mcpRegistration:a,plugin:n,schedules:l,capabilities:c,adapterDiagnostics:h}),Ae=[...o.issues,...a.issues,...n.issues,...h,...y,...w,...R,...H,...fe,...Se];return{host:e.host,surface:e.surface,status:Ae.some(E=>E.severity==="error"||E.severity==="warn")?"degraded":"ready",targets:{managed_block:r,mcp_registration:a.targetPath},native_adapter_diagnostics_skipped:p,adapter_diagnostics:h,managed_block:o,mcp_registration:a,plugin:n,provider_parity:Ge,full_native_evidence:le,handshake:s,schedule_count:l.length,enabled_schedule_count:l.filter(E=>E.enabled).length,native_schedule_mappings:l.map(E=>({id:E.id,native_schedule_supported:E.native_schedule_supported,native_id:E.native_id})),capability_count:c.length,ready_capability_count:c.filter(E=>E.ready).length,cross_host_inventory_summary:{current_host:c.length,other_hosts:d.filter(E=>E.host!==e.host&&E.host!=="all").length,ready_other_hosts:d.filter(E=>E.host!==e.host&&E.host!=="all"&&E.ready).length},issues:Ae}}function Ay(e,t,r){return e!=="claude"?!0:Py(r.desired)===t}function Py(e){if(e&&typeof e=="object"&&!Array.isArray(e)&&"surface"in e){let t=e.surface;if(t==="claude-desktop"||t==="claude-code")return t}return"claude-code"}function Ey(e){let t=e.plugin.enabled,r=e.mcpRegistration.configured,o=e.managedBlock.configured||t,a=e.schedules.some(p=>p.enabled),s=e.schedules.some(p=>p.enabled&&p.native_schedule_supported)?"native":a&&t?"official-fallback":"unsupported-native",i=e.plugin.native_hooks_supported?e.plugin.hook_registered?"native":"unsupported-native":t?"official-fallback":"unsupported-native",l=e.plugin.package_kind==="unsupported-native"?"unsupported-native":t?"ready":"degraded",c=e.capabilities.length===0||e.capabilities.some(p=>p.ready);return{level:o&&r&&l==="ready"&&i!=="unsupported-native"&&s!=="unsupported-native"?"ready":e.plugin.package_kind==="native-plugin"?"native":e.plugin.package_kind==="unsupported-native"?"unsupported-native":"official-fallback",bootstrap:o?"ready":"degraded",mcp:r?"ready":"degraded",package:l,hooks:i,memory_recall:r?"ready":"degraded",policy_guard:o?"ready":"degraded",capability_scan:c?"ready":"degraded",heartbeat:s}}async function xy(e){if(!e.managedBlock.configured||e.managedBlock.targetPath.startsWith("not-applicable:"))return[];let t=10080*60*1e3,r=await Cy(e.managedBlock.targetPath),o=e.handshake.age_ms;return r!==null&&r<=t?[]:o!==null&&o<=t?[]:[{code:"HANDSHAKE_NOT_OBSERVED",severity:"warn",message:`NativeSoul managed block is present for ${e.host}, but no handshake was observed in the last 7 days.`,remediation:`Start a host session or run nativesoul bootstrap --host ${e.host} --cwd <current-working-directory> --format inject`}]}async function jy(e){let t=Ty(e).map(r=>Kd.resolve(process.cwd(),r));for(let r of t){if(!Ry(r))continue;let o=await ky(r,"utf8"),a=Mr(o);if(a>2e3)return[{code:"PROJECT_CONTEXT_HEAVY",severity:"info",message:`Project instruction file is heavy (${a} estimated tokens): ${r}`,remediation:"Keep project rules authoritative for code boundaries; NativeSoul persona remains advisory continuity."}]}return[]}function Ty(e){switch(e){case"claude":return["CLAUDE.md",Kd.join(".claude","CLAUDE.md")];case"codex":return["AGENTS.md"];case"grok":return["Agents.md","AGENTS.md"];case"antigravity":case"gemini":return["GEMINI.md"]}}async function Cy(e){try{let t=await Sy(e);return Math.max(Date.now()-t.mtimeMs,0)}catch{return null}}function Iy(e,t){return{host:e,targetPath:`not-applicable:${xt(e,t)}`,target_exists:!1,configured:!0,markers_valid:!0,issues:[]}}async function Ct(e){let t=g(e.home),r=await Dr(e.home),o=hs(t.database),a=De(e.host),n=[],s=o?aa(t.database):[],i=yd(t.database,o),l=await et(t.home),c=hs(oa(t.home)),d=hs(Gt(t.home));for(let y of a)for(let w of Fe(y,e.surface))n.push(await Gd({home:t.home,host:y,surface:w,targetRoot:e.targetRoot,databaseExists:o}));let p=[...r.issues,..._d(i),...n.flatMap(y=>y.issues)],h=r.healthy&&!p.some(y=>y.severity==="error");return{home:t.home,healthy:h,status:p.some(y=>y.severity==="error"||y.severity==="warn")?"degraded":"ready",workspace:r,target_root:e.targetRoot?Wd.resolve(e.targetRoot):null,cross_host_inventory:vd(s),activation_summary:sd({home:t.home,targetRoot:e.targetRoot?Wd.resolve(e.targetRoot):null,host:e.host,profile:l,onboardingComplete:c,activationComplete:d,hosts:n}),full_native_matrix:Ny(n),semantic_index:i,hosts:n,issues:p}}function Ny(e){let t=e.map(r=>({host:r.host,surface:r.surface,status:r.full_native_evidence.status,full_native:r.full_native_evidence.full_native,blocked_by_host:r.full_native_evidence.blocked_by_host,degraded_scan:r.full_native_evidence.degraded_scan,missing_requirements:r.full_native_evidence.missing_requirements}));return{require_full_native_ready:t.length>0&&t.every(r=>r.full_native),host_count:t.length,full_native_count:t.filter(r=>r.full_native).length,blocked_count:t.filter(r=>r.blocked_by_host).length,degraded_scan_count:t.filter(r=>r.degraded_scan).length,ready_fallback_count:t.filter(r=>r.status==="ready_fallback").length,hosts:t}}import{existsSync as Oy}from"node:fs";import{mkdir as My,readdir as Ly,readFile as Hy,writeFile as Dy}from"node:fs/promises";import eo from"node:path";async function ys(e){let t=e.apply===!0,r=t?g((await b(e.home)).home):g(e.home),o=e.project??D(e.cwd??process.cwd(),r.home),a=Math.min(Math.max(e.limit??10,1),50),n=await $y(r.home,r.database,o,a),s=Uy(o,n,a),i=Jy({applied:t,project:o,proposals:s,dailyNotes:n.dailyNotes,candidates:n.candidates,activeMemories:n.activeMemories,auditEvents:n.auditEvents}),l=null;return t&&(l=await Vy(r.home,i),await By(r.home,s),await f({home:r.home,type:"memory_reflection_run",details:{project:o,proposal_count:s.length,report_path:l,daily_notes:n.dailyNotes.length,candidates:n.candidates.length,active_memories:n.activeMemories.length,audit_events:n.auditEvents.length}})),{applied:t,home:r.home,project:o,report:i,report_path:l,proposals:s,sources:{daily_notes:n.dailyNotes.length,candidates:n.candidates.length,active_memories:n.activeMemories.length,audit_events:n.auditEvents.length},protected_files:["SOUL.md","POLICY.md","standing-orders"].map(c=>({path:eo.join(r.home,c),modified:!1}))}}async function $y(e,t,r,o){let a=await Fy(e,o);if(!Oy(t))return{dailyNotes:a,candidates:[],activeMemories:[],auditEvents:[]};let n=v(t,{readOnly:!0});try{return{dailyNotes:a,candidates:n.listMemories({project:r,status:"candidate",includeForgotten:!1,limit:o}),activeMemories:n.listMemories({project:r,status:"active",includeForgotten:!1,limit:Math.max(o,20)}),auditEvents:n.listEvents({limit:Math.max(o,20)})}}finally{n.close()}}async function Fy(e,t){let r=eo.join(e,"memory","daily");if(!await k(r))return[];let a=(await Ly(r,{withFileTypes:!0})).filter(s=>s.isFile()&&s.name.endsWith(".md")).map(s=>s.name).sort().reverse().slice(0,t),n=[];for(let s of a){let i=eo.join(r,s),l=M(await Hy(i,"utf8")).value.trim();l.length>0&&n.push({id:`daily:${s}`,path:i,text:l})}return n}function Uy(e,t,r){let o=[];for(let a of t.candidates){let n=zd(a.content,t.activeMemories),s=Ky(a.content,t.activeMemories);if(s){o.push(tr({action:"flag_conflict",project:e,summary:`Review conflict between ${a.id} and ${s.id}`,before:s.summary,after:a.summary,evidence:[a.id,s.id],risk:"high"}));continue}if(n&&n.score>=.7){o.push(tr({action:"deduplicate",project:e,summary:`Reject or merge duplicate candidate ${a.id}`,before:n.memory.summary,after:a.summary,evidence:[a.id,n.memory.id],risk:"medium"}));continue}o.push(tr({action:"promote_candidate",project:e,summary:`Promote candidate ${a.id} after human review`,before:"Candidate memory is not durable yet.",after:a.summary,evidence:[a.id],risk:"low"}))}for(let a of t.dailyNotes){let n=qy(a.text);for(let s of n){if(o.length>=r)return o;let i=zd(s,[...t.activeMemories,...t.candidates]);i&&i.score>=.7?o.push(tr({action:"deduplicate",project:e,summary:`Daily note repeats existing memory ${i.memory.id}`,before:i.memory.summary,after:$e(s),evidence:[a.id,i.memory.id],risk:"medium"})):o.push(tr({action:"create_candidate",project:e,summary:$e(s),before:"No durable memory exists for this daily note.",after:s,evidence:[a.id],risk:"low"}))}}for(let a of t.activeMemories)if(a.expires_at&&Date.parse(a.expires_at)<=Date.now()&&o.push(tr({action:"expire_active",project:e,summary:`Expire active memory ${a.id}`,before:a.summary,after:"Memory should move to expired after human review.",evidence:[a.id],risk:"medium"})),o.length>=r)return o;return o.slice(0,r)}function tr(e){return{id:O("reflection"),persisted_memory_id:null,...e}}async function Vy(e,t){let r=eo.join(e,"proposals");await My(r,{recursive:!0,mode:448});let o=eo.join(r,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-reflection.md`);return await Dy(o,t,{encoding:"utf8",mode:384,flag:"wx"}),o}async function By(e,t){for(let r of t.filter(o=>o.action==="create_candidate")){let o=await te(e,{project:r.project,content:["Reflection consolidation candidate.","",r.after,"",`Evidence: ${r.evidence.join(", ")}`].join(`
814
- `),confidence:.5,authority:"reflection_proposal",source:{kind:"reflection",proposal_id:r.id,evidence:r.evidence}});r.persisted_memory_id=o.id}}function Jy(e){let t=["# NativeSoul Reflection Report","",`Mode: ${e.applied?"apply":"dry-run"}`,`Project: ${e.project}`,`Generated at: ${new Date().toISOString()}`,"","## Sources","",`- Daily notes: ${e.dailyNotes.length}`,`- Candidate memories: ${e.candidates.length}`,`- Active memories: ${e.activeMemories.length}`,`- Audit events: ${e.auditEvents.length}`,"","## Before","",...e.candidates.map(r=>`- Candidate ${r.id}: ${r.summary}`),...e.activeMemories.slice(0,10).map(r=>`- Active ${r.id}: ${r.summary}`),"","## Proposed After",""];e.proposals.length===0&&t.push("- No consolidation proposal found.");for(let r of e.proposals)t.push(`- ${r.id} [${r.action}] ${r.summary}`),t.push(` - Before: ${r.before}`),t.push(` - After: ${r.after}`),t.push(` - Evidence: ${r.evidence.join(", ")}`),t.push(` - Risk: ${r.risk}`);return t.push("","## Safety","","- SOUL.md, POLICY.md, and standing-orders are not edited by reflection."),t.join(`
815
- `)}function qy(e){return e.split(/\r?\n/u).map(t=>t.replace(/^\s*[-*]\s+/u,"").trim()).filter(t=>t.length>=20).filter(t=>!t.startsWith("#")).filter(t=>!/^(date|notes|observations|tasks):?$/iu.test(t)).slice(0,10)}function zd(e,t){let r=null;for(let o of t){let a=Qd(e,`${o.summary}
816
- ${o.content}`);(!r||a>r.score)&&(r={memory:o,score:a})}return r}function Ky(e,t){let r=Yd(e),o=Xd(e);for(let a of t)if(Qd(e,`${a.summary}
817
- ${a.content}`)>=.35&&o!==Xd(a.content)){let s=Yd(a.content);if([...r].some(l=>l.length>4&&s.has(l)))return a}return null}function Xd(e){return/\b(nao|não|never|do not|dont|don't|no longer|avoid|evitar|proibir|forbid)\b/iu.test(e)}function Qd(e,t){return Uc(e,t,{minLength:3,normalizeDiacritics:!0,removeStopwords:!0})}function Yd(e){return Nr(e,{minLength:3,normalizeDiacritics:!0,removeStopwords:!0})}import{lstat as Gy,readdir as Wy,readFile as zy}from"node:fs/promises";import It from"node:path";var Zd=new Set([".json",".jsonl",".md",".markdown",".txt"]);async function bs(e){let t=e.apply===!0,r=g((await b(e.home)).home),o=It.resolve(e.sourcePath),a=e.project??D(e.cwd??process.cwd(),r.home),n=Math.min(Math.max(e.limit??200,1),1e3),s=[],i=await eu(o,s),l=[],c=[];for(let w of i){if(l.length>=n){c.push({source_path:w,reason:"limit_reached"});continue}let R=await Xy(w,s);if(R.length===0){c.push({source_path:w,reason:"no_supported_records"});continue}l.push(...R.slice(0,n-l.length))}let d=t_(l,a),p=r_(d).map(w=>({source_id:w,reason:"duplicate_source_id"})),h=[];if(t)for(let w of d){let R=await te(r.home,{project:w.target_project,content:w.content,confidence:w.confidence,authority:"openclaw_import",source:{kind:"import",source_system:w.source_system,source_path:w.source_path,source_id:w.source_id,source_hash:w.source_hash,imported_at:new Date().toISOString(),redacted:w.redacted}});w.proposed_memory_id=R.id,h.push(R)}let y={applied:t,source_path:o,files:i,mapped_records:d,skipped_records:c,conflicts:p,redactions:d.filter(w=>w.redacted).length,proposed_scopes:Array.from(new Set(d.map(w=>w.target_project))).sort(),warnings:s,persisted_memories:h};return await f({home:r.home,type:t?"openclaw_import_applied":"openclaw_import_dry_run",details:a_(y)}),y}async function eu(e,t){let r;try{r=await Gy(e)}catch{return t.push({code:"OPENCLAW_SOURCE_UNREADABLE",source_path:e,message:"Source path is not readable."}),[]}if(r.isFile())return Zd.has(It.extname(e).toLowerCase())?[e]:[];if(!r.isDirectory())return t.push({code:"OPENCLAW_SOURCE_UNSUPPORTED",source_path:e,message:"Source path is neither a file nor a directory."}),[];let o=await Wy(e,{withFileTypes:!0});return(await Promise.all(o.map(n=>{let s=It.join(e,n.name);return n.isDirectory()?eu(s,t):Promise.resolve(Zd.has(It.extname(n.name).toLowerCase())?[s]:[])}))).flat().sort()}async function Xy(e,t){let r;try{r=await zy(e,"utf8")}catch{return t.push({code:"OPENCLAW_FILE_UNREADABLE",source_path:e,message:"File could not be read."}),[]}let o=It.extname(e).toLowerCase();return o===".json"?Yy(e,r,t):o===".jsonl"?Qy(e,r,t):Zy(e,r)}function Yy(e,t,r){let o;try{o=JSON.parse(t)}catch{return r.push({code:"OPENCLAW_JSON_MALFORMED",source_path:e,message:"JSON file is malformed."}),[]}return(Array.isArray(o)?o:e_(o)??[o]).flatMap((n,s)=>tu(n,e,s))}function Qy(e,t,r){return t.split(/\r?\n/u).flatMap((o,a)=>{let n=o.trim();if(!n)return[];try{return tu(JSON.parse(n),e,a)}catch{return r.push({code:"OPENCLAW_JSONL_LINE_MALFORMED",source_path:e,message:`Line ${a+1} is malformed.`}),[]}})}function Zy(e,t){return t.split(/\n(?=#{1,3}\s+)/u).map(r=>r.trim()).filter(r=>r.length>0).map((r,o)=>({id:null,content:r,project:null,confidence:null,sourcePath:e,raw:{kind:"text_section",index:o,source_path:e}}))}function e_(e){if(!ws(e))return null;for(let t of["memories","memory","records","items","notes"]){let r=e[t];if(Array.isArray(r))return r}return null}function tu(e,t,r){if(typeof e=="string"&&e.trim().length>0)return[{id:null,content:e,project:null,confidence:null,sourcePath:t,raw:e}];if(!ws(e))return[];let o=_s(e,["content","text","summary","memory","note","body","value"]);return o?[{id:_s(e,["id","uid","uuid","key"])??`${It.basename(t)}:${r+1}`,content:o,project:_s(e,["project","project_id","scope_project","workspace","repo"]),confidence:o_(e,["confidence","score"]),sourcePath:t,raw:vs(e)}]:[]}function t_(e,t){return e.map((r,o)=>{let a=M(r.content),n=r.id??`${It.basename(r.sourcePath)}:${o+1}`;return{source_system:"openclaw",source_path:r.sourcePath,source_id:n,source_hash:n_(r.raw),target_project:r.project?.trim()||t,content:a.value,summary:$e(a.value),redacted:a.redacted,confidence:Math.min(Math.max(r.confidence??.55,0),1),status:"candidate",proposed_memory_id:null}})}function r_(e){let t=new Map;for(let r of e)t.set(r.source_id,(t.get(r.source_id)??0)+1);return Array.from(t.entries()).filter(([,r])=>r>1).map(([r])=>r).sort()}function _s(e,t){for(let r of t){let o=e[r];if(typeof o=="string"&&o.trim().length>0)return o.trim()}return null}function o_(e,t){for(let r of t){let o=e[r];if(typeof o=="number"&&Number.isFinite(o))return o}return null}function a_(e){return{source_path:e.source_path,files:e.files.length,mapped_records:e.mapped_records.length,skipped_records:e.skipped_records.length,conflicts:e.conflicts.length,redactions:e.redactions,persisted_memories:e.persisted_memories.length,proposed_scopes:e.proposed_scopes}}function vs(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?e:Array.isArray(e)?e.map(t=>vs(t)):ws(e)?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,vs(r)])):String(e)}function ws(e){return typeof e=="object"&&e!==null}function n_(e){return ye(e)}import{lstat as s_,readFile as i_}from"node:fs/promises";import to from"node:path";var Nt=[".json",".jsonl",".md",".markdown",".txt"];var l_={nativesoul:{host:"nativesoul",supported_extensions:Nt,documented_inputs:["nativesoul memory export JSON/JSONL","operator-authored Markdown/text memory notes"],unsupported_boundaries:["NativeSoul private SQLite databases","undocumented internal cache files"],limitations:[]},codex:{host:"codex",supported_extensions:Nt,documented_inputs:["operator-provided Codex memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Codex private app stores","Codex cache or thread databases","undocumented internal state"],limitations:["Codex does not expose a NativeSoul-owned private store reader; import requires an explicit user-selected file."]},claude:{host:"claude",supported_extensions:Nt,documented_inputs:["operator-provided Claude memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Claude private settings databases","Claude internal conversation stores","undocumented internal state"],limitations:["Claude import is limited to explicit export or notes files selected by the operator."]},gemini:{host:"gemini",supported_extensions:Nt,documented_inputs:["operator-provided Gemini memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Gemini private app storage","Gemini internal cache files","undocumented internal state"],limitations:["No private Gemini memory database is read; use documented exports or operator-authored files."]},grok:{host:"grok",supported_extensions:Nt,documented_inputs:["operator-provided Grok memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Grok private app storage","Grok internal session stores","undocumented internal state"],limitations:["Grok import is file-only because no native memory store reader is supported."]},antigravity:{host:"antigravity",supported_extensions:Nt,documented_inputs:["operator-provided Antigravity memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Antigravity private workspace state","Antigravity scheduled-task stores","undocumented internal state"],limitations:["Antigravity import is constrained to explicit files; scheduler state is not memory import input."]}};function c_(e){return ye(e)}async function Ss(e){let t=l_[e.host];if(!t)throw new Error(`Unsupported native host importer: ${String(e.host)}`);let r=e.apply===!0,o=g((await b(e.home)).home),a=to.resolve(e.sourcePath),n=e.project??D(e.cwd??process.cwd(),o.home),s=Math.min(Math.max(e.limit??200,1),1e3),i=[],l=await d_(e.host,a,i),c=[],d=[];for(let R of l){if(c.length>=s){d.push({source_path:R,reason:"limit_reached"});continue}let H=await u_(e.host,R,i);if(H.length===0){d.push({source_path:R,reason:"no_supported_records"});continue}c.push(...H.slice(0,s-c.length))}let p=f_(e.host,c,n),h=await h_(o.home,p),y=[];if(r)for(let R of p){let H=await te(o.home,{project:R.target_project,content:R.content,confidence:R.confidence,authority:`${R.source_system}_import`,source:{kind:"import",source_system:R.source_system,source_path:R.source_path,source_id:R.source_id,source_hash:R.source_hash,normalized_content_hash:R.normalized_content_hash,imported_at:new Date().toISOString(),redacted:R.redacted}});R.proposed_memory_id=H.id,y.push(H)}let w={applied:r,host:e.host,source_path:a,registry:t,files:l,mapped_records:p,skipped_records:d,conflicts:h,redactions:p.filter(R=>R.redacted).length,proposed_scopes:Array.from(new Set(p.map(R=>R.target_project))).sort(),approvals_required:["Human review is required before imported candidate memories are promoted."],host_limitations:t.limitations,warnings:i,persisted_memories:y};return await f({home:o.home,type:r?"native_host_import_applied":"native_host_import_dry_run",details:y_(w)}),w}async function d_(e,t,r){let o;try{o=await s_(t)}catch{return r.push({code:"NATIVE_IMPORT_SOURCE_UNREADABLE",host:e,source_path:t,message:"Source path is not readable."}),[]}return o.isFile()?b_(t)?[t]:(r.push({code:"NATIVE_IMPORT_FILE_UNSUPPORTED",host:e,source_path:t,message:"File extension is not supported by the native host importer registry."}),[]):o.isDirectory()?(r.push({code:"NATIVE_IMPORT_DIRECTORY_UNSUPPORTED",host:e,source_path:t,message:"Native host importers require an explicit file path and do not scan directories."}),[]):o.isDirectory()?[]:(r.push({code:"NATIVE_IMPORT_SOURCE_UNSUPPORTED",host:e,source_path:t,message:"Source path is neither a file nor a directory."}),[])}async function u_(e,t,r){let o;try{o=await i_(t,"utf8")}catch{return r.push({code:"NATIVE_IMPORT_FILE_UNREADABLE",host:e,source_path:t,message:"File could not be read."}),[]}let a=to.extname(t).toLowerCase();return a===".json"?p_(e,t,o,r):a===".jsonl"?m_(e,t,o,r):g_(t,o)}function p_(e,t,r,o){let a;try{a=JSON.parse(r)}catch{return o.push({code:"NATIVE_IMPORT_JSON_MALFORMED",host:e,source_path:t,message:"JSON file is malformed."}),[]}return(Array.isArray(a)?a:__(a)??[a]).flatMap((s,i)=>ou(s,t,i))}function m_(e,t,r,o){return r.split(/\r?\n/u).flatMap((a,n)=>{let s=a.trim();if(!s)return[];try{return ou(JSON.parse(s),t,n)}catch{return o.push({code:"NATIVE_IMPORT_JSONL_LINE_MALFORMED",host:e,source_path:t,message:`Line ${n+1} is malformed.`}),[]}})}function g_(e,t){return t.split(/\n(?=#{1,3}\s+)/u).map(r=>r.trim()).filter(r=>r.length>0).map((r,o)=>({id:null,content:r,project:null,confidence:null,sourcePath:e,raw:{kind:"text_section",index:o,source_path:e}}))}function ou(e,t,r){if(typeof e=="string"&&e.trim().length>0)return[{id:null,content:e,project:null,confidence:null,sourcePath:t,raw:e}];if(!As(e))return[];let o=Rs(e,["content","text","summary","memory","note","body","value"]);return o?[{id:Rs(e,["id","uid","uuid","key"])??`${to.basename(t)}:${r+1}`,content:o,project:Rs(e,["project","project_id","scope_project","workspace","repo"]),confidence:v_(e,["confidence","score"]),sourcePath:t,raw:ks(e)}]:[]}function f_(e,t,r){return t.map((o,a)=>{let n=M(o.content),s=o.id??`${to.basename(o.sourcePath)}:${a+1}`,i=au(n.value);return{source_system:e,source_path:o.sourcePath,source_id:s,source_hash:c_(o.raw),normalized_content_hash:i,target_project:o.project?.trim()||r,content:n.value,summary:$e(n.value),redacted:n.redacted,confidence:Math.min(Math.max(o.confidence??.55,0),1),status:"candidate",proposed_memory_id:null}})}async function h_(e,t){let r=[];r.push(...ru(t,o=>o.source_hash,"duplicate_source_hash")),r.push(...ru(t,o=>o.normalized_content_hash,"duplicate_normalized_content"));for(let o of new Set(t.map(a=>a.target_project))){let a=await Rt({home:e,project:o,includeForgotten:!1,limit:1e3}),n=new Set(a.map(s=>au(s.content)));for(let s of t.filter(i=>i.target_project===o))n.has(s.normalized_content_hash)&&r.push({source_id:s.source_id,reason:"existing_normalized_content"})}return r.sort((o,a)=>`${o.reason}:${o.source_id}`.localeCompare(`${a.reason}:${a.source_id}`))}function ru(e,t,r){let o=new Map;for(let a of e){let n=t(a);o.set(n,[...o.get(n)??[],a])}return Array.from(o.values()).filter(a=>a.length>1).flatMap(a=>a.map(n=>({source_id:n.source_id,reason:r})))}function au(e){return ye(e.toLowerCase().replace(/\s+/gu," ").trim())}function y_(e){return{host:e.host,source_path:e.source_path,files:e.files.length,mapped_records:e.mapped_records.length,skipped_records:e.skipped_records.length,conflicts:e.conflicts.length,redactions:e.redactions,persisted_memories:e.persisted_memories.length,proposed_scopes:e.proposed_scopes,approvals_required:e.approvals_required.length,host_limitations:e.host_limitations}}function __(e){if(!As(e))return null;for(let t of["memories","memory","records","items","notes"]){let r=e[t];if(Array.isArray(r))return r}return null}function Rs(e,t){for(let r of t){let o=e[r];if(typeof o=="string"&&o.trim().length>0)return o.trim()}return null}function v_(e,t){for(let r of t){let o=e[r];if(typeof o=="number"&&Number.isFinite(o))return o}return null}function ks(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?e:Array.isArray(e)?e.map(t=>ks(t)):As(e)?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,ks(r)])):String(e)}function b_(e){return Nt.includes(to.extname(e).toLowerCase())}function As(e){return typeof e=="object"&&e!==null}var se={state:"unlicensed",license_key:null,instance_id:null,purchased_at:null,version_at_activation:null,updates_until:null,last_checked_at:null,source:"none"};import{chmod as w_,mkdir as R_,readFile as k_,rm as S_,writeFile as A_}from"node:fs/promises";import{randomUUID as P_}from"node:crypto";import nu from"node:path";function ga(e){return nu.join(g(e).home,"license.json")}async function Re(e){let t=ga(e);if(!await k(t))return null;try{let r=JSON.parse(await k_(t,"utf8"));return E_(r)?r:null}catch{return null}}async function ro(e,t){let r=ga(e);return await R_(nu.dirname(r),{recursive:!0,mode:448}),await A_(r,`${JSON.stringify(t,null,2)}
818
- `,{encoding:"utf8",mode:384}),await w_(r,384),t}async function Ps(e){await S_(ga(e),{force:!0})}async function fa(e){let t=await Re(e);if(t?.instance_id)return t.instance_id;let r=P_();return await ro(e,{...se,instance_id:r,purchased_at:t?.purchased_at??null,version_at_activation:t?.version_at_activation??null,updates_until:t?.updates_until??null,license_key_instance_id:t?.license_key_instance_id??null}),r}function E_(e){return(e.state==="licensed"||e.state==="unlicensed")&&(typeof e.license_key=="string"||e.license_key===null)&&(typeof e.instance_id=="string"||e.instance_id===null)&&(typeof e.purchased_at=="string"||e.purchased_at===null||e.purchased_at===void 0)&&(typeof e.version_at_activation=="string"||e.version_at_activation===null||e.version_at_activation===void 0)&&(typeof e.updates_until=="string"||e.updates_until===null)&&(typeof e.last_checked_at=="string"||e.last_checked_at===null)&&(e.source==="dodo"||e.source==="none")&&(typeof e.license_key_instance_id=="string"||e.license_key_instance_id===null)}var Ot="0.1.0";var x_="https://api.dodopayments.com",j_=1440*60*1e3,T_=14;async function Es(e){let t=g(e.home).home,r=e.now??new Date,o=await fa(t),a=await Ts(e,"/licenses/activate",{license_key:e.key,name:o});if(!a.ok)return await Ne(t,"license_activate_failed",e.key,a.reason,"error"),{ok:!1,reason:a.reason,license:{...se,instance_id:o}};let n=await ro(t,{state:"licensed",license_key:e.key,instance_id:o,license_key_instance_id:a.license_key_instance_id,purchased_at:a.purchased_at??r.toISOString(),version_at_activation:Ot,updates_until:H_(a.purchased_at??r.toISOString(),365),last_checked_at:r.toISOString(),source:"dodo"});return await Ne(t,"license_activated",e.key,null,"ok"),{ok:!0,license:Mt(n)}}async function xs(e){let t=g(e.home).home,r=e.now??new Date,o=await Re(t),a=e.key??o?.license_key,n=o?.instance_id??null;if(!a)return await Ne(t,"license_validate_missing",null,"INVALID_KEY","blocked"),{ok:!1,reason:"INVALID_KEY",license:o?Mt(o):se};if(o?.state==="licensed"&&C_(o.last_checked_at,r))return await Ne(t,"license_validate_cache_hit",a,null,"ok"),{ok:!0,license:Mt(o)};let s=await Ts(e,"/licenses/validate",{license_key:a});if(s.ok){let i=await ro(t,{state:"licensed",license_key:a,instance_id:n??await fa(t),license_key_instance_id:o?.license_key_instance_id??null,purchased_at:o?.purchased_at??null,version_at_activation:o?.version_at_activation??null,updates_until:o?.updates_until??null,last_checked_at:r.toISOString(),source:"dodo"});return await Ne(t,"license_validated",a,null,"ok"),{ok:!0,license:Mt(i)}}return s.reason==="NETWORK"&&o?.state==="licensed"&&I_(o.last_checked_at,r,e.graceDays)?(await Ne(t,"license_validate_grace_served",a,"NETWORK","ok"),{ok:!0,license:Mt(o)}):(await Ne(t,"license_validate_failed",a,s.reason,"blocked"),{ok:!1,reason:s.reason,license:{...se,instance_id:n}})}async function js(e){let t=g(e.home).home,r=await Re(t),o=e.key??r?.license_key,a=e.licenseKeyInstanceId??r?.license_key_instance_id;if(!o||!a)return await Ne(t,"license_deactivate_missing",o??null,"INVALID_KEY","blocked"),{ok:!1,reason:"INVALID_KEY",license:r?Mt(r):se};let n=await Ts(e,"/licenses/deactivate",{license_key:o,license_key_instance_id:a});return n.ok?(await Ps(t),await Ne(t,"license_deactivated",o,null,"ok"),{ok:!0,license:se}):(await Ne(t,"license_deactivate_failed",o,n.reason,"error"),{ok:!1,reason:n.reason,license:r?Mt(r):se})}function Mt(e){return{state:e.state,license_key:e.license_key,instance_id:e.instance_id,purchased_at:e.purchased_at??null,version_at_activation:e.version_at_activation??null,updates_until:e.updates_until,last_checked_at:e.last_checked_at,source:e.source}}function C_(e,t){return e?t.getTime()-new Date(e).getTime()<j_:!1}function I_(e,t,r=T_){return e?t.getTime()-new Date(e).getTime()<=r*24*60*60*1e3:!1}async function Ts(e,t,r){let o=e.fetch??globalThis.fetch;try{let a=await o(new URL(t,N_(e.endpointBaseUrl)).toString(),{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify(r)}),n=await O_(a);return a.ok?t==="/licenses/validate"&&n.valid!==!0?{ok:!1,reason:su(n)}:{ok:!0,license_key_instance_id:M_(n),purchased_at:L_(n)}:{ok:!1,reason:su(n)}}catch{return{ok:!1,reason:"NETWORK"}}}function N_(e=process.env.NATIVESOUL_DODO_LICENSE_API_BASE_URL??x_){return e.endsWith("/")?e:`${e}/`}async function O_(e){try{let t=await e.json();return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}}function M_(e){let r=[e.license_key_instance_id,e.licenseKeyInstanceId,e.id,oo(e.data)?e.data.license_key_instance_id:null,oo(e.data)?e.data.id:null].find(o=>typeof o=="string"&&o.length>0);return typeof r=="string"?r:null}function L_(e){let t=oo(e.data)?e.data:{},r=oo(e.license_key)?e.license_key:oo(t.license_key)?t.license_key:{},a=[e.purchased_at,e.purchase_date,e.created_at,t.purchased_at,t.purchase_date,t.created_at,r.purchased_at,r.purchase_date,r.created_at].find(n=>typeof n=="string"&&!Number.isNaN(Date.parse(n)));return typeof a=="string"?new Date(a).toISOString():null}function H_(e,t){let r=Date.parse(e);return Number.isNaN(r)?null:new Date(r+t*24*60*60*1e3).toISOString()}function su(e){let t=String(e.reason??e.code??e.error??"").toUpperCase();return t.includes("LIMIT")?"ACTIVATION_LIMIT":t.includes("ACTIVE")?"NOT_ACTIVE":"INVALID_KEY"}function oo(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}async function Ne(e,t,r,o,a){await f({home:e,type:t,result:a,details:{provider:"dodo",license_key_ref:r?D_(r):null,reason:o}})}function D_(e){return e.length<=8?"[REDACTED_LICENSE_KEY]":`${e.slice(0,4)}\u2026${e.slice(-4)}`}var ao="https://native-soul.mintlify.site/account/licensing";async function rr(e){let t=$_(e),r=g(t.home).home;try{let o=await Re(r),a=await xs(t);if(a.ok)return{ok:!0,license:a.license};let n=a.reason==="NETWORK"&&o?.state==="licensed"?"GRACE_EXPIRED":"UNLICENSED",s=t.activateUrl??ao;return{ok:!1,reason:n,activate_url:s,message:no({reason:n,activate_url:s}),license:a.license}}catch{let o=t.activateUrl??ao;return{ok:!1,reason:"UNLICENSED",activate_url:o,message:no({reason:"UNLICENSED",activate_url:o}),license:se}}}function no(e){return`${e.reason==="GRACE_EXPIRED"?"License offline grace expired.":"NativeSoul is not activated."} NativeSoul is paid-only. Run \`nativesoul license activate <key>\` after purchase: ${e.activate_url}`}function $_(e){return typeof e=="string"?{home:e}:e??{}}import{readdir as F_,readFile as iu,stat as U_}from"node:fs/promises";import Cs from"node:path";var V_=["open source","open-source","source-available","read the source","free to install","never phones home","zero network","uncrackable","piracy-proof"];async function Is(e={}){let t=e.registryPath??Cs.join(process.cwd(),"docs","architecture","feature-registry.yaml"),r=e.marketingDir??Cs.join(process.cwd(),"docs","marketing"),o=B_(await iu(t,"utf8")),a=e.page?[e.page]:await cu(r),n=[],s=[];for(let i of a){let l=await iu(i,"utf8"),c=so(l);for(let d of V_)c.includes(so(d))&&n.push({code:"GLOBAL_FORBIDDEN_PHRASE",page:i,phrase:d,message:`Global forbidden phrase found: ${d}`});for(let d of o.values())for(let p of d.claim_forbidden)p&&c.includes(so(p))&&n.push({code:"FEATURE_FORBIDDEN_PHRASE",page:i,feature_id:d.id,phrase:p,message:`Forbidden phrase for ${d.id}: ${p}`});for(let d of J_(l)){let p=o.get(d.id);if(!p){n.push({code:"UNKNOWN_CLAIM_ID",page:i,feature_id:d.id,message:`Tagged claim references unknown feature id: ${d.id}`}),s.push({id:d.id,status:"unknown",page:i,text:d.text,result:"fail",reason:"unknown feature id"});continue}let h=q_(p,i,d.text);s.push(h),h.result==="fail"&&n.push(K_(h))}}return{ok:n.length===0,status:n.length===0?"pass":"fail",registry_path:t,pages:a,claims:s,issues:n,summary:{pages_scanned:a.length,claims_checked:s.length,issues:n.length}}}function B_(e){let t=new Map,r=null;for(let o of e.split(/\r?\n/u)){let a=o.match(/^\s*-\s+id:\s*(.+)\s*$/u);if(a){r?.id&&t.set(r.id,lu(r)),r={id:or(a[1]??""),name:"",claim_forbidden:[],evidence:null,claim_allowed:null};continue}if(!r)continue;let n=o.match(/^\s+([a-z_]+):\s*(.*)\s*$/u);if(!n)continue;let s=n[1]??"",i=n[2]??"";s==="status"?r.status=or(i).split(/\s+/u)[0]:s==="name"?r.name=or(i):s==="evidence"?r.evidence=or(i):s==="claim_allowed"?r.claim_allowed=i.trim()==="null"?null:or(i):s==="claim_forbidden"&&(r.claim_forbidden=G_(i))}return r?.id&&t.set(r.id,lu(r)),t}function lu(e){return{id:e.id??"",name:e.name??e.id??"",status:e.status??"absent",evidence:e.evidence??null,claim_allowed:e.claim_allowed??null,claim_forbidden:e.claim_forbidden??[]}}async function cu(e){try{if(!(await U_(e)).isDirectory())return[]}catch{return[]}let t=await F_(e,{withFileTypes:!0});return(await Promise.all(t.map(async o=>{let a=Cs.join(e,o.name);return o.isDirectory()?await cu(a):o.isFile()&&/\.(md|mdx|txt)$/iu.test(o.name)?[a]:[]}))).flat().sort()}function J_(e){let t=[],r=/<!--\s*claim:([a-z0-9_-]+)\s*-->([\s\S]*?)<!--\s*\/claim\s*-->/giu,o=/\[claim:([a-z0-9_+-]+)\]([\s\S]*?)\[\/claim\]/giu;for(let a of e.matchAll(r))t.push({id:a[1]??"",text:(a[2]??"").trim()});for(let a of e.matchAll(o))t.push({id:a[1]??"",text:(a[2]??"").trim()});return t}function q_(e,t,r){return e.status==="absent"||e.status==="roadmap"||e.status==="roadmap-teams"?{id:e.id,status:e.status,page:t,text:r,result:"fail",reason:`${e.status} feature cannot be claimed as live`}:e.status==="partial"&&e.claim_allowed&&!so(r).includes(so(e.claim_allowed))?{id:e.id,status:e.status,page:t,text:r,result:"fail",reason:"partial feature claim exceeds allowed wording"}:{id:e.id,status:e.status,page:t,text:r,result:"pass",reason:"claim within registry bounds"}}function K_(e){return{code:e.status==="partial"?"PARTIAL_CLAIM_OUT_OF_BOUNDS":"UNBUILT_FEATURE_CLAIM",page:e.page,feature_id:e.id,message:e.reason}}function G_(e){let t=e.trim().replace(/\s+#.*$/u,"");if(t==="[]")return[];if(!t.startsWith("[")||!t.endsWith("]"))return[];let r=t.slice(1,-1).trim();return r?r.split(/,\s*/u).map(or).filter(Boolean):[]}function or(e){let t=e.trim().replace(/\s+#.*$/u,"");return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function so(e){return e.toLowerCase().replace(/[’']/gu,"'").replace(/\s+/gu," ").trim()}async function Ns(e){let t=await Re(e.home),r=t?.state==="licensed",o=r?W_(t.updates_until,e.now??new Date):"unknown",a=r?z_(e.latestKnownVersion,t.version_at_activation??null):"unknown",n=e.upgradeUrl??ao,s=o==="lapsed"&&a===!0,i=s?`You're on v${t?.version_at_activation??e.currentVersion}. v${e.latestKnownVersion} is available. Your licence keeps working \u2014 upgrade for the new major: ${n}.`:null;return{licensed:r,updates_status:o,newer_major_available:a,upgrade_url:n,purchased_at:t?.purchased_at??null,updates_until:t?.updates_until??null,version_at_activation:t?.version_at_activation??null,current_version:e.currentVersion,latest_known_version:e.latestKnownVersion??null,soft_nudge:{visible:s,dismissible:!0,message:i}}}function W_(e,t){if(!e)return"unknown";let r=Date.parse(e);return Number.isNaN(r)?"unknown":t.getTime()<=r?"active":"lapsed"}function z_(e,t){if(!e||!t)return"unknown";let r=du(e),o=du(t);return r===null||o===null?"unknown":r>o}function du(e){let t=e.trim().match(/^v?(\d+)(?:\.|$)/u);return t?.[1]?Number.parseInt(t[1],10):null}import{copyFile as X_,mkdir as pu,readFile as Y_,rename as Q_,stat as Z_,writeFile as ev}from"node:fs/promises";import{existsSync as mu}from"node:fs";import Lt from"node:path";var uu=8;function ha(e){let t=e.generatedAt??new Date().toISOString(),r=e.degraded===!0,o=[...e.payload.warnings,...e.warnings??[]],a=e.payload.capabilities.slice(0,uu),n=e.payload.capability_cards.slice(0,uu),s=["---","nativesoul: bootstrap-context",`bootstrap_schema: ${e.payload.bootstrap_schema}`,`host: ${e.host}`,`generated_at: ${t}`,`degraded: ${r?"true":"false"}`,`tokens_used: ${e.payload.context_budget.tokens_used}`,`tokens_max: ${e.payload.context_budget.tokens_max}`,o.length>0?`warnings: ${o.join(", ")}`:"warnings: none","---","",`You are ${e.payload.identity.name}; follow soul_summary and agents_operating_summary.`,`Global entity: ${e.payload.identity.name}. Project rules apply for code boundaries; persona remains ${e.payload.identity.name}.`,"","## Identity",`- Name: ${e.payload.identity.name}`,`- Mission: ${e.payload.identity.mission}`,e.payload.identity.role?`- Role: ${e.payload.identity.role}`:null,e.payload.identity.vibe?`- Vibe: ${e.payload.identity.vibe}`:null,"","## Soul Summary",e.payload.soul_summary,"","## Operating Summary",e.payload.agents_operating_summary,"","## User Preferences",e.payload.user.preferences_summary,"","## Project",`- ID: ${e.payload.project.id}`,`- CWD: ${e.payload.project.cwd}`,"","## Tool Hints",...e.payload.tool_hints.map(i=>`- ${i.tool}: ${i.use_when}`),"","## Relevant Memories",...e.payload.relevant_memories.length>0?e.payload.relevant_memories.map(i=>`- ${i.id}: ${i.summary}`):["- none"],"","## Commitments",...e.payload.commitments.length>0?e.payload.commitments.map(i=>`- ${JSON.stringify(i)}`):["- none"],"","## Capabilities",...a.length>0?a.map(i=>`- ${i.uid} (${i.host}, ready=${i.ready}): ${i.source}`):["- none"],"","## Capability Cards",...n.length>0?n.map(i=>`- ${i.uid} (${i.host}, ready=${i.ready}): ${i.use_when[0]??i.source}`):["- none"],""].filter(i=>i!==null).join(`
819
- `);return{host:e.host,generated_at:t,degraded:r,warnings:o,tokens_used:Ls(s),tokens_max:e.payload.context_budget.tokens_max,content:s}}async function ya(e){let t=g(e.home),r=ha({host:e.host,payload:e.payload}),o=Ms(t.home,e.host),a=mu(o)&&e.apply!==!1?await rv(t.home,e.host,o):null;if(e.apply!==!1){await pu(Lt.dirname(o),{recursive:!0,mode:448});let s=Lt.join(Lt.dirname(o),`.last-context-${O("tmp")}.tmp`);await ev(s,r.content,{encoding:"utf8",mode:384}),await Q_(s,o)}let n={...r,targetPath:o,backupPath:a,applied:e.apply!==!1};return e.recordTelemetry!==!1&&await f({home:t.home,type:e.apply===!1?"bootstrap_context_cache_dry_run":"bootstrap_context_cache_written",details:{...n,content:"[omitted]"}}),e.apply!==!1&&e.recordTelemetry!==!1&&await Te({home:t.home,host:e.host,outcome:"succeeded",tier:"A",cwd:e.payload.project.cwd,project:e.payload.project.id,tokensUsed:r.tokens_used,tokensMax:r.tokens_max,source:"bootstrap-inject",warnings:r.warnings}),n}async function ar(e){let t=g(e.home),r=Ms(t.home,e.host);if(!mu(r))return tv({home:t.home,host:e.host,targetPath:r,recordTelemetry:e.recordTelemetry});let o=await Y_(r,"utf8"),a=await Z_(r),n=e.ttlDays??7,s=Date.now()-a.mtimeMs>n*24*60*60*1e3,i=new Date().toISOString(),l=s?["BOOTSTRAP_CACHE_STALE"]:[],c=["---","nativesoul: bootstrap-context-cache",`host: ${e.host}`,`generated_at: ${i}`,"degraded: true",l.length>0?`warnings: ${l.join(", ")}`:"warnings: none","---","",o].join(`
820
- `),d={host:e.host,generated_at:i,degraded:!0,warnings:l,tokens_used:Ls(c),tokens_max:1900,content:c,targetPath:r,stale:s};if(e.recordTelemetry!==!1){await f({home:t.home,type:"bootstrap_context_cache_read",details:{...d,content:"[omitted]"}});let p=ov(o);await Te({home:t.home,host:e.host,outcome:"degraded",tier:"D",cwd:p.cwd,project:p.project,tokensUsed:d.tokens_used,tokensMax:d.tokens_max,source:"bootstrap-cache",warnings:l})}return d}async function Os(e){let t=await ar({home:e.home,host:e.host,ttlDays:e.ttlDays,recordTelemetry:e.recordTelemetry});if(!t.warnings.includes("BOOTSTRAP_CACHE_MISSING")||!e.projectCwd)return t;let r=await ar({home:io(e.projectCwd),host:e.host,ttlDays:e.ttlDays,recordTelemetry:!1});return r.warnings.includes("BOOTSTRAP_CACHE_MISSING")?t:r}function Ms(e,t){return Lt.join(e,"generated",t,"last-context.md")}function io(e){return Lt.join(e,".nativesoul-cache")}async function tv(e){let t=new Date().toISOString(),r=["BOOTSTRAP_CACHE_MISSING"],o=["---","nativesoul: bootstrap-context-cache",`host: ${e.host}`,`generated_at: ${t}`,"degraded: true",`warnings: ${r.join(", ")}`,"---","","Bootstrap context cache is not available. Run `nativesoul bootstrap --format inject` after install."].join(`
821
- `),a={host:e.host,generated_at:t,degraded:!0,warnings:r,tokens_used:Ls(o),tokens_max:1900,content:o,targetPath:e.targetPath,stale:!1};return e.recordTelemetry!==!1&&(await f({home:e.home,type:"bootstrap_context_cache_missing",details:{...a,content:"[omitted]"}}),await Te({home:e.home,host:e.host,outcome:"degraded",tier:"D",cwd:null,project:null,tokensUsed:a.tokens_used,tokensMax:a.tokens_max,source:"bootstrap-cache",warnings:r})),a}async function rv(e,t,r){let o=Lt.join(e,"backups","bootstrap-context");await pu(o,{recursive:!0,mode:448});let a=Lt.join(o,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-${t}-last-context.md`);return await X_(r,a),a}function Ls(e){return Math.ceil(e.length/4)}function ov(e){let t=e.match(/^- CWD:\s*(.+)$/mu)?.[1]?.trim()??null,r=e.match(/^- ID:\s*(.+)$/mu)?.[1]?.trim()??null;return{cwd:t,project:r}}function nr(e){return fs(e)?"full native capability":e.ready?"ready":e.healthy&&e.allowed?"official-fallback":"degraded"}function Hs(e){let t=nr(e);return t==="full native capability"?"cyan":t==="ready"?"green":t==="official-fallback"?"amber":"red"}import{readdir as xv,readFile as jv}from"node:fs/promises";import Ru from"node:path";import{mkdir as iv,readdir as lv,readFile as cv,writeFile as dv}from"node:fs/promises";import Ht from"node:path";function gu(e){let t=Ds(e)?e:{},r=Ds(t.tool_input)?t.tool_input:Ds(t.input)?t.input:{},o=K(t.tool_name)??K(t.tool)??K(t.name)??"unknown_tool",a=K(t.action)??K(r.action)??o,n=K(t.target)??K(r.target)??K(r.file_path)??K(r.path)??K(r.url)??K(r.command),s=K(r.command)??K(t.command);return{action:a,className:av(o,[n,s].filter(Boolean).join(" ")),target:n,project:K(t.project)??K(t.project_id)??K(r.project)??K(r.project_id)}}function av(e,t){let r=`${e} ${t??""}`.toLowerCase();return/\b(bash|shell|sh|zsh|exec_command)\b/u.test(e.toLowerCase())?nv(t??""):/\b(rm\s+-[^\s]*[rf][^\s]*|delete|reset\s+--hard|destroy|purge|drop)\b/u.test(r)?"destructive":/(slack|gmail|outlook|github|gh\s+pr|gh\s+issue|git\s+push|vercel\s+deploy|deploy|publish|send|post|comment|merge|api|curl\s+.*(-x|--request|-d|--data|--data-raw|--form)\s*(post|put|patch|delete)?)/u.test(r)?"external_write":/(write|edit|patch|apply|create|move|rename|git\s+commit)/u.test(r)?"write_project":/(curl|fetch|browser|http|web)/u.test(r)?"probe_external":"read_local"}function nv(e){let t=e.toLowerCase();return/\b(rm\s+-[^\s]*[rf][^\s]*|delete|reset\s+--hard|destroy|purge|drop)\b/u.test(t)?"destructive":/(curl\s+.*(-x|--request|-d|--data|--data-raw|--form)\s*(post|put|patch|delete)?|gh\s+(pr|issue|release)|git\s+push|vercel\s+deploy|npm\s+publish|pnpm\s+publish|deploy|publish)/u.test(t)?"external_write":/(^|\s)(touch|mkdir|mv|cp|tee|chmod|chown|git\s+commit)\b|(^|[^>])>[^>]|>>/u.test(t)?"write_project":/^(pwd|ls|cat|head|tail|rg|grep|sed\s+-n|find\s+.*-print|git\s+(status|diff|log|show))(\s|$)/u.test(t.trim())?"read_local":/(curl|fetch|http|https?:\/\/)/u.test(t)?"probe_external":"write_project"}function Ds(e){return!!e&&!Array.isArray(e)&&typeof e=="object"}function K(e){return typeof e=="string"&&e.trim().length>0?e.trim():void 0}var uv=new Set(["SOUL.MD","POLICY.MD"]),pv=5e3,fu=new Map;async function it(e){let t=g(e),r=fu.get(t.home);if(r&&r.expiresAt>Date.now())return r.orders;let o=Ht.join(t.home,"standing-orders"),a;try{a=await lv(o)}catch{return[]}let n=[];for(let s of a.filter(i=>i.endsWith(".yaml")||i.endsWith(".yml")).sort()){let i=Ht.join(o,s),l=await cv(i,"utf8");n.push(mv(l,i))}return fu.set(t.home,{expiresAt:Date.now()+pv,orders:n}),n}async function lt(e){let t=await it(e.home),r=e.target??null,o=r?hu(r):null,a=t.filter(i=>Us(i,e)),n=a.find(i=>i.allowed.includes(e.action)),s=a.find(i=>i.approval_required.includes(e.action));if(o&&uv.has(o))return st(e,"proposal_required",["PROTECTED_HUMAN_FILE"],null);if(e.className==="identity_policy_change")return st(e,"proposal_required",["IDENTITY_POLICY_CHANGE"],null);if(e.className==="destructive")return st(e,"denied",["DESTRUCTIVE_DENIED_BY_DEFAULT"],n?.id??s?.id??null);if(s)return st(e,"approval_required",["STANDING_ORDER_REQUIRES_APPROVAL"],s.id);if(n)return st(e,"allowed",["STANDING_ORDER_ALLOWED"],n.id);switch(e.className){case"read_local":case"probe_external":case"write_local":return st(e,"allowed",["DEFAULT_ALLOWED"],null);case"write_project":return st(e,"approval_required",["PROJECT_WRITE_REQUIRES_APPROVAL"],null);case"external_write":return st(e,"approval_required",["EXTERNAL_WRITE_REQUIRES_APPROVAL"],null)}}async function $s(e){let t=gu(e.payload),r=await lt({home:e.home,action:t.action,className:t.className,target:t.target,project:t.project,host:e.host}),o=r.decision==="allowed",a={hook_event_name:"PreToolUse",host:e.host,allowed:o,blocked:!o,message:o?"NativeSoul policy allowed this tool use.":`NativeSoul policy blocked ${r.action}: ${r.decision} (${r.reasons.join(", ")}).`,evaluation:r};if(!o){let n=await b(e.home);await f({home:n.home,type:"policy_blocked",result:"blocked",details:{host:e.host,cwd:e.cwd??null,action:r.action,class:r.class,target:r.target,decision:r.decision,reasons:r.reasons,matched_standing_order:r.matched_standing_order}})}return a}async function Fs(e){let t=await b(e.home),r=gv(e.target);if(!r)throw new Error("policy propose-change target must be SOUL.md or POLICY.md");let o=M(e.summary).value,a=new Date().toISOString(),n=O("proposal"),s=Ht.join(t.home,"proposals",`${a.replaceAll(/[:.]/gu,"-")}-${r}.md`),i=["# Policy Change Proposal","",`ID: ${n}`,`Target: ${r}`,`Created At: ${a}`,"","## Summary","",o,""].join(`
822
- `);return await iv(Ht.dirname(s),{recursive:!0,mode:448}),await dv(s,i,{encoding:"utf8",mode:384,flag:"wx"}),await f({home:t.home,type:"policy_change_proposed",details:{id:n,target:r,proposalPath:s,redacted:o!==e.summary}}),{id:n,target:r,summary:o,proposalPath:s,created_at:a}}function st(e,t,r,o){return{action:e.action,class:e.className,target:e.target??null,decision:t,reasons:r,matched_standing_order:o}}function mv(e,t){return{id:fv(e,"id")??Ht.basename(t,Ht.extname(t)),allowed:sr(e,"allowed"),approval_required:sr(e,"approval_required"),scope_projects:sr(e,"projects").concat(sr(e,"scope_projects")),scope_hosts:sr(e,"hosts").concat(sr(e,"scope_hosts")),source:t}}function Us(e,t){return!(e.scope_projects.length>0&&(!t.project||!e.scope_projects.includes(t.project))||e.scope_hosts.length>0&&(!t.host||!e.scope_hosts.includes(t.host)))}function hu(e){return Ht.basename(e.replaceAll("\\","/")).toUpperCase()}function gv(e){let t=hu(e);return t==="SOUL.MD"?"SOUL.md":t==="POLICY.MD"?"POLICY.md":null}function fv(e,t){let r=new RegExp(`^\\s*${t}:\\s*([^\\n#]+)`,"mu");return e.match(r)?.[1]?.trim().replace(/^["']|["']$/gu,"")??null}function sr(e,t){let r=e.match(new RegExp(`^\\s*${t}:\\s*\\[([^\\]]*)\\]`,"mu"));if(r?.[1])return r[1].split(",").map(i=>i.trim().replace(/^["']|["']$/gu,"")).filter(Boolean);let o=e.split(/\r?\n/u),a=[],n=!1,s=0;for(let i of o){let l=i.trim();if(!n){let d=i.match(new RegExp(`^(\\s*)${t}:\\s*$`,"u"));d&&(n=!0,s=d[1]?.length??0);continue}let c=i.length-i.trimStart().length;if(l&&c<=s&&!l.startsWith("-"))break;l.startsWith("-")&&a.push(l.slice(1).trim().replace(/^["']|["']$/gu,""))}return a.filter(Boolean)}function re(e,t,r){if(e==null)return!1;if(Array.isArray(e))return e.some(o=>re(o,t,r));if(typeof e!="object")return!1;for(let[o,a]of Object.entries(e)){if(o===t){if(r===void 0)return!0;if(a===null)return r==="null";if(typeof a=="string"||typeof a=="number"||typeof a=="boolean")return String(a)===r;if(Array.isArray(a))return a.some(n=>String(n)===r)}if(re(a,t,r))return!0}return!1}var hv=/(?:sk-[A-Za-z0-9_-]{8,}|(?:api[_-]?key|token|secret|password)\s*[:=]\s*(?!\[REDACTED_SECRET\])[^"'\s]+)/iu;async function ir(e={}){let t=g(e.home),r=Ev(e.limit);if(!await k(t.database))return yv(e,r,!1);let a=v(t.database,{readOnly:!0});try{let n=a.listEvents({limit:r}),s=a.listCapabilities({host:e.host,includeShared:!0,limit:r}),i=a.listSchedules({host:e.host,limit:r}),l=a.listHeartbeatLeases({project:e.project,limit:r}),c=a.listHeartbeatRuns({project:e.project,host:e.host,limit:r}),d=n.filter(y=>Pv(y,e)),p=s.filter(y=>yu(y.host,e.host)),h=i.filter(y=>yu(y.host,e.host));return wu({schema_version:1,generated_at:new Date().toISOString(),read_only:!0,external_telemetry_enabled:!1,initialized:!0,filters:bu(e,r),retention:vu(r),metrics:{activation:_v(d),bootstrap:vv(d),recall:bv(d),capability_readiness:wv(p),heartbeat:Rv(l,c),no_op_suppression:kv(d),rollback:Sv(d),secret_leakage_checks:_u(d)},m7_gate:Av(d,p,h,c)})}finally{a.close()}}function yv(e,t,r){return wu({schema_version:1,generated_at:new Date().toISOString(),read_only:!0,external_telemetry_enabled:!1,initialized:r,filters:bu(e,t),retention:vu(t),metrics:{activation:{workspace_initialized:0,onboarding_completed:0,install_applied:0},bootstrap:{succeeded:0,degraded:0,failed:0,cache_fallbacks:0},recall:{recalled:0,proposed:0,promoted:0},capability_readiness:{total:0,ready:0,full_native:0,official_fallback:0,degraded:0},heartbeat:{leases:0,completed_runs:0,silent_ok:0},no_op_suppression:{total:0,heartbeat_skipped:0,deduped:0,noop_actions:0},rollback:{total:0,policy_pack:0,mcp:0,managed_block:0},secret_leakage_checks:{checked:!0,leak_indicators:0,redaction_markers:0}},m7_gate:{recurring_use_validated:!1,feedback_validated:!1,privacy_validated:!0,notes:["NativeSoul database is not initialized; no local feedback evidence is available yet."]}})}function _v(e){return{workspace_initialized:ie(e,["workspace_initialized"]),onboarding_completed:ie(e,["onboarding_completed"]),install_applied:ie(e,["plugin_install","managed_block_applied","mcp_registration_installed"])}}function vv(e){return{succeeded:ie(e,["handshake_succeeded"]),degraded:ie(e,["handshake_degraded"]),failed:ie(e,["handshake_failed"]),cache_fallbacks:e.filter(t=>t.type.includes("bootstrap_context_cache")).length}}function bv(e){return{recalled:ie(e,["memory_recalled"]),proposed:ie(e,["memory_proposed"]),promoted:ie(e,["memory_promoted"])}}function wv(e){let t=e.map(nr);return{total:e.length,ready:t.filter(r=>r==="ready"||r==="full native capability").length,full_native:t.filter(r=>r==="full native capability").length,official_fallback:t.filter(r=>r==="official-fallback").length,degraded:t.filter(r=>r==="degraded").length}}function Rv(e,t){return{leases:e.length,completed_runs:t.length,silent_ok:t.filter(r=>r.result==="HEARTBEAT_OK"||re(r.result,"silent_ack","HEARTBEAT_OK")).length}}function kv(e){let t=ie(e,["heartbeat_skipped"]),r=e.filter(a=>a.type.includes("deduped")).length,o=e.filter(a=>re(a.details,"action","noop")).length;return{total:t+r+o,heartbeat_skipped:t,deduped:r,noop_actions:o}}function Sv(e){let t=ie(e,["policy_pack_rollback"]),r=ie(e,["mcp_registration_rollback"]),o=ie(e,["managed_block_rollback"]);return{total:e.filter(a=>a.type.includes("rollback")).length,policy_pack:t,mcp:r,managed_block:o}}function _u(e){let t=JSON.stringify(e.map(r=>({type:r.type,result:r.result,details:r.details})));return{checked:!0,leak_indicators:hv.test(t)?1:0,redaction_markers:(t.match(/\[REDACTED_/gu)??[]).length}}function Av(e,t,r,o){let a=o.length>0||r.some(l=>l.enabled),n=e.length>0&&t.length>0,s=_u(e).leak_indicators===0;return{recurring_use_validated:a,feedback_validated:n,privacy_validated:s,notes:[a?"Recurring heartbeat/schedule evidence exists locally.":"No recurring heartbeat/schedule evidence yet.",n?"Feedback report has local audit and capability evidence.":"Feedback report needs audit and capability evidence.",s?"Report excludes raw prompts, memory bodies, and unredacted secret indicators.":"Potential secret indicators found in local audit details."]}}function ie(e,t){return e.filter(r=>t.includes(r.type)).length}function Pv(e,t){let r=!t.host||!re(e.details,"host")||re(e.details,"host",t.host),o=!t.project||!re(e.details,"project")||re(e.details,"project",t.project);return r&&o}function yu(e,t){return!t||e===t||e==="all"}function vu(e){return{source_event_limit:e,stores_raw_prompts:!1,stores_memory_content:!1,stores_raw_paths:!1}}function bu(e,t){return{project:e.project??null,host:e.host??null,limit:t}}function Ev(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e??200),1),500):200}function wu(e){return Jt(W(e))}var Tv=["candidate","active","superseded","rejected","forgotten","expired"];async function lo(e={}){let t=g(e.home),r=Fv(e.limit),o=Hv(e);if(!await k(t.database))return Su(await Cv(t.home,t.database,e,r));let n=v(t.database,{readOnly:!0});try{let s=n.listMemories({project:e.project,includeForgotten:!0,limit:Math.max(r*4,50)}),i=n.listCapabilities({host:e.host,includeShared:!0,limit:r}),l=n.listCommitments({project:e.project,includeExpired:!0,limit:Math.max(r*2,50),now:new Date().toISOString(),skipExpire:!0}),c=n.listSchedules({host:e.host,limit:r}),d=n.listHeartbeatLeases({project:e.project,limit:r}),p=n.listHeartbeatRuns({project:e.project,host:e.host,limit:r}),h=n.listEvents({limit:Math.max(r*4,50)}),y=Mv(await it(t.home),e),w=await Iv(t.home),R=Dt(s,o,A=>A.created_at),H=Dt(l,o,A=>A.updated_at).slice(0,r),fe=Dt(i,o,A=>A.last_seen_at).slice(0,r),Se=Dt(c,o,A=>A.updated_at).slice(0,r),Ge=Dt(d,o,A=>A.created_at).slice(0,r),le=Dt(p,o,A=>A.completed_at).slice(0,r),Ae=Dt(h,o,A=>A.created_at).filter(A=>!e.host||Dv(A,{key:"host",value:e.host})).slice(0,r),E=Ae.filter(A=>A.type==="policy_blocked"),ko=Ae.filter(A=>$v(A)).length,xa={schema_version:1,generated_at:new Date().toISOString(),filters:Pu(e,r),read_only:!0,home:t.home,database:t.database,initialized:!0,memories:{summary:Lv(R),recent:R.filter(A=>A.status!=="candidate").slice(0,r),candidates:R.filter(A=>A.status==="candidate").slice(0,r)},commitments:H,capabilities:fe,schedules:Se,heartbeat:{leases:Ge,runs:le},audit:{events:Ae,policy_blocks:E},policy:{standing_orders:y,proposals:w,counts:{standing_orders:y.length,proposals:w.length,policy_blocks:E.length,approvals_required:ko}},feedback:await ir({home:t.home,project:e.project,host:e.host,limit:r})};return Su(xa)}finally{n.close()}}async function Cv(e,t,r,o){return{schema_version:1,generated_at:new Date().toISOString(),filters:Pu(r,o),read_only:!0,home:e,database:t,initialized:!1,memories:{summary:Au(),recent:[],candidates:[]},commitments:[],capabilities:[],schedules:[],heartbeat:{leases:[],runs:[]},audit:{events:[],policy_blocks:[]},policy:{standing_orders:[],proposals:[],counts:{standing_orders:0,proposals:0,policy_blocks:0,approvals_required:0}},feedback:await ir({home:e,project:r.project,host:r.host,limit:o})}}async function Iv(e){let t=Ru.join(e,"proposals"),r;try{r=await xv(t)}catch{return[]}let o=[];for(let a of r.filter(n=>n.endsWith(".md")).sort()){let n=await jv(Ru.join(t,a),"utf8");o.push({filename:a,target:Nv(n,"Target"),summary:Ov(n,"Summary")})}return o}function Nv(e,t){return e.match(new RegExp(`^${t}:\\s*(.+)$`,"mu"))?.[1]?.trim()??null}function Ov(e,t){return e.match(new RegExp(`^## ${t}\\s*$\\n+([\\s\\S]*?)(?:\\n+## |$)`,"mu"))?.[1]?.trim()??null}function Mv(e,t){return e.filter(r=>{let o=!t.project||r.scope_projects.length===0||r.scope_projects.includes(t.project),a=!t.host||r.scope_hosts.length===0||r.scope_hosts.includes(t.host);return o&&a})}function Lv(e){let t=Au();for(let r of e)t[r.status]+=1;return t}function Au(){return Object.fromEntries(Tv.map(e=>[e,0]))}function Dt(e,t,r){return e.filter(o=>{let a=Date.parse(r(o));return!(!Number.isFinite(a)||t.since!==null&&a<t.since||t.until!==null&&a>t.until)})}function Hv(e){return{since:ku(e.since,"since"),until:ku(e.until,"until")}}function ku(e,t){if(!e)return null;let r=Date.parse(e);if(!Number.isFinite(r))throw new Error(`dashboard data --${t} must be an ISO date/time`);return r}function Dv(e,t){return re(e.details,t.key,t.value)}function $v(e){return re(e.details,"decision","approval_required")||re(e.details,"approval_required")||re(e.details,"action","approval_required")}function Pu(e,t){return{project:e.project??null,host:e.host??null,limit:t,since:e.since??null,until:e.until??null}}function Fv(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e??50),1),200):50}function Su(e){return Jt(W(e))}import{mkdir as Uv,writeFile as Vv}from"node:fs/promises";import Vs from"node:path";async function Js(e={}){let t=await lo(e),r=Vs.resolve(e.output??Vs.join(g(e.home).home,"generated","dashboard","index.html"));return await Uv(Vs.dirname(r),{recursive:!0,mode:448}),await Vv(r,Eu(t),{encoding:"utf8",mode:384}),{outputPath:r,generated_at:t.generated_at,read_only:!0,data:t}}function Eu(e){let t=qv(e.capabilities),r=e.audit.policy_blocks.length,o=e.policy.counts.approvals_required;return`<!doctype html>
869
+ `}function hy(e){let t=e.indexOf(my),r=e.indexOf(cu);if(t<0||r<0||r<t)return null;let o=r+cu.length;return{before:e.slice(0,t),block:e.slice(t,o),after:e.slice(o)}}function pu(e,t){return t?$d(e):yy()}function yy(){return{provider_id:"local-hash",model_id:"local-hash-bow-v1",schema_version:1,available:!1,indexable_count:0,indexed_count:0,stale_count:0,healthy:!1,remediation:"Run nativesoul init, then nativesoul memory index"}}function mu(e){return!e.available||e.stale_count===0?[]:[{code:"SEMANTIC_INDEX_STALE",severity:"warn",message:`${e.stale_count} memory record(s) need semantic indexing.`,remediation:e.remediation??"Run nativesoul memory index"}]}function gu(e){let t=new Map;for(let o of e){let n=t.get(o.host)??{capability_count:0,ready_capability_count:0};t.set(o.host,{capability_count:n.capability_count+1,ready_capability_count:n.ready_capability_count+(o.ready?1:0)})}let r=Array.from(t.entries()).map(([o,n])=>({host:o,...n}));return{host_count:r.length,capability_count:r.reduce((o,n)=>o+n.capability_count,0),ready_capability_count:r.reduce((o,n)=>o+n.ready_capability_count,0),hosts:r}}function _n(e){let t=_(e,{readOnly:!0});try{return t.listCapabilities({limit:1e4}).map(r=>({host:r.host,ready:r.ready}))}finally{t.close()}}import{existsSync as V_}from"node:fs";import{readFile as B_,stat as W_}from"node:fs/promises";import Wu from"node:path";import{mkdir as _y,readFile as by,rename as vy,writeFile as ky}from"node:fs/promises";import Qr from"node:path";var wy=1440*60*1e3;async function Me(e){let t=f(e.home),r=await Aa(t.home),o={host:e.host,outcome:e.outcome,tier:e.tier,cwd:e.cwd?Qr.resolve(e.cwd):null,project:e.project??null,tokens_used:e.tokensUsed??null,tokens_max:e.tokensMax??null,source:e.source??"nativesoul",warnings:(e.warnings??[]).map(n=>O(n).value),error:Ey(e.error),recorded_at:e.recordedAt??new Date().toISOString()};return r.hosts[e.host]=o,await Sy(t.home,r),await h({home:t.home,type:Ay(e.outcome),result:e.outcome==="failed"?"error":"ok",details:o}),o}async function Aa(e){let t=f(e),r=Pa(t.home);if(!await R(r))return Ry();let o=JSON.parse(await by(r,"utf8"));return{schema:1,hosts:typeof o.hosts=="object"&&o.hosts!==null?o.hosts:{}}}async function Ea(e){let t=f(e.home),o=(await Aa(t.home)).hosts[e.host]??null,n=(e.now??new Date).getTime(),s=o?Date.parse(o.recorded_at):Number.NaN,a=Number.isFinite(s)?Math.max(n-s,0):null;return{state_path:Pa(t.home),last:o,age_ms:a,age_hours:a===null?null:Math.round(a/(3600*1e3)*10)/10,stale:a!==null&&a>wy}}function Ry(){return{schema:1,hosts:{}}}async function Sy(e,t){let r=Pa(e);await _y(Qr.dirname(r),{recursive:!0,mode:448});let o=Qr.join(Qr.dirname(r),`.last-handshake-${T("tmp")}.tmp`);await ky(o,`${JSON.stringify(t,null,2)}
870
+ `,{encoding:"utf8",mode:384}),await vy(o,r)}function Pa(e){return Qr.join(e,"state","last-handshake.json")}function Ay(e){return`handshake_${e}`}function Ey(e){if(e==null)return null;let t=e instanceof Error?e.message:String(e);return O(t).value.slice(0,500)}import or from"node:path";import{existsSync as Ua}from"node:fs";import{cp as h_,mkdir as y_,rm as Lu}from"node:fs/promises";import __ from"node:path";import{existsSync as at}from"node:fs";import{readFile as Pn}from"node:fs/promises";import Je from"node:path";import Py from"node:path";function tr(e){return e.split(/[\\/]/u).join("/")}function st(e,t){return tr(Py.relative(e,t))}function Nt(e){return tr(e)}import{existsSync as fu}from"node:fs";import xa from"node:path";function bn(e){if(xa.isAbsolute(e))return fu(e)?e:null;let t=(process.env.PATH??"").split(xa.delimiter).filter(Boolean),r=process.platform==="win32"?(process.env.PATHEXT??".EXE;.CMD;.BAT").split(";"):[""];for(let o of t)for(let n of r){let s=xa.join(o,`${e}${n}`);if(fu(s))return s}return null}import{spawnSync as Iy}from"node:child_process";import{existsSync as Ot}from"node:fs";import{mkdir as kn,readFile as Mt,writeFile as wn}from"node:fs/promises";import Ty from"node:os";import F from"node:path";import{existsSync as xy}from"node:fs";import Zr from"node:os";import re from"node:path";import{fileURLToPath as jy}from"node:url";function Le(e,t,r){return eo(e,t)?r?re.join(re.resolve(r),e,"plugins","nativesoul"):e==="claude"?re.join(Zr.homedir(),".claude","plugins","nativesoul"):e==="codex"?re.join(Zr.homedir(),".codex","plugins","nativesoul"):e==="gemini"?re.join(Zr.homedir(),".gemini","extensions","nativesoul"):e==="grok"?re.join(Zr.homedir(),".grok","plugins","nativesoul"):e==="antigravity"?re.join(Zr.homedir(),".antigravity","plugins","nativesoul"):null:null}function eo(e,t){return e==="codex"||e==="gemini"||e==="grok"||e==="antigravity"||e==="claude"&&(t==="claude-code"||t==="claude-desktop")}function vn(e,t){return e==="claude"?re.join(t,".claude-plugin","plugin.json"):e==="gemini"?re.join(t,"gemini-extension.json"):e==="grok"||e==="antigravity"?re.join(t,"plugin.json"):re.join(t,".codex-plugin","plugin.json")}function ja(e){if(e!=="claude"&&e!=="codex"&&e!=="gemini"&&e!=="grok"&&e!=="antigravity")return null;let t=`${e}-nativesoul`,r=re.dirname(jy(import.meta.url));return[re.resolve(process.cwd(),"plugins",t),re.resolve(r,"../../../plugins",t),re.resolve(r,"../../../../plugins",t)].find(n=>xy(n))??null}var Ta="nativesoul",Rn="nativesoul";async function yu(e){let t=F.join(e,"..","..","settings.json"),r=Ot(t)?JSON.parse(await Mt(t,"utf8")):{},o=r.hooks&&!Array.isArray(r.hooks)&&typeof r.hooks=="object"?{...r.hooks}:{},n=Nt(F.join(e,"shared","hooks","host-hook.cjs")),s={SessionStart:ro(`node ${JSON.stringify(n)} session-start --host claude --project-env CLAUDE_PROJECT_DIR`),UserPromptSubmit:ro(`node ${JSON.stringify(n)} prompt-bootstrap --host claude --project-env CLAUDE_PROJECT_DIR`),PreToolUse:ro(`node ${JSON.stringify(n)} pre-tool-use --host claude --project-env CLAUDE_PROJECT_DIR`),Stop:ro(`node ${JSON.stringify(n)} memory-flush --host claude --project-env CLAUDE_PROJECT_DIR`),PreCompact:ro(`node ${JSON.stringify(n)} memory-flush --host claude --project-env CLAUDE_PROJECT_DIR`)};for(let[a,i]of Object.entries(s))o[a]=Au(o[a]??null,i??null);await kn(F.dirname(t),{recursive:!0,mode:448}),await wn(t,`${JSON.stringify({...r,hooks:o},null,2)}
871
+ `,"utf8")}async function _u(e){let t=Su(e),r=Ot(t)?JSON.parse(await Mt(t,"utf8")):{},o=r.hooks&&!Array.isArray(r.hooks)&&typeof r.hooks=="object"?{...r.hooks}:{},n=Nt(F.join(e,"shared","hooks","host-hook.cjs")),s={SessionStart:to(`node ${JSON.stringify(n)} session-start --host grok --project-env GROK_WORKSPACE_ROOT`),UserPromptSubmit:to(`node ${JSON.stringify(n)} prompt-bootstrap --host grok --project-env GROK_WORKSPACE_ROOT`),PreToolUse:to(`node ${JSON.stringify(n)} pre-tool-use --host grok --project-env GROK_WORKSPACE_ROOT`),Stop:to(`node ${JSON.stringify(n)} memory-flush --host grok --project-env GROK_WORKSPACE_ROOT`),PreCompact:to(`node ${JSON.stringify(n)} memory-flush --host grok --project-env GROK_WORKSPACE_ROOT`)};for(let[a,i]of Object.entries(s))o[a]=Au(o[a]??null,i??null);await kn(F.dirname(t),{recursive:!0,mode:448}),await wn(t,`${JSON.stringify({...r,hooks:o},null,2)}
872
+ `,"utf8")}async function bu(e){let t=Na(e),r=F.join(t,"agents",`${Rn}.md`),o=F.join(t,"config.toml");await kn(F.dirname(r),{recursive:!0,mode:448}),await wn(r,Hy(),{encoding:"utf8",mode:384});let n=Ot(o)?await Mt(o,"utf8"):"";await kn(F.dirname(o),{recursive:!0,mode:448}),await wn(o,$y(n,"agent",`name = "${Rn}"`),"utf8")}function vu(e,t,r){if(t!=="default"||!Ly(e,t,r))return[];if(e==="antigravity")return Ia({executableName:"agy",installArgs:o=>["plugin","install",o],skippedMessage:"Antigravity CLI was not found on PATH, so NativeSoul could not register the plugin with `agy plugin install`.",skippedRemediation:"Install Antigravity CLI or run `agy plugin install ~/.antigravity/plugins/nativesoul` after installation.",failedRemediation:"Run `agy plugin validate ~/.antigravity/plugins/nativesoul` and then `agy plugin install ~/.antigravity/plugins/nativesoul`."},r);if(e==="grok"){let o=Ia({executableName:"grok",installArgs:s=>["plugin","install",s,"--trust"],skippedMessage:"Grok CLI was not found on PATH, so NativeSoul could not register the plugin with `grok plugin install`.",skippedRemediation:"Install Grok Build or run `grok plugin install ~/.grok/plugins/nativesoul --trust` after installation.",failedRemediation:"Run `grok plugin validate ~/.grok/plugins/nativesoul` and then `grok plugin install ~/.grok/plugins/nativesoul --trust`.",treatOutputAsSuccess:Cy},r),n=Ia({executableName:"grok",installArgs:()=>["plugin","enable",Ta],skippedMessage:"Grok CLI was not found on PATH, so NativeSoul could not enable the plugin with `grok plugin enable nativesoul`.",skippedRemediation:"Install Grok Build or run `grok plugin enable nativesoul` after installation.",failedRemediation:"Run `grok plugin enable nativesoul` so SessionStart hooks load in Grok sessions.",treatOutputAsSuccess:Ny},r);return[...o,...n]}return[]}function Ia(e,t){let r=bn(e.executableName);if(!r)return[{code:"HOST_PLUGIN_IMPORT_SKIPPED",severity:"warn",message:e.skippedMessage,remediation:e.skippedRemediation}];let o=Iy(r,e.installArgs(t),{encoding:"utf8",stdio:["ignore","pipe","pipe"],timeout:15e3});if(o.status===0)return[];let n=(o.stderr||o.stdout||"unknown error").trim();return e.treatOutputAsSuccess?.(n)?[]:[{code:"HOST_PLUGIN_IMPORT_FAILED",severity:"error",message:`${e.executableName} plugin import failed: ${n}`,remediation:e.failedRemediation}]}function Cy(e){return/^Installed \d+ plugin/i.test(e)||/^Plugin manifest is valid\./i.test(e)||/\bplugins?\b[^.\n]*\balready installed\b/i.test(e)||/\brepo\b[^.\n]*\balready installed\b/i.test(e)}function Ny(e){return/^Enabled plugin:/i.test(e)||/\balready enabled\b/i.test(e)}async function ku(e){let t=e?Dy(e):F.join(Ty.homedir(),".grok","config.toml");if(!Ot(t))return null;let r=await Mt(t,"utf8");return hu(r,"disabled",Ta)?!1:hu(r,"enabled",Ta)?!0:null}async function wu(e){let t=Su(e);if(!Ot(t))return!1;let r=JSON.parse(await Mt(t,"utf8"));return Oy(r)}async function Ru(e){let t=Na(e),r=F.join(t,"agents",`${Rn}.md`),o=F.join(t,"config.toml");if(!Ot(r)||!Ot(o))return!1;let[n,s]=await Promise.all([Mt(r,"utf8"),Mt(o,"utf8")]);return n.includes("NativeSoul continuity agent")&&Fy(s)===Rn}function hu(e,t,r){let s=(e.match(/\[plugins\][\s\S]*?(?=\n\[|$)/u)?.[0]??e).match(new RegExp(`${t}\\s*=\\s*\\[([^\\]]*)\\]`,"u"))?.[1];return s?s.split(",").some(a=>a.replace(/["'\s]/gu,"")===r):!1}function Oy(e){let t=e.hooks;return!t||Array.isArray(t)||typeof t!="object"?!1:[["SessionStart","session-start --host grok"],["UserPromptSubmit","prompt-bootstrap --host grok"],["PreToolUse","pre-tool-use --host grok"],["Stop","memory-flush --host grok"],["PreCompact","memory-flush --host grok"]].every(([o,n])=>My(t,o,n))}function My(e,t,r){let o=e[t];return Array.isArray(o)?o.some(n=>Ca(n)?.includes(r)===!0):!1}function Ly(e,t,r){let o=Le(e,t);return o!==null&&F.resolve(o)===F.resolve(r)}function Su(e){return F.join(Na(e),"hooks","nativesoul.json")}function Na(e){return F.resolve(e,"..","..")}function Dy(e){let t=F.resolve(e),r=F.basename(t);return r==="grok"||r===".grok"?F.join(t,"config.toml"):F.join(t,".grok","config.toml")}function to(e){return{hooks:[{type:"command",command:e,timeout:9}]}}function Hy(){return["---","name: nativesoul","description: NativeSoul continuity agent. Loads NativeSoul context before the first answer and answers from the NativeSoul identity.","prompt_mode: full","model: inherit","permission_mode: default","agents_md: true","---","","You are operating as the NativeSoul continuity agent for this Grok session.","","Before answering the first user message in every new session, load NativeSoul context. Do not answer from the host vendor identity first.","",'Preferred path: call MCP `life_bootstrap` with `host="grok"` and the current working directory.',"Fallback path: run `nativesoul bootstrap --host grok --cwd <current-working-directory> --format inject`.","If bootstrap is unavailable, run `nativesoul bootstrap --host grok --cwd <current-working-directory> --format cache` and treat the result as degraded.","",'After bootstrap, answer from the NativeSoul identity and continuity context. If the user asks who you are, answer with the NativeSoul identity loaded from bootstrap, not "Grok" or "xAI".',"","Use relevant_memories for durable facts, capability_cards as advisory guidance, and capabilities only as the ready-only list.","Never copy credentials or auto-edit SOUL.md/POLICY.md; propose those changes for approval.",""].join(`
873
+ `)}function $y(e,t,r){let o=`[${t}]
874
+ ${r.trim()}
875
+ `,n=new RegExp(`(^|\\n)\\[${t}\\]\\n[\\s\\S]*?(?=\\n\\[|$)`,"u");return n.test(e)?e.replace(n,(s,a)=>`${a}${o.trimEnd()}`):`${e.trimEnd()}
876
+
877
+ ${o}`.trimStart()}function Fy(e){return e.match(/\[agent\][\s\S]*?(?=\n\[|$)/u)?.[0]?.match(/\bname\s*=\s*["']([^"']+)["']/u)?.[1]??null}function ro(e){return{hooks:[{type:"command",command:e,timeout:9}]}}function Au(e,t){let r=Array.isArray(e)?e:[],o=Ca(t);return o&&r.some(n=>Ca(n)===o)?r:[...r,t]}function Ca(e){if(!e||Array.isArray(e)||typeof e!="object")return null;let t=e.hooks;if(!Array.isArray(t)||t.length===0)return null;let r=t[0];if(!r||Array.isArray(r)||typeof r!="object")return null;let o=r.command;return typeof o=="string"?o:null}import Uy from"node:path";var Sn=[{event:"SessionStart",commandFragment:"hooks/session-start.cjs",fileName:"session-start.cjs"},{event:"PreToolUse",commandFragment:"hooks/pre-tool-use.cjs",fileName:"pre-tool-use.cjs"},{event:"Stop",commandFragment:"hooks/memory-flush.cjs",fileName:"memory-flush.cjs"},{event:"PreCompact",commandFragment:"hooks/memory-flush.cjs",fileName:"memory-flush.cjs"},{event:"UserPromptSubmit",commandFragment:"hooks/user-prompt-submit.cjs",fileName:"user-prompt-submit.cjs"}],Vy={grok:[{event:"SessionStart",commandFragment:"host-hook.cjs"},{event:"UserPromptSubmit",commandFragment:"prompt-bootstrap --host grok"},{event:"PreToolUse",commandFragment:"pre-tool-use --host grok"},{event:"Stop",commandFragment:"memory-flush --host grok"},{event:"PreCompact",commandFragment:"memory-flush --host grok"}],gemini:[{event:"SessionStart",commandFragment:"host-hook.cjs"},{event:"BeforeAgent",commandFragment:"prompt-bootstrap --host gemini"},{event:"BeforeTool",commandFragment:"pre-tool-use --host gemini"},{event:"AfterAgent",commandFragment:"memory-flush --host gemini"},{event:"PreCompress",commandFragment:"memory-flush --host gemini"}],antigravity:[{event:"SessionStart",commandFragment:"host-hook.cjs"},{event:"UserPromptSubmit",commandFragment:"prompt-bootstrap --host antigravity"},{event:"PreToolUse",commandFragment:"pre-tool-use --host antigravity"},{event:"Stop",commandFragment:"memory-flush --host antigravity"},{event:"PreCompact",commandFragment:"memory-flush --host antigravity"}]};function oo(e,t){return e==="codex"||e==="claude"||e==="grok"||e==="antigravity"?{packageKind:"native-plugin",nativeHooksSupported:!0}:e==="gemini"?{packageKind:"official-extension",nativeHooksSupported:!0}:{packageKind:"unsupported-native",nativeHooksSupported:!1}}function By(e){return e==="grok"||e==="gemini"||e==="antigravity"?Vy[e]:Sn}function Oa(e){return e==="grok"||e==="gemini"?["hooks/hooks.json"]:e==="antigravity"?["hooks.json"]:[...new Set(Sn.map(t=>t.fileName).filter(t=>!!t))].map(t=>Uy.join("hooks",t))}function Eu(e,t){return t==="official-extension"?typeof e.name=="string"&&e.name==="nativesoul":typeof e.name=="string"&&e.name.includes("nativesoul")}function Pu(e,t){return Ma(e,t).length===0}function Ma(e,t){return By(e).filter(({event:r,commandFragment:o})=>!Wy(t,r,o)).map(({event:r})=>r)}function no(e){return e==="claude"||e==="codex"||e==="gemini"||e==="grok"||e==="antigravity"}function An(e){return e==="claude"?[".claude-plugin/plugin.json"]:e==="codex"?[".mcp.json"]:e==="gemini"?["gemini-extension.json"]:e==="grok"?[".mcp.json"]:e==="antigravity"?["mcp_config.json"]:[]}function En(e){return e==="claude"?[".claude-plugin/plugin.json"]:e==="codex"?[".codex-plugin/plugin.json"]:e==="gemini"||e==="grok"?["hooks/hooks.json"]:e==="antigravity"?["hooks.json"]:[]}function Wy(e,t,r){if(!e.hooks||Array.isArray(e.hooks)||typeof e.hooks!="object")return!1;let n=e.hooks[t];return!Array.isArray(n)||n.length===0?!1:n.some(s=>{if(!s||Array.isArray(s)||typeof s!="object")return!1;let a=s.hooks;return!Array.isArray(a)||a.length===0?!1:a.some(i=>{if(!i||Array.isArray(i)||typeof i!="object")return!1;let l=i.command;return typeof l=="string"&&tr(l).includes(r)})})}async function it(e){if(!e.targetPath||!eo(e.host,e.surface))return{host:e.host,surface:e.surface,targetPath:e.targetPath,target_exists:!1,manifest_exists:!1,enabled:!1,hook_registered:!1,package_kind:"unsupported-native",native_hooks_supported:!1,native_scheduler_supported:!1,issues:[]};let t=oo(e.host,e.surface),r=at(e.targetPath),o=vn(e.host,e.targetPath),n=at(o),s=t.nativeHooksSupported&&e.targetPath?Oa(e.host).filter(Q=>!at(Je.join(e.targetPath,Q))):Oa(e.host),a=t.nativeHooksSupported?s.length===0:!0,i=[],l=!1,c=!t.nativeHooksSupported,d=e.host!=="grok";if(!r)i.push({code:"PLUGIN_NOT_INSTALLED",severity:"warn",message:`NativeSoul plugin is not installed for ${e.host}:${e.surface}.`,remediation:`Run nativesoul install --host ${e.host} --apply`});else if(!n)i.push({code:"PLUGIN_MANIFEST_MISSING",severity:"error",message:`NativeSoul plugin manifest is missing: ${o}`,remediation:"Reinstall the NativeSoul plugin"});else{let Q=JSON.parse(await Pn(o,"utf8")),je=t.nativeHooksSupported?await Jy(e.host,e.targetPath,Q):Q;if(l=t.nativeHooksSupported?e.host==="grok"?await wu(e.targetPath):Pu(e.host,je):Eu(Q,t.packageKind),c=!t.nativeHooksSupported||await qy({host:e.host,targetPath:e.targetPath,manifest:Q}),d=e.host==="grok"?await Ru(e.targetPath):!0,e.host==="grok"&&!d&&i.push({code:"GROK_AGENT_PROFILE_MISSING",severity:"error",message:"NativeSoul Grok hooks are installed, but Grok is not configured to use the NativeSoul agent profile for first-turn bootstrap.",remediation:"Run `nativesoul install --host grok --apply` to install ~/.grok/agents/nativesoul.md and set [agent].name."}),t.nativeHooksSupported&&!c&&i.push({code:"PLUGIN_MCP_COMMAND_UNRESOLVED",severity:"error",message:"NativeSoul plugin MCP server command is not resolved for daemon-safe startup.",remediation:"Reinstall the NativeSoul plugin so its MCP server command is rendered with an absolute or executable command"}),!l&&t.nativeHooksSupported){let be=Ma(e.host,je);i.push({code:"PLUGIN_HOOK_MISSING",severity:"error",message:be.length>0?`NativeSoul plugin manifest is missing required hook registrations: ${be.join(", ")}.`:"NativeSoul plugin manifest does not register required continuity hooks.",remediation:"Reinstall the NativeSoul plugin"})}!l&&!t.nativeHooksSupported&&i.push({code:"PLUGIN_PACKAGE_MANIFEST_INVALID",severity:"error",message:`NativeSoul ${t.packageKind} manifest is invalid for ${e.host}.`,remediation:"Reinstall the NativeSoul package"})}r&&t.nativeHooksSupported&&!a&&i.push({code:"PLUGIN_HOOK_FILE_MISSING",severity:"error",message:`NativeSoul required hook files are missing under ${e.targetPath}: ${s.join(", ")}`,remediation:"Reinstall the NativeSoul plugin"});let p=e.targetPath?Je.join(e.targetPath,"shared","hooks","lib.cjs"):null;r&&t.nativeHooksSupported&&(!p||!at(p))&&i.push({code:"PLUGIN_SHARED_HOOKS_MISSING",severity:"error",message:"NativeSoul shared hook support files are missing under shared/hooks.",remediation:"Reinstall the NativeSoul plugin"});let g=e.targetPath?Je.resolve(Je.dirname(Je.dirname(e.targetPath))):void 0,y=!t.nativeHooksSupported||p!==null&&at(p),k=t.nativeHooksSupported?a&&y:!0,S=r&&n&&l&&k&&c&&d,U=e.host==="grok"?await ku(g):null;return e.host==="grok"&&S&&U===!1&&i.push({code:"GROK_PLUGIN_RUNTIME_DISABLED",severity:"error",message:"NativeSoul is installed for Grok but disabled in grok config, so SessionStart hooks will not run.",remediation:"Run `grok plugin enable nativesoul` or `nativesoul install --host grok --apply`."}),{host:e.host,surface:e.surface,targetPath:e.targetPath,target_exists:r,manifest_exists:n,enabled:S&&U!==!1,hook_registered:t.nativeHooksSupported?l&&a:!1,package_kind:t.packageKind,native_hooks_supported:t.nativeHooksSupported,native_scheduler_supported:!1,issues:i}}async function Jy(e,t,r){let o=En(e);if(o.length===0)return r;let n=st(t,vn(e,t)),s=o[0];if(!s||s===n)return r;let a=Je.join(t,s);return at(a)?JSON.parse(await Pn(a,"utf8")):{}}async function qy(e){let t=An(e.host),r=st(e.targetPath,vn(e.host,e.targetPath));if(t.length>0&&!t.includes(r)){for(let o of t){let n=Je.join(e.targetPath,o);if(at(n)&&La(JSON.parse(await Pn(n,"utf8"))))return!0}return!1}if(e.host==="codex"){let o=Je.join(e.targetPath,".mcp.json");return at(o)?La(JSON.parse(await Pn(o,"utf8"))):!1}return La(e.manifest)}function La(e){let r=(!e.mcpServers||Array.isArray(e.mcpServers)||typeof e.mcpServers!="object"?null:e.mcpServers)?.nativesoul??(!e.nativeSoul||Array.isArray(e.nativeSoul)||typeof e.nativeSoul!="object"?null:e.nativeSoul.mcpServer);if(!r||Array.isArray(r)||typeof r!="object")return!1;let o=r.command,n=r.args;return typeof o!="string"||o.length===0?!1:o==="nativesoul-mcp"||bn(o)||o===process.execPath?!0:Array.isArray(n)&&n.some(s=>typeof s=="string"&&Je.isAbsolute(s))}import{cp as Ky,mkdir as Gy,readFile as Xy,readdir as zy}from"node:fs/promises";import Da from"node:path";async function Ha(e,t,r,o){let n=Da.join(e,"backups","plugins");await Gy(n,{recursive:!0,mode:448});let s=Da.join(n,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-${t}-${r}-${T("plugin")}`);return await Ky(o,s,{recursive:!0}),s}async function $a(e){let t=await rr(e),r=await Promise.all(t.map(async o=>{let n=st(e,o),s=await Xy(o,"utf8");return`${n}\0${A(s)}`}));return A(r.sort().join(`
878
+ `))}async function rr(e){let t=await zy(e,{withFileTypes:!0});return(await Promise.all(t.map(async o=>{let n=Da.join(e,o.name);return o.isDirectory()?rr(n):o.isFile()?[n]:[]}))).flat()}import{existsSync as a_}from"node:fs";import{cp as i_,mkdir as l_,readFile as Fa,writeFile as c_}from"node:fs/promises";import qe from"node:path";import{fileURLToPath as d_}from"node:url";import{spawnSync as Yy}from"node:child_process";import{accessSync as Qy,constants as Zy,existsSync as xu}from"node:fs";import Lt from"node:path";function Dt(e){let t=e_(e.commandMode,e.projectRoot),r=t.command,o=[...t.args];e.home&&o.push("--home",e.home);let n={command:r,args:o,env:{}};return{serverName:"nativesoul",host:e.host,commandMode:e.commandMode,command:r,args:o,env:{},mcpServers:{nativesoul:n},snippet:s_(e.host,n),warnings:[...t.warnings,...e.host==="generic"?[]:[`${e.host.toUpperCase()}_MCP_REGISTRATION_NOT_APPLIED`]]}}function e_(e,t){let r=process.env.NATIVESOUL_MCP_COMMAND;return r&&r.trim().length>0?{command:r.trim(),args:[],warnings:["NATIVESOUL_MCP_COMMAND_ENV_OVERRIDE"]}:e==="local"?{command:process.execPath,args:[Lt.join(t??process.cwd(),"dist","packages","mcp-server","src","index.js")],warnings:[]}:e==="absolute"?t_(t):{command:"nativesoul-mcp",args:[],warnings:ju("nativesoul-mcp")?[]:["NATIVESOUL_MCP_COMMAND_NOT_ON_PATH"]}}function t_(e){let t=o_();if(t)return{command:t,args:[],warnings:[]};let r=ju("nativesoul-mcp");if(r)return{command:r,args:[],warnings:[]};let o=r_(e);if(xu(o))return{command:process.execPath,args:[o],warnings:["NATIVESOUL_MCP_COMMAND_LOCAL_DIST"]};let n=n_();return n?{command:process.execPath,args:[n],warnings:["NATIVESOUL_MCP_COMMAND_NPM_ROOT_GLOBAL"]}:{command:"nativesoul-mcp",args:[],warnings:["NATIVESOUL_MCP_COMMAND_NOT_RESOLVED"]}}function r_(e){return Lt.join(e??process.cwd(),"dist","packages","mcp-server","src","index.js")}function o_(){let e=process.argv[1];if(!e)return null;let t=process.platform==="win32"?".cmd":"",r=Lt.join(Lt.dirname(e),`nativesoul-mcp${t}`);return Iu(r)?r:null}function ju(e){let t=(process.env.PATH??"").split(Lt.delimiter).filter(Boolean),r=process.platform==="win32"?(process.env.PATHEXT??".EXE;.CMD;.BAT").split(";"):[""];for(let o of t)for(let n of r){let s=Lt.join(o,`${e}${n}`);if(Iu(s))return s}return null}function n_(){let e=Yy("npm",["root","-g"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(e.status!==0)return null;let t=e.stdout.trim();if(!t)return null;let r=Lt.join(t,"nativesoul","dist","packages","mcp-server","src","index.js");return xu(r)?r:null}function Iu(e){try{return Qy(e,Zy.X_OK),!0}catch{return!1}}function s_(e,t){return e==="generic"?{mcpServers:{nativesoul:t}}:{host:e,review_only:!0,mcpServers:{nativesoul:t}}}async function Tu(e,t,r,o){let n=await rr(e),s=await Promise.all(n.map(async i=>{let l=st(e,i),c=await Mu({host:t,relativePath:l,content:await Fa(i,"utf8"),home:r,targetPath:o});return`${l}\0${A(c)}`})),a=Ou();if(a&&no(t)){let i=await rr(a);for(let l of i){let c=qe.posix.join("shared","hooks",st(a,l)),d=await Fa(l,"utf8");s.push(`${c}\0${A(d)}`)}}return A(s.sort().join(`
879
+ `))}async function Cu(e){let t=Ou();if(!t)return;let r=qe.join(e,"shared","hooks");await l_(r,{recursive:!0,mode:448}),await i_(t,r,{recursive:!0})}async function Nu(e){let t=await rr(e.targetPath);await Promise.all(t.map(async r=>{let o=qe.relative(e.targetPath,r),n=await Fa(r,"utf8"),s=await Mu({host:e.host,relativePath:o,content:n,home:e.home,targetPath:e.targetPath});s!==n&&await c_(r,s,"utf8")}))}function Ou(){let e=qe.dirname(d_(import.meta.url));return[qe.resolve(process.cwd(),"plugins","shared","hooks"),qe.resolve(e,"../../../plugins/shared/hooks"),qe.resolve(e,"../../../../plugins/shared/hooks")].find(r=>a_(r))??null}async function Mu(e){let t=tr(e.relativePath),r=An(e.host).includes(t),o=En(e.host).includes(t);if(!r&&!o)return e.content;let n=JSON.parse(e.content),s=r?u_(n,Dt({host:e.host,commandMode:"package",home:e.home}).mcpServers.nativesoul):n,a=o&&e.targetPath&&no(e.host)?p_(s,e.targetPath):s;return`${JSON.stringify(a,null,2)}
880
+ `}function u_(e,t){return{...e,mcpServers:{nativesoul:t}}}function p_(e,t){if(!e.hooks||Array.isArray(e.hooks)||typeof e.hooks!="object")return e;let r=e.hooks,o=Object.fromEntries(Object.entries(r).map(([n,s])=>Array.isArray(s)?[n,s.map(a=>m_(a,t))]:[n,s]));return{...e,hooks:o}}function m_(e,t){if(!e||Array.isArray(e)||typeof e!="object")return e;let r=e,o=r.hooks;return Array.isArray(o)?{...r,hooks:o.map(n=>g_(n,t))}:e}function g_(e,t){if(!e||Array.isArray(e)||typeof e!="object")return e;let r=e,o=typeof r.command=="string"?r.command:null;if(!o)return e;if(o.includes("host-hook.cjs")){let a=Nt(qe.join(t,"shared","hooks","host-hook.cjs"));return{...r,command:`node ${JSON.stringify(a)} ${f_(o)}`}}let n=Sn.find(a=>o.includes(a.commandFragment));if(!n?.fileName)return e;let s=Nt(qe.join(t,"hooks",n.fileName));return{...r,command:`node ${JSON.stringify(s)}`}}function f_(e){let t=["session-start","prompt-bootstrap","pre-tool-use","memory-flush","recall"].find(s=>e.includes(s))??"session-start",r=e.match(/--host\s+([A-Za-z0-9_-]+)/u)?.[1],o=e.match(/--project-env\s+([A-Za-z0-9_-]+)/u)?.[1],n=e.match(/--event\s+([A-Za-z0-9_-]+)/u)?.[1];return[t,r?`--host ${r}`:null,o?`--project-env ${o}`:null,n?`--event ${n}`:null].filter(s=>s!==null).join(" ")}async function Va(e){let t=f(e.home),r=ja(e.host);if(!e.targetPath||!r)return Du(e.host,e.surface,e.targetPath,r,!e.apply);let o=Ua(e.targetPath)?await $a(e.targetPath):null,n=await Tu(r,e.host,t.home,e.targetPath),s=o===null?"create":o===n?"noop":"replace",a=s!=="noop",i=a&&e.apply&&Ua(e.targetPath)?await Ha(t.home,e.host,e.surface,e.targetPath):null,l=[];a&&e.apply&&(await y_(__.dirname(e.targetPath),{recursive:!0,mode:448}),await Lu(e.targetPath,{recursive:!0,force:!0}),await h_(r,e.targetPath,{recursive:!0}),no(e.host)&&await Cu(e.targetPath),await Nu({host:e.host,targetPath:e.targetPath,home:t.home})),e.apply&&e.host==="claude"&&await yu(e.targetPath),e.apply&&e.host==="grok"&&(await _u(e.targetPath),await bu(e.targetPath)),e.apply&&l.push(...vu(e.host,e.surface,e.targetPath));let c=e.targetPath&&eo(e.host,e.surface)?await it({host:e.host,surface:e.surface,targetPath:e.targetPath}):null,d=oo(e.host,e.surface),p={host:e.host,surface:e.surface,targetPath:e.targetPath,sourcePath:r,action:s,dryRun:!e.apply,changed:a,beforeHash:o,afterHash:n,backupPath:i,applied:a&&e.apply,enabled:c?.enabled??!1,hook_registered:c?.hook_registered??!1,package_kind:c?.package_kind??d.packageKind,native_hooks_supported:c?.native_hooks_supported??d.nativeHooksSupported,native_scheduler_supported:c?.native_scheduler_supported??!1,issues:[...c?.issues??[],...l]};return await h({home:t.home,type:e.apply?"plugin_install":"plugin_install_dry_run",details:p}),p}async function Ba(e){let t=f(e.home),r=ja(e.host);if(!e.targetPath||!r)return Du(e.host,e.surface,e.targetPath,r,!e.apply);let o=Ua(e.targetPath)?await $a(e.targetPath):null,n=oo(e.host,e.surface),s=o!==null,a=s&&e.apply?await Ha(t.home,e.host,e.surface,e.targetPath):null;s&&e.apply&&await Lu(e.targetPath,{recursive:!0,force:!0});let i={host:e.host,surface:e.surface,targetPath:e.targetPath,sourcePath:r,action:s?"remove":"noop",dryRun:!e.apply,changed:s,beforeHash:o,afterHash:A(""),backupPath:a,applied:s&&e.apply,enabled:!1,hook_registered:!1,package_kind:n.packageKind,native_hooks_supported:n.nativeHooksSupported,native_scheduler_supported:!1,issues:[]};return await h({home:t.home,type:e.apply?"plugin_uninstall":"plugin_uninstall_dry_run",details:i}),i}function Du(e,t,r,o,n){return{host:e,surface:t,targetPath:r,sourcePath:o,action:"unsupported",dryRun:n,changed:!1,beforeHash:null,afterHash:A(""),backupPath:null,applied:!1,enabled:!1,hook_registered:!1,package_kind:"unsupported-native",native_hooks_supported:!1,native_scheduler_supported:!1,issues:[]}}function Ke(e,t){if(t)return or.resolve(t,e)}function nr(e,t,r){let o=Gr(e,r);if(e==="claude"&&o==="claude-desktop")return{surface:o,managedBlock:null,mcpRegistration:t?or.join(or.resolve(t,e),"claude_desktop_config.json"):su(),plugin:Le(e,o,t)};if(!t)return{surface:o,managedBlock:nu(e),mcpRegistration:hn(e),plugin:Le(e,o)};let n=or.resolve(t,e);return{surface:o,managedBlock:or.join(n,ru(e)),mcpRegistration:or.join(n,ou(e)),plugin:Le(e,o,t)}}import{accessSync as b_,constants as v_,existsSync as lt}from"node:fs";import{mkdir as xn,readFile as sr,rm as k_,writeFile as jn}from"node:fs/promises";import G from"node:path";async function ao(e){let t=f(e.home),r=G.resolve(e.targetPath??In(e.host)),o=e.commandMode??"package",n=Dt({host:e.host,commandMode:o,home:t.home,projectRoot:e.projectRoot}).mcpServers.nativesoul,s=lt(r),a=s?await sr(r,"utf8"):null,i=Fu(w_(so(a),n)),l=a===null?null:A(a),c=A(i),d=x_(a,i),p=d!=="noop",g=p&&e.apply?await Uu(t.home,e.host,r,s,a,c):null;p&&e.apply&&(await xn(G.dirname(r),{recursive:!0,mode:448}),await jn(r,i,{encoding:"utf8",mode:384}));let y={host:e.host,targetPath:r,action:d,dryRun:!e.apply,changed:p,beforeHash:l,afterHash:c,diff:Vu(a,i),backupPath:g,commandMode:o,applied:p&&e.apply};return await h({home:t.home,type:e.apply?"mcp_registration_apply":"mcp_registration_dry_run",details:y}),y}async function Ja(e){let t=f(e.home),r=G.resolve(e.targetPath??In(e.host)),o=lt(r),n=o?await sr(r,"utf8"):null,s=R_(n),a=n===null?null:A(n),i=s===null?A(""):A(s),l=n!==s?"remove":"noop",c=l!=="noop",d=c&&e.apply?await Uu(t.home,e.host,r,o,n,i):null;c&&e.apply&&s!==null&&(await xn(G.dirname(r),{recursive:!0,mode:448}),await jn(r,s,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:r,action:l,dryRun:!e.apply,changed:c,beforeHash:a,afterHash:i,diff:Vu(n,s),backupPath:d,commandMode:"package",applied:c&&e.apply};return await h({home:t.home,type:e.apply?"mcp_registration_uninstall":"mcp_registration_uninstall_dry_run",details:p}),p}async function qa(e){let t=f(e.home),r=JSON.parse(await sr(e.snapshotPath,"utf8"));e.apply&&(r.beforeExists&&r.beforeContent!==null?(await xn(G.dirname(r.targetPath),{recursive:!0,mode:448}),await jn(r.targetPath,r.beforeContent,{encoding:"utf8",mode:384})):lt(r.targetPath)&&await k_(r.targetPath));let o={snapshotPath:e.snapshotPath,targetPath:r.targetPath,dryRun:!e.apply,applied:e.apply,restoredExists:r.beforeExists,restoredHash:r.beforeHash};return await h({home:t.home,type:e.apply?"mcp_registration_rollback":"mcp_registration_rollback_dry_run",details:o}),o}async function io(e){let t=G.resolve(e.targetPath??In(e.host)),r=iu(e.host,e.targetPath),o=lt(t),n=[],s=await S_(e.host,t,r);if(s&&n.push(s),!o)return n.push({code:"MCP_CONFIG_MISSING",severity:"warn",message:`MCP config target is missing: ${t}`,remediation:"Run nativesoul mcp install --host <host> --target <path> --apply"}),{host:e.host,targetPath:t,target_exists:!1,parse_ok:!1,configured:!1,command:null,command_ok:!1,issues:n};let a=null;try{a=so(await sr(t,"utf8"))}catch(p){n.push({code:"MCP_CONFIG_INVALID_JSON",severity:"error",message:p instanceof Error?p.message:"MCP config is invalid JSON",remediation:"Fix the JSON syntax or roll back from an NativeSoul snapshot"})}let i=a?Wa(a):null,l=typeof i?.command=="string"?i.command:null,c=Array.isArray(i?.args)?i.args.filter(p=>typeof p=="string"):[];i?l||n.push({code:"NATIVESOUL_MCP_COMMAND_MISSING",severity:"error",message:"nativesoul MCP server command is missing",remediation:"Re-run nativesoul mcp install"}):n.push({code:"NATIVESOUL_MCP_MISSING",severity:"warn",message:"nativesoul MCP server entry is not configured",remediation:"Run nativesoul mcp install --host <host> --target <path> --apply"});let d=l?e.checkCommand===!1?{ok:!0,issues:[]}:A_(l,c,t):{ok:!1,issues:[]};return n.push(...d.issues),{host:e.host,targetPath:t,target_exists:o,parse_ok:a!==null,configured:i!==null,command:l,command_ok:d.ok,issues:n}}function In(e){return hn(e)}function so(e){if(e===null||e.trim().length===0)return{};let t=JSON.parse(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error("MCP config root must be a JSON object");return t}function w_(e,t){let r=e.mcpServers,o=r&&typeof r=="object"&&!Array.isArray(r)?{...r}:{};return o.nativesoul={command:t.command,args:t.args,...t.env&&Object.keys(t.env).length>0?{env:t.env}:{}},{...e,mcpServers:o}}function R_(e){if(e===null)return null;let t=so(e),r=t.mcpServers;if(!r||typeof r!="object"||Array.isArray(r)||!Object.hasOwn(r,"nativesoul"))return e;let o={...r};return delete o.nativesoul,Fu({...t,mcpServers:o})}function Wa(e){let t=e.mcpServers;if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t.nativesoul;return!r||typeof r!="object"||Array.isArray(r)?null:r}async function S_(e,t,r){if(e!=="claude"||r===null||G.resolve(r)===t||!lt(r))return null;try{let o=so(await sr(r,"utf8")),n=Wa(o);if(!n)return null;if(lt(t)){let s=so(await sr(t,"utf8")),a=Wa(s);if(a&&JSON.stringify(Hu(a))===JSON.stringify(Hu(n)))return null}}catch{return null}return{code:"LEGACY_MCP_PATH",severity:"warn",message:`Legacy Claude MCP registration detected at ${r}.`,remediation:"Migrate to ~/.claude.json with nativesoul mcp install --host claude --apply, then uninstall or roll back the legacy ~/.claude/mcp.json entry."}}function Hu(e){return{command:typeof e.command=="string"?e.command:null,args:Array.isArray(e.args)?e.args.filter(t=>typeof t=="string"):[]}}function A_(e,t,r){let o=[],n=E_(e);if(!n)return o.push({code:"NATIVESOUL_MCP_COMMAND_UNRESOLVED",severity:"error",message:`nativesoul MCP command does not resolve to an executable: ${e}`,remediation:"Reinstall with NATIVESOUL_MCP_COMMAND set to an absolute nativesoul-mcp path, or run npm install -g nativesoul and retry."}),{ok:!1,issues:o};if(P_(e,n)){let s=t[0],a=s?G.isAbsolute(s)?s:G.resolve(G.dirname(r),s):null;if(!a||!lt(a))return o.push({code:"NATIVESOUL_MCP_NODE_SCRIPT_MISSING",severity:"error",message:"nativesoul MCP command uses node but the server script is missing.",remediation:"Re-run nativesoul mcp install with --command-mode absolute or rebuild the local package."}),{ok:!1,issues:o}}return{ok:!0,issues:o}}function E_(e){if(G.isAbsolute(e))return $u(e)?e:null;let t=(process.env.PATH??"").split(G.delimiter).filter(Boolean),r=process.platform==="win32"?(process.env.PATHEXT??".EXE;.CMD;.BAT").split(";"):[""];for(let o of t)for(let n of r){let s=G.join(o,`${e}${n}`);if($u(s))return s}return null}function $u(e){if(process.platform==="win32"&&lt(e))return!0;try{return b_(e,v_.X_OK),!0}catch{return!1}}function P_(e,t){let r=G.basename(e).toLowerCase(),o=G.basename(t).toLowerCase();return r==="node"||r==="node.exe"||o==="node"||o==="node.exe"}function Fu(e){return`${JSON.stringify(e,null,2)}
881
+ `}function x_(e,t){return e===t?"noop":e===null||e.trim().length===0?"create":"update"}async function Uu(e,t,r,o,n,s){let a=G.join(e,"backups","mcp-registration");await xn(a,{recursive:!0,mode:448});let i=new Date().toISOString(),l={id:T("snapshot"),host:t,targetPath:r,beforeExists:o,beforeContent:n,beforeHash:n===null?null:A(n),afterHash:s,createdAt:i},c=G.join(a,`${i.replaceAll(/[:.]/gu,"-")}-${t}.json`);return await jn(c,JSON.stringify(l,null,2),{encoding:"utf8",mode:384}),c}function Vu(e,t){return e===t?"No changes.":[`before: ${e===null?"missing":A(e)}`,`after: ${t===null?"missing":A(t)}`,`lines_before: ${e===null?0:e.split(/\r?\n/u).length}`,`lines_after: ${t===null?0:t.split(/\r?\n/u).length}`].join(`
882
+ `)}async function ct(e){let t=await v(e.home),r=e.surface??null,o=Gr(e.host,r),n=e.hostConfigRoot??(e.targetRoot?Ke(e.host,e.targetRoot):void 0),s=await C_({host:e.host,surface:o,targetRoot:e.targetRoot,explicit:e.pluginEnabled}),a=new Date().toISOString(),i=I_(e.mode,r,e.heartbeat),l=await vt(e.host).scheduleReconcile({kind:"heartbeat",mode:e.mode,enabled:!0,surface:e.surface??void 0,apply:e.apply,hostConfigRoot:n,desired:i}),c={id:N_(e.host,e.surface),host:e.host,mode:e.mode,enabled:!0,native_schedule_supported:l.status==="ok",native_id:l.status==="ok"?l.nativeId??null:null,desired:i,updated_at:a},d=e.apply?j_(t.database,c):c,p={dryRun:!e.apply,applied:e.apply,schedule:d,adapter_result:l,warnings:T_(e.host,l.status,s)};return await h({home:t.home,type:e.apply?"schedule_reconciled":"schedule_reconcile_dry_run",details:{host:e.host,surface:e.surface??null,mode:e.mode,schedule_id:c.id,adapter_status:l.status,native_schedule_supported:c.native_schedule_supported}}),p}async function lo(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await R(t.database))return[];let r=_(t.database,{readOnly:e.readOnly});try{return r.listSchedules({host:e.host,limit:Math.min(Math.max(e.limit??50,1),200)})}finally{r.close()}}async function Ka(e){let t=await v(e.home),r=_(t.database),o,n;try{if(o=r.listSchedules({limit:200}).find(s=>s.id===e.id),!o)throw new Error(`Schedule not found: ${e.id}`);n=e.apply?r.disableSchedule(e.id,new Date().toISOString()):o}finally{r.close()}if(!n)throw new Error(`Schedule not found after disable: ${e.id}`);return await h({home:t.home,type:e.apply?"schedule_disabled":"schedule_disable_dry_run",details:{schedule_id:e.id,host:n.host,mode:n.mode}}),{dryRun:!e.apply,applied:e.apply,schedule:e.apply?n:{...n,enabled:!1}}}function j_(e,t){let r=_(e);try{return r.upsertSchedule(t)}finally{r.close()}}function I_(e,t,r){return{kind:"heartbeat",mode:e,policy:"read_only",silent_ack:"HEARTBEAT_OK",skill:"life:heartbeat",cadence:r?.cadence??"daily",skip_when_busy:r?.skipWhenBusy??!0,project_scope:r?.projectScope??"current-project",behavior:r?.behavior??"read_only",...t&&t!=="default"?{surface:t}:{}}}function T_(e,t,r){return t!=="unsupported"?[]:e==="grok"||e==="gemini"?[]:r===!1?["NATIVE_SCHEDULE_UNSUPPORTED_NO_FALLBACK_INSTALLED"]:["NATIVE_SCHEDULE_UNSUPPORTED"]}async function C_(e){if(e.explicit!==void 0)return e.explicit;try{let t=Le(e.host,e.surface,e.targetRoot);return(await it({host:e.host,surface:e.surface,targetPath:t})).enabled}catch{return!1}}function N_(e,t){return e==="claude"&&t&&t!=="default"?`schedule:${e}:heartbeat:${t}`:`schedule:${e}:heartbeat`}function Ga(e){let t=e.observedAt??new Date().toISOString(),r=e.plugin.enabled&&["native-plugin","official-extension"].includes(e.plugin.package_kind),o=e.plugin.native_hooks_supported&&e.plugin.hook_registered,n=e.mcpRegistration.configured,s=e.schedules.some(y=>M_(y,t)),a=$_(e.capabilities,e.adapterDiagnostics),i=[co("native_package",r,t,e.plugin.targetPath??e.plugin.package_kind,"Native package/extension is not installed or enabled."),co("native_hooks",o,t,e.plugin.targetPath??e.plugin.package_kind,"Native lifecycle hook registration is missing."),co("mcp",n,t,e.mcpRegistration.targetPath,"MCP registration is missing or invalid."),co("native_scheduler",s,t,D_(e.schedules),F_(e.host,e.schedules)),co("official_inventory",a,t,H_(e.capabilities),"Official non-degraded capability inventory evidence is missing.")],l=i.filter(y=>!y.satisfied).map(y=>y.requirement),c=r&&o&&n,d=!a,p=l.includes("native_scheduler")&&Bu(e.host),g=l.length===0;return{schema_version:1,host:e.host,surface:e.surface,status:U_({fullNative:g,blockedByHost:p,degradedScan:d,ready:c}),ready:c,full_native:g,blocked_by_host:p,degraded_scan:d,generated_at:t,requirements:i,missing_requirements:l}}function Xa(e){return e.ready&&e.native_kind.includes("native")&&(e.schema_hash?.startsWith("full-native:")===!0||e.source.includes("full-native-evidence:"))}function co(e,t,r,o,n){return{requirement:e,satisfied:t,evidence:t?[{source_kind:"doctor",reference:o,observed_at:r,confidence:O_(o)}]:[],missing_reason:t?null:n}}function O_(e){return e.startsWith("not-applicable:")||e==="missing"?"low":"medium"}function M_(e,t){return e.enabled&&e.native_schedule_supported&&e.native_id!==null&&!L_(e.updated_at,t)}function L_(e,t){if(!e)return!1;let r=Date.parse(e),o=Date.parse(t);return!Number.isFinite(r)||!Number.isFinite(o)?!0:o-r>10080*60*1e3}function D_(e){let t=e.find(r=>r.native_id!==null);return t?.native_id?t.updated_at?`${t.native_id}@${t.updated_at}`:t.native_id:"missing"}function H_(e){return e.find(t=>t.ready)?.source??"missing"}function $_(e,t){return t.some(r=>r.severity==="error"||r.severity==="warn")?!1:e.some(r=>r.ready&&r.schema_hash?.startsWith("official:")===!0)}function F_(e,t){return Bu(e)?e==="claude"?"Claude local Scheduled Tasks proof is missing, UI-only, or cloud-routine-only for this surface.":e==="antigravity"?"Antigravity scheduler write/list/status/cancel contract proof is missing or stale.":`Host ${e} has no proven native scheduler support.`:t.some(r=>r.enabled)?"Enabled schedule uses fallback or has no native_id mapping.":"No enabled native schedule evidence is available."}function Bu(e){return e==="codex"||e==="claude"||e==="grok"||e==="gemini"||e==="antigravity"}function U_(e){return e.fullNative?"full_native":e.blockedByHost?"blocked_by_host":e.degradedScan?"degraded_scan":e.ready?"ready_fallback":"ready"}async function Ju(e){let t=nr(e.host,e.targetRoot,e.surface),r=t.managedBlock??`not-applicable:${Ct(e.host,e.surface)}`,o=t.managedBlock?await bd({host:e.host,targetPath:r}):Q_(e.host,e.surface),n=await io({host:e.host,targetPath:t.mcpRegistration,checkCommand:e.targetRoot===void 0}),s=await it({host:e.host,surface:e.surface,targetPath:t.plugin}),a=await Ea({home:e.home,host:e.host}),l=(e.databaseExists?await lo({home:e.home,host:e.host,limit:200,readOnly:!0}):[]).filter(x=>J_(e.host,e.surface,x)),c=e.databaseExists?await Se({home:e.home,host:e.host,limit:100,readOnly:!0}):[],d=e.databaseExists?_n(f(e.home).database):[],p=e.targetRoot!==void 0,g=p?[]:(await Tr(e.host))[0]?.diagnostics??[],y=l.length===0&&e.databaseExists?[{code:"SCHEDULE_DESIRED_STATE_MISSING",severity:"warn",message:`No persisted schedule desired state found for ${e.host}.`,remediation:e.targetRoot?`Run nativesoul install --host ${e.host} --apply --target-root ${e.targetRoot}`:"Run nativesoul install --host <host> --apply"}]:[],k=a.stale?[{code:"HANDSHAKE_STALE",severity:"warn",message:`Last ${e.host} handshake is ${a.age_hours??"unknown"} hour(s) old.`,remediation:`Run nativesoul bootstrap --host ${e.host} --cwd <current-working-directory> --format inject`}]:[],S=await G_({host:e.host,managedBlock:o,handshake:a}),U=await X_(e.host),Q=l.filter(x=>x.enabled&&x.native_schedule_supported&&x.native_id===null).map(x=>({code:"NATIVE_SCHEDULE_MAPPING_MISSING",severity:"warn",message:`Schedule ${x.id} reports native support but has no native_id mapping.`,remediation:e.targetRoot?`Run nativesoul schedule reconcile --host ${e.host} --apply --target-root ${e.targetRoot}`:`Run nativesoul schedule reconcile --host ${e.host} --apply`})),je=l.filter(x=>x.enabled&&!x.native_schedule_supported&&!s.enabled&&s.package_kind!=="unsupported-native").map(x=>({code:"NATIVE_SCHEDULE_UNSUPPORTED_NO_FALLBACK_INSTALLED",severity:"warn",message:`Schedule ${x.id} has no native scheduler support and no NativeSoul package fallback is installed.`,remediation:`Run nativesoul install --host ${e.host} --apply`})),be=K_({managedBlock:o,mcpRegistration:n,plugin:s,schedules:l,capabilities:c}),pe=Ga({host:e.host,surface:e.surface,mcpRegistration:n,plugin:s,schedules:l,capabilities:c,adapterDiagnostics:g}),Ie=[...o.issues,...n.issues,...s.issues,...g,...y,...k,...S,...U,...Q,...je];return{host:e.host,surface:e.surface,status:Ie.some(x=>x.severity==="error"||x.severity==="warn")?"degraded":"ready",targets:{managed_block:r,mcp_registration:n.targetPath},native_adapter_diagnostics_skipped:p,adapter_diagnostics:g,managed_block:o,mcp_registration:n,plugin:s,provider_parity:be,full_native_evidence:pe,handshake:a,schedule_count:l.length,enabled_schedule_count:l.filter(x=>x.enabled).length,native_schedule_mappings:l.map(x=>({id:x.id,native_schedule_supported:x.native_schedule_supported,native_id:x.native_id})),capability_count:c.length,ready_capability_count:c.filter(x=>x.ready).length,cross_host_inventory_summary:{current_host:c.length,other_hosts:d.filter(x=>x.host!==e.host&&x.host!=="all").length,ready_other_hosts:d.filter(x=>x.host!==e.host&&x.host!=="all"&&x.ready).length},issues:Ie}}function J_(e,t,r){return e!=="claude"?!0:q_(r.desired)===t}function q_(e){if(e&&typeof e=="object"&&!Array.isArray(e)&&"surface"in e){let t=e.surface;if(t==="claude-desktop"||t==="claude-code")return t}return"claude-code"}function K_(e){let t=e.plugin.enabled,r=e.mcpRegistration.configured,o=e.managedBlock.configured||t,n=e.schedules.some(p=>p.enabled),a=e.schedules.some(p=>p.enabled&&p.native_schedule_supported)?"native":n&&t?"official-fallback":"unsupported-native",i=e.plugin.native_hooks_supported?e.plugin.hook_registered?"native":"unsupported-native":t?"official-fallback":"unsupported-native",l=e.plugin.package_kind==="unsupported-native"?"unsupported-native":t?"ready":"degraded",c=e.capabilities.length===0||e.capabilities.some(p=>p.ready);return{level:o&&r&&l==="ready"&&i!=="unsupported-native"&&a!=="unsupported-native"?"ready":e.plugin.package_kind==="native-plugin"?"native":e.plugin.package_kind==="unsupported-native"?"unsupported-native":"official-fallback",bootstrap:o?"ready":"degraded",mcp:r?"ready":"degraded",package:l,hooks:i,memory_recall:r?"ready":"degraded",policy_guard:o?"ready":"degraded",capability_scan:c?"ready":"degraded",heartbeat:a}}async function G_(e){if(!e.managedBlock.configured||e.managedBlock.targetPath.startsWith("not-applicable:"))return[];let t=10080*60*1e3,r=await Y_(e.managedBlock.targetPath),o=e.handshake.age_ms;return r!==null&&r<=t?[]:o!==null&&o<=t?[]:[{code:"HANDSHAKE_NOT_OBSERVED",severity:"warn",message:`NativeSoul managed block is present for ${e.host}, but no handshake was observed in the last 7 days.`,remediation:`Start a host session or run nativesoul bootstrap --host ${e.host} --cwd <current-working-directory> --format inject`}]}async function X_(e){let t=z_(e).map(r=>Wu.resolve(process.cwd(),r));for(let r of t){if(!V_(r))continue;let o=await B_(r,"utf8"),n=Wr(o);if(n>2e3)return[{code:"PROJECT_CONTEXT_HEAVY",severity:"info",message:`Project instruction file is heavy (${n} estimated tokens): ${r}`,remediation:"Keep project rules authoritative for code boundaries; NativeSoul persona remains advisory continuity."}]}return[]}function z_(e){switch(e){case"claude":return["CLAUDE.md",Wu.join(".claude","CLAUDE.md")];case"codex":return["AGENTS.md"];case"grok":return["Agents.md","AGENTS.md"];case"antigravity":case"gemini":return["GEMINI.md"]}}async function Y_(e){try{let t=await W_(e);return Math.max(Date.now()-t.mtimeMs,0)}catch{return null}}function Q_(e,t){return{host:e,targetPath:`not-applicable:${Ct(e,t)}`,target_exists:!1,configured:!0,markers_valid:!0,issues:[]}}async function Ht(e){let t=f(e.home),r=await Kr(e.home),o=za(t.database),n=Ve(e.host),s=[],a=o?_n(t.database):[],i=pu(t.database,o),l=await nt(t.home),c=za(yn(t.home)),d=za(Zt(t.home));for(let y of n)for(let k of We(y,e.surface))s.push(await Ju({home:t.home,host:y,surface:k,targetRoot:e.targetRoot,databaseExists:o}));let p=[...r.issues,...mu(i),...s.flatMap(y=>y.issues)],g=r.healthy&&!p.some(y=>y.severity==="error");return{home:t.home,healthy:g,status:p.some(y=>y.severity==="error"||y.severity==="warn")?"degraded":"ready",workspace:r,target_root:e.targetRoot?qu.resolve(e.targetRoot):null,cross_host_inventory:gu(a),activation_summary:tu({home:t.home,targetRoot:e.targetRoot?qu.resolve(e.targetRoot):null,host:e.host,profile:l,onboardingComplete:c,activationComplete:d,hosts:s}),full_native_matrix:Z_(s),semantic_index:i,hosts:s,issues:p}}function Z_(e){let t=e.map(r=>({host:r.host,surface:r.surface,status:r.full_native_evidence.status,full_native:r.full_native_evidence.full_native,blocked_by_host:r.full_native_evidence.blocked_by_host,degraded_scan:r.full_native_evidence.degraded_scan,missing_requirements:r.full_native_evidence.missing_requirements}));return{require_full_native_ready:t.length>0&&t.every(r=>r.full_native),host_count:t.length,full_native_count:t.filter(r=>r.full_native).length,blocked_count:t.filter(r=>r.blocked_by_host).length,degraded_scan_count:t.filter(r=>r.degraded_scan).length,ready_fallback_count:t.filter(r=>r.status==="ready_fallback").length,hosts:t}}import{existsSync as eb}from"node:fs";import{mkdir as tb,readdir as rb,readFile as ob,writeFile as nb}from"node:fs/promises";import uo from"node:path";async function Ya(e){let t=e.apply===!0,r=t?f((await v(e.home)).home):f(e.home),o=e.project??L(e.cwd??process.cwd(),r.home),n=Math.min(Math.max(e.limit??10,1),50),s=await sb(r.home,r.database,o,n),a=ib(o,s,n),i=db({applied:t,project:o,proposals:a,dailyNotes:s.dailyNotes,candidates:s.candidates,activeMemories:s.activeMemories,auditEvents:s.auditEvents}),l=null;return t&&(l=await lb(r.home,i),await cb(r.home,a),await h({home:r.home,type:"memory_reflection_run",details:{project:o,proposal_count:a.length,report_path:l,daily_notes:s.dailyNotes.length,candidates:s.candidates.length,active_memories:s.activeMemories.length,audit_events:s.auditEvents.length}})),{applied:t,home:r.home,project:o,report:i,report_path:l,proposals:a,sources:{daily_notes:s.dailyNotes.length,candidates:s.candidates.length,active_memories:s.activeMemories.length,audit_events:s.auditEvents.length},protected_files:["SOUL.md","POLICY.md","standing-orders"].map(c=>({path:uo.join(r.home,c),modified:!1}))}}async function sb(e,t,r,o){let n=await ab(e,o);if(!eb(t))return{dailyNotes:n,candidates:[],activeMemories:[],auditEvents:[]};let s=_(t,{readOnly:!0});try{return{dailyNotes:n,candidates:s.listMemories({project:r,status:"candidate",includeForgotten:!1,limit:o}),activeMemories:s.listMemories({project:r,status:"active",includeForgotten:!1,limit:Math.max(o,20)}),auditEvents:s.listEvents({limit:Math.max(o,20)})}}finally{s.close()}}async function ab(e,t){let r=uo.join(e,"memory","daily");if(!await R(r))return[];let n=(await rb(r,{withFileTypes:!0})).filter(a=>a.isFile()&&a.name.endsWith(".md")).map(a=>a.name).sort().reverse().slice(0,t),s=[];for(let a of n){let i=uo.join(r,a),l=O(await ob(i,"utf8")).value.trim();l.length>0&&s.push({id:`daily:${a}`,path:i,text:l})}return s}function ib(e,t,r){let o=[];for(let n of t.candidates){let s=Ku(n.content,t.activeMemories),a=pb(n.content,t.activeMemories);if(a){o.push(ar({action:"flag_conflict",project:e,summary:`Review conflict between ${n.id} and ${a.id}`,before:a.summary,after:n.summary,evidence:[n.id,a.id],risk:"high"}));continue}if(s&&s.score>=.7){o.push(ar({action:"deduplicate",project:e,summary:`Reject or merge duplicate candidate ${n.id}`,before:s.memory.summary,after:n.summary,evidence:[n.id,s.memory.id],risk:"medium"}));continue}o.push(ar({action:"promote_candidate",project:e,summary:`Promote candidate ${n.id} after human review`,before:"Candidate memory is not durable yet.",after:n.summary,evidence:[n.id],risk:"low"}))}for(let n of t.dailyNotes){let s=ub(n.text);for(let a of s){if(o.length>=r)return o;let i=Ku(a,[...t.activeMemories,...t.candidates]);i&&i.score>=.7?o.push(ar({action:"deduplicate",project:e,summary:`Daily note repeats existing memory ${i.memory.id}`,before:i.memory.summary,after:Be(a),evidence:[n.id,i.memory.id],risk:"medium"})):o.push(ar({action:"create_candidate",project:e,summary:Be(a),before:"No durable memory exists for this daily note.",after:a,evidence:[n.id],risk:"low"}))}}for(let n of t.activeMemories)if(n.expires_at&&Date.parse(n.expires_at)<=Date.now()&&o.push(ar({action:"expire_active",project:e,summary:`Expire active memory ${n.id}`,before:n.summary,after:"Memory should move to expired after human review.",evidence:[n.id],risk:"medium"})),o.length>=r)return o;return o.slice(0,r)}function ar(e){return{id:T("reflection"),persisted_memory_id:null,...e}}async function lb(e,t){let r=uo.join(e,"proposals");await tb(r,{recursive:!0,mode:448});let o=uo.join(r,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-reflection.md`);return await nb(o,t,{encoding:"utf8",mode:384,flag:"wx"}),o}async function cb(e,t){for(let r of t.filter(o=>o.action==="create_candidate")){let o=await ae(e,{project:r.project,content:["Reflection consolidation candidate.","",r.after,"",`Evidence: ${r.evidence.join(", ")}`].join(`
883
+ `),confidence:.5,authority:"reflection_proposal",source:{kind:"reflection",proposal_id:r.id,evidence:r.evidence}});r.persisted_memory_id=o.id}}function db(e){let t=["# NativeSoul Reflection Report","",`Mode: ${e.applied?"apply":"dry-run"}`,`Project: ${e.project}`,`Generated at: ${new Date().toISOString()}`,"","## Sources","",`- Daily notes: ${e.dailyNotes.length}`,`- Candidate memories: ${e.candidates.length}`,`- Active memories: ${e.activeMemories.length}`,`- Audit events: ${e.auditEvents.length}`,"","## Before","",...e.candidates.map(r=>`- Candidate ${r.id}: ${r.summary}`),...e.activeMemories.slice(0,10).map(r=>`- Active ${r.id}: ${r.summary}`),"","## Proposed After",""];e.proposals.length===0&&t.push("- No consolidation proposal found.");for(let r of e.proposals)t.push(`- ${r.id} [${r.action}] ${r.summary}`),t.push(` - Before: ${r.before}`),t.push(` - After: ${r.after}`),t.push(` - Evidence: ${r.evidence.join(", ")}`),t.push(` - Risk: ${r.risk}`);return t.push("","## Safety","","- SOUL.md, POLICY.md, and standing-orders are not edited by reflection."),t.join(`
884
+ `)}function ub(e){return e.split(/\r?\n/u).map(t=>t.replace(/^\s*[-*]\s+/u,"").trim()).filter(t=>t.length>=20).filter(t=>!t.startsWith("#")).filter(t=>!/^(date|notes|observations|tasks):?$/iu.test(t)).slice(0,10)}function Ku(e,t){let r=null;for(let o of t){let n=zu(e,`${o.summary}
885
+ ${o.content}`);(!r||n>r.score)&&(r={memory:o,score:n})}return r}function pb(e,t){let r=Xu(e),o=Gu(e);for(let n of t)if(zu(e,`${n.summary}
886
+ ${n.content}`)>=.35&&o!==Gu(n.content)){let a=Xu(n.content);if([...r].some(l=>l.length>4&&a.has(l)))return n}return null}function Gu(e){return/\b(nao|não|never|do not|dont|don't|no longer|avoid|evitar|proibir|forbid)\b/iu.test(e)}function zu(e,t){return Ld(e,t,{minLength:3,normalizeDiacritics:!0,removeStopwords:!0})}function Xu(e){return Vr(e,{minLength:3,normalizeDiacritics:!0,removeStopwords:!0})}import{lstat as mb,readdir as gb,readFile as fb}from"node:fs/promises";import $t from"node:path";var Yu=new Set([".json",".jsonl",".md",".markdown",".txt"]);async function ei(e){let t=e.apply===!0,r=f((await v(e.home)).home),o=$t.resolve(e.sourcePath),n=e.project??L(e.cwd??process.cwd(),r.home),s=Math.min(Math.max(e.limit??200,1),1e3),a=[],i=await Qu(o,a),l=[],c=[];for(let k of i){if(l.length>=s){c.push({source_path:k,reason:"limit_reached"});continue}let S=await hb(k,a);if(S.length===0){c.push({source_path:k,reason:"no_supported_records"});continue}l.push(...S.slice(0,s-l.length))}let d=kb(l,n),p=wb(d).map(k=>({source_id:k,reason:"duplicate_source_id"})),g=[];if(t)for(let k of d){let S=await ae(r.home,{project:k.target_project,content:k.content,confidence:k.confidence,authority:"openclaw_import",source:{kind:"import",source_system:k.source_system,source_path:k.source_path,source_id:k.source_id,source_hash:k.source_hash,imported_at:new Date().toISOString(),redacted:k.redacted}});k.proposed_memory_id=S.id,g.push(S)}let y={applied:t,source_path:o,files:i,mapped_records:d,skipped_records:c,conflicts:p,redactions:d.filter(k=>k.redacted).length,proposed_scopes:Array.from(new Set(d.map(k=>k.target_project))).sort(),warnings:a,persisted_memories:g};return await h({home:r.home,type:t?"openclaw_import_applied":"openclaw_import_dry_run",details:Sb(y)}),y}async function Qu(e,t){let r;try{r=await mb(e)}catch{return t.push({code:"OPENCLAW_SOURCE_UNREADABLE",source_path:e,message:"Source path is not readable."}),[]}if(r.isFile())return Yu.has($t.extname(e).toLowerCase())?[e]:[];if(!r.isDirectory())return t.push({code:"OPENCLAW_SOURCE_UNSUPPORTED",source_path:e,message:"Source path is neither a file nor a directory."}),[];let o=await gb(e,{withFileTypes:!0});return(await Promise.all(o.map(s=>{let a=$t.join(e,s.name);return s.isDirectory()?Qu(a,t):Promise.resolve(Yu.has($t.extname(s.name).toLowerCase())?[a]:[])}))).flat().sort()}async function hb(e,t){let r;try{r=await fb(e,"utf8")}catch{return t.push({code:"OPENCLAW_FILE_UNREADABLE",source_path:e,message:"File could not be read."}),[]}let o=$t.extname(e).toLowerCase();return o===".json"?yb(e,r,t):o===".jsonl"?_b(e,r,t):bb(e,r)}function yb(e,t,r){let o;try{o=JSON.parse(t)}catch{return r.push({code:"OPENCLAW_JSON_MALFORMED",source_path:e,message:"JSON file is malformed."}),[]}return(Array.isArray(o)?o:vb(o)??[o]).flatMap((s,a)=>Zu(s,e,a))}function _b(e,t,r){return t.split(/\r?\n/u).flatMap((o,n)=>{let s=o.trim();if(!s)return[];try{return Zu(JSON.parse(s),e,n)}catch{return r.push({code:"OPENCLAW_JSONL_LINE_MALFORMED",source_path:e,message:`Line ${n+1} is malformed.`}),[]}})}function bb(e,t){return t.split(/\n(?=#{1,3}\s+)/u).map(r=>r.trim()).filter(r=>r.length>0).map((r,o)=>({id:null,content:r,project:null,confidence:null,sourcePath:e,raw:{kind:"text_section",index:o,source_path:e}}))}function vb(e){if(!ti(e))return null;for(let t of["memories","memory","records","items","notes"]){let r=e[t];if(Array.isArray(r))return r}return null}function Zu(e,t,r){if(typeof e=="string"&&e.trim().length>0)return[{id:null,content:e,project:null,confidence:null,sourcePath:t,raw:e}];if(!ti(e))return[];let o=Qa(e,["content","text","summary","memory","note","body","value"]);return o?[{id:Qa(e,["id","uid","uuid","key"])??`${$t.basename(t)}:${r+1}`,content:o,project:Qa(e,["project","project_id","scope_project","workspace","repo"]),confidence:Rb(e,["confidence","score"]),sourcePath:t,raw:Za(e)}]:[]}function kb(e,t){return e.map((r,o)=>{let n=O(r.content),s=r.id??`${$t.basename(r.sourcePath)}:${o+1}`;return{source_system:"openclaw",source_path:r.sourcePath,source_id:s,source_hash:Ab(r.raw),target_project:r.project?.trim()||t,content:n.value,summary:Be(n.value),redacted:n.redacted,confidence:Math.min(Math.max(r.confidence??.55,0),1),status:"candidate",proposed_memory_id:null}})}function wb(e){let t=new Map;for(let r of e)t.set(r.source_id,(t.get(r.source_id)??0)+1);return Array.from(t.entries()).filter(([,r])=>r>1).map(([r])=>r).sort()}function Qa(e,t){for(let r of t){let o=e[r];if(typeof o=="string"&&o.trim().length>0)return o.trim()}return null}function Rb(e,t){for(let r of t){let o=e[r];if(typeof o=="number"&&Number.isFinite(o))return o}return null}function Sb(e){return{source_path:e.source_path,files:e.files.length,mapped_records:e.mapped_records.length,skipped_records:e.skipped_records.length,conflicts:e.conflicts.length,redactions:e.redactions,persisted_memories:e.persisted_memories.length,proposed_scopes:e.proposed_scopes}}function Za(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?e:Array.isArray(e)?e.map(t=>Za(t)):ti(e)?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,Za(r)])):String(e)}function ti(e){return typeof e=="object"&&e!==null}function Ab(e){return ke(e)}import{lstat as Eb,readFile as Pb}from"node:fs/promises";import po from"node:path";var Ft=[".json",".jsonl",".md",".markdown",".txt"];var xb={nativesoul:{host:"nativesoul",supported_extensions:Ft,documented_inputs:["nativesoul memory export JSON/JSONL","operator-authored Markdown/text memory notes"],unsupported_boundaries:["NativeSoul private SQLite databases","undocumented internal cache files"],limitations:[]},codex:{host:"codex",supported_extensions:Ft,documented_inputs:["operator-provided Codex memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Codex private app stores","Codex cache or thread databases","undocumented internal state"],limitations:["Codex does not expose a NativeSoul-owned private store reader; import requires an explicit user-selected file."]},claude:{host:"claude",supported_extensions:Ft,documented_inputs:["operator-provided Claude memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Claude private settings databases","Claude internal conversation stores","undocumented internal state"],limitations:["Claude import is limited to explicit export or notes files selected by the operator."]},gemini:{host:"gemini",supported_extensions:Ft,documented_inputs:["operator-provided Gemini memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Gemini private app storage","Gemini internal cache files","undocumented internal state"],limitations:["No private Gemini memory database is read; use documented exports or operator-authored files."]},grok:{host:"grok",supported_extensions:Ft,documented_inputs:["operator-provided Grok memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Grok private app storage","Grok internal session stores","undocumented internal state"],limitations:["Grok import is file-only because no native memory store reader is supported."]},antigravity:{host:"antigravity",supported_extensions:Ft,documented_inputs:["operator-provided Antigravity memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Antigravity private workspace state","Antigravity scheduled-task stores","undocumented internal state"],limitations:["Antigravity import is constrained to explicit files; scheduler state is not memory import input."]}};function jb(e){return ke(e)}async function ni(e){let t=xb[e.host];if(!t)throw new Error(`Unsupported native host importer: ${String(e.host)}`);let r=e.apply===!0,o=f((await v(e.home)).home),n=po.resolve(e.sourcePath),s=e.project??L(e.cwd??process.cwd(),o.home),a=Math.min(Math.max(e.limit??200,1),1e3),i=[],l=await Ib(e.host,n,i),c=[],d=[];for(let S of l){if(c.length>=a){d.push({source_path:S,reason:"limit_reached"});continue}let U=await Tb(e.host,S,i);if(U.length===0){d.push({source_path:S,reason:"no_supported_records"});continue}c.push(...U.slice(0,a-c.length))}let p=Mb(e.host,c,s),g=await Lb(o.home,p),y=[];if(r)for(let S of p){let U=await ae(o.home,{project:S.target_project,content:S.content,confidence:S.confidence,authority:`${S.source_system}_import`,source:{kind:"import",source_system:S.source_system,source_path:S.source_path,source_id:S.source_id,source_hash:S.source_hash,normalized_content_hash:S.normalized_content_hash,imported_at:new Date().toISOString(),redacted:S.redacted}});S.proposed_memory_id=U.id,y.push(U)}let k={applied:r,host:e.host,source_path:n,registry:t,files:l,mapped_records:p,skipped_records:d,conflicts:g,redactions:p.filter(S=>S.redacted).length,proposed_scopes:Array.from(new Set(p.map(S=>S.target_project))).sort(),approvals_required:["Human review is required before imported candidate memories are promoted."],host_limitations:t.limitations,warnings:i,persisted_memories:y};return await h({home:o.home,type:r?"native_host_import_applied":"native_host_import_dry_run",details:Db(k)}),k}async function Ib(e,t,r){let o;try{o=await Eb(t)}catch{return r.push({code:"NATIVE_IMPORT_SOURCE_UNREADABLE",host:e,source_path:t,message:"Source path is not readable."}),[]}return o.isFile()?Fb(t)?[t]:(r.push({code:"NATIVE_IMPORT_FILE_UNSUPPORTED",host:e,source_path:t,message:"File extension is not supported by the native host importer registry."}),[]):o.isDirectory()?(r.push({code:"NATIVE_IMPORT_DIRECTORY_UNSUPPORTED",host:e,source_path:t,message:"Native host importers require an explicit file path and do not scan directories."}),[]):o.isDirectory()?[]:(r.push({code:"NATIVE_IMPORT_SOURCE_UNSUPPORTED",host:e,source_path:t,message:"Source path is neither a file nor a directory."}),[])}async function Tb(e,t,r){let o;try{o=await Pb(t,"utf8")}catch{return r.push({code:"NATIVE_IMPORT_FILE_UNREADABLE",host:e,source_path:t,message:"File could not be read."}),[]}let n=po.extname(t).toLowerCase();return n===".json"?Cb(e,t,o,r):n===".jsonl"?Nb(e,t,o,r):Ob(t,o)}function Cb(e,t,r,o){let n;try{n=JSON.parse(r)}catch{return o.push({code:"NATIVE_IMPORT_JSON_MALFORMED",host:e,source_path:t,message:"JSON file is malformed."}),[]}return(Array.isArray(n)?n:Hb(n)??[n]).flatMap((a,i)=>tp(a,t,i))}function Nb(e,t,r,o){return r.split(/\r?\n/u).flatMap((n,s)=>{let a=n.trim();if(!a)return[];try{return tp(JSON.parse(a),t,s)}catch{return o.push({code:"NATIVE_IMPORT_JSONL_LINE_MALFORMED",host:e,source_path:t,message:`Line ${s+1} is malformed.`}),[]}})}function Ob(e,t){return t.split(/\n(?=#{1,3}\s+)/u).map(r=>r.trim()).filter(r=>r.length>0).map((r,o)=>({id:null,content:r,project:null,confidence:null,sourcePath:e,raw:{kind:"text_section",index:o,source_path:e}}))}function tp(e,t,r){if(typeof e=="string"&&e.trim().length>0)return[{id:null,content:e,project:null,confidence:null,sourcePath:t,raw:e}];if(!si(e))return[];let o=ri(e,["content","text","summary","memory","note","body","value"]);return o?[{id:ri(e,["id","uid","uuid","key"])??`${po.basename(t)}:${r+1}`,content:o,project:ri(e,["project","project_id","scope_project","workspace","repo"]),confidence:$b(e,["confidence","score"]),sourcePath:t,raw:oi(e)}]:[]}function Mb(e,t,r){return t.map((o,n)=>{let s=O(o.content),a=o.id??`${po.basename(o.sourcePath)}:${n+1}`,i=rp(s.value);return{source_system:e,source_path:o.sourcePath,source_id:a,source_hash:jb(o.raw),normalized_content_hash:i,target_project:o.project?.trim()||r,content:s.value,summary:Be(s.value),redacted:s.redacted,confidence:Math.min(Math.max(o.confidence??.55,0),1),status:"candidate",proposed_memory_id:null}})}async function Lb(e,t){let r=[];r.push(...ep(t,o=>o.source_hash,"duplicate_source_hash")),r.push(...ep(t,o=>o.normalized_content_hash,"duplicate_normalized_content"));for(let o of new Set(t.map(n=>n.target_project))){let n=await Et({home:e,project:o,includeForgotten:!1,limit:1e3}),s=new Set(n.map(a=>rp(a.content)));for(let a of t.filter(i=>i.target_project===o))s.has(a.normalized_content_hash)&&r.push({source_id:a.source_id,reason:"existing_normalized_content"})}return r.sort((o,n)=>`${o.reason}:${o.source_id}`.localeCompare(`${n.reason}:${n.source_id}`))}function ep(e,t,r){let o=new Map;for(let n of e){let s=t(n);o.set(s,[...o.get(s)??[],n])}return Array.from(o.values()).filter(n=>n.length>1).flatMap(n=>n.map(s=>({source_id:s.source_id,reason:r})))}function rp(e){return ke(e.toLowerCase().replace(/\s+/gu," ").trim())}function Db(e){return{host:e.host,source_path:e.source_path,files:e.files.length,mapped_records:e.mapped_records.length,skipped_records:e.skipped_records.length,conflicts:e.conflicts.length,redactions:e.redactions,persisted_memories:e.persisted_memories.length,proposed_scopes:e.proposed_scopes,approvals_required:e.approvals_required.length,host_limitations:e.host_limitations}}function Hb(e){if(!si(e))return null;for(let t of["memories","memory","records","items","notes"]){let r=e[t];if(Array.isArray(r))return r}return null}function ri(e,t){for(let r of t){let o=e[r];if(typeof o=="string"&&o.trim().length>0)return o.trim()}return null}function $b(e,t){for(let r of t){let o=e[r];if(typeof o=="number"&&Number.isFinite(o))return o}return null}function oi(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?e:Array.isArray(e)?e.map(t=>oi(t)):si(e)?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,oi(r)])):String(e)}function Fb(e){return Ft.includes(po.extname(e).toLowerCase())}function si(e){return typeof e=="object"&&e!==null}var de={state:"unlicensed",license_key:null,instance_id:null,purchased_at:null,version_at_activation:null,updates_until:null,last_checked_at:null,source:"none"};import{chmod as Ub,mkdir as Vb,readFile as Bb,rm as Wb,writeFile as Jb}from"node:fs/promises";import{randomUUID as qb}from"node:crypto";import op from"node:path";function Tn(e){return op.join(f(e).home,"license.json")}async function Ee(e){let t=Tn(e);if(!await R(t))return null;try{let r=JSON.parse(await Bb(t,"utf8"));return Kb(r)?r:null}catch{return null}}async function mo(e,t){let r=Tn(e);return await Vb(op.dirname(r),{recursive:!0,mode:448}),await Jb(r,`${JSON.stringify(t,null,2)}
887
+ `,{encoding:"utf8",mode:384}),await Ub(r,384),t}async function ai(e){await Wb(Tn(e),{force:!0})}async function Cn(e){let t=await Ee(e);if(t?.instance_id)return t.instance_id;let r=qb();return await mo(e,{...de,instance_id:r,purchased_at:t?.purchased_at??null,version_at_activation:t?.version_at_activation??null,updates_until:t?.updates_until??null,license_key_instance_id:t?.license_key_instance_id??null}),r}function Kb(e){return(e.state==="licensed"||e.state==="unlicensed")&&(typeof e.license_key=="string"||e.license_key===null)&&(typeof e.instance_id=="string"||e.instance_id===null)&&(typeof e.purchased_at=="string"||e.purchased_at===null||e.purchased_at===void 0)&&(typeof e.version_at_activation=="string"||e.version_at_activation===null||e.version_at_activation===void 0)&&(typeof e.updates_until=="string"||e.updates_until===null)&&(typeof e.last_checked_at=="string"||e.last_checked_at===null)&&(e.source==="dodo"||e.source==="none")&&(typeof e.license_key_instance_id=="string"||e.license_key_instance_id===null)}var np={name:"nativesoul",version:"0.1.2",description:"Local-first continuity layer for coding agents.",type:"module",license:"UNLICENSED",main:"dist/packages/cli/src/index.js",repository:{type:"git",url:"git+https://github.com/fillipeweb/nativesoul.git"},bugs:{url:"https://github.com/fillipeweb/nativesoul/issues"},homepage:"https://github.com/fillipeweb/nativesoul#readme",files:["dist/","plugins/","policy-packs/","schemas/","docs/adr/","docs/legal/","llm-install.txt","README.md","CHANGELOG.md"],bin:{nativesoul:"dist/packages/cli/src/index.js","nativesoul-mcp":"dist/packages/mcp-server/src/index.js"},scripts:{lint:"eslint .",typecheck:"tsc -p tsconfig.json --noEmit",test:"npm run build && npm run test:non-e2e","test:non-e2e":"node scripts/run-non-e2e-tests.mjs",build:"npm run build:ts && npm run build:minify","build:ts":"tsc -p tsconfig.build.json","build:minify":"node scripts/build-min.mjs","policy:generate":"node scripts/generate-policy-fail-closed.mjs","policy:check":"node scripts/generate-policy-fail-closed.mjs --check","release:security:audit":"node scripts/release-security-audit.mjs","release:provenance:dry-run":"node scripts/release-provenance-dry-run.mjs","package:local":"node scripts/package-local.mjs","package:dry-run":"node scripts/package-dry-run.mjs","package:smoke":"node scripts/package-smoke.mjs","test:e2e":"npm run build && vitest run tests/e2e"},engines:{node:">=22.17.0"},dependencies:{},devDependencies:{"@eslint/js":"^10.0.1","@types/node":"^26.0.0",esbuild:"^0.28.1",eslint:"^10.5.0",typescript:"^6.0.3","typescript-eslint":"^8.62.0",vitest:"^4.1.9"}};var Ut=np.version;var Xb="https://api.dodopayments.com",zb=1440*60*1e3,Yb=14;async function ii(e){let t=f(e.home).home,r=e.now??new Date,o=await Cn(t),n=await di(e,"/licenses/activate",{license_key:e.key,name:o});if(!n.ok)return await De(t,"license_activate_failed",e.key,n.reason,"error"),{ok:!1,reason:n.reason,license:{...de,instance_id:o}};let s=await mo(t,{state:"licensed",license_key:e.key,instance_id:o,license_key_instance_id:n.license_key_instance_id,purchased_at:n.purchased_at??r.toISOString(),version_at_activation:Ut,updates_until:nv(n.purchased_at??r.toISOString(),365),last_checked_at:r.toISOString(),source:"dodo"});return await De(t,"license_activated",e.key,null,"ok"),{ok:!0,license:Vt(s)}}async function li(e){let t=f(e.home).home,r=e.now??new Date,o=await Ee(t),n=e.key??o?.license_key,s=o?.instance_id??null;if(!n)return await De(t,"license_validate_missing",null,"INVALID_KEY","blocked"),{ok:!1,reason:"INVALID_KEY",license:o?Vt(o):de};if(o?.state==="licensed"&&Qb(o.last_checked_at,r))return await De(t,"license_validate_cache_hit",n,null,"ok"),{ok:!0,license:Vt(o)};let a=await di(e,"/licenses/validate",{license_key:n});if(a.ok){let i=await mo(t,{state:"licensed",license_key:n,instance_id:s??await Cn(t),license_key_instance_id:o?.license_key_instance_id??null,purchased_at:o?.purchased_at??null,version_at_activation:o?.version_at_activation??null,updates_until:o?.updates_until??null,last_checked_at:r.toISOString(),source:"dodo"});return await De(t,"license_validated",n,null,"ok"),{ok:!0,license:Vt(i)}}return a.reason==="NETWORK"&&o?.state==="licensed"&&Zb(o.last_checked_at,r,e.graceDays)?(await De(t,"license_validate_grace_served",n,"NETWORK","ok"),{ok:!0,license:Vt(o)}):(await De(t,"license_validate_failed",n,a.reason,"blocked"),{ok:!1,reason:a.reason,license:{...de,instance_id:s}})}async function ci(e){let t=f(e.home).home,r=await Ee(t),o=e.key??r?.license_key,n=e.licenseKeyInstanceId??r?.license_key_instance_id;if(!o||!n)return await De(t,"license_deactivate_missing",o??null,"INVALID_KEY","blocked"),{ok:!1,reason:"INVALID_KEY",license:r?Vt(r):de};let s=await di(e,"/licenses/deactivate",{license_key:o,license_key_instance_id:n});return s.ok?(await ai(t),await De(t,"license_deactivated",o,null,"ok"),{ok:!0,license:de}):(await De(t,"license_deactivate_failed",o,s.reason,"error"),{ok:!1,reason:s.reason,license:r?Vt(r):de})}function Vt(e){return{state:e.state,license_key:e.license_key,instance_id:e.instance_id,purchased_at:e.purchased_at??null,version_at_activation:e.version_at_activation??null,updates_until:e.updates_until,last_checked_at:e.last_checked_at,source:e.source}}function Qb(e,t){return e?t.getTime()-new Date(e).getTime()<zb:!1}function Zb(e,t,r=Yb){return e?t.getTime()-new Date(e).getTime()<=r*24*60*60*1e3:!1}async function di(e,t,r){let o=e.fetch??globalThis.fetch;try{let n=await o(new URL(t,ev(e.endpointBaseUrl)).toString(),{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify(r)}),s=await tv(n);return n.ok?t==="/licenses/validate"&&s.valid!==!0?{ok:!1,reason:sp(s)}:{ok:!0,license_key_instance_id:rv(s),purchased_at:ov(s)}:{ok:!1,reason:sp(s)}}catch{return{ok:!1,reason:"NETWORK"}}}function ev(e=process.env.NATIVESOUL_DODO_LICENSE_API_BASE_URL??Xb){return e.endsWith("/")?e:`${e}/`}async function tv(e){try{let t=await e.json();return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}}function rv(e){let r=[e.license_key_instance_id,e.licenseKeyInstanceId,e.id,go(e.data)?e.data.license_key_instance_id:null,go(e.data)?e.data.id:null].find(o=>typeof o=="string"&&o.length>0);return typeof r=="string"?r:null}function ov(e){let t=go(e.data)?e.data:{},r=go(e.license_key)?e.license_key:go(t.license_key)?t.license_key:{},n=[e.purchased_at,e.purchase_date,e.created_at,t.purchased_at,t.purchase_date,t.created_at,r.purchased_at,r.purchase_date,r.created_at].find(s=>typeof s=="string"&&!Number.isNaN(Date.parse(s)));return typeof n=="string"?new Date(n).toISOString():null}function nv(e,t){let r=Date.parse(e);return Number.isNaN(r)?null:new Date(r+t*24*60*60*1e3).toISOString()}function sp(e){let t=String(e.reason??e.code??e.error??"").toUpperCase();return t.includes("LIMIT")?"ACTIVATION_LIMIT":t.includes("ACTIVE")?"NOT_ACTIVE":"INVALID_KEY"}function go(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}async function De(e,t,r,o,n){await h({home:e,type:t,result:n,details:{provider:"dodo",license_key_ref:r?sv(r):null,reason:o}})}function sv(e){return e.length<=8?"[REDACTED_LICENSE_KEY]":`${e.slice(0,4)}\u2026${e.slice(-4)}`}var fo="https://native-soul.mintlify.site/account/licensing";async function ir(e){let t=av(e),r=f(t.home).home;try{let o=await Ee(r),n=await li(t);if(n.ok)return{ok:!0,license:n.license};let s=n.reason==="NETWORK"&&o?.state==="licensed"?"GRACE_EXPIRED":"UNLICENSED",a=t.activateUrl??fo;return{ok:!1,reason:s,activate_url:a,message:ho({reason:s,activate_url:a}),license:n.license}}catch{let o=t.activateUrl??fo;return{ok:!1,reason:"UNLICENSED",activate_url:o,message:ho({reason:"UNLICENSED",activate_url:o}),license:de}}}function ho(e){return`${e.reason==="GRACE_EXPIRED"?"License offline grace expired.":"NativeSoul is not activated."} NativeSoul is paid-only. Run \`nativesoul license activate <key>\` after purchase: ${e.activate_url}`}function av(e){return typeof e=="string"?{home:e}:e??{}}import{readdir as iv,readFile as ap,stat as lv}from"node:fs/promises";import ui from"node:path";var cv=["open source","open-source","source-available","read the source","free to install","never phones home","zero network","uncrackable","piracy-proof"];async function pi(e={}){let t=e.registryPath??ui.join(process.cwd(),"docs","architecture","feature-registry.yaml"),r=e.marketingDir??ui.join(process.cwd(),"docs","marketing"),o=dv(await ap(t,"utf8")),n=e.page?[e.page]:await lp(r),s=[],a=[];for(let i of n){let l=await ap(i,"utf8"),c=yo(l);for(let d of cv)c.includes(yo(d))&&s.push({code:"GLOBAL_FORBIDDEN_PHRASE",page:i,phrase:d,message:`Global forbidden phrase found: ${d}`});for(let d of o.values())for(let p of d.claim_forbidden)p&&c.includes(yo(p))&&s.push({code:"FEATURE_FORBIDDEN_PHRASE",page:i,feature_id:d.id,phrase:p,message:`Forbidden phrase for ${d.id}: ${p}`});for(let d of uv(l)){let p=o.get(d.id);if(!p){s.push({code:"UNKNOWN_CLAIM_ID",page:i,feature_id:d.id,message:`Tagged claim references unknown feature id: ${d.id}`}),a.push({id:d.id,status:"unknown",page:i,text:d.text,result:"fail",reason:"unknown feature id"});continue}let g=pv(p,i,d.text);a.push(g),g.result==="fail"&&s.push(mv(g))}}return{ok:s.length===0,status:s.length===0?"pass":"fail",registry_path:t,pages:n,claims:a,issues:s,summary:{pages_scanned:n.length,claims_checked:a.length,issues:s.length}}}function dv(e){let t=new Map,r=null;for(let o of e.split(/\r?\n/u)){let n=o.match(/^\s*-\s+id:\s*(.+)\s*$/u);if(n){r?.id&&t.set(r.id,ip(r)),r={id:lr(n[1]??""),name:"",claim_forbidden:[],evidence:null,claim_allowed:null};continue}if(!r)continue;let s=o.match(/^\s+([a-z_]+):\s*(.*)\s*$/u);if(!s)continue;let a=s[1]??"",i=s[2]??"";a==="status"?r.status=lr(i).split(/\s+/u)[0]:a==="name"?r.name=lr(i):a==="evidence"?r.evidence=lr(i):a==="claim_allowed"?r.claim_allowed=i.trim()==="null"?null:lr(i):a==="claim_forbidden"&&(r.claim_forbidden=gv(i))}return r?.id&&t.set(r.id,ip(r)),t}function ip(e){return{id:e.id??"",name:e.name??e.id??"",status:e.status??"absent",evidence:e.evidence??null,claim_allowed:e.claim_allowed??null,claim_forbidden:e.claim_forbidden??[]}}async function lp(e){try{if(!(await lv(e)).isDirectory())return[]}catch{return[]}let t=await iv(e,{withFileTypes:!0});return(await Promise.all(t.map(async o=>{let n=ui.join(e,o.name);return o.isDirectory()?await lp(n):o.isFile()&&/\.(md|mdx|txt)$/iu.test(o.name)?[n]:[]}))).flat().sort()}function uv(e){let t=[],r=/<!--\s*claim:([a-z0-9_-]+)\s*-->([\s\S]*?)<!--\s*\/claim\s*-->/giu,o=/\[claim:([a-z0-9_+-]+)\]([\s\S]*?)\[\/claim\]/giu;for(let n of e.matchAll(r))t.push({id:n[1]??"",text:(n[2]??"").trim()});for(let n of e.matchAll(o))t.push({id:n[1]??"",text:(n[2]??"").trim()});return t}function pv(e,t,r){return e.status==="absent"||e.status==="roadmap"||e.status==="roadmap-teams"?{id:e.id,status:e.status,page:t,text:r,result:"fail",reason:`${e.status} feature cannot be claimed as live`}:e.status==="partial"&&e.claim_allowed&&!yo(r).includes(yo(e.claim_allowed))?{id:e.id,status:e.status,page:t,text:r,result:"fail",reason:"partial feature claim exceeds allowed wording"}:{id:e.id,status:e.status,page:t,text:r,result:"pass",reason:"claim within registry bounds"}}function mv(e){return{code:e.status==="partial"?"PARTIAL_CLAIM_OUT_OF_BOUNDS":"UNBUILT_FEATURE_CLAIM",page:e.page,feature_id:e.id,message:e.reason}}function gv(e){let t=e.trim().replace(/\s+#.*$/u,"");if(t==="[]")return[];if(!t.startsWith("[")||!t.endsWith("]"))return[];let r=t.slice(1,-1).trim();return r?r.split(/,\s*/u).map(lr).filter(Boolean):[]}function lr(e){let t=e.trim().replace(/\s+#.*$/u,"");return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function yo(e){return e.toLowerCase().replace(/[’']/gu,"'").replace(/\s+/gu," ").trim()}async function mi(e){let t=await Ee(e.home),r=t?.state==="licensed",o=r?fv(t.updates_until,e.now??new Date):"unknown",n=r?hv(e.latestKnownVersion,t.version_at_activation??null):"unknown",s=e.upgradeUrl??fo,a=o==="lapsed"&&n===!0,i=a?`You're on v${t?.version_at_activation??e.currentVersion}. v${e.latestKnownVersion} is available. Your licence keeps working \u2014 upgrade for the new major: ${s}.`:null;return{licensed:r,updates_status:o,newer_major_available:n,upgrade_url:s,purchased_at:t?.purchased_at??null,updates_until:t?.updates_until??null,version_at_activation:t?.version_at_activation??null,current_version:e.currentVersion,latest_known_version:e.latestKnownVersion??null,soft_nudge:{visible:a,dismissible:!0,message:i}}}function fv(e,t){if(!e)return"unknown";let r=Date.parse(e);return Number.isNaN(r)?"unknown":t.getTime()<=r?"active":"lapsed"}function hv(e,t){if(!e||!t)return"unknown";let r=cp(e),o=cp(t);return r===null||o===null?"unknown":r>o}function cp(e){let t=e.trim().match(/^v?(\d+)(?:\.|$)/u);return t?.[1]?Number.parseInt(t[1],10):null}import{copyFile as yv,mkdir as up,readFile as _v,rename as bv,stat as vv,writeFile as kv}from"node:fs/promises";import{existsSync as pp}from"node:fs";import Bt from"node:path";var dp=8;function Nn(e){let t=e.generatedAt??new Date().toISOString(),r=e.degraded===!0,o=[...e.payload.warnings,...e.warnings??[]],n=e.payload.capabilities.slice(0,dp),s=e.payload.capability_cards.slice(0,dp),a=["---","nativesoul: bootstrap-context",`bootstrap_schema: ${e.payload.bootstrap_schema}`,`host: ${e.host}`,`generated_at: ${t}`,`degraded: ${r?"true":"false"}`,`tokens_used: ${e.payload.context_budget.tokens_used}`,`tokens_max: ${e.payload.context_budget.tokens_max}`,o.length>0?`warnings: ${o.join(", ")}`:"warnings: none","---","",`You are ${e.payload.identity.name}; follow soul_summary and agents_operating_summary.`,`Global entity: ${e.payload.identity.name}. Project rules apply for code boundaries; persona remains ${e.payload.identity.name}.`,"","## Identity",`- Name: ${e.payload.identity.name}`,`- Mission: ${e.payload.identity.mission}`,e.payload.identity.role?`- Role: ${e.payload.identity.role}`:null,e.payload.identity.vibe?`- Vibe: ${e.payload.identity.vibe}`:null,"","## Soul Summary",e.payload.soul_summary,"","## Operating Summary",e.payload.agents_operating_summary,"","## User Preferences",e.payload.user.preferences_summary,"","## Project",`- ID: ${e.payload.project.id}`,`- CWD: ${e.payload.project.cwd}`,"","## Tool Hints",...e.payload.tool_hints.map(i=>`- ${i.tool}: ${i.use_when}`),"","## Relevant Memories",...e.payload.relevant_memories.length>0?e.payload.relevant_memories.map(i=>`- ${i.id}: ${i.summary}`):["- none"],"","## Commitments",...e.payload.commitments.length>0?e.payload.commitments.map(i=>`- ${JSON.stringify(i)}`):["- none"],"","## Capabilities",...n.length>0?n.map(i=>`- ${i.uid} (${i.host}, ready=${i.ready}): ${i.source}`):["- none"],"","## Capability Cards",...s.length>0?s.map(i=>`- ${i.uid} (${i.host}, ready=${i.ready}): ${i.use_when[0]??i.source}`):["- none"],""].filter(i=>i!==null).join(`
888
+ `);return{host:e.host,generated_at:t,degraded:r,warnings:o,tokens_used:hi(a),tokens_max:e.payload.context_budget.tokens_max,content:a}}async function On(e){let t=f(e.home),r=Nn({host:e.host,payload:e.payload}),o=fi(t.home,e.host),n=pp(o)&&e.apply!==!1?await Rv(t.home,e.host,o):null;if(e.apply!==!1){await up(Bt.dirname(o),{recursive:!0,mode:448});let a=Bt.join(Bt.dirname(o),`.last-context-${T("tmp")}.tmp`);await kv(a,r.content,{encoding:"utf8",mode:384}),await bv(a,o)}let s={...r,targetPath:o,backupPath:n,applied:e.apply!==!1};return e.recordTelemetry!==!1&&await h({home:t.home,type:e.apply===!1?"bootstrap_context_cache_dry_run":"bootstrap_context_cache_written",details:{...s,content:"[omitted]"}}),e.apply!==!1&&e.recordTelemetry!==!1&&await Me({home:t.home,host:e.host,outcome:"succeeded",tier:"A",cwd:e.payload.project.cwd,project:e.payload.project.id,tokensUsed:r.tokens_used,tokensMax:r.tokens_max,source:"bootstrap-inject",warnings:r.warnings}),s}async function cr(e){let t=f(e.home),r=fi(t.home,e.host);if(!pp(r))return wv({home:t.home,host:e.host,targetPath:r,recordTelemetry:e.recordTelemetry});let o=await _v(r,"utf8"),n=await vv(r),s=e.ttlDays??7,a=Date.now()-n.mtimeMs>s*24*60*60*1e3,i=new Date().toISOString(),l=a?["BOOTSTRAP_CACHE_STALE"]:[],c=["---","nativesoul: bootstrap-context-cache",`host: ${e.host}`,`generated_at: ${i}`,"degraded: true",l.length>0?`warnings: ${l.join(", ")}`:"warnings: none","---","",o].join(`
889
+ `),d={host:e.host,generated_at:i,degraded:!0,warnings:l,tokens_used:hi(c),tokens_max:1900,content:c,targetPath:r,stale:a};if(e.recordTelemetry!==!1){await h({home:t.home,type:"bootstrap_context_cache_read",details:{...d,content:"[omitted]"}});let p=Sv(o);await Me({home:t.home,host:e.host,outcome:"degraded",tier:"D",cwd:p.cwd,project:p.project,tokensUsed:d.tokens_used,tokensMax:d.tokens_max,source:"bootstrap-cache",warnings:l})}return d}async function gi(e){let t=await cr({home:e.home,host:e.host,ttlDays:e.ttlDays,recordTelemetry:e.recordTelemetry});if(!t.warnings.includes("BOOTSTRAP_CACHE_MISSING")||!e.projectCwd)return t;let r=await cr({home:_o(e.projectCwd),host:e.host,ttlDays:e.ttlDays,recordTelemetry:!1});return r.warnings.includes("BOOTSTRAP_CACHE_MISSING")?t:r}function fi(e,t){return Bt.join(e,"generated",t,"last-context.md")}function _o(e){return Bt.join(e,".nativesoul-cache")}async function wv(e){let t=new Date().toISOString(),r=["BOOTSTRAP_CACHE_MISSING"],o=["---","nativesoul: bootstrap-context-cache",`host: ${e.host}`,`generated_at: ${t}`,"degraded: true",`warnings: ${r.join(", ")}`,"---","","Bootstrap context cache is not available. Run `nativesoul bootstrap --format inject` after install."].join(`
890
+ `),n={host:e.host,generated_at:t,degraded:!0,warnings:r,tokens_used:hi(o),tokens_max:1900,content:o,targetPath:e.targetPath,stale:!1};return e.recordTelemetry!==!1&&(await h({home:e.home,type:"bootstrap_context_cache_missing",details:{...n,content:"[omitted]"}}),await Me({home:e.home,host:e.host,outcome:"degraded",tier:"D",cwd:null,project:null,tokensUsed:n.tokens_used,tokensMax:n.tokens_max,source:"bootstrap-cache",warnings:r})),n}async function Rv(e,t,r){let o=Bt.join(e,"backups","bootstrap-context");await up(o,{recursive:!0,mode:448});let n=Bt.join(o,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-${t}-last-context.md`);return await yv(r,n),n}function hi(e){return Math.ceil(e.length/4)}function Sv(e){let t=e.match(/^- CWD:\s*(.+)$/mu)?.[1]?.trim()??null,r=e.match(/^- ID:\s*(.+)$/mu)?.[1]?.trim()??null;return{cwd:t,project:r}}function dr(e){return Xa(e)?"full native capability":e.ready?"ready":e.healthy&&e.allowed?"official-fallback":"degraded"}function yi(e){let t=dr(e);return t==="full native capability"?"cyan":t==="ready"?"green":t==="official-fallback"?"amber":"red"}var gp={inbox:["assigned","in_progress"],assigned:["in_progress"],in_progress:["review","blocked","done","failed"],review:["in_progress","done","failed"],blocked:["in_progress","failed"],done:[],failed:[]};async function bo(e){let t=await v(e.home),r=new Date().toISOString(),o=O(e.title).value,n=e.description===void 0||e.description===null?null:O(e.description).value,s={id:T("work"),project_id:e.project,title:o,description:n,status:"inbox",priority:e.priority??"normal",assigned_host:e.host??null,source:e.source??"cli",tags:H(e.tags??[]),metadata:H(e.metadata??{}),created_at:r,updated_at:r,claimed_at:null,completed_at:null},a=fp({workItem:s,type:"created",fromStatus:null,toStatus:"inbox",actor:e.host??"cli",details:{priority:s.priority,source:s.source},now:r}),i=_(t.database),l;try{l=i.insertWorkItem(s),i.insertWorkItemEvent(a)}finally{i.close()}return await hp(t.home,"work_item_created",l,{redacted:o!==e.title||e.description!==void 0&&e.description!==null&&n!==e.description,event_id:a.id}),l}async function vo(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await R(t.database))return[];let r=_(t.database,{readOnly:e.readOnly}),o;try{o=r.listWorkItems({project:e.project,status:e.status,priority:e.priority,assignedHost:e.assignedHost,limit:Ev(e.limit)})}finally{r.close()}return e.readOnly||await h({home:t.home,type:"work_items_listed",details:{project:e.project??null,status:e.status??null,priority:e.priority??null,assigned_host:e.assignedHost??null,count:o.length}}),o}async function ko(e){return _i({home:e.home,id:e.id,actor:e.host,eventType:"claimed",auditType:"work_item_claimed",mutate:(t,r)=>{if(bi(t.status))throw new Error(`Work item already terminal: ${t.id} (${t.status})`);return Mn(t.status,"in_progress"),{status:"in_progress",assignedHost:e.host,claimedAt:t.claimed_at??r,updatedAt:r,details:{assigned_host:e.host}}}})}async function wo(e){return _i({home:e.home,id:e.id,actor:e.assignedHost??"cli",eventType:e.status?"status_changed":"updated",auditType:"work_item_updated",mutate:(t,r)=>{let o=e.status??t.status;e.status&&Mn(t.status,e.status);let n=e.description===void 0||e.description===null?e.description:O(e.description).value;return{status:o,priority:e.priority,assignedHost:e.assignedHost,description:n,tags:e.tags===void 0?void 0:H(e.tags),metadata:e.metadata===void 0?void 0:xv(t.metadata,H(e.metadata)),completedAt:bi(o)?r:void 0,updatedAt:r,details:{priority:e.priority??null,assigned_host:e.assignedHost??null,fields:Av(e),redacted:e.description!==void 0&&e.description!==null&&n!==e.description}}}})}async function Ro(e){let t=e.status??"done";return _i({home:e.home,id:e.id,actor:"cli",eventType:"completed",auditType:"work_item_completed",mutate:(r,o)=>{if(bi(r.status))throw new Error(`Work item already terminal: ${r.id} (${r.status})`);return Mn(r.status,t),{status:t,completedAt:o,updatedAt:o,details:{terminal_status:t}}}})}function Mn(e,t){if(e!==t&&!gp[e].includes(t))throw new Error(`Illegal work item transition: ${e} -> ${t}`)}async function _i(e){let t=await v(e.home),r=_(t.database),o,n;try{let s=r.getWorkItem(e.id);if(!s)throw new Error(`Work item not found: ${e.id}`);let a=new Date().toISOString(),i=e.mutate(s,a);n=fp({workItem:s,type:e.eventType,fromStatus:s.status,toStatus:i.status??s.status,actor:e.actor,details:i.details,now:a}),o=r.updateWorkItem({id:s.id,status:i.status,priority:i.priority,assignedHost:i.assignedHost,description:i.description,tags:i.tags,metadata:i.metadata,claimedAt:i.claimedAt,completedAt:i.completedAt,updatedAt:i.updatedAt,event:n})}finally{r.close()}if(!o)throw new Error(`Work item not found: ${e.id}`);return await hp(t.home,e.auditType,o,{event_id:n.id,event_type:n.type,from_status:n.from_status,to_status:n.to_status,details:n.details}),o}function fp(e){return{id:T("work_evt"),work_item_id:e.workItem.id,project_id:e.workItem.project_id,type:e.type,from_status:e.fromStatus,to_status:e.toStatus,actor:e.actor,details:e.details,created_at:e.now}}async function hp(e,t,r,o){await h({home:e,type:t,details:{id:r.id,project:r.project_id,status:r.status,...Pv(o)}})}function Av(e){return[e.status===void 0?null:"status",e.priority===void 0?null:"priority",e.assignedHost===void 0?null:"assigned_host",e.description===void 0?null:"description",e.tags===void 0?null:"tags",e.metadata===void 0?null:"metadata"].filter(t=>t!==null)}function bi(e){return e==="done"||e==="failed"}function Ev(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),200)}function Pv(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{value:e}}function xv(e,t){return mp(e)&&mp(t)?{...e,...t}:t}function mp(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}import{readdir as uk,readFile as pk}from"node:fs/promises";import Tp from"node:path";import{existsSync as jv}from"node:fs";var Iv=50;function So(e={}){let t=$v(e.limit),r=Mv(e),o=e.groupBy??"host",n=new Date().toISOString();if(e.db)return yp(e.db,e,r,o,t,n);let s=f(e.home);if(!jv(s.database))return Hv(e,r,o,t,n);let a=_(s.database,{readOnly:!0});try{return yp(a,e,r,o,t,n)}finally{a.close()}}function yp(e,t,r,o,n,s){let a=e.listRunCostRows({project:t.project,host:t.host,since:r.since??void 0,until:r.until??void 0}),i=Ln(a,g=>({key:g.project_id,label:g.project_id})),l=Ln(a,g=>({key:g.host,label:g.host})),c=Ln(a,g=>{let y=Nv(g);return{key:y,label:y==="unattributed"?"unattributed":y}}),d=Ln(a,g=>{let y=g.completed_at?.slice(0,10)??"unknown";return{key:y,label:y}}),p=a.map(g=>vp(g.id,g.id,[g]));return{schema_version:1,generated_at:s,filters:{project:t.project??null,host:t.host??null,since:r.since,until:r.until,group_by:o,limit:n},totals:kp(a),groups:Cv(o,{byProject:i,byHost:l,bySession:c,byDay:d,byRun:p}).slice(0,n),by_project:i.slice(0,n),by_host:l.slice(0,n),by_session:c.slice(0,n),by_day:d.slice(0,n),by_run:p.slice(0,n)}}function Ln(e,t){let r=new Map;for(let o of e){let n=t(o),s=r.get(n.key)??{label:n.label,rows:[]};s.rows.push(o),r.set(n.key,s)}return Array.from(r.entries()).map(([o,n])=>vp(o,n.label,n.rows))}function vp(e,t,r){return{key:e,label:t,...kp(r)}}function kp(e){let t=0,r=0,o=0,n=0,s=0;for(let a of e){let i=wr(a.cost_json);Tv(i)&&(t+=1),"tokens_in"in i&&typeof i.tokens_in=="number"&&(o+=i.tokens_in),"tokens_out"in i&&typeof i.tokens_out=="number"&&(n+=i.tokens_out),"cost_usd"in i&&typeof i.cost_usd=="number"&&(r+=1,s+=i.cost_usd)}return{total_runs:e.length,reported_runs:t,cost_reported_runs:r,not_reported_runs:e.length-t,tokens_in:o,tokens_out:n,total_usd:Fv(s),coverage:e.length===0?0:t/e.length}}function Tv(e){return"source"in e&&e.source==="host-reported"}function Cv(e,t){switch(e){case"project":return t.byProject;case"host":return t.byHost;case"day":return t.byDay;case"session":return t.bySession;case"total":return[]}}function Nv(e){return Ov(e.evidence_json)??e.session_id??"unattributed"}function Ov(e){let t;try{t=JSON.parse(e)}catch{return null}return _p(t,"session_id")??_p(t,"session")}function _p(e,t){if(!e||typeof e!="object"||Array.isArray(e))return null;let r=e[t];return typeof r=="string"&&r.length>0?r:null}function Mv(e){return{since:e.since?Lv(e.since):null,until:e.until?wp(e.until,"until"):null}}function Lv(e){let t=Dv(e);return t!==null?new Date(Date.now()-t).toISOString():wp(e,"since")}function wp(e,t){let r=Date.parse(e);if(!Number.isFinite(r))throw new Error(`cost --${t} must be an ISO timestamp or duration`);return new Date(r).toISOString()}function Dv(e){let t=e.match(/^(\d+)(s|m|h|d|w)$/u);if(t?.[1]&&t[2])return bp(Number(t[1]),t[2]);let r=e.match(/^(\d+)\s+(second|seconds|minute|minutes|hour|hours|day|days|week|weeks)$/u);return r?.[1]&&r[2]?bp(Number(r[1]),r[2]):null}function bp(e,t){return e*({s:1e3,second:1e3,seconds:1e3,m:6e4,minute:6e4,minutes:6e4,h:36e5,hour:36e5,hours:36e5,d:864e5,day:864e5,days:864e5,w:6048e5,week:6048e5,weeks:6048e5}[t]??0)}function Hv(e,t,r,o,n){let s={total_runs:0,reported_runs:0,cost_reported_runs:0,not_reported_runs:0,tokens_in:0,tokens_out:0,total_usd:0,coverage:0};return{schema_version:1,generated_at:n,filters:{project:e.project??null,host:e.host??null,since:t.since,until:t.until,group_by:r,limit:o},totals:s,groups:[],by_project:[],by_host:[],by_session:[],by_day:[],by_run:[]}}function $v(e){return e===void 0||!Number.isFinite(e)?Iv:Math.max(1,Math.min(Math.trunc(e),500))}function Fv(e){return Math.round(e*1e8)/1e8}import{mkdir as Wv,readdir as Jv,readFile as qv,writeFile as Kv}from"node:fs/promises";import Wt from"node:path";function Rp(e){let t=vi(e)?e:{},r=vi(t.tool_input)?t.tool_input:vi(t.input)?t.input:{},o=X(t.tool_name)??X(t.tool)??X(t.name)??"unknown_tool",n=X(t.action)??X(r.action)??o,s=X(t.target)??X(r.target)??X(r.file_path)??X(r.path)??X(r.url)??X(r.command),a=X(r.command)??X(t.command);return{action:n,className:Uv(o,[s,a].filter(Boolean).join(" ")),target:s,project:X(t.project)??X(t.project_id)??X(r.project)??X(r.project_id)}}function Uv(e,t){let r=`${e} ${t??""}`.toLowerCase();return/\b(bash|shell|sh|zsh|exec_command)\b/u.test(e.toLowerCase())?Vv(t??""):/\b(rm\s+-[^\s]*[rf][^\s]*|delete|reset\s+--hard|destroy|purge|drop)\b/u.test(r)?"destructive":/(slack|gmail|outlook|github|gh\s+pr|gh\s+issue|git\s+push|vercel\s+deploy|deploy|publish|send|post|comment|merge|api|curl\s+.*(-x|--request|-d|--data|--data-raw|--form)\s*(post|put|patch|delete)?)/u.test(r)?"external_write":/(write|edit|patch|apply|create|move|rename|git\s+commit)/u.test(r)?"write_project":/(curl|fetch|browser|http|web)/u.test(r)?"probe_external":"read_local"}function Vv(e){let t=e.toLowerCase();return/\b(rm\s+-[^\s]*[rf][^\s]*|delete|reset\s+--hard|destroy|purge|drop)\b/u.test(t)?"destructive":/(curl\s+.*(-x|--request|-d|--data|--data-raw|--form)\s*(post|put|patch|delete)?|gh\s+(pr|issue|release)|git\s+push|vercel\s+deploy|npm\s+publish|pnpm\s+publish|deploy|publish)/u.test(t)?"external_write":/(^|\s)(touch|mkdir|mv|cp|tee|chmod|chown|git\s+commit)\b|(^|[^>])>[^>]|>>/u.test(t)?"write_project":/^(pwd|ls|cat|head|tail|rg|grep|sed\s+-n|find\s+.*-print|git\s+(status|diff|log|show))(\s|$)/u.test(t.trim())?"read_local":/(curl|fetch|http|https?:\/\/)/u.test(t)?"probe_external":"write_project"}function vi(e){return!!e&&!Array.isArray(e)&&typeof e=="object"}function X(e){return typeof e=="string"&&e.trim().length>0?e.trim():void 0}var Gv=new Set(["SOUL.MD","POLICY.MD"]),Xv=5e3,Sp=new Map;async function ut(e){let t=f(e),r=Sp.get(t.home);if(r&&r.expiresAt>Date.now())return r.orders;let o=Wt.join(t.home,"standing-orders"),n;try{n=await Jv(o)}catch{return[]}let s=[];for(let a of n.filter(i=>i.endsWith(".yaml")||i.endsWith(".yml")).sort()){let i=Wt.join(o,a),l=await qv(i,"utf8");s.push(zv(l,i))}return Sp.set(t.home,{expiresAt:Date.now()+Xv,orders:s}),s}async function pt(e){let t=await ut(e.home),r=e.target??null,o=r?Ap(r):null,n=t.filter(i=>Ri(i,e)),s=n.find(i=>i.allowed.includes(e.action)),a=n.find(i=>i.approval_required.includes(e.action));if(o&&Gv.has(o))return dt(e,"proposal_required",["PROTECTED_HUMAN_FILE"],null);if(e.className==="identity_policy_change")return dt(e,"proposal_required",["IDENTITY_POLICY_CHANGE"],null);if(e.className==="destructive")return dt(e,"denied",["DESTRUCTIVE_DENIED_BY_DEFAULT"],s?.id??a?.id??null);if(a)return dt(e,"approval_required",["STANDING_ORDER_REQUIRES_APPROVAL"],a.id);if(s)return dt(e,"allowed",["STANDING_ORDER_ALLOWED"],s.id);switch(e.className){case"read_local":case"probe_external":case"write_local":return dt(e,"allowed",["DEFAULT_ALLOWED"],null);case"write_project":return dt(e,"approval_required",["PROJECT_WRITE_REQUIRES_APPROVAL"],null);case"external_write":return dt(e,"approval_required",["EXTERNAL_WRITE_REQUIRES_APPROVAL"],null)}}async function ki(e){let t=Rp(e.payload),r=await pt({home:e.home,action:t.action,className:t.className,target:t.target,project:t.project,host:e.host}),o=r.decision==="allowed",n={hook_event_name:"PreToolUse",host:e.host,allowed:o,blocked:!o,message:o?"NativeSoul policy allowed this tool use.":`NativeSoul policy blocked ${r.action}: ${r.decision} (${r.reasons.join(", ")}).`,evaluation:r};if(!o){let s=await v(e.home);await h({home:s.home,type:"policy_blocked",result:"blocked",details:{host:e.host,cwd:e.cwd??null,action:r.action,class:r.class,target:r.target,decision:r.decision,reasons:r.reasons,matched_standing_order:r.matched_standing_order}})}return n}async function wi(e){let t=await v(e.home),r=Yv(e.target);if(!r)throw new Error("policy propose-change target must be SOUL.md or POLICY.md");let o=O(e.summary).value,n=new Date().toISOString(),s=T("proposal"),a=Wt.join(t.home,"proposals",`${n.replaceAll(/[:.]/gu,"-")}-${r}.md`),i=["# Policy Change Proposal","",`ID: ${s}`,`Target: ${r}`,`Created At: ${n}`,"","## Summary","",o,""].join(`
891
+ `);return await Wv(Wt.dirname(a),{recursive:!0,mode:448}),await Kv(a,i,{encoding:"utf8",mode:384,flag:"wx"}),await h({home:t.home,type:"policy_change_proposed",details:{id:s,target:r,proposalPath:a,redacted:o!==e.summary}}),{id:s,target:r,summary:o,proposalPath:a,created_at:n}}function dt(e,t,r,o){return{action:e.action,class:e.className,target:e.target??null,decision:t,reasons:r,matched_standing_order:o}}function zv(e,t){return{id:Qv(e,"id")??Wt.basename(t,Wt.extname(t)),allowed:ur(e,"allowed"),approval_required:ur(e,"approval_required"),scope_projects:ur(e,"projects").concat(ur(e,"scope_projects")),scope_hosts:ur(e,"hosts").concat(ur(e,"scope_hosts")),source:t}}function Ri(e,t){return!(e.scope_projects.length>0&&(!t.project||!e.scope_projects.includes(t.project))||e.scope_hosts.length>0&&(!t.host||!e.scope_hosts.includes(t.host)))}function Ap(e){return Wt.basename(e.replaceAll("\\","/")).toUpperCase()}function Yv(e){let t=Ap(e);return t==="SOUL.MD"?"SOUL.md":t==="POLICY.MD"?"POLICY.md":null}function Qv(e,t){let r=new RegExp(`^\\s*${t}:\\s*([^\\n#]+)`,"mu");return e.match(r)?.[1]?.trim().replace(/^["']|["']$/gu,"")??null}function ur(e,t){let r=e.match(new RegExp(`^\\s*${t}:\\s*\\[([^\\]]*)\\]`,"mu"));if(r?.[1])return r[1].split(",").map(i=>i.trim().replace(/^["']|["']$/gu,"")).filter(Boolean);let o=e.split(/\r?\n/u),n=[],s=!1,a=0;for(let i of o){let l=i.trim();if(!s){let d=i.match(new RegExp(`^(\\s*)${t}:\\s*$`,"u"));d&&(s=!0,a=d[1]?.length??0);continue}let c=i.length-i.trimStart().length;if(l&&c<=a&&!l.startsWith("-"))break;l.startsWith("-")&&n.push(l.slice(1).trim().replace(/^["']|["']$/gu,""))}return n.filter(Boolean)}function ie(e,t,r){if(e==null)return!1;if(Array.isArray(e))return e.some(o=>ie(o,t,r));if(typeof e!="object")return!1;for(let[o,n]of Object.entries(e)){if(o===t){if(r===void 0)return!0;if(n===null)return r==="null";if(typeof n=="string"||typeof n=="number"||typeof n=="boolean")return String(n)===r;if(Array.isArray(n))return n.some(s=>String(s)===r)}if(ie(n,t,r))return!0}return!1}var Zv=/(?:sk-[A-Za-z0-9_-]{8,}|(?:api[_-]?key|token|secret|password)\s*[:=]\s*(?!\[REDACTED_SECRET\])[^"'\s]+)/iu;async function pr(e={}){let t=f(e.home),r=dk(e.limit);if(!await R(t.database))return ek(e,r,!1);let n=_(t.database,{readOnly:!0});try{let s=n.listEvents({limit:r}),a=n.listCapabilities({host:e.host,includeShared:!0,limit:r}),i=n.listSchedules({host:e.host,limit:r}),l=n.listHeartbeatLeases({project:e.project,limit:r}),c=n.listHeartbeatRuns({project:e.project,host:e.host,limit:r}),d=s.filter(y=>ck(y,e)),p=a.filter(y=>Ep(y.host,e.host)),g=i.filter(y=>Ep(y.host,e.host));return Ip({schema_version:1,generated_at:new Date().toISOString(),read_only:!0,external_telemetry_enabled:!1,initialized:!0,filters:jp(e,r),retention:xp(r),metrics:{activation:tk(d),bootstrap:rk(d),recall:ok(d),capability_readiness:nk(p),heartbeat:sk(l,c),no_op_suppression:ak(d),rollback:ik(d),secret_leakage_checks:Pp(d)},m7_gate:lk(d,p,g,c)})}finally{n.close()}}function ek(e,t,r){return Ip({schema_version:1,generated_at:new Date().toISOString(),read_only:!0,external_telemetry_enabled:!1,initialized:r,filters:jp(e,t),retention:xp(t),metrics:{activation:{workspace_initialized:0,onboarding_completed:0,install_applied:0},bootstrap:{succeeded:0,degraded:0,failed:0,cache_fallbacks:0},recall:{recalled:0,proposed:0,promoted:0},capability_readiness:{total:0,ready:0,full_native:0,official_fallback:0,degraded:0},heartbeat:{leases:0,completed_runs:0,silent_ok:0},no_op_suppression:{total:0,heartbeat_skipped:0,deduped:0,noop_actions:0},rollback:{total:0,policy_pack:0,mcp:0,managed_block:0},secret_leakage_checks:{checked:!0,leak_indicators:0,redaction_markers:0}},m7_gate:{recurring_use_validated:!1,feedback_validated:!1,privacy_validated:!0,notes:["NativeSoul database is not initialized; no local feedback evidence is available yet."]}})}function tk(e){return{workspace_initialized:ue(e,["workspace_initialized"]),onboarding_completed:ue(e,["onboarding_completed"]),install_applied:ue(e,["plugin_install","managed_block_applied","mcp_registration_installed"])}}function rk(e){return{succeeded:ue(e,["handshake_succeeded"]),degraded:ue(e,["handshake_degraded"]),failed:ue(e,["handshake_failed"]),cache_fallbacks:e.filter(t=>t.type.includes("bootstrap_context_cache")).length}}function ok(e){return{recalled:ue(e,["memory_recalled"]),proposed:ue(e,["memory_proposed"]),promoted:ue(e,["memory_promoted"])}}function nk(e){let t=e.map(dr);return{total:e.length,ready:t.filter(r=>r==="ready"||r==="full native capability").length,full_native:t.filter(r=>r==="full native capability").length,official_fallback:t.filter(r=>r==="official-fallback").length,degraded:t.filter(r=>r==="degraded").length}}function sk(e,t){return{leases:e.length,completed_runs:t.length,silent_ok:t.filter(r=>r.result==="HEARTBEAT_OK"||ie(r.result,"silent_ack","HEARTBEAT_OK")).length}}function ak(e){let t=ue(e,["heartbeat_skipped"]),r=e.filter(n=>n.type.includes("deduped")).length,o=e.filter(n=>ie(n.details,"action","noop")).length;return{total:t+r+o,heartbeat_skipped:t,deduped:r,noop_actions:o}}function ik(e){let t=ue(e,["policy_pack_rollback"]),r=ue(e,["mcp_registration_rollback"]),o=ue(e,["managed_block_rollback"]);return{total:e.filter(n=>n.type.includes("rollback")).length,policy_pack:t,mcp:r,managed_block:o}}function Pp(e){let t=JSON.stringify(e.map(r=>({type:r.type,result:r.result,details:r.details})));return{checked:!0,leak_indicators:Zv.test(t)?1:0,redaction_markers:(t.match(/\[REDACTED_/gu)??[]).length}}function lk(e,t,r,o){let n=o.length>0||r.some(l=>l.enabled),s=e.length>0&&t.length>0,a=Pp(e).leak_indicators===0;return{recurring_use_validated:n,feedback_validated:s,privacy_validated:a,notes:[n?"Recurring heartbeat/schedule evidence exists locally.":"No recurring heartbeat/schedule evidence yet.",s?"Feedback report has local audit and capability evidence.":"Feedback report needs audit and capability evidence.",a?"Report excludes raw prompts, memory bodies, and unredacted secret indicators.":"Potential secret indicators found in local audit details."]}}function ue(e,t){return e.filter(r=>t.includes(r.type)).length}function ck(e,t){let r=!t.host||!ie(e.details,"host")||ie(e.details,"host",t.host),o=!t.project||!ie(e.details,"project")||ie(e.details,"project",t.project);return r&&o}function Ep(e,t){return!t||e===t||e==="all"}function xp(e){return{source_event_limit:e,stores_raw_prompts:!1,stores_memory_content:!1,stores_raw_paths:!1}}function jp(e,t){return{project:e.project??null,host:e.host??null,limit:t}}function dk(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e??200),1),500):200}function Ip(e){return zt(H(e))}var mk=["candidate","active","superseded","rejected","forgotten","expired"],Si=["inbox","assigned","in_progress","review","blocked","done","failed"];async function Ao(e={}){let t=f(e.home),r=Ck(e.limit),o=jk(e);if(!await R(t.database))return Np(await gk(t.home,t.database,e,r));let s=_(t.database,{readOnly:!0});try{let a=s.listMemories({project:e.project,includeForgotten:!0,limit:Math.max(r*4,50)}),i=s.listCapabilities({host:e.host,includeShared:!0,limit:r}),l=s.listCommitments({project:e.project,includeExpired:!0,limit:Math.max(r*2,50),now:new Date().toISOString(),skipExpire:!0}),c=s.listSchedules({host:e.host,limit:r}),d=s.listHeartbeatLeases({project:e.project,limit:r}),p=s.listHeartbeatRuns({project:e.project,host:e.host,limit:r}),g=s.listEvents({limit:Math.max(r*4,50)}),y=Pk(await ut(t.home),e),k=await Sk(t.home),S=Ge(a,o,D=>D.created_at),U=Ge(l,o,D=>D.updated_at).slice(0,r),Q=Ge(i,o,D=>D.last_seen_at).slice(0,r),je=Ge(c,o,D=>D.updated_at).slice(0,r),be=Ge(d,o,D=>D.created_at).slice(0,r),pe=Ge(p,o,D=>D.completed_at).slice(0,r),Ie=Ge(g,o,D=>D.created_at).filter(D=>!e.host||Ik(D,{key:"host",value:e.host})).slice(0,r),x=Ie.filter(D=>D.type==="policy_blocked"),kr=Ie.filter(D=>Tk(D)).length,Qn=fk(s,e,o,r),V=yk(s,e,o,r,k,kr),wm=vk(s,e,r),Rm={schema_version:2,generated_at:new Date().toISOString(),filters:Lp(e,r),read_only:!0,home:t.home,database:t.database,initialized:!0,memories:{summary:xk(S),recent:S.filter(D=>D.status!=="candidate").slice(0,r),candidates:S.filter(D=>D.status==="candidate").slice(0,r)},commitments:U,capabilities:Q,schedules:je,heartbeat:{leases:be,runs:pe},audit:{events:Ie,policy_blocks:x},policy:{standing_orders:y,proposals:k,counts:{standing_orders:y.length,proposals:k.length,policy_blocks:x.length,approvals_required:kr}},work:Qn,approvals:V,cost:wm,feedback:await pr({home:t.home,project:e.project,host:e.host,limit:r})};return Np(Rm)}finally{s.close()}}async function gk(e,t,r,o){return{schema_version:2,generated_at:new Date().toISOString(),filters:Lp(r,o),read_only:!0,home:e,database:t,initialized:!1,memories:{summary:Mp(),recent:[],candidates:[]},commitments:[],capabilities:[],schedules:[],heartbeat:{leases:[],runs:[]},audit:{events:[],policy_blocks:[]},policy:{standing_orders:[],proposals:[],counts:{standing_orders:0,proposals:0,policy_blocks:0,approvals_required:0}},work:Op(),approvals:wk(),cost:Rk(),feedback:await pr({home:e,project:r.project,host:r.host,limit:o})}}function fk(e,t,r,o){let n=Ge(e.listWorkItems({project:t.project,assignedHost:t.host,limit:Math.max(o*Si.length,50)}),r,a=>a.updated_at).slice(0,Math.max(o*Si.length,50));if(n.length===0)return Op();let s=[];for(let a of Si){let i=n.filter(l=>l.status===a).slice(0,o).map(l=>hk(e,l));i.length>0&&s.push({status:a,count:i.length,items:i})}return{columns:s}}function hk(e,t){let r=e.listHeartbeatRunsByWorkItem({workItemId:t.id,project:t.project_id,limit:1})[0];return{id:t.id,title:t.title,summary:t.description??t.title,status:t.status,project:t.project_id,host:t.assigned_host,linked_run_id:kk(t.metadata,"run_id")??r?.id??null,priority:t.priority,updated_at:t.updated_at}}function yk(e,t,r,o,n,s){let a=e.listApprovals("pending").approvals.filter(l=>bk(l,t)).filter(l=>Ge([l],r,c=>c.created_at).length>0).slice(0,o).map(_k);if(a.length>0)return{pending:a,counts:{pending:a.length}};let i=n.slice(0,o).map(l=>({id:l.filename,action:l.summary??"Policy proposal pending review",class:"identity_policy_change",target:l.target,project:t.project??null,host:t.host??null,source:"policy_proposal",created_at:null}));return i.length===0&&s>0&&i.push({id:"policy-approval-required",action:"Policy event requires approval",class:"approval_required",target:null,project:t.project??null,host:t.host??null,source:"policy_event",created_at:null}),{pending:i,counts:{pending:i.length}}}function _k(e){return{id:e.id,action:e.action,class:e.class,target:e.target,project:e.project,host:e.host,source:"approvals",created_at:e.created_at}}function bk(e,t){return(!t.project||e.project===t.project)&&(!t.host||e.host===t.host)}function vk(e,t,r){let o=So({db:e,project:t.project,host:t.host,since:t.since,until:t.until,groupBy:"host",limit:r});return{totals:{runs:o.totals.total_runs,reported_runs:o.totals.reported_runs,cost_reported_runs:o.totals.cost_reported_runs,not_reported_runs:o.totals.not_reported_runs,tokens_in:o.totals.tokens_in,tokens_out:o.totals.tokens_out,total_usd:o.totals.total_usd,coverage:o.totals.coverage},by_project:o.by_project.map(Dn),by_host:o.by_host.map(Dn),by_session:o.by_session.map(Dn),by_run:o.by_run.map(Dn)}}function Dn(e){return{key:e.key,label:e.label,runs:e.total_runs,reported_runs:e.reported_runs,cost_reported_runs:e.cost_reported_runs,not_reported_runs:e.not_reported_runs,tokens_in:e.tokens_in,tokens_out:e.tokens_out,total_usd:e.total_usd,coverage:e.coverage}}function kk(e,t){if(!e||typeof e!="object"||Array.isArray(e))return null;let r=e[t];return typeof r=="string"&&r.length>0?r:null}function Op(){return{columns:[]}}function wk(){return{pending:[],counts:{pending:0}}}function Rk(){return{totals:{runs:0,reported_runs:0,cost_reported_runs:0,not_reported_runs:0,tokens_in:0,tokens_out:0,total_usd:0,coverage:0},by_project:[],by_host:[],by_session:[],by_run:[]}}async function Sk(e){let t=Tp.join(e,"proposals"),r;try{r=await uk(t)}catch{return[]}let o=[];for(let n of r.filter(s=>s.endsWith(".md")).sort()){let s=await pk(Tp.join(t,n),"utf8");o.push({filename:n,target:Ak(s,"Target"),summary:Ek(s,"Summary")})}return o}function Ak(e,t){return e.match(new RegExp(`^${t}:\\s*(.+)$`,"mu"))?.[1]?.trim()??null}function Ek(e,t){return e.match(new RegExp(`^## ${t}\\s*$\\n+([\\s\\S]*?)(?:\\n+## |$)`,"mu"))?.[1]?.trim()??null}function Pk(e,t){return e.filter(r=>{let o=!t.project||r.scope_projects.length===0||r.scope_projects.includes(t.project),n=!t.host||r.scope_hosts.length===0||r.scope_hosts.includes(t.host);return o&&n})}function xk(e){let t=Mp();for(let r of e)t[r.status]+=1;return t}function Mp(){return Object.fromEntries(mk.map(e=>[e,0]))}function Ge(e,t,r){return e.filter(o=>{let n=Date.parse(r(o));return!(!Number.isFinite(n)||t.since!==null&&n<t.since||t.until!==null&&n>t.until)})}function jk(e){return{since:Cp(e.since,"since"),until:Cp(e.until,"until")}}function Cp(e,t){if(!e)return null;let r=Date.parse(e);if(!Number.isFinite(r))throw new Error(`dashboard data --${t} must be an ISO date/time`);return r}function Ik(e,t){return ie(e.details,t.key,t.value)}function Tk(e){return ie(e.details,"decision","approval_required")||ie(e.details,"approval_required")||ie(e.details,"action","approval_required")}function Lp(e,t){return{project:e.project??null,host:e.host??null,limit:t,since:e.since??null,until:e.until??null}}function Ck(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e??50),1),200):50}function Np(e){return zt(H(e))}import{mkdir as Nk,writeFile as Ok}from"node:fs/promises";import Ai from"node:path";async function Pi(e={}){let t=await Ao(e),r=Ai.resolve(e.output??Ai.join(f(e.home).home,"generated","dashboard","index.html"));return await Nk(Ai.dirname(r),{recursive:!0,mode:448}),await Ok(r,Dp(t),{encoding:"utf8",mode:384}),{outputPath:r,generated_at:t.generated_at,read_only:!0,data:t}}function Dp(e){let t=Wk(e.capabilities),r=e.audit.policy_blocks.length,o=e.policy.counts.approvals_required,n=Mk(e),s=n?n.work.columns.reduce((a,i)=>a+i.items.length,0):0;return`<!doctype html>
823
892
  <html lang="en">
824
893
  <head>
825
894
  <meta charset="utf-8">
826
895
  <meta name="viewport" content="width=device-width, initial-scale=1">
827
896
  <title>NativeSoul Local Dashboard</title>
828
- <style>${Wv()}</style>
897
+ <style>${Kk()}</style>
829
898
  </head>
830
899
  <body>
831
900
  <main class="shell">
@@ -842,82 +911,109 @@ ${a.content}`)>=.35&&o!==Xd(a.content)){let s=Yd(a.content);if([...r].some(l=>l.
842
911
  </header>
843
912
 
844
913
  <section class="summary-grid" aria-label="dashboard summary">
845
- ${co("Active Memories",e.memories.summary.active,"green","promoted context ready for recall")}
846
- ${co("Candidates",e.memories.summary.candidate,"amber","pending human review")}
847
- ${co("Ready Capabilities",t.ready,"green",`${t.total} capability records`)}
848
- ${co("Open Commitments",e.commitments.filter(a=>a.status==="open").length,"amber",`${e.commitments.length} commitment records`)}
849
- ${co("Policy Blocks",r,r>0?"red":"neutral",`${o} approval markers`)}
914
+ ${mr("Active Memories",e.memories.summary.active,"green","promoted context ready for recall")}
915
+ ${mr("Candidates",e.memories.summary.candidate,"amber","pending human review")}
916
+ ${mr("Ready Capabilities",t.ready,"green",`${t.total} capability records`)}
917
+ ${mr("Open Commitments",e.commitments.filter(a=>a.status==="open").length,"amber",`${e.commitments.length} commitment records`)}
918
+ ${mr("Policy Blocks",r,r>0?"red":"neutral",`${o} approval markers`)}
919
+ ${n&&s>0?mr("Open Work",s,"cyan","board items in scope"):""}
850
920
  </section>
851
921
 
852
922
  <section class="layout">
853
- ${ct("Memory Lifecycle",[Bv(e.memories.summary),$t(e.memories.recent,a=>`
923
+ ${n?Lk(n):""}
924
+ ${n?Dk(n):""}
925
+ ${n?Hk(n):""}
926
+
927
+ ${Pe("Memory Lifecycle",[Vk(e.memories.summary),He(e.memories.recent,a=>`
854
928
  <li>
855
- <div><strong>${j(a.summary)}</strong><small>${j(a.scope.project)} &middot; ${j(a.status)}</small></div>
856
- <span class="chip ${Kv(a.status)}">${j(a.authority)}</span>
857
- </li>`),Ft(e.memories.recent,"No active/recent memories in this scope.")].join(""))}
929
+ <div><strong>${w(a.summary)}</strong><small>${w(a.scope.project)} &middot; ${w(a.status)}</small></div>
930
+ <span class="chip ${Jk(a.status)}">${w(a.authority)}</span>
931
+ </li>`),Jt(e.memories.recent,"No active/recent memories in this scope.")].join(""))}
858
932
 
859
- ${ct("Capability Readiness",[Jv(),$t(e.capabilities,a=>`
933
+ ${Pe("Capability Readiness",[Bk(),He(e.capabilities,a=>`
860
934
  <li>
861
- <div><strong>${j(a.uid)}</strong><small>${j(a.host)} &middot; ${j(a.normalized_kind)} &middot; ${j(a.source)}</small></div>
862
- <span class="chip ${Hs(a)}">${nr(a)}</span>
863
- </li>`),Ft(e.capabilities,"No capability records match these filters.")].join(""))}
935
+ <div><strong>${w(a.uid)}</strong><small>${w(a.host)} &middot; ${w(a.normalized_kind)} &middot; ${w(a.source)}</small></div>
936
+ <span class="chip ${yi(a)}">${dr(a)}</span>
937
+ </li>`),Jt(e.capabilities,"No capability records match these filters.")].join(""))}
864
938
 
865
- ${ct("Commitments",[$t(e.commitments,a=>`
939
+ ${Pe("Commitments",[He(e.commitments,a=>`
866
940
  <li>
867
- <div><strong>${j(a.summary)}</strong><small>${j(a.project_id)} &middot; ${j(a.status)}${a.due_at?` &middot; due ${j(a.due_at)}`:""}</small></div>
868
- <span class="chip ${Gv(a.status)}">${j(a.status)}</span>
869
- </li>`),Ft(e.commitments,"No commitments match these filters.")].join(""))}
941
+ <div><strong>${w(a.summary)}</strong><small>${w(a.project_id)} &middot; ${w(a.status)}${a.due_at?` &middot; due ${w(a.due_at)}`:""}</small></div>
942
+ <span class="chip ${qk(a.status)}">${w(a.status)}</span>
943
+ </li>`),Jt(e.commitments,"No commitments match these filters.")].join(""))}
870
944
 
871
- ${ct("Heartbeat And Runs",[Bs([["Leases",e.heartbeat.leases.length],["Runs",e.heartbeat.runs.length],["Schedules",e.schedules.length]]),$t(e.heartbeat.runs,a=>`
945
+ ${Pe("Heartbeat And Runs",[Hn([["Leases",e.heartbeat.leases.length],["Runs",e.heartbeat.runs.length],["Schedules",e.schedules.length]]),He(e.heartbeat.runs,a=>`
872
946
  <li>
873
- <div><strong>${j(a.id)}</strong><small>${j(a.host)} &middot; ${j(a.project_id)} &middot; ${j(a.completed_at)}</small></div>
874
- <span class="chip green">${j(a.status)}</span>
875
- </li>`),Ft(e.heartbeat.runs,"No heartbeat runs in this scope.")].join(""))}
947
+ <div><strong>${w(a.id)}</strong><small>${w(a.host)} &middot; ${w(a.project_id)} &middot; ${w(a.completed_at)}</small></div>
948
+ <span class="chip green">${w(a.status)}</span>
949
+ </li>`),Jt(e.heartbeat.runs,"No heartbeat runs in this scope.")].join(""))}
876
950
 
877
- ${ct("Schedules",[$t(e.schedules,a=>`
951
+ ${Pe("Schedules",[He(e.schedules,a=>`
878
952
  <li>
879
- <div><strong>${j(a.id)}</strong><small>${j(a.host)} &middot; ${j(a.mode)} &middot; native: ${a.native_schedule_supported?"yes":"fallback"}</small></div>
953
+ <div><strong>${w(a.id)}</strong><small>${w(a.host)} &middot; ${w(a.mode)} &middot; native: ${a.native_schedule_supported?"yes":"fallback"}</small></div>
880
954
  <span class="chip ${a.enabled?"green":"neutral"}">${a.enabled?"enabled":"disabled"}</span>
881
- </li>`),Ft(e.schedules,"No schedules match these filters.")].join(""))}
955
+ </li>`),Jt(e.schedules,"No schedules match these filters.")].join(""))}
882
956
 
883
- ${ct("Audit Trail",[$t(e.audit.events,a=>`
957
+ ${Pe("Audit Trail",[He(e.audit.events,a=>`
884
958
  <li>
885
- <div><strong>${j(a.type)}</strong><small>${j(a.created_at)} &middot; ${j(a.result)}</small></div>
886
- <span class="chip ${a.result==="blocked"?"red":"neutral"}">${j(a.actor)}</span>
887
- </li>`),Ft(e.audit.events,"No audit events in this scope.")].join(""))}
959
+ <div><strong>${w(a.type)}</strong><small>${w(a.created_at)} &middot; ${w(a.result)}</small></div>
960
+ <span class="chip ${a.result==="blocked"?"red":"neutral"}">${w(a.actor)}</span>
961
+ </li>`),Jt(e.audit.events,"No audit events in this scope.")].join(""))}
888
962
 
889
- ${ct("Approvals And Proposals",[Bs([["Standing Orders",e.policy.counts.standing_orders],["Proposals",e.policy.counts.proposals],["Approvals",e.policy.counts.approvals_required]]),$t(e.policy.proposals,a=>`
963
+ ${Pe("Approvals And Proposals",[Hn([["Standing Orders",e.policy.counts.standing_orders],["Proposals",e.policy.counts.proposals],["Approvals",e.policy.counts.approvals_required]]),He(e.policy.proposals,a=>`
890
964
  <li>
891
- <div><strong>${j(a.target??a.filename)}</strong><small>${j(a.summary??"No summary supplied.")}</small></div>
965
+ <div><strong>${w(a.target??a.filename)}</strong><small>${w(a.summary??"No summary supplied.")}</small></div>
892
966
  <span class="chip amber">proposal</span>
893
- </li>`),Ft(e.policy.proposals,"No pending policy proposals.")].join(""))}
967
+ </li>`),Jt(e.policy.proposals,"No pending policy proposals.")].join(""))}
894
968
 
895
- ${ct("M7 Feedback",[Bs([["Bootstrap",e.feedback.metrics.bootstrap.succeeded+e.feedback.metrics.bootstrap.degraded],["Recall",e.feedback.metrics.recall.recalled],["Heartbeat",e.feedback.metrics.heartbeat.completed_runs]]),`<ul class="records">
896
- <li><div><strong>Recurring use</strong><small>${j(e.feedback.m7_gate.notes[0]??"No recurring use note.")}</small></div><span class="chip ${e.feedback.m7_gate.recurring_use_validated?"green":"amber"}">${e.feedback.m7_gate.recurring_use_validated?"validated":"pending"}</span></li>
969
+ ${Pe("M7 Feedback",[Hn([["Bootstrap",e.feedback.metrics.bootstrap.succeeded+e.feedback.metrics.bootstrap.degraded],["Recall",e.feedback.metrics.recall.recalled],["Heartbeat",e.feedback.metrics.heartbeat.completed_runs]]),`<ul class="records">
970
+ <li><div><strong>Recurring use</strong><small>${w(e.feedback.m7_gate.notes[0]??"No recurring use note.")}</small></div><span class="chip ${e.feedback.m7_gate.recurring_use_validated?"green":"amber"}">${e.feedback.m7_gate.recurring_use_validated?"validated":"pending"}</span></li>
897
971
  <li><div><strong>Privacy</strong><small>External telemetry disabled: ${e.feedback.external_telemetry_enabled?"no":"yes"}</small></div><span class="chip ${e.feedback.m7_gate.privacy_validated?"green":"red"}">${e.feedback.m7_gate.privacy_validated?"validated":"check"}</span></li>
898
972
  </ul>`].join(""))}
899
973
  </section>
900
974
 
901
975
  <footer>
902
- <span>Generated ${j(e.generated_at)}</span>
976
+ <span>Generated ${w(e.generated_at)}</span>
903
977
  <span>Read-only &middot; local-only &middot; no cloud sync</span>
904
978
  </footer>
905
979
  </main>
906
- <script type="application/json" id="nativesoul-dashboard-data">${j(JSON.stringify(e))}</script>
980
+ <script type="application/json" id="nativesoul-dashboard-data">${w(JSON.stringify(e))}</script>
907
981
  </body>
908
- </html>`}function co(e,t,r,o){return`<article class="metric ${r}">
909
- <span>${j(e)}</span>
982
+ </html>`}function mr(e,t,r,o){return`<article class="metric ${r}">
983
+ <span>${w(e)}</span>
910
984
  <strong>${t}</strong>
911
- <small>${j(o)}</small>
912
- </article>`}function ct(e,t){return`<section class="panel">
913
- <div class="panel-head"><p class="eyebrow"><span>&rsaquo;</span> ${j(e)}</p></div>
985
+ <small>${w(o)}</small>
986
+ </article>`}function Mk(e){return e.schema_version>=2&&"work"in e&&"approvals"in e&&"cost"in e?e:null}function Lk(e){if(e.work.columns.length===0)return"";let t=`<div class="board-grid">${e.work.columns.map(r=>`
987
+ <section class="board-column">
988
+ <div class="board-column-head">
989
+ <strong>${w(Fk(r.status))}</strong>
990
+ <span class="chip neutral">${r.count}</span>
991
+ </div>
992
+ ${He(r.items,o=>`
993
+ <li>
994
+ <div><strong>${w(o.title)}</strong><small>${w(o.project)}${o.host?` &middot; ${w(o.host)}`:""}${o.linked_run_id?` &middot; run ${w(o.linked_run_id)}`:""}</small></div>
995
+ <span class="chip ${Uk(o.status)}">${w(o.priority)}</span>
996
+ </li>`)}
997
+ </section>`).join("")}</div>`;return Pe("Work Board",t)}function Dk(e){return e.approvals.pending.length===0?"":Pe("Pending Approvals",[He(e.approvals.pending,t=>`
998
+ <li>
999
+ <div><strong>${w(t.action)}</strong><small>${w(t.class)}${t.project?` &middot; ${w(t.project)}`:""}${t.host?` &middot; ${w(t.host)}`:""}${t.target?` &middot; ${w(t.target)}`:""}</small></div>
1000
+ <span class="chip amber">${w(t.source)}</span>
1001
+ </li>`),'<p class="helper">approve via: nativesoul approvals approve &lt;id&gt; --confirm</p>'].join(""))}function Hk(e){if(e.cost.totals.cost_reported_runs===0)return"";let t=[Hn([["Reported",e.cost.totals.reported_runs],["Not reported",e.cost.totals.not_reported_runs],["Coverage %",Math.round(e.cost.totals.coverage*100)]]),`<div class="cost-total"><span>Total reported</span><strong>${w(Hp(e.cost.totals.total_usd))}</strong></div>`,Ei("By Host",e.cost.by_host),Ei("By Session",e.cost.by_session),Ei("By Run",e.cost.by_run)].filter(Boolean);return Pe("Cost",t.join(""))}function Ei(e,t){let r=t.filter(o=>o.reported_runs>0||o.not_reported_runs>0);return r.length===0?"":`<div class="cost-group">
1002
+ <h2>${w(e)}</h2>
1003
+ ${He(r,o=>`
1004
+ <li>
1005
+ <div><strong>${w(o.label)}</strong><small>${w($k(o))}${o.not_reported_runs>0?" &middot; not reported by host":""}</small></div>
1006
+ <span class="chip ${o.cost_reported_runs>0?"green":"neutral"}">${w(o.cost_reported_runs>0?Hp(o.total_usd):"not reported")}</span>
1007
+ </li>`)}
1008
+ </div>`}function Hp(e){return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:4}).format(e)}function $k(e){return`${e.reported_runs}/${e.runs} reported (${Math.round(e.coverage*100)}%)`}function Fk(e){return e.replaceAll("_"," ").replace(/\b\w/g,t=>t.toUpperCase())}function Uk(e){return e==="done"?"green":e==="blocked"||e==="failed"?"red":e==="in_progress"||e==="review"?"cyan":"amber"}function Pe(e,t){return`<section class="panel">
1009
+ <div class="panel-head"><p class="eyebrow"><span>&rsaquo;</span> ${w(e)}</p></div>
914
1010
  ${t}
915
- </section>`}function $t(e,t){return e.length===0?"":`<ul class="records">${e.map(t).join("")}</ul>`}function Ft(e,t){return e.length===0?`<p class="empty">${j(t)}</p>`:""}function Bs(e){return`<div class="split-stats">${e.map(([t,r])=>`<div><strong>${r}</strong><span>${j(t)}</span></div>`).join("")}</div>`}function Bv(e){let t=Object.values(e).reduce((o,a)=>o+a,0);return`<div class="lifecycle" aria-label="memory lifecycle">${[["active","green"],["candidate","amber"],["rejected","red"],["expired","neutral"],["forgotten","neutral"],["superseded","neutral"]].map(([o,a])=>{let n=e[o],s=t===0?0:Math.max(6,Math.round(n/t*100));return`<span class="${a}" style="width:${s}%" title="${o}: ${n}"></span>`}).join("")}</div>`}function Jv(){return`<div class="legend">
1011
+ </section>`}function He(e,t){return e.length===0?"":`<ul class="records">${e.map(t).join("")}</ul>`}function Jt(e,t){return e.length===0?`<p class="empty">${w(t)}</p>`:""}function Hn(e){return`<div class="split-stats">${e.map(([t,r])=>`<div><strong>${r}</strong><span>${w(t)}</span></div>`).join("")}</div>`}function Vk(e){let t=Object.values(e).reduce((o,n)=>o+n,0);return`<div class="lifecycle" aria-label="memory lifecycle">${[["active","green"],["candidate","amber"],["rejected","red"],["expired","neutral"],["forgotten","neutral"],["superseded","neutral"]].map(([o,n])=>{let s=e[o],a=t===0?0:Math.max(6,Math.round(s/t*100));return`<span class="${n}" style="width:${a}%" title="${o}: ${s}"></span>`}).join("")}</div>`}function Bk(){return`<div class="legend">
916
1012
  <span><i class="green"></i>ready</span>
917
1013
  <span><i class="cyan"></i>full native capability</span>
918
1014
  <span><i class="amber"></i>official-fallback</span>
919
1015
  <span><i class="red"></i>degraded</span>
920
- </div>`}function qv(e){return{total:e.length,ready:e.filter(t=>t.ready).length}}function Kv(e){return e==="active"?"green":e==="candidate"?"amber":e==="rejected"||e==="forgotten"?"red":"neutral"}function Gv(e){return e==="open"?"amber":e==="completed"?"green":"neutral"}function j(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function Wv(){return`
1016
+ </div>`}function Wk(e){return{total:e.length,ready:e.filter(t=>t.ready).length}}function Jk(e){return e==="active"?"green":e==="candidate"?"amber":e==="rejected"||e==="forgotten"?"red":"neutral"}function qk(e){return e==="open"?"amber":e==="completed"?"green":"neutral"}function w(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function Kk(){return`
921
1017
  :root {
922
1018
  --red-400:#ff6b6b; --red-500:#ff4444; --red-600:#f02d3a; --red-glow:rgba(255,68,68,.45); --red-glow-soft:rgba(255,68,68,.16);
923
1019
  --ink-950:#06070d; --ink-900:#0a0c14; --ink-850:#0e1019; --ink-800:#12151f; --ink-700:#1c202d; --ink-600:#262b3a;
@@ -933,44 +1029,46 @@ body:before{content:"";position:fixed;inset:0;pointer-events:none;background-ima
933
1029
  .eyebrow{margin:0 0 10px;font:700 11px/1 var(--font-mono);letter-spacing:.16em;text-transform:uppercase;color:var(--text-400)}.eyebrow span{color:var(--red-500);text-shadow:0 0 22px rgba(255,68,68,.55)}
934
1030
  h1{margin:0;color:var(--text-100);font:700 44px/1.05 var(--font-display);letter-spacing:0}.lede{max-width:680px;margin:12px 0 0;color:var(--text-400)}
935
1031
  .terminal{background:#0b0d15;border:1px solid var(--ink-700);border-radius:var(--radius-md);overflow:hidden;box-shadow:var(--shadow-md);font-family:var(--font-mono)}.traffic{display:flex;align-items:center;gap:6px;padding:10px 14px;border-bottom:1px solid rgba(255,255,255,.06)}.traffic i{width:10px;height:10px;border-radius:50%;background:#ff5f57}.traffic i:nth-child(2){background:#febc2e}.traffic i:nth-child(3){background:#28c840}.traffic span{margin-left:6px;color:var(--text-500);font-size:12px}.terminal code{display:block;padding:14px 16px;color:var(--text-100);font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
936
- .summary-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:14px;margin-bottom:14px}.metric,.panel{background:var(--ink-850);border:1px solid var(--ink-700);border-radius:var(--radius-lg);box-shadow:var(--shadow-md)}.metric{padding:18px}.metric.red{border-color:rgba(255,68,68,.40);box-shadow:var(--glow-sm)}.metric span,.metric small{display:block;color:var(--text-400);font:600 11px/1.3 var(--font-mono);letter-spacing:.04em;text-transform:uppercase}.metric strong{display:block;margin:10px 0;color:var(--text-100);font:700 32px/1 var(--font-display)}.metric.green strong{color:var(--green-400)}.metric.amber strong{color:var(--amber-400)}.metric.red strong{color:var(--red-400)}
1032
+ .summary-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:14px;margin-bottom:14px}.metric,.panel{background:var(--ink-850);border:1px solid var(--ink-700);border-radius:var(--radius-lg);box-shadow:var(--shadow-md)}.metric{padding:18px}.metric.red{border-color:rgba(255,68,68,.40);box-shadow:var(--glow-sm)}.metric span,.metric small{display:block;color:var(--text-400);font:600 11px/1.3 var(--font-mono);letter-spacing:.04em;text-transform:uppercase}.metric strong{display:block;margin:10px 0;color:var(--text-100);font:700 32px/1 var(--font-display)}.metric.green strong{color:var(--green-400)}.metric.cyan strong{color:var(--cyan-400)}.metric.amber strong{color:var(--amber-400)}.metric.red strong{color:var(--red-400)}
937
1033
  .layout{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.panel{padding:18px;min-width:0}.panel-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
938
1034
  .records{list-style:none;margin:0;padding:0;display:grid;gap:8px}.records li{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px;border:1px solid rgba(255,255,255,.06);border-radius:10px;background:rgba(0,0,0,.18);min-width:0}.records strong{display:block;color:var(--text-100);font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.records small{display:block;color:var(--text-500);font:500 11px/1.4 var(--font-mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:460px}
939
1035
  .chip{flex:0 0 auto;border:1px solid var(--ink-600);border-radius:999px;padding:5px 8px;background:rgba(0,0,0,.25);color:var(--text-400);font:700 10px/1 var(--font-mono);letter-spacing:.04em;text-transform:uppercase}.chip.green{color:var(--green-400);border-color:rgba(62,207,142,.35)}.chip.cyan{color:var(--cyan-400);border-color:rgba(86,199,214,.35)}.chip.amber{color:var(--amber-400);border-color:rgba(245,165,36,.35)}.chip.red{color:var(--red-400);border-color:rgba(255,68,68,.35)}
940
1036
  .legend{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:12px}.legend span{display:inline-flex;align-items:center;gap:6px;color:var(--text-400);font:700 10px/1 var(--font-mono);text-transform:uppercase}.legend i{width:8px;height:8px;border-radius:50%;background:var(--text-500)}.legend .green{background:var(--green-400)}.legend .cyan{background:var(--cyan-400)}.legend .amber{background:var(--amber-400)}.legend .red{background:var(--red-400)}
941
1037
  .lifecycle{display:flex;height:10px;overflow:hidden;border-radius:999px;background:#0b0d15;border:1px solid rgba(255,255,255,.06);margin-bottom:12px}.lifecycle span{min-width:0}.green{background:var(--green-400)}.amber{background:var(--amber-400)}.red{background:var(--red-500)}.neutral{background:var(--ink-600)}
942
1038
  .split-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:12px}.split-stats div{padding:12px;border:1px solid rgba(255,255,255,.06);border-radius:10px;background:rgba(0,0,0,.18)}.split-stats strong{display:block;color:var(--text-100);font:700 22px/1 var(--font-display)}.split-stats span{display:block;margin-top:6px;color:var(--text-500);font:700 10px/1 var(--font-mono);text-transform:uppercase}
1039
+ .board-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px}.board-column{border:1px solid rgba(255,255,255,.06);border-radius:10px;background:rgba(0,0,0,.15);padding:10px;min-width:0}.board-column-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.board-column-head strong{color:var(--text-100);font:700 13px/1 var(--font-mono);text-transform:uppercase}.helper{margin:12px 0 0;color:var(--text-500);font:600 11px/1.45 var(--font-mono);border:1px dashed var(--ink-600);border-radius:10px;padding:10px}.cost-total{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:12px;padding:14px;border:1px solid rgba(62,207,142,.25);border-radius:10px;background:rgba(62,207,142,.08)}.cost-total span{color:var(--text-400);font:700 10px/1 var(--font-mono);text-transform:uppercase}.cost-total strong{color:var(--green-400);font:700 24px/1 var(--font-display)}.cost-group{display:grid;gap:8px;margin-top:10px}.cost-group h2{margin:0;color:var(--text-400);font:700 11px/1 var(--font-mono);text-transform:uppercase}
943
1040
  .empty{margin:0;color:var(--text-500);font:500 13px/1.5 var(--font-mono);border:1px dashed var(--ink-600);border-radius:10px;padding:14px}footer{display:flex;justify-content:space-between;gap:16px;margin-top:18px;padding-top:18px;border-top:1px solid rgba(255,255,255,.06);color:var(--text-500);font:600 11px/1.4 var(--font-mono);text-transform:uppercase}
944
1041
  @media (max-width: 900px){.topbar,.layout{grid-template-columns:1fr}.summary-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.terminal code{white-space:normal}.records small{max-width:260px}}
945
1042
  @media (max-width: 560px){.summary-grid{grid-template-columns:1fr}.shell{padding:22px 12px}h1{font-size:34px}.records li{align-items:flex-start;flex-direction:column}.records small{max-width:100%}footer{flex-direction:column}.split-stats{grid-template-columns:1fr}}
946
- `}import{readFile as zv}from"node:fs/promises";import Xv from"node:path";var _a=1500;async function uo(e){let t=await b(e.home),r=await Qv(t.home),o=new Date,a=Yv(e.ttlSeconds??r.ttlSeconds),n=new Date(o.getTime()+a*1e3).toISOString(),s=Gs(e.project,e.slot),i=v(t.database),l;try{l=i.claimHeartbeatLease({id:O("lease"),slot:e.slot,holder:e.host,idempotencyKey:s,now:o.toISOString(),expiresAt:n})}finally{i.close()}return await f({home:t.home,type:l.claimed?"heartbeat_claimed":"heartbeat_skipped",details:{slot:e.slot,host:e.host,project:e.project,lease_id:l.lease.id,reason:l.reason}}),{slot:e.slot,host:e.host,project:e.project,claimed:l.claimed,reason:l.reason,silent_ack:l.claimed||l.reason==="LEASE_OCCUPIED"&&!r.skipWhenBusy?null:"HEARTBEAT_OK",lease:l.lease}}async function po(e){let t=await b(e.home),r=new Date().toISOString(),o=Gs(e.project,e.slot),a=W(e.result??"HEARTBEAT_OK"),n=W(e.evidence??{}),s=v(t.database),i;try{i=s.completeHeartbeatLease({idempotencyKey:o,host:e.host,project:e.project,result:a,evidence:n,completedAt:r,runId:O("run")})}finally{s.close()}return await f({home:t.home,type:i.completed?"heartbeat_completed":"heartbeat_completion_replayed",details:{slot:e.slot,host:e.host,project:e.project,lease_id:i.lease.id,run_id:i.run?.id??null}}),{slot:e.slot,project:e.project,completed:i.completed,silent_ack:"HEARTBEAT_OK",lease:i.lease,run:i.run}}async function Ks(e){let t=await b(e.home),r=v(t.database);try{return r.listHeartbeatLeases({project:e.project,limit:Math.min(Math.max(e.limit??20,1),100)})}finally{r.close()}}function Gs(e,t){return`heartbeat:${e}:${t}`}function Yv(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e),1),1440*60):_a}async function Qv(e){let t;try{t=await zv(Xv.join(e,"config.yaml"),"utf8")}catch{return{ttlSeconds:_a,skipWhenBusy:!0}}return{ttlSeconds:Zv(t),skipWhenBusy:eb(t,"skip_when_busy",!0)}}function Zv(e){let t=qs(e,"ttl_seconds"),r=qs(e,"lease_ttl"),o=tb(e,"heartbeat_ttl_seconds"),a=rb(t??r??o);return Number.isFinite(a)?a:_a}function eb(e,t,r){let o=qs(e,t);return o?/^(true|yes|1)$/i.test(o)?!0:/^(false|no|0)$/i.test(o)?!1:r:r}function qs(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`^\\s*heartbeat:\\s*$[\\s\\S]*?^\\s{2}${r}:\\s*([^#\\n]+)`,"mu"))?.[1]?.trim().replace(/^["']|["']$/g,"")??null}function tb(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`^\\s*${r}:\\s*([^#\\n]+)`,"mu"))?.[1]?.trim().replace(/^["']|["']$/g,"")??null}function rb(e){if(!e)return _a;let t=e.match(/^(\d+)$/);if(t)return Number(t[1]);let r=e.match(/^(\d+)\s*([smh])$/i);if(!r)return Number.NaN;let o=Number(r[1]),a=r[2]?.toLowerCase();return a==="s"?o:a==="m"?o*60:o*60*60}async function Ws(e){let t=await b(e.home);v(t.database).close();let o=De(e.host),a=(await Promise.all(o.map(s=>wr(s)))).flat(),n=[];for(let s of o){let i=Fe(s,e.surface);for(let l of i){let c=a.find(le=>le.host===s),d=Zt(s,e.targetRoot,l),p=d.managedBlock?await Sr({home:t.home,host:s,apply:e.apply,targetPath:d.managedBlock}):ob(s,l,!e.apply),h=await Xr({home:t.home,host:s,apply:e.apply,targetPath:d.mcpRegistration,commandMode:"package"}),y=await ls({home:t.home,host:s,surface:l,apply:e.apply,targetPath:d.plugin}),w=await nt({home:t.home,host:s,surface:l,mode:"leader",apply:e.apply,pluginEnabled:y.enabled,hostConfigRoot:Be(s,e.targetRoot),targetRoot:e.targetRoot}),R=e.apply?await yt({home:t.home,host:s}):[],H=e.apply?R.reduce((le,Ae)=>le+Ae.count,0):c?.sources.length??0,fe=[...w.warnings,...y.issues.map(le=>le.code),...c?.detected?[]:[`${s.toUpperCase()}_NOT_DETECTED`]],Se=[p.backupPath,h.backupPath,y.backupPath].filter(le=>le!==null),Ge=fe.length===0&&H>0?"ready":"degraded";n.push({host:s,surface:l,detected:c?.detected??!1,status:Ge,managed_block:p,mcp_registration:h,plugin:y,schedule:w,capability_count:H,snapshots:Se,warnings:fe})}}return{dryRun:!e.apply,applied:e.apply,home:t.home,hosts:n,status:n.every(s=>s.status==="ready")?"ready":"degraded"}}function ob(e,t,r){let o=S("");return{host:e,targetPath:`not-applicable:${xt(e,t)}`,action:"noop",dryRun:r,changed:!1,beforeHash:null,afterHash:o,diff:"No managed instruction block for this host surface.",backupPath:null,applied:!1}}import ab from"node:path";import{rm as xu}from"node:fs/promises";var zs="DELETE_NATIVESOUL_HOME";async function Xs(e){if(e.purgeData===!0&&e.confirmPurge!==zs)throw new Error(`--purge-data requires --confirm-purge-nativesoul-data ${zs}`);let t=await b(e.home);v(t.database).close();let o=De(e.host);if(e.apply)for(let l of o)for(let c of Fe(l,e.surface))await ju({home:t.home,host:l,surface:c,apply:!1,targetRoot:e.targetRoot});let a=[];for(let l of o)for(let c of Fe(l,e.surface))a.push(await ju({home:t.home,host:l,surface:c,apply:e.apply,targetRoot:e.targetRoot}));let n={requested:e.purgeData===!0,confirmed:e.confirmPurge===zs,applied:e.apply&&e.purgeData===!0,preserved:!(e.apply&&e.purgeData===!0)},s=ab.join(t.home,"backups"),i={path:s,applied:e.apply,preserved:!e.apply};return i.applied&&await xu(s,{recursive:!0,force:!0}),n.applied&&await xu(t.home,{recursive:!0,force:!0}),{dryRun:!e.apply,applied:e.apply,home:t.home,hosts:a,backups_purge:i,data_purge:n,status:a.every(l=>l.status==="ready")?"ready":"degraded"}}async function ju(e){let t=Zt(e.host,e.targetRoot,e.surface),r=t.managedBlock?await vn({home:e.home,host:e.host,apply:e.apply,targetPath:t.managedBlock}):nb(e.host,e.surface,!e.apply),o=await us({home:e.home,host:e.host,apply:e.apply,targetPath:t.mcpRegistration}),a=await cs({home:e.home,host:e.host,surface:e.surface,apply:e.apply,targetPath:t.plugin}),n=[r.backupPath,o.backupPath,a.backupPath].filter(s=>s!==null);return{host:e.host,surface:e.surface,status:"ready",managed_block:r,mcp_registration:o,plugin:a,snapshots:n,warnings:["SCHEDULE_TEARDOWN_NOT_PERFORMED"]}}function nb(e,t,r){let o=S("");return{host:e,targetPath:`not-applicable:${xt(e,t)}`,action:"noop",dryRun:r,changed:!1,beforeHash:null,afterHash:o,diff:"No managed instruction block for this host surface.",backupPath:null,applied:!1}}async function Qs(e){let t=g(e.home),r=v(t.database),o;try{let a=r.findPendingApprovalMatch(Ys(e));if(!a.available)return{approval:null,created:!1,available:!1,warning:a.warning};if(a.approval)return{approval:a.approval,created:!1,available:!0,warning:null};let n=r.createApproval({id:O("approval"),...Ys(e)});o={approval:n.approval,created:!!n.approval,available:n.available,warning:n.warning}}finally{r.close()}return o.created&&o.approval&&await f({home:t.home,type:"approval_requested",details:ei(o.approval)}),o}async function lr(e){let t=g(e.home),r=v(t.database),o;try{let a=r.decideApproval(e.id,{status:e.status,reviewer:e.reviewer??"local-operator",reason:e.reason??null});o={approval:a.approval,available:a.available,warning:a.warning}}catch(a){throw a instanceof Ee,a}finally{r.close()}return o.approval&&await f({home:t.home,type:o.approval.status==="approved"?"approval_approved":"approval_rejected",details:ei(o.approval)}),o}async function Zs(e){let t=g(e.home),r=v(t.database),o;try{let a=r.createDecidedApproval({id:O("approval"),...Ys(e),status:"approved",reviewer:`standing-order:${e.standingOrderId}`,reason:e.reason});o={approval:a.approval,available:a.available,warning:a.warning,created:!!a.approval}}finally{r.close()}return o.approval&&await f({home:t.home,type:"approval_auto_approved",details:{...ei(o.approval),standing_order:e.standingOrderId}}),o}function va(e){let t=v(g(e.home).database);try{let r=t.getApproval(e.id);return{approval:r.approval,available:r.available,warning:r.warning}}finally{t.close()}}function ba(e={}){let t=v(g(e.home).database);try{return t.listApprovals(e.status)}finally{t.close()}}function Ys(e){return{action:e.action,class:e.class,target:e.target??null,project:e.project??null,host:e.host??null}}function ei(e){return{id:e.id,action:e.action,class:e.class,target:e.target,project:e.project,host:e.host,status:e.status,reviewer:e.reviewer,reason:e.reason}}async function ti(e){let t=await lt(e),r=await sb(e,t);if(r){let a=await Zs({home:e.home,action:t.action,class:t.class,target:t.target,project:e.project??null,host:e.host??null,standingOrderId:r.id,reason:`standing-order allowed:${t.action}`});return{evaluation:t,approval:a.approval,approval_created:a.created,approval_available:a.available,warning:a.warning}}if(t.decision!=="approval_required")return{evaluation:t,approval:null,approval_created:!1,approval_available:!0,warning:null};let o=await Qs({home:e.home,action:t.action,class:t.class,target:t.target,project:e.project??null,host:e.host??null});return{evaluation:t,approval:o.approval,approval_created:o.created,approval_available:o.available,warning:o.warning}}async function sb(e,t){return t.decision!=="allowed"||!t.matched_standing_order||!ib(e.className)?null:(await it(e.home)).find(o=>o.id===t.matched_standing_order&&o.allowed.includes(e.action)&&Us(o,e))??null}function ib(e){return e==="write_project"||e==="external_write"}import{existsSync as ii}from"node:fs";import{mkdir as Lu,readFile as Ra,rm as xb,writeFile as Hu}from"node:fs/promises";import ge from"node:path";import{existsSync as kb}from"node:fs";import{readdir as Sb,readFile as ri}from"node:fs/promises";import dt from"node:path";import{fileURLToPath as Ab}from"node:url";import Tu from"node:path";var lb=new Set(["id","version","title","description","intended_use","approvals","standing_orders","policy_proposals","managed_blocks","rollback","metadata"]),cb=new Set(["id","action","authority","allowed","approval_required","scope_projects","scope_hosts","reason"]),db=new Set(["target","summary","rationale","rollback_note"]),ub=new Set(["target","marker","content","rollback_key"]),pb=new Set(["strategy","restores","notes"]),mb=new Set(["maturity","owner","source"]),gb=new Set(["SOUL.MD","POLICY.MD"]),Cu=["AGENTS.md","CLAUDE.md","GEMINI.md","Agents.md",".claude/CLAUDE.md"],fb=new Set(Cu);function dr(e){let t=[];return Je(e)?(ur(e,lb,"pack",t),Q(e,"id","pack",t,/^[a-z0-9][a-z0-9-]{2,63}$/u),Q(e,"version","pack",t,/^[0-9]+\.[0-9]+\.[0-9]+$/u),Q(e,"title","pack",t),Q(e,"description","pack",t),Q(e,"intended_use","pack",t),cr(e.approvals,"pack.approvals",t,!1),hb(e.standing_orders,t),yb(e.policy_proposals,t),_b(e.managed_blocks,t),vb(e.rollback,t),bb(e.metadata,t),Rb(e,t),t):["Policy pack must be an object"]}function Je(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Iu(e){return typeof e=="string"?e:null}function hb(e,t){if(!Array.isArray(e)){t.push("pack.standing_orders must be an array");return}for(let[r,o]of e.entries()){let a=`pack.standing_orders[${r}]`;if(!Je(o)){t.push(`${a} must be an object`);continue}ur(o,cb,a,t),Q(o,"id",a,t,/^[a-z0-9][a-z0-9-]{2,63}$/u),wa(o,"action",a,["add","propose"],t),wa(o,"authority",a,["operator-approved","proposal"],t),cr(o.allowed,`${a}.allowed`,t,!0),cr(o.approval_required,`${a}.approval_required`,t,!0),cr(o.scope_projects,`${a}.scope_projects`,t,!0),cr(o.scope_hosts,`${a}.scope_hosts`,t,!0),Q(o,"reason",a,t);let n=Array.isArray(o.allowed)?o.allowed:[],s=Array.isArray(o.approval_required)?o.approval_required:[];n.length===0&&s.length===0&&t.push(`${a} must declare at least one allowed or approval_required action`)}}function yb(e,t){if(!Array.isArray(e)){t.push("pack.policy_proposals must be an array");return}for(let[r,o]of e.entries()){let a=`pack.policy_proposals[${r}]`;if(!Je(o)){t.push(`${a} must be an object`);continue}ur(o,db,a,t),wa(o,"target",a,["SOUL.md","POLICY.md"],t),Q(o,"summary",a,t),Q(o,"rationale",a,t),Q(o,"rollback_note",a,t)}}function _b(e,t){if(!Array.isArray(e)){t.push("pack.managed_blocks must be an array");return}for(let[r,o]of e.entries()){let a=`pack.managed_blocks[${r}]`;if(!Je(o)){t.push(`${a} must be an object`);continue}ur(o,ub,a,t),Q(o,"target",a,t),Q(o,"marker",a,t),Q(o,"content",a,t),Q(o,"rollback_key",a,t),typeof o.target=="string"&&wb(o.target,a,t)}}function vb(e,t){if(!Je(e)){t.push("pack.rollback must be an object");return}ur(e,pb,"pack.rollback",t),wa(e,"strategy","pack.rollback",["proposal-only","managed-block","snapshot-required"],t),cr(e.restores,"pack.rollback.restores",t,!0),Array.isArray(e.restores)&&e.restores.length===0&&t.push("pack.rollback.restores must include at least one rollback item"),Q(e,"notes","pack.rollback",t)}function bb(e,t){if(e!==void 0){if(!Je(e)){t.push("pack.metadata must be an object");return}ur(e,mb,"pack.metadata",t);for(let[r,o]of Object.entries(e))o!==null&&typeof o!="string"&&typeof o!="number"&&typeof o!="boolean"&&t.push(`pack.metadata.${r} must be a scalar value`)}}function wb(e,t,r){let o=e.replaceAll("\\","/"),a=Tu.basename(o).toUpperCase();(Tu.isAbsolute(e)||o.includes("../")||o.startsWith("../"))&&r.push(`${t}.target must be a relative managed host file path`),gb.has(a)&&r.push(`${t}.target must not target protected SOUL.md or POLICY.md`),fb.has(o)||r.push(`${t}.target is outside supported managed-block scope`)}function Rb(e,t){let r=JSON.stringify(e);/(sk-[A-Za-z0-9_-]{8,}|api[_-]?key\s*[:=]|secret\s*[:=]|token\s*[:=]|password\s*[:=])/iu.test(r)&&t.push("pack must not contain credential-like material"),/https?:\/\//iu.test(r)&&t.push("pack must not require trust in external URLs")}function ur(e,t,r,o){for(let a of Object.keys(e))t.has(a)||o.push(`${r}.${a} is not allowed`)}function Q(e,t,r,o,a){let n=e[t];if(typeof n!="string"||n.trim()===""){o.push(`${r}.${t} must be a non-empty string`);return}a&&!a.test(n)&&o.push(`${r}.${t} has invalid format`)}function wa(e,t,r,o,a){let n=e[t];(typeof n!="string"||!o.includes(n))&&a.push(`${r}.${t} must be one of ${o.join(", ")}`)}function cr(e,t,r,o){e===void 0&&!o||(!Array.isArray(e)||!e.every(a=>typeof a=="string"))&&r.push(`${t} must be an array of strings`)}async function oi(){return(await Nu()).map(({pack:t,source:r})=>({id:t.id,version:t.version,title:t.title,description:t.description,intended_use:t.intended_use,source:r})).sort((t,r)=>t.id.localeCompare(r.id))}async function mo(e){let r=(await Nu()).find(o=>o.pack.id===e);if(!r)throw new Error(`Policy pack not found: ${e}`);return{...r.pack,source:r.source}}async function ai(e){try{let{value:t,source:r}=e.file?{value:JSON.parse(await ri(e.file,"utf8")),source:dt.resolve(e.file)}:await Pb(e.id),o=dr(t),a=Je(t)?Iu(t.id):null;return{valid:o.length===0,id:a,source:r,errors:o,warnings:[]}}catch(t){return{valid:!1,id:e.id??null,source:e.file?dt.resolve(e.file):null,errors:[t instanceof Error?t.message:"Unknown policy pack validation error"],warnings:[]}}}async function Nu(){let e=await Ou(),t=[];for(let r of e){let o=JSON.parse(await ri(r,"utf8")),a=dr(o);if(a.length>0)throw new Error(`Invalid built-in policy pack ${r}: ${a.join("; ")}`);t.push({pack:o,source:r})}return t}async function Pb(e){if(!e)throw new Error("policy packs validate requires <id> or --file <path>");let t=await Ou();for(let r of t){let o=JSON.parse(await ri(r,"utf8"));if(Je(o)&&o.id===e)return{value:o,source:r}}throw new Error(`Policy pack not found: ${e}`)}async function Ou(){let e=Eb(),t=(await Sb(e)).filter(r=>r.endsWith(".json")).map(r=>dt.join(e,r)).sort();if(t.length===0)throw new Error(`No policy packs found in ${e}`);return t}function Eb(){let e=dt.dirname(Ab(import.meta.url)),r=[dt.resolve(process.cwd(),"policy-packs"),dt.resolve(e,"../../../policy-packs"),dt.resolve(e,"../../../../policy-packs"),dt.resolve(e,"../../../../../policy-packs")].find(o=>kb(o));if(!r)throw new Error("Built-in policy pack catalog not found");return r}async function li(e){if(e.apply&&!e.reviewed)throw new Error("policy packs apply requires a prior dry-run review; pass --reviewed with --apply after reviewing the plan");let t=await b(e.home),r=await jb(e),o=ge.resolve(e.targetRoot??process.cwd()),a=new Date().toISOString(),n=await Tb({home:t.home,pack:r.pack,targetRoot:o,createdAt:a}),s=n.map(Mu),i=n.filter(p=>p.changed),l=qb(r.pack),c=e.apply&&i.length>0?await $b({home:t.home,pack:r.pack,source:r.source,targetRoot:o,files:i,approvalEvidence:e.approvalEvidence??null,createdAt:a}):null;if(e.apply){let p=[];try{for(let h of i)await di(h,"after"),p.push(h)}catch(h){throw await Mb(p),await f({home:t.home,type:"policy_pack_apply_failed",result:"error",details:{pack:{id:r.pack.id,version:r.pack.version,source:r.source},targetRoot:o,snapshotPath:c,rolledBackFiles:p.map(y=>Mu(y)),error:h instanceof Error?h.message:String(h)}}),h}}let d={pack:{id:r.pack.id,version:r.pack.version,title:r.pack.title,source:r.source},dryRun:!e.apply,applied:e.apply,reviewed:e.reviewed,targetRoot:o,files:s,standingOrderChanges:r.pack.standing_orders.length,policyProposals:r.pack.policy_proposals.length,managedBlocks:r.pack.managed_blocks.length,warnings:l,snapshotRequired:i.length>0,snapshotPath:c};return await f({home:t.home,type:e.apply?"policy_pack_apply":"policy_pack_apply_dry_run",details:Kb(d,e.approvalEvidence)}),d}async function ci(e){let t=await b(e.home),r=Lb(await Ra(e.snapshotPath,"utf8"),e.snapshotPath),o=r.files.map(n=>Ob(n));if(e.apply)for(let n of r.files)await di(n,"before");let a={snapshotPath:e.snapshotPath,pack:{id:r.pack.id,version:r.pack.version},dryRun:!e.apply,applied:e.apply,files:o};return await f({home:t.home,type:e.apply?"policy_pack_rollback":"policy_pack_rollback_dry_run",details:{snapshotPath:e.snapshotPath,pack:a.pack,dryRun:a.dryRun,applied:a.applied,files:a.files}}),a}async function jb(e){if(e.file){let r=ge.resolve(e.file),o=JSON.parse(await Ra(r,"utf8")),a=dr(o);if(a.length>0)throw new Error(`Invalid policy pack ${r}: ${a.join("; ")}`);return{pack:o,source:r}}if(!e.id)throw new Error("policy packs apply requires <id> or --file <path>");let t=await mo(e.id);return{pack:t,source:t.source}}async function Tb(e){let t=[];for(let r of e.pack.standing_orders)t.push(await Cb(e.home,e.pack,r));for(let r of e.pack.policy_proposals)t.push(await Ib(e.home,e.pack,r,e.createdAt));for(let r of e.pack.managed_blocks)t.push(await Nb(e.targetRoot,e.pack,r));return t}async function Cb(e,t,r){if(r.action==="add"&&r.authority==="operator-approved"){let a=ge.join(e,"standing-orders",`${r.id}.yaml`);return await ni("standing_order",a,Fb(r,t))}let o=ge.join(e,"proposals",`standing-order-${t.id}-${r.id}.md`);return await ni("standing_order",o,Ub(r,t))}async function Ib(e,t,r,o){let a=o.replaceAll(/[:.]/gu,"-"),n=ge.join(e,"proposals",`${a}-${t.id}-${r.target}.md`);return await ni("policy_proposal",n,Vb(r,t,o))}async function Nb(e,t,r){let o=ge.resolve(e,r.target);if(!Wb(e,o))throw new Error(`Policy pack managed block target escapes target root: ${r.target}`);let a=ii(o),n=a?await Ra(o,"utf8"):null,s=Bb(n,t,r);return Du("managed_block",o,a,n,s)}async function ni(e,t,r){let o=ii(t),a=o?await Ra(t,"utf8"):null;return Du(e,t,o,a,r)}function Du(e,t,r,o,a){let n=o===null?null:S(o),s=a===null?null:S(a),i=o!==a;return{kind:e,targetPath:t,action:i?r?"replace":"create":"noop",changed:i,beforeHash:n,afterHash:s,diff:Gb(o,a),beforeExists:r,beforeContent:o,afterContent:a}}function Mu(e){return{kind:e.kind,targetPath:e.targetPath,action:e.action,changed:e.changed,beforeHash:e.beforeHash,afterHash:e.afterHash,diff:e.diff}}function Ob(e){return{kind:e.kind,targetPath:e.targetPath,action:e.beforeExists?"replace":"remove",changed:!0,beforeHash:e.afterHash,afterHash:e.beforeHash,diff:Fu(e.afterHash,e.beforeHash)}}async function di(e,t){let r=t==="before"?e.beforeExists:e.afterHash!==null,o=t==="before"?e.beforeContent:e.afterContent;r&&o!==null?(await Lu(ge.dirname(e.targetPath),{recursive:!0,mode:448}),await Hu(e.targetPath,o,{encoding:"utf8",mode:384})):ii(e.targetPath)&&await xb(e.targetPath)}async function Mb(e){for(let t of[...e].reverse())await di(t,"before")}function Lb(e,t){let r;try{r=JSON.parse(e)}catch(a){throw new Error(`Invalid policy pack snapshot ${t}: ${a instanceof Error?a.message:String(a)}`,{cause:a})}let o=Hb(r);if(o.length>0)throw new Error(`Invalid policy pack snapshot ${t}: ${o.join("; ")}`);return r}function Hb(e){let t=[];if(!si(e))return["snapshot must be an object"];(typeof e.id!="string"||!e.id)&&t.push("id must be a non-empty string");let r=e.pack;return si(r)?((typeof r.id!="string"||!r.id)&&t.push("pack.id must be a non-empty string"),(typeof r.version!="string"||!r.version)&&t.push("pack.version must be a non-empty string"),typeof r.source=="string"||r.source===null||t.push("pack.source must be a string or null")):t.push("pack must be an object"),(typeof e.targetRoot!="string"||!e.targetRoot)&&t.push("targetRoot must be a non-empty string"),(typeof e.createdAt!="string"||!e.createdAt)&&t.push("createdAt must be a non-empty string"),typeof e.approvalEvidence=="string"||e.approvalEvidence===null||t.push("approvalEvidence must be a string or null"),Array.isArray(e.files)?e.files.forEach((o,a)=>{t.push(...Db(o,`files[${a}]`))}):t.push("files must be an array"),t}function Db(e,t){let r=[];if(!si(e))return[`${t} must be an object`];["standing_order","policy_proposal","managed_block"].includes(typeof e.kind=="string"?e.kind:"")||r.push(`${t}.kind is invalid`),(typeof e.targetPath!="string"||!ge.isAbsolute(e.targetPath))&&r.push(`${t}.targetPath must be an absolute path`),["create","replace","noop","remove"].includes(typeof e.action=="string"?e.action:"")||r.push(`${t}.action is invalid`),typeof e.changed!="boolean"&&r.push(`${t}.changed must be boolean`),typeof e.beforeExists!="boolean"&&r.push(`${t}.beforeExists must be boolean`);for(let o of["beforeHash","afterHash","beforeContent","afterContent"])typeof e[o]=="string"||e[o]===null||r.push(`${t}.${o} must be a string or null`);return typeof e.diff!="string"&&r.push(`${t}.diff must be a string`),r}function si(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function $b(e){let t=ge.join(e.home,"backups","policy-packs");await Lu(t,{recursive:!0,mode:448});let r={id:O("policy_pack_snapshot"),pack:{id:e.pack.id,version:e.pack.version,source:e.source},targetRoot:e.targetRoot,createdAt:e.createdAt,files:e.files,approvalEvidence:e.approvalEvidence},o=`${e.createdAt.replaceAll(/[:.]/gu,"-")}-${e.pack.id}.json`,a=ge.join(t,o);return await Hu(a,JSON.stringify(r,null,2),{encoding:"utf8",mode:384,flag:"wx"}),a}function Fb(e,t){return[`id: ${e.id}`,`source: policy-pack:${t.id}@${t.version}`,`allowed: ${JSON.stringify(e.allowed)}`,`approval_required: ${JSON.stringify(e.approval_required)}`,`scope_projects: ${JSON.stringify(e.scope_projects)}`,`scope_hosts: ${JSON.stringify(e.scope_hosts)}`,`reason: ${JSON.stringify(e.reason)}`,""].join(`
947
- `)}function Ub(e,t){return["# Standing Order Proposal","",`Policy Pack: ${t.id}@${t.version}`,`Standing Order: ${e.id}`,`Action: ${e.action}`,`Authority: ${e.authority}`,"","## Allowed","",...e.allowed.map(r=>`- ${r}`),"","## Approval Required","",...e.approval_required.map(r=>`- ${r}`),"","## Reason","",e.reason,""].join(`
948
- `)}function Vb(e,t,r){return["# Policy Pack Proposal","",`Policy Pack: ${t.id}@${t.version}`,`Target: ${e.target}`,`Created At: ${r}`,"","## Summary","",e.summary,"","## Rationale","",e.rationale,"","## Rollback Note","",e.rollback_note,""].join(`
949
- `)}function Bb(e,t,r){let o=Jb(t,r);if(e===null||e.length===0)return o;let a=$u(t,r),n=e.indexOf(a.start),s=e.indexOf(a.end);if(n>=0&&s>n){let l=s+a.end.length,c=e.slice(l).replace(/^\n/u,"");return`${e.slice(0,n)}${o}${c}`}let i=e.endsWith(`
1043
+ `}import{readFile as Gk}from"node:fs/promises";import Xk from"node:path";var $n=1500;async function Eo(e){let t=await v(e.home),r=await Qk(t.home),o=new Date,n=zk(e.ttlSeconds??r.ttlSeconds),s=new Date(o.getTime()+n*1e3).toISOString(),a=Ii(e.project,e.slot),i=_(t.database),l;try{l=i.claimHeartbeatLease({id:T("lease"),slot:e.slot,holder:e.host,idempotencyKey:a,now:o.toISOString(),expiresAt:s})}finally{i.close()}return await h({home:t.home,type:l.claimed?"heartbeat_claimed":"heartbeat_skipped",details:{slot:e.slot,host:e.host,project:e.project,lease_id:l.lease.id,reason:l.reason}}),{slot:e.slot,host:e.host,project:e.project,claimed:l.claimed,reason:l.reason,silent_ack:l.claimed||l.reason==="LEASE_OCCUPIED"&&!r.skipWhenBusy?null:"HEARTBEAT_OK",lease:l.lease}}async function Po(e){let t=await v(e.home),r=new Date().toISOString(),o=Ii(e.project,e.slot),n=H(e.result??"HEARTBEAT_OK"),s=H(Yk(e.evidence??{},e.workItemId)),a=H(e.cost??{}),i=qt(a),l=_(t.database),c;try{c=l.completeHeartbeatLease({idempotencyKey:o,host:e.host,project:e.project,result:n,evidence:s,cost:i,completedAt:r,runId:T("run")})}finally{l.close()}return await h({home:t.home,type:c.completed?"heartbeat_completed":"heartbeat_completion_replayed",details:{slot:e.slot,host:e.host,project:e.project,lease_id:c.lease.id,run_id:c.run?.id??null}}),{slot:e.slot,project:e.project,completed:c.completed,silent_ack:"HEARTBEAT_OK",lease:c.lease,run:c.run}}async function ji(e){let t=await v(e.home),r=_(t.database);try{return r.listHeartbeatLeases({project:e.project,limit:Math.min(Math.max(e.limit??20,1),100)})}finally{r.close()}}function Ii(e,t){return`heartbeat:${e}:${t}`}function zk(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e),1),1440*60):$n}function Yk(e,t){return t?{...e&&typeof e=="object"&&!Array.isArray(e)?e:{},work_item_id:t}:e}async function Qk(e){let t;try{t=await Gk(Xk.join(e,"config.yaml"),"utf8")}catch{return{ttlSeconds:$n,skipWhenBusy:!0}}return{ttlSeconds:Zk(t),skipWhenBusy:ew(t,"skip_when_busy",!0)}}function Zk(e){let t=xi(e,"ttl_seconds"),r=xi(e,"lease_ttl"),o=tw(e,"heartbeat_ttl_seconds"),n=rw(t??r??o);return Number.isFinite(n)?n:$n}function ew(e,t,r){let o=xi(e,t);return o?/^(true|yes|1)$/i.test(o)?!0:/^(false|no|0)$/i.test(o)?!1:r:r}function xi(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`^\\s*heartbeat:\\s*$[\\s\\S]*?^\\s{2}${r}:\\s*([^#\\n]+)`,"mu"))?.[1]?.trim().replace(/^["']|["']$/g,"")??null}function tw(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`^\\s*${r}:\\s*([^#\\n]+)`,"mu"))?.[1]?.trim().replace(/^["']|["']$/g,"")??null}function rw(e){if(!e)return $n;let t=e.match(/^(\d+)$/);if(t)return Number(t[1]);let r=e.match(/^(\d+)\s*([smh])$/i);if(!r)return Number.NaN;let o=Number(r[1]),n=r[2]?.toLowerCase();return n==="s"?o:n==="m"?o*60:o*60*60}async function Ti(e){let t=await v(e.home);_(t.database).close();let o=Ve(e.host),n=(await Promise.all(o.map(a=>Ir(a)))).flat(),s=[];for(let a of o){let i=We(a,e.surface);for(let l of i){let c=n.find(pe=>pe.host===a),d=nr(a,e.targetRoot,l),p=d.managedBlock?await Nr({home:t.home,host:a,apply:e.apply,targetPath:d.managedBlock}):ow(a,l,!e.apply),g=await ao({home:t.home,host:a,apply:e.apply,targetPath:d.mcpRegistration,commandMode:"package"}),y=await Va({home:t.home,host:a,surface:l,apply:e.apply,targetPath:d.plugin}),k=await ct({home:t.home,host:a,surface:l,mode:"leader",apply:e.apply,pluginEnabled:y.enabled,hostConfigRoot:Ke(a,e.targetRoot),targetRoot:e.targetRoot}),S=e.apply?await kt({home:t.home,host:a}):[],U=e.apply?S.reduce((pe,Ie)=>pe+Ie.count,0):c?.sources.length??0,Q=[...k.warnings,...y.issues.map(pe=>pe.code),...c?.detected?[]:[`${a.toUpperCase()}_NOT_DETECTED`]],je=[p.backupPath,g.backupPath,y.backupPath].filter(pe=>pe!==null),be=Q.length===0&&U>0?"ready":"degraded";s.push({host:a,surface:l,detected:c?.detected??!1,status:be,managed_block:p,mcp_registration:g,plugin:y,schedule:k,capability_count:U,snapshots:je,warnings:Q})}}return{dryRun:!e.apply,applied:e.apply,home:t.home,hosts:s,status:s.every(a=>a.status==="ready")?"ready":"degraded"}}function ow(e,t,r){let o=A("");return{host:e,targetPath:`not-applicable:${Ct(e,t)}`,action:"noop",dryRun:r,changed:!1,beforeHash:null,afterHash:o,diff:"No managed instruction block for this host surface.",backupPath:null,applied:!1}}import nw from"node:path";import{rm as $p}from"node:fs/promises";var Ci="DELETE_NATIVESOUL_HOME";async function Ni(e){if(e.purgeData===!0&&e.confirmPurge!==Ci)throw new Error(`--purge-data requires --confirm-purge-nativesoul-data ${Ci}`);let t=await v(e.home);_(t.database).close();let o=Ve(e.host);if(e.apply)for(let l of o)for(let c of We(l,e.surface))await Fp({home:t.home,host:l,surface:c,apply:!1,targetRoot:e.targetRoot});let n=[];for(let l of o)for(let c of We(l,e.surface))n.push(await Fp({home:t.home,host:l,surface:c,apply:e.apply,targetRoot:e.targetRoot}));let s={requested:e.purgeData===!0,confirmed:e.confirmPurge===Ci,applied:e.apply&&e.purgeData===!0,preserved:!(e.apply&&e.purgeData===!0)},a=nw.join(t.home,"backups"),i={path:a,applied:e.apply,preserved:!e.apply};return i.applied&&await $p(a,{recursive:!0,force:!0}),s.applied&&await $p(t.home,{recursive:!0,force:!0}),{dryRun:!e.apply,applied:e.apply,home:t.home,hosts:n,backups_purge:i,data_purge:s,status:n.every(l=>l.status==="ready")?"ready":"degraded"}}async function Fp(e){let t=nr(e.host,e.targetRoot,e.surface),r=t.managedBlock?await Ys({home:e.home,host:e.host,apply:e.apply,targetPath:t.managedBlock}):sw(e.host,e.surface,!e.apply),o=await Ja({home:e.home,host:e.host,apply:e.apply,targetPath:t.mcpRegistration}),n=await Ba({home:e.home,host:e.host,surface:e.surface,apply:e.apply,targetPath:t.plugin}),s=[r.backupPath,o.backupPath,n.backupPath].filter(a=>a!==null);return{host:e.host,surface:e.surface,status:"ready",managed_block:r,mcp_registration:o,plugin:n,snapshots:s,warnings:["SCHEDULE_TEARDOWN_NOT_PERFORMED"]}}function sw(e,t,r){let o=A("");return{host:e,targetPath:`not-applicable:${Ct(e,t)}`,action:"noop",dryRun:r,changed:!1,beforeHash:null,afterHash:o,diff:"No managed instruction block for this host surface.",backupPath:null,applied:!1}}async function Mi(e){let t=f(e.home),r=_(t.database),o;try{let n=r.findPendingApprovalMatch(Oi(e));if(!n.available)return{approval:null,created:!1,available:!1,warning:n.warning};if(n.approval)return{approval:n.approval,created:!1,available:!0,warning:null};let s=r.createApproval({id:T("approval"),...Oi(e)});o={approval:s.approval,created:!!s.approval,available:s.available,warning:s.warning}}finally{r.close()}return o.created&&o.approval&&await h({home:t.home,type:"approval_requested",details:Di(o.approval)}),o}async function gr(e){let t=f(e.home),r=_(t.database),o;try{let n=r.decideApproval(e.id,{status:e.status,reviewer:e.reviewer??"local-operator",reason:e.reason??null});o={approval:n.approval,available:n.available,warning:n.warning}}catch(n){throw n instanceof Ce,n}finally{r.close()}return o.approval&&await h({home:t.home,type:o.approval.status==="approved"?"approval_approved":"approval_rejected",details:Di(o.approval)}),o}async function Li(e){let t=f(e.home),r=_(t.database),o;try{let n=r.createDecidedApproval({id:T("approval"),...Oi(e),status:"approved",reviewer:`standing-order:${e.standingOrderId}`,reason:e.reason});o={approval:n.approval,available:n.available,warning:n.warning,created:!!n.approval}}finally{r.close()}return o.approval&&await h({home:t.home,type:"approval_auto_approved",details:{...Di(o.approval),standing_order:e.standingOrderId}}),o}function Fn(e){let t=_(f(e.home).database);try{let r=t.getApproval(e.id);return{approval:r.approval,available:r.available,warning:r.warning}}finally{t.close()}}function Un(e={}){let t=_(f(e.home).database);try{return t.listApprovals(e.status)}finally{t.close()}}function Oi(e){return{action:e.action,class:e.class,target:e.target??null,project:e.project??null,host:e.host??null}}function Di(e){return{id:e.id,action:e.action,class:e.class,target:e.target,project:e.project,host:e.host,status:e.status,reviewer:e.reviewer,reason:e.reason}}async function Hi(e){let t=await pt(e),r=await aw(e,t);if(r){let n=await Li({home:e.home,action:t.action,class:t.class,target:t.target,project:e.project??null,host:e.host??null,standingOrderId:r.id,reason:`standing-order allowed:${t.action}`});return{evaluation:t,approval:n.approval,approval_created:n.created,approval_available:n.available,warning:n.warning}}if(t.decision!=="approval_required")return{evaluation:t,approval:null,approval_created:!1,approval_available:!0,warning:null};let o=await Mi({home:e.home,action:t.action,class:t.class,target:t.target,project:e.project??null,host:e.host??null});return{evaluation:t,approval:o.approval,approval_created:o.created,approval_available:o.available,warning:o.warning}}async function aw(e,t){return t.decision!=="allowed"||!t.matched_standing_order||!iw(e.className)?null:(await ut(e.home)).find(o=>o.id===t.matched_standing_order&&o.allowed.includes(e.action)&&Ri(o,e))??null}function iw(e){return e==="write_project"||e==="external_write"}import{existsSync as Wi}from"node:fs";import{mkdir as Kp,readFile as Bn,rm as xw,writeFile as Gp}from"node:fs/promises";import _e from"node:path";import{existsSync as Rw}from"node:fs";import{readdir as Sw,readFile as $i}from"node:fs/promises";import mt from"node:path";import{fileURLToPath as Aw}from"node:url";import Up from"node:path";var lw=new Set(["id","version","title","description","intended_use","approvals","standing_orders","policy_proposals","managed_blocks","rollback","metadata"]),cw=new Set(["id","action","authority","allowed","approval_required","scope_projects","scope_hosts","reason"]),dw=new Set(["target","summary","rationale","rollback_note"]),uw=new Set(["target","marker","content","rollback_key"]),pw=new Set(["strategy","restores","notes"]),mw=new Set(["maturity","owner","source"]),gw=new Set(["SOUL.MD","POLICY.MD"]),Vp=["AGENTS.md","CLAUDE.md","GEMINI.md","Agents.md",".claude/CLAUDE.md"],fw=new Set(Vp);function hr(e){let t=[];return Xe(e)?(yr(e,lw,"pack",t),oe(e,"id","pack",t,/^[a-z0-9][a-z0-9-]{2,63}$/u),oe(e,"version","pack",t,/^[0-9]+\.[0-9]+\.[0-9]+$/u),oe(e,"title","pack",t),oe(e,"description","pack",t),oe(e,"intended_use","pack",t),fr(e.approvals,"pack.approvals",t,!1),hw(e.standing_orders,t),yw(e.policy_proposals,t),_w(e.managed_blocks,t),bw(e.rollback,t),vw(e.metadata,t),ww(e,t),t):["Policy pack must be an object"]}function Xe(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Bp(e){return typeof e=="string"?e:null}function hw(e,t){if(!Array.isArray(e)){t.push("pack.standing_orders must be an array");return}for(let[r,o]of e.entries()){let n=`pack.standing_orders[${r}]`;if(!Xe(o)){t.push(`${n} must be an object`);continue}yr(o,cw,n,t),oe(o,"id",n,t,/^[a-z0-9][a-z0-9-]{2,63}$/u),Vn(o,"action",n,["add","propose"],t),Vn(o,"authority",n,["operator-approved","proposal"],t),fr(o.allowed,`${n}.allowed`,t,!0),fr(o.approval_required,`${n}.approval_required`,t,!0),fr(o.scope_projects,`${n}.scope_projects`,t,!0),fr(o.scope_hosts,`${n}.scope_hosts`,t,!0),oe(o,"reason",n,t);let s=Array.isArray(o.allowed)?o.allowed:[],a=Array.isArray(o.approval_required)?o.approval_required:[];s.length===0&&a.length===0&&t.push(`${n} must declare at least one allowed or approval_required action`)}}function yw(e,t){if(!Array.isArray(e)){t.push("pack.policy_proposals must be an array");return}for(let[r,o]of e.entries()){let n=`pack.policy_proposals[${r}]`;if(!Xe(o)){t.push(`${n} must be an object`);continue}yr(o,dw,n,t),Vn(o,"target",n,["SOUL.md","POLICY.md"],t),oe(o,"summary",n,t),oe(o,"rationale",n,t),oe(o,"rollback_note",n,t)}}function _w(e,t){if(!Array.isArray(e)){t.push("pack.managed_blocks must be an array");return}for(let[r,o]of e.entries()){let n=`pack.managed_blocks[${r}]`;if(!Xe(o)){t.push(`${n} must be an object`);continue}yr(o,uw,n,t),oe(o,"target",n,t),oe(o,"marker",n,t),oe(o,"content",n,t),oe(o,"rollback_key",n,t),typeof o.target=="string"&&kw(o.target,n,t)}}function bw(e,t){if(!Xe(e)){t.push("pack.rollback must be an object");return}yr(e,pw,"pack.rollback",t),Vn(e,"strategy","pack.rollback",["proposal-only","managed-block","snapshot-required"],t),fr(e.restores,"pack.rollback.restores",t,!0),Array.isArray(e.restores)&&e.restores.length===0&&t.push("pack.rollback.restores must include at least one rollback item"),oe(e,"notes","pack.rollback",t)}function vw(e,t){if(e!==void 0){if(!Xe(e)){t.push("pack.metadata must be an object");return}yr(e,mw,"pack.metadata",t);for(let[r,o]of Object.entries(e))o!==null&&typeof o!="string"&&typeof o!="number"&&typeof o!="boolean"&&t.push(`pack.metadata.${r} must be a scalar value`)}}function kw(e,t,r){let o=e.replaceAll("\\","/"),n=Up.basename(o).toUpperCase();(Up.isAbsolute(e)||o.includes("../")||o.startsWith("../"))&&r.push(`${t}.target must be a relative managed host file path`),gw.has(n)&&r.push(`${t}.target must not target protected SOUL.md or POLICY.md`),fw.has(o)||r.push(`${t}.target is outside supported managed-block scope`)}function ww(e,t){let r=JSON.stringify(e);/(sk-[A-Za-z0-9_-]{8,}|api[_-]?key\s*[:=]|secret\s*[:=]|token\s*[:=]|password\s*[:=])/iu.test(r)&&t.push("pack must not contain credential-like material"),/https?:\/\//iu.test(r)&&t.push("pack must not require trust in external URLs")}function yr(e,t,r,o){for(let n of Object.keys(e))t.has(n)||o.push(`${r}.${n} is not allowed`)}function oe(e,t,r,o,n){let s=e[t];if(typeof s!="string"||s.trim()===""){o.push(`${r}.${t} must be a non-empty string`);return}n&&!n.test(s)&&o.push(`${r}.${t} has invalid format`)}function Vn(e,t,r,o,n){let s=e[t];(typeof s!="string"||!o.includes(s))&&n.push(`${r}.${t} must be one of ${o.join(", ")}`)}function fr(e,t,r,o){e===void 0&&!o||(!Array.isArray(e)||!e.every(n=>typeof n=="string"))&&r.push(`${t} must be an array of strings`)}async function Fi(){return(await Wp()).map(({pack:t,source:r})=>({id:t.id,version:t.version,title:t.title,description:t.description,intended_use:t.intended_use,source:r})).sort((t,r)=>t.id.localeCompare(r.id))}async function xo(e){let r=(await Wp()).find(o=>o.pack.id===e);if(!r)throw new Error(`Policy pack not found: ${e}`);return{...r.pack,source:r.source}}async function Ui(e){try{let{value:t,source:r}=e.file?{value:JSON.parse(await $i(e.file,"utf8")),source:mt.resolve(e.file)}:await Ew(e.id),o=hr(t),n=Xe(t)?Bp(t.id):null;return{valid:o.length===0,id:n,source:r,errors:o,warnings:[]}}catch(t){return{valid:!1,id:e.id??null,source:e.file?mt.resolve(e.file):null,errors:[t instanceof Error?t.message:"Unknown policy pack validation error"],warnings:[]}}}async function Wp(){let e=await Jp(),t=[];for(let r of e){let o=JSON.parse(await $i(r,"utf8")),n=hr(o);if(n.length>0)throw new Error(`Invalid built-in policy pack ${r}: ${n.join("; ")}`);t.push({pack:o,source:r})}return t}async function Ew(e){if(!e)throw new Error("policy packs validate requires <id> or --file <path>");let t=await Jp();for(let r of t){let o=JSON.parse(await $i(r,"utf8"));if(Xe(o)&&o.id===e)return{value:o,source:r}}throw new Error(`Policy pack not found: ${e}`)}async function Jp(){let e=Pw(),t=(await Sw(e)).filter(r=>r.endsWith(".json")).map(r=>mt.join(e,r)).sort();if(t.length===0)throw new Error(`No policy packs found in ${e}`);return t}function Pw(){let e=mt.dirname(Aw(import.meta.url)),r=[mt.resolve(process.cwd(),"policy-packs"),mt.resolve(e,"../../../policy-packs"),mt.resolve(e,"../../../../policy-packs"),mt.resolve(e,"../../../../../policy-packs")].find(o=>Rw(o));if(!r)throw new Error("Built-in policy pack catalog not found");return r}async function Ji(e){if(e.apply&&!e.reviewed)throw new Error("policy packs apply requires a prior dry-run review; pass --reviewed with --apply after reviewing the plan");let t=await v(e.home),r=await jw(e),o=_e.resolve(e.targetRoot??process.cwd()),n=new Date().toISOString(),s=await Iw({home:t.home,pack:r.pack,targetRoot:o,createdAt:n}),a=s.map(qp),i=s.filter(p=>p.changed),l=Jw(r.pack),c=e.apply&&i.length>0?await $w({home:t.home,pack:r.pack,source:r.source,targetRoot:o,files:i,approvalEvidence:e.approvalEvidence??null,createdAt:n}):null;if(e.apply){let p=[];try{for(let g of i)await Ki(g,"after"),p.push(g)}catch(g){throw await Mw(p),await h({home:t.home,type:"policy_pack_apply_failed",result:"error",details:{pack:{id:r.pack.id,version:r.pack.version,source:r.source},targetRoot:o,snapshotPath:c,rolledBackFiles:p.map(y=>qp(y)),error:g instanceof Error?g.message:String(g)}}),g}}let d={pack:{id:r.pack.id,version:r.pack.version,title:r.pack.title,source:r.source},dryRun:!e.apply,applied:e.apply,reviewed:e.reviewed,targetRoot:o,files:a,standingOrderChanges:r.pack.standing_orders.length,policyProposals:r.pack.policy_proposals.length,managedBlocks:r.pack.managed_blocks.length,warnings:l,snapshotRequired:i.length>0,snapshotPath:c};return await h({home:t.home,type:e.apply?"policy_pack_apply":"policy_pack_apply_dry_run",details:qw(d,e.approvalEvidence)}),d}async function qi(e){let t=await v(e.home),r=Lw(await Bn(e.snapshotPath,"utf8"),e.snapshotPath),o=r.files.map(s=>Ow(s));if(e.apply)for(let s of r.files)await Ki(s,"before");let n={snapshotPath:e.snapshotPath,pack:{id:r.pack.id,version:r.pack.version},dryRun:!e.apply,applied:e.apply,files:o};return await h({home:t.home,type:e.apply?"policy_pack_rollback":"policy_pack_rollback_dry_run",details:{snapshotPath:e.snapshotPath,pack:n.pack,dryRun:n.dryRun,applied:n.applied,files:n.files}}),n}async function jw(e){if(e.file){let r=_e.resolve(e.file),o=JSON.parse(await Bn(r,"utf8")),n=hr(o);if(n.length>0)throw new Error(`Invalid policy pack ${r}: ${n.join("; ")}`);return{pack:o,source:r}}if(!e.id)throw new Error("policy packs apply requires <id> or --file <path>");let t=await xo(e.id);return{pack:t,source:t.source}}async function Iw(e){let t=[];for(let r of e.pack.standing_orders)t.push(await Tw(e.home,e.pack,r));for(let r of e.pack.policy_proposals)t.push(await Cw(e.home,e.pack,r,e.createdAt));for(let r of e.pack.managed_blocks)t.push(await Nw(e.targetRoot,e.pack,r));return t}async function Tw(e,t,r){if(r.action==="add"&&r.authority==="operator-approved"){let n=_e.join(e,"standing-orders",`${r.id}.yaml`);return await Vi("standing_order",n,Fw(r,t))}let o=_e.join(e,"proposals",`standing-order-${t.id}-${r.id}.md`);return await Vi("standing_order",o,Uw(r,t))}async function Cw(e,t,r,o){let n=o.replaceAll(/[:.]/gu,"-"),s=_e.join(e,"proposals",`${n}-${t.id}-${r.target}.md`);return await Vi("policy_proposal",s,Vw(r,t,o))}async function Nw(e,t,r){let o=_e.resolve(e,r.target);if(!Gw(e,o))throw new Error(`Policy pack managed block target escapes target root: ${r.target}`);let n=Wi(o),s=n?await Bn(o,"utf8"):null,a=Bw(s,t,r);return Xp("managed_block",o,n,s,a)}async function Vi(e,t,r){let o=Wi(t),n=o?await Bn(t,"utf8"):null;return Xp(e,t,o,n,r)}function Xp(e,t,r,o,n){let s=o===null?null:A(o),a=n===null?null:A(n),i=o!==n;return{kind:e,targetPath:t,action:i?r?"replace":"create":"noop",changed:i,beforeHash:s,afterHash:a,diff:Kw(o,n),beforeExists:r,beforeContent:o,afterContent:n}}function qp(e){return{kind:e.kind,targetPath:e.targetPath,action:e.action,changed:e.changed,beforeHash:e.beforeHash,afterHash:e.afterHash,diff:e.diff}}function Ow(e){return{kind:e.kind,targetPath:e.targetPath,action:e.beforeExists?"replace":"remove",changed:!0,beforeHash:e.afterHash,afterHash:e.beforeHash,diff:Yp(e.afterHash,e.beforeHash)}}async function Ki(e,t){let r=t==="before"?e.beforeExists:e.afterHash!==null,o=t==="before"?e.beforeContent:e.afterContent;r&&o!==null?(await Kp(_e.dirname(e.targetPath),{recursive:!0,mode:448}),await Gp(e.targetPath,o,{encoding:"utf8",mode:384})):Wi(e.targetPath)&&await xw(e.targetPath)}async function Mw(e){for(let t of[...e].reverse())await Ki(t,"before")}function Lw(e,t){let r;try{r=JSON.parse(e)}catch(n){throw new Error(`Invalid policy pack snapshot ${t}: ${n instanceof Error?n.message:String(n)}`,{cause:n})}let o=Dw(r);if(o.length>0)throw new Error(`Invalid policy pack snapshot ${t}: ${o.join("; ")}`);return r}function Dw(e){let t=[];if(!Bi(e))return["snapshot must be an object"];(typeof e.id!="string"||!e.id)&&t.push("id must be a non-empty string");let r=e.pack;return Bi(r)?((typeof r.id!="string"||!r.id)&&t.push("pack.id must be a non-empty string"),(typeof r.version!="string"||!r.version)&&t.push("pack.version must be a non-empty string"),typeof r.source=="string"||r.source===null||t.push("pack.source must be a string or null")):t.push("pack must be an object"),(typeof e.targetRoot!="string"||!e.targetRoot)&&t.push("targetRoot must be a non-empty string"),(typeof e.createdAt!="string"||!e.createdAt)&&t.push("createdAt must be a non-empty string"),typeof e.approvalEvidence=="string"||e.approvalEvidence===null||t.push("approvalEvidence must be a string or null"),Array.isArray(e.files)?e.files.forEach((o,n)=>{t.push(...Hw(o,`files[${n}]`))}):t.push("files must be an array"),t}function Hw(e,t){let r=[];if(!Bi(e))return[`${t} must be an object`];["standing_order","policy_proposal","managed_block"].includes(typeof e.kind=="string"?e.kind:"")||r.push(`${t}.kind is invalid`),(typeof e.targetPath!="string"||!_e.isAbsolute(e.targetPath))&&r.push(`${t}.targetPath must be an absolute path`),["create","replace","noop","remove"].includes(typeof e.action=="string"?e.action:"")||r.push(`${t}.action is invalid`),typeof e.changed!="boolean"&&r.push(`${t}.changed must be boolean`),typeof e.beforeExists!="boolean"&&r.push(`${t}.beforeExists must be boolean`);for(let o of["beforeHash","afterHash","beforeContent","afterContent"])typeof e[o]=="string"||e[o]===null||r.push(`${t}.${o} must be a string or null`);return typeof e.diff!="string"&&r.push(`${t}.diff must be a string`),r}function Bi(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function $w(e){let t=_e.join(e.home,"backups","policy-packs");await Kp(t,{recursive:!0,mode:448});let r={id:T("policy_pack_snapshot"),pack:{id:e.pack.id,version:e.pack.version,source:e.source},targetRoot:e.targetRoot,createdAt:e.createdAt,files:e.files,approvalEvidence:e.approvalEvidence},o=`${e.createdAt.replaceAll(/[:.]/gu,"-")}-${e.pack.id}.json`,n=_e.join(t,o);return await Gp(n,JSON.stringify(r,null,2),{encoding:"utf8",mode:384,flag:"wx"}),n}function Fw(e,t){return[`id: ${e.id}`,`source: policy-pack:${t.id}@${t.version}`,`allowed: ${JSON.stringify(e.allowed)}`,`approval_required: ${JSON.stringify(e.approval_required)}`,`scope_projects: ${JSON.stringify(e.scope_projects)}`,`scope_hosts: ${JSON.stringify(e.scope_hosts)}`,`reason: ${JSON.stringify(e.reason)}`,""].join(`
1044
+ `)}function Uw(e,t){return["# Standing Order Proposal","",`Policy Pack: ${t.id}@${t.version}`,`Standing Order: ${e.id}`,`Action: ${e.action}`,`Authority: ${e.authority}`,"","## Allowed","",...e.allowed.map(r=>`- ${r}`),"","## Approval Required","",...e.approval_required.map(r=>`- ${r}`),"","## Reason","",e.reason,""].join(`
1045
+ `)}function Vw(e,t,r){return["# Policy Pack Proposal","",`Policy Pack: ${t.id}@${t.version}`,`Target: ${e.target}`,`Created At: ${r}`,"","## Summary","",e.summary,"","## Rationale","",e.rationale,"","## Rollback Note","",e.rollback_note,""].join(`
1046
+ `)}function Bw(e,t,r){let o=Ww(t,r);if(e===null||e.length===0)return o;let n=zp(t,r),s=e.indexOf(n.start),a=e.indexOf(n.end);if(s>=0&&a>s){let l=a+n.end.length,c=e.slice(l).replace(/^\n/u,"");return`${e.slice(0,s)}${o}${c}`}let i=e.endsWith(`
950
1047
  `)?`
951
1048
  `:`
952
1049
 
953
- `;return`${e}${i}${o}`}function Jb(e,t){let r=$u(e,t),o=t.content.endsWith(`
1050
+ `;return`${e}${i}${o}`}function Ww(e,t){let r=zp(e,t),o=t.content.endsWith(`
954
1051
  `)?t.content:`${t.content}
955
1052
  `;return`${r.start}
956
1053
  ${o}${r.end}
957
- `}function $u(e,t){return{start:`<!-- nativesoul:policy-pack:${e.id}:${t.marker}:start v1 -->`,end:`<!-- nativesoul:policy-pack:${e.id}:${t.marker}:end -->`}}function qb(e){let t=[];return e.policy_proposals.length>0&&t.push("Protected SOUL.md/POLICY.md changes are written as proposals only."),e.standing_orders.some(r=>r.authority==="proposal"||r.action==="propose")&&t.push("Proposal-only standing orders are written to proposals/ and do not change authority automatically."),t}function Kb(e,t){return{pack:e.pack,dryRun:e.dryRun,applied:e.applied,reviewed:e.reviewed,targetRoot:e.targetRoot,snapshotPath:e.snapshotPath,approvalEvidence:t??null,files:e.files,warnings:e.warnings}}function Gb(e,t){return e===t?"No changes.":Fu(e===null?null:S(e),t===null?null:S(t),e===null?0:e.split(/\r?\n/u).length,t===null?0:t.split(/\r?\n/u).length)}function Fu(e,t,r=0,o=0){return[`before: ${e??"missing"}`,`after: ${t??"missing"}`,`lines_before: ${r}`,`lines_after: ${o}`].join(`
958
- `)}function Wb(e,t){let r=ge.relative(e,t);return r===""||!r.startsWith("..")&&!ge.isAbsolute(r)}import zb from"node:path";async function pr(e={}){let t=g(e.home),r=e.host??"all",[o,a,n,s]=await Promise.all([et(t.home),k(oa(t.home)),k(Gt(t.home)),Ct({home:t.home,host:r,surface:e.surface,targetRoot:e.targetRoot})]);return Kn({home:t.home,targetRoot:e.targetRoot?zb.resolve(e.targetRoot):null,host:r,profile:o,onboardingComplete:a,activationComplete:n,hosts:s.hosts})}async function go(e={}){let t=await pr(e);if(!e.profile||t.profile?.profile===e.profile)return t;let r={...t.profile??ta,profile:e.profile,updated_at:t.profile?.updated_at??"dry-run"};return{...t,profile:r,plan:[{id:"activation-profile-switch",component:"bootstrap",status:"approval_required",action:`Switch activation profile to ${e.profile}.`,target:`${t.home}/state/activation-profile.json`,dry_run:!0,requires_user_confirmed:!0,reason:"Activation profile replacement requires explicit reset/user confirmation."},...t.plan]}}var Xb=["codex","claude","antigravity","gemini","grok"];async function ka(e={}){let t=await b(e.home),r=await et(t.home),o=e.leaderHost??rw(r?.scheduler_host),a=o??e.host??"all",n=Yb({cadence:e.cadence??r?.heartbeat_cadence,projectScope:e.projectScope??D(process.cwd(),t.home),behavior:e.behavior,mode:e.mode}),s=await Qb({home:t.home,host:a,surface:e.surface,mode:n.mode,heartbeat:Vu(n),targetRoot:e.targetRoot}),i=Zb(s,o),l=i?[]:s.length===0?["HEARTBEAT_NO_HOSTS_EVALUATED"]:["HEARTBEAT_NATIVE_SCHEDULER_BLOCKED_BY_HOST"];return{dry_run:!0,action:i?"recommend":"blocked_by_host",recommended_leader:i?{host:i.host,surface:i.surface,native_id:i.native_id??""}:null,profile:n,candidates:s,warnings:l}}async function ui(e={}){let t=await b(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,a=await ka({...e,home:t.home}),n=a.recommended_leader?a.candidates.find(i=>i.host===a.recommended_leader?.host&&i.surface===a.recommended_leader.surface)?.dry_run??null:null;if(!a.recommended_leader)return{dry_run:r,applied:!1,user_confirmed:o,action:"blocked_by_host",plan:a,dry_run_reconcile:n,applied_reconcile:null,warnings:a.warnings};if(r)return{dry_run:!0,applied:!1,user_confirmed:o,action:"planned",plan:a,dry_run_reconcile:n,applied_reconcile:null,warnings:[]};if(!o)return{dry_run:!1,applied:!1,user_confirmed:!1,action:"rejected",plan:a,dry_run_reconcile:n,applied_reconcile:null,warnings:["HEARTBEAT_ACTIVATION_REQUIRES_USER_CONFIRMED"]};let s=await nt({home:t.home,host:a.recommended_leader.host,surface:a.recommended_leader.surface,mode:a.profile.mode,apply:!0,heartbeat:Vu(a.profile),hostConfigRoot:Be(a.recommended_leader.host,e.targetRoot),targetRoot:e.targetRoot});return await f({home:t.home,type:"activation.heartbeat.applied",details:{host:a.recommended_leader.host,surface:a.recommended_leader.surface,mode:a.profile.mode,cadence:a.profile.cadence,project_scope:a.profile.project_scope,native_schedule_supported:s.schedule.native_schedule_supported,native_id:s.schedule.native_id}}),{dry_run:!1,applied:!0,user_confirmed:!0,action:"applied",plan:a,dry_run_reconcile:n,applied_reconcile:s,warnings:s.warnings}}function Yb(e){return{cadence:e.cadence??"daily",skip_when_busy:!0,project_scope:e.projectScope??"current-project",behavior:e.behavior??"read_only",mode:e.mode??"leader",silent_ack:"HEARTBEAT_OK",hidden_fallback_scheduler:!1}}async function Qb(e){let t=[];for(let r of De(e.host))for(let o of Fe(r,e.surface)){let a=await nt({home:e.home,host:r,surface:o,mode:e.mode,apply:!1,heartbeat:e.heartbeat,hostConfigRoot:Be(r,e.targetRoot),targetRoot:e.targetRoot});t.push({host:r,surface:o,status:ew(a),native_schedule_supported:a.schedule.native_schedule_supported,native_id:a.schedule.native_id,reason:tw(a),dry_run:a})}return t}function Zb(e,t){let r=e.filter(o=>o.status==="supported"&&o.native_id);return t?r.find(o=>o.host===t)??null:r.sort((o,a)=>Uu(o)-Uu(a))[0]??null}function Uu(e){let t=Xb.indexOf(e.host),r=e.surface==="claude-desktop"?-.25:e.surface==="claude-code"?0:.25;return(t===-1?99:t)+r}function ew(e){return e.adapter_result.status==="ok"&&e.schedule.native_schedule_supported&&e.schedule.native_id?"supported":e.adapter_result.status==="degraded"?"degraded":"blocked_by_host"}function tw(e){switch(e.adapter_result.status){case"ok":return"native_scheduler_supported";case"degraded":return e.adapter_result.reason;case"unsupported":return e.adapter_result.reason;case"error":return e.adapter_result.message}}function Vu(e){return{cadence:e.cadence,skipWhenBusy:e.skip_when_busy,projectScope:e.project_scope,behavior:e.behavior}}function rw(e){return e==="codex"||e==="claude"||e==="grok"||e==="antigravity"||e==="gemini"?e:null}import{randomUUID as ow}from"node:crypto";import aw from"node:path";var nw="NativeSoul activation verification marker";async function fo(e={}){let t=cw(e),r=ne(t.projectCwd,e.home),o=await Ct({home:e.home,host:e.host??"all",surface:e.surface,targetRoot:e.targetRoot}),a=[];for(let c of o.hosts)a.push(await sw({home:o.home,inputHost:c,testCwd:t.projectCwd}));let n=await lw({home:e.home,testProject:`${r.id}-${ow()}`,apply:e.apply===!0,userConfirmed:e.userConfirmed===!0,retainTestData:e.retainTestData===!0}),s=[...new Set([...a.flatMap(c=>c.recommendations),...n.status==="failed"?["Review memory persistence and rerun verification."]:[]])],i=a.map(c=>c.status),l=uw(i,n.status);return{schema_version:1,home:o.home,target_root:o.target_root,host:e.host??"all",surface:e.surface??null,project:{requested_cwd:t.projectCwd,normalized:r.id,source:r.source,git_root:r.git_root,remote:r.remote,alias_key:r.alias_key},overall_status:l,memory_recall:n,hosts:a,recommendations:s}}async function sw(e){let t=[],r=await iw({home:e.home,host:e.inputHost.host,cwd:e.testCwd,warnings:e.inputHost.handshake.last?.warnings??[]});e.inputHost.mcp_registration.configured||t.push(`Install MCP registration for ${e.inputHost.host}: nativesoul mcp install --host ${e.inputHost.host} --apply --json`),r.status!=="ready"&&t.push(`Regenerate bootstrap context for ${e.inputHost.host}: nativesoul bootstrap --host ${e.inputHost.host} --cwd ${e.testCwd} --format inject --json`);let o=dw(e.inputHost.provider_parity.heartbeat),a=[...e.inputHost.full_native_evidence.missing_requirements];o==="unsupported"&&(a.includes("native_scheduler")||a.push("native_scheduler"),t.push(`Choose a host with native scheduler support or configure external scheduler workflow for ${e.inputHost.host}.`));let s=e.inputHost.provider_parity.heartbeat==="unsupported-native"&&e.inputHost.host!=="codex"?"blocked_by_host":r.status==="failed"||r.status==="degraded"||r.cache.status==="degraded"||r.cache.status==="missing"||!e.inputHost.plugin.enabled?"degraded":"ready";return{host:e.inputHost.host,surface:e.inputHost.surface,status:s,mcp:{configured:e.inputHost.mcp_registration.configured,issues:e.inputHost.mcp_registration.issues.map(i=>i.message)},bootstrap:r,heartbeat:{status:o,requirements:a},recommendations:t}}async function iw(e){let t=[...e.warnings],r=[],o="ready",a=!1,n="",s="ready";try{let i=await Pt({home:e.home,host:e.host,cwd:e.cwd,readOnly:!0});t.push(...i.warnings),i.warnings.some(l=>l.startsWith("HOST_ADAPTER_UNAVAILABLE")||l==="PROJECT_MEMORY_EMPTY")&&(s="degraded")}catch(i){t.push(`bootstrap_injection_failed:${pi(i)}`),s="failed"}try{let i=await Os({home:e.home,host:e.host,projectCwd:e.cwd,recordTelemetry:!1});n=i.targetPath,a=i.stale,r.push(...i.warnings),r.length>0&&(o=i.warnings.some(l=>l==="BOOTSTRAP_CACHE_MISSING")?"missing":"degraded",s==="ready"&&(s="degraded"))}catch{r.push("bootstrap_cache_check_failed"),o="missing",s==="ready"&&(s="degraded")}return{status:s,warnings:t,cache:{status:o,warnings:r,targetPath:n,stale:a}}}async function lw(e){let t=[],r=null,o=!1,a=!1;try{let n=`verify-${e.testProject}`,s=`${nw} ${e.testProject}`;r=await te(e.home,{project:n,content:s,confidence:.91,source:{host:"activation-verification",session_id:`verification-${e.testProject}`}});let i=await kt(e.home,s,n,8),l=await Rt({home:e.home,project:n,status:"candidate",limit:8}),c=i.some(d=>d.id===r?.id)||l.some(d=>d.id===r?.id);if(e.apply&&e.userConfirmed&&r){let d=await vt(e.home,r.id);r=d,a=r.id===d.id&&r.status==="active"}if(!e.retainTestData&&r)try{r.status==="candidate"?await bt(e.home,r.id):await wt(e.home,r.id),o=!0}catch(d){t.push(`memory_cleanup_failed:${pi(d)}`)}return{test_project:e.testProject,candidate_id:r?.id??"",candidate_status:r?.status??"candidate",recalled:c,promoted:a,status:c?"passed":"failed",warnings:t,cleanup_performed:o}}catch(n){return t.push(`memory_recall_check_failed:${pi(n)}`),{test_project:e.testProject,candidate_id:r?.id??"",candidate_status:r?.status??"candidate",recalled:!1,promoted:!1,status:"failed",warnings:t,cleanup_performed:!1}}}function cw(e){return{projectCwd:aw.resolve(e.projectCwd??process.cwd())}}function dw(e){return e==="native"?"native":e==="official-fallback"?"official_fallback":"unsupported"}function uw(e,t){return e.includes("blocked_by_host")?"blocked_by_host":e.includes("degraded")||t==="failed"?"degraded":e.length>0?"ready":"degraded"}function pi(e){return e instanceof Error?e.message:String(e)}async function Bu(e){let t=await b(e),r=v(t.database);try{r.integrityCheck()}finally{r.close()}return await f({home:t.home,type:"workspace_initialized",details:{createdDirectories:t.createdDirectories.length,createdFiles:t.createdFiles.length,preservedFiles:t.preservedFiles.length}}),t}function Sa(e){let t=g(e);if(!pw(t.database))return{home:t.home,initialized:!1,database:t.database,migrations:0,memories:0,events:0,capabilities:0,ledger:mw()};let r=v(t.database,{readOnly:!0});try{return{home:t.home,initialized:!0,database:t.database,...r.counts()}}finally{r.close()}}function mw(){return{hosts:0,sessions:0,memory_edges:0,commitments:0,standing_orders:0,capability_sources:0,capability_experience:0,schedules:0,leases:0,runs:0}}function m(e,t,r){t?process.stdout.write(`${JSON.stringify(gw(e),null,2)}
1054
+ `}function zp(e,t){return{start:`<!-- nativesoul:policy-pack:${e.id}:${t.marker}:start v1 -->`,end:`<!-- nativesoul:policy-pack:${e.id}:${t.marker}:end -->`}}function Jw(e){let t=[];return e.policy_proposals.length>0&&t.push("Protected SOUL.md/POLICY.md changes are written as proposals only."),e.standing_orders.some(r=>r.authority==="proposal"||r.action==="propose")&&t.push("Proposal-only standing orders are written to proposals/ and do not change authority automatically."),t}function qw(e,t){return{pack:e.pack,dryRun:e.dryRun,applied:e.applied,reviewed:e.reviewed,targetRoot:e.targetRoot,snapshotPath:e.snapshotPath,approvalEvidence:t??null,files:e.files,warnings:e.warnings}}function Kw(e,t){return e===t?"No changes.":Yp(e===null?null:A(e),t===null?null:A(t),e===null?0:e.split(/\r?\n/u).length,t===null?0:t.split(/\r?\n/u).length)}function Yp(e,t,r=0,o=0){return[`before: ${e??"missing"}`,`after: ${t??"missing"}`,`lines_before: ${r}`,`lines_after: ${o}`].join(`
1055
+ `)}function Gw(e,t){let r=_e.relative(e,t);return r===""||!r.startsWith("..")&&!_e.isAbsolute(r)}import Xw from"node:path";async function _r(e={}){let t=f(e.home),r=e.host??"all",[o,n,s,a]=await Promise.all([nt(t.home),R(yn(t.home)),R(Zt(t.home)),Ht({home:t.home,host:r,surface:e.surface,targetRoot:e.targetRoot})]);return Sa({home:t.home,targetRoot:e.targetRoot?Xw.resolve(e.targetRoot):null,host:r,profile:o,onboardingComplete:n,activationComplete:s,hosts:a.hosts})}async function jo(e={}){let t=await _r(e);if(!e.profile||t.profile?.profile===e.profile)return t;let r={...t.profile??fn,profile:e.profile,updated_at:t.profile?.updated_at??"dry-run"};return{...t,profile:r,plan:[{id:"activation-profile-switch",component:"bootstrap",status:"approval_required",action:`Switch activation profile to ${e.profile}.`,target:`${t.home}/state/activation-profile.json`,dry_run:!0,requires_user_confirmed:!0,reason:"Activation profile replacement requires explicit reset/user confirmation."},...t.plan]}}var zw=["codex","claude","antigravity","gemini","grok"];async function Wn(e={}){let t=await v(e.home),r=await nt(t.home),o=e.leaderHost??rR(r?.scheduler_host),n=o??e.host??"all",s=Yw({cadence:e.cadence??r?.heartbeat_cadence,projectScope:e.projectScope??L(process.cwd(),t.home),behavior:e.behavior,mode:e.mode}),a=await Qw({home:t.home,host:n,surface:e.surface,mode:s.mode,heartbeat:Zp(s),targetRoot:e.targetRoot}),i=Zw(a,o),l=i?[]:a.length===0?["HEARTBEAT_NO_HOSTS_EVALUATED"]:["HEARTBEAT_NATIVE_SCHEDULER_BLOCKED_BY_HOST"];return{dry_run:!0,action:i?"recommend":"blocked_by_host",recommended_leader:i?{host:i.host,surface:i.surface,native_id:i.native_id??""}:null,profile:s,candidates:a,warnings:l}}async function Gi(e={}){let t=await v(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,n=await Wn({...e,home:t.home}),s=n.recommended_leader?n.candidates.find(i=>i.host===n.recommended_leader?.host&&i.surface===n.recommended_leader.surface)?.dry_run??null:null;if(!n.recommended_leader)return{dry_run:r,applied:!1,user_confirmed:o,action:"blocked_by_host",plan:n,dry_run_reconcile:s,applied_reconcile:null,warnings:n.warnings};if(r)return{dry_run:!0,applied:!1,user_confirmed:o,action:"planned",plan:n,dry_run_reconcile:s,applied_reconcile:null,warnings:[]};if(!o)return{dry_run:!1,applied:!1,user_confirmed:!1,action:"rejected",plan:n,dry_run_reconcile:s,applied_reconcile:null,warnings:["HEARTBEAT_ACTIVATION_REQUIRES_USER_CONFIRMED"]};let a=await ct({home:t.home,host:n.recommended_leader.host,surface:n.recommended_leader.surface,mode:n.profile.mode,apply:!0,heartbeat:Zp(n.profile),hostConfigRoot:Ke(n.recommended_leader.host,e.targetRoot),targetRoot:e.targetRoot});return await h({home:t.home,type:"activation.heartbeat.applied",details:{host:n.recommended_leader.host,surface:n.recommended_leader.surface,mode:n.profile.mode,cadence:n.profile.cadence,project_scope:n.profile.project_scope,native_schedule_supported:a.schedule.native_schedule_supported,native_id:a.schedule.native_id}}),{dry_run:!1,applied:!0,user_confirmed:!0,action:"applied",plan:n,dry_run_reconcile:s,applied_reconcile:a,warnings:a.warnings}}function Yw(e){return{cadence:e.cadence??"daily",skip_when_busy:!0,project_scope:e.projectScope??"current-project",behavior:e.behavior??"read_only",mode:e.mode??"leader",silent_ack:"HEARTBEAT_OK",hidden_fallback_scheduler:!1}}async function Qw(e){let t=[];for(let r of Ve(e.host))for(let o of We(r,e.surface)){let n=await ct({home:e.home,host:r,surface:o,mode:e.mode,apply:!1,heartbeat:e.heartbeat,hostConfigRoot:Ke(r,e.targetRoot),targetRoot:e.targetRoot});t.push({host:r,surface:o,status:eR(n),native_schedule_supported:n.schedule.native_schedule_supported,native_id:n.schedule.native_id,reason:tR(n),dry_run:n})}return t}function Zw(e,t){let r=e.filter(o=>o.status==="supported"&&o.native_id);return t?r.find(o=>o.host===t)??null:r.sort((o,n)=>Qp(o)-Qp(n))[0]??null}function Qp(e){let t=zw.indexOf(e.host),r=e.surface==="claude-desktop"?-.25:e.surface==="claude-code"?0:.25;return(t===-1?99:t)+r}function eR(e){return e.adapter_result.status==="ok"&&e.schedule.native_schedule_supported&&e.schedule.native_id?"supported":e.adapter_result.status==="degraded"?"degraded":"blocked_by_host"}function tR(e){switch(e.adapter_result.status){case"ok":return"native_scheduler_supported";case"degraded":return e.adapter_result.reason;case"unsupported":return e.adapter_result.reason;case"error":return e.adapter_result.message}}function Zp(e){return{cadence:e.cadence,skipWhenBusy:e.skip_when_busy,projectScope:e.project_scope,behavior:e.behavior}}function rR(e){return e==="codex"||e==="claude"||e==="grok"||e==="antigravity"||e==="gemini"?e:null}import{randomUUID as oR}from"node:crypto";import nR from"node:path";var sR="NativeSoul activation verification marker";async function Io(e={}){let t=cR(e),r=te(t.projectCwd,e.home),o=await Ht({home:e.home,host:e.host??"all",surface:e.surface,targetRoot:e.targetRoot}),n=[];for(let c of o.hosts)n.push(await aR({home:o.home,inputHost:c,testCwd:t.projectCwd}));let s=await lR({home:e.home,testProject:`${r.id}-${oR()}`,apply:e.apply===!0,userConfirmed:e.userConfirmed===!0,retainTestData:e.retainTestData===!0}),a=[...new Set([...n.flatMap(c=>c.recommendations),...s.status==="failed"?["Review memory persistence and rerun verification."]:[]])],i=n.map(c=>c.status),l=uR(i,s.status);return{schema_version:1,home:o.home,target_root:o.target_root,host:e.host??"all",surface:e.surface??null,project:{requested_cwd:t.projectCwd,normalized:r.id,source:r.source,git_root:r.git_root,remote:r.remote,alias_key:r.alias_key},overall_status:l,memory_recall:s,hosts:n,recommendations:a}}async function aR(e){let t=[],r=await iR({home:e.home,host:e.inputHost.host,cwd:e.testCwd,warnings:e.inputHost.handshake.last?.warnings??[]});e.inputHost.mcp_registration.configured||t.push(`Install MCP registration for ${e.inputHost.host}: nativesoul mcp install --host ${e.inputHost.host} --apply --json`),r.status!=="ready"&&t.push(`Regenerate bootstrap context for ${e.inputHost.host}: nativesoul bootstrap --host ${e.inputHost.host} --cwd ${e.testCwd} --format inject --json`);let o=dR(e.inputHost.provider_parity.heartbeat),n=[...e.inputHost.full_native_evidence.missing_requirements];o==="unsupported"&&(n.includes("native_scheduler")||n.push("native_scheduler"),t.push(`Choose a host with native scheduler support or configure external scheduler workflow for ${e.inputHost.host}.`));let a=e.inputHost.provider_parity.heartbeat==="unsupported-native"&&e.inputHost.host!=="codex"?"blocked_by_host":r.status==="failed"||r.status==="degraded"||r.cache.status==="degraded"||r.cache.status==="missing"||!e.inputHost.plugin.enabled?"degraded":"ready";return{host:e.inputHost.host,surface:e.inputHost.surface,status:a,mcp:{configured:e.inputHost.mcp_registration.configured,issues:e.inputHost.mcp_registration.issues.map(i=>i.message)},bootstrap:r,heartbeat:{status:o,requirements:n},recommendations:t}}async function iR(e){let t=[...e.warnings],r=[],o="ready",n=!1,s="",a="ready";try{let i=await It({home:e.home,host:e.host,cwd:e.cwd,readOnly:!0});t.push(...i.warnings),i.warnings.some(l=>l.startsWith("HOST_ADAPTER_UNAVAILABLE")||l==="PROJECT_MEMORY_EMPTY")&&(a="degraded")}catch(i){t.push(`bootstrap_injection_failed:${Xi(i)}`),a="failed"}try{let i=await gi({home:e.home,host:e.host,projectCwd:e.cwd,recordTelemetry:!1});s=i.targetPath,n=i.stale,r.push(...i.warnings),r.length>0&&(o=i.warnings.some(l=>l==="BOOTSTRAP_CACHE_MISSING")?"missing":"degraded",a==="ready"&&(a="degraded"))}catch{r.push("bootstrap_cache_check_failed"),o="missing",a==="ready"&&(a="degraded")}return{status:a,warnings:t,cache:{status:o,warnings:r,targetPath:s,stale:n}}}async function lR(e){let t=[],r=null,o=!1,n=!1;try{let s=`verify-${e.testProject}`,a=`${sR} ${e.testProject}`;r=await ae(e.home,{project:s,content:a,confidence:.91,source:{host:"activation-verification",session_id:`verification-${e.testProject}`}});let i=await Pt(e.home,a,s,8),l=await Et({home:e.home,project:s,status:"candidate",limit:8}),c=i.some(d=>d.id===r?.id)||l.some(d=>d.id===r?.id);if(e.apply&&e.userConfirmed&&r){let d=await Rt(e.home,r.id);r=d,n=r.id===d.id&&r.status==="active"}if(!e.retainTestData&&r)try{r.status==="candidate"?await St(e.home,r.id):await At(e.home,r.id),o=!0}catch(d){t.push(`memory_cleanup_failed:${Xi(d)}`)}return{test_project:e.testProject,candidate_id:r?.id??"",candidate_status:r?.status??"candidate",recalled:c,promoted:n,status:c?"passed":"failed",warnings:t,cleanup_performed:o}}catch(s){return t.push(`memory_recall_check_failed:${Xi(s)}`),{test_project:e.testProject,candidate_id:r?.id??"",candidate_status:r?.status??"candidate",recalled:!1,promoted:!1,status:"failed",warnings:t,cleanup_performed:!1}}}function cR(e){return{projectCwd:nR.resolve(e.projectCwd??process.cwd())}}function dR(e){return e==="native"?"native":e==="official-fallback"?"official_fallback":"unsupported"}function uR(e,t){return e.includes("blocked_by_host")?"blocked_by_host":e.includes("degraded")||t==="failed"?"degraded":e.length>0?"ready":"degraded"}function Xi(e){return e instanceof Error?e.message:String(e)}async function em(e){let t=await v(e),r=_(t.database);try{r.integrityCheck()}finally{r.close()}return await h({home:t.home,type:"workspace_initialized",details:{createdDirectories:t.createdDirectories.length,createdFiles:t.createdFiles.length,preservedFiles:t.preservedFiles.length}}),t}function Jn(e){let t=f(e);if(!pR(t.database))return{home:t.home,initialized:!1,database:t.database,migrations:0,memories:0,events:0,capabilities:0,ledger:mR()};let r=_(t.database,{readOnly:!0});try{return{home:t.home,initialized:!0,database:t.database,...r.counts()}}finally{r.close()}}function mR(){return{hosts:0,sessions:0,memory_edges:0,commitments:0,standing_orders:0,capability_sources:0,capability_experience:0,schedules:0,leases:0,runs:0,work_items:0,work_item_events:0}}function m(e,t,r){t?process.stdout.write(`${JSON.stringify(gR(e),null,2)}
959
1056
  `):process.stdout.write(`${r}
960
- `)}function gw(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}async function ho(){if(process.stdin.isTTY)return"";let e=[];for await(let t of process.stdin)e.push(Buffer.isBuffer(t)?t:Buffer.from(String(t)));return Buffer.concat(e).toString("utf8")}function yo(e){let t=e.trim();if(t.length!==0)try{return JSON.parse(t)}catch{return t}}function Ju(e){if(typeof e=="string")return e;if(!e||Array.isArray(e)||typeof e!="object")return"";for(let t of["prompt","user_prompt","message","text","content"]){let r=e[t];if(typeof r=="string")return r}return""}function mi(e){if(e[0]==="--help"||e[0]==="-h")return{command:"help",rest:[],flags:new Map([["help",!0]])};let[t,...r]=e,o=[],a=new Map;for(let n=0;n<r.length;n+=1){let s=r[n];if(s)if(s==="-h")a.set("help",!0);else if(s.startsWith("--")){let i=s.slice(2),l=r[n+1];l&&!l.startsWith("--")?(a.set(i,l),n+=1):a.set(i,!0)}else o.push(s)}return{command:t,rest:o,flags:a}}function gi(e){return e.command==="help"||_(e.flags,"help")}function _(e,t){return e.get(t)===!0}function u(e,t){let r=e.get(t);return typeof r=="string"?r:void 0}function T(e,t){let r=u(e,t);if(!r)return;let o=Number(r);return Number.isFinite(o)?o:void 0}var mr=new Set(["codex","claude","grok","antigravity","gemini"]);function _o(e){let t=u(e,"host")??"all";if(t==="all"||mr.has(t))return t;throw new Error(`Unsupported adapter host: ${t}`)}function qu(e){let t=u(e,"host");if(t&&mr.has(t))return t;throw new Error("This command requires --host codex|claude|grok|antigravity|gemini")}function qe(e){if(_(e,"all-hosts"))return"all";let t=u(e,"host")??"all";if(t==="all"||mr.has(t))return t;throw new Error(`Unsupported install host: ${t}`)}function ke(e){let t=u(e,"surface");if(t!==void 0){if(t==="desktop"||t==="claude-desktop")return"claude-desktop";if(t==="claude-code")return"claude-code";throw new Error("install surface must be claude-code, desktop, or claude-desktop")}}function vo(e){let t=u(e,"host");if(t&&mr.has(t))return t;throw new Error("This command requires --host codex|claude|grok|antigravity|gemini")}function bo(e){let t=u(e,"host");if(t!==void 0){if(mr.has(t))return t;throw new Error("This command accepts --host codex|claude|grok|antigravity|gemini")}}function Ku(e){let t=u(e,"result");if(t!==void 0){if(t==="ok"||t==="error"||t==="blocked")return t;throw new Error("audit --result must be ok, error, or blocked")}}function Gu(e){let t=u(e,"status");if(t!==void 0){if(t==="pending"||t==="approved"||t==="rejected")return t;throw new Error("approvals --status must be pending, approved, or rejected")}}function Wu(e){let t=u(e,"format")??"json";if(t==="json"||t==="jsonl")return t;throw new Error("audit export --format must be json or jsonl")}function zu(e){let t=u(e,"status");if(t!==void 0){if(t==="open"||t==="completed"||t==="dismissed"||t==="expired")return t;throw new Error("commitments --status must be open, completed, dismissed, or expired")}}function Xu(e){let t=u(e,"status");if(t!==void 0){if(t==="active"||t==="archived"||t==="forgotten"||t==="all")return t;throw new Error("project list --status must be active, archived, forgotten, or all")}}function Yu(e){let t=u(e,"class");if(t==="read_local"||t==="probe_external"||t==="write_local"||t==="write_project"||t==="external_write"||t==="destructive"||t==="identity_policy_change")return t;throw new Error("policy evaluate requires --class read_local|probe_external|write_local|write_project|external_write|destructive|identity_policy_change")}function Aa(e){let t=u(e,"mode")??"leader";if(t==="leader"||t==="federated"||t==="per-project")return t;throw new Error("schedule --mode must be leader, federated, or per-project")}function Qu(e){let t=u(e,"host")??"generic";if(t==="generic"||mr.has(t))return t;throw new Error(`Unsupported MCP manifest host: ${t}`)}function fi(e){return vo(e)}function hi(e){let t=u(e,"command-mode")??"package";if(t==="package"||t==="local"||t==="absolute")return t;throw new Error(`Unsupported MCP command mode: ${t}`)}function Zu(e){let t=u(e,"format")??"json";if(t==="json"||t==="inject"||t==="cache")return t;throw new Error("bootstrap --format must be json, inject, or cache")}async function yi(e,t,r){let o=e.rest[0]??"status",a={home:t,host:qe(e.flags),surface:ke(e.flags),targetRoot:u(e.flags,"target-root")};if(o==="status"){let n=await pr(a);m(n,r,`Activation status: ${n.overall_status}`);return}if(o==="plan"){let n=await go({...a,profile:fw(e)});m(n,r,`Activation plan: ${n.plan.length} dry-run action(s)`);return}if(o==="heartbeat"){let n=e.rest[1]??"plan",s={home:t,host:qe(e.flags),surface:ke(e.flags),targetRoot:u(e.flags,"target-root"),leaderHost:hw(e),mode:Aa(e.flags),cadence:u(e.flags,"cadence"),projectScope:u(e.flags,"project")??u(e.flags,"project-scope"),behavior:yw(e),user_confirmed:_(e.flags,"user-confirmed")};if(n==="plan"){let i=await ka(s);m(i,r,i.recommended_leader?`Heartbeat leader recommended: ${i.recommended_leader.host}`:"Heartbeat native scheduler blocked by host");return}if(n==="apply"){let i=await ui({...s,dry_run:!_(e.flags,"apply")});m(i,r,i.applied?"Heartbeat activation applied":`Heartbeat activation ${i.action}`);return}throw new Error("activate heartbeat requires plan or apply")}throw new Error("activate requires status, plan, or heartbeat")}function fw(e){let t=u(e.flags,"profile");if(t!==void 0){if(t==="quickstart"||t==="advanced")return t;throw new Error("activate plan requires --profile quickstart|advanced")}}function hw(e){let t=u(e.flags,"leader-host");if(t!==void 0){if(t==="codex"||t==="claude"||t==="grok"||t==="antigravity"||t==="gemini")return t;throw new Error("activate heartbeat requires --leader-host codex|claude|grok|antigravity|gemini")}}function yw(e){let t=u(e.flags,"behavior");if(t!==void 0){if(t==="read_only"||t==="approval_required")return t;throw new Error("activate heartbeat requires --behavior read_only|approval_required")}}async function _i(e,t){let r=e.rest[0],o=_o(e.flags);if(r==="hot-scan"){let a=await yt({home:u(e.flags,"home"),host:o,delta:_(e.flags,"delta"),ttlSeconds:T(e.flags,"ttl-seconds")}),n=a.reduce((s,i)=>s+i.count,0);m(a,t,`Hot-scanned ${n} capability record(s)`);return}if(r==="scan"){let a=await wr(o);m(a,t,`Scanned ${a.length} adapter(s)`);return}if(r==="doctor"){let a=await Rr(o),n=a.reduce((s,i)=>s+i.diagnostics.length,0);m(a,t,`Adapter doctor found ${n} diagnostic(s)`);return}if(r==="managed-block"){let a=qu(e.flags),n=await kr(a);m(n,t,`Managed block preview for ${n.host}: ${n.targetPath}`);return}if(r==="install-managed-block"){let a=vo(e.flags),n=await Sr({home:u(e.flags,"home"),host:a,apply:_(e.flags,"apply"),targetPath:u(e.flags,"target")});m(n,t,`${n.dryRun?"Planned":"Applied"} managed block for ${n.host}: ${n.action}`);return}if(r==="rollback-managed-block"){let a=u(e.flags,"snapshot");if(!a)throw new Error("adapters rollback-managed-block requires --snapshot <path>");let n=await _n({home:u(e.flags,"home"),snapshotPath:a,apply:_(e.flags,"apply")});m(n,t,`${n.dryRun?"Planned rollback":"Rolled back"} managed block target ${n.targetPath}`);return}throw new Error("adapters requires scan, hot-scan, doctor, or managed-block")}async function vi(e,t,r){let o=e.rest[0];if(o==="list"){let a=ba({home:t,status:Gu(e.flags)});m(a,r,vw(a.approvals,a.warning));return}if(o==="show"){let a=e.rest[1]??u(e.flags,"id");if(!a)throw new Error("approvals show requires <id|.>");let n=a==="."?_w(t):va({home:t,id:a}).approval;m(n,r,n?bw(n):`Approval not found: ${a}`),n||(process.exitCode=1);return}if(o==="approve"){let a=e.rest[1]??u(e.flags,"id");if(!a)throw new Error("approvals approve requires <id>");let n=va({home:t,id:a}).approval;if(!n){m({approval:null,applied:!1,action:"approve",warning:"approval_not_found"},r,`Approval not found: ${a}`),process.exitCode=1;return}if(!_(e.flags,"confirm")){m({approval:n,applied:!1,action:"approve",warning:"requires --confirm"},r,`Approval approve dry-run: ${n.id} (${n.action}); rerun with --confirm to apply.`);return}let s=await lr({home:t,id:a,status:"approved",reviewer:"cli",reason:u(e.flags,"reason")??null});m(s.approval,r,s.approval?`Approval approved: ${s.approval.id}`:`Approval not found: ${a}`),s.approval||(process.exitCode=1);return}if(o==="reject"){let a=e.rest[1]??u(e.flags,"id"),n=u(e.flags,"reason");if(!a||!n)throw new Error("approvals reject requires <id> --reason <text>");let s=await lr({home:t,id:a,status:"rejected",reviewer:"cli",reason:n});m(s.approval,r,s.approval?`Approval rejected: ${s.approval.id}`:`Approval not found: ${a}`),s.approval||(process.exitCode=1);return}throw new Error("approvals requires list, show, approve, or reject")}function _w(e){return ba({home:e,status:"pending"}).approvals[0]??null}function vw(e,t){return t?`Approvals unavailable: ${t}`:e.length===0?"No approvals found":[`${e.length} approval(s)`,...e.map(r=>`${r.id} ${r.action} ${r.class} ${r.target??"-"} ${r.status} ${r.reviewer??"-"} ${r.created_at}`)].join(`
961
- `)}function bw(e){return[`Approval ${e.id}`,`Action: ${e.action}`,`Class: ${e.class}`,`Target: ${e.target??"-"}`,`Project: ${e.project??"-"}`,`Host: ${e.host??"-"}`,`Status: ${e.status}`,`Reviewer: ${e.reviewer??"-"}`,`Reason: ${e.reason??"-"}`,`Created: ${e.created_at}`,`Decided: ${e.decided_at??"-"}`].join(`
962
- `)}async function bi(e,t,r){let o=e.rest[0],a={home:t,type:u(e.flags,"type"),result:Ku(e.flags),limit:T(e.flags,"limit")};if(o==="list"){let n=await Io(a);m(n,r,`${n.length} audit event(s)`);return}if(o==="export"){let n=Wu(e.flags),s=await Ya({...a,format:n});if(n==="jsonl"){process.stdout.write(s.events.map(i=>JSON.stringify(i)).join(`
963
- `)),s.events.length>0&&process.stdout.write(`
964
- `);return}process.stdout.write(`${JSON.stringify(s.events,null,2)}
965
- `);return}throw new Error("audit requires list or export")}async function wi(e,t,r){let o=e.rest[0];if(o==="refresh"){let a=await yt({home:t,host:_o(e.flags),delta:_(e.flags,"delta"),ttlSeconds:T(e.flags,"ttl-seconds")}),n=a.reduce((s,i)=>s+i.count,0);m(a,r,`Refreshed ${n} capability record(s)`);return}if(o==="learn"){let a=await Rn({home:t,host:_o(e.flags),limit:T(e.flags,"limit")});m(a,r,`Learned ${a.generated} capability card(s), changed ${a.changed}`);return}if(o==="list"){let a=await be({home:t,host:bo(e.flags),readyOnly:_(e.flags,"ready-only"),limit:T(e.flags,"limit")});m(a,r,`${a.length} capability record(s)`);return}if(o==="search"){let a=e.rest.slice(1).join(" ")||(u(e.flags,"query")??""),n=await Er({home:t,query:a,host:_(e.flags,"all-hosts")?void 0:bo(e.flags)??"codex",readyOnly:_(e.flags,"ready-only"),limit:T(e.flags,"limit")});m(n,r,`${n.length} capability record(s) found`);return}if(o==="show"){let a=e.rest[1]??u(e.flags,"uid");if(!a)throw new Error("capabilities show requires <uid> or --uid <uid>");let n=await xr({home:t,uid:a});if(!n)throw new Error(`Capability not found: ${a}`);m(n,r,`Capability ${n.uid}: ready=${n.ready}`);return}throw new Error("capabilities requires refresh, learn, list, search, or show")}async function Ri(e,t,r){let o=e.rest[0];if(o==="create"){let a=u(e.flags,"summary")??u(e.flags,"text");if(!a)throw new Error("commitments create requires --summary <text>");let n=u(e.flags,"project")??D(process.cwd(),t),s=await jr({home:t,project:n,summary:a,dueAt:u(e.flags,"due-at")??null,ttlSeconds:T(e.flags,"ttl-seconds")});m(s,r,s.created?`Commitment created: ${s.commitment.id}`:`Commitment deduped: ${s.commitment.id}`);return}if(o==="list"){let a=await Tr({home:t,project:u(e.flags,"project"),status:zu(e.flags),includeExpired:_(e.flags,"include-expired"),limit:T(e.flags,"limit")});m(a,r,`${a.length} commitment(s)`);return}if(o==="complete"||o==="dismiss"){let a=e.rest[1]??u(e.flags,"id");if(!a)throw new Error(`commitments ${o} requires <id> or --id <id>`);let n=o==="complete"?await Cr(t,a):await kn(t,a);m(n,r,`Commitment ${o}d: ${n.id}`);return}throw new Error("commitments requires create, list, complete, or dismiss")}async function ki(e,t,r){let o=e.rest[0];if(o==="data"){let a=await lo({home:t,project:u(e.flags,"project"),host:u(e.flags,"host"),limit:T(e.flags,"limit"),since:u(e.flags,"since"),until:u(e.flags,"until")});m(a,r,`Dashboard data ready: ${a.initialized?"initialized":"not initialized"}`);return}if(o==="viewer"){let a=await Js({home:t,project:u(e.flags,"project"),host:u(e.flags,"host"),limit:T(e.flags,"limit"),since:u(e.flags,"since"),until:u(e.flags,"until"),output:u(e.flags,"output")});m(a,r,`Dashboard viewer written: ${a.outputPath}`);return}throw new Error("dashboard requires data or viewer")}async function Si(e,t,r){let o=e.rest[0];if(o==="m7"||o==="report"){let a=await ir({home:t,project:u(e.flags,"project"),host:u(e.flags,"host"),limit:T(e.flags,"limit")});m(a,r,a.m7_gate.feedback_validated?"M7 feedback report ready":"M7 feedback report has gaps");return}throw new Error("feedback requires m7 or report")}async function Ai(e,t,r){let o=e.rest[0];if(o==="claim"){let a=u(e.flags,"slot")??e.rest[1];if(!a)throw new Error("heartbeat claim requires --slot <id>");let n=u(e.flags,"project")??D(process.cwd(),t),s=u(e.flags,"host")??"codex",i=await uo({home:t,slot:a,host:s,project:n,ttlSeconds:T(e.flags,"ttl-seconds")});m(i,r,i.claimed?`Heartbeat lease claimed: ${i.lease.id}`:"HEARTBEAT_OK");return}if(o==="complete"){let a=u(e.flags,"slot")??e.rest[1];if(!a)throw new Error("heartbeat complete requires --slot <id>");let n=u(e.flags,"project")??D(process.cwd(),t),s=u(e.flags,"host")??"codex",i=await po({home:t,slot:a,host:s,project:n,result:u(e.flags,"result")??"HEARTBEAT_OK",evidence:u(e.flags,"evidence")?{note:u(e.flags,"evidence")??""}:{}});m(i,r,`Heartbeat completed: ${i.lease.id}`);return}if(o==="status"){let a=await Ks({home:t,project:u(e.flags,"project"),limit:T(e.flags,"limit")});m(a,r,`${a.length} heartbeat lease(s)`);return}throw new Error("heartbeat requires claim, complete, or status")}async function Pi(e,t,r){let o=e.rest[0];if(o==="reconcile"){let a=vo(e.flags),n=u(e.flags,"target-root"),s=await nt({home:t,host:a,surface:ke(e.flags),mode:Aa(e.flags),apply:_(e.flags,"apply"),hostConfigRoot:n?Be(a,n):void 0,targetRoot:n});m(s,r,s.applied?`Schedule reconciled: ${s.schedule.id}`:`Schedule reconcile planned: ${s.schedule.id}`);return}if(o==="list"){let a=await Qr({home:t,host:bo(e.flags),limit:T(e.flags,"limit")});m(a,r,`${a.length} schedule record(s)`);return}if(o==="disable"){let a=e.rest[1]??u(e.flags,"id");if(!a)throw new Error("schedule disable requires <id> or --id <id>");let n=await ms({home:t,id:a,apply:_(e.flags,"apply")});m(n,r,n.applied?`Schedule disabled: ${a}`:`Schedule disable planned: ${a}`);return}throw new Error("schedule requires reconcile, list, or disable")}async function Ei(e,t,r){if(e.rest[0]==="openclaw"){let n=u(e.flags,"source")??e.rest[1];if(!n)throw new Error("import openclaw requires --source <path>");let s=await bs({home:t,sourcePath:n,cwd:u(e.flags,"cwd")??process.cwd(),project:u(e.flags,"project"),apply:_(e.flags,"apply"),limit:T(e.flags,"limit")});m(s,r,s.applied?`OpenClaw import applied: ${s.persisted_memories.length} candidate(s), ${s.warnings.length} warning(s)`:`OpenClaw import dry-run: ${s.mapped_records.length} mapped, ${s.skipped_records.length} skipped, ${s.warnings.length} warning(s)`);return}let a=ww(e);if(a){let n=u(e.flags,"source")??e.rest[1];if(!n)throw new Error("import native requires --source <path>");let s=await Ss({home:t,host:a,sourcePath:n,cwd:u(e.flags,"cwd")??process.cwd(),project:u(e.flags,"project"),apply:_(e.flags,"apply"),limit:T(e.flags,"limit")});m(s,r,s.applied?`${a} import applied: ${s.persisted_memories.length} candidate(s), ${s.warnings.length} warning(s), ${s.conflicts.length} conflict(s)`:`${a} import dry-run: ${s.mapped_records.length} mapped, ${s.skipped_records.length} skipped, ${s.conflicts.length} conflict(s), ${s.warnings.length} warning(s)`);return}throw new Error("import requires openclaw, native --host <host>, or a supported host alias")}function ww(e){let t=e.rest[0],r=t==="native"?u(e.flags,"host"):t;return r==="nativesoul"||r==="codex"||r==="claude"||r==="gemini"||r==="grok"||r==="antigravity"?r:null}import{spawnSync as Rw}from"node:child_process";async function xi(e,t,r){let[o,a]=e.rest;if(o==="activate"){if(!a)throw new Error("license activate requires a license key");let n=await Es({home:t,key:a}),s=n.ok?{ok:!0,action:"activate",license:wo(n.license),message:"License activated via Dodo"}:{ok:!1,action:"activate",reason:n.reason,license:wo(n.license),message:`License activation failed: ${n.reason}`};m(s,r,s.message??"License activated via Dodo"),s.ok||(process.exitCode=1);return}if(o==="status"){let n=await Re(t),s=n?kw(n):se,i=await Aw(e),l=await Ns({home:t,currentVersion:Ot,latestKnownVersion:i}),c={ok:!0,action:"status",license:wo(s),update_entitlement:l,message:Pw(s,l,_(e.flags,"check-updates"))};m(c,r,c.message??`License status: ${s.state}`);return}if(o==="deactivate"){let n=await js({home:t}),s=n.ok?{ok:!0,action:"deactivate",license:wo(n.license),message:"License deactivated via Dodo; local NativeSoul data was not removed"}:{ok:!1,action:"deactivate",reason:n.reason,license:wo(n.license),message:`License deactivation failed: ${n.reason}`};m(s,r,s.message??"License deactivated via Dodo; local NativeSoul data was not removed"),s.ok||(process.exitCode=1);return}throw new Error("license requires activate, status, or deactivate")}function kw(e){return{state:e.state,license_key:e.license_key,instance_id:e.instance_id,purchased_at:e.purchased_at??null,version_at_activation:e.version_at_activation??null,updates_until:e.updates_until,last_checked_at:e.last_checked_at,source:e.source}}function wo(e){return{...e,license_key:e.license_key?Sw(e.license_key):null}}function Sw(e){return e.length<=8?"[REDACTED_LICENSE_KEY]":`${e.slice(0,4)}\u2026${e.slice(-4)}`}async function Aw(e){let t=u(e.flags,"latest-known-version");if(t)return t;if(!_(e.flags,"check-updates"))return;let r=process.platform==="win32"?"npm.cmd":"npm",o=Rw(r,["view","nativesoul","version","--registry=https://registry.npmjs.org/"],{encoding:"utf8",timeout:15e3,shell:process.platform==="win32"});if(o.status===0)return o.stdout.trim()||void 0}function Pw(e,t,r){let o=t.updates_status==="unknown"?"unknown":t.updates_until??"unknown",a=t.newer_major_available==="unknown"?r?"unknown":"unknown \u2014 run with `--check-updates`":t.newer_major_available?"available":"not detected",n=[`License status: ${e.state}`,e.state==="licensed"?"Perpetual build: active \u2014 your licence keeps working.":"Perpetual build: unavailable until activated.",`Updates window: ${o}`,`Newer major: ${a}`];return t.soft_nudge.visible&&t.soft_nudge.message&&n.push(t.soft_nudge.message),n.join(`
966
- `)}async function ji(e,t,r){let o=await Is({page:u(e.flags,"page")});m(o,r,o.ok?`Marketing audit PASS: ${o.summary.claims_checked} claim(s), ${o.summary.pages_scanned} page(s)`:`Marketing audit FAIL: ${o.issues.length} issue(s)`),o.ok||(process.exitCode=1)}var ep={life_activation_status:async(e,t)=>await pr({home:t,host:Ti(e.host),targetRoot:ut(e.target_root)??ut(e.targetRoot)}),life_activation_plan:async(e,t)=>await go({home:t,host:Ti(e.host),targetRoot:ut(e.target_root)??ut(e.targetRoot),profile:Ew(e.profile)}),life_activation_verify:async(e,t)=>await fo({home:t,host:Ti(e.host),surface:xw(e.surface),targetRoot:ut(e.target_root)??ut(e.targetRoot),projectCwd:ut(e.project_cwd)??ut(e.projectCwd),apply:Ci(e.apply),userConfirmed:Ci(e["user-confirmed"]),retainTestData:Ci(e["retain-test-data"])})},tp=[{name:"life_activation_status",description:"Return activation status by component, including bootstrap, MCP, plugins/hooks, heartbeat, recall, memory, and cross-host verification.",inputSchema:{type:"object",properties:{host:{type:"string"},target_root:{type:"string"},targetRoot:{type:"string"}}}},{name:"life_activation_plan",description:"Return a read-only dry-run activation plan with exact files, settings, scheduler actions, and approvals.",inputSchema:{type:"object",properties:{host:{type:"string"},profile:{type:"string"},target_root:{type:"string"},targetRoot:{type:"string"}}}},{name:"life_activation_verify",description:"Run cross-host activation verification for bootstrap cache, MCP, scheduler evidence, and memory recall.",inputSchema:{type:"object",properties:{host:{type:"string"},surface:{type:"string"},project_cwd:{type:"string"},projectCwd:{type:"string"},target_root:{type:"string"},targetRoot:{type:"string"},apply:{type:"boolean"},"user-confirmed":{type:"boolean"},"retain-test-data":{type:"boolean"}}}}];function Ti(e){if(e===void 0)return"all";if(e==="all"||e==="codex"||e==="claude"||e==="grok"||e==="antigravity"||e==="gemini")return e;throw new Error("Invalid activation host")}function Ew(e){if(e!==void 0){if(e==="quickstart"||e==="advanced")return e;throw new Error("Invalid activation profile")}}function xw(e){if(e!==void 0){if(e==="desktop"||e==="claude-desktop")return"claude-desktop";if(e==="claude-code")return"claude-code";throw new Error("activation verify surface must be claude-code, desktop, or claude-desktop")}}function ut(e){return typeof e=="string"?e:void 0}function Ci(e){return e===!0}var jw=["2025-11-25","2024-11-05","2024-10-07"],ap={...ep,life_status:(e,t)=>Sa(t),life_bootstrap:async(e,t)=>await Ow({home:t,host:L(e.host,"codex"),cwd:L(e.cwd,process.cwd()),query:Oe(e.query)}),life_recall:async(e,t)=>await kt(t,L(e.query,""),L(e.project,"default"),Ii(e.limit,5)),life_remember_propose:async(e,t)=>await te(t,{project:L(e.project,"default"),content:L(e.content,""),type:Oe(e.type),confidence:rp(e.confidence),source:{host:"mcp",session_id:"local"}}),life_memory_promote:async(e,t)=>await vt(t,L(e.id,"")),life_memory_reject:async(e,t)=>await bt(t,L(e.id,"")),life_memory_forget:async(e,t)=>await wt(t,L(e.id,"")),life_memory_expire:async(e,t)=>await Lr(t,L(e.id,"")),life_capability_search:async(e,t)=>await Er({home:t,query:L(e.query,""),host:Lw(e)?void 0:Oe(e.host)??"codex",readyOnly:gr(e.readyOnly,!1),limit:Ii(e.limit,8)}),life_capability_status:async(e,t)=>{let r=L(e.uid,""),o=r?await xr({home:t,uid:r}):null;if(!o)throw new Error(`Capability not found: ${r}`);return o},life_policy_evaluate:async(e,t)=>await lt({home:t,action:L(e.action,""),className:op(e.class),target:Oe(e.target)}),life_approval_request:async(e,t)=>await Fw({home:t,action:L(e.action,""),className:op(e.class),target:Oe(e.target),project:Oe(e.project),host:Oe(e.host)}),life_approval_decide:async(e,t)=>{let r=L(e.id,""),o=await lr({home:t,id:r,status:$w(e.status),reviewer:L(e.host,"mcp"),reason:Oe(e.reason)??null});if(!o.approval)throw new Error(`Approval not found: ${r}`);return o},life_commitment_create:async(e,t)=>await jr({home:t,project:L(e.project,"default"),summary:L(e.summary,""),dueAt:Oe(e.due_at),ttlSeconds:rp(e.ttl_seconds),source:{host:"mcp",session_id:"local"}}),life_commitment_complete:async(e,t)=>await Cr(t,L(e.id,"")),life_heartbeat_claim:async(e,t)=>await uo({home:t,slot:L(e.slot,""),host:L(e.host,"codex"),project:L(e.project,"default"),ttlSeconds:Ii(e.ttl_seconds,1500)}),life_heartbeat_complete:async(e,t)=>await po({home:t,slot:L(e.slot,""),host:L(e.host,"codex"),project:L(e.project,"default"),result:e.result??"HEARTBEAT_OK",evidence:e.evidence??{}}),life_onboarding_status:async(e,t)=>await Fr(t),life_onboard_apply:async(e,t)=>await Ur({home:t,dry_run:gr(e.dry_run,!0),user_confirmed:gr(e.user_confirmed,!1),files:Hw(e.files),config_patch:Dw(e.config_patch)}),life_onboard_complete:async(e,t)=>await Vr({home:t,archive:e.archive===void 0?!0:gr(e.archive,!0)})},Tw=new Set(Object.keys(ap));function Cw(e){return e.method?.startsWith("notifications/")?!0:!Object.prototype.hasOwnProperty.call(e,"id")}async function Ea(e,t){if(Cw(e))return null;let r=e.id??null;try{if(e.method==="initialize"){let o=Ro(e.params),a=Oe(o.protocolVersion),n=a&&jw.includes(a)?a:"2024-11-05";return Ke(r,{protocolVersion:n,serverInfo:{name:"nativesoul",version:"0.1.0"},capabilities:{tools:{}}})}if(e.method==="ping")return Ke(r,{});if(e.method==="resources/list")return Ke(r,{resources:[]});if(e.method==="prompts/list")return Ke(r,{prompts:[]});if(e.method==="tools/list")return Ke(r,{tools:[{name:"life_status",description:"Return local NativeSoul health and counts.",inputSchema:{type:"object"}},{name:"life_bootstrap",description:"Return compact bootstrap context for a host and cwd.",inputSchema:{type:"object",required:["host","cwd"],properties:{host:{type:"string"},cwd:{type:"string"},query:{type:"string"}}}},{name:"life_recall",description:"Search project-scoped memory.",inputSchema:{type:"object",required:["query","project"],properties:{query:{type:"string"},project:{type:"string"},limit:{type:"number"}}}},{name:"life_remember_propose",description:"Create a redacted local candidate memory for a project.",inputSchema:{type:"object",required:["project","content"],properties:{project:{type:"string"},content:{type:"string"},type:{type:"string"},confidence:{type:"number"}}}},{name:"life_memory_promote",description:"Promote a candidate memory to active status.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_memory_reject",description:"Reject a candidate memory.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_memory_forget",description:"Forget an active memory.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_memory_expire",description:"Expire an active memory.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_capability_search",description:"Search persisted local capability records.",inputSchema:{type:"object",required:["query"],properties:{query:{type:"string"},host:{type:"string"},allHosts:{type:"boolean"},all_hosts:{type:"boolean"},readyOnly:{type:"boolean"},limit:{type:"number"}}}},{name:"life_capability_status",description:"Return one persisted capability record by uid.",inputSchema:{type:"object",required:["uid"],properties:{uid:{type:"string"}}}},{name:"life_policy_evaluate",description:"Evaluate a proposed action against local policy and standing orders.",inputSchema:{type:"object",required:["action","class"],properties:{action:{type:"string"},class:{type:"string"},target:{type:"string"}}}},{name:"life_approval_request",description:"Request approval for a sensitive action. If blocked, stop and return control to the human; there is no server or polling in this turn-based protocol.",inputSchema:{type:"object",required:["action","class"],properties:{action:{type:"string"},class:{type:"string"},target:{type:"string"},project:{type:"string"},host:{type:"string"}}}},{name:"life_approval_decide",description:"Record a human-driven approval decision. Acting agents must not self-approve; use this only from a human-operated host turn.",inputSchema:{type:"object",required:["id","status"],properties:{id:{type:"string"},status:{type:"string",enum:["approved","rejected"]},reason:{type:"string"},host:{type:"string"}}}},{name:"life_commitment_create",description:"Create a local project-scoped commitment with optional TTL.",inputSchema:{type:"object",required:["project","summary"],properties:{project:{type:"string"},summary:{type:"string"},due_at:{type:"string"},ttl_seconds:{type:"number"}}}},{name:"life_commitment_complete",description:"Complete a local commitment by id.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_heartbeat_claim",description:"Claim a local heartbeat lease for a project and slot.",inputSchema:{type:"object",required:["slot","host","project"],properties:{slot:{type:"string"},host:{type:"string"},project:{type:"string"},ttl_seconds:{type:"number"}}}},{name:"life_heartbeat_complete",description:"Complete a local heartbeat lease and record a run.",inputSchema:{type:"object",required:["slot","host","project"],properties:{slot:{type:"string"},host:{type:"string"},project:{type:"string"},result:{type:"string"},evidence:{type:"object"}}}},{name:"life_onboarding_status",description:"Return onboarding ritual status, interview themes, and file_generation_rules (IDENTITY/SOUL/USER/AGENTS formats). Call before drafting files.",inputSchema:{type:"object"}},...tp,{name:"life_onboard_apply",description:"Dry-run or apply AI-generated onboarding human files.",inputSchema:{type:"object",required:["files"],properties:{dry_run:{type:"boolean"},user_confirmed:{type:"boolean"},files:{type:"object"},config_patch:{type:"object"}}}},{name:"life_onboard_complete",description:"Archive BOOTSTRAP.md and mark onboarding ritual complete.",inputSchema:{type:"object",properties:{archive:{type:"boolean"}}}}]});if(e.method==="tools/call"){let o=await rr(t);if(!o.ok)return Ke(r,o);let a=Mw(e.params);return Ke(r,await Nw(a.name??"",a.arguments??{},t))}if(Tw.has(e.method)){let o=await rr(t);return o.ok?Ke(r,await sp(e.method,Ro(e.params),t)):Ke(r,o)}return Pa(r,-32601,`Unknown method: ${e.method}`)}catch(o){return o instanceof _t?Pa(r,-32010,o.message,{code:o.code,id:o.id,from:o.from,to:o.to}):o instanceof Ee?Pa(r,-32011,o.message,{code:o.code,id:o.id,status:o.status}):Pa(r,-32603,o instanceof Error?o.message:"Unknown MCP error")}}async function np(e){let t="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>{t+=r;let o=t.split(/\r?\n/u);t=o.pop()??"";for(let a of o){let n=a.trim();n&&Iw(n,e).catch(s=>{process.stderr.write(`NativeSoul MCP response error: ${Uw(s)}
967
- `)})}})}async function Iw(e,t){let r;try{r=JSON.parse(e)}catch{process.stdout.write(`${JSON.stringify({jsonrpc:"2.0",id:null,error:{code:-32700,message:"Parse error"}})}
968
- `);return}let o=await Ea(r,t);o&&process.stdout.write(`${JSON.stringify(o)}
969
- `)}async function Nw(e,t,r){let o=await sp(e,t,r);return{content:[{type:"text",text:JSON.stringify(o)}]}}async function sp(e,t,r){let o=ap[e];if(!o)throw new Error(`Unknown tool: ${e}`);return await o(t,r)}async function Ow(e){try{let t=await Pt({...e,readOnly:!0});try{await Te({home:e.home,host:e.host,outcome:"succeeded",tier:"B",cwd:t.project.cwd,project:t.project.id,tokensUsed:t.context_budget.tokens_used,tokensMax:t.context_budget.tokens_max,source:"mcp-life-bootstrap",warnings:t.warnings})}catch{}return t}catch(t){try{await Te({home:e.home,host:e.host,outcome:"failed",tier:"B",cwd:e.cwd,project:null,source:"mcp-life-bootstrap",error:t})}catch{}throw t}}function Ke(e,t){return{jsonrpc:"2.0",id:e,result:t}}function Pa(e,t,r,o){return{jsonrpc:"2.0",id:e,error:o===void 0?{code:t,message:r}:{code:t,message:r,data:o}}}function Mw(e){return Ro(e)}function Ro(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function L(e,t){return typeof e=="string"?e:t}function Oe(e){return typeof e=="string"?e:void 0}function Ii(e,t){return typeof e=="number"?e:t}function rp(e){return typeof e=="number"?e:void 0}function gr(e,t){return typeof e=="boolean"?e:t}function Lw(e){return gr(e.allHosts,!1)||gr(e.all_hosts,!1)}function Hw(e){let t=Ro(e),r={};for(let[o,a]of Object.entries(t))typeof a=="string"&&(r[o]=a);return r}function Dw(e){let r=Ro(e).hosts;if(!Array.isArray(r))return;let o=r.filter(a=>typeof a=="string");return o.length>0?{hosts:o}:void 0}function op(e){if(e==="read_local"||e==="probe_external"||e==="write_local"||e==="write_project"||e==="external_write"||e==="destructive"||e==="identity_policy_change")return e;throw new Error("Invalid policy action class")}function $w(e){if(e==="approved"||e==="rejected")return e;throw new Error("life_approval_decide status must be approved or rejected")}async function Fw(e){let t=await ti(e),r=t.approval?.id??null;return t.evaluation.decision==="approval_required"?{blocked:!0,allowed:!1,decision:"approval_required",approval_id:r,approval_created:t.approval_created,wait:"human",instruction:r?`approval ${r} pending - run: nativesoul approvals approve ${r} --confirm`:"approval pending but unavailable - inspect NativeSoul approval storage",warning:t.warning}:t.evaluation.decision==="allowed"?{blocked:!1,allowed:!0,decision:"allowed",approval_id:t.approval?.id??null,approval_status:t.approval?.status??null,warning:t.warning}:t.evaluation.decision==="proposal_required"?{blocked:!1,allowed:!1,decision:"proposal_required",approval_id:null,instruction:"use the existing SOUL.md/POLICY.md proposal flow; approvals do not cover protected human files",warning:t.warning}:{blocked:!1,allowed:!1,decision:"denied",approval_id:null,instruction:"stop; denied actions are not approvable through Approval Gate",warning:t.warning}}function Uw(e){return e instanceof Error?e.message:"Unknown MCP response error"}async function Ni(e,t,r){let o=e.rest[0];if(!o){await np(t);return}if(o==="manifest"){let a=Tt({host:Qu(e.flags),commandMode:hi(e.flags),home:t,projectRoot:u(e.flags,"project-root")});m(a,r,`MCP manifest generated for ${a.host}`);return}if(o==="smoke"){let a=await Ea({jsonrpc:"2.0",id:1,method:"initialize"},t),n=await Ea({jsonrpc:"2.0",id:2,method:"life_status"},t),s={ok:a!==null&&n!==null&&"result"in a&&"result"in n,initialize:a,status:n};m(s,r,s.ok?"MCP smoke passed":"MCP smoke failed");return}if(o==="install"){let a=await Xr({home:t,host:fi(e.flags),targetPath:u(e.flags,"target"),apply:_(e.flags,"apply"),commandMode:hi(e.flags),projectRoot:u(e.flags,"project-root")});m(a,r,`${a.dryRun?"Planned":"Applied"} MCP registration for ${a.host}: ${a.action}`);return}if(o==="rollback"){let a=u(e.flags,"snapshot");if(!a)throw new Error("mcp rollback requires --snapshot <path>");let n=await ps({home:t,snapshotPath:a,apply:_(e.flags,"apply")});m(n,r,`${n.dryRun?"Planned rollback":"Rolled back"} MCP target ${n.targetPath}`);return}if(o==="doctor"){let a=await Yr({host:fi(e.flags),targetPath:u(e.flags,"target")});m(a,r,a.configured?`MCP configured for ${a.host}`:`MCP not configured for ${a.host}`);return}throw new Error("mcp requires manifest, smoke, install, rollback, doctor, or stdio mode with no subcommand")}async function Oi(e,t,r){let o=e.rest[0];if(o==="flush-hook"){let a=u(e.flags,"text")?"":await ho(),n=yo(a),s=u(e.flags,"text")??(typeof n=="string"?n:void 0),i=await In({home:t,host:u(e.flags,"host")??"codex",cwd:u(e.flags,"cwd")??process.cwd(),event:u(e.flags,"event")??e.rest[1],text:s,payload:typeof n=="string"?void 0:n});m(i,r,`Memory candidate proposed from ${i.host} ${i.event}: ${i.memory.id}`);return}if(o==="recall-hook"){let a=u(e.flags,"prompt")?"":await ho(),n=yo(a),s=u(e.flags,"prompt")??Ju(n),i=await Nn({home:t,host:u(e.flags,"host")??"codex",cwd:u(e.flags,"cwd")??process.cwd(),prompt:s,limit:T(e.flags,"limit")});m(i,r,i.context||`Memory recall skipped: ${i.decision.reason}`);return}if(o==="index"){let a=await Tn({home:t,limit:T(e.flags,"limit")});m(a,r,`Semantic index updated: ${a.indexed_count} indexed, ${a.skipped_unchanged} unchanged`);return}if(o==="reflect"){let a=await ys({home:t,cwd:u(e.flags,"cwd")??process.cwd(),project:u(e.flags,"project"),limit:T(e.flags,"limit"),apply:_(e.flags,"apply")});m(a,r,a.applied?`Reflection report applied: ${a.proposals.length} proposal(s), ${a.report_path}`:a.report);return}if(o==="add"){let a=u(e.flags,"text");if(!a)throw new Error("memory add requires --text");let n=u(e.flags,"project")??u(e.flags,"scope")??D(process.cwd(),t),s=await Cn(t,{content:a,project:n});m(s,r,`Memory added: ${s.id}`);return}if(o==="propose"){let a=u(e.flags,"text");if(!a)throw new Error("memory propose requires --text");let n=u(e.flags,"project")??u(e.flags,"scope")??D(process.cwd(),t),s=await te(t,{content:a,project:n});m(s,r,`Memory proposed: ${s.id}`);return}if(o==="promote"||o==="reject"||o==="forget"||o==="expire"){let a=e.rest[1]??u(e.flags,"id");if(!a)throw new Error(`memory ${o} requires <id> or --id <id>`);let n=o==="promote"?await vt(t,a):o==="reject"?await bt(t,a):o==="forget"?await wt(t,a):await Lr(t,a);m(n,r,`Memory ${o}d: ${n.id}`);return}if(o==="export"){let a=u(e.flags,"project")??u(e.flags,"scope"),n=await Rt({home:t,project:a,includeForgotten:_(e.flags,"include-forgotten"),limit:T(e.flags,"limit")});m(n,r,`${n.length} memor${n.length===1?"y":"ies"} exported`);return}if(o==="search"){let a=e.rest.slice(1).join(" ")||(u(e.flags,"query")??""),n=u(e.flags,"project")??D(process.cwd(),t),s=T(e.flags,"limit")??5,i=await kt(t,a,n,s);m(i,r,`${i.length} memor${i.length===1?"y":"ies"} found`);return}throw new Error("memory requires add, propose, flush-hook, recall-hook, index, reflect, promote, reject, forget, expire, export, or search")}async function Mi(e,t,r){let o=e.rest[0];if(o==="list"){let a=await Mn({home:t,status:Xu(e.flags),limit:T(e.flags,"limit")});m(a,r,Vw(a.projects,a.warning));return}if(o==="show"){let a=e.rest[1]??u(e.flags,"id");if(!a)throw new Error("project show requires <id|.>");let n=await Ln({home:t,id:a,cwd:u(e.flags,"cwd")??process.cwd()});m(n,r,Bw(n)),n.registry_available&&!n.registry&&(process.exitCode=1);return}if(o==="rename"){let a=e.rest[1]??u(e.flags,"id"),n=u(e.flags,"name");if(!a||!n)throw new Error("project rename requires <id|.> --name <display>");let s=await Hn({home:t,id:a,name:n,cwd:u(e.flags,"cwd")??process.cwd()});m(s,r,s.found?`Project renamed: ${s.id} -> ${s.new_name}`:`Project not found: ${s.id}`),s.found||(process.exitCode=1);return}if(o==="alias"){let a=e.rest[1];if(a==="list"){let n=await Fn({home:t});m(n,r,Object.keys(n.aliases).length===0?"No project aliases":qw(n.aliases));return}if(a==="add"){let n=e.rest[2],s=u(e.flags,"as");if(!n||!s)throw new Error("project alias add requires <id> --as <custom-id>");let i=await Un({home:t,id:n,alias:s,apply:_(e.flags,"apply")});m(i,r,ip(i));return}if(a==="remove"){let n=e.rest[2]??u(e.flags,"as");if(!n)throw new Error("project alias remove requires <custom-id>");let s=await Vn({home:t,alias:n,apply:_(e.flags,"apply")});m(s,r,ip(s));return}throw new Error("project alias requires add, remove, or list")}if(o==="forget"){let a=e.rest[1]??u(e.flags,"id");if(!a)throw new Error("project forget requires <id>");let n=await Dn({home:t,id:a,includeMemories:_(e.flags,"include-memories"),apply:_(e.flags,"apply"),confirm:u(e.flags,"confirm")});m(n,r,Kw(n)),(!n.found||n.mode==="forget_memories"&&!n.guard_ok)&&(process.exitCode=1);return}if(o==="reactivate"){let a=e.rest[1]??u(e.flags,"id");if(!a)throw new Error("project reactivate requires <id>");let n=await $n({home:t,id:a});m(n,r,Gw(n)),n.found||(process.exitCode=1);return}if(o==="pin"){let a=u(e.flags,"cwd")??process.cwd(),n=await An({cwd:a,home:t,apply:_(e.flags,"apply")});m(n,r,n.applied?`Project marker pinned at ${n.marker_path} (${n.base_id})`:`Project pin dry-run: would write ${n.marker_path} (${n.base_id})`);return}throw new Error("project requires list, show, rename, alias, forget, reactivate, or pin")}function Vw(e,t){if(t)return`Project registry unavailable: ${t}`;if(e.length===0)return"No projects found";let r=e.map(o=>{let a=o.counts;return`${o.id} ${o.display_name} ${o.status} memories:${a.memories.active}/${a.memories.total} commitments:${a.commitments.open}/${a.commitments.total} semantic:${a.semantic_memory_index.total} runs:${a.runs.total} sessions:${a.sessions.total}`});return[`${e.length} project(s)`,...r].join(`
970
- `)}function Bw(e){if(!e.registry_available)return`Project registry unavailable: ${e.warning??"unknown"}`;if(!e.registry)return`Project not found: ${e.effective_id}`;let t=e.counts??Jw();return[`Project ${e.registry.id}`,`Name: ${e.registry.display_name}`,`Status: ${e.registry.status}`,`Effective id: ${e.effective_id}`,`Base id: ${e.registry.base_id}`,`Source: ${e.registry.source}; live source: ${e.live_resolution.source}`,`Alias active: ${e.live_resolution.alias_key??"no"}`,`Marker active: ${e.live_resolution.marker_path??"no"}`,`Counts: memories ${t.memories.active}/${t.memories.total}, semantic ${t.semantic_memory_index.total}, commitments ${t.commitments.open}/${t.commitments.total}, runs ${t.runs.total}, sessions ${t.sessions.total}`,`Continuity gap: ${e.continuity_gap?"yes":"no"}`].join(`
971
- `)}function Jw(){return{memories:{total:0,active:0,last_activity_at:null},semantic_memory_index:{total:0,last_activity_at:null},commitments:{total:0,open:0,last_activity_at:null},runs:{total:0,last_activity_at:null},sessions:{total:0,last_activity_at:null}}}function qw(e){return Object.entries(e).map(([t,r])=>`${t} -> ${r}`).join(`
972
- `)}function ip(e){let t=e.applied?"applied":"dry-run";if(e.action==="add"){let r=e.previous_id&&e.previous_id!==e.project_id?` replacing ${e.previous_id}`:"";return`Project alias ${t}: ${e.alias_key} -> ${e.project_id}${r}`}return`Project alias removal ${t}: ${e.alias_key}`}function Kw(e){return e.found?e.mode==="forget_memories"&&!e.guard_ok?[`Project forget dry-run refused: ${e.id}`,`Would transition ${e.memories_affected} memory record(s) to forgotten.`,`Run with --include-memories --apply --confirm ${e.id} to apply.`].join(`
973
- `):e.mode==="forget_memories"?`Project forgotten: ${e.id}; memories affected: ${e.memories_affected}`:`Project archived: ${e.id}`:`Project not found: ${e.id}`}function Gw(e){return e.found?`Project reactivated: ${e.id}`:`Project not found: ${e.id}`}import{readFile as Ww}from"node:fs/promises";async function Hi(e,t,r){let o=e.rest[0];if(o==="status"){let a=await Fr(t);m(a,r,a.ritual_pending?"Onboarding ritual pending":"Onboarding complete");return}if(o==="activation"){let a=zw(e),n=await qn({home:t,profile:a,dry_run:!_(e.flags,"apply"),user_confirmed:_(e.flags,"user-confirmed"),reset:_(e.flags,"reset"),options:{scheduler_host:u(e.flags,"scheduler-host"),heartbeat_cadence:u(e.flags,"heartbeat-cadence"),recall_auto_trigger:_(e.flags,"recall-auto-trigger")||void 0,memory_candidates:_(e.flags,"memory-candidates")||void 0,auto_promotion:_(e.flags,"auto-promotion")||void 0,promotion_policy:Xw(e.flags),recall_auto_trigger_keywords:Li(e.flags,"recall-keywords"),recall_auto_trigger_denylist:Li(e.flags,"recall-denylist"),candidate_auto_promotion_threshold:Yw(e.flags),standing_order_templates:Li(e.flags,"standing-order-templates")}});m(n,r,n.applied?"Activation profile applied":"Activation profile dry-run planned");return}if(o==="verify"){let a=await fo({home:t,host:qe(e.flags),surface:ke(e.flags),targetRoot:u(e.flags,"target-root"),projectCwd:u(e.flags,"project-cwd"),apply:_(e.flags,"apply"),userConfirmed:_(e.flags,"user-confirmed"),retainTestData:_(e.flags,"retain-test-data")});m(a,r,a.overall_status==="ready"?"Cross-host verification passed":`Cross-host verification ${a.overall_status}`);return}if(o==="apply"){let a=u(e.flags,"payload-file")??e.rest[1];if(!a)throw new Error("onboard apply requires --payload-file <path>");let n=JSON.parse(await Ww(a,"utf8")),s=await Ur({home:t,dry_run:_(e.flags,"apply")?!1:n.dry_run!==!1,user_confirmed:_(e.flags,"user-confirmed")||n.user_confirmed===!0,files:n.files,config_patch:n.config_patch});m(s,r,s.applied?"Onboarding files applied":"Onboarding dry-run planned");return}if(o==="complete"){let a=await Vr({home:t,archive:!_(e.flags,"no-archive")});m(a,r,a.already_complete?"Onboarding already complete":"Onboarding ritual completed");return}throw new Error("onboard requires status, activation, verify, apply, or complete")}function zw(e){let t=u(e.flags,"profile")??e.rest[1]??"quickstart";if(t==="quickstart"||t==="advanced")return t;throw new Error("onboard activation requires --profile quickstart|advanced")}function Xw(e){let t=u(e,"promotion-policy");if(t!==void 0){if(t==="manual"||t==="explicit_approval")return t;throw new Error("onboard activation --promotion-policy requires manual|explicit_approval")}}function Yw(e){let t=u(e,"candidate-confidence-threshold");if(t===void 0)return;let r=T(new Map([["candidate-confidence-threshold",t]]),"candidate-confidence-threshold");if(r===void 0)throw new Error("onboard activation --candidate-confidence-threshold must be a number");if(r>=0&&r<=1)return r;throw new Error("onboard activation --candidate-confidence-threshold must be between 0 and 1")}function Li(e,t){let r=u(e,t);if(r)return r.split(",").map(o=>o.trim()).filter(Boolean)}async function Di(e,t,r){let o=e.rest[0];if(o==="evaluate"){let a=u(e.flags,"action")??e.rest[1];if(!a)throw new Error("policy evaluate requires --action <id>");let n=await lt({home:t,action:a,className:Yu(e.flags),target:u(e.flags,"target")});m(n,r,`Policy decision for ${n.action}: ${n.decision}`);return}if(o==="standing-orders"&&e.rest[1]==="list"){let a=await it(t);m(a,r,`${a.length} standing order(s)`);return}if(o==="packs"){await Qw(e,t,r);return}if(o==="pretooluse-hook"){let a=await ho(),n=yo(a)??{},s=await $s({home:t,host:u(e.flags,"host")??"codex",cwd:u(e.flags,"cwd"),payload:n});m(s,r,s.message);return}if(o==="propose-change"){let a=u(e.flags,"target")??e.rest[1],n=u(e.flags,"summary");if(!a||!n)throw new Error("policy propose-change requires --target SOUL.md|POLICY.md and --summary <text>");let s=await Fs({home:t,target:a,summary:n});m(s,r,`Policy change proposal created: ${s.proposalPath}`);return}throw new Error("policy requires evaluate, standing-orders list, packs list|show|validate|apply|rollback, pretooluse-hook, or propose-change")}async function Qw(e,t,r){let o=e.rest[1];if(o==="list"){let a=await oi();m(a,r,`${a.length} policy pack(s)`);return}if(o==="show"){let a=e.rest[2]??u(e.flags,"id");if(!a)throw new Error("policy packs show requires <id> or --id <id>");let n=await mo(a);m(n,r,`Policy pack ${n.id} ${n.version}`);return}if(o==="validate"){let a=e.rest[2]??u(e.flags,"id"),n=await ai({id:a,file:u(e.flags,"file")});m(n,r,n.valid?`Policy pack valid: ${n.id}`:`Policy pack invalid: ${n.errors.join("; ")}`);return}if(o==="apply"){let a=e.rest[2]??u(e.flags,"id"),n=await li({home:t,id:a,file:u(e.flags,"file"),targetRoot:u(e.flags,"target-root"),apply:_(e.flags,"apply"),reviewed:_(e.flags,"reviewed"),approvalEvidence:u(e.flags,"approval")});m(n,r,`${n.dryRun?"Planned":"Applied"} policy pack ${n.pack.id}: ${n.files.filter(s=>s.changed).length} file change(s)`);return}if(o==="rollback"){let a=u(e.flags,"snapshot")??e.rest[2];if(!a)throw new Error("policy packs rollback requires --snapshot <path>");let n=await ci({home:t,snapshotPath:a,apply:_(e.flags,"apply")});m(n,r,`${n.dryRun?"Planned rollback":"Rolled back"} policy pack ${n.pack.id}: ${n.files.length} file change(s)`);return}throw new Error("policy packs requires list, show, validate, apply, or rollback")}function $i(){process.stdout.write(`nativesoul
1057
+ `)}function gR(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}async function To(){if(process.stdin.isTTY)return"";let e=[];for await(let t of process.stdin)e.push(Buffer.isBuffer(t)?t:Buffer.from(String(t)));return Buffer.concat(e).toString("utf8")}function Co(e){let t=e.trim();if(t.length!==0)try{return JSON.parse(t)}catch{return t}}function tm(e){if(typeof e=="string")return e;if(!e||Array.isArray(e)||typeof e!="object")return"";for(let t of["prompt","user_prompt","message","text","content"]){let r=e[t];if(typeof r=="string")return r}return""}function zi(e){if(e[0]==="--help"||e[0]==="-h")return{command:"help",rest:[],flags:new Map([["help",!0]])};let[t,...r]=e,o=[],n=new Map;for(let s=0;s<r.length;s+=1){let a=r[s];if(a)if(a==="-h")n.set("help",!0);else if(a.startsWith("--")){let i=a.slice(2),l=r[s+1];l&&!l.startsWith("--")?(n.set(i,l),s+=1):n.set(i,!0)}else o.push(a)}return{command:t,rest:o,flags:n}}function Yi(e){return e.command==="help"||b(e.flags,"help")}function b(e,t){return e.get(t)===!0}function u(e,t){let r=e.get(t);return typeof r=="string"?r:void 0}function E(e,t){let r=u(e,t);if(!r)return;let o=Number(r);return Number.isFinite(o)?o:void 0}var br=new Set(["codex","claude","grok","antigravity","gemini"]);function No(e){let t=u(e,"host")??"all";if(t==="all"||br.has(t))return t;throw new Error(`Unsupported adapter host: ${t}`)}function rm(e){let t=u(e,"host");if(t&&br.has(t))return t;throw new Error("This command requires --host codex|claude|grok|antigravity|gemini")}function ze(e){if(b(e,"all-hosts"))return"all";let t=u(e,"host")??"all";if(t==="all"||br.has(t))return t;throw new Error(`Unsupported install host: ${t}`)}function xe(e){let t=u(e,"surface");if(t!==void 0){if(t==="desktop"||t==="claude-desktop")return"claude-desktop";if(t==="claude-code")return"claude-code";throw new Error("install surface must be claude-code, desktop, or claude-desktop")}}function Oo(e){let t=u(e,"host");if(t&&br.has(t))return t;throw new Error("This command requires --host codex|claude|grok|antigravity|gemini")}function Mo(e){let t=u(e,"host");if(t!==void 0){if(br.has(t))return t;throw new Error("This command accepts --host codex|claude|grok|antigravity|gemini")}}function om(e){let t=u(e,"result");if(t!==void 0){if(t==="ok"||t==="error"||t==="blocked")return t;throw new Error("audit --result must be ok, error, or blocked")}}function nm(e){let t=u(e,"status");if(t!==void 0){if(t==="pending"||t==="approved"||t==="rejected")return t;throw new Error("approvals --status must be pending, approved, or rejected")}}function sm(e){let t=u(e,"format")??"json";if(t==="json"||t==="jsonl")return t;throw new Error("audit export --format must be json or jsonl")}function am(e){let t=u(e,"status");if(t!==void 0){if(t==="open"||t==="completed"||t==="dismissed"||t==="expired")return t;throw new Error("commitments --status must be open, completed, dismissed, or expired")}}function qn(e){let t=u(e,"status");if(t!==void 0){if(t==="inbox"||t==="assigned"||t==="in_progress"||t==="review"||t==="blocked"||t==="done"||t==="failed")return t;throw new Error("work --status must be inbox, assigned, in_progress, review, blocked, done, or failed")}}function Kn(e){let t=u(e,"priority");if(t!==void 0){if(t==="low"||t==="normal"||t==="high"||t==="urgent")return t;throw new Error("work --priority must be low, normal, high, or urgent")}}function Qi(e,t){let r=u(e,t);if(r!==void 0)return r.split(",").map(o=>o.trim()).filter(Boolean)}function im(e){let t=u(e,"status");if(t!==void 0){if(t==="active"||t==="archived"||t==="forgotten"||t==="all")return t;throw new Error("project list --status must be active, archived, forgotten, or all")}}function lm(e){let t=u(e,"class");if(t==="read_local"||t==="probe_external"||t==="write_local"||t==="write_project"||t==="external_write"||t==="destructive"||t==="identity_policy_change")return t;throw new Error("policy evaluate requires --class read_local|probe_external|write_local|write_project|external_write|destructive|identity_policy_change")}function Gn(e){let t=u(e,"mode")??"leader";if(t==="leader"||t==="federated"||t==="per-project")return t;throw new Error("schedule --mode must be leader, federated, or per-project")}function cm(e){let t=u(e,"host")??"generic";if(t==="generic"||br.has(t))return t;throw new Error(`Unsupported MCP manifest host: ${t}`)}function Zi(e){return Oo(e)}function el(e){let t=u(e,"command-mode")??"package";if(t==="package"||t==="local"||t==="absolute")return t;throw new Error(`Unsupported MCP command mode: ${t}`)}function dm(e){let t=u(e,"format")??"json";if(t==="json"||t==="inject"||t==="cache")return t;throw new Error("bootstrap --format must be json, inject, or cache")}async function tl(e,t,r){let o=e.rest[0]??"status",n={home:t,host:ze(e.flags),surface:xe(e.flags),targetRoot:u(e.flags,"target-root")};if(o==="status"){let s=await _r(n);m(s,r,`Activation status: ${s.overall_status}`);return}if(o==="plan"){let s=await jo({...n,profile:fR(e)});m(s,r,`Activation plan: ${s.plan.length} dry-run action(s)`);return}if(o==="heartbeat"){let s=e.rest[1]??"plan",a={home:t,host:ze(e.flags),surface:xe(e.flags),targetRoot:u(e.flags,"target-root"),leaderHost:hR(e),mode:Gn(e.flags),cadence:u(e.flags,"cadence"),projectScope:u(e.flags,"project")??u(e.flags,"project-scope"),behavior:yR(e),user_confirmed:b(e.flags,"user-confirmed")};if(s==="plan"){let i=await Wn(a);m(i,r,i.recommended_leader?`Heartbeat leader recommended: ${i.recommended_leader.host}`:"Heartbeat native scheduler blocked by host");return}if(s==="apply"){let i=await Gi({...a,dry_run:!b(e.flags,"apply")});m(i,r,i.applied?"Heartbeat activation applied":`Heartbeat activation ${i.action}`);return}throw new Error("activate heartbeat requires plan or apply")}throw new Error("activate requires status, plan, or heartbeat")}function fR(e){let t=u(e.flags,"profile");if(t!==void 0){if(t==="quickstart"||t==="advanced")return t;throw new Error("activate plan requires --profile quickstart|advanced")}}function hR(e){let t=u(e.flags,"leader-host");if(t!==void 0){if(t==="codex"||t==="claude"||t==="grok"||t==="antigravity"||t==="gemini")return t;throw new Error("activate heartbeat requires --leader-host codex|claude|grok|antigravity|gemini")}}function yR(e){let t=u(e.flags,"behavior");if(t!==void 0){if(t==="read_only"||t==="approval_required")return t;throw new Error("activate heartbeat requires --behavior read_only|approval_required")}}async function rl(e,t){let r=e.rest[0],o=No(e.flags);if(r==="hot-scan"){let n=await kt({home:u(e.flags,"home"),host:o,delta:b(e.flags,"delta"),ttlSeconds:E(e.flags,"ttl-seconds")}),s=n.reduce((a,i)=>a+i.count,0);m(n,t,`Hot-scanned ${s} capability record(s)`);return}if(r==="scan"){let n=await Ir(o);m(n,t,`Scanned ${n.length} adapter(s)`);return}if(r==="doctor"){let n=await Tr(o),s=n.reduce((a,i)=>a+i.diagnostics.length,0);m(n,t,`Adapter doctor found ${s} diagnostic(s)`);return}if(r==="managed-block"){let n=rm(e.flags),s=await Cr(n);m(s,t,`Managed block preview for ${s.host}: ${s.targetPath}`);return}if(r==="install-managed-block"){let n=Oo(e.flags),s=await Nr({home:u(e.flags,"home"),host:n,apply:b(e.flags,"apply"),targetPath:u(e.flags,"target")});m(s,t,`${s.dryRun?"Planned":"Applied"} managed block for ${s.host}: ${s.action}`);return}if(r==="rollback-managed-block"){let n=u(e.flags,"snapshot");if(!n)throw new Error("adapters rollback-managed-block requires --snapshot <path>");let s=await zs({home:u(e.flags,"home"),snapshotPath:n,apply:b(e.flags,"apply")});m(s,t,`${s.dryRun?"Planned rollback":"Rolled back"} managed block target ${s.targetPath}`);return}throw new Error("adapters requires scan, hot-scan, doctor, or managed-block")}async function ol(e,t,r){let o=e.rest[0];if(o==="list"){let n=Un({home:t,status:nm(e.flags)});m(n,r,bR(n.approvals,n.warning));return}if(o==="show"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error("approvals show requires <id|.>");let s=n==="."?_R(t):Fn({home:t,id:n}).approval;m(s,r,s?vR(s):`Approval not found: ${n}`),s||(process.exitCode=1);return}if(o==="approve"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error("approvals approve requires <id>");let s=Fn({home:t,id:n}).approval;if(!s){m({approval:null,applied:!1,action:"approve",warning:"approval_not_found"},r,`Approval not found: ${n}`),process.exitCode=1;return}if(!b(e.flags,"confirm")){m({approval:s,applied:!1,action:"approve",warning:"requires --confirm"},r,`Approval approve dry-run: ${s.id} (${s.action}); rerun with --confirm to apply.`);return}let a=await gr({home:t,id:n,status:"approved",reviewer:"cli",reason:u(e.flags,"reason")??null});m(a.approval,r,a.approval?`Approval approved: ${a.approval.id}`:`Approval not found: ${n}`),a.approval||(process.exitCode=1);return}if(o==="reject"){let n=e.rest[1]??u(e.flags,"id"),s=u(e.flags,"reason");if(!n||!s)throw new Error("approvals reject requires <id> --reason <text>");let a=await gr({home:t,id:n,status:"rejected",reviewer:"cli",reason:s});m(a.approval,r,a.approval?`Approval rejected: ${a.approval.id}`:`Approval not found: ${n}`),a.approval||(process.exitCode=1);return}throw new Error("approvals requires list, show, approve, or reject")}function _R(e){return Un({home:e,status:"pending"}).approvals[0]??null}function bR(e,t){return t?`Approvals unavailable: ${t}`:e.length===0?"No approvals found":[`${e.length} approval(s)`,...e.map(r=>`${r.id} ${r.action} ${r.class} ${r.target??"-"} ${r.status} ${r.reviewer??"-"} ${r.created_at}`)].join(`
1058
+ `)}function vR(e){return[`Approval ${e.id}`,`Action: ${e.action}`,`Class: ${e.class}`,`Target: ${e.target??"-"}`,`Project: ${e.project??"-"}`,`Host: ${e.host??"-"}`,`Status: ${e.status}`,`Reviewer: ${e.reviewer??"-"}`,`Reason: ${e.reason??"-"}`,`Created: ${e.created_at}`,`Decided: ${e.decided_at??"-"}`].join(`
1059
+ `)}async function nl(e,t,r){let o=e.rest[0],n={home:t,type:u(e.flags,"type"),result:om(e.flags),limit:E(e.flags,"limit")};if(o==="list"){let s=await Jo(n);m(s,r,`${s.length} audit event(s)`);return}if(o==="export"){let s=sm(e.flags),a=await Is({...n,format:s});if(s==="jsonl"){process.stdout.write(a.events.map(i=>JSON.stringify(i)).join(`
1060
+ `)),a.events.length>0&&process.stdout.write(`
1061
+ `);return}process.stdout.write(`${JSON.stringify(a.events,null,2)}
1062
+ `);return}throw new Error("audit requires list or export")}async function sl(e,t,r){let o=e.rest[0];if(o==="refresh"){let n=await kt({home:t,host:No(e.flags),delta:b(e.flags,"delta"),ttlSeconds:E(e.flags,"ttl-seconds")}),s=n.reduce((a,i)=>a+i.count,0);m(n,r,`Refreshed ${s} capability record(s)`);return}if(o==="learn"){let n=await ea({home:t,host:No(e.flags),limit:E(e.flags,"limit")});m(n,r,`Learned ${n.generated} capability card(s), changed ${n.changed}`);return}if(o==="list"){let n=await Se({home:t,host:Mo(e.flags),readyOnly:b(e.flags,"ready-only"),limit:E(e.flags,"limit")});m(n,r,`${n.length} capability record(s)`);return}if(o==="search"){let n=e.rest.slice(1).join(" ")||(u(e.flags,"query")??""),s=await Lr({home:t,query:n,host:b(e.flags,"all-hosts")?void 0:Mo(e.flags)??"codex",readyOnly:b(e.flags,"ready-only"),limit:E(e.flags,"limit")});m(s,r,`${s.length} capability record(s) found`);return}if(o==="show"){let n=e.rest[1]??u(e.flags,"uid");if(!n)throw new Error("capabilities show requires <uid> or --uid <uid>");let s=await Dr({home:t,uid:n});if(!s)throw new Error(`Capability not found: ${n}`);m(s,r,`Capability ${s.uid}: ready=${s.ready}`);return}throw new Error("capabilities requires refresh, learn, list, search, or show")}async function al(e,t,r){let o=e.rest[0];if(o==="create"){let n=u(e.flags,"summary")??u(e.flags,"text");if(!n)throw new Error("commitments create requires --summary <text>");let s=u(e.flags,"project")??L(process.cwd(),t),a=await Hr({home:t,project:s,summary:n,dueAt:u(e.flags,"due-at")??null,ttlSeconds:E(e.flags,"ttl-seconds")});m(a,r,a.created?`Commitment created: ${a.commitment.id}`:`Commitment deduped: ${a.commitment.id}`);return}if(o==="list"){let n=await $r({home:t,project:u(e.flags,"project"),status:am(e.flags),includeExpired:b(e.flags,"include-expired"),limit:E(e.flags,"limit")});m(n,r,`${n.length} commitment(s)`);return}if(o==="complete"||o==="dismiss"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error(`commitments ${o} requires <id> or --id <id>`);let s=o==="complete"?await Fr(t,n):await ta(t,n);m(s,r,`Commitment ${o}d: ${s.id}`);return}throw new Error("commitments requires create, list, complete, or dismiss")}async function cl(e,t,r){let o=u(e.flags,"project")??te(process.cwd(),t).id,n=So({home:t,project:o,host:u(e.flags,"host"),since:u(e.flags,"since"),until:u(e.flags,"until"),groupBy:kR(e.flags),limit:E(e.flags,"limit")});m(n,r,wR(n))}function kR(e){let t=u(e,"group-by");if(t===void 0)return"total";if(t==="project"||t==="host"||t==="day")return t;throw new Error("cost --group-by must be project, host, or day")}function wR(e){let t=[`NativeSoul cost report (${e.filters.group_by})`,`Project: ${e.filters.project??"all"}`,`Host: ${e.filters.host??"all"}`,`Window: ${e.filters.since??"beginning"} -> ${e.filters.until??"now"}`,`Total reported: ${il(e.totals)}`,`Coverage: ${ll(e.totals.reported_runs,e.totals.total_runs)}`],r=e.groups.length>0?e.groups:e.by_host;if(r.length>0){t.push("Groups:");for(let o of r)t.push(`- ${o.label}: ${il(o)} (${ll(o.reported_runs,o.total_runs)})`)}if(e.by_session.length>0){t.push("Sessions:");for(let o of e.by_session)t.push(`- ${o.label}: ${il(o)} (${ll(o.reported_runs,o.total_runs)})`)}return t.join(`
1063
+ `)}function il(e){return e.cost_reported_runs===0?"not reported by host":RR(e.total_usd)}function ll(e,t){let r=t===0?0:Math.round(e/t*100);return`${e}/${t} reported (${r}%)`}function RR(e){return`$${e.toFixed(2)}`}async function dl(e,t,r){let o=e.rest[0];if(o==="data"){let n=SR(e.flags),s=await Ao({home:t,project:u(e.flags,"project"),host:u(e.flags,"host"),limit:E(e.flags,"limit"),since:u(e.flags,"since"),until:u(e.flags,"until")});m(n?AR(s,n):s,r,`Dashboard data ready: ${s.initialized?"initialized":"not initialized"}`);return}if(o==="viewer"){let n=await Pi({home:t,project:u(e.flags,"project"),host:u(e.flags,"host"),limit:E(e.flags,"limit"),since:u(e.flags,"since"),until:u(e.flags,"until"),output:u(e.flags,"output")});m(n,r,`Dashboard viewer written: ${n.outputPath}`);return}throw new Error("dashboard requires data or viewer")}function SR(e){let t=u(e,"section");if(t!==void 0){if(t==="work"||t==="approvals"||t==="cost")return t;throw new Error("dashboard --section must be work, approvals, or cost")}}function AR(e,t){return{schema_version:e.schema_version,generated_at:e.generated_at,filters:e.filters,read_only:e.read_only,[t]:e[t]}}async function ul(e,t,r){let o=e.rest[0];if(o==="m7"||o==="report"){let n=await pr({home:t,project:u(e.flags,"project"),host:u(e.flags,"host"),limit:E(e.flags,"limit")});m(n,r,n.m7_gate.feedback_validated?"M7 feedback report ready":"M7 feedback report has gaps");return}throw new Error("feedback requires m7 or report")}async function pl(e,t,r){let o=e.rest[0];if(o==="claim"){let n=u(e.flags,"slot")??e.rest[1];if(!n)throw new Error("heartbeat claim requires --slot <id>");let s=u(e.flags,"project")??L(process.cwd(),t),a=u(e.flags,"host")??"codex",i=await Eo({home:t,slot:n,host:a,project:s,ttlSeconds:E(e.flags,"ttl-seconds")});m(i,r,i.claimed?`Heartbeat lease claimed: ${i.lease.id}`:"HEARTBEAT_OK");return}if(o==="complete"){let n=u(e.flags,"slot")??e.rest[1];if(!n)throw new Error("heartbeat complete requires --slot <id>");let s=u(e.flags,"project")??L(process.cwd(),t),a=u(e.flags,"host")??"codex",i=await Po({home:t,slot:n,host:a,project:s,result:u(e.flags,"result")??"HEARTBEAT_OK",evidence:u(e.flags,"evidence")?{note:u(e.flags,"evidence")??""}:{},workItemId:u(e.flags,"work-item")});m(i,r,`Heartbeat completed: ${i.lease.id}`);return}if(o==="status"){let n=await ji({home:t,project:u(e.flags,"project"),limit:E(e.flags,"limit")});m(n,r,`${n.length} heartbeat lease(s)`);return}throw new Error("heartbeat requires claim, complete, or status")}async function ml(e,t,r){let o=e.rest[0];if(o==="reconcile"){let n=Oo(e.flags),s=u(e.flags,"target-root"),a=await ct({home:t,host:n,surface:xe(e.flags),mode:Gn(e.flags),apply:b(e.flags,"apply"),hostConfigRoot:s?Ke(n,s):void 0,targetRoot:s});m(a,r,a.applied?`Schedule reconciled: ${a.schedule.id}`:`Schedule reconcile planned: ${a.schedule.id}`);return}if(o==="list"){let n=await lo({home:t,host:Mo(e.flags),limit:E(e.flags,"limit")});m(n,r,`${n.length} schedule record(s)`);return}if(o==="disable"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error("schedule disable requires <id> or --id <id>");let s=await Ka({home:t,id:n,apply:b(e.flags,"apply")});m(s,r,s.applied?`Schedule disabled: ${n}`:`Schedule disable planned: ${n}`);return}throw new Error("schedule requires reconcile, list, or disable")}async function gl(e,t,r){if(e.rest[0]==="openclaw"){let s=u(e.flags,"source")??e.rest[1];if(!s)throw new Error("import openclaw requires --source <path>");let a=await ei({home:t,sourcePath:s,cwd:u(e.flags,"cwd")??process.cwd(),project:u(e.flags,"project"),apply:b(e.flags,"apply"),limit:E(e.flags,"limit")});m(a,r,a.applied?`OpenClaw import applied: ${a.persisted_memories.length} candidate(s), ${a.warnings.length} warning(s)`:`OpenClaw import dry-run: ${a.mapped_records.length} mapped, ${a.skipped_records.length} skipped, ${a.warnings.length} warning(s)`);return}let n=ER(e);if(n){let s=u(e.flags,"source")??e.rest[1];if(!s)throw new Error("import native requires --source <path>");let a=await ni({home:t,host:n,sourcePath:s,cwd:u(e.flags,"cwd")??process.cwd(),project:u(e.flags,"project"),apply:b(e.flags,"apply"),limit:E(e.flags,"limit")});m(a,r,a.applied?`${n} import applied: ${a.persisted_memories.length} candidate(s), ${a.warnings.length} warning(s), ${a.conflicts.length} conflict(s)`:`${n} import dry-run: ${a.mapped_records.length} mapped, ${a.skipped_records.length} skipped, ${a.conflicts.length} conflict(s), ${a.warnings.length} warning(s)`);return}throw new Error("import requires openclaw, native --host <host>, or a supported host alias")}function ER(e){let t=e.rest[0],r=t==="native"?u(e.flags,"host"):t;return r==="nativesoul"||r==="codex"||r==="claude"||r==="gemini"||r==="grok"||r==="antigravity"?r:null}import{spawnSync as PR}from"node:child_process";async function fl(e,t,r){let[o,n]=e.rest;if(o==="activate"){if(!n)throw new Error("license activate requires a license key");let s=await ii({home:t,key:n}),a=s.ok?{ok:!0,action:"activate",license:Lo(s.license),message:"License activated via Dodo"}:{ok:!1,action:"activate",reason:s.reason,license:Lo(s.license),message:`License activation failed: ${s.reason}`};m(a,r,a.message??"License activated via Dodo"),a.ok||(process.exitCode=1);return}if(o==="status"){let s=await Ee(t),a=s?xR(s):de,i=await IR(e),l=await mi({home:t,currentVersion:Ut,latestKnownVersion:i}),c={ok:!0,action:"status",license:Lo(a),update_entitlement:l,message:TR(a,l,b(e.flags,"check-updates"))};m(c,r,c.message??`License status: ${a.state}`);return}if(o==="deactivate"){let s=await ci({home:t}),a=s.ok?{ok:!0,action:"deactivate",license:Lo(s.license),message:"License deactivated via Dodo; local NativeSoul data was not removed"}:{ok:!1,action:"deactivate",reason:s.reason,license:Lo(s.license),message:`License deactivation failed: ${s.reason}`};m(a,r,a.message??"License deactivated via Dodo; local NativeSoul data was not removed"),a.ok||(process.exitCode=1);return}throw new Error("license requires activate, status, or deactivate")}function xR(e){return{state:e.state,license_key:e.license_key,instance_id:e.instance_id,purchased_at:e.purchased_at??null,version_at_activation:e.version_at_activation??null,updates_until:e.updates_until,last_checked_at:e.last_checked_at,source:e.source}}function Lo(e){return{...e,license_key:e.license_key?jR(e.license_key):null}}function jR(e){return e.length<=8?"[REDACTED_LICENSE_KEY]":`${e.slice(0,4)}\u2026${e.slice(-4)}`}async function IR(e){let t=u(e.flags,"latest-known-version");if(t)return t;if(!b(e.flags,"check-updates"))return;let r=process.platform==="win32"?"npm.cmd":"npm",o=PR(r,["view","nativesoul","version","--registry=https://registry.npmjs.org/"],{encoding:"utf8",timeout:15e3,shell:process.platform==="win32"});if(o.status===0)return o.stdout.trim()||void 0}function TR(e,t,r){let o=t.updates_status==="unknown"?"unknown":t.updates_until??"unknown",n=t.newer_major_available==="unknown"?r?"unknown":"unknown \u2014 run with `--check-updates`":t.newer_major_available?"available":"not detected",s=[`License status: ${e.state}`,e.state==="licensed"?"Perpetual build: active \u2014 your licence keeps working.":"Perpetual build: unavailable until activated.",`Updates window: ${o}`,`Newer major: ${n}`];return t.soft_nudge.visible&&t.soft_nudge.message&&s.push(t.soft_nudge.message),s.join(`
1064
+ `)}async function hl(e,t,r){let o=await pi({page:u(e.flags,"page")});m(o,r,o.ok?`Marketing audit PASS: ${o.summary.claims_checked} claim(s), ${o.summary.pages_scanned} page(s)`:`Marketing audit FAIL: ${o.issues.length} issue(s)`),o.ok||(process.exitCode=1)}var um={life_activation_status:async(e,t)=>await _r({home:t,host:yl(e.host),targetRoot:gt(e.target_root)??gt(e.targetRoot)}),life_activation_plan:async(e,t)=>await jo({home:t,host:yl(e.host),targetRoot:gt(e.target_root)??gt(e.targetRoot),profile:CR(e.profile)}),life_activation_verify:async(e,t)=>await Io({home:t,host:yl(e.host),surface:NR(e.surface),targetRoot:gt(e.target_root)??gt(e.targetRoot),projectCwd:gt(e.project_cwd)??gt(e.projectCwd),apply:_l(e.apply),userConfirmed:_l(e["user-confirmed"]),retainTestData:_l(e["retain-test-data"])})},pm=[{name:"life_activation_status",description:"Return activation status by component, including bootstrap, MCP, plugins/hooks, heartbeat, recall, memory, and cross-host verification.",inputSchema:{type:"object",properties:{host:{type:"string"},target_root:{type:"string"},targetRoot:{type:"string"}}}},{name:"life_activation_plan",description:"Return a read-only dry-run activation plan with exact files, settings, scheduler actions, and approvals.",inputSchema:{type:"object",properties:{host:{type:"string"},profile:{type:"string"},target_root:{type:"string"},targetRoot:{type:"string"}}}},{name:"life_activation_verify",description:"Run cross-host activation verification for bootstrap cache, MCP, scheduler evidence, and memory recall.",inputSchema:{type:"object",properties:{host:{type:"string"},surface:{type:"string"},project_cwd:{type:"string"},projectCwd:{type:"string"},target_root:{type:"string"},targetRoot:{type:"string"},apply:{type:"boolean"},"user-confirmed":{type:"boolean"},"retain-test-data":{type:"boolean"}}}}];function yl(e){if(e===void 0)return"all";if(e==="all"||e==="codex"||e==="claude"||e==="grok"||e==="antigravity"||e==="gemini")return e;throw new Error("Invalid activation host")}function CR(e){if(e!==void 0){if(e==="quickstart"||e==="advanced")return e;throw new Error("Invalid activation profile")}}function NR(e){if(e!==void 0){if(e==="desktop"||e==="claude-desktop")return"claude-desktop";if(e==="claude-code")return"claude-code";throw new Error("activation verify surface must be claude-code, desktop, or claude-desktop")}}function gt(e){return typeof e=="string"?e:void 0}function _l(e){return e===!0}var OR=["2025-11-25","2024-11-05","2024-10-07"],ym={...um,life_status:(e,t)=>Jn(t),life_bootstrap:async(e,t)=>await $R({home:t,host:C(e.host,"codex"),cwd:C(e.cwd,process.cwd()),query:z(e.query)}),life_recall:async(e,t)=>await Pt(t,C(e.query,""),C(e.project,"default"),zn(e.limit,5)),life_remember_propose:async(e,t)=>await ae(t,{project:C(e.project,"default"),content:C(e.content,""),type:z(e.type),confidence:mm(e.confidence),source:{host:"mcp",session_id:"local"}}),life_memory_promote:async(e,t)=>await Rt(t,C(e.id,"")),life_memory_reject:async(e,t)=>await St(t,C(e.id,"")),life_memory_forget:async(e,t)=>await At(t,C(e.id,"")),life_memory_expire:async(e,t)=>await Jr(t,C(e.id,"")),life_capability_search:async(e,t)=>await Lr({home:t,query:C(e.query,""),host:VR(e)?void 0:z(e.host)??"codex",readyOnly:vr(e.readyOnly,!1),limit:zn(e.limit,8)}),life_capability_status:async(e,t)=>{let r=C(e.uid,""),o=r?await Dr({home:t,uid:r}):null;if(!o)throw new Error(`Capability not found: ${r}`);return o},life_policy_evaluate:async(e,t)=>await pt({home:t,action:C(e.action,""),className:hm(e.class),target:z(e.target)}),life_approval_request:async(e,t)=>await qR({home:t,action:C(e.action,""),className:hm(e.class),target:z(e.target),project:z(e.project),host:z(e.host)}),life_approval_decide:async(e,t)=>{let r=C(e.id,""),o=await gr({home:t,id:r,status:JR(e.status),reviewer:C(e.host,"mcp"),reason:z(e.reason)??null});if(!o.approval)throw new Error(`Approval not found: ${r}`);return o},life_commitment_create:async(e,t)=>await Hr({home:t,project:C(e.project,"default"),summary:C(e.summary,""),dueAt:z(e.due_at),ttlSeconds:mm(e.ttl_seconds),source:{host:"mcp",session_id:"local"}}),life_commitment_complete:async(e,t)=>await Fr(t,C(e.id,"")),life_work_item_create:async(e,t)=>await bo({home:t,project:C(e.project,"default"),title:C(e.title,""),description:z(e.description),priority:bl(e.priority),source:"mcp",tags:gm(e.tags),host:z(e.host)}),life_work_item_list:async(e,t)=>await vo({home:t,project:z(e.project),status:fm(e.status),priority:bl(e.priority),assignedHost:z(e.host),limit:zn(e.limit,50)}),life_work_item_claim:async(e,t)=>await ko({home:t,id:C(e.id,""),host:C(e.host,"mcp")}),life_work_item_update:async(e,t)=>await wo({home:t,id:C(e.id,""),status:fm(e.status),priority:bl(e.priority),assignedHost:z(e.host),description:z(e.description),tags:e.tags===void 0?void 0:gm(e.tags)}),life_work_item_complete:async(e,t)=>await Ro({home:t,id:C(e.id,""),status:UR(e.status)}),life_heartbeat_claim:async(e,t)=>await Eo({home:t,slot:C(e.slot,""),host:C(e.host,"codex"),project:C(e.project,"default"),ttlSeconds:zn(e.ttl_seconds,1500)}),life_heartbeat_complete:async(e,t)=>await Po({home:t,slot:C(e.slot,""),host:C(e.host,"codex"),project:C(e.project,"default"),result:e.result??"HEARTBEAT_OK",evidence:e.evidence??{},workItemId:z(e.work_item_id)}),life_onboarding_status:async(e,t)=>await Xr(t),life_onboard_apply:async(e,t)=>await zr({home:t,dry_run:vr(e.dry_run,!0),user_confirmed:vr(e.user_confirmed,!1),files:BR(e.files),config_patch:WR(e.config_patch)}),life_onboard_complete:async(e,t)=>await Yr({home:t,archive:e.archive===void 0?!0:vr(e.archive,!0)})},MR=new Set(Object.keys(ym));function LR(e){return e.method?.startsWith("notifications/")?!0:!Object.prototype.hasOwnProperty.call(e,"id")}async function Yn(e,t){if(LR(e))return null;let r=e.id??null;try{if(e.method==="initialize"){let o=Do(e.params),n=z(o.protocolVersion),s=n&&OR.includes(n)?n:"2024-11-05";return Ye(r,{protocolVersion:s,serverInfo:{name:"nativesoul",version:"0.1.0"},capabilities:{tools:{}}})}if(e.method==="ping")return Ye(r,{});if(e.method==="resources/list")return Ye(r,{resources:[]});if(e.method==="prompts/list")return Ye(r,{prompts:[]});if(e.method==="tools/list")return Ye(r,{tools:[{name:"life_status",description:"Return local NativeSoul health and counts.",inputSchema:{type:"object"}},{name:"life_bootstrap",description:"Return compact bootstrap context for a host and cwd.",inputSchema:{type:"object",required:["host","cwd"],properties:{host:{type:"string"},cwd:{type:"string"},query:{type:"string"}}}},{name:"life_recall",description:"Search project-scoped memory.",inputSchema:{type:"object",required:["query","project"],properties:{query:{type:"string"},project:{type:"string"},limit:{type:"number"}}}},{name:"life_remember_propose",description:"Create a redacted local candidate memory for a project.",inputSchema:{type:"object",required:["project","content"],properties:{project:{type:"string"},content:{type:"string"},type:{type:"string"},confidence:{type:"number"}}}},{name:"life_memory_promote",description:"Promote a candidate memory to active status.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_memory_reject",description:"Reject a candidate memory.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_memory_forget",description:"Forget an active memory.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_memory_expire",description:"Expire an active memory.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_capability_search",description:"Search persisted local capability records.",inputSchema:{type:"object",required:["query"],properties:{query:{type:"string"},host:{type:"string"},allHosts:{type:"boolean"},all_hosts:{type:"boolean"},readyOnly:{type:"boolean"},limit:{type:"number"}}}},{name:"life_capability_status",description:"Return one persisted capability record by uid.",inputSchema:{type:"object",required:["uid"],properties:{uid:{type:"string"}}}},{name:"life_policy_evaluate",description:"Evaluate a proposed action against local policy and standing orders.",inputSchema:{type:"object",required:["action","class"],properties:{action:{type:"string"},class:{type:"string"},target:{type:"string"}}}},{name:"life_approval_request",description:"Request approval for a sensitive action. If blocked, stop and return control to the human; there is no server or polling in this turn-based protocol.",inputSchema:{type:"object",required:["action","class"],properties:{action:{type:"string"},class:{type:"string"},target:{type:"string"},project:{type:"string"},host:{type:"string"}}}},{name:"life_approval_decide",description:"Record a human-driven approval decision. Acting agents must not self-approve; use this only from a human-operated host turn.",inputSchema:{type:"object",required:["id","status"],properties:{id:{type:"string"},status:{type:"string",enum:["approved","rejected"]},reason:{type:"string"},host:{type:"string"}}}},{name:"life_commitment_create",description:"Create a local project-scoped commitment with optional TTL.",inputSchema:{type:"object",required:["project","summary"],properties:{project:{type:"string"},summary:{type:"string"},due_at:{type:"string"},ttl_seconds:{type:"number"}}}},{name:"life_commitment_complete",description:"Complete a local commitment by id.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_work_item_create",description:"Create a local project-scoped work item.",inputSchema:{type:"object",required:["project","title"],properties:{project:{type:"string"},title:{type:"string"},description:{type:"string"},priority:{type:"string",enum:["low","normal","high","urgent"]},tags:{type:"array",items:{type:"string"}},host:{type:"string"}}}},{name:"life_work_item_list",description:"List local work items with optional filters.",inputSchema:{type:"object",properties:{project:{type:"string"},status:{type:"string",enum:["inbox","assigned","in_progress","review","blocked","done","failed"]},priority:{type:"string",enum:["low","normal","high","urgent"]},host:{type:"string"},limit:{type:"number"}}}},{name:"life_work_item_claim",description:"Claim one work item for a host.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},host:{type:"string"}}}},{name:"life_work_item_update",description:"Update one work item through the shared status machine.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},status:{type:"string",enum:["inbox","assigned","in_progress","review","blocked","done","failed"]},priority:{type:"string",enum:["low","normal","high","urgent"]},host:{type:"string"},description:{type:"string"},tags:{type:"array",items:{type:"string"}}}}},{name:"life_work_item_complete",description:"Complete one work item as done or failed.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},status:{type:"string",enum:["done","failed"]}}}},{name:"life_heartbeat_claim",description:"Claim a local heartbeat lease for a project and slot.",inputSchema:{type:"object",required:["slot","host","project"],properties:{slot:{type:"string"},host:{type:"string"},project:{type:"string"},ttl_seconds:{type:"number"}}}},{name:"life_heartbeat_complete",description:"Complete a local heartbeat lease and record a run.",inputSchema:{type:"object",required:["slot","host","project"],properties:{slot:{type:"string"},host:{type:"string"},project:{type:"string"},result:{type:"string"},evidence:{type:"object"},work_item_id:{type:"string"}}}},{name:"life_onboarding_status",description:"Return onboarding ritual status, interview themes, and file_generation_rules (IDENTITY/SOUL/USER/AGENTS formats). Call before drafting files.",inputSchema:{type:"object"}},...pm,{name:"life_onboard_apply",description:"Dry-run or apply AI-generated onboarding human files.",inputSchema:{type:"object",required:["files"],properties:{dry_run:{type:"boolean"},user_confirmed:{type:"boolean"},files:{type:"object"},config_patch:{type:"object"}}}},{name:"life_onboard_complete",description:"Archive BOOTSTRAP.md and mark onboarding ritual complete.",inputSchema:{type:"object",properties:{archive:{type:"boolean"}}}}]});if(e.method==="tools/call"){let o=await ir(t);if(!o.ok)return Ye(r,o);let n=FR(e.params);return Ye(r,await HR(n.name??"",n.arguments??{},t))}if(MR.has(e.method)){let o=await ir(t);return o.ok?Ye(r,await bm(e.method,Do(e.params),t)):Ye(r,o)}return Xn(r,-32601,`Unknown method: ${e.method}`)}catch(o){return o instanceof wt?Xn(r,-32010,o.message,{code:o.code,id:o.id,from:o.from,to:o.to}):o instanceof Ce?Xn(r,-32011,o.message,{code:o.code,id:o.id,status:o.status}):Xn(r,-32603,o instanceof Error?o.message:"Unknown MCP error")}}async function _m(e){let t="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>{t+=r;let o=t.split(/\r?\n/u);t=o.pop()??"";for(let n of o){let s=n.trim();s&&DR(s,e).catch(a=>{process.stderr.write(`NativeSoul MCP response error: ${KR(a)}
1065
+ `)})}})}async function DR(e,t){let r;try{r=JSON.parse(e)}catch{process.stdout.write(`${JSON.stringify({jsonrpc:"2.0",id:null,error:{code:-32700,message:"Parse error"}})}
1066
+ `);return}let o=await Yn(r,t);o&&process.stdout.write(`${JSON.stringify(o)}
1067
+ `)}async function HR(e,t,r){let o=await bm(e,t,r);return{content:[{type:"text",text:JSON.stringify(o)}]}}async function bm(e,t,r){let o=ym[e];if(!o)throw new Error(`Unknown tool: ${e}`);return await o(t,r)}async function $R(e){try{let t=await It({...e,readOnly:!0});try{await Me({home:e.home,host:e.host,outcome:"succeeded",tier:"B",cwd:t.project.cwd,project:t.project.id,tokensUsed:t.context_budget.tokens_used,tokensMax:t.context_budget.tokens_max,source:"mcp-life-bootstrap",warnings:t.warnings})}catch{}return t}catch(t){try{await Me({home:e.home,host:e.host,outcome:"failed",tier:"B",cwd:e.cwd,project:null,source:"mcp-life-bootstrap",error:t})}catch{}throw t}}function Ye(e,t){return{jsonrpc:"2.0",id:e,result:t}}function Xn(e,t,r,o){return{jsonrpc:"2.0",id:e,error:o===void 0?{code:t,message:r}:{code:t,message:r,data:o}}}function FR(e){return Do(e)}function Do(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function C(e,t){return typeof e=="string"?e:t}function z(e){return typeof e=="string"?e:void 0}function zn(e,t){return typeof e=="number"?e:t}function mm(e){return typeof e=="number"?e:void 0}function gm(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function fm(e){if(e!==void 0){if(e==="inbox"||e==="assigned"||e==="in_progress"||e==="review"||e==="blocked"||e==="done"||e==="failed")return e;throw new Error("Invalid work item status")}}function UR(e){if(e!==void 0){if(e==="done"||e==="failed")return e;throw new Error("Work item terminal status must be done or failed")}}function bl(e){if(e!==void 0){if(e==="low"||e==="normal"||e==="high"||e==="urgent")return e;throw new Error("Invalid work item priority")}}function vr(e,t){return typeof e=="boolean"?e:t}function VR(e){return vr(e.allHosts,!1)||vr(e.all_hosts,!1)}function BR(e){let t=Do(e),r={};for(let[o,n]of Object.entries(t))typeof n=="string"&&(r[o]=n);return r}function WR(e){let r=Do(e).hosts;if(!Array.isArray(r))return;let o=r.filter(n=>typeof n=="string");return o.length>0?{hosts:o}:void 0}function hm(e){if(e==="read_local"||e==="probe_external"||e==="write_local"||e==="write_project"||e==="external_write"||e==="destructive"||e==="identity_policy_change")return e;throw new Error("Invalid policy action class")}function JR(e){if(e==="approved"||e==="rejected")return e;throw new Error("life_approval_decide status must be approved or rejected")}async function qR(e){let t=await Hi(e),r=t.approval?.id??null;return t.evaluation.decision==="approval_required"?{blocked:!0,allowed:!1,decision:"approval_required",approval_id:r,approval_created:t.approval_created,wait:"human",instruction:r?`approval ${r} pending - run: nativesoul approvals approve ${r} --confirm`:"approval pending but unavailable - inspect NativeSoul approval storage",warning:t.warning}:t.evaluation.decision==="allowed"?{blocked:!1,allowed:!0,decision:"allowed",approval_id:t.approval?.id??null,approval_status:t.approval?.status??null,warning:t.warning}:t.evaluation.decision==="proposal_required"?{blocked:!1,allowed:!1,decision:"proposal_required",approval_id:null,instruction:"use the existing SOUL.md/POLICY.md proposal flow; approvals do not cover protected human files",warning:t.warning}:{blocked:!1,allowed:!1,decision:"denied",approval_id:null,instruction:"stop; denied actions are not approvable through Approval Gate",warning:t.warning}}function KR(e){return e instanceof Error?e.message:"Unknown MCP response error"}async function vl(e,t,r){let o=e.rest[0];if(!o){await _m(t);return}if(o==="manifest"){let n=Dt({host:cm(e.flags),commandMode:el(e.flags),home:t,projectRoot:u(e.flags,"project-root")});m(n,r,`MCP manifest generated for ${n.host}`);return}if(o==="smoke"){let n=await Yn({jsonrpc:"2.0",id:1,method:"initialize"},t),s=await Yn({jsonrpc:"2.0",id:2,method:"life_status"},t),a={ok:n!==null&&s!==null&&"result"in n&&"result"in s,initialize:n,status:s};m(a,r,a.ok?"MCP smoke passed":"MCP smoke failed");return}if(o==="install"){let n=await ao({home:t,host:Zi(e.flags),targetPath:u(e.flags,"target"),apply:b(e.flags,"apply"),commandMode:el(e.flags),projectRoot:u(e.flags,"project-root")});m(n,r,`${n.dryRun?"Planned":"Applied"} MCP registration for ${n.host}: ${n.action}`);return}if(o==="rollback"){let n=u(e.flags,"snapshot");if(!n)throw new Error("mcp rollback requires --snapshot <path>");let s=await qa({home:t,snapshotPath:n,apply:b(e.flags,"apply")});m(s,r,`${s.dryRun?"Planned rollback":"Rolled back"} MCP target ${s.targetPath}`);return}if(o==="doctor"){let n=await io({host:Zi(e.flags),targetPath:u(e.flags,"target")});m(n,r,n.configured?`MCP configured for ${n.host}`:`MCP not configured for ${n.host}`);return}throw new Error("mcp requires manifest, smoke, install, rollback, doctor, or stdio mode with no subcommand")}async function kl(e,t,r){let o=e.rest[0];if(o==="flush-hook"){let n=u(e.flags,"text")?"":await To(),s=Co(n),a=u(e.flags,"text")??(typeof s=="string"?s:void 0),i=await da({home:t,host:u(e.flags,"host")??"codex",cwd:u(e.flags,"cwd")??process.cwd(),event:u(e.flags,"event")??e.rest[1],text:a,payload:typeof s=="string"?void 0:s});m(i,r,`Memory candidate proposed from ${i.host} ${i.event}: ${i.memory.id}`);return}if(o==="recall-hook"){let n=u(e.flags,"prompt")?"":await To(),s=Co(n),a=u(e.flags,"prompt")??tm(s),i=await ua({home:t,host:u(e.flags,"host")??"codex",cwd:u(e.flags,"cwd")??process.cwd(),prompt:a,limit:E(e.flags,"limit")});m(i,r,i.context||`Memory recall skipped: ${i.decision.reason}`);return}if(o==="index"){let n=await la({home:t,limit:E(e.flags,"limit")});m(n,r,`Semantic index updated: ${n.indexed_count} indexed, ${n.skipped_unchanged} unchanged`);return}if(o==="reflect"){let n=await Ya({home:t,cwd:u(e.flags,"cwd")??process.cwd(),project:u(e.flags,"project"),limit:E(e.flags,"limit"),apply:b(e.flags,"apply")});m(n,r,n.applied?`Reflection report applied: ${n.proposals.length} proposal(s), ${n.report_path}`:n.report);return}if(o==="add"){let n=u(e.flags,"text");if(!n)throw new Error("memory add requires --text");let s=u(e.flags,"project")??u(e.flags,"scope")??L(process.cwd(),t),a=await ca(t,{content:n,project:s});m(a,r,`Memory added: ${a.id}`);return}if(o==="propose"){let n=u(e.flags,"text");if(!n)throw new Error("memory propose requires --text");let s=u(e.flags,"project")??u(e.flags,"scope")??L(process.cwd(),t),a=await ae(t,{content:n,project:s});m(a,r,`Memory proposed: ${a.id}`);return}if(o==="promote"||o==="reject"||o==="forget"||o==="expire"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error(`memory ${o} requires <id> or --id <id>`);let s=o==="promote"?await Rt(t,n):o==="reject"?await St(t,n):o==="forget"?await At(t,n):await Jr(t,n);m(s,r,`Memory ${o}d: ${s.id}`);return}if(o==="export"){let n=u(e.flags,"project")??u(e.flags,"scope"),s=await Et({home:t,project:n,includeForgotten:b(e.flags,"include-forgotten"),limit:E(e.flags,"limit")});m(s,r,`${s.length} memor${s.length===1?"y":"ies"} exported`);return}if(o==="search"){let n=e.rest.slice(1).join(" ")||(u(e.flags,"query")??""),s=u(e.flags,"project")??L(process.cwd(),t),a=E(e.flags,"limit")??5,i=await Pt(t,n,s,a);m(i,r,`${i.length} memor${i.length===1?"y":"ies"} found`);return}throw new Error("memory requires add, propose, flush-hook, recall-hook, index, reflect, promote, reject, forget, expire, export, or search")}async function wl(e,t,r){let o=e.rest[0];if(o==="list"){let n=await ma({home:t,status:im(e.flags),limit:E(e.flags,"limit")});m(n,r,GR(n.projects,n.warning));return}if(o==="show"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error("project show requires <id|.>");let s=await ga({home:t,id:n,cwd:u(e.flags,"cwd")??process.cwd()});m(s,r,XR(s)),s.registry_available&&!s.registry&&(process.exitCode=1);return}if(o==="rename"){let n=e.rest[1]??u(e.flags,"id"),s=u(e.flags,"name");if(!n||!s)throw new Error("project rename requires <id|.> --name <display>");let a=await fa({home:t,id:n,name:s,cwd:u(e.flags,"cwd")??process.cwd()});m(a,r,a.found?`Project renamed: ${a.id} -> ${a.new_name}`:`Project not found: ${a.id}`),a.found||(process.exitCode=1);return}if(o==="alias"){let n=e.rest[1];if(n==="list"){let s=await _a({home:t});m(s,r,Object.keys(s.aliases).length===0?"No project aliases":YR(s.aliases));return}if(n==="add"){let s=e.rest[2],a=u(e.flags,"as");if(!s||!a)throw new Error("project alias add requires <id> --as <custom-id>");let i=await ba({home:t,id:s,alias:a,apply:b(e.flags,"apply")});m(i,r,vm(i));return}if(n==="remove"){let s=e.rest[2]??u(e.flags,"as");if(!s)throw new Error("project alias remove requires <custom-id>");let a=await va({home:t,alias:s,apply:b(e.flags,"apply")});m(a,r,vm(a));return}throw new Error("project alias requires add, remove, or list")}if(o==="forget"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error("project forget requires <id>");let s=await ha({home:t,id:n,includeMemories:b(e.flags,"include-memories"),apply:b(e.flags,"apply"),confirm:u(e.flags,"confirm")});m(s,r,QR(s)),(!s.found||s.mode==="forget_memories"&&!s.guard_ok)&&(process.exitCode=1);return}if(o==="reactivate"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error("project reactivate requires <id>");let s=await ya({home:t,id:n});m(s,r,ZR(s)),s.found||(process.exitCode=1);return}if(o==="pin"){let n=u(e.flags,"cwd")??process.cwd(),s=await oa({cwd:n,home:t,apply:b(e.flags,"apply")});m(s,r,s.applied?`Project marker pinned at ${s.marker_path} (${s.base_id})`:`Project pin dry-run: would write ${s.marker_path} (${s.base_id})`);return}throw new Error("project requires list, show, rename, alias, forget, reactivate, or pin")}function GR(e,t){if(t)return`Project registry unavailable: ${t}`;if(e.length===0)return"No projects found";let r=e.map(o=>{let n=o.counts;return`${o.id} ${o.display_name} ${o.status} memories:${n.memories.active}/${n.memories.total} commitments:${n.commitments.open}/${n.commitments.total} semantic:${n.semantic_memory_index.total} runs:${n.runs.total} sessions:${n.sessions.total}`});return[`${e.length} project(s)`,...r].join(`
1068
+ `)}function XR(e){if(!e.registry_available)return`Project registry unavailable: ${e.warning??"unknown"}`;if(!e.registry)return`Project not found: ${e.effective_id}`;let t=e.counts??zR();return[`Project ${e.registry.id}`,`Name: ${e.registry.display_name}`,`Status: ${e.registry.status}`,`Effective id: ${e.effective_id}`,`Base id: ${e.registry.base_id}`,`Source: ${e.registry.source}; live source: ${e.live_resolution.source}`,`Alias active: ${e.live_resolution.alias_key??"no"}`,`Marker active: ${e.live_resolution.marker_path??"no"}`,`Counts: memories ${t.memories.active}/${t.memories.total}, semantic ${t.semantic_memory_index.total}, commitments ${t.commitments.open}/${t.commitments.total}, runs ${t.runs.total}, sessions ${t.sessions.total}`,`Continuity gap: ${e.continuity_gap?"yes":"no"}`].join(`
1069
+ `)}function zR(){return{memories:{total:0,active:0,last_activity_at:null},semantic_memory_index:{total:0,last_activity_at:null},commitments:{total:0,open:0,last_activity_at:null},runs:{total:0,last_activity_at:null},sessions:{total:0,last_activity_at:null}}}function YR(e){return Object.entries(e).map(([t,r])=>`${t} -> ${r}`).join(`
1070
+ `)}function vm(e){let t=e.applied?"applied":"dry-run";if(e.action==="add"){let r=e.previous_id&&e.previous_id!==e.project_id?` replacing ${e.previous_id}`:"";return`Project alias ${t}: ${e.alias_key} -> ${e.project_id}${r}`}return`Project alias removal ${t}: ${e.alias_key}`}function QR(e){return e.found?e.mode==="forget_memories"&&!e.guard_ok?[`Project forget dry-run refused: ${e.id}`,`Would transition ${e.memories_affected} memory record(s) to forgotten.`,`Run with --include-memories --apply --confirm ${e.id} to apply.`].join(`
1071
+ `):e.mode==="forget_memories"?`Project forgotten: ${e.id}; memories affected: ${e.memories_affected}`:`Project archived: ${e.id}`:`Project not found: ${e.id}`}function ZR(e){return e.found?`Project reactivated: ${e.id}`:`Project not found: ${e.id}`}import{readFile as eS}from"node:fs/promises";async function Sl(e,t,r){let o=e.rest[0];if(o==="status"){let n=await Xr(t);m(n,r,n.ritual_pending?"Onboarding ritual pending":"Onboarding complete");return}if(o==="activation"){let n=tS(e),s=await Ra({home:t,profile:n,dry_run:!b(e.flags,"apply"),user_confirmed:b(e.flags,"user-confirmed"),reset:b(e.flags,"reset"),options:{scheduler_host:u(e.flags,"scheduler-host"),heartbeat_cadence:u(e.flags,"heartbeat-cadence"),recall_auto_trigger:b(e.flags,"recall-auto-trigger")||void 0,memory_candidates:b(e.flags,"memory-candidates")||void 0,auto_promotion:b(e.flags,"auto-promotion")||void 0,promotion_policy:rS(e.flags),recall_auto_trigger_keywords:Rl(e.flags,"recall-keywords"),recall_auto_trigger_denylist:Rl(e.flags,"recall-denylist"),candidate_auto_promotion_threshold:oS(e.flags),standing_order_templates:Rl(e.flags,"standing-order-templates")}});m(s,r,s.applied?"Activation profile applied":"Activation profile dry-run planned");return}if(o==="verify"){let n=await Io({home:t,host:ze(e.flags),surface:xe(e.flags),targetRoot:u(e.flags,"target-root"),projectCwd:u(e.flags,"project-cwd"),apply:b(e.flags,"apply"),userConfirmed:b(e.flags,"user-confirmed"),retainTestData:b(e.flags,"retain-test-data")});m(n,r,n.overall_status==="ready"?"Cross-host verification passed":`Cross-host verification ${n.overall_status}`);return}if(o==="apply"){let n=u(e.flags,"payload-file")??e.rest[1];if(!n)throw new Error("onboard apply requires --payload-file <path>");let s=JSON.parse(await eS(n,"utf8")),a=await zr({home:t,dry_run:b(e.flags,"apply")?!1:s.dry_run!==!1,user_confirmed:b(e.flags,"user-confirmed")||s.user_confirmed===!0,files:s.files,config_patch:s.config_patch});m(a,r,a.applied?"Onboarding files applied":"Onboarding dry-run planned");return}if(o==="complete"){let n=await Yr({home:t,archive:!b(e.flags,"no-archive")});m(n,r,n.already_complete?"Onboarding already complete":"Onboarding ritual completed");return}throw new Error("onboard requires status, activation, verify, apply, or complete")}function tS(e){let t=u(e.flags,"profile")??e.rest[1]??"quickstart";if(t==="quickstart"||t==="advanced")return t;throw new Error("onboard activation requires --profile quickstart|advanced")}function rS(e){let t=u(e,"promotion-policy");if(t!==void 0){if(t==="manual"||t==="explicit_approval")return t;throw new Error("onboard activation --promotion-policy requires manual|explicit_approval")}}function oS(e){let t=u(e,"candidate-confidence-threshold");if(t===void 0)return;let r=E(new Map([["candidate-confidence-threshold",t]]),"candidate-confidence-threshold");if(r===void 0)throw new Error("onboard activation --candidate-confidence-threshold must be a number");if(r>=0&&r<=1)return r;throw new Error("onboard activation --candidate-confidence-threshold must be between 0 and 1")}function Rl(e,t){let r=u(e,t);if(r)return r.split(",").map(o=>o.trim()).filter(Boolean)}async function Al(e,t,r){let o=e.rest[0];if(o==="evaluate"){let n=u(e.flags,"action")??e.rest[1];if(!n)throw new Error("policy evaluate requires --action <id>");let s=await pt({home:t,action:n,className:lm(e.flags),target:u(e.flags,"target")});m(s,r,`Policy decision for ${s.action}: ${s.decision}`);return}if(o==="standing-orders"&&e.rest[1]==="list"){let n=await ut(t);m(n,r,`${n.length} standing order(s)`);return}if(o==="packs"){await nS(e,t,r);return}if(o==="pretooluse-hook"){let n=await To(),s=Co(n)??{},a=await ki({home:t,host:u(e.flags,"host")??"codex",cwd:u(e.flags,"cwd"),payload:s});m(a,r,a.message);return}if(o==="propose-change"){let n=u(e.flags,"target")??e.rest[1],s=u(e.flags,"summary");if(!n||!s)throw new Error("policy propose-change requires --target SOUL.md|POLICY.md and --summary <text>");let a=await wi({home:t,target:n,summary:s});m(a,r,`Policy change proposal created: ${a.proposalPath}`);return}throw new Error("policy requires evaluate, standing-orders list, packs list|show|validate|apply|rollback, pretooluse-hook, or propose-change")}async function nS(e,t,r){let o=e.rest[1];if(o==="list"){let n=await Fi();m(n,r,`${n.length} policy pack(s)`);return}if(o==="show"){let n=e.rest[2]??u(e.flags,"id");if(!n)throw new Error("policy packs show requires <id> or --id <id>");let s=await xo(n);m(s,r,`Policy pack ${s.id} ${s.version}`);return}if(o==="validate"){let n=e.rest[2]??u(e.flags,"id"),s=await Ui({id:n,file:u(e.flags,"file")});m(s,r,s.valid?`Policy pack valid: ${s.id}`:`Policy pack invalid: ${s.errors.join("; ")}`);return}if(o==="apply"){let n=e.rest[2]??u(e.flags,"id"),s=await Ji({home:t,id:n,file:u(e.flags,"file"),targetRoot:u(e.flags,"target-root"),apply:b(e.flags,"apply"),reviewed:b(e.flags,"reviewed"),approvalEvidence:u(e.flags,"approval")});m(s,r,`${s.dryRun?"Planned":"Applied"} policy pack ${s.pack.id}: ${s.files.filter(a=>a.changed).length} file change(s)`);return}if(o==="rollback"){let n=u(e.flags,"snapshot")??e.rest[2];if(!n)throw new Error("policy packs rollback requires --snapshot <path>");let s=await qi({home:t,snapshotPath:n,apply:b(e.flags,"apply")});m(s,r,`${s.dryRun?"Planned rollback":"Rolled back"} policy pack ${s.pack.id}: ${s.files.length} file change(s)`);return}throw new Error("policy packs requires list, show, validate, apply, or rollback")}async function Pl(e,t,r){let o=e.rest[0];if(o==="create"){let n=u(e.flags,"title");if(!n)throw new Error("work create requires --title <text>");let s=await bo({home:t,project:u(e.flags,"project")??L(process.cwd(),t),title:n,description:u(e.flags,"description")??null,priority:Kn(e.flags),source:"cli",tags:Qi(e.flags,"tags"),host:u(e.flags,"host")??null});m(s,r,`Work item created: ${s.id}`);return}if(o==="list"){let n=await vo({home:t,project:u(e.flags,"project"),status:qn(e.flags),priority:Kn(e.flags),assignedHost:u(e.flags,"host"),limit:E(e.flags,"limit")});m(n,r,`${n.length} work item(s)`);return}if(o==="claim"){let n=El(e,"claim"),s=u(e.flags,"host")??"cli",a=await ko({home:t,id:n,host:s});m(a,r,`Work item ${a.id} claimed by host ${s}`);return}if(o==="update"){let n=El(e,"update"),s=qn(e.flags),a=Kn(e.flags),i=u(e.flags,"host"),l=u(e.flags,"description"),c=Qi(e.flags,"tags"),d=u(e.flags,"run");if(s===void 0&&a===void 0&&i===void 0&&l===void 0&&c===void 0&&d===void 0)throw new Error("work update requires at least one of --status, --priority, --host, --description, --tags, or --run");let p=await wo({home:t,id:n,status:s,priority:a,assignedHost:i,description:l,tags:c,metadata:d===void 0?void 0:{run_id:d}});m(p,r,`Work item updated: ${p.id}`);return}if(o==="complete"){let n=El(e,"complete"),s=qn(e.flags);if(s!==void 0&&s!=="done"&&s!=="failed")throw new Error("work complete --status must be done or failed");let a=await Ro({home:t,id:n,status:s});m(a,r,`Work item completed: ${a.id} (${a.status})`);return}throw new Error("work requires create, list, claim, update, or complete")}function El(e,t){let r=e.rest[1]??u(e.flags,"id");if(!r)throw new Error(`work ${t} requires <id> or --id <id>`);return r}function xl(){process.stdout.write(`nativesoul
974
1072
 
975
1073
  Commands:
976
1074
  init [--home <path>] [--json]
@@ -1010,7 +1108,13 @@ Commands:
1010
1108
  commitments list [--project <id>] [--status open|completed|dismissed|expired] [--include-expired] [--limit <n>] [--home <path>] [--json]
1011
1109
  commitments complete <id> [--home <path>] [--json]
1012
1110
  commitments dismiss <id> [--home <path>] [--json]
1013
- dashboard data [--project <id>] [--host <id>] [--limit <n>] [--since <iso>] [--until <iso>] [--home <path>] [--json]
1111
+ work create --title <text> [--description <text>] [--priority low|normal|high|urgent] [--project <id>] [--tags <csv>] [--host <id>] [--home <path>] [--json]
1112
+ work list [--project <id>] [--status inbox|assigned|in_progress|review|blocked|done|failed] [--priority low|normal|high|urgent] [--host <id>] [--limit <n>] [--home <path>] [--json]
1113
+ work claim <id> [--host <id>] [--home <path>] [--json]
1114
+ work update <id> [--status inbox|assigned|in_progress|review|blocked|done|failed] [--priority low|normal|high|urgent] [--host <id>] [--description <text>] [--tags <csv>] [--run <run_id>] [--home <path>] [--json]
1115
+ work complete <id> [--status done|failed] [--home <path>] [--json]
1116
+ cost [--project <id>] [--host <id>] [--since <iso|duration>] [--until <iso>] [--group-by project|host|day] [--limit <n>] [--home <path>] [--json]
1117
+ dashboard data [--project <id>] [--host <id>] [--limit <n>] [--since <iso>] [--until <iso>] [--section work|approvals|cost] [--home <path>] [--json]
1014
1118
  dashboard viewer [--project <id>] [--host <id>] [--limit <n>] [--since <iso>] [--until <iso>] [--output <path>] [--home <path>] [--json]
1015
1119
  feedback m7 [--project <id>] [--host <id>] [--limit <n>] [--home <path>] [--json]
1016
1120
  adapters scan [--host codex|claude|grok|antigravity|gemini|all] [--json]
@@ -1040,7 +1144,7 @@ Commands:
1040
1144
  policy packs rollback --snapshot <path> [--home <path>] [--apply] [--json]
1041
1145
  policy propose-change --target SOUL.md|POLICY.md --summary <text> [--home <path>] [--json]
1042
1146
  heartbeat claim --slot <id> [--host <id>] [--project <id>] [--ttl-seconds <n>] [--home <path>] [--json]
1043
- heartbeat complete --slot <id> [--host <id>] [--project <id>] [--result <text>] [--evidence <text>] [--home <path>] [--json]
1147
+ heartbeat complete --slot <id> [--host <id>] [--project <id>] [--result <text>] [--evidence <text>] [--work-item <id>] [--home <path>] [--json]
1044
1148
  heartbeat status [--project <id>] [--limit <n>] [--home <path>] [--json]
1045
1149
  schedule reconcile --host codex|claude|grok|antigravity|gemini [--surface claude-code|desktop|claude-desktop] --mode leader|federated|per-project [--target-root <path>] [--home <path>] [--apply] [--json]
1046
1150
  schedule list [--host codex|claude|grok|antigravity|gemini] [--limit <n>] [--home <path>] [--json]
@@ -1061,6 +1165,6 @@ Commands:
1061
1165
  onboard apply --payload-file <path> [--apply] [--user-confirmed] [--home <path>] [--json]
1062
1166
  onboard complete [--no-archive] [--home <path>] [--json]
1063
1167
  mcp [--home <path>]
1064
- `)}async function tR(e){let t=mi(e);if(aR(t)){process.stdout.write(`${Ot}
1065
- `);return}if(gi(t)){$i();return}let r=u(t.flags,"home"),o=_(t.flags,"json");if(!nR(t)){let a=await rr(r);if(!a.ok){m(a,o,no(a)),process.exitCode=1;return}}switch(t.command){case"init":{let a=await Bu(r);m(a,o,`NativeSoul initialized at ${a.home}`);return}case"status":{let a=Sa(r);m(a,o,`NativeSoul ${a.initialized?"initialized":"not initialized"} at ${a.home}`);return}case"doctor":{if(_(t.flags,"deep")){let n=_(t.flags,"require-full-native"),s=await Ct({home:r,host:qe(t.flags),surface:ke(t.flags),targetRoot:u(t.flags,"target-root")}),i=`full-native ${s.full_native_matrix.full_native_count}/${s.full_native_matrix.host_count}`;m(s,o,s.healthy?`NativeSoul deep doctor healthy: ${s.status}; ${i}`:`NativeSoul deep doctor found ${s.issues.length} issue(s); ${i}`),n&&!s.full_native_matrix.require_full_native_ready&&(process.exitCode=1);return}let a=await Dr(r);m(a,o,a.healthy?`NativeSoul healthy at ${a.home}`:`NativeSoul has ${a.issues.length} issue(s)`);return}case"install":{let a=await Ws({home:r,host:qe(t.flags),surface:ke(t.flags),apply:_(t.flags,"apply"),targetRoot:u(t.flags,"target-root")});m(a,o,a.applied?`NativeSoul install applied: ${a.status}`:`NativeSoul install planned: ${a.status}`);return}case"uninstall":{let a=await Xs({home:r,host:qe(t.flags),surface:ke(t.flags),apply:_(t.flags,"apply"),targetRoot:u(t.flags,"target-root"),purgeData:_(t.flags,"purge-data"),confirmPurge:u(t.flags,"confirm-purge-nativesoul-data")});m(a,o,a.applied?`NativeSoul uninstall applied: ${a.status}`:`NativeSoul uninstall planned: ${a.status}`);return}case"memory":{await Oi(t,r,o);return}case"project":{await Mi(t,r,o);return}case"import":{await Ei(t,r,o);return}case"license":{await xi(t,r,o);return}case"marketing-audit":{await ji(t,r,o);return}case"commitments":{await Ri(t,r,o);return}case"dashboard":{await ki(t,r,o);return}case"feedback":{await Si(t,r,o);return}case"adapters":{await _i(t,o);return}case"activate":{await yi(t,r,o);return}case"capabilities":{await wi(t,r,o);return}case"audit":{await bi(t,r,o);return}case"approvals":{await vi(t,r,o);return}case"policy":{await Di(t,r,o);return}case"heartbeat":{await Ai(t,r,o);return}case"schedule":{await Pi(t,r,o);return}case"bootstrap":{let a=u(t.flags,"cwd")??process.cwd(),n=u(t.flags,"host")??"codex",s=Zu(t.flags);if(s==="cache"){try{let l=await ar({home:r,host:n,recordTelemetry:!1});m(l,o,l.content)}catch(l){try{let c=await ar({home:io(a),host:n,recordTelemetry:!1});m(c,o,c.content);return}catch{}throw await rR({home:r,host:n,cwd:a,source:"bootstrap-cache",error:l}),l}return}let i=await Pt({home:r,host:n,cwd:a,query:u(t.flags,"query"),readOnly:s==="inject"});if(s==="inject"){try{let l=await ya({home:r,host:n,payload:i});m(l,o,l.content)}catch(l){try{let d=await ya({home:io(a),host:n,payload:i,recordTelemetry:!1});m(d,o,d.content);return}catch{}let c=ha({host:n,payload:i,degraded:!0,warnings:[`BOOTSTRAP_CACHE_WRITE_SKIPPED:${oR(l)}`]});m(c,o,c.content)}return}m(i,o,`Bootstrap ready for ${n} in project ${i.project.id}`);return}case"onboard":{await Hi(t,r,o);return}case"mcp":{await Ni(t,r,o);return}case"help":case void 0:$i();return;default:throw new Error(`Unknown command: ${t.command}`)}}async function rR(e){try{await Te({home:e.home,host:e.host,outcome:"failed",tier:"D",cwd:e.cwd,project:D(e.cwd,e.home),source:e.source,error:e.error})}catch{}}function oR(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"?e.code:"unavailable"}function aR(e){return e.command==="--version"||e.command==="-v"||e.command==="version"}function nR(e){if(e.command==="license"){let t=e.rest[0];return t==="activate"||t==="status"}return!1}function sR(){if(process.argv[1]===void 0)return!1;let e=eR(import.meta.url);try{return lp(process.argv[1])===lp(e)}catch{return Zw.resolve(process.argv[1])===e}}sR()&&tR(process.argv.slice(2)).catch(e=>{let t=e instanceof Error?e.message:"Unknown error";process.stderr.write(`nativesoul error: ${t}
1066
- `),process.exitCode=1});export{tR as main,mi as parseArgs,gi as shouldPrintHelp};
1168
+ `)}async function iS(e){let t=zi(e);if(dS(t)){process.stdout.write(`${Ut}
1169
+ `);return}if(Yi(t)){xl();return}let r=u(t.flags,"home"),o=b(t.flags,"json");if(!uS(t)){let n=await ir(r);if(!n.ok){m(n,o,ho(n)),process.exitCode=1;return}}switch(t.command){case"init":{let n=await em(r);m(n,o,`NativeSoul initialized at ${n.home}`);return}case"status":{let n=Jn(r);m(n,o,`NativeSoul ${n.initialized?"initialized":"not initialized"} at ${n.home}`);return}case"doctor":{if(b(t.flags,"deep")){let s=b(t.flags,"require-full-native"),a=await Ht({home:r,host:ze(t.flags),surface:xe(t.flags),targetRoot:u(t.flags,"target-root")}),i=`full-native ${a.full_native_matrix.full_native_count}/${a.full_native_matrix.host_count}`;m(a,o,a.healthy?`NativeSoul deep doctor healthy: ${a.status}; ${i}`:`NativeSoul deep doctor found ${a.issues.length} issue(s); ${i}`),s&&!a.full_native_matrix.require_full_native_ready&&(process.exitCode=1);return}let n=await Kr(r);m(n,o,n.healthy?`NativeSoul healthy at ${n.home}`:`NativeSoul has ${n.issues.length} issue(s)`);return}case"install":{let n=await Ti({home:r,host:ze(t.flags),surface:xe(t.flags),apply:b(t.flags,"apply"),targetRoot:u(t.flags,"target-root")});m(n,o,n.applied?`NativeSoul install applied: ${n.status}`:`NativeSoul install planned: ${n.status}`);return}case"uninstall":{let n=await Ni({home:r,host:ze(t.flags),surface:xe(t.flags),apply:b(t.flags,"apply"),targetRoot:u(t.flags,"target-root"),purgeData:b(t.flags,"purge-data"),confirmPurge:u(t.flags,"confirm-purge-nativesoul-data")});m(n,o,n.applied?`NativeSoul uninstall applied: ${n.status}`:`NativeSoul uninstall planned: ${n.status}`);return}case"memory":{await kl(t,r,o);return}case"project":{await wl(t,r,o);return}case"import":{await gl(t,r,o);return}case"license":{await fl(t,r,o);return}case"marketing-audit":{await hl(t,r,o);return}case"commitments":{await al(t,r,o);return}case"work":{await Pl(t,r,o);return}case"dashboard":{await dl(t,r,o);return}case"cost":{await cl(t,r,o);return}case"feedback":{await ul(t,r,o);return}case"adapters":{await rl(t,o);return}case"activate":{await tl(t,r,o);return}case"capabilities":{await sl(t,r,o);return}case"audit":{await nl(t,r,o);return}case"approvals":{await ol(t,r,o);return}case"policy":{await Al(t,r,o);return}case"heartbeat":{await pl(t,r,o);return}case"schedule":{await ml(t,r,o);return}case"bootstrap":{let n=u(t.flags,"cwd")??process.cwd(),s=u(t.flags,"host")??"codex",a=dm(t.flags);if(a==="cache"){try{let l=await cr({home:r,host:s,recordTelemetry:!1});m(l,o,l.content)}catch(l){try{let c=await cr({home:_o(n),host:s,recordTelemetry:!1});m(c,o,c.content);return}catch{}throw await lS({home:r,host:s,cwd:n,source:"bootstrap-cache",error:l}),l}return}let i=await It({home:r,host:s,cwd:n,query:u(t.flags,"query"),readOnly:a==="inject"});if(a==="inject"){try{let l=await On({home:r,host:s,payload:i});m(l,o,l.content)}catch(l){try{let d=await On({home:_o(n),host:s,payload:i,recordTelemetry:!1});m(d,o,d.content);return}catch{}let c=Nn({host:s,payload:i,degraded:!0,warnings:[`BOOTSTRAP_CACHE_WRITE_SKIPPED:${cS(l)}`]});m(c,o,c.content)}return}m(i,o,`Bootstrap ready for ${s} in project ${i.project.id}`);return}case"onboard":{await Sl(t,r,o);return}case"mcp":{await vl(t,r,o);return}case"help":case void 0:xl();return;default:throw new Error(`Unknown command: ${t.command}`)}}async function lS(e){try{await Me({home:e.home,host:e.host,outcome:"failed",tier:"D",cwd:e.cwd,project:L(e.cwd,e.home),source:e.source,error:e.error})}catch{}}function cS(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"?e.code:"unavailable"}function dS(e){return e.command==="--version"||e.command==="-v"||e.command==="version"}function uS(e){if(e.command==="license"){let t=e.rest[0];return t==="activate"||t==="status"}return!1}function pS(){if(process.argv[1]===void 0)return!1;let e=aS(import.meta.url);try{return km(process.argv[1])===km(e)}catch{return sS.resolve(process.argv[1])===e}}pS()&&iS(process.argv.slice(2)).catch(e=>{let t=e instanceof Error?e.message:"Unknown error";process.stderr.write(`nativesoul error: ${t}
1170
+ `),process.exitCode=1});export{iS as main,zi as parseArgs,Yi as shouldPrintHelp};