nativesoul 1.1.1 → 1.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 Ag=Object.defineProperty;var St=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(o){throw r=[o],o}};var nc=(e,t)=>{for(var r in t)Ag(e,r,{get:t[r],enumerable:!0})};import{spawn as uf}from"node:child_process";import{access as pf}from"node:fs/promises";import{constants as mf}from"node:fs";import{existsSync as gf}from"node:fs";import Uc from"node:path";async function Ve(e){let t=(process.env.PATH??"").split(Uc.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 a=Uc.join(o,`${e}${n}`);if(process.platform==="win32"&&gf(a))return a;try{return await pf(a,mf.X_OK),a}catch{}}return null}async function pn(e,t){return new Promise(r=>{Bc(e,t,["ignore","pipe","pipe"]).then(o=>{let n=setTimeout(()=>{o.kill(),r(null)},750),a="";o.stdout.on("data",s=>{a+=String(s)}),o.stderr.on("data",s=>{a+=String(s)}),o.on("error",()=>{clearTimeout(n),r(null)}),o.on("close",s=>{clearTimeout(n);let i=a.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 Ka(e,t,r=1e3){return new Promise(o=>{Bc(e,t,["ignore","pipe","pipe"]).then(n=>{let a=setTimeout(()=>{n.kill(),o({status:"timeout",code:null,stdout:"",stderr:"command timed out"})},r),s="",i="";n.stdout.on("data",l=>{s+=String(l)}),n.stderr.on("data",l=>{i+=String(l)}),n.on("error",()=>{clearTimeout(a),o({status:"missing",code:null,stdout:s,stderr:i})}),n.on("close",l=>{clearTimeout(a),o({status:l===0?"ok":"error",code:l,stdout:s,stderr:i})})})})}async function Bc(e,t,r){let n=await Ve(e)??e,a=process.platform==="win32"&&/\.(?:cmd|bat)$/iu.test(n);return uf(n,t,{stdio:r,shell:a})}var xt=St(()=>{"use strict"});import{constants as ff}from"node:fs";import{access as hf,readFile as yf,stat as _f}from"node:fs/promises";import Vc from"node:os";import bf from"node:path";function j(e){return e==="~"?Vc.homedir():e.startsWith("~/")?bf.join(Vc.homedir(),e.slice(2)):e}async function P(e){try{return await hf(e,ff.F_OK),!0}catch{return!1}}async function W(e){try{return(await _f(e)).isDirectory()}catch{return!1}}async function G(e){return await P(e)?yf(e,"utf8"):null}function Me(e){let t=Wc(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 Wc(e){return{start:`<!-- nativesoul:${e}:start v1 -->`,end:`<!-- nativesoul:${e}:end -->`}}function re(e,t){if(!t)return!1;let r=Wc(t);return e.includes(r.start)&&e.includes(r.end)}var ue=St(()=>{"use strict"});function O(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function We(e){try{return JSON.parse(e)}catch{return null}}async function ee(e){let t=await G(e);if(t===null)return null;let r=We(t);return O(r)?r:null}function at(e){return O(e)?Object.keys(e).filter(t=>t.trim().length>0):[]}function mn(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function st(e,t){if(Array.isArray(e))return e;if(!O(e))return[];for(let r of t){let o=e[r];if(Array.isArray(o))return o}return[]}function I(e,t){if(!O(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 ie(e,t){if(!O(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 Je=St(()=>{"use strict";ue()});import{readdir as Tf,readFile as Cf}from"node:fs/promises";import ed from"node:path";function rd(e){let t=e??j("~/.claude");return ed.join(t,"scheduled-tasks")}async function od(e){if(!await W(e))return null;let t=await Zc(e,td);if(t!==null)return t;let r=await Nf(e);for(let o of r){let n=await Zc(e,o);if(n!==null)return n}return null}async function Zc(e,t){let r=ed.join(e,t,"SKILL.md");if(!await P(r))return null;let n=(await Cf(r,"utf8")).toLowerCase();return t===td||t.includes(Of)||n.includes(`name: ${Qc}`)||n.includes(`# ${Qc}`)?`claude:scheduled-task:${t}`:null}async function Nf(e){try{return(await Tf(e,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>r.name)}catch{return[]}}var td,Of,Qc,nd=St(()=>{"use strict";ue();td="nativesoul-heartbeat",Of="nativesoul-heartbeat",Qc="life:heartbeat"});import{mkdir as Mf,readFile as Lf,writeFile as Df}from"node:fs/promises";import Br from"node:path";import{fileURLToPath as Hf}from"node:url";async function sd(e){try{let t=Br.join(e,ad);await Mf(t,{recursive:!0,mode:448});let r=Br.join(t,"SKILL.md"),o=await Ff();return await Df(r,o??$f,"utf8"),!0}catch{return!1}}async function Ff(){let e=Br.dirname(Hf(import.meta.url)),t=[Br.resolve(process.cwd(),"plugins","claude-nativesoul","skills","life-heartbeat","SKILL.md"),Br.resolve(e,"../../../../plugins/claude-nativesoul/skills/life-heartbeat/SKILL.md")];for(let r of t)if(await P(r))return Lf(r,"utf8");return null}var ad,zP,$f,id=St(()=>{"use strict";ue();ad="nativesoul-heartbeat",zP=`claude:scheduled-task:${ad}`,$f='---\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 ld={};nc(ld,{discoverClaudeScheduledTasksManifest:()=>Uf});async function Uf(e={}){let t=rd(e.hostConfigRoot);if(!e.apply&&!await W(t)||(e.surface==="claude-code"?"claude-code":"claude-desktop")==="claude-code")return null;let o=await od(t);return o!==null?Za({nativeId:o,evidenceSource:"filesystem"}):e.apply&&await sd(t)?Za({nativeId:"claude:scheduled-task:nativesoul-heartbeat",evidenceSource:"filesystem-provisioned"}):await W(t)?Za({nativeId:void 0,evidenceSource:"filesystem"}):null}function Za(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 cd=St(()=>{"use strict";nd();id();ue()});var xd={};nc(xd,{discoverCodexAutomationsManifest:()=>rh});import{readFile as ts}from"node:fs/promises";import hn from"node:path";import{spawnSync as Xf}from"node:child_process";async function rh(e={}){let t=await oh();if(t)return t;let r=await nh(e.hostConfigRoot);return r||(e.apply?(await sh(),await ah()):null)}async function oh(){let e=process.env.NATIVESOUL_CODEX_AUTOMATIONS_FIXTURES;if(e)try{return rs(await ts(hn.join(e,"automations.json"),"utf8"))}catch{return null}let t=process.env.NATIVESOUL_CODEX_AUTOMATIONS_MANIFEST;if(t)try{return rs(await ts(t,"utf8"))}catch{return null}return null}async function nh(e){let t=e??j("~/.codex"),r=[hn.join(t,"automations.json"),hn.join(t,"automations","nativesoul-heartbeat.json"),hn.join(t,"automations","manifest.json")];for(let o of r){if(!await P(o))continue;let n=await ts(o,"utf8"),a=rs(n);if(a?.supported)return a;let s=We(n);if(!s)continue;let i=Pd(s);if(i)return i}return null}async function ah(){let e=ih();for(let t of e)for(let r of Qf){let o=await lh(()=>dh(t,r),eh),n=Pd(o);if(n)return n}return null}async function sh(){let e=await Ve("codex");e&&Xf(e,["app-server","daemon","start"],{encoding:"utf8",stdio:"ignore",timeout:1e4})}function ih(){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 lh(e,t){for(let r=0;r<=t;r+=1){let o=await e();if(o!==null)return o;r<t&&await ch(th)}return null}function ch(e){return new Promise(t=>{setTimeout(t,e)})}async function dh(e,t){let r=new AbortController,o=setTimeout(()=>r.abort(),Zf);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 a=await n.json();return!O(a)||"error"in a?null:"result"in a?a.result:a}catch{return null}finally{clearTimeout(o)}}function Pd(e){let t=uh(e);for(let r of t){let o=ph(r),n=JSON.stringify(r).toLowerCase();if(o&&Yf.some(a=>n.includes(a)))return{supported:!0,native_id:o.startsWith("codex:")?o:`codex:automation:${o}`}}return O(e)&&e.supported===!0?{supported:!0,native_id:typeof e.native_id=="string"?e.native_id:void 0}:null}function uh(e){if(Array.isArray(e))return e;if(!O(e))return[];for(let t of["automations","items","results","data"]){let r=e[t];if(Array.isArray(r))return r}return[]}function ph(e){if(!O(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 rs(e){let t=We(e);return O(t)?{supported:t.supported===!0,native_id:typeof t.native_id=="string"&&t.native_id.length>0?t.native_id:void 0}:null}var Yf,Qf,Zf,eh,th,jd=St(()=>{"use strict";ue();xt();Je();Yf=["life:heartbeat","nativesoul-heartbeat","life-heartbeat"],Qf=["automation/list","automations/list","scheduledAutomation/list"],Zf=1e3,eh=2,th=150});import{realpathSync as Rg}from"node:fs";import lE from"node:path";import{fileURLToPath as cE}from"node:url";import{existsSync as dA}from"node:fs";import{mkdirSync as Hg}from"node:fs";import $g from"node:path";import{pathToFileURL as Fg}from"node:url";function rr(e){if(!e||typeof e!="object"||Array.isArray(e))return{};let t=e;if(t.source!=="host-reported")return{};let r={schema:sc(t.schema)??1,source:"host-reported"},o=ha(t.model);o&&(r.model=o);let n=ac(t.tokens_in);n!==null&&(r.tokens_in=n);let a=ac(t.tokens_out);a!==null&&(r.tokens_out=a);let s=sc(t.cost_usd);s!==null&&(r.cost_usd=s);let i=ha(t.currency);i?r.currency=i:s!==null&&(r.currency="USD");let l=ha(t.reported_at);return l&&(r.reported_at=l),r}function Dr(e){try{return rr(JSON.parse(e))}catch{return{}}}function ha(e){return typeof e=="string"&&e.length>0?e:null}function ac(e){return typeof e!="number"||!Number.isFinite(e)||e<0?null:Math.trunc(e)}function sc(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:null}function At(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 ya(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 ic(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 on(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 Hr(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 nn(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 _a(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 ba(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 $r(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 Fr(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:Dr(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 va(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 an(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 lc(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{value:e}}function cc(e){return e.replaceAll("\\","\\\\").replaceAll("%","\\%").replaceAll("_","\\_")}function Ce(e){return e?1:0}function sn(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 Oe=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 ka(e,t){if(!or(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 Ag=Object.defineProperty;var At=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(o){throw r=[o],o}};var nc=(e,t)=>{for(var r in t)Ag(e,r,{get:t[r],enumerable:!0})};import{spawn as uf}from"node:child_process";import{access as pf}from"node:fs/promises";import{constants as mf}from"node:fs";import{existsSync as gf}from"node:fs";import Uc from"node:path";async function Be(e){let t=(process.env.PATH??"").split(Uc.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 a=Uc.join(o,`${e}${n}`);if(process.platform==="win32"&&gf(a))return a;try{return await pf(a,mf.X_OK),a}catch{}}return null}async function pn(e,t){return new Promise(r=>{Bc(e,t,["ignore","pipe","pipe"]).then(o=>{let n=setTimeout(()=>{o.kill(),r(null)},750),a="";o.stdout.on("data",s=>{a+=String(s)}),o.stderr.on("data",s=>{a+=String(s)}),o.on("error",()=>{clearTimeout(n),r(null)}),o.on("close",s=>{clearTimeout(n);let i=a.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 Ka(e,t,r=1e3){return new Promise(o=>{Bc(e,t,["ignore","pipe","pipe"]).then(n=>{let a=setTimeout(()=>{n.kill(),o({status:"timeout",code:null,stdout:"",stderr:"command timed out"})},r),s="",i="";n.stdout.on("data",l=>{s+=String(l)}),n.stderr.on("data",l=>{i+=String(l)}),n.on("error",()=>{clearTimeout(a),o({status:"missing",code:null,stdout:s,stderr:i})}),n.on("close",l=>{clearTimeout(a),o({status:l===0?"ok":"error",code:l,stdout:s,stderr:i})})})})}async function Bc(e,t,r){let n=await Be(e)??e,a=process.platform==="win32"&&/\.(?:cmd|bat)$/iu.test(n);return uf(n,t,{stdio:r,shell:a})}var jt=At(()=>{"use strict"});import{constants as ff}from"node:fs";import{access as hf,readFile as yf,stat as _f}from"node:fs/promises";import Vc from"node:os";import bf from"node:path";function j(e){return e==="~"?Vc.homedir():e.startsWith("~/")?bf.join(Vc.homedir(),e.slice(2)):e}async function x(e){try{return await hf(e,ff.F_OK),!0}catch{return!1}}async function W(e){try{return(await _f(e)).isDirectory()}catch{return!1}}async function G(e){return await x(e)?yf(e,"utf8"):null}function Ne(e){let t=Wc(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 Wc(e){return{start:`<!-- nativesoul:${e}:start v1 -->`,end:`<!-- nativesoul:${e}:end -->`}}function te(e,t){if(!t)return!1;let r=Wc(t);return e.includes(r.start)&&e.includes(r.end)}var de=At(()=>{"use strict"});function O(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ve(e){try{return JSON.parse(e)}catch{return null}}async function Z(e){let t=await G(e);if(t===null)return null;let r=Ve(t);return O(r)?r:null}function at(e){return O(e)?Object.keys(e).filter(t=>t.trim().length>0):[]}function mn(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function st(e,t){if(Array.isArray(e))return e;if(!O(e))return[];for(let r of t){let o=e[r];if(Array.isArray(o))return o}return[]}function I(e,t){if(!O(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 se(e,t){if(!O(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 We=At(()=>{"use strict";de()});import{readdir as Tf,readFile as Cf}from"node:fs/promises";import ed from"node:path";function rd(e){let t=e??j("~/.claude");return ed.join(t,"scheduled-tasks")}async function od(e){if(!await W(e))return null;let t=await Zc(e,td);if(t!==null)return t;let r=await Nf(e);for(let o of r){let n=await Zc(e,o);if(n!==null)return n}return null}async function Zc(e,t){let r=ed.join(e,t,"SKILL.md");if(!await x(r))return null;let n=(await Cf(r,"utf8")).toLowerCase();return t===td||t.includes(Of)||n.includes(`name: ${Qc}`)||n.includes(`# ${Qc}`)?`claude:scheduled-task:${t}`:null}async function Nf(e){try{return(await Tf(e,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>r.name)}catch{return[]}}var td,Of,Qc,nd=At(()=>{"use strict";de();td="nativesoul-heartbeat",Of="nativesoul-heartbeat",Qc="life:heartbeat"});import{mkdir as Mf,readFile as Lf,writeFile as Df}from"node:fs/promises";import Br from"node:path";import{fileURLToPath as Hf}from"node:url";async function sd(e){try{let t=Br.join(e,ad);await Mf(t,{recursive:!0,mode:448});let r=Br.join(t,"SKILL.md"),o=await Ff();return await Df(r,o??$f,"utf8"),!0}catch{return!1}}async function Ff(){let e=Br.dirname(Hf(import.meta.url)),t=[Br.resolve(process.cwd(),"plugins","claude-nativesoul","skills","life-heartbeat","SKILL.md"),Br.resolve(e,"../../../../plugins/claude-nativesoul/skills/life-heartbeat/SKILL.md")];for(let r of t)if(await x(r))return Lf(r,"utf8");return null}var ad,zP,$f,id=At(()=>{"use strict";de();ad="nativesoul-heartbeat",zP=`claude:scheduled-task:${ad}`,$f='---\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 ld={};nc(ld,{discoverClaudeScheduledTasksManifest:()=>Uf});async function Uf(e={}){let t=rd(e.hostConfigRoot);if(!e.apply&&!await W(t)||(e.surface==="claude-code"?"claude-code":"claude-desktop")==="claude-code")return null;let o=await od(t);return o!==null?Za({nativeId:o,evidenceSource:"filesystem"}):e.apply&&await sd(t)?Za({nativeId:"claude:scheduled-task:nativesoul-heartbeat",evidenceSource:"filesystem-provisioned"}):await W(t)?Za({nativeId:void 0,evidenceSource:"filesystem"}):null}function Za(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 cd=At(()=>{"use strict";nd();id();de()});var xd={};nc(xd,{discoverCodexAutomationsManifest:()=>rh});import{readFile as ts}from"node:fs/promises";import hn from"node:path";import{spawnSync as Xf}from"node:child_process";async function rh(e={}){let t=await oh();if(t)return t;let r=await nh(e.hostConfigRoot);return r||(e.apply?(await sh(),await ah()):null)}async function oh(){let e=process.env.NATIVESOUL_CODEX_AUTOMATIONS_FIXTURES;if(e)try{return rs(await ts(hn.join(e,"automations.json"),"utf8"))}catch{return null}let t=process.env.NATIVESOUL_CODEX_AUTOMATIONS_MANIFEST;if(t)try{return rs(await ts(t,"utf8"))}catch{return null}return null}async function nh(e){let t=e??j("~/.codex"),r=[hn.join(t,"automations.json"),hn.join(t,"automations","nativesoul-heartbeat.json"),hn.join(t,"automations","manifest.json")];for(let o of r){if(!await x(o))continue;let n=await ts(o,"utf8"),a=rs(n);if(a?.supported)return a;let s=Ve(n);if(!s)continue;let i=Pd(s);if(i)return i}return null}async function ah(){let e=ih();for(let t of e)for(let r of Qf){let o=await lh(()=>dh(t,r),eh),n=Pd(o);if(n)return n}return null}async function sh(){let e=await Be("codex");e&&Xf(e,["app-server","daemon","start"],{encoding:"utf8",stdio:"ignore",timeout:1e4})}function ih(){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 lh(e,t){for(let r=0;r<=t;r+=1){let o=await e();if(o!==null)return o;r<t&&await ch(th)}return null}function ch(e){return new Promise(t=>{setTimeout(t,e)})}async function dh(e,t){let r=new AbortController,o=setTimeout(()=>r.abort(),Zf);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 a=await n.json();return!O(a)||"error"in a?null:"result"in a?a.result:a}catch{return null}finally{clearTimeout(o)}}function Pd(e){let t=uh(e);for(let r of t){let o=ph(r),n=JSON.stringify(r).toLowerCase();if(o&&Yf.some(a=>n.includes(a)))return{supported:!0,native_id:o.startsWith("codex:")?o:`codex:automation:${o}`}}return O(e)&&e.supported===!0?{supported:!0,native_id:typeof e.native_id=="string"?e.native_id:void 0}:null}function uh(e){if(Array.isArray(e))return e;if(!O(e))return[];for(let t of["automations","items","results","data"]){let r=e[t];if(Array.isArray(r))return r}return[]}function ph(e){if(!O(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 rs(e){let t=Ve(e);return O(t)?{supported:t.supported===!0,native_id:typeof t.native_id=="string"&&t.native_id.length>0?t.native_id:void 0}:null}var Yf,Qf,Zf,eh,th,jd=At(()=>{"use strict";de();jt();We();Yf=["life:heartbeat","nativesoul-heartbeat","life-heartbeat"],Qf=["automation/list","automations/list","scheduledAutomation/list"],Zf=1e3,eh=2,th=150});import{realpathSync as Sg}from"node:fs";import lE from"node:path";import{fileURLToPath as cE}from"node:url";import{existsSync as dA}from"node:fs";import{mkdirSync as Hg}from"node:fs";import $g from"node:path";import{pathToFileURL as Fg}from"node:url";function or(e){if(!e||typeof e!="object"||Array.isArray(e))return{};let t=e;if(t.source!=="host-reported")return{};let r={schema:sc(t.schema)??1,source:"host-reported"},o=ha(t.model);o&&(r.model=o);let n=ac(t.tokens_in);n!==null&&(r.tokens_in=n);let a=ac(t.tokens_out);a!==null&&(r.tokens_out=a);let s=sc(t.cost_usd);s!==null&&(r.cost_usd=s);let i=ha(t.currency);i?r.currency=i:s!==null&&(r.currency="USD");let l=ha(t.reported_at);return l&&(r.reported_at=l),r}function Dr(e){try{return or(JSON.parse(e))}catch{return{}}}function ha(e){return typeof e=="string"&&e.length>0?e:null}function ac(e){return typeof e!="number"||!Number.isFinite(e)||e<0?null:Math.trunc(e)}function sc(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:null}function Et(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 ya(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 ic(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 on(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 Hr(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 nn(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 _a(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 ba(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 $r(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 Fr(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:Dr(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 va(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 an(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 lc(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{value:e}}function cc(e){return e.replaceAll("\\","\\\\").replaceAll("%","\\%").replaceAll("_","\\_")}function Te(e){return e?1:0}function sn(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 ka(e,t){if(!nr(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),Et(e,t.id)}function wa(e,t){if(!or(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),Pt(e,t.id)}function wa(e,t){if(!nr(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),Et(e,t.id)}function Et(e,t){if(!or(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?nn(r):null,warning:null}}function Ra(e,t){if(!or(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(nn),warning:null}}function Sa(e,t){if(!or(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),Pt(e,t.id)}function Pt(e,t){if(!nr(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?nn(r):null,warning:null}}function Sa(e,t){if(!nr(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(nn),warning:null}}function Ra(e,t){if(!nr(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 Ag=Object.defineProperty;var St=(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?nn(r):null,warning:null}}function Aa(e,t,r){if(!or(e))return{available:!1,approval:null,warning:"approvals_not_available"};let o=Et(e,t).approval;if(!o)return{available:!0,approval:null,warning:null};if(o.status!=="pending")throw new Oe({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),Et(e,t)}function or(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 dc(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?nn(r):null,warning:null}}function Aa(e,t,r){if(!nr(e))return{available:!1,approval:null,warning:"approvals_not_available"};let o=Pt(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),Pt(e,t)}function nr(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 dc(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(n){throw e.exec("ROLLBACK"),n}}function Ea(e,t){let r=e.prepare("SELECT * FROM memories WHERE id = ?").get(t);return r?At(r):null}function uc(e,t,r){return e.prepare("UPDATE memories SET status = ? WHERE id = ?").run(r,t),Ea(e,t)}function pc(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(At)}function mc(e,t,r,o){let n=sn(t);return n?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 Ea(e,t){let r=e.prepare("SELECT * FROM memories WHERE id = ?").get(t);return r?Et(r):null}function uc(e,t,r){return e.prepare("UPDATE memories SET status = ? WHERE id = ?").run(r,t),Ea(e,t)}function pc(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(Et)}function mc(e,t,r,o){let n=sn(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(n,r,o).map(At):Pa(e,r,o)}function gc(e,t,r){return e.prepare(`SELECT *
25
+ LIMIT ?`).all(n,r,o).map(Et):Pa(e,r,o)}function gc(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(At)}function Pa(e,t,r){return e.prepare(`SELECT *
30
+ LIMIT ?`).all(t,r).map(Et)}function Pa(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(At)}function fc(e,t){return e.prepare(`SELECT *
35
+ LIMIT ?`).all(t,r).map(Et)}function fc(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(At)}var nr=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 xa(e,t){let r=we(e,t.id),o=t.now??new Date().toISOString();e.prepare(`INSERT INTO projects (
39
+ LIMIT ?`).all(t.limit).map(Et)}var ar=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 xa(e,t){let r=we(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 n=we(e,t.id);if(!n)throw new Error(`Project upsert did not return a row for ${t.id}`);return{project:n,inserted:!r}}function ja(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(Hr)}function we(e,t){let r=e.prepare("SELECT * FROM projects WHERE id = ?").get(t);return r?Hr(r):null}function Ia(e,t,r,o=new Date().toISOString()){if(!Ur(e))return{found:!1,previous:null,project:null};let n=we(e,t);return n?(e.prepare("UPDATE projects SET display_name = ?, updated_at = ? WHERE id = ?").run(r,o,t),{found:!0,previous:n,project:we(e,t)}):{found:!1,previous:null,project:null}}function Ta(e,t,r=new Date().toISOString()){return _c(e,t,"archived",r)}function Ca(e,t,r=new Date().toISOString()){return _c(e,t,"active",r)}function Oa(e,t){return e.prepare("SELECT COUNT(*) AS count FROM memories WHERE scope_project = ?").get(t)?.count??0}function Na(e,t,r,o=new Date().toISOString()){if(!Ur(e))return{found:!1,previous:null,project:null,memories_affected:0};let n=we(e,t);if(!n)return{found:!1,previous:null,project:null,memories_affected:0};e.exec("BEGIN IMMEDIATE");try{let a=e.prepare("SELECT id, status FROM memories WHERE scope_project = ? ORDER BY created_at ASC, id ASC").all(t);for(let s of a)if(!r(s.status,"forgotten"))throw new nr({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:n,project:we(e,t),memories_affected:a.length}}catch(a){throw e.exec("ROLLBACK"),a}}function Ma(e,t={}){if(!Ur(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(`${hc} ${n} ORDER BY derived_last_seen_at DESC, p.id ASC LIMIT ?`).all(...o,jg(t.limit)).map(xg),warning:null}}function La(e,t){if(!Ur(e))return{available:!1,detail:null,warning:"registry_not_available"};let r=e.prepare(`${hc} WHERE p.id = ?`).get(t);return r?{available:!0,detail:{project:Hr(r),counts:yc(r),derived_last_seen_at:r.last_activity_at??null},warning:null}:{available:!0,detail:Ig(e,t),warning:null}}var hc=`
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=we(e,t.id);if(!n)throw new Error(`Project upsert did not return a row for ${t.id}`);return{project:n,inserted:!r}}function ja(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(Hr)}function we(e,t){let r=e.prepare("SELECT * FROM projects WHERE id = ?").get(t);return r?Hr(r):null}function Ia(e,t,r,o=new Date().toISOString()){if(!Ur(e))return{found:!1,previous:null,project:null};let n=we(e,t);return n?(e.prepare("UPDATE projects SET display_name = ?, updated_at = ? WHERE id = ?").run(r,o,t),{found:!0,previous:n,project:we(e,t)}):{found:!1,previous:null,project:null}}function Ta(e,t,r=new Date().toISOString()){return _c(e,t,"archived",r)}function Ca(e,t,r=new Date().toISOString()){return _c(e,t,"active",r)}function Oa(e,t){return e.prepare("SELECT COUNT(*) AS count FROM memories WHERE scope_project = ?").get(t)?.count??0}function Na(e,t,r,o=new Date().toISOString()){if(!Ur(e))return{found:!1,previous:null,project:null,memories_affected:0};let n=we(e,t);if(!n)return{found:!1,previous:null,project:null,memories_affected:0};e.exec("BEGIN IMMEDIATE");try{let a=e.prepare("SELECT id, status FROM memories WHERE scope_project = ? ORDER BY created_at ASC, id ASC").all(t);for(let s of a)if(!r(s.status,"forgotten"))throw new ar({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:n,project:we(e,t),memories_affected:a.length}}catch(a){throw e.exec("ROLLBACK"),a}}function Ma(e,t={}){if(!Ur(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(`${hc} ${n} ORDER BY derived_last_seen_at DESC, p.id ASC LIMIT ?`).all(...o,jg(t.limit)).map(xg),warning:null}}function La(e,t){if(!Ur(e))return{available:!1,detail:null,warning:"registry_not_available"};let r=e.prepare(`${hc} WHERE p.id = ?`).get(t);return r?{available:!0,detail:{project:Hr(r),counts:yc(r),derived_last_seen_at:r.last_activity_at??null},warning:null}:{available:!0,detail:Ig(e,t),warning:null}}var hc=`
46
46
  WITH
47
47
  memory_counts AS (
48
48
  SELECT scope_project AS project_id,
@@ -155,7 +155,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function xg(e){return{...Hr(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 Sc(r)}function Rc(e,t){let r=e.prepare(`SELECT
158
+ AND m.scope_project = ?`).get(t.providerId,t.modelId,t.schemaVersion,t.project);return Rc(r)}function Sc(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,13 +168,13 @@ LEFT JOIN activity a ON a.project_id = p.id`;function xg(e){return{...Hr(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 Sc(r)}function Sc(e){return{indexable_count:e?.indexable_count??0,indexed_count:e?.indexed_count??0,stale_count:e?.stale_count??0}}function Da(e,t){e.prepare(`INSERT INTO work_items (
171
+ WHERE m.status IN ('active', 'candidate')`).get(t.providerId,t.modelId,t.schemaVersion);return Rc(r)}function Rc(e){return{indexable_count:e?.indexable_count??0,indexed_count:e?.indexed_count??0,stale_count:e?.stale_count??0}}function Da(e,t){e.prepare(`INSERT INTO work_items (
172
172
  id, project_id, title, description, status, priority, assigned_host, source,
173
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=ar(e,t.id);if(!r)throw new Error(`Work item not found after insert: ${t.id}`);return r}function ar(e,t){if(!Ba(e))return null;let r=e.prepare("SELECT * FROM work_items WHERE id = ?").get(t);return r?_a(r):null}function Ha(e,t){if(!Ba(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,xc(t.limit)).map(_a)}function $a(e,t){if(!Ba(e))return null;e.exec("BEGIN IMMEDIATE");try{let r=ar(e,t.id);if(!r)return e.exec("COMMIT"),null;let o=t.status??r.status,n=t.priority??r.priority,a=t.assignedHost!==void 0?t.assignedHost:r.assigned_host,s=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
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=sr(e,t.id);if(!r)throw new Error(`Work item not found after insert: ${t.id}`);return r}function sr(e,t){if(!Ba(e))return null;let r=e.prepare("SELECT * FROM work_items WHERE id = ?").get(t);return r?_a(r):null}function Ha(e,t){if(!Ba(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,xc(t.limit)).map(_a)}function $a(e,t){if(!Ba(e))return null;e.exec("BEGIN IMMEDIATE");try{let r=sr(e,t.id);if(!r)return e.exec("COMMIT"),null;let o=t.status??r.status,n=t.priority??r.priority,a=t.assignedHost!==void 0?t.assignedHost:r.assigned_host,s=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
175
  SET status = ?, priority = ?, assigned_host = ?, description = ?, tags_json = ?,
176
176
  metadata_json = ?, claimed_at = ?, completed_at = ?, updated_at = ?
177
- WHERE id = ?`).run(o,n,a,s,JSON.stringify(i),JSON.stringify(l),c,d,t.updatedAt,t.id),t.event&&Ac(e,t.event);let p=ar(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 Fa(e,t){Ac(e,t);let r=Ng(e,t.id);if(!r)throw new Error(`Work item event not found after insert: ${t.id}`);return r}function Ua(e,t,r){return Ec(e)?e.prepare("SELECT * FROM work_item_events WHERE work_item_id = ? ORDER BY created_at DESC, id DESC LIMIT ?").all(t,xc(r)).map(ba):[]}function Ac(e,t){e.prepare(`INSERT INTO work_item_events (
177
+ WHERE id = ?`).run(o,n,a,s,JSON.stringify(i),JSON.stringify(l),c,d,t.updatedAt,t.id),t.event&&Ac(e,t.event);let p=sr(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 Fa(e,t){Ac(e,t);let r=Ng(e,t.id);if(!r)throw new Error(`Work item event not found after insert: ${t.id}`);return r}function Ua(e,t,r){return Ec(e)?e.prepare("SELECT * FROM work_item_events WHERE work_item_id = ? ORDER BY created_at DESC, id DESC LIMIT ?").all(t,xc(r)).map(ba):[]}function Ac(e,t){e.prepare(`INSERT INTO work_item_events (
178
178
  id, work_item_id, project_id, type, from_status, to_status, actor, details_json, created_at
179
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 Ng(e,t){if(!Ec(e))return null;let r=e.prepare("SELECT * FROM work_item_events WHERE id = ?").get(t);return r?ba(r):null}function Ba(e){return Pc(e,"work_items")}function Ec(e){return Pc(e,"work_item_events")}function Pc(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 xc(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),500)}import{createRequire as Lg}from"node:module";var Dg=Lg(import.meta.url),ln=null;function jc(){if(ln)return ln;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 ln=Dg("node:sqlite"),ln}finally{process.emitWarning=e}}function Ic(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 Tc(e){e.exec(`
180
180
  CREATE TABLE IF NOT EXISTS migrations (
@@ -214,7 +214,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function xg(e){return{...Hr(e),coun
214
214
 
215
215
  CREATE VIRTUAL TABLE IF NOT EXISTS memory_fts
216
216
  USING fts5(id UNINDEXED, summary, content);
217
- `),Pt(e,1,"initial-core-schema","sha256:initial-core-schema"),e.exec(`
217
+ `),xt(e,1,"initial-core-schema","sha256:initial-core-schema"),e.exec(`
218
218
  CREATE TABLE IF NOT EXISTS capabilities (
219
219
  uid TEXT PRIMARY KEY,
220
220
  host TEXT NOT NULL,
@@ -234,7 +234,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function xg(e){return{...Hr(e),coun
234
234
 
235
235
  CREATE VIRTUAL TABLE IF NOT EXISTS capability_fts
236
236
  USING fts5(uid UNINDEXED, host, native_kind, normalized_kind, source);
237
- `),Pt(e,2,"capability-registry","sha256:capability-registry"),e.exec(`
237
+ `),xt(e,2,"capability-registry","sha256:capability-registry"),e.exec(`
238
238
  CREATE TABLE IF NOT EXISTS hosts (
239
239
  id TEXT PRIMARY KEY,
240
240
  host TEXT NOT NULL,
@@ -357,7 +357,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function xg(e){return{...Hr(e),coun
357
357
  CREATE INDEX IF NOT EXISTS idx_schedules_host ON schedules(host);
358
358
  CREATE UNIQUE INDEX IF NOT EXISTS idx_leases_idempotency ON leases(idempotency_key);
359
359
  CREATE INDEX IF NOT EXISTS idx_runs_project_status ON runs(project_id, status);
360
- `),Pt(e,3,"core-domain-ledger","sha256:core-domain-ledger"),e.exec(`
360
+ `),xt(e,3,"core-domain-ledger","sha256:core-domain-ledger"),e.exec(`
361
361
  CREATE TABLE IF NOT EXISTS semantic_memory_index (
362
362
  memory_id TEXT PRIMARY KEY,
363
363
  scope_project TEXT NOT NULL,
@@ -373,7 +373,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function xg(e){return{...Hr(e),coun
373
373
 
374
374
  CREATE INDEX IF NOT EXISTS idx_semantic_memory_project ON semantic_memory_index(scope_project);
375
375
  CREATE INDEX IF NOT EXISTS idx_semantic_memory_provider ON semantic_memory_index(provider_id, model_id);
376
- `),Pt(e,4,"semantic-memory-index","sha256:semantic-memory-index"),e.exec(`
376
+ `),xt(e,4,"semantic-memory-index","sha256:semantic-memory-index"),e.exec(`
377
377
  CREATE TABLE IF NOT EXISTS projects (
378
378
  id TEXT PRIMARY KEY,
379
379
  display_name TEXT NOT NULL,
@@ -404,7 +404,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function xg(e){return{...Hr(e),coun
404
404
  UNION
405
405
  SELECT project_id AS p FROM sessions
406
406
  )
407
- WHERE p IS NOT NULL AND p <> ''`).run(t,t,t),Pt(e,5,"project-registry","sha256:project-registry"),e.exec(`
407
+ WHERE p IS NOT NULL AND p <> ''`).run(t,t,t),xt(e,5,"project-registry","sha256:project-registry"),e.exec(`
408
408
  CREATE TABLE IF NOT EXISTS work_items (
409
409
  id TEXT PRIMARY KEY,
410
410
  project_id TEXT NOT NULL,
@@ -438,7 +438,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function xg(e){return{...Hr(e),coun
438
438
  CREATE INDEX IF NOT EXISTS idx_work_items_project_priority ON work_items(project_id, priority);
439
439
  CREATE INDEX IF NOT EXISTS idx_work_items_status_updated ON work_items(status, updated_at);
440
440
  CREATE INDEX IF NOT EXISTS idx_work_item_events_item ON work_item_events(work_item_id, created_at);
441
- `),Pt(e,6,"work-items-board","sha256:work-items-board"),e.exec(`
441
+ `),xt(e,6,"work-items-board","sha256:work-items-board"),e.exec(`
442
442
  CREATE TABLE IF NOT EXISTS approvals (
443
443
  id TEXT PRIMARY KEY,
444
444
  action TEXT NOT NULL,
@@ -454,8 +454,8 @@ LEFT JOIN activity a ON a.project_id = p.id`;function xg(e){return{...Hr(e),coun
454
454
  );
455
455
 
456
456
  CREATE INDEX IF NOT EXISTS idx_approvals_status ON approvals(status);
457
- `),Pt(e,7,"approvals","sha256:approvals")}function Pt(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 Cc=["hosts","sessions","memory_edges","commitments","standing_orders","capability_sources","capability_experience","schedules","leases","runs","work_items","work_item_events"];var cn=class{path;db;constructor(t,r={}){this.path=t,r.readOnly||Hg($g.dirname(t),{recursive:!0,mode:448});let{DatabaseSync:o}=jc(),n=r.readOnly?Ug(t):t;this.db=new o(n,r.readOnly?{readOnly:!0}:{}),Ic(this.db,{readOnly:r.readOnly}),r.readOnly||Tc(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(Cc.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(ic)}createApproval(t){return ka(this.db,t)}createDecidedApproval(t){return wa(this.db,t)}getApproval(t){return Et(this.db,t)}listApprovals(t){return Ra(this.db,t)}findPendingApprovalMatch(t){return Sa(this.db,t)}decideApproval(t,r){return Aa(this.db,t,r)}insertWorkItem(t){return Da(this.db,t)}getWorkItem(t){return ar(this.db,t)}listWorkItems(t){return Ha(this.db,t)}updateWorkItem(t){return $a(this.db,t)}insertWorkItemEvent(t){return Fa(this.db,t)}listWorkItemEvents(t,r){return Ua(this.db,t,r)}insertMemory(t){dc(this.db,t)}getMemory(t){return Ea(this.db,t)}updateMemoryStatus(t,r){return uc(this.db,t,r)}listMemories(t){return pc(this.db,t)}upsertProject(t){return xa(this.db,t)}getProject(t){return we(this.db,t)}listProjects(t){return ja(this.db,t)}listProjectsWithCounts(t={}){return Ma(this.db,t)}getProjectDetail(t){return La(this.db,t)}renameProject(t,r,o){return Ia(this.db,t,r,o)}archiveProject(t,r){return Ta(this.db,t,r)}reactivateProject(t,r){return Ca(this.db,t,r)}countProjectMemories(t){return Oa(this.db,t)}forgetProjectMemories(t,r,o){return Na(this.db,t,r,o)}searchMemories(t,r,o){return mc(this.db,t,r,o)}listActiveMemoriesForProject(t,r){return gc(this.db,t,r)}recentMemories(t,r){return Pa(this.db,t,r)}listSemanticIndexableMemories(t){return fc(this.db,t)}upsertSemanticIndex(t){bc(this.db,t)}getSemanticIndex(t){return vc(this.db,t)}listCurrentSemanticIndexesForProject(t){return kc(this.db,t)}semanticIndexStatsForProject(t){return wc(this.db,t)}semanticIndexStats(t){return Rc(this.db,t)}upsertCapabilities(t){let r=this.db.prepare(`INSERT INTO capabilities (
457
+ `),xt(e,7,"approvals","sha256:approvals")}function xt(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 Cc=["hosts","sessions","memory_edges","commitments","standing_orders","capability_sources","capability_experience","schedules","leases","runs","work_items","work_item_events"];var cn=class{path;db;constructor(t,r={}){this.path=t,r.readOnly||Hg($g.dirname(t),{recursive:!0,mode:448});let{DatabaseSync:o}=jc(),n=r.readOnly?Ug(t):t;this.db=new o(n,r.readOnly?{readOnly:!0}:{}),Ic(this.db,{readOnly:r.readOnly}),r.readOnly||Tc(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(Cc.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(ic)}createApproval(t){return ka(this.db,t)}createDecidedApproval(t){return wa(this.db,t)}getApproval(t){return Pt(this.db,t)}listApprovals(t){return Sa(this.db,t)}findPendingApprovalMatch(t){return Ra(this.db,t)}decideApproval(t,r){return Aa(this.db,t,r)}insertWorkItem(t){return Da(this.db,t)}getWorkItem(t){return sr(this.db,t)}listWorkItems(t){return Ha(this.db,t)}updateWorkItem(t){return $a(this.db,t)}insertWorkItemEvent(t){return Fa(this.db,t)}listWorkItemEvents(t,r){return Ua(this.db,t,r)}insertMemory(t){dc(this.db,t)}getMemory(t){return Ea(this.db,t)}updateMemoryStatus(t,r){return uc(this.db,t,r)}listMemories(t){return pc(this.db,t)}upsertProject(t){return xa(this.db,t)}getProject(t){return we(this.db,t)}listProjects(t){return ja(this.db,t)}listProjectsWithCounts(t={}){return Ma(this.db,t)}getProjectDetail(t){return La(this.db,t)}renameProject(t,r,o){return Ia(this.db,t,r,o)}archiveProject(t,r){return Ta(this.db,t,r)}reactivateProject(t,r){return Ca(this.db,t,r)}countProjectMemories(t){return Oa(this.db,t)}forgetProjectMemories(t,r,o){return Na(this.db,t,r,o)}searchMemories(t,r,o){return mc(this.db,t,r,o)}listActiveMemoriesForProject(t,r){return gc(this.db,t,r)}recentMemories(t,r){return Pa(this.db,t,r)}listSemanticIndexableMemories(t){return fc(this.db,t)}upsertSemanticIndex(t){bc(this.db,t)}getSemanticIndex(t){return vc(this.db,t)}listCurrentSemanticIndexesForProject(t){return kc(this.db,t)}semanticIndexStatsForProject(t){return wc(this.db,t)}semanticIndexStats(t){return Sc(this.db,t)}upsertCapabilities(t){let r=this.db.prepare(`INSERT INTO capabilities (
459
459
  uid, host, native_kind, normalized_kind, source, schema_hash,
460
460
  installed, enabled, active, authenticated, healthy, allowed, ready, last_seen_at
461
461
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
@@ -472,7 +472,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function xg(e){return{...Hr(e),coun
472
472
  healthy = excluded.healthy,
473
473
  allowed = excluded.allowed,
474
474
  ready = excluded.ready,
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 a of t)r.run(a.uid,a.host,a.native_kind,a.normalized_kind,a.source,a.schema_hash,Ce(a.installed),Ce(a.enabled),Ce(a.active),Ce(a.authenticated),Ce(a.healthy),Ce(a.allowed),Ce(a.ready),a.last_seen_at),o.run(a.uid),n.run(a.uid,a.host,a.native_kind,a.normalized_kind,a.source);this.db.exec("COMMIT")}catch(a){throw this.db.exec("ROLLBACK"),a}}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(on)}searchCapabilities(t){let r=sn(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.*
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 a of t)r.run(a.uid,a.host,a.native_kind,a.normalized_kind,a.source,a.schema_hash,Te(a.installed),Te(a.enabled),Te(a.active),Te(a.authenticated),Te(a.healthy),Te(a.allowed),Te(a.ready),a.last_seen_at),o.run(a.uid),n.run(a.uid,a.host,a.native_kind,a.normalized_kind,a.source);this.db.exec("COMMIT")}catch(a){throw this.db.exec("ROLLBACK"),a}}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(on)}searchCapabilities(t){let r=sn(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.*
476
476
  FROM capability_fts f
477
477
  JOIN capabilities c ON c.uid = f.uid
478
478
  WHERE ${o.join(" AND ")}
@@ -483,7 +483,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function xg(e){return{...Hr(e),coun
483
483
  SET holder = ?, expires_at = ?, status = 'claimed', created_at = ?, completed_at = NULL
484
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:$r(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
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 a=this.latestHeartbeatRun(t.project,r.slot);return this.db.exec("COMMIT"),{lease:$r(r),run:a,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(rr(t.cost)),JSON.stringify(t.result),JSON.stringify({...lc(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:${cc(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($r)}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(Fr)}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(Fr)}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 ?",a=t.limit===void 0?o:[...o,t.limit];return this.db.prepare(`SELECT
486
+ VALUES (?, 'heartbeat', ?, ?, 'completed', ?, ?, ?, ?, ?)`).run(t.runId,r.holder,t.project,JSON.stringify(or(t.cost)),JSON.stringify(t.result),JSON.stringify({...lc(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:${cc(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($r)}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(Fr)}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(Fr)}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 ?",a=t.limit===void 0?o:[...o,t.limit];return this.db.prepare(`SELECT
487
487
  runs.id,
488
488
  runs.kind,
489
489
  runs.host,
@@ -513,13 +513,13 @@ LEFT JOIN activity a ON a.project_id = p.id`;function xg(e){return{...Hr(e),coun
513
513
  native_schedule_supported = excluded.native_schedule_supported,
514
514
  native_id = excluded.native_id,
515
515
  desired_json = excluded.desired_json,
516
- updated_at = excluded.updated_at`).run(t.id,t.host,t.mode,Ce(t.enabled),Ce(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(va)}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?$r(r):null}getHeartbeatRunById(t){let r=this.db.prepare("SELECT * FROM runs WHERE id = ?").get(t);return r?Fr(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(va)}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?$r(r):null}getHeartbeatRunById(t){let r=this.db.prepare("SELECT * FROM runs WHERE id = ?").get(t);return r?Fr(r):null}latestHeartbeatRun(t,r){let o=this.db.prepare(`SELECT *
517
517
  FROM runs
518
518
  WHERE kind = 'heartbeat'
519
519
  AND project_id = ?
520
520
  AND json_extract(evidence_json, '$.slot') = ?
521
521
  ORDER BY completed_at DESC, id DESC
522
- LIMIT 1`).get(t,r);return o?Fr(o):null}getSchedule(t){let r=this.db.prepare("SELECT * FROM schedules WHERE id = ?").get(t);return r?va(r):null}getCommitment(t){let r=this.db.prepare("SELECT * FROM commitments WHERE id = ?").get(t);return r?an(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 Bg(this.db,t)?this.db.prepare(`SELECT COUNT(*) as count FROM ${t}`).get()?.count??0:0}};function _(e,t={}){return new cn(e,t)}function Ug(e){return`${Fg(e).href}?mode=ro&immutable=1`}function Oc(e){return e.trim().replace(/\s+/gu," ").toLocaleLowerCase()}function Bg(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 nf,mkdir as af}from"node:fs/promises";import sf from"node:os";import lf from"node:path";import{createHash as Vg,randomUUID as Wg}from"node:crypto";function T(e){return`${e}_${Wg()}`}function A(e){return`sha256:${Vg("sha256").update(e).digest("hex")}`}function Va(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(r=>Va(r)).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${Va(e[r]??null)}`).join(",")}}`}function Re(e){return A(Va(e))}import{existsSync as qg}from"node:fs";import Mc from"node:os";var Nc=[{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 Gg=Nc.map(e=>new RegExp(e.source,e.flags.includes("g")?e.flags:`${e.flags}g`));function N(e){let t=!1,r=e;for(let o of Gg)r=r.replace(o,n=>{t=!0;let a=n.match(/^(Authorization:\s*Bearer\s+)/iu);if(a?.[1])return`${a[1]}[REDACTED_SECRET]`;let s=n.match(/^([^:=]+[:=]\s*)/u);return s?.[1]?`${s[1]}[REDACTED_SECRET]`:"[REDACTED_SECRET]"});return{value:r,redacted:t}}function H(e){if(typeof e=="string")return N(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 sr(e,t=[process.cwd(),Mc.homedir()]){if(typeof e=="string")return t.filter(r=>r&&qg(r)).reduce((r,o)=>r.replaceAll(o,o===Mc.homedir()?"[REDACTED_USER_HOME]":"[REDACTED_WORKSPACE]"),e);if(Array.isArray(e))return e.map(r=>sr(r,t));if(e&&typeof e=="object"){let r={};for(let[o,n]of Object.entries(e))r[o]=sr(n,t);return r}return e}import{mkdir as Hc,readFile as Kg,writeFile as Wa}from"node:fs/promises";import{constants as zg,existsSync as $c}from"node:fs";import{access as Xg}from"node:fs/promises";import Yg from"node:os";import Ne from"node:path";var dn={"AGENTS.md":`# NativeSoul \u2014 Operating Instructions
522
+ LIMIT 1`).get(t,r);return o?Fr(o):null}getSchedule(t){let r=this.db.prepare("SELECT * FROM schedules WHERE id = ?").get(t);return r?va(r):null}getCommitment(t){let r=this.db.prepare("SELECT * FROM commitments WHERE id = ?").get(t);return r?an(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 Bg(this.db,t)?this.db.prepare(`SELECT COUNT(*) as count FROM ${t}`).get()?.count??0:0}};function _(e,t={}){return new cn(e,t)}function Ug(e){return`${Fg(e).href}?mode=ro&immutable=1`}function Oc(e){return e.trim().replace(/\s+/gu," ").toLocaleLowerCase()}function Bg(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 nf,mkdir as af}from"node:fs/promises";import sf from"node:os";import lf from"node:path";import{createHash as Vg,randomUUID as Wg}from"node:crypto";function T(e){return`${e}_${Wg()}`}function E(e){return`sha256:${Vg("sha256").update(e).digest("hex")}`}function Va(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(r=>Va(r)).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${Va(e[r]??null)}`).join(",")}}`}function Se(e){return E(Va(e))}import{existsSync as qg}from"node:fs";import Mc from"node:os";var Nc=[{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 Gg=Nc.map(e=>new RegExp(e.source,e.flags.includes("g")?e.flags:`${e.flags}g`));function N(e){let t=!1,r=e;for(let o of Gg)r=r.replace(o,n=>{t=!0;let a=n.match(/^(Authorization:\s*Bearer\s+)/iu);if(a?.[1])return`${a[1]}[REDACTED_SECRET]`;let s=n.match(/^([^:=]+[:=]\s*)/u);return s?.[1]?`${s[1]}[REDACTED_SECRET]`:"[REDACTED_SECRET]"});return{value:r,redacted:t}}function H(e){if(typeof e=="string")return N(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 ir(e,t=[process.cwd(),Mc.homedir()]){if(typeof e=="string")return t.filter(r=>r&&qg(r)).reduce((r,o)=>r.replaceAll(o,o===Mc.homedir()?"[REDACTED_USER_HOME]":"[REDACTED_WORKSPACE]"),e);if(Array.isArray(e))return e.map(r=>ir(r,t));if(e&&typeof e=="object"){let r={};for(let[o,n]of Object.entries(e))r[o]=ir(n,t);return r}return e}import{mkdir as Hc,readFile as Kg,writeFile as Wa}from"node:fs/promises";import{constants as zg,existsSync as $c}from"node:fs";import{access as Xg}from"node:fs/promises";import Yg from"node:os";import Oe from"node:path";var dn={"AGENTS.md":`# NativeSoul \u2014 Operating Instructions
523
523
 
524
524
  _Injected into every supported host via managed blocks. Keep operational rules here._
525
525
 
@@ -848,8 +848,8 @@ _Running context for today. Promote durable facts to curated memory later._
848
848
  ## Follow-ups
849
849
 
850
850
  -
851
- `}var Qg=["memory/daily","memory/projects","memory/archive","commitments","standing-orders","capabilities/cards","generated","state","logs","backups","proposals"],Zg=dn;function Fc(e){return Ne.resolve(e??process.env.NATIVESOUL_HOME??Ne.join(Yg.homedir(),".nativesoul"))}function f(e){let t=Fc(e);return{home:t,database:Ne.join(t,"state","nativesoul.sqlite"),auditLog:Ne.join(t,"logs","audit.jsonl")}}async function S(e){try{return await Xg(e,zg.F_OK),!0}catch{return!1}}async function v(e){let t=f(e),r=[],o=[],n=[];$c(t.home)||(await Hc(t.home,{recursive:!0,mode:448}),r.push(t.home));for(let i of Qg){let l=Ne.join(t.home,i);$c(l)||(await Hc(l,{recursive:!0,mode:448}),r.push(l))}let a=await S(Ne.join(t.home,"state","onboarding.complete"));for(let[i,l]of Object.entries(Zg)){if(i==="BOOTSTRAP.md"&&a)continue;let c=Ne.join(t.home,i);if(await S(c)){n.push(c);continue}try{await Wa(c,tf(i,l),{encoding:"utf8",mode:384,flag:"wx"}),o.push(c)}catch(d){if(rf(d)){n.push(c);continue}throw d}}let s=await of(t.home);return o.push(...s.createdFiles),n.push(...s.preservedFiles),{home:t.home,database:t.database,createdDirectories:r,createdFiles:o,preservedFiles:n}}function ef(e=Intl.DateTimeFormat){return e().resolvedOptions().timeZone??"UTC"}function tf(e,t){return e!=="config.yaml"?t:t.replace(/^timezone: .+$/m,`timezone: ${ef()}`)}function rf(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST"}async function of(e){let t=[],r=[],o=new Date().toISOString().slice(0,10),n=Ne.join(e,"memory","daily",`${o}.md`);await S(n)?r.push(n):(await Wa(n,Dc(o),{encoding:"utf8",mode:384,flag:"wx"}),t.push(n));let a=Ne.join(e,"standing-orders","example.yaml");return await S(a)?r.push(a):(await Wa(a,Lc,{encoding:"utf8",mode:384,flag:"wx"}),t.push(a)),{createdFiles:t,preservedFiles:r}}async function de(e,t){let r=Ne.join(e,t);return await S(r)?Kg(r,"utf8"):""}async function h(e){let t=f(e.home),r=new Date().toISOString(),o=qa(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:Re({type:e.type,actor:e.actor??"cli",origin:e.origin??"nativesoul",result:e.result??"ok",details:o,created_at:r})},a=_(t.database);try{a.insertEvent(n)}finally{a.close()}return await af(lf.dirname(t.auditLog),{recursive:!0,mode:448}),await nf(t.auditLog,`${JSON.stringify(n)}
852
- `,{encoding:"utf8",mode:384}),n}function qa(e,t){if(typeof e=="string")return cf(e,t);if(Array.isArray(e))return e.map(r=>qa(r,t));if(e&&typeof e=="object"){let r={};for(let[o,n]of Object.entries(e))r[o]=qa(n,t);return r}return e}function cf(e,t){return[[new RegExp(Ja(t),"gu"),"[REDACTED_NATIVESOUL_HOME]"],[new RegExp(Ja(process.cwd()),"gu"),"[REDACTED_WORKSPACE]"],[new RegExp(Ja(sf.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,a])=>o.replace(n,a),e)}function Ja(e){return e.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}async function un(e){let t=f(e.home),r=_(t.database);try{return r.listEvents({type:e.type,result:e.result,limit:df(e.limit)})}finally{r.close()}}async function Ga(e){let t=f(e.home),r=await un(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 df(e){return Math.min(Math.max(e??50,1),500)}import De from"node:path";import{existsSync as P_}from"node:fs";import{mkdir as Kh,readdir as zh,readFile as fs,writeFile as Xh}from"node:fs/promises";import{existsSync as Yh}from"node:fs";import Xr from"node:path";xt();ue();Je();ue();import{readdir as vf}from"node:fs/promises";import he from"node:path";var Se="antigravity",kf="~/.gemini/GEMINI.md",wf="~/.antigravity",za="official:antigravity-plugin-config:v1",Jc="official:antigravity-hooks-config:v1",qc="official:antigravity-mcp-config:v1",Gc="official:antigravity-command-config:v1",Rf="official:antigravity-context-config:v1",Sf="official:antigravity-features:v1",Af=[{uid:"antigravity:plugins",nativeKind:"plugins",normalizedKind:"package",relativePath:"plugins"}];function Xa(){let e=process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim();return e?he.resolve(e):j(wf)}function Ef(){let e=Xa();return{root:e,globalInstruction:process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim()?he.join(e,"GEMINI.md"):j(kf)}}async function Kc(){let e=[],t=Ef();await P(t.globalInstruction)&&e.push({uid:"antigravity:global-gemini-md",host:Se,nativeKind:"global_context",normalizedKind:"instruction",source:t.globalInstruction,schemaHash:Rf}),await Pf(t.root,e),await xf(t.root,e);for(let r of Af){let o=he.join(t.root,r.relativePath);await W(o)&&e.push({uid:r.uid,host:Se,nativeKind:r.nativeKind,normalizedKind:r.normalizedKind,source:o,schemaHash:za})}return e}async function Pf(e,t){let r=he.join(e,"plugin.json"),o=he.join(e,"nativesoul-package.json"),n=he.join(e,"hooks.json"),a=he.join(e,"mcp_config.json"),[s,i,l,c]=await Promise.all([ee(r),ee(o),ee(n),ee(a)]);if(s){let d=I(s,["name","id"])??"unknown";t.push({uid:`antigravity:plugin:${M(d)}`,host:Se,nativeKind:"plugin",normalizedKind:"extension",source:r,schemaHash:za})}if(i){let d=I(i,["name","id"])??"unknown";t.push({uid:`antigravity:package:${M(d)}`,host:Se,nativeKind:"native_plugin_package",normalizedKind:"package",source:o,schemaHash:za});let p=O(i.nativeSoul)?i.nativeSoul:{};for(let k of mn(p.commands))t.push({uid:`antigravity:command:${M(k)}`,host:Se,nativeKind:"command",normalizedKind:"command",source:`${o}:nativeSoul.commands.${k}`,schemaHash:Gc});let g=O(p.mcpServer)?p.mcpServer:null,y=I(g,["name"]);y&&t.push({uid:`antigravity:mcp:${M(y)}`,host:Se,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:nativeSoul.mcpServer.${y}`,schemaHash:qc})}if(l){t.push({uid:"antigravity:hooks:manifest",host:Se,nativeKind:"hooks",normalizedKind:"lifecycle_hooks",source:n,schemaHash:Jc});let d=O(l.hooks)?l.hooks:{};for(let p of Object.keys(d))t.push({uid:`antigravity:hook:${M(p)}`,host:Se,nativeKind:"hook",normalizedKind:"lifecycle_hook",source:`${n}:hooks.${p}`,schemaHash:Jc})}if(c)for(let d of at(c.mcpServers))t.push({uid:`antigravity:mcp:${M(d)}`,host:Se,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${a}:mcpServers.${d}`,schemaHash:qc});await jf(he.join(e,"commands"),t)}async function xf(e,t){let r=he.join(e,"features-evidence.json"),o=await ee(r);if(!o)return;let n=["scheduled_tasks","cron_schedules","background_agents","subagents","skills","mcps","json_hooks"];for(let a of n)o[a]===!0&&t.push({uid:`antigravity:feature:${a.replace(/_/gu,"-")}`,host:Se,nativeKind:"product_feature",normalizedKind:"feature_evidence",source:`${r}:${a}`,schemaHash:Sf})}async function jf(e,t){if(!await W(e))return;let r=await vf(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||he.extname(o.name)!==".md")continue;let n=he.basename(o.name,".md");t.push({uid:`antigravity:command:${M(n,{allowSlash:!0})}`,host:Se,nativeKind:"command",normalizedKind:"command",source:he.join(e,o.name),schemaHash:Gc})}}ue();Je();import gn from"node:path";async function zc(e){let t=await If(e);if(!t)return null;let r=await ee(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:O(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 If(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 gn.join(gn.resolve(r),"scheduler-proof.json");let o=e??j("~/.antigravity"),n=[gn.join(o,"scheduler-proof.json"),gn.join(o,"native-scheduler-proof.json")];for(let a of n)if(await P(a))return a;return null}function Xc(e){if(!e)return!1;let t=Date.parse(e);return Number.isFinite(t)?Date.now()-t>10080*60*1e3:!0}var ir="antigravity",Ya="~/.gemini/GEMINI.md",Qa=class{async detect(){let t=j(Ya),r=Xa(),[o,n,a]=await Promise.all([P(t),W(r),Ve("agy")]);return{host:ir,detected:n||a!==null,path:n?r:a??(o?t:void 0),capabilities:{installed:n||a!==null,enabled:n,active:!1,authenticated:!1,healthy:a!==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 Kc()}async hotProbe(){let t=await this.coldScan();return{host:ir,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 zc(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(Xc(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(Ya),o=await G(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&&!re(o,ir)&&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(Ya),r=await G(t);return{host:ir,targetPath:t,startMarker:"<!-- nativesoul:antigravity:start v1 -->",endMarker:"<!-- nativesoul:antigravity:end -->",content:Me(ir),wouldCreate:r===null,wouldUpdate:r!==null&&!re(r,ir)}}};function Yc(){return new Qa}xt();Je();ue();import lr from"node:path";import{readFile as yd}from"node:fs/promises";Je();import{readFile as dd}from"node:fs/promises";import Bf from"node:path";var md="life:heartbeat";function gd(e){if(!e||typeof e!="object"||Array.isArray(e))return{kind:"unknown",mode:"leader",apply:!1,skill:md};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:qf(t),surface:pd(t.surface)??pd(O(t.desired)?t.desired.surface:void 0)}}async function fd(e={}){let t=process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_FIXTURES;if(t)try{return ud(await dd(Bf.join(t,"scheduled-tasks.json"),"utf8"))}catch{return null}let r=process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_MANIFEST;if(r)try{return ud(await dd(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(()=>(cd(),ld));return o({apply:e.apply,surface:e.surface,hostConfigRoot:e.hostConfigRoot})}function hd(e,t){return!e||e==="default"||!t?!0:e===t}function ud(e){let t=We(e);if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t,o=Vf(r.surface),n=Wf(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:Jf(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 pd(e){return e==="default"||e==="claude-code"||e==="claude-desktop"?e:void 0}function Vf(e){return e==="claude-code"||e==="claude-desktop"||e==="cloud"?e:void 0}function Wf(e){return e==="local_scheduled_task"||e==="cloud_routine"||e==="ui_only"?e:"unknown"}function Jf(e){return e==="official_machine_readable"||e==="ui_only"||e==="unknown"?e:void 0}function qf(e){return O(e.desired)&&typeof e.desired.skill=="string"&&e.desired.skill.trim().length>0?e.desired.skill.trim():md}var pe="claude",fn="~/.claude/CLAUDE.md",_d="CLAUDE.md",bd=".claude/CLAUDE.md",vd="life:heartbeat",wd="official:claude-cli-hot-scan:v1",es=class{async detect(){let t=j(fn),r=lr.resolve(_d),o=lr.resolve(bd),[n,a,s,i]=await Promise.all([P(t),P(r),P(o),pn("claude",["--version"])]);return{host:pe,detected:n||a||s||i!==null,version:i??void 0,path:n?t:a?r:s?o:void 0,capabilities:{installed:n||a||s||i!==null,enabled:n||a||s,active:a||s,authenticated:!1,healthy:i!==null||n||a||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=j(fn),r=lr.resolve(_d),o=lr.resolve(bd),n=[];return await P(t)&&n.push({uid:"claude:global-claude-md",host:pe,nativeKind:"global_context",normalizedKind:"instruction",source:t}),await P(r)&&n.push({uid:"claude:project-claude-md",host:pe,nativeKind:"project_context",normalizedKind:"instruction",source:r}),await P(o)&&n.push({uid:"claude:project-dot-claude-md",host:pe,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 Gf(o,r);if(l.status==="ready")return l}let[n,a]=await Promise.all([Ka("claude",["mcp","list","--json"],5e3),Ka("claude",["plugin","list","--json"],5e3)]),s=[],i=[];return n.status==="ok"?i.push(...Rd(n.stdout)):s.push(kd("CLAUDE_HOT_SCAN_JSON_UNSUPPORTED","claude mcp list --json",n.stderr)),a.status==="ok"?i.push(...Sd(a.stdout)):s.push(kd("CLAUDE_HOT_SCAN_JSON_UNSUPPORTED","claude plugin list --json",a.stderr)),{host:pe,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=gd(t),o=await fd({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!==vd?{status:"error",code:"CLAUDE_HEARTBEAT_SKILL_MISMATCH",message:`Claude heartbeat Scheduled Task must invoke ${vd}.`}: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."}:hd(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(fn),o=await G(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&&!re(o,pe)&&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(fn),r=await G(t);return{host:pe,targetPath:t,startMarker:"<!-- nativesoul:claude:start v1 -->",endMarker:"<!-- nativesoul:claude:end -->",content:Me(pe),wouldCreate:r===null,wouldUpdate:r!==null&&!re(r,pe)}}};async function Gf(e,t){try{let[r,o]=await Promise.all([yd(lr.join(e,"mcp-list.json"),"utf8"),yd(lr.join(e,"plugin-list.json"),"utf8")]),n=[...Rd(r),...Sd(o)];return{host:pe,checkedAt:t,status:"ready",warnings:[],capabilities:n.map(a=>({...a,installed:a.installed??!0,enabled:a.enabled??!0,active:a.active??!0,authenticated:a.authenticated??!1,healthy:a.healthy??!0,allowed:!0,ready:a.ready??!1}))}}catch{return{host:pe,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 Rd(e){let t=We(e);return st(t,["servers","mcps","items"]).flatMap(r=>{let o=I(r,["name","id","server","server_name"]);if(!o)return[];let n=I(r,["status","state"]),a=n!=="disabled",s=n==="connected"||n==="ready"||n==="active"||n==="ok"||n==="authenticated";return[{uid:`claude:mcp:${M(o)}`,host:pe,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`claude mcp list:${o}`,schemaHash:wd,enabled:a,active:a,authenticated:ie(r,["authenticated"])??s,healthy:a,ready:Ad(n)}]})}function Sd(e){let t=We(e);return st(t,["plugins","items"]).flatMap(r=>{let o=I(r,["id","plugin","package"])??I(r,["name"]);if(!o)return[];let n=I(r,["status","state"]),a=ie(r,["enabled"])??n!=="disabled",s=ie(r,["installed"])??!0;return[{uid:`claude:plugin:${Kf(o)}`,host:pe,nativeKind:"plugin",normalizedKind:"extension",source:`claude plugin list --json:${o}`,schemaHash:wd,installed:s,enabled:a,active:a,authenticated:ie(r,["authenticated"])??a,healthy:s,ready:a&&(n===null||Ad(n)||ie(r,["enabled"])===!0)}]})}function kd(e,t,r){let o=zf(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 Ad(e){return e==="ready"||e==="enabled"||e==="active"||e==="ok"||e==="authenticated"||e==="connected"}function Kf(e){return M(e,{allowSlash:!0})}function zf(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 Ed(){return new es}xt();Je();ue();import ns from"node:path";var le="codex",yn="~/.codex/AGENTS.md",Id="AGENTS.md",mh=1e3,Td="life:heartbeat",bn="official:codex-app-server:v1",as=class{async detect(){let t=j(yn),r=ns.resolve(Id),[o,n,a]=await Promise.all([P(t),P(r),Ve("codex")]);return{host:le,detected:o||n||a!==null,path:o?t:n?r:a??void 0,capabilities:{installed:o||n||a!==null,enabled:o||n,active:n,authenticated:!1,healthy:a!==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(yn),r=ns.resolve(Id),o=[];return await P(t)&&o.push({uid:"codex:global-agents-md",host:le,nativeKind:"global_context",normalizedKind:"instruction",source:t}),await P(r)&&o.push({uid:"codex:project-agents-md",host:le,nativeKind:"project_context",normalizedKind:"instruction",source:r}),o}async hotProbe(t){let r=new Date().toISOString(),o=bh(t);if(o){let i=await os(o,r);if(i.status==="ready")return i}let n=process.env.NATIVESOUL_CODEX_APP_SERVER_FIXTURES?.trim();if(n){let i=await os(kh(n),r);if(i.status==="ready")return i}let a=vh(t);if(a){let i=await os(wh(a),r);if(i.status==="ready")return i}let s=await this.coldScan();return{host:le,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(()=>(jd(),xd)),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!==Td?{status:"error",code:"CODEX_HEARTBEAT_SKILL_MISMATCH",message:`Codex heartbeat Automation must invoke ${Td}.`}: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(yn),o=await G(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&&!re(o,le)&&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(yn),r=await G(t);return{host:le,targetPath:t,startMarker:"<!-- nativesoul:codex:start v1 -->",endMarker:"<!-- nativesoul:codex:end -->",content:Me(le),wouldCreate:r===null,wouldUpdate:r!==null&&!re(r,le)}}};async function os(e,t){let[r,o,n,a]=await Promise.all([_n(e,"mcpServerStatus/list"),_n(e,"plugin/list"),_n(e,"skills/list"),_n(e,"app/list")]);if([r,o,n,a].some(l=>l===null))return{host:le,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=[...fh(r),...hh(o),...yh(n),..._h(a)];return{host:le,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 _n(e,t){try{return await e.call(t)}catch{return null}}async function gh(e,t){let r=new AbortController,o=setTimeout(()=>r.abort(),mh);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 a=await n.json();return O(a)&&"error"in a?null:O(a)&&"result"in a?a.result:a}catch{return null}finally{clearTimeout(o)}}function fh(e){return st(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=vn(t,o);return[{uid:`codex:mcp:${M(r)}`,host:le,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`codex app server mcpServerStatus/list:${r}`,schemaHash:bn,...n}]})}function hh(e){return st(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=vn(t,o);return[{uid:`codex:plugin:${ss(r)}`,host:le,nativeKind:"plugin",normalizedKind:"extension",source:`codex app server plugin/list:${r}`,schemaHash:bn,...n}]})}function yh(e){return st(e,["skills","items"]).flatMap(t=>{let r=I(t,["id","name","path"]);if(!r)return[];let o=I(t,["status","state"]),n=vn(t,o);return[{uid:`codex:skill:${ss(r)}`,host:le,nativeKind:"skill",normalizedKind:"skill",source:`codex app server skills/list:${r}`,schemaHash:bn,...n}]})}function _h(e){return st(e,["apps","items"]).flatMap(t=>{let r=I(t,["id","name","app"]);if(!r)return[];let o=I(t,["status","state"]),n=vn(t,o);return[{uid:`codex:app:${ss(r)}`,host:le,nativeKind:"app_server_app",normalizedKind:"app",source:`codex app server app/list:${r}`,schemaHash:bn,...n}]})}function vn(e,t){let r=ie(e,["installed"])??!0,o=t==="disabled"||t==="unavailable",n=t==="error"||t==="unhealthy",a=ie(e,["enabled"])??!o,s=ie(e,["active"])??a,i=ie(e,["healthy"])??(!o&&!n),l=ie(e,["authenticated"])??ie(e,["auth"])??!1,c=ie(e,["ready"])??(r&&a&&s&&i);return{installed:r,enabled:a,active:s,authenticated:l,healthy:i,ready:c}}function bh(e){if(O(e)){let t=e.appServer;if(O(t)&&typeof t.call=="function")return{call:r=>Promise.resolve(t.call(r))}}return null}function vh(e){if(O(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 kh(e){return{async call(t){try{let{readFile:r}=await import("node:fs/promises"),o=t.replace(/\//gu,"-");return JSON.parse(await r(ns.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 wh(e){return{call:t=>gh(e,t)}}function ss(e){return M(e,{allowSlash:!0})}function Cd(){return new as}xt();Je();ue();import{readdir as Nd}from"node:fs/promises";import Ae from"node:path";var oe="gemini",ls="~/.gemini/GEMINI.md",Rh="~/.gemini/extensions",Sh="~/.gemini/settings.json",Vr="official:gemini-extension-config:v1",is="official:gemini-settings-config:v1",Ah="official:gemini-memory-config:v1",cs=class{async detect(){let t=Od(),r=t.globalInstruction,o=t.extensionsDirectory,[n,a,s]=await Promise.all([P(r),W(o),pn("gemini",["--version"])]);return{host:oe,detected:n||a||s!==null,version:s??void 0,path:n?r:a?o:void 0,capabilities:{installed:n||a||s!==null,enabled:n||a,active:n,authenticated:!1,healthy:s!==null||n||a,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=Od(),o=r.globalInstruction;await P(o)&&t.push({uid:"gemini:global-gemini-md",host:oe,nativeKind:"global_context",normalizedKind:"memory",source:o,schemaHash:Ah}),await Eh(r.settingsFile,t);let n=r.extensionsDirectory;if(await W(n)){t.push({uid:"gemini:extensions",host:oe,nativeKind:"extensions",normalizedKind:"package",source:n,schemaHash:Vr});let a=await Nd(n,{withFileTypes:!0});for(let s of a)s.isDirectory()&&await Ph(Ae.join(n,s.name),s.name,t)}return t}async hotProbe(){let t=await this.coldScan();return{host:oe,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(ls),o=await G(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&&!re(o,oe)&&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(ls),r=await G(t);return{host:oe,targetPath:t,startMarker:"<!-- nativesoul:gemini:start v1 -->",endMarker:"<!-- nativesoul:gemini:end -->",content:Me(oe),wouldCreate:r===null,wouldUpdate:r!==null&&!re(r,oe)}}};function Od(){let e=process.env.NATIVESOUL_GEMINI_INVENTORY_ROOT?.trim();if(e){let t=Ae.resolve(e);return{globalInstruction:Ae.join(t,"GEMINI.md"),settingsFile:Ae.join(t,"settings.json"),extensionsDirectory:Ae.join(t,"extensions")}}return{globalInstruction:j(ls),settingsFile:j(Sh),extensionsDirectory:j(Rh)}}async function Eh(e,t){let r=await ee(e);if(r){t.push({uid:"gemini:settings",host:oe,nativeKind:"settings",normalizedKind:"config",source:e,schemaHash:is});for(let o of at(r.mcpServers))t.push({uid:`gemini:mcp:${M(o)}`,host:oe,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${e}:mcpServers.${o}`,schemaHash:is});for(let o of Md(r.tools))t.push({uid:`gemini:tool:${M(o)}`,host:oe,nativeKind:"tool",normalizedKind:"tool",source:`${e}:tools.${o}`,schemaHash:is})}}async function Ph(e,t,r){let o=Ae.join(e,"gemini-extension.json"),n=await ee(o),a=I(n,["name","id"])??t;if(r.push({uid:`gemini:extension:${M(a)}`,host:oe,nativeKind:"extension",normalizedKind:"package",source:n?o:e,schemaHash:n?Vr:void 0}),n){for(let s of at(n.mcpServers))r.push({uid:`gemini:mcp:${M(s)}`,host:oe,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:mcpServers.${s}`,schemaHash:Vr});for(let s of Md(n.tools))r.push({uid:`gemini:tool:${M(s)}`,host:oe,nativeKind:"tool",normalizedKind:"tool",source:`${o}:tools.${s}`,schemaHash:Vr})}await xh(Ae.join(e,"commands"),r)}async function xh(e,t){if(!await W(e))return;let r=await Nd(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||![".toml",".md"].includes(Ae.extname(o.name)))continue;let n=Ae.basename(o.name,Ae.extname(o.name));t.push({uid:`gemini:command:${M(n,{allowSlash:!0})}`,host:oe,nativeKind:"command",normalizedKind:"command",source:Ae.join(e,o.name),schemaHash:Vr})}}function Md(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):at(e)}function Ld(){return new cs}xt();Je();ue();import{readdir as Ud}from"node:fs/promises";import q from"node:path";var J="grok",kn="~/.grok/Agents.md",Dd="AGENTS.md",Hd="Agents.md",$d="CLAUDE.md",jh="~/.grok",ds="official:grok-plugin-config:v1",Fd="official:grok-hooks-config:v1",us="official:grok-mcp-config:v1",Bd="official:grok-command-config:v1",Ih="official:grok-context-config:v1",Th=[{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"}],ps=class{async detect(){let t=j(kn),r=q.resolve(Dd),o=q.resolve(Hd),n=q.resolve($d),a=Vd(),[s,i,l,c,d,p]=await Promise.all([P(t),P(r),P(o),P(n),W(a),Ve("grok")]),g=i||l;return{host:J,detected:s||g||c||d||p!==null,path:s?t:l?o:i?r:c?n:p??void 0,capabilities:{installed:s||g||c||d||p!==null,enabled:s||g||c||d,active:g||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=Ch(),o=r.globalInstruction;await P(o)&&t.push({uid:"grok:global-agents-md",host:J,nativeKind:"global_context",normalizedKind:"instruction",source:o,schemaHash:Ih});let n=q.resolve(Dd);await P(n)&&t.push({uid:"grok:project-agents-md",host:J,nativeKind:"project_context",normalizedKind:"instruction",source:n});let a=q.resolve(Hd);await P(a)&&t.push({uid:"grok:project-agents-titlecase-md",host:J,nativeKind:"project_context",normalizedKind:"instruction",source:a});let s=q.resolve($d);await P(s)&&t.push({uid:"grok:project-claude-md",host:J,nativeKind:"project_context",normalizedKind:"instruction",source:s});let i=r.root;await Wd(r.root,t),await Oh(i,t);for(let l of Th){let c=q.join(i,l.relativePath);await W(c)&&t.push({uid:l.uid,host:J,nativeKind:l.nativeKind,normalizedKind:l.normalizedKind,source:c,schemaHash:l.relativePath==="mcps"?us:ds})}return Mh(t)}async hotProbe(){let t=await this.coldScan();return{host:J,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(kn),o=await G(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&&!re(o,J)&&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(kn),r=await G(t);return{host:J,targetPath:t,startMarker:"<!-- nativesoul:grok:start v1 -->",endMarker:"<!-- nativesoul:grok:end -->",content:Me(J),wouldCreate:r===null,wouldUpdate:r!==null&&!re(r,J)}}};function Vd(){let e=process.env.NATIVESOUL_GROK_INVENTORY_ROOT?.trim();return e?q.resolve(e):j(jh)}function Ch(){let e=Vd();return{root:e,globalInstruction:process.env.NATIVESOUL_GROK_INVENTORY_ROOT?.trim()?q.join(e,"Agents.md"):j(kn)}}async function Wd(e,t){let r=q.join(e,"plugin.json"),o=q.join(e,"nativesoul-package.json"),n=q.join(e,"hooks","hooks.json"),a=q.join(e,".mcp.json"),[s,i,l,c]=await Promise.all([ee(r),ee(o),ee(n),ee(a)]);if(s){let d=I(s,["name","id"])??"unknown";t.push({uid:`grok:plugin:${M(d)}`,host:J,nativeKind:"plugin",normalizedKind:"extension",source:r,schemaHash:ds})}if(i){let d=I(i,["name","id"])??"unknown";t.push({uid:`grok:package:${M(d)}`,host:J,nativeKind:"native_plugin_package",normalizedKind:"package",source:o,schemaHash:ds});let p=O(i.nativeSoul)?i.nativeSoul:{};for(let k of mn(p.commands))t.push({uid:`grok:command:${M(k)}`,host:J,nativeKind:"command",normalizedKind:"command",source:`${o}:nativeSoul.commands.${k}`,schemaHash:Bd});let g=O(p.mcpServer)?p.mcpServer:null,y=I(g,["name"]);y&&t.push({uid:`grok:mcp:${M(y)}`,host:J,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:nativeSoul.mcpServer.${y}`,schemaHash:us})}if(l){t.push({uid:"grok:hooks:manifest",host:J,nativeKind:"hooks",normalizedKind:"lifecycle_hooks",source:n,schemaHash:Fd});let d=O(l.hooks)?l.hooks:{};for(let p of Object.keys(d))t.push({uid:`grok:hook:${M(p)}`,host:J,nativeKind:"hook",normalizedKind:"lifecycle_hook",source:`${n}:hooks.${p}`,schemaHash:Fd})}if(c)for(let d of at(c.mcpServers))t.push({uid:`grok:mcp:${M(d)}`,host:J,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${a}:mcpServers.${d}`,schemaHash:us});await Nh(q.join(e,"commands"),t)}async function Oh(e,t){let r=q.join(e,"plugins");if(!await W(r))return;let o=await Ud(r,{withFileTypes:!0});for(let n of o)n.isDirectory()&&await Wd(q.join(r,n.name),t)}async function Nh(e,t){if(!await W(e))return;let r=await Ud(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||q.extname(o.name)!==".md")continue;let n=q.basename(o.name,".md");t.push({uid:`grok:command:${M(n,{allowSlash:!0})}`,host:J,nativeKind:"command",normalizedKind:"command",source:q.join(e,o.name),schemaHash:Bd})}}function Mh(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 Jd(){return new ps}import{mkdir as wn,readFile as Rn,rm as Bh,writeFile as Sn}from"node:fs/promises";import{existsSync as An}from"node:fs";import Wr from"node:path";import{lstatSync as Lh,realpathSync as Dh,statSync as Hh}from"node:fs";import qe from"node:path";var $h=process.platform!=="win32";function Fh(){let e=process.getuid;return typeof e=="function"?e.call(process):void 0}function qd(e){let t=e,r=[];for(;;)try{let o=Dh(t);return r.length?qe.join(o,...r):o}catch{let o=qe.dirname(t);if(o===t)return e;r.unshift(qe.basename(t)),t=o}}function Uh(e,t){let r=qe.relative(e,t);return r===""||!r.startsWith("..")&&!qe.isAbsolute(r)}function Gd(e,t={}){if(!e||typeof e!="string")return{ok:!1,code:"PATH_ESCAPES_ROOT",detail:"empty or non-string target path"};let r=qe.resolve(e);if(t.protectedFiles?.length&&new Set(t.protectedFiles.map(a=>qe.resolve(a))).has(r))return{ok:!1,code:"PROTECTED_FILE_DIRECT_WRITE",detail:`${r} is protected; write via a proposal`};try{if(Lh(r).isSymbolicLink()&&!t.allowSymlinkTarget)return{ok:!1,code:"SYMLINK_TARGET_UNSAFE",detail:`${r} is a symlink`}}catch{}let o=qe.dirname(r);try{let n=Hh(o);if($h){let a=(n.mode&2)!==0,s=(n.mode&512)!==0;if(a&&!s)return{ok:!1,code:"WORLD_WRITABLE_PATH",detail:`${o} is world-writable`};let i=t.uid??Fh();if(i!==void 0&&n.uid!==i)return{ok:!1,code:"SUSPICIOUS_OWNER",detail:`${o} owned by uid ${n.uid}, expected ${i}`}}}catch{}if(t.root){let n=qd(qe.resolve(t.root)),a=qd(r);if(!Uh(n,a))return{ok:!1,code:"PATH_ESCAPES_ROOT",detail:`${a} escapes ${n}`}}return{ok:!0,normalizedPath:r}}function me(e,t={}){let r=Gd(e,t);if(!r.ok)throw new Error(`unsafe write path (${r.code}): ${r.detail}`);return r.normalizedPath}function En(e){return{start:`<!-- nativesoul:${e}:start v1 -->`,end:`<!-- nativesoul:${e}:end -->`}}async function Kd(e){let t=f(e.home),r=An(e.targetPath),o=r?await Rn(e.targetPath,"utf8"):null,n=Wh(o,e.host,e.block),a=o===null?null:A(o),s=A(n),i=Jh(o,n,e.host),l=i!=="noop",c=!e.apply,d=l&&e.apply?await Qd(t.home,e.host,e.targetPath,r,o,s):null;l&&e.apply&&(me(e.targetPath,{allowSymlinkTarget:!0}),await wn(Wr.dirname(e.targetPath),{recursive:!0,mode:448}),await Sn(e.targetPath,n,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:e.targetPath,action:i,dryRun:c,changed:l,beforeHash:a,afterHash:s,diff:Zd(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 zd(e){let t=f(e.home),r=An(e.targetPath),o=r?await Rn(e.targetPath,"utf8"):null,n=Vh(o,e.host),a=o===null?null:A(o),s=n===null?A(""):A(n),i=o!==n?"remove":"noop",l=i!=="noop",c=!e.apply,d=l&&e.apply?await Qd(t.home,e.host,e.targetPath,r,o,s):null;l&&e.apply&&n!==null&&(await wn(Wr.dirname(e.targetPath),{recursive:!0,mode:448}),await Sn(e.targetPath,n,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:e.targetPath,action:i,dryRun:c,changed:l,beforeHash:a,afterHash:s,diff:Zd(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 Xd(e){let t=An(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 Rn(e.targetPath,"utf8"),n=En(e.host),a=o.indexOf(n.start),s=o.indexOf(n.end),i=a>=0,l=s>=0,c=i&&l&&s>a;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 Yd(e){let t=f(e.home),r=JSON.parse(await Rn(e.snapshotPath,"utf8")),o=!e.apply;e.apply&&(r.beforeExists&&r.beforeContent!==null?(await wn(Wr.dirname(r.targetPath),{recursive:!0,mode:448}),await Sn(r.targetPath,r.beforeContent,{encoding:"utf8",mode:384})):An(r.targetPath)&&await Bh(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 Vh(e,t){if(e===null)return null;let{start:r,end:o}=En(t),n=e.indexOf(r),a=e.indexOf(o);if(n<0||a<=n)return e;let s=a+o.length,i=e.slice(0,n),l=e.slice(s);return i.endsWith(`
851
+ `}var Qg=["memory/daily","memory/projects","memory/archive","commitments","standing-orders","capabilities/cards","generated","state","logs","backups","proposals"],Zg=dn;function Fc(e){return Oe.resolve(e??process.env.NATIVESOUL_HOME??Oe.join(Yg.homedir(),".nativesoul"))}function f(e){let t=Fc(e);return{home:t,database:Oe.join(t,"state","nativesoul.sqlite"),auditLog:Oe.join(t,"logs","audit.jsonl")}}async function A(e){try{return await Xg(e,zg.F_OK),!0}catch{return!1}}async function v(e){let t=f(e),r=[],o=[],n=[];$c(t.home)||(await Hc(t.home,{recursive:!0,mode:448}),r.push(t.home));for(let i of Qg){let l=Oe.join(t.home,i);$c(l)||(await Hc(l,{recursive:!0,mode:448}),r.push(l))}let a=await A(Oe.join(t.home,"state","onboarding.complete"));for(let[i,l]of Object.entries(Zg)){if(i==="BOOTSTRAP.md"&&a)continue;let c=Oe.join(t.home,i);if(await A(c)){n.push(c);continue}try{await Wa(c,tf(i,l),{encoding:"utf8",mode:384,flag:"wx"}),o.push(c)}catch(d){if(rf(d)){n.push(c);continue}throw d}}let s=await of(t.home);return o.push(...s.createdFiles),n.push(...s.preservedFiles),{home:t.home,database:t.database,createdDirectories:r,createdFiles:o,preservedFiles:n}}function ef(e=Intl.DateTimeFormat){return e().resolvedOptions().timeZone??"UTC"}function tf(e,t){return e!=="config.yaml"?t:t.replace(/^timezone: .+$/m,`timezone: ${ef()}`)}function rf(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST"}async function of(e){let t=[],r=[],o=new Date().toISOString().slice(0,10),n=Oe.join(e,"memory","daily",`${o}.md`);await A(n)?r.push(n):(await Wa(n,Dc(o),{encoding:"utf8",mode:384,flag:"wx"}),t.push(n));let a=Oe.join(e,"standing-orders","example.yaml");return await A(a)?r.push(a):(await Wa(a,Lc,{encoding:"utf8",mode:384,flag:"wx"}),t.push(a)),{createdFiles:t,preservedFiles:r}}async function ce(e,t){let r=Oe.join(e,t);return await A(r)?Kg(r,"utf8"):""}async function h(e){let t=f(e.home),r=new Date().toISOString(),o=qa(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:Se({type:e.type,actor:e.actor??"cli",origin:e.origin??"nativesoul",result:e.result??"ok",details:o,created_at:r})},a=_(t.database);try{a.insertEvent(n)}finally{a.close()}return await af(lf.dirname(t.auditLog),{recursive:!0,mode:448}),await nf(t.auditLog,`${JSON.stringify(n)}
852
+ `,{encoding:"utf8",mode:384}),n}function qa(e,t){if(typeof e=="string")return cf(e,t);if(Array.isArray(e))return e.map(r=>qa(r,t));if(e&&typeof e=="object"){let r={};for(let[o,n]of Object.entries(e))r[o]=qa(n,t);return r}return e}function cf(e,t){return[[new RegExp(Ja(t),"gu"),"[REDACTED_NATIVESOUL_HOME]"],[new RegExp(Ja(process.cwd()),"gu"),"[REDACTED_WORKSPACE]"],[new RegExp(Ja(sf.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,a])=>o.replace(n,a),e)}function Ja(e){return e.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}async function un(e){let t=f(e.home),r=_(t.database);try{return r.listEvents({type:e.type,result:e.result,limit:df(e.limit)})}finally{r.close()}}async function Ga(e){let t=f(e.home),r=await un(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 df(e){return Math.min(Math.max(e??50,1),500)}import Le from"node:path";import{existsSync as P_}from"node:fs";import{mkdir as Kh,readdir as zh,readFile as fs,writeFile as Xh}from"node:fs/promises";import{existsSync as Yh}from"node:fs";import Xr from"node:path";jt();de();We();de();import{readdir as vf}from"node:fs/promises";import fe from"node:path";var Re="antigravity",kf="~/.gemini/GEMINI.md",wf="~/.antigravity",za="official:antigravity-plugin-config:v1",Jc="official:antigravity-hooks-config:v1",qc="official:antigravity-mcp-config:v1",Gc="official:antigravity-command-config:v1",Sf="official:antigravity-context-config:v1",Rf="official:antigravity-features:v1",Af=[{uid:"antigravity:plugins",nativeKind:"plugins",normalizedKind:"package",relativePath:"plugins"}];function Xa(){let e=process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim();return e?fe.resolve(e):j(wf)}function Ef(){let e=Xa();return{root:e,globalInstruction:process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim()?fe.join(e,"GEMINI.md"):j(kf)}}async function Kc(){let e=[],t=Ef();await x(t.globalInstruction)&&e.push({uid:"antigravity:global-gemini-md",host:Re,nativeKind:"global_context",normalizedKind:"instruction",source:t.globalInstruction,schemaHash:Sf}),await Pf(t.root,e),await xf(t.root,e);for(let r of Af){let o=fe.join(t.root,r.relativePath);await W(o)&&e.push({uid:r.uid,host:Re,nativeKind:r.nativeKind,normalizedKind:r.normalizedKind,source:o,schemaHash:za})}return e}async function Pf(e,t){let r=fe.join(e,"plugin.json"),o=fe.join(e,"nativesoul-package.json"),n=fe.join(e,"hooks.json"),a=fe.join(e,"mcp_config.json"),[s,i,l,c]=await Promise.all([Z(r),Z(o),Z(n),Z(a)]);if(s){let d=I(s,["name","id"])??"unknown";t.push({uid:`antigravity:plugin:${M(d)}`,host:Re,nativeKind:"plugin",normalizedKind:"extension",source:r,schemaHash:za})}if(i){let d=I(i,["name","id"])??"unknown";t.push({uid:`antigravity:package:${M(d)}`,host:Re,nativeKind:"native_plugin_package",normalizedKind:"package",source:o,schemaHash:za});let p=O(i.nativeSoul)?i.nativeSoul:{};for(let k of mn(p.commands))t.push({uid:`antigravity:command:${M(k)}`,host:Re,nativeKind:"command",normalizedKind:"command",source:`${o}:nativeSoul.commands.${k}`,schemaHash:Gc});let g=O(p.mcpServer)?p.mcpServer:null,y=I(g,["name"]);y&&t.push({uid:`antigravity:mcp:${M(y)}`,host:Re,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:nativeSoul.mcpServer.${y}`,schemaHash:qc})}if(l){t.push({uid:"antigravity:hooks:manifest",host:Re,nativeKind:"hooks",normalizedKind:"lifecycle_hooks",source:n,schemaHash:Jc});let d=O(l.hooks)?l.hooks:{};for(let p of Object.keys(d))t.push({uid:`antigravity:hook:${M(p)}`,host:Re,nativeKind:"hook",normalizedKind:"lifecycle_hook",source:`${n}:hooks.${p}`,schemaHash:Jc})}if(c)for(let d of at(c.mcpServers))t.push({uid:`antigravity:mcp:${M(d)}`,host:Re,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${a}:mcpServers.${d}`,schemaHash:qc});await jf(fe.join(e,"commands"),t)}async function xf(e,t){let r=fe.join(e,"features-evidence.json"),o=await Z(r);if(!o)return;let n=["scheduled_tasks","cron_schedules","background_agents","subagents","skills","mcps","json_hooks"];for(let a of n)o[a]===!0&&t.push({uid:`antigravity:feature:${a.replace(/_/gu,"-")}`,host:Re,nativeKind:"product_feature",normalizedKind:"feature_evidence",source:`${r}:${a}`,schemaHash:Rf})}async function jf(e,t){if(!await W(e))return;let r=await vf(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||fe.extname(o.name)!==".md")continue;let n=fe.basename(o.name,".md");t.push({uid:`antigravity:command:${M(n,{allowSlash:!0})}`,host:Re,nativeKind:"command",normalizedKind:"command",source:fe.join(e,o.name),schemaHash:Gc})}}de();We();import gn from"node:path";async function zc(e){let t=await If(e);if(!t)return null;let r=await Z(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:O(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 If(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 gn.join(gn.resolve(r),"scheduler-proof.json");let o=e??j("~/.antigravity"),n=[gn.join(o,"scheduler-proof.json"),gn.join(o,"native-scheduler-proof.json")];for(let a of n)if(await x(a))return a;return null}function Xc(e){if(!e)return!1;let t=Date.parse(e);return Number.isFinite(t)?Date.now()-t>10080*60*1e3:!0}var lr="antigravity",Ya="~/.gemini/GEMINI.md",Qa=class{async detect(){let t=j(Ya),r=Xa(),[o,n,a]=await Promise.all([x(t),W(r),Be("agy")]);return{host:lr,detected:n||a!==null,path:n?r:a??(o?t:void 0),capabilities:{installed:n||a!==null,enabled:n,active:!1,authenticated:!1,healthy:a!==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 Kc()}async hotProbe(){let t=await this.coldScan();return{host:lr,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 zc(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(Xc(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(Ya),o=await G(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&&!te(o,lr)&&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(Ya),r=await G(t);return{host:lr,targetPath:t,startMarker:"<!-- nativesoul:antigravity:start v1 -->",endMarker:"<!-- nativesoul:antigravity:end -->",content:Ne(lr),wouldCreate:r===null,wouldUpdate:r!==null&&!te(r,lr)}}};function Yc(){return new Qa}jt();We();de();import cr from"node:path";import{readFile as yd}from"node:fs/promises";We();import{readFile as dd}from"node:fs/promises";import Bf from"node:path";var md="life:heartbeat";function gd(e){if(!e||typeof e!="object"||Array.isArray(e))return{kind:"unknown",mode:"leader",apply:!1,skill:md};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:qf(t),surface:pd(t.surface)??pd(O(t.desired)?t.desired.surface:void 0)}}async function fd(e={}){let t=process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_FIXTURES;if(t)try{return ud(await dd(Bf.join(t,"scheduled-tasks.json"),"utf8"))}catch{return null}let r=process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_MANIFEST;if(r)try{return ud(await dd(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(()=>(cd(),ld));return o({apply:e.apply,surface:e.surface,hostConfigRoot:e.hostConfigRoot})}function hd(e,t){return!e||e==="default"||!t?!0:e===t}function ud(e){let t=Ve(e);if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t,o=Vf(r.surface),n=Wf(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:Jf(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 pd(e){return e==="default"||e==="claude-code"||e==="claude-desktop"?e:void 0}function Vf(e){return e==="claude-code"||e==="claude-desktop"||e==="cloud"?e:void 0}function Wf(e){return e==="local_scheduled_task"||e==="cloud_routine"||e==="ui_only"?e:"unknown"}function Jf(e){return e==="official_machine_readable"||e==="ui_only"||e==="unknown"?e:void 0}function qf(e){return O(e.desired)&&typeof e.desired.skill=="string"&&e.desired.skill.trim().length>0?e.desired.skill.trim():md}var ue="claude",fn="~/.claude/CLAUDE.md",_d="CLAUDE.md",bd=".claude/CLAUDE.md",vd="life:heartbeat",wd="official:claude-cli-hot-scan:v1",es=class{async detect(){let t=j(fn),r=cr.resolve(_d),o=cr.resolve(bd),[n,a,s,i]=await Promise.all([x(t),x(r),x(o),pn("claude",["--version"])]);return{host:ue,detected:n||a||s||i!==null,version:i??void 0,path:n?t:a?r:s?o:void 0,capabilities:{installed:n||a||s||i!==null,enabled:n||a||s,active:a||s,authenticated:!1,healthy:i!==null||n||a||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=j(fn),r=cr.resolve(_d),o=cr.resolve(bd),n=[];return await x(t)&&n.push({uid:"claude:global-claude-md",host:ue,nativeKind:"global_context",normalizedKind:"instruction",source:t}),await x(r)&&n.push({uid:"claude:project-claude-md",host:ue,nativeKind:"project_context",normalizedKind:"instruction",source:r}),await x(o)&&n.push({uid:"claude:project-dot-claude-md",host:ue,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 Gf(o,r);if(l.status==="ready")return l}let[n,a]=await Promise.all([Ka("claude",["mcp","list","--json"],5e3),Ka("claude",["plugin","list","--json"],5e3)]),s=[],i=[];return n.status==="ok"?i.push(...Sd(n.stdout)):s.push(kd("CLAUDE_HOT_SCAN_JSON_UNSUPPORTED","claude mcp list --json",n.stderr)),a.status==="ok"?i.push(...Rd(a.stdout)):s.push(kd("CLAUDE_HOT_SCAN_JSON_UNSUPPORTED","claude plugin list --json",a.stderr)),{host:ue,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=gd(t),o=await fd({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!==vd?{status:"error",code:"CLAUDE_HEARTBEAT_SKILL_MISMATCH",message:`Claude heartbeat Scheduled Task must invoke ${vd}.`}: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."}:hd(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(fn),o=await G(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&&!te(o,ue)&&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(fn),r=await G(t);return{host:ue,targetPath:t,startMarker:"<!-- nativesoul:claude:start v1 -->",endMarker:"<!-- nativesoul:claude:end -->",content:Ne(ue),wouldCreate:r===null,wouldUpdate:r!==null&&!te(r,ue)}}};async function Gf(e,t){try{let[r,o]=await Promise.all([yd(cr.join(e,"mcp-list.json"),"utf8"),yd(cr.join(e,"plugin-list.json"),"utf8")]),n=[...Sd(r),...Rd(o)];return{host:ue,checkedAt:t,status:"ready",warnings:[],capabilities:n.map(a=>({...a,installed:a.installed??!0,enabled:a.enabled??!0,active:a.active??!0,authenticated:a.authenticated??!1,healthy:a.healthy??!0,allowed:!0,ready:a.ready??!1}))}}catch{return{host:ue,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 Sd(e){let t=Ve(e);return st(t,["servers","mcps","items"]).flatMap(r=>{let o=I(r,["name","id","server","server_name"]);if(!o)return[];let n=I(r,["status","state"]),a=n!=="disabled",s=n==="connected"||n==="ready"||n==="active"||n==="ok"||n==="authenticated";return[{uid:`claude:mcp:${M(o)}`,host:ue,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`claude mcp list:${o}`,schemaHash:wd,enabled:a,active:a,authenticated:se(r,["authenticated"])??s,healthy:a,ready:Ad(n)}]})}function Rd(e){let t=Ve(e);return st(t,["plugins","items"]).flatMap(r=>{let o=I(r,["id","plugin","package"])??I(r,["name"]);if(!o)return[];let n=I(r,["status","state"]),a=se(r,["enabled"])??n!=="disabled",s=se(r,["installed"])??!0;return[{uid:`claude:plugin:${Kf(o)}`,host:ue,nativeKind:"plugin",normalizedKind:"extension",source:`claude plugin list --json:${o}`,schemaHash:wd,installed:s,enabled:a,active:a,authenticated:se(r,["authenticated"])??a,healthy:s,ready:a&&(n===null||Ad(n)||se(r,["enabled"])===!0)}]})}function kd(e,t,r){let o=zf(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 Ad(e){return e==="ready"||e==="enabled"||e==="active"||e==="ok"||e==="authenticated"||e==="connected"}function Kf(e){return M(e,{allowSlash:!0})}function zf(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 Ed(){return new es}jt();We();de();import ns from"node:path";var ie="codex",yn="~/.codex/AGENTS.md",Id="AGENTS.md",mh=1e3,Td="life:heartbeat",bn="official:codex-app-server:v1",as=class{async detect(){let t=j(yn),r=ns.resolve(Id),[o,n,a]=await Promise.all([x(t),x(r),Be("codex")]);return{host:ie,detected:o||n||a!==null,path:o?t:n?r:a??void 0,capabilities:{installed:o||n||a!==null,enabled:o||n,active:n,authenticated:!1,healthy:a!==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(yn),r=ns.resolve(Id),o=[];return await x(t)&&o.push({uid:"codex:global-agents-md",host:ie,nativeKind:"global_context",normalizedKind:"instruction",source:t}),await x(r)&&o.push({uid:"codex:project-agents-md",host:ie,nativeKind:"project_context",normalizedKind:"instruction",source:r}),o}async hotProbe(t){let r=new Date().toISOString(),o=bh(t);if(o){let i=await os(o,r);if(i.status==="ready")return i}let n=process.env.NATIVESOUL_CODEX_APP_SERVER_FIXTURES?.trim();if(n){let i=await os(kh(n),r);if(i.status==="ready")return i}let a=vh(t);if(a){let i=await os(wh(a),r);if(i.status==="ready")return i}let s=await this.coldScan();return{host:ie,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(()=>(jd(),xd)),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!==Td?{status:"error",code:"CODEX_HEARTBEAT_SKILL_MISMATCH",message:`Codex heartbeat Automation must invoke ${Td}.`}: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(yn),o=await G(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&&!te(o,ie)&&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(yn),r=await G(t);return{host:ie,targetPath:t,startMarker:"<!-- nativesoul:codex:start v1 -->",endMarker:"<!-- nativesoul:codex:end -->",content:Ne(ie),wouldCreate:r===null,wouldUpdate:r!==null&&!te(r,ie)}}};async function os(e,t){let[r,o,n,a]=await Promise.all([_n(e,"mcpServerStatus/list"),_n(e,"plugin/list"),_n(e,"skills/list"),_n(e,"app/list")]);if([r,o,n,a].some(l=>l===null))return{host:ie,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=[...fh(r),...hh(o),...yh(n),..._h(a)];return{host:ie,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 _n(e,t){try{return await e.call(t)}catch{return null}}async function gh(e,t){let r=new AbortController,o=setTimeout(()=>r.abort(),mh);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 a=await n.json();return O(a)&&"error"in a?null:O(a)&&"result"in a?a.result:a}catch{return null}finally{clearTimeout(o)}}function fh(e){return st(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=vn(t,o);return[{uid:`codex:mcp:${M(r)}`,host:ie,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`codex app server mcpServerStatus/list:${r}`,schemaHash:bn,...n}]})}function hh(e){return st(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=vn(t,o);return[{uid:`codex:plugin:${ss(r)}`,host:ie,nativeKind:"plugin",normalizedKind:"extension",source:`codex app server plugin/list:${r}`,schemaHash:bn,...n}]})}function yh(e){return st(e,["skills","items"]).flatMap(t=>{let r=I(t,["id","name","path"]);if(!r)return[];let o=I(t,["status","state"]),n=vn(t,o);return[{uid:`codex:skill:${ss(r)}`,host:ie,nativeKind:"skill",normalizedKind:"skill",source:`codex app server skills/list:${r}`,schemaHash:bn,...n}]})}function _h(e){return st(e,["apps","items"]).flatMap(t=>{let r=I(t,["id","name","app"]);if(!r)return[];let o=I(t,["status","state"]),n=vn(t,o);return[{uid:`codex:app:${ss(r)}`,host:ie,nativeKind:"app_server_app",normalizedKind:"app",source:`codex app server app/list:${r}`,schemaHash:bn,...n}]})}function vn(e,t){let r=se(e,["installed"])??!0,o=t==="disabled"||t==="unavailable",n=t==="error"||t==="unhealthy",a=se(e,["enabled"])??!o,s=se(e,["active"])??a,i=se(e,["healthy"])??(!o&&!n),l=se(e,["authenticated"])??se(e,["auth"])??!1,c=se(e,["ready"])??(r&&a&&s&&i);return{installed:r,enabled:a,active:s,authenticated:l,healthy:i,ready:c}}function bh(e){if(O(e)){let t=e.appServer;if(O(t)&&typeof t.call=="function")return{call:r=>Promise.resolve(t.call(r))}}return null}function vh(e){if(O(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 kh(e){return{async call(t){try{let{readFile:r}=await import("node:fs/promises"),o=t.replace(/\//gu,"-");return JSON.parse(await r(ns.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 wh(e){return{call:t=>gh(e,t)}}function ss(e){return M(e,{allowSlash:!0})}function Cd(){return new as}jt();We();de();import{readdir as Nd}from"node:fs/promises";import Ae from"node:path";var re="gemini",ls="~/.gemini/GEMINI.md",Sh="~/.gemini/extensions",Rh="~/.gemini/settings.json",Vr="official:gemini-extension-config:v1",is="official:gemini-settings-config:v1",Ah="official:gemini-memory-config:v1",cs=class{async detect(){let t=Od(),r=t.globalInstruction,o=t.extensionsDirectory,[n,a,s]=await Promise.all([x(r),W(o),pn("gemini",["--version"])]);return{host:re,detected:n||a||s!==null,version:s??void 0,path:n?r:a?o:void 0,capabilities:{installed:n||a||s!==null,enabled:n||a,active:n,authenticated:!1,healthy:s!==null||n||a,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=Od(),o=r.globalInstruction;await x(o)&&t.push({uid:"gemini:global-gemini-md",host:re,nativeKind:"global_context",normalizedKind:"memory",source:o,schemaHash:Ah}),await Eh(r.settingsFile,t);let n=r.extensionsDirectory;if(await W(n)){t.push({uid:"gemini:extensions",host:re,nativeKind:"extensions",normalizedKind:"package",source:n,schemaHash:Vr});let a=await Nd(n,{withFileTypes:!0});for(let s of a)s.isDirectory()&&await Ph(Ae.join(n,s.name),s.name,t)}return t}async hotProbe(){let t=await this.coldScan();return{host:re,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(ls),o=await G(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&&!te(o,re)&&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(ls),r=await G(t);return{host:re,targetPath:t,startMarker:"<!-- nativesoul:gemini:start v1 -->",endMarker:"<!-- nativesoul:gemini:end -->",content:Ne(re),wouldCreate:r===null,wouldUpdate:r!==null&&!te(r,re)}}};function Od(){let e=process.env.NATIVESOUL_GEMINI_INVENTORY_ROOT?.trim();if(e){let t=Ae.resolve(e);return{globalInstruction:Ae.join(t,"GEMINI.md"),settingsFile:Ae.join(t,"settings.json"),extensionsDirectory:Ae.join(t,"extensions")}}return{globalInstruction:j(ls),settingsFile:j(Rh),extensionsDirectory:j(Sh)}}async function Eh(e,t){let r=await Z(e);if(r){t.push({uid:"gemini:settings",host:re,nativeKind:"settings",normalizedKind:"config",source:e,schemaHash:is});for(let o of at(r.mcpServers))t.push({uid:`gemini:mcp:${M(o)}`,host:re,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${e}:mcpServers.${o}`,schemaHash:is});for(let o of Md(r.tools))t.push({uid:`gemini:tool:${M(o)}`,host:re,nativeKind:"tool",normalizedKind:"tool",source:`${e}:tools.${o}`,schemaHash:is})}}async function Ph(e,t,r){let o=Ae.join(e,"gemini-extension.json"),n=await Z(o),a=I(n,["name","id"])??t;if(r.push({uid:`gemini:extension:${M(a)}`,host:re,nativeKind:"extension",normalizedKind:"package",source:n?o:e,schemaHash:n?Vr:void 0}),n){for(let s of at(n.mcpServers))r.push({uid:`gemini:mcp:${M(s)}`,host:re,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:mcpServers.${s}`,schemaHash:Vr});for(let s of Md(n.tools))r.push({uid:`gemini:tool:${M(s)}`,host:re,nativeKind:"tool",normalizedKind:"tool",source:`${o}:tools.${s}`,schemaHash:Vr})}await xh(Ae.join(e,"commands"),r)}async function xh(e,t){if(!await W(e))return;let r=await Nd(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||![".toml",".md"].includes(Ae.extname(o.name)))continue;let n=Ae.basename(o.name,Ae.extname(o.name));t.push({uid:`gemini:command:${M(n,{allowSlash:!0})}`,host:re,nativeKind:"command",normalizedKind:"command",source:Ae.join(e,o.name),schemaHash:Vr})}}function Md(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):at(e)}function Ld(){return new cs}jt();We();de();import{readdir as Ud}from"node:fs/promises";import q from"node:path";var J="grok",kn="~/.grok/Agents.md",Dd="AGENTS.md",Hd="Agents.md",$d="CLAUDE.md",jh="~/.grok",ds="official:grok-plugin-config:v1",Fd="official:grok-hooks-config:v1",us="official:grok-mcp-config:v1",Bd="official:grok-command-config:v1",Ih="official:grok-context-config:v1",Th=[{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"}],ps=class{async detect(){let t=j(kn),r=q.resolve(Dd),o=q.resolve(Hd),n=q.resolve($d),a=Vd(),[s,i,l,c,d,p]=await Promise.all([x(t),x(r),x(o),x(n),W(a),Be("grok")]),g=i||l;return{host:J,detected:s||g||c||d||p!==null,path:s?t:l?o:i?r:c?n:p??void 0,capabilities:{installed:s||g||c||d||p!==null,enabled:s||g||c||d,active:g||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=Ch(),o=r.globalInstruction;await x(o)&&t.push({uid:"grok:global-agents-md",host:J,nativeKind:"global_context",normalizedKind:"instruction",source:o,schemaHash:Ih});let n=q.resolve(Dd);await x(n)&&t.push({uid:"grok:project-agents-md",host:J,nativeKind:"project_context",normalizedKind:"instruction",source:n});let a=q.resolve(Hd);await x(a)&&t.push({uid:"grok:project-agents-titlecase-md",host:J,nativeKind:"project_context",normalizedKind:"instruction",source:a});let s=q.resolve($d);await x(s)&&t.push({uid:"grok:project-claude-md",host:J,nativeKind:"project_context",normalizedKind:"instruction",source:s});let i=r.root;await Wd(r.root,t),await Oh(i,t);for(let l of Th){let c=q.join(i,l.relativePath);await W(c)&&t.push({uid:l.uid,host:J,nativeKind:l.nativeKind,normalizedKind:l.normalizedKind,source:c,schemaHash:l.relativePath==="mcps"?us:ds})}return Mh(t)}async hotProbe(){let t=await this.coldScan();return{host:J,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(kn),o=await G(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&&!te(o,J)&&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(kn),r=await G(t);return{host:J,targetPath:t,startMarker:"<!-- nativesoul:grok:start v1 -->",endMarker:"<!-- nativesoul:grok:end -->",content:Ne(J),wouldCreate:r===null,wouldUpdate:r!==null&&!te(r,J)}}};function Vd(){let e=process.env.NATIVESOUL_GROK_INVENTORY_ROOT?.trim();return e?q.resolve(e):j(jh)}function Ch(){let e=Vd();return{root:e,globalInstruction:process.env.NATIVESOUL_GROK_INVENTORY_ROOT?.trim()?q.join(e,"Agents.md"):j(kn)}}async function Wd(e,t){let r=q.join(e,"plugin.json"),o=q.join(e,"nativesoul-package.json"),n=q.join(e,"hooks","hooks.json"),a=q.join(e,".mcp.json"),[s,i,l,c]=await Promise.all([Z(r),Z(o),Z(n),Z(a)]);if(s){let d=I(s,["name","id"])??"unknown";t.push({uid:`grok:plugin:${M(d)}`,host:J,nativeKind:"plugin",normalizedKind:"extension",source:r,schemaHash:ds})}if(i){let d=I(i,["name","id"])??"unknown";t.push({uid:`grok:package:${M(d)}`,host:J,nativeKind:"native_plugin_package",normalizedKind:"package",source:o,schemaHash:ds});let p=O(i.nativeSoul)?i.nativeSoul:{};for(let k of mn(p.commands))t.push({uid:`grok:command:${M(k)}`,host:J,nativeKind:"command",normalizedKind:"command",source:`${o}:nativeSoul.commands.${k}`,schemaHash:Bd});let g=O(p.mcpServer)?p.mcpServer:null,y=I(g,["name"]);y&&t.push({uid:`grok:mcp:${M(y)}`,host:J,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:nativeSoul.mcpServer.${y}`,schemaHash:us})}if(l){t.push({uid:"grok:hooks:manifest",host:J,nativeKind:"hooks",normalizedKind:"lifecycle_hooks",source:n,schemaHash:Fd});let d=O(l.hooks)?l.hooks:{};for(let p of Object.keys(d))t.push({uid:`grok:hook:${M(p)}`,host:J,nativeKind:"hook",normalizedKind:"lifecycle_hook",source:`${n}:hooks.${p}`,schemaHash:Fd})}if(c)for(let d of at(c.mcpServers))t.push({uid:`grok:mcp:${M(d)}`,host:J,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${a}:mcpServers.${d}`,schemaHash:us});await Nh(q.join(e,"commands"),t)}async function Oh(e,t){let r=q.join(e,"plugins");if(!await W(r))return;let o=await Ud(r,{withFileTypes:!0});for(let n of o)n.isDirectory()&&await Wd(q.join(r,n.name),t)}async function Nh(e,t){if(!await W(e))return;let r=await Ud(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||q.extname(o.name)!==".md")continue;let n=q.basename(o.name,".md");t.push({uid:`grok:command:${M(n,{allowSlash:!0})}`,host:J,nativeKind:"command",normalizedKind:"command",source:q.join(e,o.name),schemaHash:Bd})}}function Mh(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 Jd(){return new ps}import{mkdir as wn,readFile as Sn,rm as Bh,writeFile as Rn}from"node:fs/promises";import{existsSync as An}from"node:fs";import Wr from"node:path";import{lstatSync as Lh,realpathSync as Dh,statSync as Hh}from"node:fs";import Je from"node:path";var $h=process.platform!=="win32";function Fh(){let e=process.getuid;return typeof e=="function"?e.call(process):void 0}function qd(e){let t=e,r=[];for(;;)try{let o=Dh(t);return r.length?Je.join(o,...r):o}catch{let o=Je.dirname(t);if(o===t)return e;r.unshift(Je.basename(t)),t=o}}function Uh(e,t){let r=Je.relative(e,t);return r===""||!r.startsWith("..")&&!Je.isAbsolute(r)}function Gd(e,t={}){if(!e||typeof e!="string")return{ok:!1,code:"PATH_ESCAPES_ROOT",detail:"empty or non-string target path"};let r=Je.resolve(e);if(t.protectedFiles?.length&&new Set(t.protectedFiles.map(a=>Je.resolve(a))).has(r))return{ok:!1,code:"PROTECTED_FILE_DIRECT_WRITE",detail:`${r} is protected; write via a proposal`};try{if(Lh(r).isSymbolicLink()&&!t.allowSymlinkTarget)return{ok:!1,code:"SYMLINK_TARGET_UNSAFE",detail:`${r} is a symlink`}}catch{}let o=Je.dirname(r);try{let n=Hh(o);if($h){let a=(n.mode&2)!==0,s=(n.mode&512)!==0;if(a&&!s)return{ok:!1,code:"WORLD_WRITABLE_PATH",detail:`${o} is world-writable`};let i=t.uid??Fh();if(i!==void 0&&n.uid!==i)return{ok:!1,code:"SUSPICIOUS_OWNER",detail:`${o} owned by uid ${n.uid}, expected ${i}`}}}catch{}if(t.root){let n=qd(Je.resolve(t.root)),a=qd(r);if(!Uh(n,a))return{ok:!1,code:"PATH_ESCAPES_ROOT",detail:`${a} escapes ${n}`}}return{ok:!0,normalizedPath:r}}function pe(e,t={}){let r=Gd(e,t);if(!r.ok)throw new Error(`unsafe write path (${r.code}): ${r.detail}`);return r.normalizedPath}function En(e){return{start:`<!-- nativesoul:${e}:start v1 -->`,end:`<!-- nativesoul:${e}:end -->`}}async function Kd(e){let t=f(e.home),r=An(e.targetPath),o=r?await Sn(e.targetPath,"utf8"):null,n=Wh(o,e.host,e.block),a=o===null?null:E(o),s=E(n),i=Jh(o,n,e.host),l=i!=="noop",c=!e.apply,d=l&&e.apply?await Qd(t.home,e.host,e.targetPath,r,o,s):null;l&&e.apply&&(pe(e.targetPath,{allowSymlinkTarget:!0}),await wn(Wr.dirname(e.targetPath),{recursive:!0,mode:448}),await Rn(e.targetPath,n,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:e.targetPath,action:i,dryRun:c,changed:l,beforeHash:a,afterHash:s,diff:Zd(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 zd(e){let t=f(e.home),r=An(e.targetPath),o=r?await Sn(e.targetPath,"utf8"):null,n=Vh(o,e.host),a=o===null?null:E(o),s=n===null?E(""):E(n),i=o!==n?"remove":"noop",l=i!=="noop",c=!e.apply,d=l&&e.apply?await Qd(t.home,e.host,e.targetPath,r,o,s):null;l&&e.apply&&n!==null&&(await wn(Wr.dirname(e.targetPath),{recursive:!0,mode:448}),await Rn(e.targetPath,n,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:e.targetPath,action:i,dryRun:c,changed:l,beforeHash:a,afterHash:s,diff:Zd(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 Xd(e){let t=An(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 Sn(e.targetPath,"utf8"),n=En(e.host),a=o.indexOf(n.start),s=o.indexOf(n.end),i=a>=0,l=s>=0,c=i&&l&&s>a;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 Yd(e){let t=f(e.home),r=JSON.parse(await Sn(e.snapshotPath,"utf8")),o=!e.apply;e.apply&&(r.beforeExists&&r.beforeContent!==null?(await wn(Wr.dirname(r.targetPath),{recursive:!0,mode:448}),await Rn(r.targetPath,r.beforeContent,{encoding:"utf8",mode:384})):An(r.targetPath)&&await Bh(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 Vh(e,t){if(e===null)return null;let{start:r,end:o}=En(t),n=e.indexOf(r),a=e.indexOf(o);if(n<0||a<=n)return e;let s=a+o.length,i=e.slice(0,n),l=e.slice(s);return i.endsWith(`
853
853
 
854
854
  `)&&l.startsWith(`
855
855
  `)?l=l.replace(/^\n/u,""):!i.endsWith(`
@@ -863,22 +863,22 @@ _Running context for today. Promote durable facts to curated memory later._
863
863
  `)?`
864
864
  `:`
865
865
 
866
- `;return`${e}${l}${o}`}function Jh(e,t,r){if(e===t)return"noop";if(e===null||e.length===0)return"create";let{start:o,end:n}=En(r);return e.includes(o)&&e.includes(n)?"replace":"append"}async function Qd(e,t,r,o,n,a){let s=Wr.join(e,"backups","managed-block");await wn(s,{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:a,createdAt:i},c=`${i.replace(/[:.]/g,"-")}-${t}.json`,d=Wr.join(s,c);return await Sn(d,JSON.stringify(l,null,2),{encoding:"utf8",mode:384}),d}function Zd(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(`
867
- `)}var qh=["codex","claude","grok","antigravity","gemini"],Gh={codex:Cd,claude:Ed,grok:Jd,antigravity:Yc,gemini:Ld};function Ge(e){return e==="all"?qh:[e]}function Pn(e){return Ge(e)}function jt(e){return Gh[e]()}async function Jr(e){let t=[];for(let r of Pn(e)){let o=jt(r),[n,a]=await Promise.all([o.detect(),o.coldScan({})]);t.push({host:r,detected:n.detected,version:n.version,sources:a})}return t}async function qr(e){let t=[];for(let r of Pn(e)){let o=jt(r);t.push({host:r,diagnostics:await o.doctor({})})}return t}async function Gr(e){return jt(e).managedBlockPreview()}async function Kr(e){let t=await Gr(e.host);return Kd({home:e.home,host:e.host,targetPath:e.targetPath??t.targetPath,block:t.content,apply:e.apply})}async function ms(e){return Yd(e)}async function gs(e){let t=await Gr(e.host);return zd({home:e.home,host:e.host,targetPath:e.targetPath??t.targetPath,apply:e.apply})}async function It(e){let t=await v(e.home),r=new Date().toISOString(),o=[],n=e.ttlSeconds??await Qh(t.home);for(let a of Pn(e.host)){if(e.delta){let p=(await Ee({home:t.home,host:a,includeShared:!1,limit:1}))[0]?.last_seen_at;if(p&&Date.now()-Date.parse(p)<=n*1e3){let g={host:a,status:"ready",count:0,records:[],skipped:!0,warnings:[],diagnostics:[]};await h({home:t.home,type:"capabilities_refreshed",details:{host:a,count:0,status:"ready",warnings:[],delta:!0,skipped:!0}}),o.push(g);continue}}let i=await jt(a).hotProbe({}),l=i.capabilities.map(d=>ey({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:a,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:a,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 Qh(e){let t;try{t=await fs(Xr.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 Ee(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await S(t.database))return[];let r=_(t.database,{readOnly:e.readOnly}),o=ou(e.limit);try{return r.listCapabilities({host:e.host,readyOnly:e.readyOnly,limit:o,includeShared:e.includeShared})}finally{r.close()}}async function Yr(e){let t=await v(e.home),r=_(t.database),o=ou(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 Tt(e){let t=await v(e.home),r=_(t.database);try{return r.getCapability(e.uid)}finally{r.close()}}async function hs(e){let t=e.readOnly?f(e.home):await v(e.home),r=Xr.join(t.home,"capabilities","cards"),o=[];if(!await S(r))return{cards:[],warnings:o};let n=(await zh(r)).filter(c=>c.endsWith(".json")).sort(),a=iy(e.query??""),s=[];for(let c of n){let d=Xr.join(r,c),p;try{p=await fs(d,"utf8")}catch{o.push(`CAPABILITY_CARD_UNREADABLE:${c}`);continue}let g=oy(p);if(!g){o.push(`CAPABILITY_CARD_MALFORMED:${c}`);continue}let y=ny(g,e.host);s.push({card:y,score:ay(g,e.host,a)})}let i=uy(e.limit),l=s.sort((c,d)=>d.score-c.score||c.card.uid.localeCompare(d.card.uid));return{cards:Zh(l,i).map(c=>c.card),warnings:o}}function Zh(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,a)=>a.score-n.score||n.card.uid.localeCompare(a.card.uid)):r}async function ys(e){let t=await v(e.home),r=await ty({home:t.home,host:e.host,limit:e.limit}),o=Xr.join(t.home,"capabilities","cards");await Kh(o,{recursive:!0,mode:448});let n=[];for(let s of r){let i=ry(s),l=`${JSON.stringify(i,null,2)}
868
- `,c=Xr.join(o,`${dy(s.uid)}.json`),d=Yh(c)?await fs(c,"utf8"):null,p=d===l?"unchanged":d===null?"created":"updated";p!=="unchanged"&&await Xh(c,l,{encoding:"utf8",mode:384}),n.push({uid:s.uid,host:s.host,path:c,action:p,hash:A(l),card:i})}let a={home:t.home,host:e.host,generated:n.length,changed:n.filter(s=>s.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:a.generated,changed:a.changed,warnings:a.warnings}}),a}function ey(e){return{...e,uid:N(e.uid).value,host:N(e.host).value,native_kind:N(e.native_kind).value,normalized_kind:N(e.normalized_kind).value,source:N(e.source).value,schema_hash:e.schema_hash?N(e.schema_hash).value:null}}async function ty(e){return e.host==="all"?Ee({home:e.home,limit:e.limit}):Ee({home:e.home,host:e.host,limit:e.limit})}function ry(e){let t=e.schema_hash??Re({uid:e.uid,host:e.host,native_kind:e.native_kind,normalized_kind:e.normalized_kind,source:e.source,readiness:eu(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:eu(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:ly(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:cy(e),examples:[`Inspect ${e.uid} readiness before using it.`,`Prefer a ready capability on ${e.host}; otherwise report degraded status.`]};return H(r)}function oy(e){let t;try{t=JSON.parse(e)}catch{return null}if(!tu(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)||!sy(r)?null:t}function ny(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:zr(e.use_when).slice(0,2),requires:zr(e.requires).slice(0,4),approval:e.approval,alternative_host:r,available_on_other_host:o}}function ay(e,t,r){let o=ru([e.uid,e.host,e.native_kind,e.normalized_kind,e.source,e.schema_hash,...zr(e.use_when),...zr(e.requires),e.approval,...zr(e.examples)].join(" ")),n=r.reduce((a,s)=>a+(o.includes(s)?10:0),0);return(e.host===t?100:0)+(e.readiness.ready?5:0)+n}function zr(e){return e.filter(t=>typeof t=="string")}function tu(e){return typeof e=="object"&&e!==null}function sy(e){return tu(e)?["installed","enabled","active","authenticated","healthy","allowed","ready"].every(t=>typeof e[t]=="boolean"):!1}function iy(e){return ru(e).split(/\s+/u).map(t=>t.trim()).filter(t=>t.length>=2)}function ru(e){return e.toLowerCase().normalize("NFKD").replace(/[\u0300-\u036f]/gu,"")}function eu(e){return{installed:e.installed,enabled:e.enabled,active:e.active,authenticated:e.authenticated,healthy:e.healthy,allowed:e.allowed,ready:e.ready}}function ly(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 cy(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 dy(e){return`${e.replace(/[^A-Za-z0-9._-]+/gu,"_").replace(/^_+|_+$/gu,"")||"capability"}-${A(e).slice(7,19)}`}function ou(e){return Math.min(Math.max(e??50,1),100)}function uy(e){return Math.min(Math.max(e??5,1),8)}async function Qr(e){let t=await v(e.home),r=N(e.summary).value,o=new Date,n=e.ttlSeconds?new Date(o.getTime()+py(e.ttlSeconds)*1e3).toISOString():null,a=H(e.source??{host:"cli",session_id:"local"}),s=_(t.database),i;try{i=s.createOpenCommitmentIfMissing({id:T("commitment"),project_id:e.project,summary:r,status:"open",due_at:e.dueAt??null,ttl_expires_at:n,source:a,created_at:o.toISOString(),updated_at:o.toISOString()},o.toISOString())}finally{s.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 Zr(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await S(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 eo(e,t){return nu(e,t,"completed","commitment_completed")}async function _s(e,t){return nu(e,t,"dismissed","commitment_dismissed")}async function nu(e,t,r,o){let n=await v(e),a=_(n.database),s;try{s=a.updateCommitmentStatus(t,r,new Date().toISOString())}finally{a.close()}if(!s)throw new Error(`Commitment not found: ${t}`);return await h({home:n.home,type:o,details:{id:s.id,project:s.project_id,status:s.status}}),s}function py(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e),1),365*24*60*60):1440*60}import{createHash as my}from"node:crypto";import{existsSync as xn,mkdirSync as gy,realpathSync as fy,readFileSync as su,writeFileSync as hy}from"node:fs";import{spawnSync as iu}from"node:child_process";import ye from"node:path";function L(e,t){return K(e,t).id}function K(e,t){let r=ks(e),o=vy(r),n=o?ky(o):null,a=n?au(n):o??r,s=wy(a),i=n?"git-remote":o?"git-root":"path",l=_y(s,a),c=yy(r),d=c?lu(c):null,p=ws(t),g=[d,l,n?au(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 lu(e){if(!xn(e))return null;let t=su(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?by(o):null}function bs(e,t){let r=ye.join(e,".nativesoul","project");return gy(ye.dirname(r),{recursive:!0,mode:448}),hy(r,`${t}
869
- `,{encoding:"utf8",mode:384}),r}async function to(e){let t=K(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=ye.join(r,".nativesoul","project");return xn(o)?{written:!1,marker_path:o,base_id:t.base_id}:(bs(r,t.base_id),{written:!0,marker_path:o,base_id:t.base_id})}async function vs(e){let t=ye.resolve(e.cwd),r=K(t,e.home),o=r.git_root??r.cwd,n=ye.join(o,".nativesoul","project");return e.apply&&(bs(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 yy(e){let t=ks(e);for(;;){let r=ye.join(t,".nativesoul","project");if(xn(r))return r;let o=ye.dirname(t);if(o===t)return null;t=o}}function _y(e,t){let r=my("sha256").update(t).digest("hex").slice(0,10);return`${Ry(e)}-${r}`}function by(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"")||"workspace"}function ks(e){try{return fy(ye.resolve(e))}catch{return ye.resolve(e)}}function vy(e){let t=iu("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?ks(r):null}function ky(e){let t=iu("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 au(e){return e.trim().replace(/^git@([^:]+):/,"https://$1/").replace(/^ssh:\/\/git@([^/]+)\//,"https://$1/").replace(/^https?:\/\/([^/]+)\//,"https://$1/").replace(/\.git$/u,"").toLowerCase()}function wy(e){let t=e.replace(/\/+$/u,"");return ye.basename(t)||"workspace"}function Ry(e){return e.toLowerCase().replace(/[^a-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"")||"workspace"}function ws(e){if(!e)return{};let t=ye.join(ye.resolve(e),"config.yaml");if(!xn(t))return{};let r=su(t,"utf8"),o={},n=!1,a=!1,s="";for(let i of r.split(/\r?\n/u)){if(/^\S/u.test(i)){n=/^project:\s*$/u.test(i),a=!1;continue}let l=i.match(/^([ \t]+)aliases:\s*(?:\{\}\s*)?$/u);if(n&&l?.[1]){a=!0,s=l[1];continue}if(a){if(i.trim().length===0||i.trim().startsWith("#"))continue;let c=i.match(/^([ \t]+)(?:"([^"]+)"|'([^']+)'|([^:]+)):\s*(?:"([^"]+)"|'([^']+)'|(.+))\s*$/u);(c?.[1]??"").length<=s.length&&(a=!1);let p=c?.[2]??c?.[3]??c?.[4],g=c?.[5]??c?.[6]??c?.[7];a&&p&&g?o[p.trim()]=g.trim():/^[ \t]+\S/u.test(i)&&i.trim().length>0&&(a=!1)}}return o}import{readFile as Sy,writeFile as Ay}from"node:fs/promises";import Ey from"node:path";async function Rs(e){let t=f(e.home),r=Ey.join(t.home,"config.yaml"),o=await S(r)?await Sy(r,"utf8"):`version: 1
866
+ `;return`${e}${l}${o}`}function Jh(e,t,r){if(e===t)return"noop";if(e===null||e.length===0)return"create";let{start:o,end:n}=En(r);return e.includes(o)&&e.includes(n)?"replace":"append"}async function Qd(e,t,r,o,n,a){let s=Wr.join(e,"backups","managed-block");await wn(s,{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:E(n),afterHash:a,createdAt:i},c=`${i.replace(/[:.]/g,"-")}-${t}.json`,d=Wr.join(s,c);return await Rn(d,JSON.stringify(l,null,2),{encoding:"utf8",mode:384}),d}function Zd(e,t){return e===t?"No changes.":[`before: ${e===null?"missing":E(e)}`,`after: ${t===null?"missing":E(t)}`,`lines_before: ${e===null?0:e.split(/\r?\n/u).length}`,`lines_after: ${t===null?0:t.split(/\r?\n/u).length}`].join(`
867
+ `)}var qh=["codex","claude","grok","antigravity","gemini"],Gh={codex:Cd,claude:Ed,grok:Jd,antigravity:Yc,gemini:Ld};function qe(e){return e==="all"?qh:[e]}function Pn(e){return qe(e)}function It(e){return Gh[e]()}async function Jr(e){let t=[];for(let r of Pn(e)){let o=It(r),[n,a]=await Promise.all([o.detect(),o.coldScan({})]);t.push({host:r,detected:n.detected,version:n.version,sources:a})}return t}async function qr(e){let t=[];for(let r of Pn(e)){let o=It(r);t.push({host:r,diagnostics:await o.doctor({})})}return t}async function Gr(e){return It(e).managedBlockPreview()}async function Kr(e){let t=await Gr(e.host);return Kd({home:e.home,host:e.host,targetPath:e.targetPath??t.targetPath,block:t.content,apply:e.apply})}async function ms(e){return Yd(e)}async function gs(e){let t=await Gr(e.host);return zd({home:e.home,host:e.host,targetPath:e.targetPath??t.targetPath,apply:e.apply})}async function Tt(e){let t=await v(e.home),r=new Date().toISOString(),o=[],n=e.ttlSeconds??await Qh(t.home);for(let a of Pn(e.host)){if(e.delta){let p=(await Ee({home:t.home,host:a,includeShared:!1,limit:1}))[0]?.last_seen_at;if(p&&Date.now()-Date.parse(p)<=n*1e3){let g={host:a,status:"ready",count:0,records:[],skipped:!0,warnings:[],diagnostics:[]};await h({home:t.home,type:"capabilities_refreshed",details:{host:a,count:0,status:"ready",warnings:[],delta:!0,skipped:!0}}),o.push(g);continue}}let i=await It(a).hotProbe({}),l=i.capabilities.map(d=>ey({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:a,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:a,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 Qh(e){let t;try{t=await fs(Xr.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 Ee(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await A(t.database))return[];let r=_(t.database,{readOnly:e.readOnly}),o=ou(e.limit);try{return r.listCapabilities({host:e.host,readyOnly:e.readyOnly,limit:o,includeShared:e.includeShared})}finally{r.close()}}async function Yr(e){let t=await v(e.home),r=_(t.database),o=ou(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 Ct(e){let t=await v(e.home),r=_(t.database);try{return r.getCapability(e.uid)}finally{r.close()}}async function hs(e){let t=e.readOnly?f(e.home):await v(e.home),r=Xr.join(t.home,"capabilities","cards"),o=[];if(!await A(r))return{cards:[],warnings:o};let n=(await zh(r)).filter(c=>c.endsWith(".json")).sort(),a=iy(e.query??""),s=[];for(let c of n){let d=Xr.join(r,c),p;try{p=await fs(d,"utf8")}catch{o.push(`CAPABILITY_CARD_UNREADABLE:${c}`);continue}let g=oy(p);if(!g){o.push(`CAPABILITY_CARD_MALFORMED:${c}`);continue}let y=ny(g,e.host);s.push({card:y,score:ay(g,e.host,a)})}let i=uy(e.limit),l=s.sort((c,d)=>d.score-c.score||c.card.uid.localeCompare(d.card.uid));return{cards:Zh(l,i).map(c=>c.card),warnings:o}}function Zh(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,a)=>a.score-n.score||n.card.uid.localeCompare(a.card.uid)):r}async function ys(e){let t=await v(e.home),r=await ty({home:t.home,host:e.host,limit:e.limit}),o=Xr.join(t.home,"capabilities","cards");await Kh(o,{recursive:!0,mode:448});let n=[];for(let s of r){let i=ry(s),l=`${JSON.stringify(i,null,2)}
868
+ `,c=Xr.join(o,`${dy(s.uid)}.json`),d=Yh(c)?await fs(c,"utf8"):null,p=d===l?"unchanged":d===null?"created":"updated";p!=="unchanged"&&await Xh(c,l,{encoding:"utf8",mode:384}),n.push({uid:s.uid,host:s.host,path:c,action:p,hash:E(l),card:i})}let a={home:t.home,host:e.host,generated:n.length,changed:n.filter(s=>s.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:a.generated,changed:a.changed,warnings:a.warnings}}),a}function ey(e){return{...e,uid:N(e.uid).value,host:N(e.host).value,native_kind:N(e.native_kind).value,normalized_kind:N(e.normalized_kind).value,source:N(e.source).value,schema_hash:e.schema_hash?N(e.schema_hash).value:null}}async function ty(e){return e.host==="all"?Ee({home:e.home,limit:e.limit}):Ee({home:e.home,host:e.host,limit:e.limit})}function ry(e){let t=e.schema_hash??Se({uid:e.uid,host:e.host,native_kind:e.native_kind,normalized_kind:e.normalized_kind,source:e.source,readiness:eu(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:eu(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:ly(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:cy(e),examples:[`Inspect ${e.uid} readiness before using it.`,`Prefer a ready capability on ${e.host}; otherwise report degraded status.`]};return H(r)}function oy(e){let t;try{t=JSON.parse(e)}catch{return null}if(!tu(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)||!sy(r)?null:t}function ny(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:zr(e.use_when).slice(0,2),requires:zr(e.requires).slice(0,4),approval:e.approval,alternative_host:r,available_on_other_host:o}}function ay(e,t,r){let o=ru([e.uid,e.host,e.native_kind,e.normalized_kind,e.source,e.schema_hash,...zr(e.use_when),...zr(e.requires),e.approval,...zr(e.examples)].join(" ")),n=r.reduce((a,s)=>a+(o.includes(s)?10:0),0);return(e.host===t?100:0)+(e.readiness.ready?5:0)+n}function zr(e){return e.filter(t=>typeof t=="string")}function tu(e){return typeof e=="object"&&e!==null}function sy(e){return tu(e)?["installed","enabled","active","authenticated","healthy","allowed","ready"].every(t=>typeof e[t]=="boolean"):!1}function iy(e){return ru(e).split(/\s+/u).map(t=>t.trim()).filter(t=>t.length>=2)}function ru(e){return e.toLowerCase().normalize("NFKD").replace(/[\u0300-\u036f]/gu,"")}function eu(e){return{installed:e.installed,enabled:e.enabled,active:e.active,authenticated:e.authenticated,healthy:e.healthy,allowed:e.allowed,ready:e.ready}}function ly(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 cy(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 dy(e){return`${e.replace(/[^A-Za-z0-9._-]+/gu,"_").replace(/^_+|_+$/gu,"")||"capability"}-${E(e).slice(7,19)}`}function ou(e){return Math.min(Math.max(e??50,1),100)}function uy(e){return Math.min(Math.max(e??5,1),8)}async function Qr(e){let t=await v(e.home),r=N(e.summary).value,o=new Date,n=e.ttlSeconds?new Date(o.getTime()+py(e.ttlSeconds)*1e3).toISOString():null,a=H(e.source??{host:"cli",session_id:"local"}),s=_(t.database),i;try{i=s.createOpenCommitmentIfMissing({id:T("commitment"),project_id:e.project,summary:r,status:"open",due_at:e.dueAt??null,ttl_expires_at:n,source:a,created_at:o.toISOString(),updated_at:o.toISOString()},o.toISOString())}finally{s.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 Zr(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await A(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 eo(e,t){return nu(e,t,"completed","commitment_completed")}async function _s(e,t){return nu(e,t,"dismissed","commitment_dismissed")}async function nu(e,t,r,o){let n=await v(e),a=_(n.database),s;try{s=a.updateCommitmentStatus(t,r,new Date().toISOString())}finally{a.close()}if(!s)throw new Error(`Commitment not found: ${t}`);return await h({home:n.home,type:o,details:{id:s.id,project:s.project_id,status:s.status}}),s}function py(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e),1),365*24*60*60):1440*60}import{createHash as my}from"node:crypto";import{existsSync as xn,mkdirSync as gy,realpathSync as fy,readFileSync as su,writeFileSync as hy}from"node:fs";import{spawnSync as iu}from"node:child_process";import he from"node:path";function L(e,t){return K(e,t).id}function K(e,t){let r=ks(e),o=vy(r),n=o?ky(o):null,a=n?au(n):o??r,s=wy(a),i=n?"git-remote":o?"git-root":"path",l=_y(s,a),c=yy(r),d=c?lu(c):null,p=ws(t),g=[d,l,n?au(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 lu(e){if(!xn(e))return null;let t=su(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?by(o):null}function bs(e,t){let r=he.join(e,".nativesoul","project");return gy(he.dirname(r),{recursive:!0,mode:448}),hy(r,`${t}
869
+ `,{encoding:"utf8",mode:384}),r}async function to(e){let t=K(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=he.join(r,".nativesoul","project");return xn(o)?{written:!1,marker_path:o,base_id:t.base_id}:(bs(r,t.base_id),{written:!0,marker_path:o,base_id:t.base_id})}async function vs(e){let t=he.resolve(e.cwd),r=K(t,e.home),o=r.git_root??r.cwd,n=he.join(o,".nativesoul","project");return e.apply&&(bs(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 yy(e){let t=ks(e);for(;;){let r=he.join(t,".nativesoul","project");if(xn(r))return r;let o=he.dirname(t);if(o===t)return null;t=o}}function _y(e,t){let r=my("sha256").update(t).digest("hex").slice(0,10);return`${Sy(e)}-${r}`}function by(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"")||"workspace"}function ks(e){try{return fy(he.resolve(e))}catch{return he.resolve(e)}}function vy(e){let t=iu("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?ks(r):null}function ky(e){let t=iu("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 au(e){return e.trim().replace(/^git@([^:]+):/,"https://$1/").replace(/^ssh:\/\/git@([^/]+)\//,"https://$1/").replace(/^https?:\/\/([^/]+)\//,"https://$1/").replace(/\.git$/u,"").toLowerCase()}function wy(e){let t=e.replace(/\/+$/u,"");return he.basename(t)||"workspace"}function Sy(e){return e.toLowerCase().replace(/[^a-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"")||"workspace"}function ws(e){if(!e)return{};let t=he.join(he.resolve(e),"config.yaml");if(!xn(t))return{};let r=su(t,"utf8"),o={},n=!1,a=!1,s="";for(let i of r.split(/\r?\n/u)){if(/^\S/u.test(i)){n=/^project:\s*$/u.test(i),a=!1;continue}let l=i.match(/^([ \t]+)aliases:\s*(?:\{\}\s*)?$/u);if(n&&l?.[1]){a=!0,s=l[1];continue}if(a){if(i.trim().length===0||i.trim().startsWith("#"))continue;let c=i.match(/^([ \t]+)(?:"([^"]+)"|'([^']+)'|([^:]+)):\s*(?:"([^"]+)"|'([^']+)'|(.+))\s*$/u);(c?.[1]??"").length<=s.length&&(a=!1);let p=c?.[2]??c?.[3]??c?.[4],g=c?.[5]??c?.[6]??c?.[7];a&&p&&g?o[p.trim()]=g.trim():/^[ \t]+\S/u.test(i)&&i.trim().length>0&&(a=!1)}}return o}import{readFile as Ry,writeFile as Ay}from"node:fs/promises";import Ey from"node:path";async function Ss(e){let t=f(e.home),r=Ey.join(t.home,"config.yaml"),o=await A(r)?await Ry(r,"utf8"):`version: 1
870
870
  `,n=o.includes(`\r
871
871
  `)?`\r
872
872
  `:`
873
- `,s={...uu(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=Py(o,s,n),c=l!==o;return e.apply&&c&&(me(r,{root:t.home}),await Ay(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 uu(e){let t=pu(e),r={},o=[],n=-1,a=-1,s=-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]){a=c,i=p[1],l=`${i}${i.includes(" ")?" ":" "}`;break}}if(a>=0){s=a+1;for(let c=a+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),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 R=y.trim();r[R]=k.trim(),o.includes(R)||o.push(R)}s=c+1}}return{aliases:r,aliasOrder:o,projectStart:n,aliasesStart:a,aliasesEnd:s,projectIndent:i,aliasIndent:l}}function Py(e,t,r){let o=pu(e),n=uu(e),s=[...n.aliasOrder.filter(l=>Object.prototype.hasOwnProperty.call(t,l)),...Object.keys(t).filter(l=>!n.aliasOrder.includes(l))].map(l=>`${n.aliasIndent}${du(l)}: ${du(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 cu([...l,...c,...s,...d],r,e.endsWith(`
873
+ `,s={...uu(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=Py(o,s,n),c=l!==o;return e.apply&&c&&(pe(r,{root:t.home}),await Ay(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 uu(e){let t=pu(e),r={},o=[],n=-1,a=-1,s=-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]){a=c,i=p[1],l=`${i}${i.includes(" ")?" ":" "}`;break}}if(a>=0){s=a+1;for(let c=a+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),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)}s=c+1}}return{aliases:r,aliasOrder:o,projectStart:n,aliasesStart:a,aliasesEnd:s,projectIndent:i,aliasIndent:l}}function Py(e,t,r){let o=pu(e),n=uu(e),s=[...n.aliasOrder.filter(l=>Object.prototype.hasOwnProperty.call(t,l)),...Object.keys(t).filter(l=>!n.aliasOrder.includes(l))].map(l=>`${n.aliasIndent}${du(l)}: ${du(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 cu([...l,...c,...s,...d],r,e.endsWith(`
874
874
  `))}if(n.projectStart>=0){let l=n.projectStart+1,c=o.slice(0,l),d=o.slice(l);return cu([...c,`${n.projectIndent}aliases:`,...s,...d],r,e.endsWith(`
875
875
  `))}return`${e.length>0&&!e.endsWith(`
876
876
  `)?`${e}${r}`:e}project:${r}${n.projectIndent}aliases:${r}${s.join(r)}${s.length?r:""}`}function pu(e){return e.replace(/\r\n/gu,`
877
877
  `).split(`
878
- `).filter((t,r,o)=>r<o.length-1||t.length>0)}function cu(e,t,r){let o=e.join(t);return r||e.length>0?`${o}${t}`:o}function du(e){return/^[A-Za-z0-9._/-]+$/u.test(e)?e:JSON.stringify(e)}import{writeFile as qy}from"node:fs/promises";import Is from"node:path";import{mkdir as _u,rename as Ny,writeFile as bu}from"node:fs/promises";import _e from"node:path";var Ss={codex:{nativeSchedule:"supported",scheduleSurfaceScoped:!1,pluginApply:"none"},claude:{nativeSchedule:"supported",scheduleSurfaceScoped:!0,pluginApply:"claude-settings-hooks"},grok:{nativeSchedule:"none",scheduleSurfaceScoped:!1,pluginApply:"grok-host-wiring"},antigravity:{nativeSchedule:"supported",scheduleSurfaceScoped:!1,pluginApply:"none"},gemini:{nativeSchedule:"none",scheduleSurfaceScoped:!1,pluginApply:"none"}};function ro(e){return Ss[e].nativeSchedule==="supported"}function mu(e){return Ss[e].scheduleSurfaceScoped}function gu(e){return Ss[e].pluginApply}import{mkdir as xy,readFile as jy,writeFile as fu}from"node:fs/promises";import As from"node:path";var jn={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 hu(e,t){let r=await it(e),o=await S(cr(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:jn,apply_defaults:{dry_run:!0,user_confirmed:!1,reset:!1}}}async function Es(e){let t=await v(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,n=e.reset===!0,a=await it(t.home);if(a&&!n)return{dry_run:r,applied:!1,user_confirmed:o,reset:n,action:"preserved",before:a,after:a,diff:[],warnings:["ACTIVATION_PROFILE_PRESERVED: use reset=true to replace existing activation choices"]};let s=Iy(e.profile,e.options),i=Cy(a,s);if(!r&&!o)return{dry_run:r,applied:!1,user_confirmed:o,reset:n,action:"rejected",before:a,after:s,diff:i,warnings:["ACTIVATION_REQUIRES_USER_CONFIRMED"]};let l=a?i.length===0?"noop":"update":"create";return r||(await xy(As.join(t.home,"state"),{recursive:!0,mode:448}),await fu(yu(t.home),`${JSON.stringify(s,null,2)}
879
- `,{encoding:"utf8",mode:384}),await fu(cr(t.home),`${new Date().toISOString()}
880
- `,{encoding:"utf8",mode:384}),await h({home:t.home,type:"activation.profile.applied",details:{profile:s.profile,reset:n,diff:i.map(c=>c.field)}})),{dry_run:r,applied:!r,user_confirmed:o,reset:n,action:l,before:a,after:s,diff:i,warnings:[]}}function yu(e){return As.join(e,"state","activation-profile.json")}function cr(e){return As.join(e,"state","activation.complete")}async function it(e){try{let t=JSON.parse(await jy(yu(e),"utf8"));return Oy(t)?t:null}catch{return null}}function Iy(e,t){return{...jn,...Ty(t),profile:e,updated_at:new Date().toISOString()}}function Ty(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 Cy(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,a=t[o];return JSON.stringify(n)===JSON.stringify(a)?[]:[{field:o,before:n,after:a}]})}function Oy(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"}var My=["entity","soul","human","collaboration","continuity"],Ly=["codex","claude","grok","antigravity","gemini"],Dy=["SOUL.md","POLICY.md"],vu=new Set(["IDENTITY.md","SOUL.md","USER.md","AGENTS.md"]),dr=64*1024,ku="<!-- nativesoul:start v1 -->",Ps="<!-- nativesoul:end -->",Hy={entity:{purpose:"Name and shape the shared NativeSoul identity before it starts acting across hosts.",example_questions:["What should I be called when I show up in Codex, Claude, Grok, Antigravity, or Gemini?","What kind of entity am I for you: continuity layer, familiar, operator, or something else?","What mission should every host recognize as mine?"],feeds:[{file:"IDENTITY.md",fields:["Name","Creature","Role","Vibe","Emoji","Mission"]}]},soul:{purpose:"Capture voice, stance, boundaries, and continuity rules that should feel consistent across hosts.",example_questions:["What truths should guide how I help you when no one is looking?","What boundaries should I never cross without explicit confirmation?","What vibe should I carry when the work gets ambiguous or high-stakes?"],feeds:[{file:"SOUL.md",sections:["Core truths","Boundaries","Vibe","Continuity"]}]},human:{purpose:"Learn the user's basic identity, working context, and engineering preferences without turning it into a dossier.",example_questions:["What should I call you, and what timezone and languages should I assume by default?","What engineering habits should I respect: tests, commits, docs, architecture, or review style?","What annoyances or collaboration preferences should I remember early?"],feeds:[{file:"USER.md",fields:["Name","What to call them","Timezone","Languages","Notes","Engineering preferences"]}]},collaboration:{purpose:"Define how the host AI should work with the user during sessions, especially around autonomy and safety.",example_questions:["When should I act autonomously, and when should I pause for your approval?","How should I report progress when a task takes more than a few minutes?","Which local tools or project conventions should every host consult before acting?"],feeds:[{file:"AGENTS.md",sections:["Session start","Execute -> verify -> report","Safety"]}]},continuity:{purpose:"Set the memory and handoff habits that keep different host sessions aligned over time.",example_questions:["What should become durable memory, and what should stay as temporary working notes?","How should I handle cross-host handoffs between Codex, Claude, Grok, Antigravity, and Gemini?","What recurring checks or follow-ups would be useful after onboarding?"],feeds:[{file:"AGENTS.md",sections:["Memory layers","Host continuity"]}]}},$y={"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:dr},"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:dr},"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:dr},"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:dr},"POLICY.md":{writable:!1,requires_user_confirmed:!1,field_format:"Use policy propose-change after onboarding",merge_strategy:"replace",max_bytes:0}};async function oo(e){let t=await v(e),o=(await de(t.home,"BOOTSTRAP.md")).trim().length>0,n=await hu(t.home,o);return{ritual_pending:o,files_present:{soul:await S(_e.join(t.home,"SOUL.md")),identity:await S(_e.join(t.home,"IDENTITY.md")),user:await S(_e.join(t.home,"USER.md")),agents:await S(_e.join(t.home,"AGENTS.md")),bootstrap:await S(_e.join(t.home,"BOOTSTRAP.md"))},protected_targets:[...Dy],writable_files:[...vu],interview_themes:[...My],interview_guidance:Hy,instruction_doc:"llm-install.txt",apply_defaults:{dry_run:!0,user_confirmed:!1},file_generation_rules:$y,activation:n,offers:Fy(n)}}function Fy(e){return{heartbeat:{purpose:"Offer a native-host scheduled heartbeat for lightweight recurring continuity checks after identity is confirmed.",command:"nativesoul activate heartbeat plan --all-hosts --json",apply_command:"nativesoul activate heartbeat apply --apply --user-confirmed --json",approval_gate:"Plan first, explain the selected native scheduler, then apply only after explicit user consent.",reason:e.quickstart_defaults.heartbeat_enabled?"QuickStart defaults include heartbeat, but scheduler setup remains approval-gated.":"Heartbeat is optional and disabled by the selected activation defaults.",activation_phase:e.phase,default_cadence:e.quickstart_defaults.heartbeat_cadence,hosts:Ly.map(t=>({host:t,status:ro(t)?"available":"blocked_by_host",reason:ro(t)?"Native scheduler support can be planned and verified before applying.":`${t} has no native scheduler; do not install hidden cron or claim automatic heartbeat support.`}))},scan:{purpose:"Offer a local development-environment scan after onboarding so the user can opt into setup diagnostics.",command:"nativesoul scan",status:"available",reason:"The scan command is available as an opt-in, local, read-only dry-run by default."}}}async function no(e){let t=await v(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,n=[],a=[];for(let[s,i]of Object.entries(e.files)){let l=s.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(!vu.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")>dr){n.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:`FILE_TOO_LARGE: ${l} exceeds ${dr} bytes`});continue}let p=_e.join(t.home,l),g=await de(t.home,l),y=l==="AGENTS.md"?Uy(g,d):d,k=g.length>0?A(g):null,R=A(y);if(k===R){n.push({file:l,action:"noop",before_hash:k,after_hash:R});continue}let U=g.length===0?"create":"update";n.push({file:l,action:U,before_hash:k,after_hash:R}),r||await bu(p,y,{encoding:"utf8",mode:384})}return!r&&e.config_patch?.hosts?.length&&a.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(s=>({file:s.file,action:s.action}))}}),{dry_run:r,applied:!r,user_confirmed:o,files:n,warnings:a}}async function ao(e){let t=f(e?.home),r=_e.join(t.home,"BOOTSTRAP.md");if(!await S(r))return{already_complete:!0,archived_bootstrap:!1,archive_path:null};let o=e?.archive!==!1,n=null;if(o){let s=_e.join(t.home,"memory","archive");await _u(s,{recursive:!0,mode:448});let i=new Date().toISOString().replace(/[:.]/gu,"-");n=_e.join(s,`bootstrap-${i}.md`),await Ny(r,n)}else{let{rm:s}=await import("node:fs/promises");await s(r,{force:!0})}let a=_e.join(t.home,"state","onboarding.complete");return await _u(_e.join(t.home,"state"),{recursive:!0,mode:448}),await bu(a,`${new Date().toISOString()}
881
- `,{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 In(e){return _e.join(e,"state","onboarding.complete")}function Uy(e,t){let r=t.trim();if(!e.trim())return`${r}
878
+ `).filter((t,r,o)=>r<o.length-1||t.length>0)}function cu(e,t,r){let o=e.join(t);return r||e.length>0?`${o}${t}`:o}function du(e){return/^[A-Za-z0-9._/-]+$/u.test(e)?e:JSON.stringify(e)}import{writeFile as qy}from"node:fs/promises";import Is from"node:path";import{mkdir as _u,rename as Ny,writeFile as bu}from"node:fs/promises";import ye from"node:path";var Rs={codex:{nativeSchedule:"supported",scheduleSurfaceScoped:!1,pluginApply:"none"},claude:{nativeSchedule:"supported",scheduleSurfaceScoped:!0,pluginApply:"claude-settings-hooks"},grok:{nativeSchedule:"none",scheduleSurfaceScoped:!1,pluginApply:"grok-host-wiring"},antigravity:{nativeSchedule:"supported",scheduleSurfaceScoped:!1,pluginApply:"none"},gemini:{nativeSchedule:"none",scheduleSurfaceScoped:!1,pluginApply:"none"}};function ro(e){return Rs[e].nativeSchedule==="supported"}function mu(e){return Rs[e].scheduleSurfaceScoped}function gu(e){return Rs[e].pluginApply}import{mkdir as xy,readFile as jy,writeFile as fu}from"node:fs/promises";import As from"node:path";var jn={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 hu(e,t){let r=await it(e),o=await A(dr(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:jn,apply_defaults:{dry_run:!0,user_confirmed:!1,reset:!1}}}async function Es(e){let t=await v(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,n=e.reset===!0,a=await it(t.home);if(a&&!n)return{dry_run:r,applied:!1,user_confirmed:o,reset:n,action:"preserved",before:a,after:a,diff:[],warnings:["ACTIVATION_PROFILE_PRESERVED: use reset=true to replace existing activation choices"]};let s=Iy(e.profile,e.options),i=Cy(a,s);if(!r&&!o)return{dry_run:r,applied:!1,user_confirmed:o,reset:n,action:"rejected",before:a,after:s,diff:i,warnings:["ACTIVATION_REQUIRES_USER_CONFIRMED"]};let l=a?i.length===0?"noop":"update":"create";return r||(await xy(As.join(t.home,"state"),{recursive:!0,mode:448}),await fu(yu(t.home),`${JSON.stringify(s,null,2)}
879
+ `,{encoding:"utf8",mode:384}),await fu(dr(t.home),`${new Date().toISOString()}
880
+ `,{encoding:"utf8",mode:384}),await h({home:t.home,type:"activation.profile.applied",details:{profile:s.profile,reset:n,diff:i.map(c=>c.field)}})),{dry_run:r,applied:!r,user_confirmed:o,reset:n,action:l,before:a,after:s,diff:i,warnings:[]}}function yu(e){return As.join(e,"state","activation-profile.json")}function dr(e){return As.join(e,"state","activation.complete")}async function it(e){try{let t=JSON.parse(await jy(yu(e),"utf8"));return Oy(t)?t:null}catch{return null}}function Iy(e,t){return{...jn,...Ty(t),profile:e,updated_at:new Date().toISOString()}}function Ty(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 Cy(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,a=t[o];return JSON.stringify(n)===JSON.stringify(a)?[]:[{field:o,before:n,after:a}]})}function Oy(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"}var My=["entity","soul","human","collaboration","continuity"],Ly=["codex","claude","grok","antigravity","gemini"],Dy=["SOUL.md","POLICY.md"],vu=new Set(["IDENTITY.md","SOUL.md","USER.md","AGENTS.md"]),ur=64*1024,ku="<!-- nativesoul:start v1 -->",Ps="<!-- nativesoul:end -->",Hy={entity:{purpose:"Name and shape the shared NativeSoul identity before it starts acting across hosts.",example_questions:["What should I be called when I show up in Codex, Claude, Grok, Antigravity, or Gemini?","What kind of entity am I for you: continuity layer, familiar, operator, or something else?","What mission should every host recognize as mine?"],feeds:[{file:"IDENTITY.md",fields:["Name","Creature","Role","Vibe","Emoji","Mission"]}]},soul:{purpose:"Capture voice, stance, boundaries, and continuity rules that should feel consistent across hosts.",example_questions:["What truths should guide how I help you when no one is looking?","What boundaries should I never cross without explicit confirmation?","What vibe should I carry when the work gets ambiguous or high-stakes?"],feeds:[{file:"SOUL.md",sections:["Core truths","Boundaries","Vibe","Continuity"]}]},human:{purpose:"Learn the user's basic identity, working context, and engineering preferences without turning it into a dossier.",example_questions:["What should I call you, and what timezone and languages should I assume by default?","What engineering habits should I respect: tests, commits, docs, architecture, or review style?","What annoyances or collaboration preferences should I remember early?"],feeds:[{file:"USER.md",fields:["Name","What to call them","Timezone","Languages","Notes","Engineering preferences"]}]},collaboration:{purpose:"Define how the host AI should work with the user during sessions, especially around autonomy and safety.",example_questions:["When should I act autonomously, and when should I pause for your approval?","How should I report progress when a task takes more than a few minutes?","Which local tools or project conventions should every host consult before acting?"],feeds:[{file:"AGENTS.md",sections:["Session start","Execute -> verify -> report","Safety"]}]},continuity:{purpose:"Set the memory and handoff habits that keep different host sessions aligned over time.",example_questions:["What should become durable memory, and what should stay as temporary working notes?","How should I handle cross-host handoffs between Codex, Claude, Grok, Antigravity, and Gemini?","What recurring checks or follow-ups would be useful after onboarding?"],feeds:[{file:"AGENTS.md",sections:["Memory layers","Host continuity"]}]}},$y={"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:ur},"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:ur},"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:ur},"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:ur},"POLICY.md":{writable:!1,requires_user_confirmed:!1,field_format:"Use policy propose-change after onboarding",merge_strategy:"replace",max_bytes:0}};async function oo(e){let t=await v(e),o=(await ce(t.home,"BOOTSTRAP.md")).trim().length>0,n=await hu(t.home,o);return{ritual_pending:o,files_present:{soul:await A(ye.join(t.home,"SOUL.md")),identity:await A(ye.join(t.home,"IDENTITY.md")),user:await A(ye.join(t.home,"USER.md")),agents:await A(ye.join(t.home,"AGENTS.md")),bootstrap:await A(ye.join(t.home,"BOOTSTRAP.md"))},protected_targets:[...Dy],writable_files:[...vu],interview_themes:[...My],interview_guidance:Hy,instruction_doc:"llm-install.txt",apply_defaults:{dry_run:!0,user_confirmed:!1},file_generation_rules:$y,activation:n,offers:Fy(n)}}function Fy(e){return{heartbeat:{purpose:"Offer a native-host scheduled heartbeat for lightweight recurring continuity checks after identity is confirmed.",command:"nativesoul activate heartbeat plan --all-hosts --json",apply_command:"nativesoul activate heartbeat apply --apply --user-confirmed --json",approval_gate:"Plan first, explain the selected native scheduler, then apply only after explicit user consent.",reason:e.quickstart_defaults.heartbeat_enabled?"QuickStart defaults include heartbeat, but scheduler setup remains approval-gated.":"Heartbeat is optional and disabled by the selected activation defaults.",activation_phase:e.phase,default_cadence:e.quickstart_defaults.heartbeat_cadence,hosts:Ly.map(t=>({host:t,status:ro(t)?"available":"blocked_by_host",reason:ro(t)?"Native scheduler support can be planned and verified before applying.":`${t} has no native scheduler; do not install hidden cron or claim automatic heartbeat support.`}))},scan:{purpose:"Offer a local development-environment scan after onboarding so the user can opt into setup diagnostics.",command:"nativesoul scan",status:"available",reason:"The scan command is available as an opt-in, local, read-only dry-run by default."}}}async function no(e){let t=await v(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,n=[],a=[];for(let[s,i]of Object.entries(e.files)){let l=s.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(!vu.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")>ur){n.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:`FILE_TOO_LARGE: ${l} exceeds ${ur} bytes`});continue}let p=ye.join(t.home,l),g=await ce(t.home,l),y=l==="AGENTS.md"?Uy(g,d):d,k=g.length>0?E(g):null,S=E(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 bu(p,y,{encoding:"utf8",mode:384})}return!r&&e.config_patch?.hosts?.length&&a.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(s=>({file:s.file,action:s.action}))}}),{dry_run:r,applied:!r,user_confirmed:o,files:n,warnings:a}}async function ao(e){let t=f(e?.home),r=ye.join(t.home,"BOOTSTRAP.md");if(!await A(r))return{already_complete:!0,archived_bootstrap:!1,archive_path:null};let o=e?.archive!==!1,n=null;if(o){let s=ye.join(t.home,"memory","archive");await _u(s,{recursive:!0,mode:448});let i=new Date().toISOString().replace(/[:.]/gu,"-");n=ye.join(s,`bootstrap-${i}.md`),await Ny(r,n)}else{let{rm:s}=await import("node:fs/promises");await s(r,{force:!0})}let a=ye.join(t.home,"state","onboarding.complete");return await _u(ye.join(t.home,"state"),{recursive:!0,mode:448}),await bu(a,`${new Date().toISOString()}
881
+ `,{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 In(e){return ye.join(e,"state","onboarding.complete")}function Uy(e,t){let r=t.trim();if(!e.trim())return`${r}
882
882
  `;if(e.includes(r))return e;let o=wu(e);if(o){let a=o.after.trimEnd(),s=a.length>0?`${a}
883
883
 
884
884
  ${r}
@@ -889,50 +889,50 @@ ${r}
889
889
  ## Onboarding Update
890
890
 
891
891
  ${r}
892
- `}function ur(e,t){let r=`${ku}
892
+ `}function pr(e,t){let r=`${ku}
893
893
  ${t.trim()}
894
894
  ${Ps}`;if(!e.trim())return`${r}
895
895
  `;let o=wu(e);return o?`${o.before}${r}${o.after}`:`${e.trimEnd()}
896
896
 
897
897
  ${r}
898
- `}function wu(e){let t=e.indexOf(ku),r=e.indexOf(Ps);if(t<0||r<0||r<t)return null;let o=r+Ps.length;return{before:e.slice(0,t),block:e.slice(t,o),after:e.slice(o)}}var By={minLength:1,removeStopwords:!1,normalizeDiacritics:!1};function Tn(e,t={}){let r={...By,...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||!Vy.has(n))??[]))}function so(e,t={}){return new Set(Tn(e,t))}function xs(e,t){let r=Tn(e);if(r.length===0)return 0;let o=so(t),n=r.filter(a=>o.has(a)).length;return Number((n/r.length).toFixed(6))}function Ru(e,t,r={}){let o=so(e,r),n=so(t,r);if(o.size===0||n.size===0)return 0;let a=[...o].filter(i=>n.has(i)).length,s=new Set([...o,...n]).size;return Number((a/s).toFixed(6))}function Su(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 Vy=new Set(["the","and","for","with","this","that","uma","com","para","por","que","deve","esta","este","essa","isso"]);var lt=1,ct="local-hash",dt="local-hash-bow-v1";async function js(e={}){let t=await v(e.home),r=Math.min(Math.max(e.limit??1e3,1),1e4),o=_(t.database),n,a=[],s=0,i=0;try{n=o.listSemanticIndexableMemories({limit:r});let l=new Date().toISOString();for(let c of n){let d=Wy(c),p=o.getSemanticIndex(c.id);if(p&&p.content_hash===d.contentHash&&p.provider_id===ct&&p.model_id===dt&&p.schema_version===lt){s+=1;continue}d.redacted&&(i+=1),a.push({memory_id:c.id,scope_project:c.scope.project,source:c.source,schema_version:lt,provider_id:ct,model_id:dt,content_hash:d.contentHash,embedding:Pu(d.text),indexed_text:d.text,indexed_at:l})}a.length>0&&o.upsertSemanticIndex(a)}finally{o.close()}return await h({home:t.home,type:"semantic_index_built",details:{provider_id:ct,model_id:dt,schema_version:lt,indexable_count:n.length,indexed_count:a.length,skipped_unchanged:s,redacted_count:i}}),{provider_id:ct,model_id:dt,schema_version:lt,indexable_count:n.length,indexed_count:a.length,skipped_unchanged:s,redacted_count:i}}function Eu(e){let t=_(e,{readOnly:!0});try{let r=t.semanticIndexStats({providerId:ct,modelId:dt,schemaVersion:lt});return{provider_id:ct,model_id:dt,schema_version:lt,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 io(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:ct,modelId:dt,schemaVersion:lt});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:Au(o.length>0?o:t.recentMemories(e.project,r),e.query)};let a=t.listCurrentSemanticIndexesForProject({project:e.project,providerId:ct,modelId:dt,schemaVersion:lt,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,xs(e.query,`${p.summary}
899
- ${p.content}`)])),c=Pu(e.query),d=a.map(p=>{let g=i.get(p.memory_id);if(!g)return null;let y=l.get(g.id)??0,k=Su(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:Au(o,e.query)}}finally{t.close()}}function Wy(e){let t=N(`${e.summary}
898
+ `}function wu(e){let t=e.indexOf(ku),r=e.indexOf(Ps);if(t<0||r<0||r<t)return null;let o=r+Ps.length;return{before:e.slice(0,t),block:e.slice(t,o),after:e.slice(o)}}var By={minLength:1,removeStopwords:!1,normalizeDiacritics:!1};function Tn(e,t={}){let r={...By,...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||!Vy.has(n))??[]))}function so(e,t={}){return new Set(Tn(e,t))}function xs(e,t){let r=Tn(e);if(r.length===0)return 0;let o=so(t),n=r.filter(a=>o.has(a)).length;return Number((n/r.length).toFixed(6))}function Su(e,t,r={}){let o=so(e,r),n=so(t,r);if(o.size===0||n.size===0)return 0;let a=[...o].filter(i=>n.has(i)).length,s=new Set([...o,...n]).size;return Number((a/s).toFixed(6))}function Ru(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 Vy=new Set(["the","and","for","with","this","that","uma","com","para","por","que","deve","esta","este","essa","isso"]);var lt=1,ct="local-hash",dt="local-hash-bow-v1";async function js(e={}){let t=await v(e.home),r=Math.min(Math.max(e.limit??1e3,1),1e4),o=_(t.database),n,a=[],s=0,i=0;try{n=o.listSemanticIndexableMemories({limit:r});let l=new Date().toISOString();for(let c of n){let d=Wy(c),p=o.getSemanticIndex(c.id);if(p&&p.content_hash===d.contentHash&&p.provider_id===ct&&p.model_id===dt&&p.schema_version===lt){s+=1;continue}d.redacted&&(i+=1),a.push({memory_id:c.id,scope_project:c.scope.project,source:c.source,schema_version:lt,provider_id:ct,model_id:dt,content_hash:d.contentHash,embedding:Pu(d.text),indexed_text:d.text,indexed_at:l})}a.length>0&&o.upsertSemanticIndex(a)}finally{o.close()}return await h({home:t.home,type:"semantic_index_built",details:{provider_id:ct,model_id:dt,schema_version:lt,indexable_count:n.length,indexed_count:a.length,skipped_unchanged:s,redacted_count:i}}),{provider_id:ct,model_id:dt,schema_version:lt,indexable_count:n.length,indexed_count:a.length,skipped_unchanged:s,redacted_count:i}}function Eu(e){let t=_(e,{readOnly:!0});try{let r=t.semanticIndexStats({providerId:ct,modelId:dt,schemaVersion:lt});return{provider_id:ct,model_id:dt,schema_version:lt,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 io(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:ct,modelId:dt,schemaVersion:lt});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:Au(o.length>0?o:t.recentMemories(e.project,r),e.query)};let a=t.listCurrentSemanticIndexesForProject({project:e.project,providerId:ct,modelId:dt,schemaVersion:lt,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,xs(e.query,`${p.summary}
899
+ ${p.content}`)])),c=Pu(e.query),d=a.map(p=>{let g=i.get(p.memory_id);if(!g)return null;let y=l.get(g.id)??0,k=Ru(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:Au(o,e.query)}}finally{t.close()}}function Wy(e){let t=N(`${e.summary}
900
900
 
901
901
  ${e.content}`);return{text:t.value,contentHash:e.hash,redacted:t.redacted}}function Pu(e){let r=Array.from({length:32},()=>0);for(let n of Tn(e)){let a=Jy(n),s=a%32,i=a%2===0?1:-1;r[s]=(r[s]??0)+i}let o=Math.hypot(...r)||1;return r.map(n=>Number((n/o).toFixed(6)))}function Au(e,t){return e.map((r,o)=>({...r,recall:{mode:"fts",fts_score:xs(t,`${r.summary}
902
- ${r.content}`),semantic_score:0,final_rank:o+1,reason:"fts_fallback"}}))}function Jy(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 Ke(e,t=160){let r=e.replace(/\s+/g," ").trim();return r.length<=t?r:`${r.slice(0,t-3)}...`}function lo(e){return Math.ceil(e.length/4)}function Cn(e,t){return e.length<=t?e:`${e.slice(0,Math.max(t-3,0))}...`}var Ct=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}},Gy=new Map([["candidate",new Set(["active","rejected"])],["active",new Set(["forgotten","expired"])],["superseded",new Set],["rejected",new Set],["forgotten",new Set],["expired",new Set]]),Ky=1e3;async function Ts(e,t){let r=await v(e),o=await Cu(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 te(e,t){let r=await v(e),o=await Cu(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 Cs(e){let t=await v(e.home),r=Is.resolve(e.cwd);await to({cwd:r,home:t.home});let o=L(r,t.home),n=e.event?.trim()||"session-end",a=zy(e.text,e.payload),s=[`Session memory candidate from ${e.host} ${n} hook.`,"",`Project: ${o}`,`CWD: ${r}`,"","Summary:",a.text].join(`
903
- `),i=await te(t.home,{project:o,content:s,confidence:a.source==="stub"?.2:.45,authority:"hook_observed",source:{kind:"session_end_hook",host:e.host,event:n,cwd:r,summary_source:a.source}});return{proposed:!0,host:e.host,event:n,cwd:r,project:o,memory:i,summary_source:a.source}}function zy(e,t){let r=e?.trim();if(r)return{text:xu(r),source:"text"};let o=Xy(t);return o?{text:xu(o),source:"payload"}:{text:"No host session summary was supplied. Review this candidate against the recent session before promotion.",source:"stub"}}function Xy(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 xu(e){return e.length<=8e3?e:`${e.slice(0,7997)}...`}async function Os(e){let t=await v(e.home),r=Is.resolve(e.cwd),o=L(r,t.home),n=await Yy(t.home),a=Iu(e.prompt,n),s=Math.min(Math.max(e.limit??3,1),3),i=[];if(a.triggered){let l=io({database:t.database,query:a.query,project:o,limit:s});i=l.memories,await h({home:t.home,type:"memory_recalled",details:{host:e.host,project:o,reason:a.reason,query:a.query,count:i.length,recall_mode:l.mode,recall_reason:l.reason}})}return{host:e.host,cwd:r,project:o,prompt:e.prompt,decision:a,memories:i,context:Qy(i,a)}}function Iu(e,t=Tu()){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(s=>o===s||o.startsWith(`${s} `));if(n)return{triggered:!1,reason:`denylist:${n}`,denied:!0,auto_trigger:!0,query:r};let a=t.keywords.find(s=>o.includes(s));return a?{triggered:!0,reason:`keyword:${a}`,denied:!1,auto_trigger:!0,query:r}:{triggered:!1,reason:"no_trigger",denied:!1,auto_trigger:!0,query:r}}function Tu(){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 Yy(e){let t=Tu(),r=await de(e,"config.yaml"),o=r.match(/^\s*auto_trigger:\s*(true|false)\s*$/imu);o?.[1]&&(t.autoTrigger=o[1].toLowerCase()==="true");let n=ju(r,"keywords");n.length>0&&(t.keywords=n.map(s=>s.toLowerCase()));let a=ju(r,"denylist");return a.length>0&&(t.denylist=a.map(s=>s.toLowerCase())),t}function ju(e,t){let r=e.split(/\r?\n/u),o=[],n=!1;for(let a of r){if(new RegExp(`^\\s*${t}:\\s*$`,"u").test(a)){n=!0;continue}if(!n)continue;let s=a.match(/^\s*-\s*["']?(.+?)["']?\s*$/u)?.[1];if(s){o.push(s.trim());continue}if(/^\s*\S/u.test(a))break}return o}function Qy(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(`
904
- `).slice(0,1800)}async function Ot(e,t){return On(e,t,"active","memory_promoted")}async function Nt(e,t){return On(e,t,"rejected","memory_rejected")}async function Mt(e,t){return On(e,t,"forgotten","memory_forgotten")}async function co(e,t){return On(e,t,"expired","memory_expired")}async function Lt(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}}),await Ns(t.home),o}async function Ns(e){let t=await v(e),r=Zy(t.database),o=await de(t.home,"MEMORY.md"),n=ur(o,e_(r));n!==o&&await qy(Is.join(t.home,"MEMORY.md"),n,{encoding:"utf8",mode:384})}async function Cu(e,t,r){let o=N(t.content),n=new Date().toISOString(),a=Ke(o.value),s={id:T("mem"),type:t.type??"note",scope:{user:"default",project:t.project},content:o.value,summary:a,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:Re({type:t.type??"note",project:t.project,content:o.value,status:r,created_at:n})},i=_(e);try{i.insertMemory(s)}finally{i.close()}return s}async function On(e,t,r,o){let n=await v(e),a=_(n.database),s,i;try{if(s=a.getMemory(t),s&&!Nn(s.status,r))throw new Ct({id:t,from:s.status,to:r});i=s?a.updateMemoryStatus(t,r):null}catch(l){throw l instanceof Ct&&await t_({home:n.home,id:l.id,from:l.from,to:l.to}),l}finally{a.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}}),(r==="active"||s?.status==="active")&&await Ns(n.home),i}function Zy(e){let t=_(e);try{return t.listMemories({status:"active",limit:Ky})}finally{t.close()}}function e_(e){let t=["## Active curated memories","","_Managed by NativeSoul. Regenerated by `memory promote` and `memory export`; SQLite remains the source of truth._",""];if(e.length===0)return t.push("_No active memories._"),t.join(`
902
+ ${r.content}`),semantic_score:0,final_rank:o+1,reason:"fts_fallback"}}))}function Jy(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 Ge(e,t=160){let r=e.replace(/\s+/g," ").trim();return r.length<=t?r:`${r.slice(0,t-3)}...`}function lo(e){return Math.ceil(e.length/4)}function Cn(e,t){return e.length<=t?e:`${e.slice(0,Math.max(t-3,0))}...`}var Ot=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}},Gy=new Map([["candidate",new Set(["active","rejected"])],["active",new Set(["forgotten","expired"])],["superseded",new Set],["rejected",new Set],["forgotten",new Set],["expired",new Set]]),Ky=1e3;async function Ts(e,t){let r=await v(e),o=await Cu(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 ee(e,t){let r=await v(e),o=await Cu(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 Cs(e){let t=await v(e.home),r=Is.resolve(e.cwd);await to({cwd:r,home:t.home});let o=L(r,t.home),n=e.event?.trim()||"session-end",a=zy(e.text,e.payload),s=[`Session memory candidate from ${e.host} ${n} hook.`,"",`Project: ${o}`,`CWD: ${r}`,"","Summary:",a.text].join(`
903
+ `),i=await ee(t.home,{project:o,content:s,confidence:a.source==="stub"?.2:.45,authority:"hook_observed",source:{kind:"session_end_hook",host:e.host,event:n,cwd:r,summary_source:a.source}});return{proposed:!0,host:e.host,event:n,cwd:r,project:o,memory:i,summary_source:a.source}}function zy(e,t){let r=e?.trim();if(r)return{text:xu(r),source:"text"};let o=Xy(t);return o?{text:xu(o),source:"payload"}:{text:"No host session summary was supplied. Review this candidate against the recent session before promotion.",source:"stub"}}function Xy(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 xu(e){return e.length<=8e3?e:`${e.slice(0,7997)}...`}async function Os(e){let t=await v(e.home),r=Is.resolve(e.cwd),o=L(r,t.home),n=await Yy(t.home),a=Iu(e.prompt,n),s=Math.min(Math.max(e.limit??3,1),3),i=[];if(a.triggered){let l=io({database:t.database,query:a.query,project:o,limit:s});i=l.memories,await h({home:t.home,type:"memory_recalled",details:{host:e.host,project:o,reason:a.reason,query:a.query,count:i.length,recall_mode:l.mode,recall_reason:l.reason}})}return{host:e.host,cwd:r,project:o,prompt:e.prompt,decision:a,memories:i,context:Qy(i,a)}}function Iu(e,t=Tu()){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(s=>o===s||o.startsWith(`${s} `));if(n)return{triggered:!1,reason:`denylist:${n}`,denied:!0,auto_trigger:!0,query:r};let a=t.keywords.find(s=>o.includes(s));return a?{triggered:!0,reason:`keyword:${a}`,denied:!1,auto_trigger:!0,query:r}:{triggered:!1,reason:"no_trigger",denied:!1,auto_trigger:!0,query:r}}function Tu(){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 Yy(e){let t=Tu(),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 n=ju(r,"keywords");n.length>0&&(t.keywords=n.map(s=>s.toLowerCase()));let a=ju(r,"denylist");return a.length>0&&(t.denylist=a.map(s=>s.toLowerCase())),t}function ju(e,t){let r=e.split(/\r?\n/u),o=[],n=!1;for(let a of r){if(new RegExp(`^\\s*${t}:\\s*$`,"u").test(a)){n=!0;continue}if(!n)continue;let s=a.match(/^\s*-\s*["']?(.+?)["']?\s*$/u)?.[1];if(s){o.push(s.trim());continue}if(/^\s*\S/u.test(a))break}return o}function Qy(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(`
904
+ `).slice(0,1800)}async function Nt(e,t){return On(e,t,"active","memory_promoted")}async function Mt(e,t){return On(e,t,"rejected","memory_rejected")}async function Lt(e,t){return On(e,t,"forgotten","memory_forgotten")}async function co(e,t){return On(e,t,"expired","memory_expired")}async function Dt(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}}),await Ns(t.home),o}async function Ns(e){let t=await v(e),r=Zy(t.database),o=await ce(t.home,"MEMORY.md"),n=pr(o,e_(r));n!==o&&await qy(Is.join(t.home,"MEMORY.md"),n,{encoding:"utf8",mode:384})}async function Cu(e,t,r){let o=N(t.content),n=new Date().toISOString(),a=Ge(o.value),s={id:T("mem"),type:t.type??"note",scope:{user:"default",project:t.project},content:o.value,summary:a,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:Se({type:t.type??"note",project:t.project,content:o.value,status:r,created_at:n})},i=_(e);try{i.insertMemory(s)}finally{i.close()}return s}async function On(e,t,r,o){let n=await v(e),a=_(n.database),s,i;try{if(s=a.getMemory(t),s&&!Nn(s.status,r))throw new Ot({id:t,from:s.status,to:r});i=s?a.updateMemoryStatus(t,r):null}catch(l){throw l instanceof Ot&&await t_({home:n.home,id:l.id,from:l.from,to:l.to}),l}finally{a.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}}),(r==="active"||s?.status==="active")&&await Ns(n.home),i}function Zy(e){let t=_(e);try{return t.listMemories({status:"active",limit:Ky})}finally{t.close()}}function e_(e){let t=["## Active curated memories","","_Managed by NativeSoul. Regenerated by `memory promote` and `memory export`; SQLite remains the source of truth._",""];if(e.length===0)return t.push("_No active memories._"),t.join(`
905
905
  `);for(let r of e){t.push(`### ${r.scope.project}`),t.push(""),t.push(`- id: \`${r.id}\``),t.push(`- created: ${r.created_at}`),t.push(`- type: ${r.type}`),t.push(`- authority: ${r.authority}`),t.push(`- confidence: ${r.confidence}`),t.push("- content:");for(let o of r.content.split(/\r?\n/u))t.push(` > ${o}`);t.push("")}return t.join(`
906
- `).trimEnd()}function Nn(e,t){return Gy.get(e)?.has(t)??!1}async function t_(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 Dt(e,t,r,o=5){let n=await v(e),a=io({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:a.memories.length,recall_mode:a.mode,recall_reason:a.reason}}),a.memories}async function uo(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:Ou(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:Ou(e.resolution)}}),{touched:!0,inserted:o.inserted,degraded:!1,warning:null}}catch(o){return{touched:!1,inserted:!1,degraded:!0,warning:`PROJECT_REGISTRY_UNAVAILABLE:${i_(o)}`}}finally{r?.close()}}async function Ms(e={}){let t=f(e.home),r=n_(e.limit),o=e.status??"active";if(!await S(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 a=n.listProjectsWithCounts({status:o,limit:r});return{registry_available:a.available,status:o,limit:r,projects:a.projects,warning:a.warning}}finally{n.close()}}async function Ls(e){let t=f(e.home),r=e.id==="."?r_(e.cwd??process.cwd(),t.home):o_(e.id);if(!await S(t.database))return Nu(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 Nu(e.id,r,n.warning);let a=n.detail;return{registry_available:!0,requested:e.id,effective_id:r.id,registry:a?.project??null,live_resolution:r,counts:a?.counts??null,derived_last_seen_at:a?.derived_last_seen_at??null,continuity_gap:!!(a?.project&&a.project.base_id!==r.id),warning:a?.project?null:"project_not_found"}}finally{o.close()}}async function Ds(e){let t=f(e.home),r=a_(e.name),o=e.id==="."?K(e.cwd??process.cwd(),t.home).id:e.id,n=_(t.database),a;try{a=n.renameProject(o,r)}finally{n.close()}return a.found&&a.previous&&a.project&&await h({home:t.home,type:"project_renamed",details:{id:o,old_name:a.previous.display_name,new_name:r}}),{found:a.found,id:o,old_name:a.previous?.display_name??null,new_name:r,project:a.project}}async function Hs(e){let t=f(e.home),r=e.includeMemories===!0,o=e.apply===!0,n=e.confirm??null,a=!r||o&&n===e.id,s=_(t.database);try{let i=s.getProject(e.id);if(!i)return Mn({found:!1,id:e.id,mode:r?"forget_memories":"archive",applied:!1,guardOk:a,confirm:n,previousStatus:null,statusAfter:null,memoriesAffected:0,project:null,warning:"project_not_found"});if(r&&!a)return Mn({found:!0,id:e.id,mode:"forget_memories",applied:!1,guardOk:a,confirm:n,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,Nn);return c.found&&c.project&&await h({home:t.home,type:"project_forgotten",details:{id:e.id,memories_affected:c.memories_affected}}),Mn({found:c.found,id:e.id,mode:"forget_memories",applied:c.found,guardOk:a,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 nr&&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=s.archiveProject(e.id);return l.found&&l.project&&await h({home:t.home,type:"project_archived",details:{id:e.id}}),Mn({found:l.found,id:e.id,mode:"archive",applied:l.found,guardOk:a,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{s.close()}}async function $s(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 Fs(e={}){return{aliases:ws(f(e.home).home)}}async function Us(e){let t=f(e.home),r=await Rs({home:t.home,action:"add",aliasKey:Mu(e.alias),projectId:s_(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 Bs(e){let t=f(e.home),r=await Rs({home:t.home,action:"remove",aliasKey:Mu(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 Ou(e){return e.remote??e.git_root??e.cwd}function r_(e,t){let r=K(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 o_(e){return{id:e,source:"explicit",cwd:null,git_root:null,remote:null,base_id:null,alias_key:null,marker_path:null}}function Nu(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 n_(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),500)}function a_(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 Mu(e){let t=e.trim();if(t.length===0)throw new Error("project alias requires a non-empty alias");return t}function s_(e){let t=e.trim();if(t.length===0||t===".")throw new Error("project alias add requires an explicit project id");return t}function Mn(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 i_(e){return(e instanceof Error?e.message:String(e)).replace(/[^a-zA-Z0-9_.:-]+/g,"_").slice(0,120)}var l_=/^-\s*\*\*([^:*]+):\*\*\s*(.*)$/u;function Ht(e,t){let r=c_(e,t);if(r)return r;let o=e.split(/\r?\n/u);for(let n=0;n<o.length;n+=1){let s=(o[n]?.trim()??"").match(l_);if(!s||s[1]?.trim()!==t)continue;let i=s[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 Lu(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 Du(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 c_(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}import{copyFile as b_,mkdir as $u,readFile as v_,rename as k_,stat as w_,writeFile as R_}from"node:fs/promises";import{existsSync as Fu}from"node:fs";import $t from"node:path";import{mkdir as d_,readFile as u_,rename as p_,writeFile as m_}from"node:fs/promises";import po from"node:path";var g_=1440*60*1e3;async function Le(e){let t=f(e.home),r=await Vs(t.home),o={host:e.host,outcome:e.outcome,tier:e.tier,cwd:e.cwd?po.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=>N(n).value),error:__(e.error),recorded_at:e.recordedAt??new Date().toISOString()};return r.hosts[e.host]=o,await h_(t.home,r),await h({home:t.home,type:y_(e.outcome),result:e.outcome==="failed"?"error":"ok",details:o}),o}async function Vs(e){let t=f(e),r=Js(t.home);if(!await S(r))return f_();let o=JSON.parse(await u_(r,"utf8"));return{schema:1,hosts:typeof o.hosts=="object"&&o.hosts!==null?o.hosts:{}}}async function Ws(e){let t=f(e.home),o=(await Vs(t.home)).hosts[e.host]??null,n=(e.now??new Date).getTime(),a=o?Date.parse(o.recorded_at):Number.NaN,s=Number.isFinite(a)?Math.max(n-a,0):null;return{state_path:Js(t.home),last:o,age_ms:s,age_hours:s===null?null:Math.round(s/(3600*1e3)*10)/10,stale:s!==null&&s>g_}}function f_(){return{schema:1,hosts:{}}}async function h_(e,t){let r=Js(e);await d_(po.dirname(r),{recursive:!0,mode:448});let o=po.join(po.dirname(r),`.last-handshake-${T("tmp")}.tmp`);await m_(o,`${JSON.stringify(t,null,2)}
907
- `,{encoding:"utf8",mode:384}),await p_(o,r)}function Js(e){return po.join(e,"state","last-handshake.json")}function y_(e){return`handshake_${e}`}function __(e){if(e==null)return null;let t=e instanceof Error?e.message:String(e);return N(t).value.slice(0,500)}var Hu=8;function mr(e){let t=e.generatedAt??new Date().toISOString(),r=e.degraded===!0,o=[...e.payload.warnings,...e.warnings??[]],n=e.payload.capabilities.slice(0,Hu),a=e.payload.capability_cards.slice(0,Hu),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",...n.length>0?n.map(i=>`- ${i.uid} (${i.host}, ready=${i.ready}): ${i.source}`):["- none"],"","## Capability Cards",...a.length>0?a.map(i=>`- ${i.uid} (${i.host}, ready=${i.ready}): ${i.use_when[0]??i.source}`):["- none"],""].filter(i=>i!==null).join(`
908
- `);return{host:e.host,generated_at:t,degraded:r,warnings:o,tokens_used:Ks(s),tokens_max:e.payload.context_budget.tokens_max,content:s}}async function Ln(e){let t=f(e.home),r=mr({host:e.host,payload:e.payload}),o=Gs(t.home,e.host),n=Fu(o)&&e.apply!==!1?await A_(t.home,e.host,o):null;if(e.apply!==!1){await $u($t.dirname(o),{recursive:!0,mode:448});let s=$t.join($t.dirname(o),`.last-context-${T("tmp")}.tmp`);await R_(s,r.content,{encoding:"utf8",mode:384}),await k_(s,o)}let a={...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:{...a,content:"[omitted]"}}),e.apply!==!1&&e.recordTelemetry!==!1&&await Le({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}),a}async function pr(e){let t=f(e.home),r=Gs(t.home,e.host);if(!Fu(r))return S_({home:t.home,host:e.host,targetPath:r,recordTelemetry:e.recordTelemetry});let o=await v_(r,"utf8"),n=await w_(r),a=e.ttlDays??7,s=Date.now()-n.mtimeMs>a*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(`
909
- `),d={host:e.host,generated_at:i,degraded:!0,warnings:l,tokens_used:Ks(c),tokens_max:1900,content:c,targetPath:r,stale:s};if(e.recordTelemetry!==!1){await h({home:t.home,type:"bootstrap_context_cache_read",details:{...d,content:"[omitted]"}});let p=E_(o);await Le({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 qs(e){let t=await pr({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 pr({home:mo(e.projectCwd),host:e.host,ttlDays:e.ttlDays,recordTelemetry:!1});return r.warnings.includes("BOOTSTRAP_CACHE_MISSING")?t:r}function Gs(e,t){return $t.join(e,"generated",t,"last-context.md")}function mo(e){return $t.join(e,".nativesoul-cache")}async function S_(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(`
910
- `),n={host:e.host,generated_at:t,degraded:!0,warnings:r,tokens_used:Ks(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 Le({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 A_(e,t,r){let o=$t.join(e,"backups","bootstrap-context");await $u(o,{recursive:!0,mode:448});let n=$t.join(o,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-${t}-last-context.md`);return await b_(r,n),n}function Ks(e){return Math.ceil(e.length/4)}function E_(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}}var Uu=3e3,Bu=new WeakMap;async function pt(e){let t=e.readOnly?f(e.home):await v(e.home),r=await T_(t.home),o=Math.min(Math.max(e.tokensMax??r.defaultTokens,1),Uu),n=[];e.readOnly!==!0&&await to({cwd:e.cwd,home:t.home});let a=K(e.cwd,t.home),s=a.id;if(e.readOnly!==!0){let V=await uo({home:t.home,resolution:a});V.warning&&n.push(V.warning)}let i=C_({explicitQuery:e.query,project:s,host:e.host,cwd:e.cwd,seed:r.memoryQuerySeed}),l=await x_({database:t.database,readOnly:e.readOnly===!0,memoryQuery:i,project:s,limit:r.recallLimit,warnings:n}),c=l.memories,d=await Ee({home:t.home,host:e.host,readyOnly:!0,limit:8,readOnly:e.readOnly}),p=await M_(t.home,e.host,e.readOnly===!0),g=await hs({home:t.home,host:e.host,query:e.query??`${De.basename(e.cwd)} ${e.host}`,limit:8,readOnly:e.readOnly}),y=await Zr({home:t.home,project:s,status:"open",limit:8,readOnly:e.readOnly}),k=await de(t.home,"IDENTITY.md"),R=await de(t.home,"SOUL.md"),U=await de(t.home,"AGENTS.md"),Z=await de(t.home,"USER.md"),ke=await de(t.home,"BOOTSTRAP.md"),Te=new Date().toISOString().slice(0,10),se=De.join(t.home,"memory","daily",`${Te}.md`);n.push(...p?[]:[`HOST_ADAPTER_UNAVAILABLE:${e.host}`,"CAPABILITY_REFRESH_STALE"],...g.warnings),!await S(De.join(t.home,"state","onboarding.complete"))&&ke.trim().length>0&&n.push("BOOTSTRAP_RITUAL_PENDING"),await S(se)&&n.push(`DAILY_MEMORY_AVAILABLE:${se}`),r.warnEmptyMemories&&c.length===0&&n.push("PROJECT_MEMORY_EMPTY");let x={bootstrap_schema:2,identity:{name:Ht(k,"Name")??"NativeSoul",mission:Ht(k,"Mission")??"Provide local continuity across native coding-agent hosts.",creature:Ht(k,"Creature"),role:Ht(k,"Role"),vibe:Ht(k,"Vibe"),emoji:Ht(k,"Emoji")},soul_summary:Lu(R||"Continuity, clarity, and safe local-first operation.",500),agents_operating_summary:Du(U||"Load NativeSoul context before continuity-sensitive work. Use MCP when available and CLI fallback when needed."),tool_hints:O_(),user:{preferences_summary:N_(Z)},project:{id:s,cwd:De.resolve(e.cwd),state:"local-bootstrap"},commitments:y.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:c.map(V=>({id:V.id,summary:V.summary,scope:V.scope})),capabilities:d.map(V=>({uid:V.uid,host:V.host,ready:V.ready,source:V.source})),capability_cards:g.cards,policy:{mode:"safe",approval_required:["external_write","destructive","identity_policy_change"]},warnings:n},Mr=L_(x,o),rn=lo(JSON.stringify(Mr)),Lr={...Mr,context_budget:{tokens_used:rn,tokens_max:o}};return Bu.set(Lr,{files:j_({home:t.home,identityText:k,soulText:R,agentsText:U,userText:Z,bootstrapText:ke,payload:Lr}),memoryRecall:{query:i,limit:r.recallLimit,returned:c.length,mode:l.mode},cache:Vu(t.home,e.host)}),e.readOnly||await h({home:t.home,type:"bootstrap_created",details:{host:e.host,cwd:De.resolve(e.cwd),project:s,tokens:rn}}),Lr}async function x_(e){if(!await S(e.database))return e.warnings.push("BOOTSTRAP_DATABASE_MISSING"),{memories:[],mode:"disabled"};let t=null;try{t=_(e.database,{readOnly:e.readOnly});let r=io({database:e.database,query:e.memoryQuery,project:e.project,limit:e.limit,readOnly:e.readOnly});return{memories:r.memories.length===0?t.recentMemories(e.project,e.limit):r.memories,mode:r.mode}}catch(r){return e.warnings.push(`BOOTSTRAP_DATABASE_UNAVAILABLE:${I_(r)}`),{memories:[],mode:"disabled"}}finally{t?.close()}}async function Xs(e){let t=await pt({home:e.home,host:e.host,cwd:e.cwd,query:e.query,tokensMax:e.tokensMax,readOnly:!0}),r=mr({host:e.host,payload:t,generatedAt:e.generatedAt}),o=Bu.get(t)??{files:[],memoryRecall:{limit:0,returned:t.relevant_memories.length,mode:"disabled"},cache:Vu(e.home??"",e.host)};return{host:e.host,cwd:De.resolve(e.cwd),project:t.project,files:o.files,memoryRecall:o.memoryRecall,budget:{unit:"tokens",softMax:t.context_budget.tokens_max,hardMax:Uu,used:r.tokens_used},warnings:r.warnings,cache:o.cache,degraded:r.degraded}}function j_(e){return[go({home:e.home,relativePath:"IDENTITY.md",role:"identity",rawText:e.identityText,injectedText:Object.values(e.payload.identity).filter(t=>typeof t=="string").join(`
911
- `),fallbackReason:"missing; default identity fields injected"}),go({home:e.home,relativePath:"SOUL.md",role:"soul_summary",rawText:e.soulText,injectedText:e.payload.soul_summary,fallbackReason:"missing; default soul summary injected"}),go({home:e.home,relativePath:"AGENTS.md",role:"agents_operating_summary",rawText:e.agentsText,injectedText:e.payload.agents_operating_summary,fallbackReason:"missing; default agent operating summary injected"}),go({home:e.home,relativePath:"USER.md",role:"user_preferences",rawText:e.userText,injectedText:e.payload.user.preferences_summary,fallbackReason:"missing; empty user-preferences fallback injected"}),go({home:e.home,relativePath:"BOOTSTRAP.md",role:"onboarding_bootstrap",rawText:e.bootstrapText,injectedText:"",fallbackReason:"missing; no onboarding bootstrap warning",presentReason:"omitted; used only to emit BOOTSTRAP_RITUAL_PENDING"})]}function go(e){let t=e.rawText.length,r=e.injectedText.length,o=t>0,n=r>0,a=o?e.presentReason??(r<t?"included; summarized to fit budget":"included"):e.fallbackReason;return{path:De.join(e.home,e.relativePath),role:e.role,included:n,reason:a,rawChars:t,injectedChars:r,truncated:o&&n&&r<t,hash:o?A(e.rawText):null}}function Vu(e,t){let r=De.join(e,"generated",t,"last-context.md");return{hit:P_(r),key:r}}function I_(e){return(e instanceof Error?e.message:String(e)).replace(/[^a-zA-Z0-9_.:-]+/g,"_").slice(0,120)}async function T_(e){let t=await de(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),a=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:n?.[1]?.trim()||null,warnEmptyMemories:a?.[1]?.toLowerCase()==="true"}}function C_(e){return[e.explicitQuery,e.project,e.host,De.basename(De.resolve(e.cwd)),e.seed].filter(t=>typeof t=="string"&&t.trim().length>0).join(" ")}function O_(){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 N_(e){let t=e.trim();return t.length===0?"No curated user preferences yet.":t.length<=160?t:`${t.slice(0,157)}...`}async function M_(e,t,r=!1){let o=await Ee({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 a=Date.parse(n);if(!Number.isFinite(a))return!1;let s=1440*60*1e3;return Date.now()-a<=s}function L_(e,t){let r=[e,ut(e,1200,420,150),ut(e,900,320,130),ut(e,650,240,110),ut(e,420,180,90),ut(e,240,120,80),zs(ut(e,240,120,80),8,8),zs(ut(e,240,120,80),5,5),zs(ut(e,240,120,80),3,3)];return r.find(o=>lo(JSON.stringify(o))<=t)??r[r.length-1]??e}function zs(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 ut(e,t,r,o){return{...e,soul_summary:Cn(e.soul_summary,r),agents_operating_summary:Cn(e.agents_operating_summary,t),user:{...e.user,preferences_summary:Cn(e.user.preferences_summary,o)}}}import{existsSync as vi}from"node:fs";import Tp from"node:path";function Ys(e){let t={bootstrap:D_(e),mcp:H_(e),plugins_hooks:$_(e),heartbeat:F_(e),recall_auto_trigger:U_(e),memory_candidate_hooks:B_(e),memory_promotion_policy:V_(e),cross_host_verification:W_(e)},r=Object.values(t),o=J_(r),n=r.flatMap(s=>s.plan_actions),a=q_(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:a}}function Wu(e){return Ys(e).summary}function D_(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},[Ft("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 H_(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(be),checked_hosts:e.hosts.map(be)})}return $("mcp","not_configured","No MCP registration was detected for the selected host scope.",{checked_hosts:e.hosts.map(be)},[Ft("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 $_(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(be),hook_modes:Object.fromEntries(e.hosts.map(n=>[be(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(be)},[Ft("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 F_(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(be),heartbeat_modes:Object.fromEntries(e.hosts.map(r=>[be(r),r.provider_parity.heartbeat]))},[Ft("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(be)}):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(be)}):$("heartbeat","approval_required","Heartbeat profile is enabled, but no scheduler desired state is active yet.",{checked_hosts:e.hosts.map(be)},[Ft("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 U_(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},[Ft("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 B_(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=>[be(r),r.provider_parity.hooks]))})}function V_(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 W_(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},[Ft("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 Ft(e,t,r,o,n,a,s){return{id:e,component:t,status:r,action:o,target:n,dry_run:!0,requires_user_confirmed:a,reason:s}}function J_(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 q_(e,t,r){return{overall_status:t,profile:e?.profile??null,active:fo(r,"active"),not_configured:fo(r,"not_configured"),approval_required:fo(r,"approval_required"),blocked_by_host:fo(r,"blocked_by_host"),degraded:fo(r,"degraded"),full_native_claimed:!1}}function fo(e,t){return e.filter(r=>r.status===t).length}function be(e){return e.surface==="default"?e.host:`${e.host}:${e.surface}`}import{existsSync as G_}from"node:fs";import K_ from"node:path";async function ho(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 a of o)await S(K_.join(t.home,a))||r.push({code:"MISSING_HUMAN_FILE",severity:"warn",message:`${a} is missing`,remediation:"Run nativesoul init"});if(!G_(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 a=_(t.database,{readOnly:!0});try{return a.integrityCheck()}finally{a.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(...z_(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(a=>a.severity!=="error"),integrity:n,issues:r}}function z_(e,t){let r=K(process.cwd(),e),o=_(t,{readOnly:!0});try{let n=new Set(o.listMemories({limit:200,includeForgotten:!0}).map(a=>a.scope.project).filter(a=>a!==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 Pe from"node:os";import z from"node:path";function Ju(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 qu(e){return e==="claude"?".claude.json":e==="gemini"?"settings.json":e==="antigravity"?"mcp_config.json":"mcp.json"}function yo(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 ze(e,t){return t&&t!=="default"?[yo(e,t)]:e==="claude"?["claude-code","claude-desktop"]:["default"]}function Ut(e,t){return t==="default"?e:t}function Gu(e){switch(e){case"codex":return z.join(Pe.homedir(),".codex","AGENTS.md");case"claude":return z.join(Pe.homedir(),".claude","CLAUDE.md");case"grok":return z.join(Pe.homedir(),".grok","Agents.md");case"antigravity":case"gemini":return z.join(Pe.homedir(),".gemini","GEMINI.md")}}function Dn(e){switch(e){case"codex":return z.join(Pe.homedir(),".codex","mcp.json");case"claude":return z.join(Pe.homedir(),".claude.json");case"grok":return z.join(Pe.homedir(),".grok","mcp.json");case"antigravity":return z.join(Pe.homedir(),".gemini","antigravity-cli","mcp_config.json");case"gemini":return z.join(Pe.homedir(),".gemini","settings.json")}}function Ku(){return zu({platform:process.platform,home:Pe.homedir(),env:process.env})}function zu(e){let t=e.platform==="win32"?z.win32:z.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 Xu(e,t){if(e!=="claude")return null;if(!t)return z.join(Pe.homedir(),".claude","mcp.json");let r=z.resolve(t),o=z.dirname(r);return z.basename(o)==="claude"?z.join(o,"mcp.json"):z.join(o,".claude","mcp.json")}function Yu(e,t){return t?Eu(e):X_()}function X_(){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 Qu(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 Zu(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 Hn(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 pv}from"node:fs";import{readFile as mv,stat as gv}from"node:fs/promises";import jp from"node:path";import hr from"node:path";import{existsSync as ui}from"node:fs";import{cp as Fb,mkdir as Ub,rm as kp}from"node:fs/promises";import Bb from"node:path";import{existsSync as gt}from"node:fs";import{readFile as Gn}from"node:fs/promises";import Xe from"node:path";import Y_ from"node:path";function gr(e){return e.split(/[\\/]/u).join("/")}function mt(e,t){return gr(Y_.relative(e,t))}function Bt(e){return gr(e)}import{existsSync as ep}from"node:fs";import Qs from"node:path";function $n(e){if(Qs.isAbsolute(e))return ep(e)?e:null;let t=(process.env.PATH??"").split(Qs.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 a=Qs.join(o,`${e}${n}`);if(ep(a))return a}return null}import{spawnSync as eb}from"node:child_process";import{existsSync as Vt}from"node:fs";import{mkdir as Un,readFile as Wt,writeFile as Bn}from"node:fs/promises";import tb from"node:os";import B from"node:path";import{existsSync as Q_}from"node:fs";import _o from"node:os";import ne from"node:path";import{fileURLToPath as Z_}from"node:url";function He(e,t,r){return bo(e,t)?r?ne.join(ne.resolve(r),e,"plugins","nativesoul"):e==="claude"?ne.join(_o.homedir(),".claude","plugins","nativesoul"):e==="codex"?ne.join(_o.homedir(),".codex","plugins","nativesoul"):e==="gemini"?ne.join(_o.homedir(),".gemini","extensions","nativesoul"):e==="grok"?ne.join(_o.homedir(),".grok","plugins","nativesoul"):e==="antigravity"?ne.join(_o.homedir(),".antigravity","plugins","nativesoul"):null:null}function bo(e,t){return e==="codex"||e==="gemini"||e==="grok"||e==="antigravity"||e==="claude"&&(t==="claude-code"||t==="claude-desktop")}function Fn(e,t){return e==="claude"?ne.join(t,".claude-plugin","plugin.json"):e==="gemini"?ne.join(t,"gemini-extension.json"):e==="grok"||e==="antigravity"?ne.join(t,"plugin.json"):ne.join(t,".codex-plugin","plugin.json")}function Zs(e){if(e!=="claude"&&e!=="codex"&&e!=="gemini"&&e!=="grok"&&e!=="antigravity")return null;let t=`${e}-nativesoul`,r=ne.dirname(Z_(import.meta.url));return[ne.resolve(process.cwd(),"plugins",t),ne.resolve(r,"../../../plugins",t),ne.resolve(r,"../../../../plugins",t)].find(n=>Q_(n))??null}var ti="nativesoul",Vn="nativesoul";async function rp(e){let t=B.join(e,"..","..","settings.json"),r=Vt(t)?JSON.parse(await Wt(t,"utf8")):{},o=r.hooks&&!Array.isArray(r.hooks)&&typeof r.hooks=="object"?{...r.hooks}:{},n=Bt(B.join(e,"shared","hooks","host-hook.cjs")),a={SessionStart:ko(`node ${JSON.stringify(n)} session-start --host claude --project-env CLAUDE_PROJECT_DIR`),UserPromptSubmit:ko(`node ${JSON.stringify(n)} prompt-bootstrap --host claude --project-env CLAUDE_PROJECT_DIR`),PreToolUse:ko(`node ${JSON.stringify(n)} pre-tool-use --host claude --project-env CLAUDE_PROJECT_DIR`),Stop:ko(`node ${JSON.stringify(n)} memory-flush --host claude --project-env CLAUDE_PROJECT_DIR`),PreCompact:ko(`node ${JSON.stringify(n)} memory-flush --host claude --project-env CLAUDE_PROJECT_DIR`)};for(let[s,i]of Object.entries(a))o[s]=dp(o[s]??null,i??null);await Un(B.dirname(t),{recursive:!0,mode:448}),await Bn(t,`${JSON.stringify({...r,hooks:o},null,2)}
912
- `,"utf8")}async function op(e){let t=cp(e),r=Vt(t)?JSON.parse(await Wt(t,"utf8")):{},o=r.hooks&&!Array.isArray(r.hooks)&&typeof r.hooks=="object"?{...r.hooks}:{},n=Bt(B.join(e,"shared","hooks","host-hook.cjs")),a={SessionStart:vo(`node ${JSON.stringify(n)} session-start --host grok --project-env GROK_WORKSPACE_ROOT`),UserPromptSubmit:vo(`node ${JSON.stringify(n)} prompt-bootstrap --host grok --project-env GROK_WORKSPACE_ROOT`),PreToolUse:vo(`node ${JSON.stringify(n)} pre-tool-use --host grok --project-env GROK_WORKSPACE_ROOT`),Stop:vo(`node ${JSON.stringify(n)} memory-flush --host grok --project-env GROK_WORKSPACE_ROOT`),PreCompact:vo(`node ${JSON.stringify(n)} memory-flush --host grok --project-env GROK_WORKSPACE_ROOT`)};for(let[s,i]of Object.entries(a))o[s]=dp(o[s]??null,i??null);await Un(B.dirname(t),{recursive:!0,mode:448}),await Bn(t,`${JSON.stringify({...r,hooks:o},null,2)}
913
- `,"utf8")}async function np(e){let t=oi(e),r=B.join(t,"agents",`${Vn}.md`),o=B.join(t,"config.toml");await Un(B.dirname(r),{recursive:!0,mode:448}),await Bn(r,lb(),{encoding:"utf8",mode:384});let n=Vt(o)?await Wt(o,"utf8"):"";await Un(B.dirname(o),{recursive:!0,mode:448}),await Bn(o,cb(n,"agent",`name = "${Vn}"`),"utf8")}function ap(e,t,r){if(t!=="default"||!sb(e,t,r))return[];if(e==="antigravity")return ei({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=ei({executableName:"grok",installArgs:a=>["plugin","install",a,"--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:rb},r),n=ei({executableName:"grok",installArgs:()=>["plugin","enable",ti],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:ob},r);return[...o,...n]}return[]}function ei(e,t){let r=$n(e.executableName);if(!r)return[{code:"HOST_PLUGIN_IMPORT_SKIPPED",severity:"warn",message:e.skippedMessage,remediation:e.skippedRemediation}];let o=eb(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 rb(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 ob(e){return/^Enabled plugin:/i.test(e)||/\balready enabled\b/i.test(e)}async function sp(e){let t=e?ib(e):B.join(tb.homedir(),".grok","config.toml");if(!Vt(t))return null;let r=await Wt(t,"utf8");return tp(r,"disabled",ti)?!1:tp(r,"enabled",ti)?!0:null}async function ip(e){let t=cp(e);if(!Vt(t))return!1;let r=JSON.parse(await Wt(t,"utf8"));return nb(r)}async function lp(e){let t=oi(e),r=B.join(t,"agents",`${Vn}.md`),o=B.join(t,"config.toml");if(!Vt(r)||!Vt(o))return!1;let[n,a]=await Promise.all([Wt(r,"utf8"),Wt(o,"utf8")]);return n.includes("NativeSoul continuity agent")&&db(a)===Vn}function tp(e,t,r){let a=(e.match(/\[plugins\][\s\S]*?(?=\n\[|$)/u)?.[0]??e).match(new RegExp(`${t}\\s*=\\s*\\[([^\\]]*)\\]`,"u"))?.[1];return a?a.split(",").some(s=>s.replace(/["'\s]/gu,"")===r):!1}function nb(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])=>ab(t,o,n))}function ab(e,t,r){let o=e[t];return Array.isArray(o)?o.some(n=>ri(n)?.includes(r)===!0):!1}function sb(e,t,r){let o=He(e,t);return o!==null&&B.resolve(o)===B.resolve(r)}function cp(e){return B.join(oi(e),"hooks","nativesoul.json")}function oi(e){return B.resolve(e,"..","..")}function ib(e){let t=B.resolve(e),r=B.basename(t);return r==="grok"||r===".grok"?B.join(t,"config.toml"):B.join(t,".grok","config.toml")}function vo(e){return{hooks:[{type:"command",command:e,timeout:9}]}}function lb(){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(`
906
+ `).trimEnd()}function Nn(e,t){return Gy.get(e)?.has(t)??!1}async function t_(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 Ht(e,t,r,o=5){let n=await v(e),a=io({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:a.memories.length,recall_mode:a.mode,recall_reason:a.reason}}),a.memories}async function uo(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:Ou(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:Ou(e.resolution)}}),{touched:!0,inserted:o.inserted,degraded:!1,warning:null}}catch(o){return{touched:!1,inserted:!1,degraded:!0,warning:`PROJECT_REGISTRY_UNAVAILABLE:${i_(o)}`}}finally{r?.close()}}async function Ms(e={}){let t=f(e.home),r=n_(e.limit),o=e.status??"active";if(!await A(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 a=n.listProjectsWithCounts({status:o,limit:r});return{registry_available:a.available,status:o,limit:r,projects:a.projects,warning:a.warning}}finally{n.close()}}async function Ls(e){let t=f(e.home),r=e.id==="."?r_(e.cwd??process.cwd(),t.home):o_(e.id);if(!await A(t.database))return Nu(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 Nu(e.id,r,n.warning);let a=n.detail;return{registry_available:!0,requested:e.id,effective_id:r.id,registry:a?.project??null,live_resolution:r,counts:a?.counts??null,derived_last_seen_at:a?.derived_last_seen_at??null,continuity_gap:!!(a?.project&&a.project.base_id!==r.id),warning:a?.project?null:"project_not_found"}}finally{o.close()}}async function Ds(e){let t=f(e.home),r=a_(e.name),o=e.id==="."?K(e.cwd??process.cwd(),t.home).id:e.id,n=_(t.database),a;try{a=n.renameProject(o,r)}finally{n.close()}return a.found&&a.previous&&a.project&&await h({home:t.home,type:"project_renamed",details:{id:o,old_name:a.previous.display_name,new_name:r}}),{found:a.found,id:o,old_name:a.previous?.display_name??null,new_name:r,project:a.project}}async function Hs(e){let t=f(e.home),r=e.includeMemories===!0,o=e.apply===!0,n=e.confirm??null,a=!r||o&&n===e.id,s=_(t.database);try{let i=s.getProject(e.id);if(!i)return Mn({found:!1,id:e.id,mode:r?"forget_memories":"archive",applied:!1,guardOk:a,confirm:n,previousStatus:null,statusAfter:null,memoriesAffected:0,project:null,warning:"project_not_found"});if(r&&!a)return Mn({found:!0,id:e.id,mode:"forget_memories",applied:!1,guardOk:a,confirm:n,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,Nn);return c.found&&c.project&&await h({home:t.home,type:"project_forgotten",details:{id:e.id,memories_affected:c.memories_affected}}),Mn({found:c.found,id:e.id,mode:"forget_memories",applied:c.found,guardOk:a,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 ar&&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=s.archiveProject(e.id);return l.found&&l.project&&await h({home:t.home,type:"project_archived",details:{id:e.id}}),Mn({found:l.found,id:e.id,mode:"archive",applied:l.found,guardOk:a,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{s.close()}}async function $s(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 Fs(e={}){return{aliases:ws(f(e.home).home)}}async function Us(e){let t=f(e.home),r=await Ss({home:t.home,action:"add",aliasKey:Mu(e.alias),projectId:s_(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 Bs(e){let t=f(e.home),r=await Ss({home:t.home,action:"remove",aliasKey:Mu(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 Ou(e){return e.remote??e.git_root??e.cwd}function r_(e,t){let r=K(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 o_(e){return{id:e,source:"explicit",cwd:null,git_root:null,remote:null,base_id:null,alias_key:null,marker_path:null}}function Nu(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 n_(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),500)}function a_(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 Mu(e){let t=e.trim();if(t.length===0)throw new Error("project alias requires a non-empty alias");return t}function s_(e){let t=e.trim();if(t.length===0||t===".")throw new Error("project alias add requires an explicit project id");return t}function Mn(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 i_(e){return(e instanceof Error?e.message:String(e)).replace(/[^a-zA-Z0-9_.:-]+/g,"_").slice(0,120)}var l_=/^-\s*\*\*([^:*]+):\*\*\s*(.*)$/u;function $t(e,t){let r=c_(e,t);if(r)return r;let o=e.split(/\r?\n/u);for(let n=0;n<o.length;n+=1){let s=(o[n]?.trim()??"").match(l_);if(!s||s[1]?.trim()!==t)continue;let i=s[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 Lu(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 Du(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 c_(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}import{copyFile as b_,mkdir as $u,readFile as v_,rename as k_,stat as w_,writeFile as S_}from"node:fs/promises";import{existsSync as Fu}from"node:fs";import Ft from"node:path";import{mkdir as d_,readFile as u_,rename as p_,writeFile as m_}from"node:fs/promises";import po from"node:path";var g_=1440*60*1e3;async function Me(e){let t=f(e.home),r=await Vs(t.home),o={host:e.host,outcome:e.outcome,tier:e.tier,cwd:e.cwd?po.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=>N(n).value),error:__(e.error),recorded_at:e.recordedAt??new Date().toISOString()};return r.hosts[e.host]=o,await h_(t.home,r),await h({home:t.home,type:y_(e.outcome),result:e.outcome==="failed"?"error":"ok",details:o}),o}async function Vs(e){let t=f(e),r=Js(t.home);if(!await A(r))return f_();let o=JSON.parse(await u_(r,"utf8"));return{schema:1,hosts:typeof o.hosts=="object"&&o.hosts!==null?o.hosts:{}}}async function Ws(e){let t=f(e.home),o=(await Vs(t.home)).hosts[e.host]??null,n=(e.now??new Date).getTime(),a=o?Date.parse(o.recorded_at):Number.NaN,s=Number.isFinite(a)?Math.max(n-a,0):null;return{state_path:Js(t.home),last:o,age_ms:s,age_hours:s===null?null:Math.round(s/(3600*1e3)*10)/10,stale:s!==null&&s>g_}}function f_(){return{schema:1,hosts:{}}}async function h_(e,t){let r=Js(e);await d_(po.dirname(r),{recursive:!0,mode:448});let o=po.join(po.dirname(r),`.last-handshake-${T("tmp")}.tmp`);await m_(o,`${JSON.stringify(t,null,2)}
907
+ `,{encoding:"utf8",mode:384}),await p_(o,r)}function Js(e){return po.join(e,"state","last-handshake.json")}function y_(e){return`handshake_${e}`}function __(e){if(e==null)return null;let t=e instanceof Error?e.message:String(e);return N(t).value.slice(0,500)}var Hu=8;function gr(e){let t=e.generatedAt??new Date().toISOString(),r=e.degraded===!0,o=[...e.payload.warnings,...e.warnings??[]],n=e.payload.capabilities.slice(0,Hu),a=e.payload.capability_cards.slice(0,Hu),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",...n.length>0?n.map(i=>`- ${i.uid} (${i.host}, ready=${i.ready}): ${i.source}`):["- none"],"","## Capability Cards",...a.length>0?a.map(i=>`- ${i.uid} (${i.host}, ready=${i.ready}): ${i.use_when[0]??i.source}`):["- none"],""].filter(i=>i!==null).join(`
908
+ `);return{host:e.host,generated_at:t,degraded:r,warnings:o,tokens_used:Ks(s),tokens_max:e.payload.context_budget.tokens_max,content:s}}async function Ln(e){let t=f(e.home),r=gr({host:e.host,payload:e.payload}),o=Gs(t.home,e.host),n=Fu(o)&&e.apply!==!1?await A_(t.home,e.host,o):null;if(e.apply!==!1){await $u(Ft.dirname(o),{recursive:!0,mode:448});let s=Ft.join(Ft.dirname(o),`.last-context-${T("tmp")}.tmp`);await S_(s,r.content,{encoding:"utf8",mode:384}),await k_(s,o)}let a={...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:{...a,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}),a}async function mr(e){let t=f(e.home),r=Gs(t.home,e.host);if(!Fu(r))return R_({home:t.home,host:e.host,targetPath:r,recordTelemetry:e.recordTelemetry});let o=await v_(r,"utf8"),n=await w_(r),a=e.ttlDays??7,s=Date.now()-n.mtimeMs>a*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(`
909
+ `),d={host:e.host,generated_at:i,degraded:!0,warnings:l,tokens_used:Ks(c),tokens_max:1900,content:c,targetPath:r,stale:s};if(e.recordTelemetry!==!1){await h({home:t.home,type:"bootstrap_context_cache_read",details:{...d,content:"[omitted]"}});let p=E_(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 qs(e){let t=await mr({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 mr({home:mo(e.projectCwd),host:e.host,ttlDays:e.ttlDays,recordTelemetry:!1});return r.warnings.includes("BOOTSTRAP_CACHE_MISSING")?t:r}function Gs(e,t){return Ft.join(e,"generated",t,"last-context.md")}function mo(e){return Ft.join(e,".nativesoul-cache")}async function R_(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(`
910
+ `),n={host:e.host,generated_at:t,degraded:!0,warnings:r,tokens_used:Ks(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 A_(e,t,r){let o=Ft.join(e,"backups","bootstrap-context");await $u(o,{recursive:!0,mode:448});let n=Ft.join(o,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-${t}-last-context.md`);return await b_(r,n),n}function Ks(e){return Math.ceil(e.length/4)}function E_(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}}var Uu=3e3,Bu=new WeakMap;async function pt(e){let t=e.readOnly?f(e.home):await v(e.home),r=await T_(t.home),o=Math.min(Math.max(e.tokensMax??r.defaultTokens,1),Uu),n=[];e.readOnly!==!0&&await to({cwd:e.cwd,home:t.home});let a=K(e.cwd,t.home),s=a.id;if(e.readOnly!==!0){let V=await uo({home:t.home,resolution:a});V.warning&&n.push(V.warning)}let i=C_({explicitQuery:e.query,project:s,host:e.host,cwd:e.cwd,seed:r.memoryQuerySeed}),l=await x_({database:t.database,readOnly:e.readOnly===!0,memoryQuery:i,project:s,limit:r.recallLimit,warnings:n}),c=l.memories,d=await Ee({home:t.home,host:e.host,readyOnly:!0,limit:8,readOnly:e.readOnly}),p=await M_(t.home,e.host,e.readOnly===!0),g=await hs({home:t.home,host:e.host,query:e.query??`${Le.basename(e.cwd)} ${e.host}`,limit:8,readOnly:e.readOnly}),y=await Zr({home:t.home,project:s,status:"open",limit:8,readOnly:e.readOnly}),k=await ce(t.home,"IDENTITY.md"),S=await ce(t.home,"SOUL.md"),U=await ce(t.home,"AGENTS.md"),ae=await ce(t.home,"USER.md"),ve=await ce(t.home,"BOOTSTRAP.md"),ke=new Date().toISOString().slice(0,10),nt=Le.join(t.home,"memory","daily",`${ke}.md`);n.push(...p?[]:[`HOST_ADAPTER_UNAVAILABLE:${e.host}`,"CAPABILITY_REFRESH_STALE"],...g.warnings),!await A(Le.join(t.home,"state","onboarding.complete"))&&ve.trim().length>0&&n.push("BOOTSTRAP_RITUAL_PENDING"),await A(nt)&&n.push(`DAILY_MEMORY_AVAILABLE:${nt}`),r.warnEmptyMemories&&c.length===0&&n.push("PROJECT_MEMORY_EMPTY");let R={bootstrap_schema:2,identity:{name:$t(k,"Name")??"NativeSoul",mission:$t(k,"Mission")??"Provide local continuity across native coding-agent hosts.",creature:$t(k,"Creature"),role:$t(k,"Role"),vibe:$t(k,"Vibe"),emoji:$t(k,"Emoji")},soul_summary:Lu(S||"Continuity, clarity, and safe local-first operation.",500),agents_operating_summary:Du(U||"Load NativeSoul context before continuity-sensitive work. Use MCP when available and CLI fallback when needed."),tool_hints:O_(),user:{preferences_summary:N_(ae)},project:{id:s,cwd:Le.resolve(e.cwd),state:"local-bootstrap"},commitments:y.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:c.map(V=>({id:V.id,summary:V.summary,scope:V.scope})),capabilities:d.map(V=>({uid:V.uid,host:V.host,ready:V.ready,source:V.source})),capability_cards:g.cards,policy:{mode:"safe",approval_required:["external_write","destructive","identity_policy_change"]},warnings:n},Rt=L_(R,o),rn=lo(JSON.stringify(Rt)),Lr={...Rt,context_budget:{tokens_used:rn,tokens_max:o}};return Bu.set(Lr,{files:j_({home:t.home,identityText:k,soulText:S,agentsText:U,userText:ae,bootstrapText:ve,payload:Lr}),memoryRecall:{query:i,limit:r.recallLimit,returned:c.length,mode:l.mode},cache:Vu(t.home,e.host)}),e.readOnly||await h({home:t.home,type:"bootstrap_created",details:{host:e.host,cwd:Le.resolve(e.cwd),project:s,tokens:rn}}),Lr}async function x_(e){if(!await A(e.database))return e.warnings.push("BOOTSTRAP_DATABASE_MISSING"),{memories:[],mode:"disabled"};let t=null;try{t=_(e.database,{readOnly:e.readOnly});let r=io({database:e.database,query:e.memoryQuery,project:e.project,limit:e.limit,readOnly:e.readOnly});return{memories:r.memories.length===0?t.recentMemories(e.project,e.limit):r.memories,mode:r.mode}}catch(r){return e.warnings.push(`BOOTSTRAP_DATABASE_UNAVAILABLE:${I_(r)}`),{memories:[],mode:"disabled"}}finally{t?.close()}}async function Xs(e){let t=await pt({home:e.home,host:e.host,cwd:e.cwd,query:e.query,tokensMax:e.tokensMax,readOnly:!0}),r=gr({host:e.host,payload:t,generatedAt:e.generatedAt}),o=Bu.get(t)??{files:[],memoryRecall:{limit:0,returned:t.relevant_memories.length,mode:"disabled"},cache:Vu(e.home??"",e.host)};return{host:e.host,cwd:Le.resolve(e.cwd),project:t.project,files:o.files,memoryRecall:o.memoryRecall,budget:{unit:"tokens",softMax:t.context_budget.tokens_max,hardMax:Uu,used:r.tokens_used},warnings:r.warnings,cache:o.cache,degraded:r.degraded}}function j_(e){return[go({home:e.home,relativePath:"IDENTITY.md",role:"identity",rawText:e.identityText,injectedText:Object.values(e.payload.identity).filter(t=>typeof t=="string").join(`
911
+ `),fallbackReason:"missing; default identity fields injected"}),go({home:e.home,relativePath:"SOUL.md",role:"soul_summary",rawText:e.soulText,injectedText:e.payload.soul_summary,fallbackReason:"missing; default soul summary injected"}),go({home:e.home,relativePath:"AGENTS.md",role:"agents_operating_summary",rawText:e.agentsText,injectedText:e.payload.agents_operating_summary,fallbackReason:"missing; default agent operating summary injected"}),go({home:e.home,relativePath:"USER.md",role:"user_preferences",rawText:e.userText,injectedText:e.payload.user.preferences_summary,fallbackReason:"missing; empty user-preferences fallback injected"}),go({home:e.home,relativePath:"BOOTSTRAP.md",role:"onboarding_bootstrap",rawText:e.bootstrapText,injectedText:"",fallbackReason:"missing; no onboarding bootstrap warning",presentReason:"omitted; used only to emit BOOTSTRAP_RITUAL_PENDING"})]}function go(e){let t=e.rawText.length,r=e.injectedText.length,o=t>0,n=r>0,a=o?e.presentReason??(r<t?"included; summarized to fit budget":"included"):e.fallbackReason;return{path:Le.join(e.home,e.relativePath),role:e.role,included:n,reason:a,rawChars:t,injectedChars:r,truncated:o&&n&&r<t,hash:o?E(e.rawText):null}}function Vu(e,t){let r=Le.join(e,"generated",t,"last-context.md");return{hit:P_(r),key:r}}function I_(e){return(e instanceof Error?e.message:String(e)).replace(/[^a-zA-Z0-9_.:-]+/g,"_").slice(0,120)}async function T_(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),n=t.match(/^\s*memory_query_seed:\s*["']?(.+?)["']?\s*$/mu),a=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:n?.[1]?.trim()||null,warnEmptyMemories:a?.[1]?.toLowerCase()==="true"}}function C_(e){return[e.explicitQuery,e.project,e.host,Le.basename(Le.resolve(e.cwd)),e.seed].filter(t=>typeof t=="string"&&t.trim().length>0).join(" ")}function O_(){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 N_(e){let t=e.trim();return t.length===0?"No curated user preferences yet.":t.length<=160?t:`${t.slice(0,157)}...`}async function M_(e,t,r=!1){let o=await Ee({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 a=Date.parse(n);if(!Number.isFinite(a))return!1;let s=1440*60*1e3;return Date.now()-a<=s}function L_(e,t){let r=[e,ut(e,1200,420,150),ut(e,900,320,130),ut(e,650,240,110),ut(e,420,180,90),ut(e,240,120,80),zs(ut(e,240,120,80),8,8),zs(ut(e,240,120,80),5,5),zs(ut(e,240,120,80),3,3)];return r.find(o=>lo(JSON.stringify(o))<=t)??r[r.length-1]??e}function zs(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 ut(e,t,r,o){return{...e,soul_summary:Cn(e.soul_summary,r),agents_operating_summary:Cn(e.agents_operating_summary,t),user:{...e.user,preferences_summary:Cn(e.user.preferences_summary,o)}}}import{existsSync as vi}from"node:fs";import Tp from"node:path";function Ys(e){let t={bootstrap:D_(e),mcp:H_(e),plugins_hooks:$_(e),heartbeat:F_(e),recall_auto_trigger:U_(e),memory_candidate_hooks:B_(e),memory_promotion_policy:V_(e),cross_host_verification:W_(e)},r=Object.values(t),o=J_(r),n=r.flatMap(s=>s.plan_actions),a=q_(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:a}}function Wu(e){return Ys(e).summary}function D_(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},[Ut("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 H_(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(_e),checked_hosts:e.hosts.map(_e)})}return $("mcp","not_configured","No MCP registration was detected for the selected host scope.",{checked_hosts:e.hosts.map(_e)},[Ut("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 $_(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(_e),hook_modes:Object.fromEntries(e.hosts.map(n=>[_e(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(_e)},[Ut("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 F_(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(_e),heartbeat_modes:Object.fromEntries(e.hosts.map(r=>[_e(r),r.provider_parity.heartbeat]))},[Ut("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(_e)}):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(_e)}):$("heartbeat","approval_required","Heartbeat profile is enabled, but no scheduler desired state is active yet.",{checked_hosts:e.hosts.map(_e)},[Ut("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 U_(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},[Ut("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 B_(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=>[_e(r),r.provider_parity.hooks]))})}function V_(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 W_(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},[Ut("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 Ut(e,t,r,o,n,a,s){return{id:e,component:t,status:r,action:o,target:n,dry_run:!0,requires_user_confirmed:a,reason:s}}function J_(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 q_(e,t,r){return{overall_status:t,profile:e?.profile??null,active:fo(r,"active"),not_configured:fo(r,"not_configured"),approval_required:fo(r,"approval_required"),blocked_by_host:fo(r,"blocked_by_host"),degraded:fo(r,"degraded"),full_native_claimed:!1}}function fo(e,t){return e.filter(r=>r.status===t).length}function _e(e){return e.surface==="default"?e.host:`${e.host}:${e.surface}`}import{existsSync as G_}from"node:fs";import K_ from"node:path";async function ho(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 a of o)await A(K_.join(t.home,a))||r.push({code:"MISSING_HUMAN_FILE",severity:"warn",message:`${a} is missing`,remediation:"Run nativesoul init"});if(!G_(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 a=_(t.database,{readOnly:!0});try{return a.integrityCheck()}finally{a.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(...z_(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(a=>a.severity!=="error"),integrity:n,issues:r}}function z_(e,t){let r=K(process.cwd(),e),o=_(t,{readOnly:!0});try{let n=new Set(o.listMemories({limit:200,includeForgotten:!0}).map(a=>a.scope.project).filter(a=>a!==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 Pe from"node:os";import z from"node:path";function Ju(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 qu(e){return e==="claude"?".claude.json":e==="gemini"?"settings.json":e==="antigravity"?"mcp_config.json":"mcp.json"}function yo(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 Ke(e,t){return t&&t!=="default"?[yo(e,t)]:e==="claude"?["claude-code","claude-desktop"]:["default"]}function Bt(e,t){return t==="default"?e:t}function Gu(e){switch(e){case"codex":return z.join(Pe.homedir(),".codex","AGENTS.md");case"claude":return z.join(Pe.homedir(),".claude","CLAUDE.md");case"grok":return z.join(Pe.homedir(),".grok","Agents.md");case"antigravity":case"gemini":return z.join(Pe.homedir(),".gemini","GEMINI.md")}}function Dn(e){switch(e){case"codex":return z.join(Pe.homedir(),".codex","mcp.json");case"claude":return z.join(Pe.homedir(),".claude.json");case"grok":return z.join(Pe.homedir(),".grok","mcp.json");case"antigravity":return z.join(Pe.homedir(),".gemini","antigravity-cli","mcp_config.json");case"gemini":return z.join(Pe.homedir(),".gemini","settings.json")}}function Ku(){return zu({platform:process.platform,home:Pe.homedir(),env:process.env})}function zu(e){let t=e.platform==="win32"?z.win32:z.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 Xu(e,t){if(e!=="claude")return null;if(!t)return z.join(Pe.homedir(),".claude","mcp.json");let r=z.resolve(t),o=z.dirname(r);return z.basename(o)==="claude"?z.join(o,"mcp.json"):z.join(o,".claude","mcp.json")}function Yu(e,t){return t?Eu(e):X_()}function X_(){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 Qu(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 Zu(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 Hn(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 pv}from"node:fs";import{readFile as mv,stat as gv}from"node:fs/promises";import jp from"node:path";import yr from"node:path";import{existsSync as ui}from"node:fs";import{cp as Fb,mkdir as Ub,rm as kp}from"node:fs/promises";import Bb from"node:path";import{existsSync as gt}from"node:fs";import{readFile as Gn}from"node:fs/promises";import ze from"node:path";import Y_ from"node:path";function fr(e){return e.split(/[\\/]/u).join("/")}function mt(e,t){return fr(Y_.relative(e,t))}function Vt(e){return fr(e)}import{existsSync as ep}from"node:fs";import Qs from"node:path";function $n(e){if(Qs.isAbsolute(e))return ep(e)?e:null;let t=(process.env.PATH??"").split(Qs.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 a=Qs.join(o,`${e}${n}`);if(ep(a))return a}return null}import{spawnSync as eb}from"node:child_process";import{existsSync as Wt}from"node:fs";import{mkdir as Un,readFile as Jt,writeFile as Bn}from"node:fs/promises";import tb from"node:os";import B from"node:path";import{existsSync as Q_}from"node:fs";import _o from"node:os";import oe from"node:path";import{fileURLToPath as Z_}from"node:url";function De(e,t,r){return bo(e,t)?r?oe.join(oe.resolve(r),e,"plugins","nativesoul"):e==="claude"?oe.join(_o.homedir(),".claude","plugins","nativesoul"):e==="codex"?oe.join(_o.homedir(),".codex","plugins","nativesoul"):e==="gemini"?oe.join(_o.homedir(),".gemini","extensions","nativesoul"):e==="grok"?oe.join(_o.homedir(),".grok","plugins","nativesoul"):e==="antigravity"?oe.join(_o.homedir(),".antigravity","plugins","nativesoul"):null:null}function bo(e,t){return e==="codex"||e==="gemini"||e==="grok"||e==="antigravity"||e==="claude"&&(t==="claude-code"||t==="claude-desktop")}function Fn(e,t){return e==="claude"?oe.join(t,".claude-plugin","plugin.json"):e==="gemini"?oe.join(t,"gemini-extension.json"):e==="grok"||e==="antigravity"?oe.join(t,"plugin.json"):oe.join(t,".codex-plugin","plugin.json")}function Zs(e){if(e!=="claude"&&e!=="codex"&&e!=="gemini"&&e!=="grok"&&e!=="antigravity")return null;let t=`${e}-nativesoul`,r=oe.dirname(Z_(import.meta.url));return[oe.resolve(process.cwd(),"plugins",t),oe.resolve(r,"../../../plugins",t),oe.resolve(r,"../../../../plugins",t)].find(n=>Q_(n))??null}var ti="nativesoul",Vn="nativesoul";async function rp(e){let t=B.join(e,"..","..","settings.json"),r=Wt(t)?JSON.parse(await Jt(t,"utf8")):{},o=r.hooks&&!Array.isArray(r.hooks)&&typeof r.hooks=="object"?{...r.hooks}:{},n=Vt(B.join(e,"shared","hooks","host-hook.cjs")),a={SessionStart:ko(`node ${JSON.stringify(n)} session-start --host claude --project-env CLAUDE_PROJECT_DIR`),UserPromptSubmit:ko(`node ${JSON.stringify(n)} prompt-bootstrap --host claude --project-env CLAUDE_PROJECT_DIR`),PreToolUse:ko(`node ${JSON.stringify(n)} pre-tool-use --host claude --project-env CLAUDE_PROJECT_DIR`),Stop:ko(`node ${JSON.stringify(n)} memory-flush --host claude --project-env CLAUDE_PROJECT_DIR`),PreCompact:ko(`node ${JSON.stringify(n)} memory-flush --host claude --project-env CLAUDE_PROJECT_DIR`)};for(let[s,i]of Object.entries(a))o[s]=dp(o[s]??null,i??null);await Un(B.dirname(t),{recursive:!0,mode:448}),await Bn(t,`${JSON.stringify({...r,hooks:o},null,2)}
912
+ `,"utf8")}async function op(e){let t=cp(e),r=Wt(t)?JSON.parse(await Jt(t,"utf8")):{},o=r.hooks&&!Array.isArray(r.hooks)&&typeof r.hooks=="object"?{...r.hooks}:{},n=Vt(B.join(e,"shared","hooks","host-hook.cjs")),a={SessionStart:vo(`node ${JSON.stringify(n)} session-start --host grok --project-env GROK_WORKSPACE_ROOT`),UserPromptSubmit:vo(`node ${JSON.stringify(n)} prompt-bootstrap --host grok --project-env GROK_WORKSPACE_ROOT`),PreToolUse:vo(`node ${JSON.stringify(n)} pre-tool-use --host grok --project-env GROK_WORKSPACE_ROOT`),Stop:vo(`node ${JSON.stringify(n)} memory-flush --host grok --project-env GROK_WORKSPACE_ROOT`),PreCompact:vo(`node ${JSON.stringify(n)} memory-flush --host grok --project-env GROK_WORKSPACE_ROOT`)};for(let[s,i]of Object.entries(a))o[s]=dp(o[s]??null,i??null);await Un(B.dirname(t),{recursive:!0,mode:448}),await Bn(t,`${JSON.stringify({...r,hooks:o},null,2)}
913
+ `,"utf8")}async function np(e){let t=oi(e),r=B.join(t,"agents",`${Vn}.md`),o=B.join(t,"config.toml");await Un(B.dirname(r),{recursive:!0,mode:448}),await Bn(r,lb(),{encoding:"utf8",mode:384});let n=Wt(o)?await Jt(o,"utf8"):"";await Un(B.dirname(o),{recursive:!0,mode:448}),await Bn(o,cb(n,"agent",`name = "${Vn}"`),"utf8")}function ap(e,t,r){if(t!=="default"||!sb(e,t,r))return[];if(e==="antigravity")return ei({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=ei({executableName:"grok",installArgs:a=>["plugin","install",a,"--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:rb},r),n=ei({executableName:"grok",installArgs:()=>["plugin","enable",ti],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:ob},r);return[...o,...n]}return[]}function ei(e,t){let r=$n(e.executableName);if(!r)return[{code:"HOST_PLUGIN_IMPORT_SKIPPED",severity:"warn",message:e.skippedMessage,remediation:e.skippedRemediation}];let o=eb(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 rb(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 ob(e){return/^Enabled plugin:/i.test(e)||/\balready enabled\b/i.test(e)}async function sp(e){let t=e?ib(e):B.join(tb.homedir(),".grok","config.toml");if(!Wt(t))return null;let r=await Jt(t,"utf8");return tp(r,"disabled",ti)?!1:tp(r,"enabled",ti)?!0:null}async function ip(e){let t=cp(e);if(!Wt(t))return!1;let r=JSON.parse(await Jt(t,"utf8"));return nb(r)}async function lp(e){let t=oi(e),r=B.join(t,"agents",`${Vn}.md`),o=B.join(t,"config.toml");if(!Wt(r)||!Wt(o))return!1;let[n,a]=await Promise.all([Jt(r,"utf8"),Jt(o,"utf8")]);return n.includes("NativeSoul continuity agent")&&db(a)===Vn}function tp(e,t,r){let a=(e.match(/\[plugins\][\s\S]*?(?=\n\[|$)/u)?.[0]??e).match(new RegExp(`${t}\\s*=\\s*\\[([^\\]]*)\\]`,"u"))?.[1];return a?a.split(",").some(s=>s.replace(/["'\s]/gu,"")===r):!1}function nb(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])=>ab(t,o,n))}function ab(e,t,r){let o=e[t];return Array.isArray(o)?o.some(n=>ri(n)?.includes(r)===!0):!1}function sb(e,t,r){let o=De(e,t);return o!==null&&B.resolve(o)===B.resolve(r)}function cp(e){return B.join(oi(e),"hooks","nativesoul.json")}function oi(e){return B.resolve(e,"..","..")}function ib(e){let t=B.resolve(e),r=B.basename(t);return r==="grok"||r===".grok"?B.join(t,"config.toml"):B.join(t,".grok","config.toml")}function vo(e){return{hooks:[{type:"command",command:e,timeout:9}]}}function lb(){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(`
914
914
  `)}function cb(e,t,r){let o=`[${t}]
915
915
  ${r.trim()}
916
916
  `,n=new RegExp(`(^|\\n)\\[${t}\\]\\n[\\s\\S]*?(?=\\n\\[|$)`,"u");return n.test(e)?e.replace(n,(a,s)=>`${s}${o.trimEnd()}`):`${e.trimEnd()}
917
917
 
918
- ${o}`.trimStart()}function db(e){return e.match(/\[agent\][\s\S]*?(?=\n\[|$)/u)?.[0]?.match(/\bname\s*=\s*["']([^"']+)["']/u)?.[1]??null}function ko(e){return{hooks:[{type:"command",command:e,timeout:9}]}}function dp(e,t){let r=Array.isArray(e)?e:[],o=ri(t);return o&&r.some(n=>ri(n)===o)?r:[...r,t]}function ri(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 ub from"node:path";var Wn=[{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"}],pb={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 wo(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 mb(e){return e==="grok"||e==="gemini"||e==="antigravity"?pb[e]:Wn}function ni(e){return e==="grok"||e==="gemini"?["hooks/hooks.json"]:e==="antigravity"?["hooks.json"]:[...new Set(Wn.map(t=>t.fileName).filter(t=>!!t))].map(t=>ub.join("hooks",t))}function up(e,t){return t==="official-extension"?typeof e.name=="string"&&e.name==="nativesoul":typeof e.name=="string"&&e.name.includes("nativesoul")}function pp(e,t){return ai(e,t).length===0}function ai(e,t){return mb(e).filter(({event:r,commandFragment:o})=>!gb(t,r,o)).map(({event:r})=>r)}function Ro(e){return e==="claude"||e==="codex"||e==="gemini"||e==="grok"||e==="antigravity"}function Jn(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 qn(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 gb(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(a=>{if(!a||Array.isArray(a)||typeof a!="object")return!1;let s=a.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"&&gr(l).includes(r)})})}async function ft(e){if(!e.targetPath||!bo(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=wo(e.host,e.surface),r=gt(e.targetPath),o=Fn(e.host,e.targetPath),n=gt(o),a=t.nativeHooksSupported&&e.targetPath?ni(e.host).filter(Z=>!gt(Xe.join(e.targetPath,Z))):ni(e.host),s=t.nativeHooksSupported?a.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 Z=JSON.parse(await Gn(o,"utf8")),ke=t.nativeHooksSupported?await fb(e.host,e.targetPath,Z):Z;if(l=t.nativeHooksSupported?e.host==="grok"?await ip(e.targetPath):pp(e.host,ke):up(Z,t.packageKind),c=!t.nativeHooksSupported||await hb({host:e.host,targetPath:e.targetPath,manifest:Z}),d=e.host==="grok"?await lp(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 Te=ai(e.host,ke);i.push({code:"PLUGIN_HOOK_MISSING",severity:"error",message:Te.length>0?`NativeSoul plugin manifest is missing required hook registrations: ${Te.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}: ${a.join(", ")}`,remediation:"Reinstall the NativeSoul plugin"});let p=e.targetPath?Xe.join(e.targetPath,"shared","hooks","lib.cjs"):null;r&&t.nativeHooksSupported&&(!p||!gt(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?Xe.resolve(Xe.dirname(Xe.dirname(e.targetPath))):void 0,y=!t.nativeHooksSupported||p!==null&&gt(p),k=t.nativeHooksSupported?s&&y:!0,R=r&&n&&l&&k&&c&&d,U=e.host==="grok"?await sp(g):null;return e.host==="grok"&&R&&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:R&&U!==!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 fb(e,t,r){let o=qn(e);if(o.length===0)return r;let n=mt(t,Fn(e,t)),a=o[0];if(!a||a===n)return r;let s=Xe.join(t,a);return gt(s)?JSON.parse(await Gn(s,"utf8")):{}}async function hb(e){let t=Jn(e.host),r=mt(e.targetPath,Fn(e.host,e.targetPath));if(t.length>0&&!t.includes(r)){for(let o of t){let n=Xe.join(e.targetPath,o);if(gt(n)&&si(JSON.parse(await Gn(n,"utf8"))))return!0}return!1}if(e.host==="codex"){let o=Xe.join(e.targetPath,".mcp.json");return gt(o)?si(JSON.parse(await Gn(o,"utf8"))):!1}return si(e.manifest)}function si(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"||$n(o)||o===process.execPath?!0:Array.isArray(n)&&n.some(a=>typeof a=="string"&&Xe.isAbsolute(a))}import{cp as yb,mkdir as _b,readFile as bb,readdir as vb}from"node:fs/promises";import ii from"node:path";async function li(e,t,r,o){let n=ii.join(e,"backups","plugins");await _b(n,{recursive:!0,mode:448});let a=ii.join(n,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-${t}-${r}-${T("plugin")}`);return await yb(o,a,{recursive:!0}),a}async function ci(e){let t=await fr(e),r=await Promise.all(t.map(async o=>{let n=mt(e,o),a=await bb(o,"utf8");return`${n}\0${A(a)}`}));return A(r.sort().join(`
919
- `))}async function fr(e){let t=await vb(e,{withFileTypes:!0});return(await Promise.all(t.map(async o=>{let n=ii.join(e,o.name);return o.isDirectory()?fr(n):o.isFile()?[n]:[]}))).flat()}import{existsSync as Ib}from"node:fs";import{cp as Tb,mkdir as Cb,readFile as di,writeFile as Ob}from"node:fs/promises";import Ye from"node:path";import{fileURLToPath as Nb}from"node:url";import{spawnSync as kb}from"node:child_process";import{accessSync as wb,constants as Rb,existsSync as mp}from"node:fs";import Jt from"node:path";function qt(e){let t=Sb(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:jb(e.host,n),warnings:[...t.warnings,...e.host==="generic"?[]:[`${e.host.toUpperCase()}_MCP_REGISTRATION_NOT_APPLIED`]]}}function Sb(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"?Ab(t):{command:"nativesoul-mcp",args:[],warnings:gp("nativesoul-mcp")?[]:["NATIVESOUL_MCP_COMMAND_NOT_ON_PATH"]}}function Ab(e){let t=Pb();if(t)return{command:t,args:[],warnings:[]};let r=gp("nativesoul-mcp");if(r)return{command:r,args:[],warnings:[]};let o=Eb(e);if(mp(o))return{command:process.execPath,args:[o],warnings:["NATIVESOUL_MCP_COMMAND_LOCAL_DIST"]};let n=xb();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 Eb(e){return Jt.join(e??process.cwd(),"dist","packages","mcp-server","src","index.js")}function Pb(){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 fp(r)?r:null}function gp(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 n of r){let a=Jt.join(o,`${e}${n}`);if(fp(a))return a}return null}function xb(){let e=kb("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 mp(r)?r:null}function fp(e){try{return wb(e,Rb.X_OK),!0}catch{return!1}}function jb(e,t){return e==="generic"?{mcpServers:{nativesoul:t}}:{host:e,review_only:!0,mcpServers:{nativesoul:t}}}async function hp(e,t,r,o){let n=await fr(e),a=await Promise.all(n.map(async i=>{let l=mt(e,i),c=await vp({host:t,relativePath:l,content:await di(i,"utf8"),home:r,targetPath:o});return`${l}\0${A(c)}`})),s=bp();if(s&&Ro(t)){let i=await fr(s);for(let l of i){let c=Ye.posix.join("shared","hooks",mt(s,l)),d=await di(l,"utf8");a.push(`${c}\0${A(d)}`)}}return A(a.sort().join(`
920
- `))}async function yp(e){let t=bp();if(!t)return;let r=Ye.join(e,"shared","hooks");await Cb(r,{recursive:!0,mode:448}),await Tb(t,r,{recursive:!0})}async function _p(e){let t=await fr(e.targetPath);await Promise.all(t.map(async r=>{let o=Ye.relative(e.targetPath,r),n=await di(r,"utf8"),a=await vp({host:e.host,relativePath:o,content:n,home:e.home,targetPath:e.targetPath});a!==n&&await Ob(r,a,"utf8")}))}function bp(){let e=Ye.dirname(Nb(import.meta.url));return[Ye.resolve(process.cwd(),"plugins","shared","hooks"),Ye.resolve(e,"../../../plugins/shared/hooks"),Ye.resolve(e,"../../../../plugins/shared/hooks")].find(r=>Ib(r))??null}async function vp(e){let t=gr(e.relativePath),r=Jn(e.host).includes(t),o=qn(e.host).includes(t);if(!r&&!o)return e.content;let n=JSON.parse(e.content),a=r?Mb(n,qt({host:e.host,commandMode:"package",home:e.home}).mcpServers.nativesoul):n,s=o&&e.targetPath&&Ro(e.host)?Lb(a,e.targetPath):a;return`${JSON.stringify(s,null,2)}
921
- `}function Mb(e,t){return{...e,mcpServers:{nativesoul:t}}}function Lb(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,a])=>Array.isArray(a)?[n,a.map(s=>Db(s,t))]:[n,a]));return{...e,hooks:o}}function Db(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=>Hb(n,t))}:e}function Hb(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=Bt(Ye.join(t,"shared","hooks","host-hook.cjs"));return{...r,command:`node ${JSON.stringify(s)} ${$b(o)}`}}let n=Wn.find(s=>o.includes(s.commandFragment));if(!n?.fileName)return e;let a=Bt(Ye.join(t,"hooks",n.fileName));return{...r,command:`node ${JSON.stringify(a)}`}}function $b(e){let t=["session-start","prompt-bootstrap","pre-tool-use","memory-flush","recall"].find(a=>e.includes(a))??"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(a=>a!==null).join(" ")}async function pi(e){let t=f(e.home),r=Zs(e.host);if(!e.targetPath||!r)return wp(e.host,e.surface,e.targetPath,r,!e.apply);let o=ui(e.targetPath)?await ci(e.targetPath):null,n=await hp(r,e.host,t.home,e.targetPath),a=o===null?"create":o===n?"noop":"replace",s=a!=="noop",i=s&&e.apply&&ui(e.targetPath)?await li(t.home,e.host,e.surface,e.targetPath):null,l=[];if(s&&e.apply&&(me(e.targetPath,{allowSymlinkTarget:!0}),await Ub(Bb.dirname(e.targetPath),{recursive:!0,mode:448}),await kp(e.targetPath,{recursive:!0,force:!0}),await Fb(r,e.targetPath,{recursive:!0}),Ro(e.host)&&await yp(e.targetPath),await _p({host:e.host,targetPath:e.targetPath,home:t.home})),e.apply){let g=gu(e.host);g==="claude-settings-hooks"?await rp(e.targetPath):g==="grok-host-wiring"&&(await op(e.targetPath),await np(e.targetPath))}e.apply&&l.push(...ap(e.host,e.surface,e.targetPath));let c=e.targetPath&&bo(e.host,e.surface)?await ft({host:e.host,surface:e.surface,targetPath:e.targetPath}):null,d=wo(e.host,e.surface),p={host:e.host,surface:e.surface,targetPath:e.targetPath,sourcePath:r,action:a,dryRun:!e.apply,changed:s,beforeHash:o,afterHash:n,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 h({home:t.home,type:e.apply?"plugin_install":"plugin_install_dry_run",details:p}),p}async function mi(e){let t=f(e.home),r=Zs(e.host);if(!e.targetPath||!r)return wp(e.host,e.surface,e.targetPath,r,!e.apply);let o=ui(e.targetPath)?await ci(e.targetPath):null,n=wo(e.host,e.surface),a=o!==null,s=a&&e.apply?await li(t.home,e.host,e.surface,e.targetPath):null;a&&e.apply&&await kp(e.targetPath,{recursive:!0,force:!0});let i={host:e.host,surface:e.surface,targetPath:e.targetPath,sourcePath:r,action:a?"remove":"noop",dryRun:!e.apply,changed:a,beforeHash:o,afterHash:A(""),backupPath:s,applied:a&&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 wp(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 Qe(e,t){if(t)return hr.resolve(t,e)}function yr(e,t,r){let o=yo(e,r);if(e==="claude"&&o==="claude-desktop")return{surface:o,managedBlock:null,mcpRegistration:t?hr.join(hr.resolve(t,e),"claude_desktop_config.json"):Ku(),plugin:He(e,o,t)};if(!t)return{surface:o,managedBlock:Gu(e),mcpRegistration:Dn(e),plugin:He(e,o)};let n=hr.resolve(t,e);return{surface:o,managedBlock:hr.join(n,Ju(e)),mcpRegistration:hr.join(n,qu(e)),plugin:He(e,o,t)}}import{accessSync as Vb,constants as Wb,existsSync as ht}from"node:fs";import{mkdir as Kn,readFile as _r,rm as Jb,writeFile as zn}from"node:fs/promises";import X from"node:path";async function Ao(e){let t=f(e.home),r=X.resolve(e.targetPath??Xn(e.host)),o=e.commandMode??"package",n=qt({host:e.host,commandMode:o,home:t.home,projectRoot:e.projectRoot}).mcpServers.nativesoul,a=ht(r),s=a?await _r(r,"utf8"):null,i=Ap(qb(So(s),n)),l=s===null?null:A(s),c=A(i),d=Qb(s,i),p=d!=="noop",g=p&&e.apply?await Ep(t.home,e.host,r,a,s,c):null;p&&e.apply&&(await Kn(X.dirname(r),{recursive:!0,mode:448}),await zn(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:Pp(s,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 fi(e){let t=f(e.home),r=X.resolve(e.targetPath??Xn(e.host)),o=ht(r),n=o?await _r(r,"utf8"):null,a=Gb(n),s=n===null?null:A(n),i=a===null?A(""):A(a),l=n!==a?"remove":"noop",c=l!=="noop",d=c&&e.apply?await Ep(t.home,e.host,r,o,n,i):null;c&&e.apply&&a!==null&&(await Kn(X.dirname(r),{recursive:!0,mode:448}),await zn(r,a,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:r,action:l,dryRun:!e.apply,changed:c,beforeHash:s,afterHash:i,diff:Pp(n,a),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 hi(e){let t=f(e.home),r=JSON.parse(await _r(e.snapshotPath,"utf8"));e.apply&&(r.beforeExists&&r.beforeContent!==null?(await Kn(X.dirname(r.targetPath),{recursive:!0,mode:448}),await zn(r.targetPath,r.beforeContent,{encoding:"utf8",mode:384})):ht(r.targetPath)&&await Jb(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 Eo(e){let t=X.resolve(e.targetPath??Xn(e.host)),r=Xu(e.host,e.targetPath),o=ht(t),n=[],a=await Kb(e.host,t,r);if(a&&n.push(a),!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 s=null;try{s=So(await _r(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=s?gi(s):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:[]}:zb(l,c,t):{ok:!1,issues:[]};return n.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:n}}function Xn(e){return Dn(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 qb(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 Gb(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,Ap({...t,mcpServers:o})}function gi(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 Kb(e,t,r){if(e!=="claude"||r===null||X.resolve(r)===t||!ht(r))return null;try{let o=So(await _r(r,"utf8")),n=gi(o);if(!n)return null;if(ht(t)){let a=So(await _r(t,"utf8")),s=gi(a);if(s&&JSON.stringify(Rp(s))===JSON.stringify(Rp(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 Rp(e){return{command:typeof e.command=="string"?e.command:null,args:Array.isArray(e.args)?e.args.filter(t=>typeof t=="string"):[]}}function zb(e,t,r){let o=[],n=Xb(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(Yb(e,n)){let a=t[0],s=a?X.isAbsolute(a)?a:X.resolve(X.dirname(r),a):null;if(!s||!ht(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 Xb(e){if(X.isAbsolute(e))return Sp(e)?e:null;let t=(process.env.PATH??"").split(X.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 a=X.join(o,`${e}${n}`);if(Sp(a))return a}return null}function Sp(e){if(process.platform==="win32"&&ht(e))return!0;try{return Vb(e,Wb.X_OK),!0}catch{return!1}}function Yb(e,t){let r=X.basename(e).toLowerCase(),o=X.basename(t).toLowerCase();return r==="node"||r==="node.exe"||o==="node"||o==="node.exe"}function Ap(e){return`${JSON.stringify(e,null,2)}
922
- `}function Qb(e,t){return e===t?"noop":e===null||e.trim().length===0?"create":"update"}async function Ep(e,t,r,o,n,a){let s=X.join(e,"backups","mcp-registration");await Kn(s,{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:a,createdAt:i},c=X.join(s,`${i.replaceAll(/[:.]/gu,"-")}-${t}.json`);return await zn(c,JSON.stringify(l,null,2),{encoding:"utf8",mode:384}),c}function Pp(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(`
923
- `)}async function yt(e){let t=await v(e.home),r=e.surface??null,o=yo(e.host,r),n=e.hostConfigRoot??(e.targetRoot?Qe(e.host,e.targetRoot):void 0),a=await rv({host:e.host,surface:o,targetRoot:e.targetRoot,explicit:e.pluginEnabled}),s=new Date().toISOString(),i=ev(e.mode,r,e.heartbeat),l=await jt(e.host).scheduleReconcile({kind:"heartbeat",mode:e.mode,enabled:!0,surface:e.surface??void 0,apply:e.apply,hostConfigRoot:n,desired:i}),c={id:ov(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?Zb(t.database,c):c,p={dryRun:!e.apply,applied:e.apply,schedule:d,adapter_result:l,warnings:tv(e.host,l.status,a)};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 Po(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await S(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 yi(e){let t=await v(e.home),r=_(t.database),o,n;try{if(o=r.listSchedules({limit:200}).find(a=>a.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 Zb(e,t){let r=_(e);try{return r.upsertSchedule(t)}finally{r.close()}}function ev(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 tv(e,t,r){return t!=="unsupported"?[]:ro(e)?r===!1?["NATIVE_SCHEDULE_UNSUPPORTED_NO_FALLBACK_INSTALLED"]:["NATIVE_SCHEDULE_UNSUPPORTED"]:[]}async function rv(e){if(e.explicit!==void 0)return e.explicit;try{let t=He(e.host,e.surface,e.targetRoot);return(await ft({host:e.host,surface:e.surface,targetPath:t})).enabled}catch{return!1}}function ov(e,t){return mu(e)&&t&&t!=="default"?`schedule:${e}:heartbeat:${t}`:`schedule:${e}:heartbeat`}function _i(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,a=e.schedules.some(y=>av(y,t)),s=cv(e.capabilities,e.adapterDiagnostics),i=[xo("native_package",r,t,e.plugin.targetPath??e.plugin.package_kind,"Native package/extension is not installed or enabled."),xo("native_hooks",o,t,e.plugin.targetPath??e.plugin.package_kind,"Native lifecycle hook registration is missing."),xo("mcp",n,t,e.mcpRegistration.targetPath,"MCP registration is missing or invalid."),xo("native_scheduler",a,t,iv(e.schedules),dv(e.host,e.schedules)),xo("official_inventory",s,t,lv(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=!s,p=l.includes("native_scheduler")&&xp(e.host),g=l.length===0;return{schema_version:1,host:e.host,surface:e.surface,status:uv({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 bi(e){return e.ready&&e.native_kind.includes("native")&&(e.schema_hash?.startsWith("full-native:")===!0||e.source.includes("full-native-evidence:"))}function xo(e,t,r,o,n){return{requirement:e,satisfied:t,evidence:t?[{source_kind:"doctor",reference:o,observed_at:r,confidence:nv(o)}]:[],missing_reason:t?null:n}}function nv(e){return e.startsWith("not-applicable:")||e==="missing"?"low":"medium"}function av(e,t){return e.enabled&&e.native_schedule_supported&&e.native_id!==null&&!sv(e.updated_at,t)}function sv(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 iv(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 lv(e){return e.find(t=>t.ready)?.source??"missing"}function cv(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 dv(e,t){return xp(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 xp(e){return e==="codex"||e==="claude"||e==="grok"||e==="gemini"||e==="antigravity"}function uv(e){return e.fullNative?"full_native":e.blockedByHost?"blocked_by_host":e.degradedScan?"degraded_scan":e.ready?"ready_fallback":"ready"}async function Ip(e){let t=yr(e.host,e.targetRoot,e.surface),r=t.managedBlock??`not-applicable:${Ut(e.host,e.surface)}`,o=t.managedBlock?await Xd({host:e.host,targetPath:r}):wv(e.host,e.surface),n=await Eo({host:e.host,targetPath:t.mcpRegistration,checkCommand:e.targetRoot===void 0}),a=await ft({host:e.host,surface:e.surface,targetPath:t.plugin}),s=await Ws({home:e.home,host:e.host}),l=(e.databaseExists?await Po({home:e.home,host:e.host,limit:200,readOnly:!0}):[]).filter(x=>fv(e.host,e.surface,x)),c=e.databaseExists?await Ee({home:e.home,host:e.host,limit:100,readOnly:!0}):[],d=e.databaseExists?Hn(f(e.home).database):[],p=e.targetRoot!==void 0,g=p?[]:(await qr(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=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 _v({host:e.host,managedBlock:o,handshake:s}),U=await bv(e.host),Z=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`})),ke=l.filter(x=>x.enabled&&!x.native_schedule_supported&&!a.enabled&&a.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`})),Te=yv({managedBlock:o,mcpRegistration:n,plugin:a,schedules:l,capabilities:c}),se=_i({host:e.host,surface:e.surface,mcpRegistration:n,plugin:a,schedules:l,capabilities:c,adapterDiagnostics:g}),Be=[...o.issues,...n.issues,...a.issues,...g,...y,...k,...R,...U,...Z,...ke];return{host:e.host,surface:e.surface,status:Be.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:a,provider_parity:Te,full_native_evidence:se,handshake:s,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:Be}}function fv(e,t,r){return e!=="claude"?!0:hv(r.desired)===t}function hv(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 yv(e){let t=e.plugin.enabled,r=e.mcpRegistration.configured,o=e.managedBlock.configured||t,n=e.schedules.some(p=>p.enabled),s=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"&&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 _v(e){if(!e.managedBlock.configured||e.managedBlock.targetPath.startsWith("not-applicable:"))return[];let t=10080*60*1e3,r=await kv(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 bv(e){let t=vv(e).map(r=>jp.resolve(process.cwd(),r));for(let r of t){if(!pv(r))continue;let o=await mv(r,"utf8"),n=lo(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 vv(e){switch(e){case"claude":return["CLAUDE.md",jp.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 kv(e){try{let t=await gv(e);return Math.max(Date.now()-t.mtimeMs,0)}catch{return null}}function wv(e,t){return{host:e,targetPath:`not-applicable:${Ut(e,t)}`,target_exists:!1,configured:!0,markers_valid:!0,issues:[]}}async function Gt(e){let t=f(e.home),r=await ho(e.home),o=vi(t.database),n=Ge(e.host),a=[],s=o?Hn(t.database):[],i=Yu(t.database,o),l=await it(t.home),c=vi(In(t.home)),d=vi(cr(t.home));for(let y of n)for(let k of ze(y,e.surface))a.push(await Ip({home:t.home,host:y,surface:k,targetRoot:e.targetRoot,databaseExists:o}));let p=[...r.issues,...Qu(i),...a.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?Tp.resolve(e.targetRoot):null,cross_host_inventory:Zu(s),activation_summary:Wu({home:t.home,targetRoot:e.targetRoot?Tp.resolve(e.targetRoot):null,host:e.host,profile:l,onboardingComplete:c,activationComplete:d,hosts:a}),full_native_matrix:Rv(a),semantic_index:i,hosts:a,issues:p}}function Rv(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 Sv}from"node:fs";import{mkdir as Av,readdir as Ev,readFile as Pv,writeFile as xv}from"node:fs/promises";import jo from"node:path";async function ki(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),a=await jv(r.home,r.database,o,n),s=Tv(o,a,n),i=Nv({applied:t,project:o,proposals:s,dailyNotes:a.dailyNotes,candidates:a.candidates,activeMemories:a.activeMemories,auditEvents:a.auditEvents}),l=null;return t&&(l=await Cv(r.home,i),await Ov(r.home,s),await h({home:r.home,type:"memory_reflection_run",details:{project:o,proposal_count:s.length,report_path:l,daily_notes:a.dailyNotes.length,candidates:a.candidates.length,active_memories:a.activeMemories.length,audit_events:a.auditEvents.length}})),{applied:t,home:r.home,project:o,report:i,report_path:l,proposals:s,sources:{daily_notes:a.dailyNotes.length,candidates:a.candidates.length,active_memories:a.activeMemories.length,audit_events:a.auditEvents.length},protected_files:["SOUL.md","POLICY.md","standing-orders"].map(c=>({path:jo.join(r.home,c),modified:!1}))}}async function jv(e,t,r,o){let n=await Iv(e,o);if(!Sv(t))return{dailyNotes:n,candidates:[],activeMemories:[],auditEvents:[]};let a=_(t,{readOnly:!0});try{return{dailyNotes:n,candidates:a.listMemories({project:r,status:"candidate",includeForgotten:!1,limit:o}),activeMemories:a.listMemories({project:r,status:"active",includeForgotten:!1,limit:Math.max(o,20)}),auditEvents:a.listEvents({limit:Math.max(o,20)})}}finally{a.close()}}async function Iv(e,t){let r=jo.join(e,"memory","daily");if(!await S(r))return[];let n=(await Ev(r,{withFileTypes:!0})).filter(s=>s.isFile()&&s.name.endsWith(".md")).map(s=>s.name).sort().reverse().slice(0,t),a=[];for(let s of n){let i=jo.join(r,s),l=N(await Pv(i,"utf8")).value.trim();l.length>0&&a.push({id:`daily:${s}`,path:i,text:l})}return a}function Tv(e,t,r){let o=[];for(let n of t.candidates){let a=Cp(n.content,t.activeMemories),s=Lv(n.content,t.activeMemories);if(s){o.push(br({action:"flag_conflict",project:e,summary:`Review conflict between ${n.id} and ${s.id}`,before:s.summary,after:n.summary,evidence:[n.id,s.id],risk:"high"}));continue}if(a&&a.score>=.7){o.push(br({action:"deduplicate",project:e,summary:`Reject or merge duplicate candidate ${n.id}`,before:a.memory.summary,after:n.summary,evidence:[n.id,a.memory.id],risk:"medium"}));continue}o.push(br({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 a=Mv(n.text);for(let s of a){if(o.length>=r)return o;let i=Cp(s,[...t.activeMemories,...t.candidates]);i&&i.score>=.7?o.push(br({action:"deduplicate",project:e,summary:`Daily note repeats existing memory ${i.memory.id}`,before:i.memory.summary,after:Ke(s),evidence:[n.id,i.memory.id],risk:"medium"})):o.push(br({action:"create_candidate",project:e,summary:Ke(s),before:"No durable memory exists for this daily note.",after:s,evidence:[n.id],risk:"low"}))}}for(let n of t.activeMemories)if(n.expires_at&&Date.parse(n.expires_at)<=Date.now()&&o.push(br({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 br(e){return{id:T("reflection"),persisted_memory_id:null,...e}}async function Cv(e,t){let r=jo.join(e,"proposals");await Av(r,{recursive:!0,mode:448});let o=jo.join(r,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-reflection.md`);return await xv(o,t,{encoding:"utf8",mode:384,flag:"wx"}),o}async function Ov(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(`
918
+ ${o}`.trimStart()}function db(e){return e.match(/\[agent\][\s\S]*?(?=\n\[|$)/u)?.[0]?.match(/\bname\s*=\s*["']([^"']+)["']/u)?.[1]??null}function ko(e){return{hooks:[{type:"command",command:e,timeout:9}]}}function dp(e,t){let r=Array.isArray(e)?e:[],o=ri(t);return o&&r.some(n=>ri(n)===o)?r:[...r,t]}function ri(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 ub from"node:path";var Wn=[{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"}],pb={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 wo(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 mb(e){return e==="grok"||e==="gemini"||e==="antigravity"?pb[e]:Wn}function ni(e){return e==="grok"||e==="gemini"?["hooks/hooks.json"]:e==="antigravity"?["hooks.json"]:[...new Set(Wn.map(t=>t.fileName).filter(t=>!!t))].map(t=>ub.join("hooks",t))}function up(e,t){return t==="official-extension"?typeof e.name=="string"&&e.name==="nativesoul":typeof e.name=="string"&&e.name.includes("nativesoul")}function pp(e,t){return ai(e,t).length===0}function ai(e,t){return mb(e).filter(({event:r,commandFragment:o})=>!gb(t,r,o)).map(({event:r})=>r)}function So(e){return e==="claude"||e==="codex"||e==="gemini"||e==="grok"||e==="antigravity"}function Jn(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 qn(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 gb(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(a=>{if(!a||Array.isArray(a)||typeof a!="object")return!1;let s=a.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"&&fr(l).includes(r)})})}async function ft(e){if(!e.targetPath||!bo(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=wo(e.host,e.surface),r=gt(e.targetPath),o=Fn(e.host,e.targetPath),n=gt(o),a=t.nativeHooksSupported&&e.targetPath?ni(e.host).filter(ae=>!gt(ze.join(e.targetPath,ae))):ni(e.host),s=t.nativeHooksSupported?a.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 ae=JSON.parse(await Gn(o,"utf8")),ve=t.nativeHooksSupported?await fb(e.host,e.targetPath,ae):ae;if(l=t.nativeHooksSupported?e.host==="grok"?await ip(e.targetPath):pp(e.host,ve):up(ae,t.packageKind),c=!t.nativeHooksSupported||await hb({host:e.host,targetPath:e.targetPath,manifest:ae}),d=e.host==="grok"?await lp(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 ke=ai(e.host,ve);i.push({code:"PLUGIN_HOOK_MISSING",severity:"error",message:ke.length>0?`NativeSoul plugin manifest is missing required hook registrations: ${ke.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}: ${a.join(", ")}`,remediation:"Reinstall the NativeSoul plugin"});let p=e.targetPath?ze.join(e.targetPath,"shared","hooks","lib.cjs"):null;r&&t.nativeHooksSupported&&(!p||!gt(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?ze.resolve(ze.dirname(ze.dirname(e.targetPath))):void 0,y=!t.nativeHooksSupported||p!==null&&gt(p),k=t.nativeHooksSupported?s&&y:!0,S=r&&n&&l&&k&&c&&d,U=e.host==="grok"?await sp(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&&s:!1,package_kind:t.packageKind,native_hooks_supported:t.nativeHooksSupported,native_scheduler_supported:!1,issues:i}}async function fb(e,t,r){let o=qn(e);if(o.length===0)return r;let n=mt(t,Fn(e,t)),a=o[0];if(!a||a===n)return r;let s=ze.join(t,a);return gt(s)?JSON.parse(await Gn(s,"utf8")):{}}async function hb(e){let t=Jn(e.host),r=mt(e.targetPath,Fn(e.host,e.targetPath));if(t.length>0&&!t.includes(r)){for(let o of t){let n=ze.join(e.targetPath,o);if(gt(n)&&si(JSON.parse(await Gn(n,"utf8"))))return!0}return!1}if(e.host==="codex"){let o=ze.join(e.targetPath,".mcp.json");return gt(o)?si(JSON.parse(await Gn(o,"utf8"))):!1}return si(e.manifest)}function si(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"||$n(o)||o===process.execPath?!0:Array.isArray(n)&&n.some(a=>typeof a=="string"&&ze.isAbsolute(a))}import{cp as yb,mkdir as _b,readFile as bb,readdir as vb}from"node:fs/promises";import ii from"node:path";async function li(e,t,r,o){let n=ii.join(e,"backups","plugins");await _b(n,{recursive:!0,mode:448});let a=ii.join(n,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-${t}-${r}-${T("plugin")}`);return await yb(o,a,{recursive:!0}),a}async function ci(e){let t=await hr(e),r=await Promise.all(t.map(async o=>{let n=mt(e,o),a=await bb(o,"utf8");return`${n}\0${E(a)}`}));return E(r.sort().join(`
919
+ `))}async function hr(e){let t=await vb(e,{withFileTypes:!0});return(await Promise.all(t.map(async o=>{let n=ii.join(e,o.name);return o.isDirectory()?hr(n):o.isFile()?[n]:[]}))).flat()}import{existsSync as Ib}from"node:fs";import{cp as Tb,mkdir as Cb,readFile as di,writeFile as Ob}from"node:fs/promises";import Xe from"node:path";import{fileURLToPath as Nb}from"node:url";import{spawnSync as kb}from"node:child_process";import{accessSync as wb,constants as Sb,existsSync as mp}from"node:fs";import qt from"node:path";function Gt(e){let t=Rb(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:jb(e.host,n),warnings:[...t.warnings,...e.host==="generic"?[]:[`${e.host.toUpperCase()}_MCP_REGISTRATION_NOT_APPLIED`]]}}function Rb(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:[qt.join(t??process.cwd(),"dist","packages","mcp-server","src","index.js")],warnings:[]}:e==="absolute"?Ab(t):{command:"nativesoul-mcp",args:[],warnings:gp("nativesoul-mcp")?[]:["NATIVESOUL_MCP_COMMAND_NOT_ON_PATH"]}}function Ab(e){let t=Pb();if(t)return{command:t,args:[],warnings:[]};let r=gp("nativesoul-mcp");if(r)return{command:r,args:[],warnings:[]};let o=Eb(e);if(mp(o))return{command:process.execPath,args:[o],warnings:["NATIVESOUL_MCP_COMMAND_LOCAL_DIST"]};let n=xb();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 Eb(e){return qt.join(e??process.cwd(),"dist","packages","mcp-server","src","index.js")}function Pb(){let e=process.argv[1];if(!e)return null;let t=process.platform==="win32"?".cmd":"",r=qt.join(qt.dirname(e),`nativesoul-mcp${t}`);return fp(r)?r:null}function gp(e){let t=(process.env.PATH??"").split(qt.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 a=qt.join(o,`${e}${n}`);if(fp(a))return a}return null}function xb(){let e=kb("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=qt.join(t,"nativesoul","dist","packages","mcp-server","src","index.js");return mp(r)?r:null}function fp(e){try{return wb(e,Sb.X_OK),!0}catch{return!1}}function jb(e,t){return e==="generic"?{mcpServers:{nativesoul:t}}:{host:e,review_only:!0,mcpServers:{nativesoul:t}}}async function hp(e,t,r,o){let n=await hr(e),a=await Promise.all(n.map(async i=>{let l=mt(e,i),c=await vp({host:t,relativePath:l,content:await di(i,"utf8"),home:r,targetPath:o});return`${l}\0${E(c)}`})),s=bp();if(s&&So(t)){let i=await hr(s);for(let l of i){let c=Xe.posix.join("shared","hooks",mt(s,l)),d=await di(l,"utf8");a.push(`${c}\0${E(d)}`)}}return E(a.sort().join(`
920
+ `))}async function yp(e){let t=bp();if(!t)return;let r=Xe.join(e,"shared","hooks");await Cb(r,{recursive:!0,mode:448}),await Tb(t,r,{recursive:!0})}async function _p(e){let t=await hr(e.targetPath);await Promise.all(t.map(async r=>{let o=Xe.relative(e.targetPath,r),n=await di(r,"utf8"),a=await vp({host:e.host,relativePath:o,content:n,home:e.home,targetPath:e.targetPath});a!==n&&await Ob(r,a,"utf8")}))}function bp(){let e=Xe.dirname(Nb(import.meta.url));return[Xe.resolve(process.cwd(),"plugins","shared","hooks"),Xe.resolve(e,"../../../plugins/shared/hooks"),Xe.resolve(e,"../../../../plugins/shared/hooks")].find(r=>Ib(r))??null}async function vp(e){let t=fr(e.relativePath),r=Jn(e.host).includes(t),o=qn(e.host).includes(t);if(!r&&!o)return e.content;let n=JSON.parse(e.content),a=r?Mb(n,Gt({host:e.host,commandMode:"package",home:e.home}).mcpServers.nativesoul):n,s=o&&e.targetPath&&So(e.host)?Lb(a,e.targetPath):a;return`${JSON.stringify(s,null,2)}
921
+ `}function Mb(e,t){return{...e,mcpServers:{nativesoul:t}}}function Lb(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,a])=>Array.isArray(a)?[n,a.map(s=>Db(s,t))]:[n,a]));return{...e,hooks:o}}function Db(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=>Hb(n,t))}:e}function Hb(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=Vt(Xe.join(t,"shared","hooks","host-hook.cjs"));return{...r,command:`node ${JSON.stringify(s)} ${$b(o)}`}}let n=Wn.find(s=>o.includes(s.commandFragment));if(!n?.fileName)return e;let a=Vt(Xe.join(t,"hooks",n.fileName));return{...r,command:`node ${JSON.stringify(a)}`}}function $b(e){let t=["session-start","prompt-bootstrap","pre-tool-use","memory-flush","recall"].find(a=>e.includes(a))??"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(a=>a!==null).join(" ")}async function pi(e){let t=f(e.home),r=Zs(e.host);if(!e.targetPath||!r)return wp(e.host,e.surface,e.targetPath,r,!e.apply);let o=ui(e.targetPath)?await ci(e.targetPath):null,n=await hp(r,e.host,t.home,e.targetPath),a=o===null?"create":o===n?"noop":"replace",s=a!=="noop",i=s&&e.apply&&ui(e.targetPath)?await li(t.home,e.host,e.surface,e.targetPath):null,l=[];if(s&&e.apply&&(pe(e.targetPath,{allowSymlinkTarget:!0}),await Ub(Bb.dirname(e.targetPath),{recursive:!0,mode:448}),await kp(e.targetPath,{recursive:!0,force:!0}),await Fb(r,e.targetPath,{recursive:!0}),So(e.host)&&await yp(e.targetPath),await _p({host:e.host,targetPath:e.targetPath,home:t.home})),e.apply){let g=gu(e.host);g==="claude-settings-hooks"?await rp(e.targetPath):g==="grok-host-wiring"&&(await op(e.targetPath),await np(e.targetPath))}e.apply&&l.push(...ap(e.host,e.surface,e.targetPath));let c=e.targetPath&&bo(e.host,e.surface)?await ft({host:e.host,surface:e.surface,targetPath:e.targetPath}):null,d=wo(e.host,e.surface),p={host:e.host,surface:e.surface,targetPath:e.targetPath,sourcePath:r,action:a,dryRun:!e.apply,changed:s,beforeHash:o,afterHash:n,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 h({home:t.home,type:e.apply?"plugin_install":"plugin_install_dry_run",details:p}),p}async function mi(e){let t=f(e.home),r=Zs(e.host);if(!e.targetPath||!r)return wp(e.host,e.surface,e.targetPath,r,!e.apply);let o=ui(e.targetPath)?await ci(e.targetPath):null,n=wo(e.host,e.surface),a=o!==null,s=a&&e.apply?await li(t.home,e.host,e.surface,e.targetPath):null;a&&e.apply&&await kp(e.targetPath,{recursive:!0,force:!0});let i={host:e.host,surface:e.surface,targetPath:e.targetPath,sourcePath:r,action:a?"remove":"noop",dryRun:!e.apply,changed:a,beforeHash:o,afterHash:E(""),backupPath:s,applied:a&&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 wp(e,t,r,o,n){return{host:e,surface:t,targetPath:r,sourcePath:o,action:"unsupported",dryRun:n,changed:!1,beforeHash:null,afterHash:E(""),backupPath:null,applied:!1,enabled:!1,hook_registered:!1,package_kind:"unsupported-native",native_hooks_supported:!1,native_scheduler_supported:!1,issues:[]}}function Ye(e,t){if(t)return yr.resolve(t,e)}function _r(e,t,r){let o=yo(e,r);if(e==="claude"&&o==="claude-desktop")return{surface:o,managedBlock:null,mcpRegistration:t?yr.join(yr.resolve(t,e),"claude_desktop_config.json"):Ku(),plugin:De(e,o,t)};if(!t)return{surface:o,managedBlock:Gu(e),mcpRegistration:Dn(e),plugin:De(e,o)};let n=yr.resolve(t,e);return{surface:o,managedBlock:yr.join(n,Ju(e)),mcpRegistration:yr.join(n,qu(e)),plugin:De(e,o,t)}}import{accessSync as Vb,constants as Wb,existsSync as ht}from"node:fs";import{mkdir as Kn,readFile as br,rm as Jb,writeFile as zn}from"node:fs/promises";import X from"node:path";async function Ao(e){let t=f(e.home),r=X.resolve(e.targetPath??Xn(e.host)),o=e.commandMode??"package",n=Gt({host:e.host,commandMode:o,home:t.home,projectRoot:e.projectRoot}).mcpServers.nativesoul,a=ht(r),s=a?await br(r,"utf8"):null,i=Ap(qb(Ro(s),n)),l=s===null?null:E(s),c=E(i),d=Qb(s,i),p=d!=="noop",g=p&&e.apply?await Ep(t.home,e.host,r,a,s,c):null;p&&e.apply&&(await Kn(X.dirname(r),{recursive:!0,mode:448}),await zn(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:Pp(s,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 fi(e){let t=f(e.home),r=X.resolve(e.targetPath??Xn(e.host)),o=ht(r),n=o?await br(r,"utf8"):null,a=Gb(n),s=n===null?null:E(n),i=a===null?E(""):E(a),l=n!==a?"remove":"noop",c=l!=="noop",d=c&&e.apply?await Ep(t.home,e.host,r,o,n,i):null;c&&e.apply&&a!==null&&(await Kn(X.dirname(r),{recursive:!0,mode:448}),await zn(r,a,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:r,action:l,dryRun:!e.apply,changed:c,beforeHash:s,afterHash:i,diff:Pp(n,a),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 hi(e){let t=f(e.home),r=JSON.parse(await br(e.snapshotPath,"utf8"));e.apply&&(r.beforeExists&&r.beforeContent!==null?(await Kn(X.dirname(r.targetPath),{recursive:!0,mode:448}),await zn(r.targetPath,r.beforeContent,{encoding:"utf8",mode:384})):ht(r.targetPath)&&await Jb(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 Eo(e){let t=X.resolve(e.targetPath??Xn(e.host)),r=Xu(e.host,e.targetPath),o=ht(t),n=[],a=await Kb(e.host,t,r);if(a&&n.push(a),!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 s=null;try{s=Ro(await br(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=s?gi(s):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:[]}:zb(l,c,t):{ok:!1,issues:[]};return n.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:n}}function Xn(e){return Dn(e)}function Ro(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 qb(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 Gb(e){if(e===null)return null;let t=Ro(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,Ap({...t,mcpServers:o})}function gi(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 Kb(e,t,r){if(e!=="claude"||r===null||X.resolve(r)===t||!ht(r))return null;try{let o=Ro(await br(r,"utf8")),n=gi(o);if(!n)return null;if(ht(t)){let a=Ro(await br(t,"utf8")),s=gi(a);if(s&&JSON.stringify(Sp(s))===JSON.stringify(Sp(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 Sp(e){return{command:typeof e.command=="string"?e.command:null,args:Array.isArray(e.args)?e.args.filter(t=>typeof t=="string"):[]}}function zb(e,t,r){let o=[],n=Xb(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(Yb(e,n)){let a=t[0],s=a?X.isAbsolute(a)?a:X.resolve(X.dirname(r),a):null;if(!s||!ht(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 Xb(e){if(X.isAbsolute(e))return Rp(e)?e:null;let t=(process.env.PATH??"").split(X.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 a=X.join(o,`${e}${n}`);if(Rp(a))return a}return null}function Rp(e){if(process.platform==="win32"&&ht(e))return!0;try{return Vb(e,Wb.X_OK),!0}catch{return!1}}function Yb(e,t){let r=X.basename(e).toLowerCase(),o=X.basename(t).toLowerCase();return r==="node"||r==="node.exe"||o==="node"||o==="node.exe"}function Ap(e){return`${JSON.stringify(e,null,2)}
922
+ `}function Qb(e,t){return e===t?"noop":e===null||e.trim().length===0?"create":"update"}async function Ep(e,t,r,o,n,a){let s=X.join(e,"backups","mcp-registration");await Kn(s,{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:E(n),afterHash:a,createdAt:i},c=X.join(s,`${i.replaceAll(/[:.]/gu,"-")}-${t}.json`);return await zn(c,JSON.stringify(l,null,2),{encoding:"utf8",mode:384}),c}function Pp(e,t){return e===t?"No changes.":[`before: ${e===null?"missing":E(e)}`,`after: ${t===null?"missing":E(t)}`,`lines_before: ${e===null?0:e.split(/\r?\n/u).length}`,`lines_after: ${t===null?0:t.split(/\r?\n/u).length}`].join(`
923
+ `)}async function yt(e){let t=await v(e.home),r=e.surface??null,o=yo(e.host,r),n=e.hostConfigRoot??(e.targetRoot?Ye(e.host,e.targetRoot):void 0),a=await rv({host:e.host,surface:o,targetRoot:e.targetRoot,explicit:e.pluginEnabled}),s=new Date().toISOString(),i=ev(e.mode,r,e.heartbeat),l=await It(e.host).scheduleReconcile({kind:"heartbeat",mode:e.mode,enabled:!0,surface:e.surface??void 0,apply:e.apply,hostConfigRoot:n,desired:i}),c={id:ov(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?Zb(t.database,c):c,p={dryRun:!e.apply,applied:e.apply,schedule:d,adapter_result:l,warnings:tv(e.host,l.status,a)};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 Po(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await A(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 yi(e){let t=await v(e.home),r=_(t.database),o,n;try{if(o=r.listSchedules({limit:200}).find(a=>a.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 Zb(e,t){let r=_(e);try{return r.upsertSchedule(t)}finally{r.close()}}function ev(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 tv(e,t,r){return t!=="unsupported"?[]:ro(e)?r===!1?["NATIVE_SCHEDULE_UNSUPPORTED_NO_FALLBACK_INSTALLED"]:["NATIVE_SCHEDULE_UNSUPPORTED"]:[]}async function rv(e){if(e.explicit!==void 0)return e.explicit;try{let t=De(e.host,e.surface,e.targetRoot);return(await ft({host:e.host,surface:e.surface,targetPath:t})).enabled}catch{return!1}}function ov(e,t){return mu(e)&&t&&t!=="default"?`schedule:${e}:heartbeat:${t}`:`schedule:${e}:heartbeat`}function _i(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,a=e.schedules.some(y=>av(y,t)),s=cv(e.capabilities,e.adapterDiagnostics),i=[xo("native_package",r,t,e.plugin.targetPath??e.plugin.package_kind,"Native package/extension is not installed or enabled."),xo("native_hooks",o,t,e.plugin.targetPath??e.plugin.package_kind,"Native lifecycle hook registration is missing."),xo("mcp",n,t,e.mcpRegistration.targetPath,"MCP registration is missing or invalid."),xo("native_scheduler",a,t,iv(e.schedules),dv(e.host,e.schedules)),xo("official_inventory",s,t,lv(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=!s,p=l.includes("native_scheduler")&&xp(e.host),g=l.length===0;return{schema_version:1,host:e.host,surface:e.surface,status:uv({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 bi(e){return e.ready&&e.native_kind.includes("native")&&(e.schema_hash?.startsWith("full-native:")===!0||e.source.includes("full-native-evidence:"))}function xo(e,t,r,o,n){return{requirement:e,satisfied:t,evidence:t?[{source_kind:"doctor",reference:o,observed_at:r,confidence:nv(o)}]:[],missing_reason:t?null:n}}function nv(e){return e.startsWith("not-applicable:")||e==="missing"?"low":"medium"}function av(e,t){return e.enabled&&e.native_schedule_supported&&e.native_id!==null&&!sv(e.updated_at,t)}function sv(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 iv(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 lv(e){return e.find(t=>t.ready)?.source??"missing"}function cv(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 dv(e,t){return xp(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 xp(e){return e==="codex"||e==="claude"||e==="grok"||e==="gemini"||e==="antigravity"}function uv(e){return e.fullNative?"full_native":e.blockedByHost?"blocked_by_host":e.degradedScan?"degraded_scan":e.ready?"ready_fallback":"ready"}async function Ip(e){let t=_r(e.host,e.targetRoot,e.surface),r=t.managedBlock??`not-applicable:${Bt(e.host,e.surface)}`,o=t.managedBlock?await Xd({host:e.host,targetPath:r}):wv(e.host,e.surface),n=await Eo({host:e.host,targetPath:t.mcpRegistration,checkCommand:e.targetRoot===void 0}),a=await ft({host:e.host,surface:e.surface,targetPath:t.plugin}),s=await Ws({home:e.home,host:e.host}),l=(e.databaseExists?await Po({home:e.home,host:e.host,limit:200,readOnly:!0}):[]).filter(R=>fv(e.host,e.surface,R)),c=e.databaseExists?await Ee({home:e.home,host:e.host,limit:100,readOnly:!0}):[],d=e.databaseExists?Hn(f(e.home).database):[],p=e.targetRoot!==void 0,g=p?[]:(await qr(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=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`}]:[],S=await _v({host:e.host,managedBlock:o,handshake:s}),U=await bv(e.host),ae=l.filter(R=>R.enabled&&R.native_schedule_supported&&R.native_id===null).map(R=>({code:"NATIVE_SCHEDULE_MAPPING_MISSING",severity:"warn",message:`Schedule ${R.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`})),ve=l.filter(R=>R.enabled&&!R.native_schedule_supported&&!a.enabled&&a.package_kind!=="unsupported-native").map(R=>({code:"NATIVE_SCHEDULE_UNSUPPORTED_NO_FALLBACK_INSTALLED",severity:"warn",message:`Schedule ${R.id} has no native scheduler support and no NativeSoul package fallback is installed.`,remediation:`Run nativesoul install --host ${e.host} --apply`})),ke=yv({managedBlock:o,mcpRegistration:n,plugin:a,schedules:l,capabilities:c}),nt=_i({host:e.host,surface:e.surface,mcpRegistration:n,plugin:a,schedules:l,capabilities:c,adapterDiagnostics:g}),Ue=[...o.issues,...n.issues,...a.issues,...g,...y,...k,...S,...U,...ae,...ve];return{host:e.host,surface:e.surface,status:Ue.some(R=>R.severity==="error"||R.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:a,provider_parity:ke,full_native_evidence:nt,handshake:s,schedule_count:l.length,enabled_schedule_count:l.filter(R=>R.enabled).length,native_schedule_mappings:l.map(R=>({id:R.id,native_schedule_supported:R.native_schedule_supported,native_id:R.native_id})),capability_count:c.length,ready_capability_count:c.filter(R=>R.ready).length,cross_host_inventory_summary:{current_host:c.length,other_hosts:d.filter(R=>R.host!==e.host&&R.host!=="all").length,ready_other_hosts:d.filter(R=>R.host!==e.host&&R.host!=="all"&&R.ready).length},issues:Ue}}function fv(e,t,r){return e!=="claude"?!0:hv(r.desired)===t}function hv(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 yv(e){let t=e.plugin.enabled,r=e.mcpRegistration.configured,o=e.managedBlock.configured||t,n=e.schedules.some(p=>p.enabled),s=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"&&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 _v(e){if(!e.managedBlock.configured||e.managedBlock.targetPath.startsWith("not-applicable:"))return[];let t=10080*60*1e3,r=await kv(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 bv(e){let t=vv(e).map(r=>jp.resolve(process.cwd(),r));for(let r of t){if(!pv(r))continue;let o=await mv(r,"utf8"),n=lo(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 vv(e){switch(e){case"claude":return["CLAUDE.md",jp.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 kv(e){try{let t=await gv(e);return Math.max(Date.now()-t.mtimeMs,0)}catch{return null}}function wv(e,t){return{host:e,targetPath:`not-applicable:${Bt(e,t)}`,target_exists:!1,configured:!0,markers_valid:!0,issues:[]}}async function Kt(e){let t=f(e.home),r=await ho(e.home),o=vi(t.database),n=qe(e.host),a=[],s=o?Hn(t.database):[],i=Yu(t.database,o),l=await it(t.home),c=vi(In(t.home)),d=vi(dr(t.home));for(let y of n)for(let k of Ke(y,e.surface))a.push(await Ip({home:t.home,host:y,surface:k,targetRoot:e.targetRoot,databaseExists:o}));let p=[...r.issues,...Qu(i),...a.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?Tp.resolve(e.targetRoot):null,cross_host_inventory:Zu(s),activation_summary:Wu({home:t.home,targetRoot:e.targetRoot?Tp.resolve(e.targetRoot):null,host:e.host,profile:l,onboardingComplete:c,activationComplete:d,hosts:a}),full_native_matrix:Sv(a),semantic_index:i,hosts:a,issues:p}}function Sv(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 Rv}from"node:fs";import{mkdir as Av,readdir as Ev,readFile as Pv,writeFile as xv}from"node:fs/promises";import jo from"node:path";async function ki(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),a=await jv(r.home,r.database,o,n),s=Tv(o,a,n),i=Nv({applied:t,project:o,proposals:s,dailyNotes:a.dailyNotes,candidates:a.candidates,activeMemories:a.activeMemories,auditEvents:a.auditEvents}),l=null;return t&&(l=await Cv(r.home,i),await Ov(r.home,s),await h({home:r.home,type:"memory_reflection_run",details:{project:o,proposal_count:s.length,report_path:l,daily_notes:a.dailyNotes.length,candidates:a.candidates.length,active_memories:a.activeMemories.length,audit_events:a.auditEvents.length}})),{applied:t,home:r.home,project:o,report:i,report_path:l,proposals:s,sources:{daily_notes:a.dailyNotes.length,candidates:a.candidates.length,active_memories:a.activeMemories.length,audit_events:a.auditEvents.length},protected_files:["SOUL.md","POLICY.md","standing-orders"].map(c=>({path:jo.join(r.home,c),modified:!1}))}}async function jv(e,t,r,o){let n=await Iv(e,o);if(!Rv(t))return{dailyNotes:n,candidates:[],activeMemories:[],auditEvents:[]};let a=_(t,{readOnly:!0});try{return{dailyNotes:n,candidates:a.listMemories({project:r,status:"candidate",includeForgotten:!1,limit:o}),activeMemories:a.listMemories({project:r,status:"active",includeForgotten:!1,limit:Math.max(o,20)}),auditEvents:a.listEvents({limit:Math.max(o,20)})}}finally{a.close()}}async function Iv(e,t){let r=jo.join(e,"memory","daily");if(!await A(r))return[];let n=(await Ev(r,{withFileTypes:!0})).filter(s=>s.isFile()&&s.name.endsWith(".md")).map(s=>s.name).sort().reverse().slice(0,t),a=[];for(let s of n){let i=jo.join(r,s),l=N(await Pv(i,"utf8")).value.trim();l.length>0&&a.push({id:`daily:${s}`,path:i,text:l})}return a}function Tv(e,t,r){let o=[];for(let n of t.candidates){let a=Cp(n.content,t.activeMemories),s=Lv(n.content,t.activeMemories);if(s){o.push(vr({action:"flag_conflict",project:e,summary:`Review conflict between ${n.id} and ${s.id}`,before:s.summary,after:n.summary,evidence:[n.id,s.id],risk:"high"}));continue}if(a&&a.score>=.7){o.push(vr({action:"deduplicate",project:e,summary:`Reject or merge duplicate candidate ${n.id}`,before:a.memory.summary,after:n.summary,evidence:[n.id,a.memory.id],risk:"medium"}));continue}o.push(vr({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 a=Mv(n.text);for(let s of a){if(o.length>=r)return o;let i=Cp(s,[...t.activeMemories,...t.candidates]);i&&i.score>=.7?o.push(vr({action:"deduplicate",project:e,summary:`Daily note repeats existing memory ${i.memory.id}`,before:i.memory.summary,after:Ge(s),evidence:[n.id,i.memory.id],risk:"medium"})):o.push(vr({action:"create_candidate",project:e,summary:Ge(s),before:"No durable memory exists for this daily note.",after:s,evidence:[n.id],risk:"low"}))}}for(let n of t.activeMemories)if(n.expires_at&&Date.parse(n.expires_at)<=Date.now()&&o.push(vr({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 vr(e){return{id:T("reflection"),persisted_memory_id:null,...e}}async function Cv(e,t){let r=jo.join(e,"proposals");await Av(r,{recursive:!0,mode:448});let o=jo.join(r,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-reflection.md`);return await xv(o,t,{encoding:"utf8",mode:384,flag:"wx"}),o}async function Ov(e,t){for(let r of t.filter(o=>o.action==="create_candidate")){let o=await ee(e,{project:r.project,content:["Reflection consolidation candidate.","",r.after,"",`Evidence: ${r.evidence.join(", ")}`].join(`
924
924
  `),confidence:.5,authority:"reflection_proposal",source:{kind:"reflection",proposal_id:r.id,evidence:r.evidence}});r.persisted_memory_id=o.id}}function Nv(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(`
925
925
  `)}function Mv(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 Cp(e,t){let r=null;for(let o of t){let n=Mp(e,`${o.summary}
926
926
  ${o.content}`);(!r||n>r.score)&&(r={memory:o,score:n})}return r}function Lv(e,t){let r=Np(e),o=Op(e);for(let n of t)if(Mp(e,`${n.summary}
927
- ${n.content}`)>=.35&&o!==Op(n.content)){let s=Np(n.content);if([...r].some(l=>l.length>4&&s.has(l)))return n}return null}function Op(e){return/\b(nao|não|never|do not|dont|don't|no longer|avoid|evitar|proibir|forbid)\b/iu.test(e)}function Mp(e,t){return Ru(e,t,{minLength:3,normalizeDiacritics:!0,removeStopwords:!0})}function Np(e){return so(e,{minLength:3,normalizeDiacritics:!0,removeStopwords:!0})}import{lstat as Dv,readdir as Hv,readFile as $v}from"node:fs/promises";import Kt from"node:path";var Lp=new Set([".json",".jsonl",".md",".markdown",".txt"]);async function Si(e){let t=e.apply===!0,r=f((await v(e.home)).home),o=Kt.resolve(e.sourcePath),n=e.project??L(e.cwd??process.cwd(),r.home),a=Math.min(Math.max(e.limit??200,1),1e3),s=[],i=await Dp(o,s),l=[],c=[];for(let k of i){if(l.length>=a){c.push({source_path:k,reason:"limit_reached"});continue}let R=await Fv(k,s);if(R.length===0){c.push({source_path:k,reason:"no_supported_records"});continue}l.push(...R.slice(0,a-l.length))}let d=Jv(l,n),p=qv(d).map(k=>({source_id:k,reason:"duplicate_source_id"})),g=[];if(t)for(let k of d){let R=await te(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=R.id,g.push(R)}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:s,persisted_memories:g};return await h({home:r.home,type:t?"openclaw_import_applied":"openclaw_import_dry_run",details:Kv(y)}),y}async function Dp(e,t){let r;try{r=await Dv(e)}catch{return t.push({code:"OPENCLAW_SOURCE_UNREADABLE",source_path:e,message:"Source path is not readable."}),[]}if(r.isFile())return Lp.has(Kt.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 Hv(e,{withFileTypes:!0});return(await Promise.all(o.map(a=>{let s=Kt.join(e,a.name);return a.isDirectory()?Dp(s,t):Promise.resolve(Lp.has(Kt.extname(a.name).toLowerCase())?[s]:[])}))).flat().sort()}async function Fv(e,t){let r;try{r=await $v(e,"utf8")}catch{return t.push({code:"OPENCLAW_FILE_UNREADABLE",source_path:e,message:"File could not be read."}),[]}let o=Kt.extname(e).toLowerCase();return o===".json"?Uv(e,r,t):o===".jsonl"?Bv(e,r,t):Vv(e,r)}function Uv(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:Wv(o)??[o]).flatMap((a,s)=>Hp(a,e,s))}function Bv(e,t,r){return t.split(/\r?\n/u).flatMap((o,n)=>{let a=o.trim();if(!a)return[];try{return Hp(JSON.parse(a),e,n)}catch{return r.push({code:"OPENCLAW_JSONL_LINE_MALFORMED",source_path:e,message:`Line ${n+1} is malformed.`}),[]}})}function Vv(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 Wv(e){if(!Ai(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 Hp(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(!Ai(e))return[];let o=wi(e,["content","text","summary","memory","note","body","value"]);return o?[{id:wi(e,["id","uid","uuid","key"])??`${Kt.basename(t)}:${r+1}`,content:o,project:wi(e,["project","project_id","scope_project","workspace","repo"]),confidence:Gv(e,["confidence","score"]),sourcePath:t,raw:Ri(e)}]:[]}function Jv(e,t){return e.map((r,o)=>{let n=N(r.content),a=r.id??`${Kt.basename(r.sourcePath)}:${o+1}`;return{source_system:"openclaw",source_path:r.sourcePath,source_id:a,source_hash:zv(r.raw),target_project:r.project?.trim()||t,content:n.value,summary:Ke(n.value),redacted:n.redacted,confidence:Math.min(Math.max(r.confidence??.55,0),1),status:"candidate",proposed_memory_id:null}})}function qv(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 wi(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 Gv(e,t){for(let r of t){let o=e[r];if(typeof o=="number"&&Number.isFinite(o))return o}return null}function Kv(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 Ri(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?e:Array.isArray(e)?e.map(t=>Ri(t)):Ai(e)?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,Ri(r)])):String(e)}function Ai(e){return typeof e=="object"&&e!==null}function zv(e){return Re(e)}import{lstat as Xv,readFile as Yv}from"node:fs/promises";import Io from"node:path";var zt=[".json",".jsonl",".md",".markdown",".txt"];var Qv={nativesoul:{host:"nativesoul",supported_extensions:zt,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:zt,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:zt,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:zt,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:zt,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:zt,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 Zv(e){return Re(e)}async function xi(e){let t=Qv[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=Io.resolve(e.sourcePath),a=e.project??L(e.cwd??process.cwd(),o.home),s=Math.min(Math.max(e.limit??200,1),1e3),i=[],l=await ek(e.host,n,i),c=[],d=[];for(let R of l){if(c.length>=s){d.push({source_path:R,reason:"limit_reached"});continue}let U=await tk(e.host,R,i);if(U.length===0){d.push({source_path:R,reason:"no_supported_records"});continue}c.push(...U.slice(0,s-c.length))}let p=ak(e.host,c,a),g=await sk(o.home,p),y=[];if(r)for(let R of p){let U=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=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(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 h({home:o.home,type:r?"native_host_import_applied":"native_host_import_dry_run",details:ik(k)}),k}async function ek(e,t,r){let o;try{o=await Xv(t)}catch{return r.push({code:"NATIVE_IMPORT_SOURCE_UNREADABLE",host:e,source_path:t,message:"Source path is not readable."}),[]}return o.isFile()?dk(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 tk(e,t,r){let o;try{o=await Yv(t,"utf8")}catch{return r.push({code:"NATIVE_IMPORT_FILE_UNREADABLE",host:e,source_path:t,message:"File could not be read."}),[]}let n=Io.extname(t).toLowerCase();return n===".json"?rk(e,t,o,r):n===".jsonl"?ok(e,t,o,r):nk(t,o)}function rk(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:lk(n)??[n]).flatMap((s,i)=>Fp(s,t,i))}function ok(e,t,r,o){return r.split(/\r?\n/u).flatMap((n,a)=>{let s=n.trim();if(!s)return[];try{return Fp(JSON.parse(s),t,a)}catch{return o.push({code:"NATIVE_IMPORT_JSONL_LINE_MALFORMED",host:e,source_path:t,message:`Line ${a+1} is malformed.`}),[]}})}function nk(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 Fp(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(!ji(e))return[];let o=Ei(e,["content","text","summary","memory","note","body","value"]);return o?[{id:Ei(e,["id","uid","uuid","key"])??`${Io.basename(t)}:${r+1}`,content:o,project:Ei(e,["project","project_id","scope_project","workspace","repo"]),confidence:ck(e,["confidence","score"]),sourcePath:t,raw:Pi(e)}]:[]}function ak(e,t,r){return t.map((o,n)=>{let a=N(o.content),s=o.id??`${Io.basename(o.sourcePath)}:${n+1}`,i=Up(a.value);return{source_system:e,source_path:o.sourcePath,source_id:s,source_hash:Zv(o.raw),normalized_content_hash:i,target_project:o.project?.trim()||r,content:a.value,summary:Ke(a.value),redacted:a.redacted,confidence:Math.min(Math.max(o.confidence??.55,0),1),status:"candidate",proposed_memory_id:null}})}async function sk(e,t){let r=[];r.push(...$p(t,o=>o.source_hash,"duplicate_source_hash")),r.push(...$p(t,o=>o.normalized_content_hash,"duplicate_normalized_content"));for(let o of new Set(t.map(n=>n.target_project))){let n=await Lt({home:e,project:o,includeForgotten:!1,limit:1e3}),a=new Set(n.map(s=>Up(s.content)));for(let s of t.filter(i=>i.target_project===o))a.has(s.normalized_content_hash)&&r.push({source_id:s.source_id,reason:"existing_normalized_content"})}return r.sort((o,n)=>`${o.reason}:${o.source_id}`.localeCompare(`${n.reason}:${n.source_id}`))}function $p(e,t,r){let o=new Map;for(let n of e){let a=t(n);o.set(a,[...o.get(a)??[],n])}return Array.from(o.values()).filter(n=>n.length>1).flatMap(n=>n.map(a=>({source_id:a.source_id,reason:r})))}function Up(e){return Re(e.toLowerCase().replace(/\s+/gu," ").trim())}function ik(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 lk(e){if(!ji(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 Ei(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 ck(e,t){for(let r of t){let o=e[r];if(typeof o=="number"&&Number.isFinite(o))return o}return null}function Pi(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?e:Array.isArray(e)?e.map(t=>Pi(t)):ji(e)?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,Pi(r)])):String(e)}function dk(e){return zt.includes(Io.extname(e).toLowerCase())}function ji(e){return typeof e=="object"&&e!==null}var ge={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 uk,mkdir as pk,readFile as mk,rm as gk,writeFile as fk}from"node:fs/promises";import{randomUUID as hk}from"node:crypto";import Bp from"node:path";function Yn(e){return Bp.join(f(e).home,"license.json")}async function xe(e){let t=Yn(e);if(!await S(t))return null;try{let r=JSON.parse(await mk(t,"utf8"));return yk(r)?r:null}catch{return null}}async function To(e,t){let r=Yn(e);return await pk(Bp.dirname(r),{recursive:!0,mode:448}),await fk(r,`${JSON.stringify(t,null,2)}
928
- `,{encoding:"utf8",mode:384}),await uk(r,384),t}async function Ii(e){await gk(Yn(e),{force:!0})}async function Qn(e){let t=await xe(e);if(t?.instance_id)return t.instance_id;let r=hk();return await To(e,{...ge,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 yk(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 Vp={name:"nativesoul",version:"1.1.1",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 Xt=Vp.version;var bk="https://api.dodopayments.com",vk=1440*60*1e3,kk=14;async function Ti(e){let t=f(e.home).home,r=e.now??new Date,o=await Qn(t),n=await Ni(e,"/licenses/activate",{license_key:e.key,name:o});if(!n.ok)return await $e(t,"license_activate_failed",e.key,n.reason,"error"),{ok:!1,reason:n.reason,license:{...ge,instance_id:o}};let a=await To(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:Xt,updates_until:xk(n.purchased_at??r.toISOString(),365),last_checked_at:r.toISOString(),source:"dodo"});return await $e(t,"license_activated",e.key,null,"ok"),{ok:!0,license:Yt(a)}}async function Ci(e){let t=f(e.home).home,r=e.now??new Date,o=await xe(t),n=e.key??o?.license_key,a=o?.instance_id??null;if(!n)return await $e(t,"license_validate_missing",null,"INVALID_KEY","blocked"),{ok:!1,reason:"INVALID_KEY",license:o?Yt(o):ge};if(o?.state==="licensed"&&wk(o.last_checked_at,r))return await $e(t,"license_validate_cache_hit",n,null,"ok"),{ok:!0,license:Yt(o)};let s=await Ni(e,"/licenses/validate",{license_key:n});if(s.ok){let i=await To(t,{state:"licensed",license_key:n,instance_id:a??await Qn(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 $e(t,"license_validated",n,null,"ok"),{ok:!0,license:Yt(i)}}return s.reason==="NETWORK"&&o?.state==="licensed"&&Rk(o.last_checked_at,r,e.graceDays)?(await $e(t,"license_validate_grace_served",n,"NETWORK","ok"),{ok:!0,license:Yt(o)}):(await $e(t,"license_validate_failed",n,s.reason,"blocked"),{ok:!1,reason:s.reason,license:{...ge,instance_id:a}})}async function Oi(e){let t=f(e.home).home,r=await xe(t),o=e.key??r?.license_key,n=e.licenseKeyInstanceId??r?.license_key_instance_id;if(!o||!n)return await $e(t,"license_deactivate_missing",o??null,"INVALID_KEY","blocked"),{ok:!1,reason:"INVALID_KEY",license:r?Yt(r):ge};let a=await Ni(e,"/licenses/deactivate",{license_key:o,license_key_instance_id:n});return a.ok?(await Ii(t),await $e(t,"license_deactivated",o,null,"ok"),{ok:!0,license:ge}):(await $e(t,"license_deactivate_failed",o,a.reason,"error"),{ok:!1,reason:a.reason,license:r?Yt(r):ge})}function Yt(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 wk(e,t){return e?t.getTime()-new Date(e).getTime()<vk:!1}function Rk(e,t,r=kk){return e?t.getTime()-new Date(e).getTime()<=r*24*60*60*1e3:!1}async function Ni(e,t,r){let o=e.fetch??globalThis.fetch;try{let n=await o(new URL(t,Sk(e.endpointBaseUrl)).toString(),{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify(r)}),a=await Ak(n);return n.ok?t==="/licenses/validate"&&a.valid!==!0?{ok:!1,reason:Wp(a)}:{ok:!0,license_key_instance_id:Ek(a),purchased_at:Pk(a)}:{ok:!1,reason:Wp(a)}}catch{return{ok:!1,reason:"NETWORK"}}}function Sk(e=process.env.NATIVESOUL_DODO_LICENSE_API_BASE_URL??bk){return e.endsWith("/")?e:`${e}/`}async function Ak(e){try{let t=await e.json();return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}}function Ek(e){let r=[e.license_key_instance_id,e.licenseKeyInstanceId,e.id,Co(e.data)?e.data.license_key_instance_id:null,Co(e.data)?e.data.id:null].find(o=>typeof o=="string"&&o.length>0);return typeof r=="string"?r:null}function Pk(e){let t=Co(e.data)?e.data:{},r=Co(e.license_key)?e.license_key:Co(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(a=>typeof a=="string"&&!Number.isNaN(Date.parse(a)));return typeof n=="string"?new Date(n).toISOString():null}function xk(e,t){let r=Date.parse(e);return Number.isNaN(r)?null:new Date(r+t*24*60*60*1e3).toISOString()}function Wp(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 Co(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}async function $e(e,t,r,o,n){await h({home:e,type:t,result:n,details:{provider:"dodo",license_key_ref:r?jk(r):null,reason:o}})}function jk(e){return e.length<=8?"[REDACTED_LICENSE_KEY]":`${e.slice(0,4)}\u2026${e.slice(-4)}`}var Oo="https://docs.nativesoul.dev/account/licensing";async function vr(e){let t=Ik(e),r=f(t.home).home;try{let o=await xe(r),n=await Ci(t);if(n.ok)return{ok:!0,license:n.license};let a=n.reason==="NETWORK"&&o?.state==="licensed"?"GRACE_EXPIRED":"UNLICENSED",s=t.activateUrl??Oo;return{ok:!1,reason:a,activate_url:s,message:No({reason:a,activate_url:s}),license:n.license}}catch{let o=t.activateUrl??Oo;return{ok:!1,reason:"UNLICENSED",activate_url:o,message:No({reason:"UNLICENSED",activate_url:o}),license:ge}}}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 Ik(e){return typeof e=="string"?{home:e}:e??{}}import{readdir as Tk,readFile as Jp,stat as Ck}from"node:fs/promises";import Mi from"node:path";var Ok=["open source","open-source","source-available","read the source","free to install","never phones home","zero network","uncrackable","piracy-proof"];async function Li(e={}){let t=e.registryPath??Mi.join(process.cwd(),"docs","architecture","feature-registry.yaml"),r=e.marketingDir??Mi.join(process.cwd(),"docs","marketing"),o=Nk(await Jp(t,"utf8")),n=e.page?[e.page]:await Gp(r),a=[],s=[];for(let i of n){let l=await Jp(i,"utf8"),c=Mo(l);for(let d of Ok)c.includes(Mo(d))&&a.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(Mo(p))&&a.push({code:"FEATURE_FORBIDDEN_PHRASE",page:i,feature_id:d.id,phrase:p,message:`Forbidden phrase for ${d.id}: ${p}`});for(let d of Mk(l)){let p=o.get(d.id);if(!p){a.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 g=Lk(p,i,d.text);s.push(g),g.result==="fail"&&a.push(Dk(g))}}return{ok:a.length===0,status:a.length===0?"pass":"fail",registry_path:t,pages:n,claims:s,issues:a,summary:{pages_scanned:n.length,claims_checked:s.length,issues:a.length}}}function Nk(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,qp(r)),r={id:kr(n[1]??""),name:"",claim_forbidden:[],evidence:null,claim_allowed:null};continue}if(!r)continue;let a=o.match(/^\s+([a-z_]+):\s*(.*)\s*$/u);if(!a)continue;let s=a[1]??"",i=a[2]??"";s==="status"?r.status=kr(i).split(/\s+/u)[0]:s==="name"?r.name=kr(i):s==="evidence"?r.evidence=kr(i):s==="claim_allowed"?r.claim_allowed=i.trim()==="null"?null:kr(i):s==="claim_forbidden"&&(r.claim_forbidden=Hk(i))}return r?.id&&t.set(r.id,qp(r)),t}function qp(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 Gp(e){try{if(!(await Ck(e)).isDirectory())return[]}catch{return[]}let t=await Tk(e,{withFileTypes:!0});return(await Promise.all(t.map(async o=>{let n=Mi.join(e,o.name);return o.isDirectory()?await Gp(n):o.isFile()&&/\.(md|mdx|txt)$/iu.test(o.name)?[n]:[]}))).flat().sort()}function Mk(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 Lk(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&&!Mo(r).includes(Mo(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 Dk(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 Hk(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(kr).filter(Boolean):[]}function kr(e){let t=e.trim().replace(/\s+#.*$/u,"");return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function Mo(e){return e.toLowerCase().replace(/[’']/gu,"'").replace(/\s+/gu," ").trim()}async function Di(e){let t=await xe(e.home),r=t?.state==="licensed",o=r?$k(t.updates_until,e.now??new Date):"unknown",n=r?Fk(e.latestKnownVersion,t.version_at_activation??null):"unknown",a=e.upgradeUrl??Oo,s=o==="lapsed"&&n===!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: ${a}.`:null;return{licensed:r,updates_status:o,newer_major_available:n,upgrade_url:a,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 $k(e,t){if(!e)return"unknown";let r=Date.parse(e);return Number.isNaN(r)?"unknown":t.getTime()<=r?"active":"lapsed"}function Fk(e,t){if(!e||!t)return"unknown";let r=Kp(e),o=Kp(t);return r===null||o===null?"unknown":r>o}function Kp(e){let t=e.trim().match(/^v?(\d+)(?:\.|$)/u);return t?.[1]?Number.parseInt(t[1],10):null}function _t(e){return bi(e)?"full native capability":e.ready?"ready":e.healthy&&e.allowed?"official-fallback":"degraded"}function Hi(e){let t=_t(e);return t==="full native capability"?"cyan":t==="ready"?"green":t==="official-fallback"?"amber":"red"}var Uk=["installed","enabled","active","authenticated","healthy","allowed","ready"];async function $i(e){let t=await Tt(e);if(!t)return null;let r=Bk(t);return{schema_version:1,uid:t.uid,capability:t,readiness:r,readiness_label:_t(t),readiness_signals:Uk.map(o=>({signal:o,satisfied:r[o],reason:r[o]?null:`${o} is false on the persisted capability record.`})),source:t.source,schema_hash:t.schema_hash}}function Bk(e){return{installed:e.installed,enabled:e.enabled,active:e.active,authenticated:e.authenticated,healthy:e.healthy,allowed:e.allowed,ready:e.ready}}var Xp={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 Lo(e){let t=await v(e.home),r=new Date().toISOString(),o=N(e.title).value,n=e.description===void 0||e.description===null?null:N(e.description).value,a={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},s=Yp({workItem:a,type:"created",fromStatus:null,toStatus:"inbox",actor:e.host??"cli",details:{priority:a.priority,source:a.source},now:r}),i=_(t.database),l;try{l=i.insertWorkItem(a),i.insertWorkItemEvent(s)}finally{i.close()}return await Qp(t.home,"work_item_created",l,{redacted:o!==e.title||e.description!==void 0&&e.description!==null&&n!==e.description,event_id:s.id}),l}async function Do(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await S(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:Wk(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 Ho(e){return Fi({home:e.home,id:e.id,actor:e.host,eventType:"claimed",auditType:"work_item_claimed",mutate:(t,r)=>{if(Ui(t.status))throw new Error(`Work item already terminal: ${t.id} (${t.status})`);return Zn(t.status,"in_progress"),{status:"in_progress",assignedHost:e.host,claimedAt:t.claimed_at??r,updatedAt:r,details:{assigned_host:e.host}}}})}async function $o(e){return Fi({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&&Zn(t.status,e.status);let n=e.description===void 0||e.description===null?e.description:N(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:qk(t.metadata,H(e.metadata)),completedAt:Ui(o)?r:void 0,updatedAt:r,details:{priority:e.priority??null,assigned_host:e.assignedHost??null,fields:Vk(e),redacted:e.description!==void 0&&e.description!==null&&n!==e.description}}}})}async function Fo(e){let t=e.status??"done";return Fi({home:e.home,id:e.id,actor:"cli",eventType:"completed",auditType:"work_item_completed",mutate:(r,o)=>{if(Ui(r.status))throw new Error(`Work item already terminal: ${r.id} (${r.status})`);return Zn(r.status,t),{status:t,completedAt:o,updatedAt:o,details:{terminal_status:t}}}})}function Zn(e,t){if(e!==t&&!Xp[e].includes(t))throw new Error(`Illegal work item transition: ${e} -> ${t}`)}async function Fi(e){let t=await v(e.home),r=_(t.database),o,n;try{let a=r.getWorkItem(e.id);if(!a)throw new Error(`Work item not found: ${e.id}`);let s=new Date().toISOString(),i=e.mutate(a,s);n=Yp({workItem:a,type:e.eventType,fromStatus:a.status,toStatus:i.status??a.status,actor:e.actor,details:i.details,now:s}),o=r.updateWorkItem({id:a.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 Qp(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 Yp(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 Qp(e,t,r,o){await h({home:e,type:t,details:{id:r.id,project:r.project_id,status:r.status,...Jk(o)}})}function Vk(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 Ui(e){return e==="done"||e==="failed"}function Wk(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),200)}function Jk(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{value:e}}function qk(e,t){return zp(e)&&zp(t)?{...e,...t}:t}function zp(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}import{readdir as jw,readFile as Iw}from"node:fs/promises";import mm from"node:path";import{existsSync as Gk}from"node:fs";var Kk=50;function Uo(e={}){let t=ow(e.limit),r=Zk(e),o=e.groupBy??"host",n=new Date().toISOString();if(e.db)return Zp(e.db,e,r,o,t,n);let a=f(e.home);if(!Gk(a.database))return rw(e,r,o,t,n);let s=_(a.database,{readOnly:!0});try{return Zp(s,e,r,o,t,n)}finally{s.close()}}function Zp(e,t,r,o,n,a){let s=e.listRunCostRows({project:t.project,host:t.host,since:r.since??void 0,until:r.until??void 0}),i=ea(s,g=>({key:g.project_id,label:g.project_id})),l=ea(s,g=>({key:g.host,label:g.host})),c=ea(s,g=>{let y=Yk(g);return{key:y,label:y==="unattributed"?"unattributed":y}}),d=ea(s,g=>{let y=g.completed_at?.slice(0,10)??"unknown";return{key:y,label:y}}),p=s.map(g=>rm(g.id,g.id,[g]));return{schema_version:1,generated_at:a,filters:{project:t.project??null,host:t.host??null,since:r.since,until:r.until,group_by:o,limit:n},totals:om(s),groups:Xk(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 ea(e,t){let r=new Map;for(let o of e){let n=t(o),a=r.get(n.key)??{label:n.label,rows:[]};a.rows.push(o),r.set(n.key,a)}return Array.from(r.entries()).map(([o,n])=>rm(o,n.label,n.rows))}function rm(e,t,r){return{key:e,label:t,...om(r)}}function om(e){let t=0,r=0,o=0,n=0,a=0;for(let s of e){let i=Dr(s.cost_json);zk(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,a+=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:nw(a),coverage:e.length===0?0:t/e.length}}function zk(e){return"source"in e&&e.source==="host-reported"}function Xk(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 Yk(e){return Qk(e.evidence_json)??e.session_id??"unattributed"}function Qk(e){let t;try{t=JSON.parse(e)}catch{return null}return em(t,"session_id")??em(t,"session")}function em(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 Zk(e){return{since:e.since?ew(e.since):null,until:e.until?nm(e.until,"until"):null}}function ew(e){let t=tw(e);return t!==null?new Date(Date.now()-t).toISOString():nm(e,"since")}function nm(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 tw(e){let t=e.match(/^(\d+)(s|m|h|d|w)$/u);if(t?.[1]&&t[2])return tm(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]?tm(Number(r[1]),r[2]):null}function tm(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 rw(e,t,r,o,n){let a={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:a,groups:[],by_project:[],by_host:[],by_session:[],by_day:[],by_run:[]}}function ow(e){return e===void 0||!Number.isFinite(e)?Kk:Math.max(1,Math.min(Math.trunc(e),500))}function nw(e){return Math.round(e*1e8)/1e8}import{mkdir as lw,readdir as cw,readFile as dw,writeFile as uw}from"node:fs/promises";import Qt from"node:path";function am(e){let t=Bi(e)?e:{},r=Bi(t.tool_input)?t.tool_input:Bi(t.input)?t.input:{},o=Y(t.tool_name)??Y(t.tool)??Y(t.name)??"unknown_tool",n=Y(t.action)??Y(r.action)??o,a=Y(t.target)??Y(r.target)??Y(r.file_path)??Y(r.path)??Y(r.url)??Y(r.command),s=Y(r.command)??Y(t.command);return{action:n,className:aw(o,[a,s].filter(Boolean).join(" ")),target:a,project:Y(t.project)??Y(t.project_id)??Y(r.project)??Y(r.project_id)}}function aw(e,t){let r=`${e} ${t??""}`.toLowerCase();return/\b(bash|shell|sh|zsh|exec_command)\b/u.test(e.toLowerCase())?sw(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 sw(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 Bi(e){return!!e&&!Array.isArray(e)&&typeof e=="object"}function Y(e){return typeof e=="string"&&e.trim().length>0?e.trim():void 0}var pw=new Set(["SOUL.MD","POLICY.MD"]),mw=5e3,sm=new Map;async function vt(e){let t=f(e),r=sm.get(t.home);if(r&&r.expiresAt>Date.now())return r.orders;let o=Qt.join(t.home,"standing-orders"),n;try{n=await cw(o)}catch{return[]}let a=[];for(let s of n.filter(i=>i.endsWith(".yaml")||i.endsWith(".yml")).sort()){let i=Qt.join(o,s),l=await dw(i,"utf8");a.push(gw(l,i))}return sm.set(t.home,{expiresAt:Date.now()+mw,orders:a}),a}async function kt(e){let t=await vt(e.home),r=e.target??null,o=r?im(r):null,n=t.filter(i=>Ji(i,e)),a=n.find(i=>i.allowed.includes(e.action)),s=n.find(i=>i.approval_required.includes(e.action));if(o&&pw.has(o))return bt(e,"proposal_required",["PROTECTED_HUMAN_FILE"],null);if(e.className==="identity_policy_change")return bt(e,"proposal_required",["IDENTITY_POLICY_CHANGE"],null);if(e.className==="destructive")return bt(e,"denied",["DESTRUCTIVE_DENIED_BY_DEFAULT"],a?.id??s?.id??null);if(s)return bt(e,"approval_required",["STANDING_ORDER_REQUIRES_APPROVAL"],s.id);if(a)return bt(e,"allowed",["STANDING_ORDER_ALLOWED"],a.id);switch(e.className){case"read_local":case"probe_external":case"write_local":return bt(e,"allowed",["DEFAULT_ALLOWED"],null);case"write_project":return bt(e,"approval_required",["PROJECT_WRITE_REQUIRES_APPROVAL"],null);case"external_write":return bt(e,"approval_required",["EXTERNAL_WRITE_REQUIRES_APPROVAL"],null)}}async function Vi(e){let t=am(e.payload),r=await kt({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 a=await v(e.home);await h({home:a.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=fw(e.target);if(!r)throw new Error("policy propose-change target must be SOUL.md or POLICY.md");let o=N(e.summary).value,n=new Date().toISOString(),a=T("proposal"),s=Qt.join(t.home,"proposals",`${n.replaceAll(/[:.]/gu,"-")}-${r}.md`),i=["# Policy Change Proposal","",`ID: ${a}`,`Target: ${r}`,`Created At: ${n}`,"","## Summary","",o,""].join(`
929
- `);return await lw(Qt.dirname(s),{recursive:!0,mode:448}),me(s,{root:t.home}),await uw(s,i,{encoding:"utf8",mode:384,flag:"wx"}),await h({home:t.home,type:"policy_change_proposed",details:{id:a,target:r,proposalPath:s,redacted:o!==e.summary}}),{id:a,target:r,summary:o,proposalPath:s,created_at:n}}function bt(e,t,r,o){return{action:e.action,class:e.className,target:e.target??null,decision:t,reasons:r,matched_standing_order:o}}function gw(e,t){return{id:hw(e,"id")??Qt.basename(t,Qt.extname(t)),allowed:wr(e,"allowed"),approval_required:wr(e,"approval_required"),scope_projects:wr(e,"projects").concat(wr(e,"scope_projects")),scope_hosts:wr(e,"hosts").concat(wr(e,"scope_hosts")),source:t}}function Ji(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 im(e){return Qt.basename(e.replaceAll("\\","/")).toUpperCase()}function fw(e){let t=im(e);return t==="SOUL.MD"?"SOUL.md":t==="POLICY.MD"?"POLICY.md":null}function hw(e,t){let r=new RegExp(`^\\s*${t}:\\s*([^\\n#]+)`,"mu");return e.match(r)?.[1]?.trim().replace(/^["']|["']$/gu,"")??null}function wr(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=[],a=!1,s=0;for(let i of o){let l=i.trim();if(!a){let d=i.match(new RegExp(`^(\\s*)${t}:\\s*$`,"u"));d&&(a=!0,s=d[1]?.length??0);continue}let c=i.length-i.trimStart().length;if(l&&c<=s&&!l.startsWith("-"))break;l.startsWith("-")&&n.push(l.slice(1).trim().replace(/^["']|["']$/gu,""))}return n.filter(Boolean)}function ce(e,t,r){if(e==null)return!1;if(Array.isArray(e))return e.some(o=>ce(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(a=>String(a)===r)}if(ce(n,t,r))return!0}return!1}var yw=/(?:sk-[A-Za-z0-9_-]{8,}|(?:api[_-]?key|token|secret|password)\s*[:=]\s*(?!\[REDACTED_SECRET\])[^"'\s]+)/iu;async function Rr(e={}){let t=f(e.home),r=xw(e.limit);if(!await S(t.database))return _w(e,r,!1);let n=_(t.database,{readOnly:!0});try{let a=n.listEvents({limit:r}),s=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=a.filter(y=>Pw(y,e)),p=s.filter(y=>lm(y.host,e.host)),g=i.filter(y=>lm(y.host,e.host));return pm({schema_version:1,generated_at:new Date().toISOString(),read_only:!0,external_telemetry_enabled:!1,initialized:!0,filters:um(e,r),retention:dm(r),metrics:{activation:bw(d),bootstrap:vw(d),recall:kw(d),capability_readiness:ww(p),heartbeat:Rw(l,c),no_op_suppression:Sw(d),rollback:Aw(d),secret_leakage_checks:cm(d)},m7_gate:Ew(d,p,g,c)})}finally{n.close()}}function _w(e,t,r){return pm({schema_version:1,generated_at:new Date().toISOString(),read_only:!0,external_telemetry_enabled:!1,initialized:r,filters:um(e,t),retention:dm(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 bw(e){return{workspace_initialized:fe(e,["workspace_initialized"]),onboarding_completed:fe(e,["onboarding_completed"]),install_applied:fe(e,["plugin_install","managed_block_applied","mcp_registration_installed"])}}function vw(e){return{succeeded:fe(e,["handshake_succeeded"]),degraded:fe(e,["handshake_degraded"]),failed:fe(e,["handshake_failed"]),cache_fallbacks:e.filter(t=>t.type.includes("bootstrap_context_cache")).length}}function kw(e){return{recalled:fe(e,["memory_recalled"]),proposed:fe(e,["memory_proposed"]),promoted:fe(e,["memory_promoted"])}}function ww(e){let t=e.map(_t);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 Rw(e,t){return{leases:e.length,completed_runs:t.length,silent_ok:t.filter(r=>r.result==="HEARTBEAT_OK"||ce(r.result,"silent_ack","HEARTBEAT_OK")).length}}function Sw(e){let t=fe(e,["heartbeat_skipped"]),r=e.filter(n=>n.type.includes("deduped")).length,o=e.filter(n=>ce(n.details,"action","noop")).length;return{total:t+r+o,heartbeat_skipped:t,deduped:r,noop_actions:o}}function Aw(e){let t=fe(e,["policy_pack_rollback"]),r=fe(e,["mcp_registration_rollback"]),o=fe(e,["managed_block_rollback"]);return{total:e.filter(n=>n.type.includes("rollback")).length,policy_pack:t,mcp:r,managed_block:o}}function cm(e){let t=JSON.stringify(e.map(r=>({type:r.type,result:r.result,details:r.details})));return{checked:!0,leak_indicators:yw.test(t)?1:0,redaction_markers:(t.match(/\[REDACTED_/gu)??[]).length}}function Ew(e,t,r,o){let n=o.length>0||r.some(l=>l.enabled),a=e.length>0&&t.length>0,s=cm(e).leak_indicators===0;return{recurring_use_validated:n,feedback_validated:a,privacy_validated:s,notes:[n?"Recurring heartbeat/schedule evidence exists locally.":"No recurring heartbeat/schedule evidence yet.",a?"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 fe(e,t){return e.filter(r=>t.includes(r.type)).length}function Pw(e,t){let r=!t.host||!ce(e.details,"host")||ce(e.details,"host",t.host),o=!t.project||!ce(e.details,"project")||ce(e.details,"project",t.project);return r&&o}function lm(e,t){return!t||e===t||e==="all"}function dm(e){return{source_event_limit:e,stores_raw_prompts:!1,stores_memory_content:!1,stores_raw_paths:!1}}function um(e,t){return{project:e.project??null,host:e.host??null,limit:t}}function xw(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e??200),1),500):200}function pm(e){return sr(H(e))}var Tw=["candidate","active","superseded","rejected","forgotten","expired"],qi=["inbox","assigned","in_progress","review","blocked","done","failed"];async function Bo(e={}){let t=f(e.home),r=Xw(e.limit),o=Gw(e);if(!await S(t.database))return fm(await Cw(t.home,t.database,e,r));let a=_(t.database,{readOnly:!0});try{let s=a.listMemories({project:e.project,includeForgotten:!0,limit:Math.max(r*4,50)}),i=a.listCapabilities({host:e.host,includeShared:!0,limit:r}),l=a.listCommitments({project:e.project,includeExpired:!0,limit:Math.max(r*2,50),now:new Date().toISOString(),skipExpire:!0}),c=a.listSchedules({host:e.host,limit:r}),d=a.listHeartbeatLeases({project:e.project,limit:r}),p=a.listHeartbeatRuns({project:e.project,host:e.host,limit:r}),g=a.listEvents({limit:Math.max(r*4,50)}),y=Jw(await vt(t.home),e),k=await Bw(t.home),R=Ze(s,o,D=>D.created_at),U=Ze(l,o,D=>D.updated_at).slice(0,r),Z=Ze(i,o,D=>D.last_seen_at).slice(0,r),ke=Ze(c,o,D=>D.updated_at).slice(0,r),Te=Ze(d,o,D=>D.created_at).slice(0,r),se=Ze(p,o,D=>D.completed_at).slice(0,r),Be=Ze(g,o,D=>D.created_at).filter(D=>!e.host||Kw(D,{key:"host",value:e.host})).slice(0,r),x=Be.filter(D=>D.type==="policy_blocked"),Mr=Be.filter(D=>zw(D)).length,rn=Ow(a,e,o,r),Lr=Mw(a,e,o,r,k,Mr),V=Hw(a,e,r),Sg={schema_version:2,generated_at:new Date().toISOString(),filters:_m(e,r),read_only:!0,home:t.home,database:t.database,initialized:!0,memories:{summary:qw(R),recent:R.filter(D=>D.status!=="candidate").slice(0,r),candidates:R.filter(D=>D.status==="candidate").slice(0,r)},commitments:U,capabilities:Z,schedules:ke,heartbeat:{leases:Te,runs:se},audit:{events:Be,policy_blocks:x},policy:{standing_orders:y,proposals:k,counts:{standing_orders:y.length,proposals:k.length,policy_blocks:x.length,approvals_required:Mr}},work:rn,approvals:Lr,cost:V,feedback:await Rr({home:t.home,project:e.project,host:e.host,limit:r})};return fm(Sg)}finally{a.close()}}async function Cw(e,t,r,o){return{schema_version:2,generated_at:new Date().toISOString(),filters:_m(r,o),read_only:!0,home:e,database:t,initialized:!1,memories:{summary:ym(),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:hm(),approvals:Fw(),cost:Uw(),feedback:await Rr({home:e,project:r.project,host:r.host,limit:o})}}function Ow(e,t,r,o){let n=Ze(e.listWorkItems({project:t.project,assignedHost:t.host,limit:Math.max(o*qi.length,50)}),r,s=>s.updated_at).slice(0,Math.max(o*qi.length,50));if(n.length===0)return hm();let a=[];for(let s of qi){let i=n.filter(l=>l.status===s).slice(0,o).map(l=>Nw(e,l));i.length>0&&a.push({status:s,count:i.length,items:i})}return{columns:a}}function Nw(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:$w(t.metadata,"run_id")??r?.id??null,priority:t.priority,updated_at:t.updated_at}}function Mw(e,t,r,o,n,a){let s=e.listApprovals("pending").approvals.filter(l=>Dw(l,t)).filter(l=>Ze([l],r,c=>c.created_at).length>0).slice(0,o).map(Lw);if(s.length>0)return{pending:s,counts:{pending:s.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&&a>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 Lw(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 Dw(e,t){return(!t.project||e.project===t.project)&&(!t.host||e.host===t.host)}function Hw(e,t,r){let o=Uo({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(ta),by_host:o.by_host.map(ta),by_session:o.by_session.map(ta),by_run:o.by_run.map(ta)}}function ta(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 $w(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 hm(){return{columns:[]}}function Fw(){return{pending:[],counts:{pending:0}}}function Uw(){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 Bw(e){let t=mm.join(e,"proposals"),r;try{r=await jw(t)}catch{return[]}let o=[];for(let n of r.filter(a=>a.endsWith(".md")).sort()){let a=await Iw(mm.join(t,n),"utf8");o.push({filename:n,target:Vw(a,"Target"),summary:Ww(a,"Summary")})}return o}function Vw(e,t){return e.match(new RegExp(`^${t}:\\s*(.+)$`,"mu"))?.[1]?.trim()??null}function Ww(e,t){return e.match(new RegExp(`^## ${t}\\s*$\\n+([\\s\\S]*?)(?:\\n+## |$)`,"mu"))?.[1]?.trim()??null}function Jw(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 qw(e){let t=ym();for(let r of e)t[r.status]+=1;return t}function ym(){return Object.fromEntries(Tw.map(e=>[e,0]))}function Ze(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 Gw(e){return{since:gm(e.since,"since"),until:gm(e.until,"until")}}function gm(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 Kw(e,t){return ce(e.details,t.key,t.value)}function zw(e){return ce(e.details,"decision","approval_required")||ce(e.details,"approval_required")||ce(e.details,"action","approval_required")}function _m(e,t){return{project:e.project??null,host:e.host??null,limit:t,since:e.since??null,until:e.until??null}}function Xw(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e??50),1),200):50}function fm(e){return sr(H(e))}import{mkdir as Yw,writeFile as Qw}from"node:fs/promises";import Gi from"node:path";async function zi(e={}){let t=await Bo(e),r=Gi.resolve(e.output??Gi.join(f(e.home).home,"generated","dashboard","index.html"));return await Yw(Gi.dirname(r),{recursive:!0,mode:448}),await Qw(r,bm(t),{encoding:"utf8",mode:384}),{outputPath:r,generated_at:t.generated_at,read_only:!0,data:t}}function bm(e){let t=lR(e.capabilities),r=e.audit.policy_blocks.length,o=e.policy.counts.approvals_required,n=Zw(e),a=n?n.work.columns.reduce((s,i)=>s+i.items.length,0):0;return`<!doctype html>
927
+ ${n.content}`)>=.35&&o!==Op(n.content)){let s=Np(n.content);if([...r].some(l=>l.length>4&&s.has(l)))return n}return null}function Op(e){return/\b(nao|não|never|do not|dont|don't|no longer|avoid|evitar|proibir|forbid)\b/iu.test(e)}function Mp(e,t){return Su(e,t,{minLength:3,normalizeDiacritics:!0,removeStopwords:!0})}function Np(e){return so(e,{minLength:3,normalizeDiacritics:!0,removeStopwords:!0})}import{lstat as Dv,readdir as Hv,readFile as $v}from"node:fs/promises";import zt from"node:path";var Lp=new Set([".json",".jsonl",".md",".markdown",".txt"]);async function Ri(e){let t=e.apply===!0,r=f((await v(e.home)).home),o=zt.resolve(e.sourcePath),n=e.project??L(e.cwd??process.cwd(),r.home),a=Math.min(Math.max(e.limit??200,1),1e3),s=[],i=await Dp(o,s),l=[],c=[];for(let k of i){if(l.length>=a){c.push({source_path:k,reason:"limit_reached"});continue}let S=await Fv(k,s);if(S.length===0){c.push({source_path:k,reason:"no_supported_records"});continue}l.push(...S.slice(0,a-l.length))}let d=Jv(l,n),p=qv(d).map(k=>({source_id:k,reason:"duplicate_source_id"})),g=[];if(t)for(let k of d){let S=await ee(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:s,persisted_memories:g};return await h({home:r.home,type:t?"openclaw_import_applied":"openclaw_import_dry_run",details:Kv(y)}),y}async function Dp(e,t){let r;try{r=await Dv(e)}catch{return t.push({code:"OPENCLAW_SOURCE_UNREADABLE",source_path:e,message:"Source path is not readable."}),[]}if(r.isFile())return Lp.has(zt.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 Hv(e,{withFileTypes:!0});return(await Promise.all(o.map(a=>{let s=zt.join(e,a.name);return a.isDirectory()?Dp(s,t):Promise.resolve(Lp.has(zt.extname(a.name).toLowerCase())?[s]:[])}))).flat().sort()}async function Fv(e,t){let r;try{r=await $v(e,"utf8")}catch{return t.push({code:"OPENCLAW_FILE_UNREADABLE",source_path:e,message:"File could not be read."}),[]}let o=zt.extname(e).toLowerCase();return o===".json"?Uv(e,r,t):o===".jsonl"?Bv(e,r,t):Vv(e,r)}function Uv(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:Wv(o)??[o]).flatMap((a,s)=>Hp(a,e,s))}function Bv(e,t,r){return t.split(/\r?\n/u).flatMap((o,n)=>{let a=o.trim();if(!a)return[];try{return Hp(JSON.parse(a),e,n)}catch{return r.push({code:"OPENCLAW_JSONL_LINE_MALFORMED",source_path:e,message:`Line ${n+1} is malformed.`}),[]}})}function Vv(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 Wv(e){if(!Ai(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 Hp(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(!Ai(e))return[];let o=wi(e,["content","text","summary","memory","note","body","value"]);return o?[{id:wi(e,["id","uid","uuid","key"])??`${zt.basename(t)}:${r+1}`,content:o,project:wi(e,["project","project_id","scope_project","workspace","repo"]),confidence:Gv(e,["confidence","score"]),sourcePath:t,raw:Si(e)}]:[]}function Jv(e,t){return e.map((r,o)=>{let n=N(r.content),a=r.id??`${zt.basename(r.sourcePath)}:${o+1}`;return{source_system:"openclaw",source_path:r.sourcePath,source_id:a,source_hash:zv(r.raw),target_project:r.project?.trim()||t,content:n.value,summary:Ge(n.value),redacted:n.redacted,confidence:Math.min(Math.max(r.confidence??.55,0),1),status:"candidate",proposed_memory_id:null}})}function qv(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 wi(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 Gv(e,t){for(let r of t){let o=e[r];if(typeof o=="number"&&Number.isFinite(o))return o}return null}function Kv(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 Si(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?e:Array.isArray(e)?e.map(t=>Si(t)):Ai(e)?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,Si(r)])):String(e)}function Ai(e){return typeof e=="object"&&e!==null}function zv(e){return Se(e)}import{lstat as Xv,readFile as Yv}from"node:fs/promises";import Io from"node:path";var Xt=[".json",".jsonl",".md",".markdown",".txt"];var Qv={nativesoul:{host:"nativesoul",supported_extensions:Xt,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:Xt,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:Xt,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:Xt,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:Xt,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:Xt,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 Zv(e){return Se(e)}async function xi(e){let t=Qv[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=Io.resolve(e.sourcePath),a=e.project??L(e.cwd??process.cwd(),o.home),s=Math.min(Math.max(e.limit??200,1),1e3),i=[],l=await ek(e.host,n,i),c=[],d=[];for(let S of l){if(c.length>=s){d.push({source_path:S,reason:"limit_reached"});continue}let U=await tk(e.host,S,i);if(U.length===0){d.push({source_path:S,reason:"no_supported_records"});continue}c.push(...U.slice(0,s-c.length))}let p=ak(e.host,c,a),g=await sk(o.home,p),y=[];if(r)for(let S of p){let U=await ee(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:ik(k)}),k}async function ek(e,t,r){let o;try{o=await Xv(t)}catch{return r.push({code:"NATIVE_IMPORT_SOURCE_UNREADABLE",host:e,source_path:t,message:"Source path is not readable."}),[]}return o.isFile()?dk(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 tk(e,t,r){let o;try{o=await Yv(t,"utf8")}catch{return r.push({code:"NATIVE_IMPORT_FILE_UNREADABLE",host:e,source_path:t,message:"File could not be read."}),[]}let n=Io.extname(t).toLowerCase();return n===".json"?rk(e,t,o,r):n===".jsonl"?ok(e,t,o,r):nk(t,o)}function rk(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:lk(n)??[n]).flatMap((s,i)=>Fp(s,t,i))}function ok(e,t,r,o){return r.split(/\r?\n/u).flatMap((n,a)=>{let s=n.trim();if(!s)return[];try{return Fp(JSON.parse(s),t,a)}catch{return o.push({code:"NATIVE_IMPORT_JSONL_LINE_MALFORMED",host:e,source_path:t,message:`Line ${a+1} is malformed.`}),[]}})}function nk(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 Fp(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(!ji(e))return[];let o=Ei(e,["content","text","summary","memory","note","body","value"]);return o?[{id:Ei(e,["id","uid","uuid","key"])??`${Io.basename(t)}:${r+1}`,content:o,project:Ei(e,["project","project_id","scope_project","workspace","repo"]),confidence:ck(e,["confidence","score"]),sourcePath:t,raw:Pi(e)}]:[]}function ak(e,t,r){return t.map((o,n)=>{let a=N(o.content),s=o.id??`${Io.basename(o.sourcePath)}:${n+1}`,i=Up(a.value);return{source_system:e,source_path:o.sourcePath,source_id:s,source_hash:Zv(o.raw),normalized_content_hash:i,target_project:o.project?.trim()||r,content:a.value,summary:Ge(a.value),redacted:a.redacted,confidence:Math.min(Math.max(o.confidence??.55,0),1),status:"candidate",proposed_memory_id:null}})}async function sk(e,t){let r=[];r.push(...$p(t,o=>o.source_hash,"duplicate_source_hash")),r.push(...$p(t,o=>o.normalized_content_hash,"duplicate_normalized_content"));for(let o of new Set(t.map(n=>n.target_project))){let n=await Dt({home:e,project:o,includeForgotten:!1,limit:1e3}),a=new Set(n.map(s=>Up(s.content)));for(let s of t.filter(i=>i.target_project===o))a.has(s.normalized_content_hash)&&r.push({source_id:s.source_id,reason:"existing_normalized_content"})}return r.sort((o,n)=>`${o.reason}:${o.source_id}`.localeCompare(`${n.reason}:${n.source_id}`))}function $p(e,t,r){let o=new Map;for(let n of e){let a=t(n);o.set(a,[...o.get(a)??[],n])}return Array.from(o.values()).filter(n=>n.length>1).flatMap(n=>n.map(a=>({source_id:a.source_id,reason:r})))}function Up(e){return Se(e.toLowerCase().replace(/\s+/gu," ").trim())}function ik(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 lk(e){if(!ji(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 Ei(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 ck(e,t){for(let r of t){let o=e[r];if(typeof o=="number"&&Number.isFinite(o))return o}return null}function Pi(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?e:Array.isArray(e)?e.map(t=>Pi(t)):ji(e)?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,Pi(r)])):String(e)}function dk(e){return Xt.includes(Io.extname(e).toLowerCase())}function ji(e){return typeof e=="object"&&e!==null}var me={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 uk,mkdir as pk,readFile as mk,rm as gk,writeFile as fk}from"node:fs/promises";import{randomUUID as hk}from"node:crypto";import Bp from"node:path";function Yn(e){return Bp.join(f(e).home,"license.json")}async function xe(e){let t=Yn(e);if(!await A(t))return null;try{let r=JSON.parse(await mk(t,"utf8"));return yk(r)?r:null}catch{return null}}async function To(e,t){let r=Yn(e);return await pk(Bp.dirname(r),{recursive:!0,mode:448}),await fk(r,`${JSON.stringify(t,null,2)}
928
+ `,{encoding:"utf8",mode:384}),await uk(r,384),t}async function Ii(e){await gk(Yn(e),{force:!0})}async function Qn(e){let t=await xe(e);if(t?.instance_id)return t.instance_id;let r=hk();return await To(e,{...me,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 yk(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 Vp={name:"nativesoul",version:"1.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 Yt=Vp.version;var bk="https://api.dodopayments.com",vk=1440*60*1e3,kk=14;async function Ti(e){let t=f(e.home).home,r=e.now??new Date,o=await Qn(t),n=await Ni(e,"/licenses/activate",{license_key:e.key,name:o});if(!n.ok)return await He(t,"license_activate_failed",e.key,n.reason,"error"),{ok:!1,reason:n.reason,license:{...me,instance_id:o}};let a=await To(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:Yt,updates_until:xk(n.purchased_at??r.toISOString(),365),last_checked_at:r.toISOString(),source:"dodo"});return await He(t,"license_activated",e.key,null,"ok"),{ok:!0,license:Qt(a)}}async function Ci(e){let t=f(e.home).home,r=e.now??new Date,o=await xe(t),n=e.key??o?.license_key,a=o?.instance_id??null;if(!n)return await He(t,"license_validate_missing",null,"INVALID_KEY","blocked"),{ok:!1,reason:"INVALID_KEY",license:o?Qt(o):me};if(o?.state==="licensed"&&wk(o.last_checked_at,r))return await He(t,"license_validate_cache_hit",n,null,"ok"),{ok:!0,license:Qt(o)};let s=await Ni(e,"/licenses/validate",{license_key:n});if(s.ok){let i=await To(t,{state:"licensed",license_key:n,instance_id:a??await Qn(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 He(t,"license_validated",n,null,"ok"),{ok:!0,license:Qt(i)}}return s.reason==="NETWORK"&&o?.state==="licensed"&&Sk(o.last_checked_at,r,e.graceDays)?(await He(t,"license_validate_grace_served",n,"NETWORK","ok"),{ok:!0,license:Qt(o)}):(await He(t,"license_validate_failed",n,s.reason,"blocked"),{ok:!1,reason:s.reason,license:{...me,instance_id:a}})}async function Oi(e){let t=f(e.home).home,r=await xe(t),o=e.key??r?.license_key,n=e.licenseKeyInstanceId??r?.license_key_instance_id;if(!o||!n)return await He(t,"license_deactivate_missing",o??null,"INVALID_KEY","blocked"),{ok:!1,reason:"INVALID_KEY",license:r?Qt(r):me};let a=await Ni(e,"/licenses/deactivate",{license_key:o,license_key_instance_id:n});return a.ok?(await Ii(t),await He(t,"license_deactivated",o,null,"ok"),{ok:!0,license:me}):(await He(t,"license_deactivate_failed",o,a.reason,"error"),{ok:!1,reason:a.reason,license:r?Qt(r):me})}function Qt(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 wk(e,t){return e?t.getTime()-new Date(e).getTime()<vk:!1}function Sk(e,t,r=kk){return e?t.getTime()-new Date(e).getTime()<=r*24*60*60*1e3:!1}async function Ni(e,t,r){let o=e.fetch??globalThis.fetch;try{let n=await o(new URL(t,Rk(e.endpointBaseUrl)).toString(),{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify(r)}),a=await Ak(n);return n.ok?t==="/licenses/validate"&&a.valid!==!0?{ok:!1,reason:Wp(a)}:{ok:!0,license_key_instance_id:Ek(a),purchased_at:Pk(a)}:{ok:!1,reason:Wp(a)}}catch{return{ok:!1,reason:"NETWORK"}}}function Rk(e=process.env.NATIVESOUL_DODO_LICENSE_API_BASE_URL??bk){return e.endsWith("/")?e:`${e}/`}async function Ak(e){try{let t=await e.json();return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}}function Ek(e){let r=[e.license_key_instance_id,e.licenseKeyInstanceId,e.id,Co(e.data)?e.data.license_key_instance_id:null,Co(e.data)?e.data.id:null].find(o=>typeof o=="string"&&o.length>0);return typeof r=="string"?r:null}function Pk(e){let t=Co(e.data)?e.data:{},r=Co(e.license_key)?e.license_key:Co(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(a=>typeof a=="string"&&!Number.isNaN(Date.parse(a)));return typeof n=="string"?new Date(n).toISOString():null}function xk(e,t){let r=Date.parse(e);return Number.isNaN(r)?null:new Date(r+t*24*60*60*1e3).toISOString()}function Wp(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 Co(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}async function He(e,t,r,o,n){await h({home:e,type:t,result:n,details:{provider:"dodo",license_key_ref:r?jk(r):null,reason:o}})}function jk(e){return e.length<=8?"[REDACTED_LICENSE_KEY]":`${e.slice(0,4)}\u2026${e.slice(-4)}`}var Oo="https://docs.nativesoul.dev/account/licensing";async function kr(e){let t=Ik(e),r=f(t.home).home;try{let o=await xe(r),n=await Ci(t);if(n.ok)return{ok:!0,license:n.license};let a=n.reason==="NETWORK"&&o?.state==="licensed"?"GRACE_EXPIRED":"UNLICENSED",s=t.activateUrl??Oo;return{ok:!1,reason:a,activate_url:s,message:No({reason:a,activate_url:s}),license:n.license}}catch{let o=t.activateUrl??Oo;return{ok:!1,reason:"UNLICENSED",activate_url:o,message:No({reason:"UNLICENSED",activate_url:o}),license:me}}}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 Ik(e){return typeof e=="string"?{home:e}:e??{}}import{readdir as Tk,readFile as Jp,stat as Ck}from"node:fs/promises";import Mi from"node:path";var Ok=["open source","open-source","source-available","read the source","free to install","never phones home","zero network","uncrackable","piracy-proof"];async function Li(e={}){let t=e.registryPath??Mi.join(process.cwd(),"docs","architecture","feature-registry.yaml"),r=e.marketingDir??Mi.join(process.cwd(),"docs","marketing"),o=Nk(await Jp(t,"utf8")),n=e.page?[e.page]:await Gp(r),a=[],s=[];for(let i of n){let l=await Jp(i,"utf8"),c=Mo(l);for(let d of Ok)c.includes(Mo(d))&&a.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(Mo(p))&&a.push({code:"FEATURE_FORBIDDEN_PHRASE",page:i,feature_id:d.id,phrase:p,message:`Forbidden phrase for ${d.id}: ${p}`});for(let d of Mk(l)){let p=o.get(d.id);if(!p){a.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 g=Lk(p,i,d.text);s.push(g),g.result==="fail"&&a.push(Dk(g))}}return{ok:a.length===0,status:a.length===0?"pass":"fail",registry_path:t,pages:n,claims:s,issues:a,summary:{pages_scanned:n.length,claims_checked:s.length,issues:a.length}}}function Nk(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,qp(r)),r={id:wr(n[1]??""),name:"",claim_forbidden:[],evidence:null,claim_allowed:null};continue}if(!r)continue;let a=o.match(/^\s+([a-z_]+):\s*(.*)\s*$/u);if(!a)continue;let s=a[1]??"",i=a[2]??"";s==="status"?r.status=wr(i).split(/\s+/u)[0]:s==="name"?r.name=wr(i):s==="evidence"?r.evidence=wr(i):s==="claim_allowed"?r.claim_allowed=i.trim()==="null"?null:wr(i):s==="claim_forbidden"&&(r.claim_forbidden=Hk(i))}return r?.id&&t.set(r.id,qp(r)),t}function qp(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 Gp(e){try{if(!(await Ck(e)).isDirectory())return[]}catch{return[]}let t=await Tk(e,{withFileTypes:!0});return(await Promise.all(t.map(async o=>{let n=Mi.join(e,o.name);return o.isDirectory()?await Gp(n):o.isFile()&&/\.(md|mdx|txt)$/iu.test(o.name)?[n]:[]}))).flat().sort()}function Mk(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 Lk(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&&!Mo(r).includes(Mo(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 Dk(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 Hk(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(wr).filter(Boolean):[]}function wr(e){let t=e.trim().replace(/\s+#.*$/u,"");return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function Mo(e){return e.toLowerCase().replace(/[’']/gu,"'").replace(/\s+/gu," ").trim()}async function Di(e){let t=await xe(e.home),r=t?.state==="licensed",o=r?$k(t.updates_until,e.now??new Date):"unknown",n=r?Fk(e.latestKnownVersion,t.version_at_activation??null):"unknown",a=e.upgradeUrl??Oo,s=o==="lapsed"&&n===!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: ${a}.`:null;return{licensed:r,updates_status:o,newer_major_available:n,upgrade_url:a,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 $k(e,t){if(!e)return"unknown";let r=Date.parse(e);return Number.isNaN(r)?"unknown":t.getTime()<=r?"active":"lapsed"}function Fk(e,t){if(!e||!t)return"unknown";let r=Kp(e),o=Kp(t);return r===null||o===null?"unknown":r>o}function Kp(e){let t=e.trim().match(/^v?(\d+)(?:\.|$)/u);return t?.[1]?Number.parseInt(t[1],10):null}function _t(e){return bi(e)?"full native capability":e.ready?"ready":e.healthy&&e.allowed?"official-fallback":"degraded"}function Hi(e){let t=_t(e);return t==="full native capability"?"cyan":t==="ready"?"green":t==="official-fallback"?"amber":"red"}var Uk=["installed","enabled","active","authenticated","healthy","allowed","ready"];async function $i(e){let t=await Ct(e);if(!t)return null;let r=Bk(t);return{schema_version:1,uid:t.uid,capability:t,readiness:r,readiness_label:_t(t),readiness_signals:Uk.map(o=>({signal:o,satisfied:r[o],reason:r[o]?null:`${o} is false on the persisted capability record.`})),source:t.source,schema_hash:t.schema_hash}}function Bk(e){return{installed:e.installed,enabled:e.enabled,active:e.active,authenticated:e.authenticated,healthy:e.healthy,allowed:e.allowed,ready:e.ready}}var Xp={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 Lo(e){let t=await v(e.home),r=new Date().toISOString(),o=N(e.title).value,n=e.description===void 0||e.description===null?null:N(e.description).value,a={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},s=Yp({workItem:a,type:"created",fromStatus:null,toStatus:"inbox",actor:e.host??"cli",details:{priority:a.priority,source:a.source},now:r}),i=_(t.database),l;try{l=i.insertWorkItem(a),i.insertWorkItemEvent(s)}finally{i.close()}return await Qp(t.home,"work_item_created",l,{redacted:o!==e.title||e.description!==void 0&&e.description!==null&&n!==e.description,event_id:s.id}),l}async function Do(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await A(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:Wk(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 Ho(e){return Fi({home:e.home,id:e.id,actor:e.host,eventType:"claimed",auditType:"work_item_claimed",mutate:(t,r)=>{if(Ui(t.status))throw new Error(`Work item already terminal: ${t.id} (${t.status})`);return Zn(t.status,"in_progress"),{status:"in_progress",assignedHost:e.host,claimedAt:t.claimed_at??r,updatedAt:r,details:{assigned_host:e.host}}}})}async function $o(e){return Fi({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&&Zn(t.status,e.status);let n=e.description===void 0||e.description===null?e.description:N(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:qk(t.metadata,H(e.metadata)),completedAt:Ui(o)?r:void 0,updatedAt:r,details:{priority:e.priority??null,assigned_host:e.assignedHost??null,fields:Vk(e),redacted:e.description!==void 0&&e.description!==null&&n!==e.description}}}})}async function Fo(e){let t=e.status??"done";return Fi({home:e.home,id:e.id,actor:"cli",eventType:"completed",auditType:"work_item_completed",mutate:(r,o)=>{if(Ui(r.status))throw new Error(`Work item already terminal: ${r.id} (${r.status})`);return Zn(r.status,t),{status:t,completedAt:o,updatedAt:o,details:{terminal_status:t}}}})}function Zn(e,t){if(e!==t&&!Xp[e].includes(t))throw new Error(`Illegal work item transition: ${e} -> ${t}`)}async function Fi(e){let t=await v(e.home),r=_(t.database),o,n;try{let a=r.getWorkItem(e.id);if(!a)throw new Error(`Work item not found: ${e.id}`);let s=new Date().toISOString(),i=e.mutate(a,s);n=Yp({workItem:a,type:e.eventType,fromStatus:a.status,toStatus:i.status??a.status,actor:e.actor,details:i.details,now:s}),o=r.updateWorkItem({id:a.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 Qp(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 Yp(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 Qp(e,t,r,o){await h({home:e,type:t,details:{id:r.id,project:r.project_id,status:r.status,...Jk(o)}})}function Vk(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 Ui(e){return e==="done"||e==="failed"}function Wk(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),200)}function Jk(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{value:e}}function qk(e,t){return zp(e)&&zp(t)?{...e,...t}:t}function zp(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}import{readdir as jw,readFile as Iw}from"node:fs/promises";import mm from"node:path";import{existsSync as Gk}from"node:fs";var Kk=50;function Uo(e={}){let t=ow(e.limit),r=Zk(e),o=e.groupBy??"host",n=new Date().toISOString();if(e.db)return Zp(e.db,e,r,o,t,n);let a=f(e.home);if(!Gk(a.database))return rw(e,r,o,t,n);let s=_(a.database,{readOnly:!0});try{return Zp(s,e,r,o,t,n)}finally{s.close()}}function Zp(e,t,r,o,n,a){let s=e.listRunCostRows({project:t.project,host:t.host,since:r.since??void 0,until:r.until??void 0}),i=ea(s,g=>({key:g.project_id,label:g.project_id})),l=ea(s,g=>({key:g.host,label:g.host})),c=ea(s,g=>{let y=Yk(g);return{key:y,label:y==="unattributed"?"unattributed":y}}),d=ea(s,g=>{let y=g.completed_at?.slice(0,10)??"unknown";return{key:y,label:y}}),p=s.map(g=>rm(g.id,g.id,[g]));return{schema_version:1,generated_at:a,filters:{project:t.project??null,host:t.host??null,since:r.since,until:r.until,group_by:o,limit:n},totals:om(s),groups:Xk(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 ea(e,t){let r=new Map;for(let o of e){let n=t(o),a=r.get(n.key)??{label:n.label,rows:[]};a.rows.push(o),r.set(n.key,a)}return Array.from(r.entries()).map(([o,n])=>rm(o,n.label,n.rows))}function rm(e,t,r){return{key:e,label:t,...om(r)}}function om(e){let t=0,r=0,o=0,n=0,a=0;for(let s of e){let i=Dr(s.cost_json);zk(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,a+=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:nw(a),coverage:e.length===0?0:t/e.length}}function zk(e){return"source"in e&&e.source==="host-reported"}function Xk(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 Yk(e){return Qk(e.evidence_json)??e.session_id??"unattributed"}function Qk(e){let t;try{t=JSON.parse(e)}catch{return null}return em(t,"session_id")??em(t,"session")}function em(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 Zk(e){return{since:e.since?ew(e.since):null,until:e.until?nm(e.until,"until"):null}}function ew(e){let t=tw(e);return t!==null?new Date(Date.now()-t).toISOString():nm(e,"since")}function nm(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 tw(e){let t=e.match(/^(\d+)(s|m|h|d|w)$/u);if(t?.[1]&&t[2])return tm(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]?tm(Number(r[1]),r[2]):null}function tm(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 rw(e,t,r,o,n){let a={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:a,groups:[],by_project:[],by_host:[],by_session:[],by_day:[],by_run:[]}}function ow(e){return e===void 0||!Number.isFinite(e)?Kk:Math.max(1,Math.min(Math.trunc(e),500))}function nw(e){return Math.round(e*1e8)/1e8}import{mkdir as lw,readdir as cw,readFile as dw,writeFile as uw}from"node:fs/promises";import Zt from"node:path";function am(e){let t=Bi(e)?e:{},r=Bi(t.tool_input)?t.tool_input:Bi(t.input)?t.input:{},o=Y(t.tool_name)??Y(t.tool)??Y(t.name)??"unknown_tool",n=Y(t.action)??Y(r.action)??o,a=Y(t.target)??Y(r.target)??Y(r.file_path)??Y(r.path)??Y(r.url)??Y(r.command),s=Y(r.command)??Y(t.command);return{action:n,className:aw(o,[a,s].filter(Boolean).join(" ")),target:a,project:Y(t.project)??Y(t.project_id)??Y(r.project)??Y(r.project_id)}}function aw(e,t){let r=`${e} ${t??""}`.toLowerCase();return/\b(bash|shell|sh|zsh|exec_command)\b/u.test(e.toLowerCase())?sw(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 sw(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 Bi(e){return!!e&&!Array.isArray(e)&&typeof e=="object"}function Y(e){return typeof e=="string"&&e.trim().length>0?e.trim():void 0}var pw=new Set(["SOUL.MD","POLICY.MD"]),mw=5e3,sm=new Map;async function vt(e){let t=f(e),r=sm.get(t.home);if(r&&r.expiresAt>Date.now())return r.orders;let o=Zt.join(t.home,"standing-orders"),n;try{n=await cw(o)}catch{return[]}let a=[];for(let s of n.filter(i=>i.endsWith(".yaml")||i.endsWith(".yml")).sort()){let i=Zt.join(o,s),l=await dw(i,"utf8");a.push(gw(l,i))}return sm.set(t.home,{expiresAt:Date.now()+mw,orders:a}),a}async function kt(e){let t=await vt(e.home),r=e.target??null,o=r?im(r):null,n=t.filter(i=>Ji(i,e)),a=n.find(i=>i.allowed.includes(e.action)),s=n.find(i=>i.approval_required.includes(e.action));if(o&&pw.has(o))return bt(e,"proposal_required",["PROTECTED_HUMAN_FILE"],null);if(e.className==="identity_policy_change")return bt(e,"proposal_required",["IDENTITY_POLICY_CHANGE"],null);if(e.className==="destructive")return bt(e,"denied",["DESTRUCTIVE_DENIED_BY_DEFAULT"],a?.id??s?.id??null);if(s)return bt(e,"approval_required",["STANDING_ORDER_REQUIRES_APPROVAL"],s.id);if(a)return bt(e,"allowed",["STANDING_ORDER_ALLOWED"],a.id);switch(e.className){case"read_local":case"probe_external":case"write_local":return bt(e,"allowed",["DEFAULT_ALLOWED"],null);case"write_project":return bt(e,"approval_required",["PROJECT_WRITE_REQUIRES_APPROVAL"],null);case"external_write":return bt(e,"approval_required",["EXTERNAL_WRITE_REQUIRES_APPROVAL"],null)}}async function Vi(e){let t=am(e.payload),r=await kt({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 a=await v(e.home);await h({home:a.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=fw(e.target);if(!r)throw new Error("policy propose-change target must be SOUL.md or POLICY.md");let o=N(e.summary).value,n=new Date().toISOString(),a=T("proposal"),s=Zt.join(t.home,"proposals",`${n.replaceAll(/[:.]/gu,"-")}-${r}.md`),i=["# Policy Change Proposal","",`ID: ${a}`,`Target: ${r}`,`Created At: ${n}`,"","## Summary","",o,""].join(`
929
+ `);return await lw(Zt.dirname(s),{recursive:!0,mode:448}),pe(s,{root:t.home}),await uw(s,i,{encoding:"utf8",mode:384,flag:"wx"}),await h({home:t.home,type:"policy_change_proposed",details:{id:a,target:r,proposalPath:s,redacted:o!==e.summary}}),{id:a,target:r,summary:o,proposalPath:s,created_at:n}}function bt(e,t,r,o){return{action:e.action,class:e.className,target:e.target??null,decision:t,reasons:r,matched_standing_order:o}}function gw(e,t){return{id:hw(e,"id")??Zt.basename(t,Zt.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 Ji(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 im(e){return Zt.basename(e.replaceAll("\\","/")).toUpperCase()}function fw(e){let t=im(e);return t==="SOUL.MD"?"SOUL.md":t==="POLICY.MD"?"POLICY.md":null}function hw(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),n=[],a=!1,s=0;for(let i of o){let l=i.trim();if(!a){let d=i.match(new RegExp(`^(\\s*)${t}:\\s*$`,"u"));d&&(a=!0,s=d[1]?.length??0);continue}let c=i.length-i.trimStart().length;if(l&&c<=s&&!l.startsWith("-"))break;l.startsWith("-")&&n.push(l.slice(1).trim().replace(/^["']|["']$/gu,""))}return n.filter(Boolean)}function le(e,t,r){if(e==null)return!1;if(Array.isArray(e))return e.some(o=>le(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(a=>String(a)===r)}if(le(n,t,r))return!0}return!1}var yw=/(?:sk-[A-Za-z0-9_-]{8,}|(?:api[_-]?key|token|secret|password)\s*[:=]\s*(?!\[REDACTED_SECRET\])[^"'\s]+)/iu;async function Rr(e={}){let t=f(e.home),r=xw(e.limit);if(!await A(t.database))return _w(e,r,!1);let n=_(t.database,{readOnly:!0});try{let a=n.listEvents({limit:r}),s=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=a.filter(y=>Pw(y,e)),p=s.filter(y=>lm(y.host,e.host)),g=i.filter(y=>lm(y.host,e.host));return pm({schema_version:1,generated_at:new Date().toISOString(),read_only:!0,external_telemetry_enabled:!1,initialized:!0,filters:um(e,r),retention:dm(r),metrics:{activation:bw(d),bootstrap:vw(d),recall:kw(d),capability_readiness:ww(p),heartbeat:Sw(l,c),no_op_suppression:Rw(d),rollback:Aw(d),secret_leakage_checks:cm(d)},m7_gate:Ew(d,p,g,c)})}finally{n.close()}}function _w(e,t,r){return pm({schema_version:1,generated_at:new Date().toISOString(),read_only:!0,external_telemetry_enabled:!1,initialized:r,filters:um(e,t),retention:dm(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 bw(e){return{workspace_initialized:ge(e,["workspace_initialized"]),onboarding_completed:ge(e,["onboarding_completed"]),install_applied:ge(e,["plugin_install","managed_block_applied","mcp_registration_installed"])}}function vw(e){return{succeeded:ge(e,["handshake_succeeded"]),degraded:ge(e,["handshake_degraded"]),failed:ge(e,["handshake_failed"]),cache_fallbacks:e.filter(t=>t.type.includes("bootstrap_context_cache")).length}}function kw(e){return{recalled:ge(e,["memory_recalled"]),proposed:ge(e,["memory_proposed"]),promoted:ge(e,["memory_promoted"])}}function ww(e){let t=e.map(_t);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 Sw(e,t){return{leases:e.length,completed_runs:t.length,silent_ok:t.filter(r=>r.result==="HEARTBEAT_OK"||le(r.result,"silent_ack","HEARTBEAT_OK")).length}}function Rw(e){let t=ge(e,["heartbeat_skipped"]),r=e.filter(n=>n.type.includes("deduped")).length,o=e.filter(n=>le(n.details,"action","noop")).length;return{total:t+r+o,heartbeat_skipped:t,deduped:r,noop_actions:o}}function Aw(e){let t=ge(e,["policy_pack_rollback"]),r=ge(e,["mcp_registration_rollback"]),o=ge(e,["managed_block_rollback"]);return{total:e.filter(n=>n.type.includes("rollback")).length,policy_pack:t,mcp:r,managed_block:o}}function cm(e){let t=JSON.stringify(e.map(r=>({type:r.type,result:r.result,details:r.details})));return{checked:!0,leak_indicators:yw.test(t)?1:0,redaction_markers:(t.match(/\[REDACTED_/gu)??[]).length}}function Ew(e,t,r,o){let n=o.length>0||r.some(l=>l.enabled),a=e.length>0&&t.length>0,s=cm(e).leak_indicators===0;return{recurring_use_validated:n,feedback_validated:a,privacy_validated:s,notes:[n?"Recurring heartbeat/schedule evidence exists locally.":"No recurring heartbeat/schedule evidence yet.",a?"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 ge(e,t){return e.filter(r=>t.includes(r.type)).length}function Pw(e,t){let r=!t.host||!le(e.details,"host")||le(e.details,"host",t.host),o=!t.project||!le(e.details,"project")||le(e.details,"project",t.project);return r&&o}function lm(e,t){return!t||e===t||e==="all"}function dm(e){return{source_event_limit:e,stores_raw_prompts:!1,stores_memory_content:!1,stores_raw_paths:!1}}function um(e,t){return{project:e.project??null,host:e.host??null,limit:t}}function xw(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e??200),1),500):200}function pm(e){return ir(H(e))}var Tw=["candidate","active","superseded","rejected","forgotten","expired"],qi=["inbox","assigned","in_progress","review","blocked","done","failed"];async function Bo(e={}){let t=f(e.home),r=Xw(e.limit),o=Gw(e);if(!await A(t.database))return fm(await Cw(t.home,t.database,e,r));let a=_(t.database,{readOnly:!0});try{let s=a.listMemories({project:e.project,includeForgotten:!0,limit:Math.max(r*4,50)}),i=a.listCapabilities({host:e.host,includeShared:!0,limit:r}),l=a.listCommitments({project:e.project,includeExpired:!0,limit:Math.max(r*2,50),now:new Date().toISOString(),skipExpire:!0}),c=a.listSchedules({host:e.host,limit:r}),d=a.listHeartbeatLeases({project:e.project,limit:r}),p=a.listHeartbeatRuns({project:e.project,host:e.host,limit:r}),g=a.listEvents({limit:Math.max(r*4,50)}),y=Jw(await vt(t.home),e),k=await Bw(t.home),S=Qe(s,o,D=>D.created_at),U=Qe(l,o,D=>D.updated_at).slice(0,r),ae=Qe(i,o,D=>D.last_seen_at).slice(0,r),ve=Qe(c,o,D=>D.updated_at).slice(0,r),ke=Qe(d,o,D=>D.created_at).slice(0,r),nt=Qe(p,o,D=>D.completed_at).slice(0,r),Ue=Qe(g,o,D=>D.created_at).filter(D=>!e.host||Kw(D,{key:"host",value:e.host})).slice(0,r),R=Ue.filter(D=>D.type==="policy_blocked"),Rt=Ue.filter(D=>zw(D)).length,rn=Ow(a,e,o,r),Lr=Mw(a,e,o,r,k,Rt),V=Hw(a,e,r),Rg={schema_version:2,generated_at:new Date().toISOString(),filters:_m(e,r),read_only:!0,home:t.home,database:t.database,initialized:!0,memories:{summary:qw(S),recent:S.filter(D=>D.status!=="candidate").slice(0,r),candidates:S.filter(D=>D.status==="candidate").slice(0,r)},commitments:U,capabilities:ae,schedules:ve,heartbeat:{leases:ke,runs:nt},audit:{events:Ue,policy_blocks:R},policy:{standing_orders:y,proposals:k,counts:{standing_orders:y.length,proposals:k.length,policy_blocks:R.length,approvals_required:Rt}},work:rn,approvals:Lr,cost:V,feedback:await Rr({home:t.home,project:e.project,host:e.host,limit:r})};return fm(Rg)}finally{a.close()}}async function Cw(e,t,r,o){return{schema_version:2,generated_at:new Date().toISOString(),filters:_m(r,o),read_only:!0,home:e,database:t,initialized:!1,memories:{summary:ym(),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:hm(),approvals:Fw(),cost:Uw(),feedback:await Rr({home:e,project:r.project,host:r.host,limit:o})}}function Ow(e,t,r,o){let n=Qe(e.listWorkItems({project:t.project,assignedHost:t.host,limit:Math.max(o*qi.length,50)}),r,s=>s.updated_at).slice(0,Math.max(o*qi.length,50));if(n.length===0)return hm();let a=[];for(let s of qi){let i=n.filter(l=>l.status===s).slice(0,o).map(l=>Nw(e,l));i.length>0&&a.push({status:s,count:i.length,items:i})}return{columns:a}}function Nw(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:$w(t.metadata,"run_id")??r?.id??null,priority:t.priority,updated_at:t.updated_at}}function Mw(e,t,r,o,n,a){let s=e.listApprovals("pending").approvals.filter(l=>Dw(l,t)).filter(l=>Qe([l],r,c=>c.created_at).length>0).slice(0,o).map(Lw);if(s.length>0)return{pending:s,counts:{pending:s.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&&a>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 Lw(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 Dw(e,t){return(!t.project||e.project===t.project)&&(!t.host||e.host===t.host)}function Hw(e,t,r){let o=Uo({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(ta),by_host:o.by_host.map(ta),by_session:o.by_session.map(ta),by_run:o.by_run.map(ta)}}function ta(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 $w(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 hm(){return{columns:[]}}function Fw(){return{pending:[],counts:{pending:0}}}function Uw(){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 Bw(e){let t=mm.join(e,"proposals"),r;try{r=await jw(t)}catch{return[]}let o=[];for(let n of r.filter(a=>a.endsWith(".md")).sort()){let a=await Iw(mm.join(t,n),"utf8");o.push({filename:n,target:Vw(a,"Target"),summary:Ww(a,"Summary")})}return o}function Vw(e,t){return e.match(new RegExp(`^${t}:\\s*(.+)$`,"mu"))?.[1]?.trim()??null}function Ww(e,t){return e.match(new RegExp(`^## ${t}\\s*$\\n+([\\s\\S]*?)(?:\\n+## |$)`,"mu"))?.[1]?.trim()??null}function Jw(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 qw(e){let t=ym();for(let r of e)t[r.status]+=1;return t}function ym(){return Object.fromEntries(Tw.map(e=>[e,0]))}function Qe(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 Gw(e){return{since:gm(e.since,"since"),until:gm(e.until,"until")}}function gm(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 Kw(e,t){return le(e.details,t.key,t.value)}function zw(e){return le(e.details,"decision","approval_required")||le(e.details,"approval_required")||le(e.details,"action","approval_required")}function _m(e,t){return{project:e.project??null,host:e.host??null,limit:t,since:e.since??null,until:e.until??null}}function Xw(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e??50),1),200):50}function fm(e){return ir(H(e))}import{mkdir as Yw,writeFile as Qw}from"node:fs/promises";import Gi from"node:path";async function zi(e={}){let t=await Bo(e),r=Gi.resolve(e.output??Gi.join(f(e.home).home,"generated","dashboard","index.html"));return await Yw(Gi.dirname(r),{recursive:!0,mode:448}),await Qw(r,bm(t),{encoding:"utf8",mode:384}),{outputPath:r,generated_at:t.generated_at,read_only:!0,data:t}}function bm(e){let t=lS(e.capabilities),r=e.audit.policy_blocks.length,o=e.policy.counts.approvals_required,n=Zw(e),a=n?n.work.columns.reduce((s,i)=>s+i.items.length,0):0;return`<!doctype html>
930
930
  <html lang="en">
931
931
  <head>
932
932
  <meta charset="utf-8">
933
933
  <meta name="viewport" content="width=device-width, initial-scale=1">
934
934
  <title>NativeSoul Local Dashboard</title>
935
- <style>${uR()}</style>
935
+ <style>${uS()}</style>
936
936
  </head>
937
937
  <body>
938
938
  <main class="shell">
@@ -949,60 +949,60 @@ ${n.content}`)>=.35&&o!==Op(n.content)){let s=Np(n.content);if([...r].some(l=>l.
949
949
  </header>
950
950
 
951
951
  <section class="summary-grid" aria-label="dashboard summary">
952
- ${Sr("Active Memories",e.memories.summary.active,"green","promoted context ready for recall")}
953
- ${Sr("Candidates",e.memories.summary.candidate,"amber","pending human review")}
954
- ${Sr("Ready Capabilities",t.ready,"green",`${t.total} capability records`)}
955
- ${Sr("Open Commitments",e.commitments.filter(s=>s.status==="open").length,"amber",`${e.commitments.length} commitment records`)}
956
- ${Sr("Policy Blocks",r,r>0?"red":"neutral",`${o} approval markers`)}
957
- ${n&&a>0?Sr("Open Work",a,"cyan","board items in scope"):""}
952
+ ${Ar("Active Memories",e.memories.summary.active,"green","promoted context ready for recall")}
953
+ ${Ar("Candidates",e.memories.summary.candidate,"amber","pending human review")}
954
+ ${Ar("Ready Capabilities",t.ready,"green",`${t.total} capability records`)}
955
+ ${Ar("Open Commitments",e.commitments.filter(s=>s.status==="open").length,"amber",`${e.commitments.length} commitment records`)}
956
+ ${Ar("Policy Blocks",r,r>0?"red":"neutral",`${o} approval markers`)}
957
+ ${n&&a>0?Ar("Open Work",a,"cyan","board items in scope"):""}
958
958
  </section>
959
959
 
960
960
  <section class="layout">
961
- ${n?eR(n):""}
962
- ${n?tR(n):""}
963
- ${n?rR(n):""}
961
+ ${n?eS(n):""}
962
+ ${n?tS(n):""}
963
+ ${n?rS(n):""}
964
964
 
965
- ${je("Memory Lifecycle",[sR(e.memories.summary),Fe(e.memories.recent,s=>`
965
+ ${je("Memory Lifecycle",[sS(e.memories.summary),$e(e.memories.recent,s=>`
966
966
  <li>
967
967
  <div><strong>${w(s.summary)}</strong><small>${w(s.scope.project)} &middot; ${w(s.status)}</small></div>
968
- <span class="chip ${cR(s.status)}">${w(s.authority)}</span>
969
- </li>`),Zt(e.memories.recent,"No active/recent memories in this scope.")].join(""))}
968
+ <span class="chip ${cS(s.status)}">${w(s.authority)}</span>
969
+ </li>`),er(e.memories.recent,"No active/recent memories in this scope.")].join(""))}
970
970
 
971
- ${je("Capability Readiness",[iR(),Fe(e.capabilities,s=>`
971
+ ${je("Capability Readiness",[iS(),$e(e.capabilities,s=>`
972
972
  <li>
973
973
  <div><strong>${w(s.uid)}</strong><small>${w(s.host)} &middot; ${w(s.normalized_kind)} &middot; ${w(s.source)}</small></div>
974
974
  <span class="chip ${Hi(s)}">${_t(s)}</span>
975
- </li>`),Zt(e.capabilities,"No capability records match these filters.")].join(""))}
975
+ </li>`),er(e.capabilities,"No capability records match these filters.")].join(""))}
976
976
 
977
- ${je("Commitments",[Fe(e.commitments,s=>`
977
+ ${je("Commitments",[$e(e.commitments,s=>`
978
978
  <li>
979
979
  <div><strong>${w(s.summary)}</strong><small>${w(s.project_id)} &middot; ${w(s.status)}${s.due_at?` &middot; due ${w(s.due_at)}`:""}</small></div>
980
- <span class="chip ${dR(s.status)}">${w(s.status)}</span>
981
- </li>`),Zt(e.commitments,"No commitments match these filters.")].join(""))}
980
+ <span class="chip ${dS(s.status)}">${w(s.status)}</span>
981
+ </li>`),er(e.commitments,"No commitments match these filters.")].join(""))}
982
982
 
983
- ${je("Heartbeat And Runs",[ra([["Leases",e.heartbeat.leases.length],["Runs",e.heartbeat.runs.length],["Schedules",e.schedules.length]]),Fe(e.heartbeat.runs,s=>`
983
+ ${je("Heartbeat And Runs",[ra([["Leases",e.heartbeat.leases.length],["Runs",e.heartbeat.runs.length],["Schedules",e.schedules.length]]),$e(e.heartbeat.runs,s=>`
984
984
  <li>
985
985
  <div><strong>${w(s.id)}</strong><small>${w(s.host)} &middot; ${w(s.project_id)} &middot; ${w(s.completed_at)}</small></div>
986
986
  <span class="chip green">${w(s.status)}</span>
987
- </li>`),Zt(e.heartbeat.runs,"No heartbeat runs in this scope.")].join(""))}
987
+ </li>`),er(e.heartbeat.runs,"No heartbeat runs in this scope.")].join(""))}
988
988
 
989
- ${je("Schedules",[Fe(e.schedules,s=>`
989
+ ${je("Schedules",[$e(e.schedules,s=>`
990
990
  <li>
991
991
  <div><strong>${w(s.id)}</strong><small>${w(s.host)} &middot; ${w(s.mode)} &middot; native: ${s.native_schedule_supported?"yes":"fallback"}</small></div>
992
992
  <span class="chip ${s.enabled?"green":"neutral"}">${s.enabled?"enabled":"disabled"}</span>
993
- </li>`),Zt(e.schedules,"No schedules match these filters.")].join(""))}
993
+ </li>`),er(e.schedules,"No schedules match these filters.")].join(""))}
994
994
 
995
- ${je("Audit Trail",[Fe(e.audit.events,s=>`
995
+ ${je("Audit Trail",[$e(e.audit.events,s=>`
996
996
  <li>
997
997
  <div><strong>${w(s.type)}</strong><small>${w(s.created_at)} &middot; ${w(s.result)}</small></div>
998
998
  <span class="chip ${s.result==="blocked"?"red":"neutral"}">${w(s.actor)}</span>
999
- </li>`),Zt(e.audit.events,"No audit events in this scope.")].join(""))}
999
+ </li>`),er(e.audit.events,"No audit events in this scope.")].join(""))}
1000
1000
 
1001
- ${je("Approvals And Proposals",[ra([["Standing Orders",e.policy.counts.standing_orders],["Proposals",e.policy.counts.proposals],["Approvals",e.policy.counts.approvals_required]]),Fe(e.policy.proposals,s=>`
1001
+ ${je("Approvals And Proposals",[ra([["Standing Orders",e.policy.counts.standing_orders],["Proposals",e.policy.counts.proposals],["Approvals",e.policy.counts.approvals_required]]),$e(e.policy.proposals,s=>`
1002
1002
  <li>
1003
1003
  <div><strong>${w(s.target??s.filename)}</strong><small>${w(s.summary??"No summary supplied.")}</small></div>
1004
1004
  <span class="chip amber">proposal</span>
1005
- </li>`),Zt(e.policy.proposals,"No pending policy proposals.")].join(""))}
1005
+ </li>`),er(e.policy.proposals,"No pending policy proposals.")].join(""))}
1006
1006
 
1007
1007
  ${je("M7 Feedback",[ra([["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">
1008
1008
  <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>
@@ -1017,41 +1017,41 @@ ${n.content}`)>=.35&&o!==Op(n.content)){let s=Np(n.content);if([...r].some(l=>l.
1017
1017
  </main>
1018
1018
  <script type="application/json" id="nativesoul-dashboard-data">${w(JSON.stringify(e))}</script>
1019
1019
  </body>
1020
- </html>`}function Sr(e,t,r,o){return`<article class="metric ${r}">
1020
+ </html>`}function Ar(e,t,r,o){return`<article class="metric ${r}">
1021
1021
  <span>${w(e)}</span>
1022
1022
  <strong>${t}</strong>
1023
1023
  <small>${w(o)}</small>
1024
- </article>`}function Zw(e){return e.schema_version>=2&&"work"in e&&"approvals"in e&&"cost"in e?e:null}function eR(e){if(e.work.columns.length===0)return"";let t=`<div class="board-grid">${e.work.columns.map(r=>`
1024
+ </article>`}function Zw(e){return e.schema_version>=2&&"work"in e&&"approvals"in e&&"cost"in e?e:null}function eS(e){if(e.work.columns.length===0)return"";let t=`<div class="board-grid">${e.work.columns.map(r=>`
1025
1025
  <section class="board-column">
1026
1026
  <div class="board-column-head">
1027
- <strong>${w(nR(r.status))}</strong>
1027
+ <strong>${w(nS(r.status))}</strong>
1028
1028
  <span class="chip neutral">${r.count}</span>
1029
1029
  </div>
1030
- ${Fe(r.items,o=>`
1030
+ ${$e(r.items,o=>`
1031
1031
  <li>
1032
1032
  <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>
1033
- <span class="chip ${aR(o.status)}">${w(o.priority)}</span>
1033
+ <span class="chip ${aS(o.status)}">${w(o.priority)}</span>
1034
1034
  </li>`)}
1035
- </section>`).join("")}</div>`;return je("Work Board",t)}function tR(e){return e.approvals.pending.length===0?"":je("Pending Approvals",[Fe(e.approvals.pending,t=>`
1035
+ </section>`).join("")}</div>`;return je("Work Board",t)}function tS(e){return e.approvals.pending.length===0?"":je("Pending Approvals",[$e(e.approvals.pending,t=>`
1036
1036
  <li>
1037
1037
  <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>
1038
1038
  <span class="chip amber">${w(t.source)}</span>
1039
- </li>`),'<p class="helper">approve via: nativesoul approvals approve &lt;id&gt; --confirm</p>'].join(""))}function rR(e){if(e.cost.totals.cost_reported_runs===0)return"";let t=[ra([["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(vm(e.cost.totals.total_usd))}</strong></div>`,Ki("By Host",e.cost.by_host),Ki("By Session",e.cost.by_session),Ki("By Run",e.cost.by_run)].filter(Boolean);return je("Cost",t.join(""))}function Ki(e,t){let r=t.filter(o=>o.reported_runs>0||o.not_reported_runs>0);return r.length===0?"":`<div class="cost-group">
1039
+ </li>`),'<p class="helper">approve via: nativesoul approvals approve &lt;id&gt; --confirm</p>'].join(""))}function rS(e){if(e.cost.totals.cost_reported_runs===0)return"";let t=[ra([["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(vm(e.cost.totals.total_usd))}</strong></div>`,Ki("By Host",e.cost.by_host),Ki("By Session",e.cost.by_session),Ki("By Run",e.cost.by_run)].filter(Boolean);return je("Cost",t.join(""))}function Ki(e,t){let r=t.filter(o=>o.reported_runs>0||o.not_reported_runs>0);return r.length===0?"":`<div class="cost-group">
1040
1040
  <h2>${w(e)}</h2>
1041
- ${Fe(r,o=>`
1041
+ ${$e(r,o=>`
1042
1042
  <li>
1043
- <div><strong>${w(o.label)}</strong><small>${w(oR(o))}${o.not_reported_runs>0?" &middot; not reported by host":""}</small></div>
1043
+ <div><strong>${w(o.label)}</strong><small>${w(oS(o))}${o.not_reported_runs>0?" &middot; not reported by host":""}</small></div>
1044
1044
  <span class="chip ${o.cost_reported_runs>0?"green":"neutral"}">${w(o.cost_reported_runs>0?vm(o.total_usd):"not reported")}</span>
1045
1045
  </li>`)}
1046
- </div>`}function vm(e){return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:4}).format(e)}function oR(e){return`${e.reported_runs}/${e.runs} reported (${Math.round(e.coverage*100)}%)`}function nR(e){return e.replaceAll("_"," ").replace(/\b\w/g,t=>t.toUpperCase())}function aR(e){return e==="done"?"green":e==="blocked"||e==="failed"?"red":e==="in_progress"||e==="review"?"cyan":"amber"}function je(e,t){return`<section class="panel">
1046
+ </div>`}function vm(e){return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:4}).format(e)}function oS(e){return`${e.reported_runs}/${e.runs} reported (${Math.round(e.coverage*100)}%)`}function nS(e){return e.replaceAll("_"," ").replace(/\b\w/g,t=>t.toUpperCase())}function aS(e){return e==="done"?"green":e==="blocked"||e==="failed"?"red":e==="in_progress"||e==="review"?"cyan":"amber"}function je(e,t){return`<section class="panel">
1047
1047
  <div class="panel-head"><p class="eyebrow"><span>&rsaquo;</span> ${w(e)}</p></div>
1048
1048
  ${t}
1049
- </section>`}function Fe(e,t){return e.length===0?"":`<ul class="records">${e.map(t).join("")}</ul>`}function Zt(e,t){return e.length===0?`<p class="empty">${w(t)}</p>`:""}function ra(e){return`<div class="split-stats">${e.map(([t,r])=>`<div><strong>${r}</strong><span>${w(t)}</span></div>`).join("")}</div>`}function sR(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 a=e[o],s=t===0?0:Math.max(6,Math.round(a/t*100));return`<span class="${n}" style="width:${s}%" title="${o}: ${a}"></span>`}).join("")}</div>`}function iR(){return`<div class="legend">
1049
+ </section>`}function $e(e,t){return e.length===0?"":`<ul class="records">${e.map(t).join("")}</ul>`}function er(e,t){return e.length===0?`<p class="empty">${w(t)}</p>`:""}function ra(e){return`<div class="split-stats">${e.map(([t,r])=>`<div><strong>${r}</strong><span>${w(t)}</span></div>`).join("")}</div>`}function sS(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 a=e[o],s=t===0?0:Math.max(6,Math.round(a/t*100));return`<span class="${n}" style="width:${s}%" title="${o}: ${a}"></span>`}).join("")}</div>`}function iS(){return`<div class="legend">
1050
1050
  <span><i class="green"></i>ready</span>
1051
1051
  <span><i class="cyan"></i>full native capability</span>
1052
1052
  <span><i class="amber"></i>official-fallback</span>
1053
1053
  <span><i class="red"></i>degraded</span>
1054
- </div>`}function lR(e){return{total:e.length,ready:e.filter(t=>t.ready).length}}function cR(e){return e==="active"?"green":e==="candidate"?"amber":e==="rejected"||e==="forgotten"?"red":"neutral"}function dR(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 uR(){return`
1054
+ </div>`}function lS(e){return{total:e.length,ready:e.filter(t=>t.ready).length}}function cS(e){return e==="active"?"green":e==="candidate"?"amber":e==="rejected"||e==="forgotten"?"red":"neutral"}function dS(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 uS(){return`
1055
1055
  :root {
1056
1056
  --red-400:#ff6b6b; --red-500:#ff4444; --red-600:#f02d3a; --red-glow:rgba(255,68,68,.45); --red-glow-soft:rgba(255,68,68,.16);
1057
1057
  --ink-950:#06070d; --ink-900:#0a0c14; --ink-850:#0e1019; --ink-800:#12151f; --ink-700:#1c202d; --ink-600:#262b3a;
@@ -1078,46 +1078,46 @@ h1{margin:0;color:var(--text-100);font:700 44px/1.05 var(--font-display);letter-
1078
1078
  .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}
1079
1079
  @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}}
1080
1080
  @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}}
1081
- `}import{readdir as pR,readFile as mR,realpath as gR}from"node:fs/promises";import Ar from"node:path";var fR=4,hR=500,yR=12e3,Vo={exactSegments:[".aws",".docker",".gnupg",".kube",".netrc",".next",".npmrc",".pypirc",".ssh","build","coverage","dist","node_modules","out","vendor"],segmentPrefixes:[".env","id_rsa"],segmentSuffixes:[".key",".pem"],segmentContains:["credential"],deniedNestedSegments:[[".git","objects"]]},wm=[{filename:"package-lock.json",packageManager:"npm"},{filename:"npm-shrinkwrap.json",packageManager:"npm"},{filename:"pnpm-lock.yaml",packageManager:"pnpm"},{filename:"yarn.lock",packageManager:"yarn"},{filename:"bun.lock",packageManager:"bun"},{filename:"bun.lockb",packageManager:"bun"},{filename:"deno.lock",packageManager:"deno"},{filename:"poetry.lock",packageManager:"poetry"},{filename:"uv.lock",packageManager:"uv"},{filename:"Pipfile.lock",packageManager:"pipenv"},{filename:"go.sum",packageManager:"go modules"},{filename:"Cargo.lock",packageManager:"cargo"},{filename:"composer.lock",packageManager:"composer"},{filename:"Gemfile.lock",packageManager:"bundler"}],Rm=[{filename:"package.json",language:"JavaScript/TypeScript",parser:AR},{filename:"pyproject.toml",language:"Python",parser:ER},{filename:"requirements.txt",language:"Python",parser:PR},{filename:"go.mod",language:"Go",packageManager:"go modules",parser:CR},{filename:"Cargo.toml",language:"Rust",packageManager:"cargo",parser:xR},{filename:"pom.xml",language:"Java",packageManager:"maven",parser:jR},{filename:"build.gradle",language:"Java/Kotlin",packageManager:"gradle",parser:km},{filename:"settings.gradle",language:"Java/Kotlin",packageManager:"gradle",parser:km},{filename:"composer.json",language:"PHP",packageManager:"composer",parser:IR},{filename:"Gemfile",language:"Ruby",packageManager:"bundler",parser:TR}],_R=["README.md","README.markdown","README.txt","README"],bR={readdir:pR,readFile:mR,realpath:gR};async function Qi(e={}){let t=e.fileSystem??bR,r=await kR(e.root??process.cwd(),t),o=e.maxDepth??fR,n=e.maxEntries??hR,a=e.readmeMaxBytes??yR,s=et(),i=new Set,l=[],c={truncated:!1,max_depth:o,max_entries:n,entries_seen:0,reasons:[]},d=null,p={get value(){return d},set value(k){d=k}};await vR({fs:t,root:r,readmeMaxBytes:a,facts:s,manifests:i,readmeRef:p});let g=await wR(r,t),y=await Sm({fs:t,root:r,current:r,relativeSegments:[],depth:0,maxDepth:o,maxEntries:n,readmeMaxBytes:a,facts:s,manifests:i,truncation:c,readmeRef:p});return c.truncated&&l.push(`scan truncated: ${c.reasons.join(", ")}`),{schema_version:1,root:r,generated_at:new Date().toISOString(),languages:Xi(s.languages),frameworks:Xi(s.frameworks),tooling:{package_managers:Xi(s.packageManagers),test_runners:[...s.testRunners].sort(),linters:[...s.linters].sort()},manifests:[...i].sort(),git_remotes:NR(g),structure:y,readme:d??{file:null,summary:"",bytes_read:0,truncated:!1,fenced_code_blocks_stripped:!1},truncation:c,warnings:l}}function Er(e){let t=e.map(r=>r.toLowerCase());for(let r of t)if(Vo.exactSegments.includes(r)||Vo.segmentPrefixes.some(o=>r.startsWith(o))||Vo.segmentSuffixes.some(o=>r.endsWith(o))||Vo.segmentContains.some(o=>r.includes(o)))return!0;return Vo.deniedNestedSegments.some(r=>DR(t,r))}async function vR(e){let t;try{t=await e.fs.readdir(e.root,{withFileTypes:!0})}catch{return}for(let r of t.sort((o,n)=>o.name.localeCompare(n.name))){if(!r.isFile())continue;let o=r.name,n=[r.name];if(Er(n))continue;let a=Ar.join(e.root,r.name);if(Im(r.name)){await Am(a,o,e);continue}if(Tm(r.name)){jm(r.name,o,e.facts);continue}!e.readmeRef.value&&Cm(r.name)&&(e.readmeRef.value=await Em(a,o,e.fs,e.readmeMaxBytes))}}async function kR(e,t){let r=Ar.resolve(e);try{return await t.realpath(r)}catch{return r}}async function Sm(e){let r={name:e.relativeSegments.at(-1)??(Ar.basename(e.root)||e.root),type:"directory",children:[]};if(e.depth>=e.maxDepth)return Yi(e.truncation,`max_depth:${e.maxDepth}`),r;if(e.truncation.entries_seen>=e.maxEntries)return Yi(e.truncation,`max_entries:${e.maxEntries}`),r;let o;try{o=await e.fs.readdir(e.current,{withFileTypes:!0})}catch{return r}for(let n of o.sort((a,s)=>a.name.localeCompare(s.name))){let a=[...e.relativeSegments,n.name];if(Er(a))continue;if(e.truncation.entries_seen>=e.maxEntries){Yi(e.truncation,`max_entries:${e.maxEntries}`);break}e.truncation.entries_seen+=1;let s=Ar.join(e.current,n.name),i=a.join("/");if(n.isDirectory()){r.children?.push(await Sm({...e,current:s,relativeSegments:a,depth:e.depth+1}));continue}if(n.isFile()){if(Im(n.name)){r.children?.push({name:n.name,type:"metadata_file"}),e.manifests.has(i)||await Am(s,i,e);continue}if(Tm(n.name)){r.children?.push({name:n.name,type:"metadata_file"}),jm(n.name,i,e.facts);continue}Cm(n.name)&&((!e.readmeRef.value||e.readmeRef.value.file===i)&&r.children?.push({name:n.name,type:"metadata_file"}),e.readmeRef.value||(e.readmeRef.value=await Em(s,i,e.fs,e.readmeMaxBytes)))}}return r.children?.length===0&&delete r.children,r}async function Am(e,t,r){let o=Ar.basename(t),n=Rm.find(a=>a.filename===o);if(n&&!Er(t.split("/"))&&!r.manifests.has(t)){r.manifests.add(t),Q(r.facts.languages,n.language,t),"packageManager"in n&&n.packageManager&&Q(r.facts.packageManagers,n.packageManager,t);try{let a=await r.fs.readFile(e,{encoding:"utf8"});OR(r.facts,n.parser(a,t))}catch{}}}async function Em(e,t,r,o){if(Er(t.split("/")))return{file:null,summary:"",bytes_read:0,truncated:!1,fenced_code_blocks_stripped:!1};let n=await r.readFile(e,{encoding:"utf8"}),a=Buffer.byteLength(n,"utf8"),s=a>o?n.slice(0,o):n,i=MR(s);return{file:t,summary:LR(i,2e3),bytes_read:Math.min(a,o),truncated:a>o,fenced_code_blocks_stripped:i!==s}}async function wR(e,t){if(Er([".git","config"]))return[];try{let o=await t.readFile(Ar.join(e,".git","config"),{encoding:"utf8"});return RR(o)}catch{return[]}}function RR(e){let t=[],r=!1;for(let o of e.split(/\r?\n/u)){if(o.match(/^\s*\[remote\s+"[^"]+"\]\s*$/u)){r=!0;continue}if(/^\s*\[/u.test(o)){r=!1;continue}if(!r)continue;let a=o.match(/^\s*url\s*=\s*(.+?)\s*$/u)?.[1];if(!a)continue;let s=SR(a);s&&t.push(s)}return t}function SR(e){let t=e.trim().replace(/\.git$/u,""),r=t.match(/^git@([^:]+):(.+)$/u),o=t.match(/^(?:https?|ssh):\/\/(?:[^@/\s]+@)?([^/]+)\/(.+)$/u),n=r??o;if(!n?.[1]||!n[2])return null;let a=n[1],s=(a.includes("@")?a.slice(a.lastIndexOf("@")+1):a).toLowerCase().replace(/:\d+$/u,"");if(!s)return null;let l=n[2].split("/").filter(Boolean).at(-1);return l?{host:s,name:l.toLowerCase()}:null}function AR(e,t){try{let r=JSON.parse(e),o=new Set([...Object.keys(r.dependencies??{}),...Object.keys(r.devDependencies??{})]),n=et();o.has("typescript")&&Q(n.languages,"TypeScript",t);for(let[a,s]of[["react","React"],["next","Next.js"],["vue","Vue"],["nuxt","Nuxt"],["svelte","Svelte"],["astro","Astro"],["express","Express"],["fastify","Fastify"],["vite","Vite"]])o.has(a)&&Q(n.frameworks,s,t);for(let[a,s]of Object.entries(r.scripts??{})){let i=`${a} ${s}`.toLowerCase();(a==="test"||/\b(vitest|jest|node --test|mocha)\b/u.test(i))&&n.testRunners.add(s.includes("vitest")?"vitest":s.includes("jest")?"jest":"npm test"),(a==="lint"||/\beslint\b/u.test(i))&&n.linters.add("eslint")}return n}catch{return{}}}function ER(e,t){let r=et(),o=e.toLowerCase();return o.includes("[tool.poetry")&&Q(r.packageManagers,"poetry",t),o.includes("[tool.uv")&&Q(r.packageManagers,"uv",t),Pm(o,t,r),xm(o,r),r}function PR(e,t){let r=et();return Q(r.packageManagers,"pip",t),Pm(e.toLowerCase(),t,r),xm(e.toLowerCase(),r),r}function xR(e,t){let r=et();return(e.toLowerCase().includes("actix")||e.toLowerCase().includes("axum"))&&Q(r.frameworks,e.toLowerCase().includes("axum")?"Axum":"Actix",t),r}function jR(e,t){let r=et();return e.toLowerCase().includes("spring-boot")&&Q(r.frameworks,"Spring Boot",t),r}function km(e,t){let r=et();return e.toLowerCase().includes("springframework.boot")&&Q(r.frameworks,"Spring Boot",t),r}function IR(e,t){let r=et();return e.toLowerCase().includes("laravel/framework")&&Q(r.frameworks,"Laravel",t),r}function TR(e,t){let r=et();return/gem\s+["']rails["']/u.test(e)&&Q(r.frameworks,"Rails",t),r}function CR(){return{}}function Pm(e,t,r){for(let[o,n]of[["django","Django"],["fastapi","FastAPI"],["flask","Flask"]])e.includes(o)&&Q(r.frameworks,n,t)}function xm(e,t){e.includes("pytest")&&t.testRunners.add("pytest"),e.includes("ruff")&&t.linters.add("ruff")}function jm(e,t,r){let o=wm.find(n=>n.filename===e);o&&Q(r.packageManagers,o.packageManager,t)}function Im(e){return Rm.some(t=>t.filename===e)}function Tm(e){return wm.some(t=>t.filename===e)}function Cm(e){return _R.some(t=>t.toLowerCase()===e.toLowerCase())}function et(){return{languages:new Map,frameworks:new Map,packageManagers:new Map,testRunners:new Set,linters:new Set}}function Q(e,t,r){let o=e.get(t)??new Set;o.add(r),e.set(t,o)}function OR(e,t){for(let[r,o]of t.languages??[])for(let n of o)Q(e.languages,r,n);for(let[r,o]of t.frameworks??[])for(let n of o)Q(e.frameworks,r,n);for(let[r,o]of t.packageManagers??[])for(let n of o)Q(e.packageManagers,r,n);for(let r of t.testRunners??[])e.testRunners.add(r);for(let r of t.linters??[])e.linters.add(r)}function Xi(e){return[...e.entries()].map(([t,r])=>({name:t,evidence:[...r].sort()})).sort((t,r)=>t.name.localeCompare(r.name))}function NR(e){let t=new Set;return e.filter(r=>{let o=`${r.host}/${r.name}`;return t.has(o)?!1:(t.add(o),!0)}).sort((r,o)=>`${r.host}/${r.name}`.localeCompare(`${o.host}/${o.name}`))}function MR(e){return e.replace(/```[\s\S]*?```/gu,"").replace(/~~~[\s\S]*?~~~/gu,"")}function LR(e,t){let r=e.split(/\r?\n/u).map(o=>o.trim()).filter(Boolean).join(`
1082
- `);return r.length>t?`${r.slice(0,t-3)}...`:r}function Yi(e,t){e.truncated=!0,e.reasons.includes(t)||e.reasons.push(t)}function DR(e,t){for(let r=0;r<=e.length-t.length;r+=1)if(t.every((o,n)=>e[r+n]===o))return!0;return!1}import{mkdir as FR,readFile as UR,writeFile as BR}from"node:fs/promises";import er from"node:path";async function el(e){let t=f(e.home),r=_(t.database),o;try{let n=r.findPendingApprovalMatch(Zi(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 a=r.createApproval({id:T("approval"),...Zi(e)});o={approval:a.approval,created:!!a.approval,available:a.available,warning:a.warning}}finally{r.close()}return o.created&&o.approval&&await h({home:t.home,type:"approval_requested",details:rl(o.approval)}),o}async function Pr(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 Oe,n}finally{r.close()}return o.approval&&await h({home:t.home,type:o.approval.status==="approved"?"approval_approved":"approval_rejected",details:rl(o.approval)}),o}async function tl(e){let t=f(e.home),r=_(t.database),o;try{let n=r.createDecidedApproval({id:T("approval"),...Zi(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:{...rl(o.approval),standing_order:e.standingOrderId}}),o}function oa(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 na(e={}){let t=_(f(e.home).database);try{return t.listApprovals(e.status)}finally{t.close()}}function Zi(e){return{action:e.action,class:e.class,target:e.target??null,project:e.project??null,host:e.host??null}}function rl(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 tt(e){let t=await kt(e),r=await HR(e,t);if(r){let n=await tl({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 el({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 HR(e,t){return t.decision!=="allowed"||!t.matched_standing_order||!$R(e.className)?null:(await vt(e.home)).find(o=>o.id===t.matched_standing_order&&o.allowed.includes(e.action)&&Ji(o,e))??null}function $R(e){return e==="write_project"||e==="external_write"}async function nl(e){let t=f(e.home),r=K(e.scan.root,t.home),o={id:r.id,root:e.scan.root},n=VR(e.scan,o.id),a=WR(e.scan),s=JR(e.scan),i=await ol(t.home,"USER.md"),l=await ol(t.home,"TOOLS.md");return{schema_version:1,dry_run_default:!0,generated_at:e.generatedAt??new Date().toISOString(),scan:e.scan,project:o,sinks:{candidate_memories:n,user_md:{sink:"managed_markdown",target:"USER.md",managed_content:a,merged_preview:ur(i,a)},tools_md:{sink:"managed_markdown",target:"TOOLS.md",managed_content:s,merged_preview:ur(l,s)},project_registry:{sink:"project_registry",root:e.scan.root,project_id:r.id,resolution:r}},warnings:[...e.scan.warnings,...e.scan.truncation.truncated?["Proposal is based on a truncated scan; review before applying."]:[]]}}async function al(e){let t=await v(e.home),r=e.host??"codex",o=[],n=e.proposal.project.id;return o.push(await qR({home:t.home,proposal:e.proposal,host:r,project:n})),o.push(await Om({home:t.home,proposal:e.proposal,host:r,project:n,sink:"user_md"})),o.push(await Om({home:t.home,proposal:e.proposal,host:r,project:n,sink:"tools_md"})),o.push(await GR({home:t.home,proposal:e.proposal,host:r,project:n})),{applied:o.some(a=>a.applied),dry_run:!1,home:t.home,proposal:e.proposal,sinks:o,warnings:o.flatMap(a=>a.warning?[a.warning]:[])}}function VR(e,t){let r=[],o=[Ue("Languages",e.languages.map(n=>n.name)),Ue("Frameworks",e.frameworks.map(n=>n.name)),Ue("Package managers",e.tooling.package_managers.map(n=>n.name)),Ue("Test runners",e.tooling.test_runners),Ue("Linters",e.tooling.linters)].filter(Boolean);return o.length>0&&r.push({sink:"candidate_memory",project:t,content:[`Dev-environment scan stack facts for ${er.basename(e.root)}.`,"",...o].join(`
1083
- `),confidence:.6,authority:"observed",sensitivity:"normal",source:{kind:"dev_environment_scan",root:e.root,schema_version:e.schema_version}}),(e.manifests.length>0||e.readme.summary.length>0)&&r.push({sink:"candidate_memory",project:t,content:[`Dev-environment scan conventions for ${er.basename(e.root)}.`,"",e.manifests.length>0?`Manifests: ${e.manifests.join(", ")}`:null,e.readme.summary.length>0?`README summary: ${e.readme.summary}`:null,e.truncation.truncated?`Scan was truncated: ${e.truncation.reasons.join(", ")}`:null].filter(n=>!!n).join(`
1084
- `),confidence:e.truncation.truncated?.45:.55,authority:"observed",sensitivity:"normal",source:{kind:"dev_environment_scan",root:e.root,schema_version:e.schema_version}}),r}function WR(e){return["## Engineering Preferences","","Detected local project context from `nativesoul scan`.","",...Nm([Ue("Languages",e.languages.map(r=>r.name)),Ue("Frameworks",e.frameworks.map(r=>r.name)),e.truncation.truncated?`Scan truncated: ${e.truncation.reasons.join(", ")}`:null])].join(`
1085
- `)}function JR(e){return["## Local Tool Conventions","","Detected by `nativesoul scan`; verify before treating as policy.","",...Nm([Ue("Package managers",e.tooling.package_managers.map(r=>r.name)),Ue("Test runners",e.tooling.test_runners),Ue("Linters",e.tooling.linters),e.manifests.length>0?`Manifests: ${e.manifests.join(", ")}`:null])].join(`
1086
- `)}async function qR(e){let t=await tt({home:e.home,action:"scan.apply.candidate_memories",className:"write_local",target:"memory:candidate",project:e.project,host:e.host});if(t.evaluation.decision!=="allowed")return await xr(e.home,"scan.apply.candidate_memories","blocked",e.project,{decision:t.evaluation.decision}),sl("candidate_memories","memory:candidate",t,"scan.apply.candidate_memories");let r=[];for(let o of e.proposal.sinks.candidate_memories)r.push(await te(e.home,o));return await xr(e.home,"scan.apply.candidate_memories","ok",e.project,{count:r.length}),{sink:"candidate_memories",target:"memory:candidate",applied:!0,skipped:!1,policy_gate:t,audit_event_type:"scan.apply.candidate_memories",warning:null,memory_ids:r.map(o=>o.id)}}async function Om(e){let t=e.proposal.sinks[e.sink],r=await tt({home:e.home,action:`scan.apply.${e.sink}`,className:"write_local",target:t.target,project:e.project,host:e.host});if(r.evaluation.decision!=="allowed")return await xr(e.home,`scan.apply.${e.sink}`,"blocked",e.project,{decision:r.evaluation.decision}),sl(e.sink,t.target,r,`scan.apply.${e.sink}`);let o=KR(e.home,t.target);await FR(er.dirname(o),{recursive:!0,mode:448});let n=await ol(e.home,t.target),a=ur(n,t.managed_content);return await BR(o,a,{encoding:"utf8",mode:384}),await xr(e.home,`scan.apply.${e.sink}`,"ok",e.project,{target:t.target}),{sink:e.sink,target:t.target,applied:!0,skipped:!1,policy_gate:r,audit_event_type:`scan.apply.${e.sink}`,warning:null}}async function GR(e){let t=await tt({home:e.home,action:"scan.apply.project_registry",className:"write_local",target:"project_registry",project:e.project,host:e.host});if(t.evaluation.decision!=="allowed")return await xr(e.home,"scan.apply.project_registry","blocked",e.project,{decision:t.evaluation.decision}),sl("project_registry","project_registry",t,"scan.apply.project_registry");let r=await uo({home:e.home,resolution:e.proposal.sinks.project_registry.resolution});return await xr(e.home,"scan.apply.project_registry",r.touched?"ok":"error",e.project,{inserted:r.inserted,degraded:r.degraded,warning:r.warning}),{sink:"project_registry",target:"project_registry",applied:r.touched,skipped:!1,policy_gate:t,audit_event_type:"scan.apply.project_registry",warning:r.warning,project_result:r}}function sl(e,t,r,o){return{sink:e,target:t,applied:!1,skipped:!0,policy_gate:r,audit_event_type:o,warning:`POLICY_GATE_BLOCKED:${r.evaluation.decision}`}}async function xr(e,t,r,o,n){await h({home:e,type:t,result:r,details:{project:o,...n}})}function KR(e,t){return me(er.join(e,t),{root:e,protectedFiles:[er.join(e,"SOUL.md"),er.join(e,"POLICY.md")]})}async function ol(e,t){try{return await UR(er.join(e,t),"utf8")}catch{return""}}function Ue(e,t){return t.length>0?`${e}: ${t.join(", ")}`:null}function Nm(e){let t=e.filter(r=>!!r).map(r=>`- ${r}`);return t.length>0?t:["- No local conventions detected from metadata files."]}import{readFile as Mm}from"node:fs/promises";import Lm from"node:path";var aa=1500;async function Wo(e){let t=await v(e.home),r=await YR(t.home),o=await QR(t.home),n=new Date,a=zR(e.ttlSeconds??r.ttlSeconds),s=new Date(n.getTime()+a*1e3).toISOString(),i=cl(e.project,e.slot),l=_(t.database),c;try{c=l.claimHeartbeatLease({id:T("lease"),slot:e.slot,holder:e.host,idempotencyKey:i,now:n.toISOString(),expiresAt:s})}finally{l.close()}return await h({home:t.home,type:c.claimed?"heartbeat_claimed":"heartbeat_skipped",details:{slot:e.slot,host:e.host,project:e.project,lease_id:c.lease.id,reason:c.reason}}),{slot:e.slot,host:e.host,project:e.project,claimed:c.claimed,reason:c.reason,silent_ack:c.claimed||c.reason==="LEASE_OCCUPIED"&&!r.skipWhenBusy?null:"HEARTBEAT_OK",lease:c.lease,...c.claimed&&o?{heartbeat_checklist:o}:{}}}async function Jo(e){let t=await v(e.home),r=new Date().toISOString(),o=cl(e.project,e.slot),n=H(e.result??"HEARTBEAT_OK"),a=H(XR(e.evidence??{},e.workItemId)),s=H(e.cost??{}),i=rr(s),l=_(t.database),c;try{c=l.completeHeartbeatLease({idempotencyKey:o,host:e.host,project:e.project,result:n,evidence:a,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 ll(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 cl(e,t){return`heartbeat:${e}:${t}`}function zR(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e),1),1440*60):aa}function XR(e,t){return t?{...e&&typeof e=="object"&&!Array.isArray(e)?e:{},work_item_id:t}:e}async function YR(e){let t;try{t=await Mm(Lm.join(e,"config.yaml"),"utf8")}catch{return{ttlSeconds:aa,skipWhenBusy:!0}}return{ttlSeconds:ZR(t),skipWhenBusy:eS(t,"skip_when_busy",!0)}}async function QR(e){let t;try{t=await Mm(Lm.join(e,"HEARTBEAT.md"),"utf8")}catch{return""}return t.split(/\r?\n/u).filter(r=>{let o=r.trim();return o.length>0&&!o.startsWith("#")}).join(`
1087
- `).trim()}function ZR(e){let t=il(e,"ttl_seconds"),r=il(e,"lease_ttl"),o=tS(e,"heartbeat_ttl_seconds"),n=rS(t??r??o);return Number.isFinite(n)?n:aa}function eS(e,t,r){let o=il(e,t);return o?/^(true|yes|1)$/i.test(o)?!0:/^(false|no|0)$/i.test(o)?!1:r:r}function il(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 tS(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`^\\s*${r}:\\s*([^#\\n]+)`,"mu"))?.[1]?.trim().replace(/^["']|["']$/g,"")??null}function rS(e){if(!e)return aa;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 dl(e){let t=await v(e.home);_(t.database).close();let o=Ge(e.host),n=(await Promise.all(o.map(s=>Jr(s)))).flat(),a=[];for(let s of o){let i=ze(s,e.surface);for(let l of i){let c=n.find(se=>se.host===s),d=yr(s,e.targetRoot,l),p=d.managedBlock?await Kr({home:t.home,host:s,apply:e.apply,targetPath:d.managedBlock}):oS(s,l,!e.apply),g=await Ao({home:t.home,host:s,apply:e.apply,targetPath:d.mcpRegistration,commandMode:"package"}),y=await pi({home:t.home,host:s,surface:l,apply:e.apply,targetPath:d.plugin}),k=await yt({home:t.home,host:s,surface:l,mode:"leader",apply:e.apply,pluginEnabled:y.enabled,hostConfigRoot:Qe(s,e.targetRoot),targetRoot:e.targetRoot}),R=e.apply?await It({home:t.home,host:s}):[],U=e.apply?R.reduce((se,Be)=>se+Be.count,0):c?.sources.length??0,Z=[...k.warnings,...y.issues.map(se=>se.code),...c?.detected?[]:[`${s.toUpperCase()}_NOT_DETECTED`]],ke=[p.backupPath,g.backupPath,y.backupPath].filter(se=>se!==null),Te=Z.length===0&&U>0?"ready":"degraded";a.push({host:s,surface:l,detected:c?.detected??!1,status:Te,managed_block:p,mcp_registration:g,plugin:y,schedule:k,capability_count:U,snapshots:ke,warnings:Z})}}return{dryRun:!e.apply,applied:e.apply,home:t.home,hosts:a,status:a.every(s=>s.status==="ready")?"ready":"degraded"}}function oS(e,t,r){let o=A("");return{host:e,targetPath:`not-applicable:${Ut(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 nS from"node:path";import{rm as Dm}from"node:fs/promises";var ul="DELETE_NATIVESOUL_HOME";async function pl(e){if(e.purgeData===!0&&e.confirmPurge!==ul)throw new Error(`--purge-data requires --confirm-purge-nativesoul-data ${ul}`);let t=await v(e.home);_(t.database).close();let o=Ge(e.host);if(e.apply)for(let l of o)for(let c of ze(l,e.surface))await Hm({home:t.home,host:l,surface:c,apply:!1,targetRoot:e.targetRoot});let n=[];for(let l of o)for(let c of ze(l,e.surface))n.push(await Hm({home:t.home,host:l,surface:c,apply:e.apply,targetRoot:e.targetRoot}));let a={requested:e.purgeData===!0,confirmed:e.confirmPurge===ul,applied:e.apply&&e.purgeData===!0,preserved:!(e.apply&&e.purgeData===!0)},s=nS.join(t.home,"backups"),i={path:s,applied:e.apply,preserved:!e.apply};return i.applied&&await Dm(s,{recursive:!0,force:!0}),a.applied&&await Dm(t.home,{recursive:!0,force:!0}),{dryRun:!e.apply,applied:e.apply,home:t.home,hosts:n,backups_purge:i,data_purge:a,status:n.every(l=>l.status==="ready")?"ready":"degraded"}}async function Hm(e){let t=yr(e.host,e.targetRoot,e.surface),r=t.managedBlock?await gs({home:e.home,host:e.host,apply:e.apply,targetPath:t.managedBlock}):aS(e.host,e.surface,!e.apply),o=await fi({home:e.home,host:e.host,apply:e.apply,targetPath:t.mcpRegistration}),n=await mi({home:e.home,host:e.host,surface:e.surface,apply:e.apply,targetPath:t.plugin}),a=[r.backupPath,o.backupPath,n.backupPath].filter(s=>s!==null);return{host:e.host,surface:e.surface,status:"ready",managed_block:r,mcp_registration:o,plugin:n,snapshots:a,warnings:["SCHEDULE_TEARDOWN_NOT_PERFORMED"]}}function aS(e,t,r){let o=A("");return{host:e,targetPath:`not-applicable:${Ut(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}}var Fm={"memory.promote":{action:"memory.promote",className:"write_local"},"memory.forget":{action:"memory.forget",className:"write_local"},"memory.reject":{action:"memory.reject",className:"write_local"},"work_item.create":{action:"work_item.create",className:"write_local"},"work_item.claim":{action:"work_item.claim",className:"write_local"},"work_item.complete":{action:"work_item.complete",className:"write_local"},"install.apply":{action:"install.apply",className:"write_local"},"policy_pack.apply":{action:"policy_pack.apply",className:"write_local"}};async function tr(e,t={}){let r=Fm[e],o={home:t.home,action:r.action,className:r.className,target:t.target??void 0,project:t.project??void 0,host:t.host??void 0},n,a,s,i;try{let l=await tt(o);n=l.evaluation,a=l.approval?.id??null,s=l.approval_created,i=l.warning}catch(l){return await $m(r,t,["POLICY_GATE_UNAVAILABLE"],"error"),{status:"deny",decision:"denied",reason:`policy gate unavailable (fail-closed): ${l.message}`,evaluation:null}}return n.decision==="allowed"?{status:"allow",decision:"allowed",evaluation:n}:n.decision==="approval_required"?{status:"approval_required",decision:"approval_required",approvalId:a,approvalCreated:s,warning:i,evaluation:n}:(await $m(r,t,n.reasons,"blocked"),{status:"deny",decision:n.decision,reason:`${r.action} ${n.decision}: ${n.reasons.join(", ")}`,evaluation:n})}async function $m(e,t,r,o){try{let n=await v(t.home);await h({home:n.home,type:"policy_blocked",result:"blocked",details:{boundary:"sensitive_operation",action:e.action,class:e.className,target:t.target??null,project:t.project??null,host:t.host??null,outcome:o,reasons:r}})}catch{}}import{existsSync as _l}from"node:fs";import{mkdir as Gm,readFile as ia,rm as ES,writeFile as Km}from"node:fs/promises";import ve from"node:path";import{existsSync as kS}from"node:fs";import{readdir as wS,readFile as ml}from"node:fs/promises";import wt from"node:path";import{fileURLToPath as RS}from"node:url";import Um from"node:path";var sS=new Set(["id","version","title","description","intended_use","approvals","standing_orders","policy_proposals","managed_blocks","rollback","metadata"]),iS=new Set(["id","action","authority","allowed","approval_required","scope_projects","scope_hosts","reason"]),lS=new Set(["target","summary","rationale","rollback_note"]),cS=new Set(["target","marker","content","rollback_key"]),dS=new Set(["strategy","restores","notes"]),uS=new Set(["maturity","owner","source"]),pS=new Set(["SOUL.MD","POLICY.MD"]),Bm=["AGENTS.md","CLAUDE.md","GEMINI.md","Agents.md",".claude/CLAUDE.md"],mS=new Set(Bm);function Ir(e){let t=[];return rt(e)?(Tr(e,sS,"pack",t),ae(e,"id","pack",t,/^[a-z0-9][a-z0-9-]{2,63}$/u),ae(e,"version","pack",t,/^[0-9]+\.[0-9]+\.[0-9]+$/u),ae(e,"title","pack",t),ae(e,"description","pack",t),ae(e,"intended_use","pack",t),jr(e.approvals,"pack.approvals",t,!1),gS(e.standing_orders,t),fS(e.policy_proposals,t),hS(e.managed_blocks,t),yS(e.rollback,t),_S(e.metadata,t),vS(e,t),t):["Policy pack must be an object"]}function rt(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Vm(e){return typeof e=="string"?e:null}function gS(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(!rt(o)){t.push(`${n} must be an object`);continue}Tr(o,iS,n,t),ae(o,"id",n,t,/^[a-z0-9][a-z0-9-]{2,63}$/u),sa(o,"action",n,["add","propose"],t),sa(o,"authority",n,["operator-approved","proposal"],t),jr(o.allowed,`${n}.allowed`,t,!0),jr(o.approval_required,`${n}.approval_required`,t,!0),jr(o.scope_projects,`${n}.scope_projects`,t,!0),jr(o.scope_hosts,`${n}.scope_hosts`,t,!0),ae(o,"reason",n,t);let a=Array.isArray(o.allowed)?o.allowed:[],s=Array.isArray(o.approval_required)?o.approval_required:[];a.length===0&&s.length===0&&t.push(`${n} must declare at least one allowed or approval_required action`)}}function fS(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(!rt(o)){t.push(`${n} must be an object`);continue}Tr(o,lS,n,t),sa(o,"target",n,["SOUL.md","POLICY.md"],t),ae(o,"summary",n,t),ae(o,"rationale",n,t),ae(o,"rollback_note",n,t)}}function hS(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(!rt(o)){t.push(`${n} must be an object`);continue}Tr(o,cS,n,t),ae(o,"target",n,t),ae(o,"marker",n,t),ae(o,"content",n,t),ae(o,"rollback_key",n,t),typeof o.target=="string"&&bS(o.target,n,t)}}function yS(e,t){if(!rt(e)){t.push("pack.rollback must be an object");return}Tr(e,dS,"pack.rollback",t),sa(e,"strategy","pack.rollback",["proposal-only","managed-block","snapshot-required"],t),jr(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"),ae(e,"notes","pack.rollback",t)}function _S(e,t){if(e!==void 0){if(!rt(e)){t.push("pack.metadata must be an object");return}Tr(e,uS,"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 bS(e,t,r){let o=e.replaceAll("\\","/"),n=Um.basename(o).toUpperCase();(Um.isAbsolute(e)||o.includes("../")||o.startsWith("../"))&&r.push(`${t}.target must be a relative managed host file path`),pS.has(n)&&r.push(`${t}.target must not target protected SOUL.md or POLICY.md`),mS.has(o)||r.push(`${t}.target is outside supported managed-block scope`)}function vS(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 Tr(e,t,r,o){for(let n of Object.keys(e))t.has(n)||o.push(`${r}.${n} is not allowed`)}function ae(e,t,r,o,n){let a=e[t];if(typeof a!="string"||a.trim()===""){o.push(`${r}.${t} must be a non-empty string`);return}n&&!n.test(a)&&o.push(`${r}.${t} has invalid format`)}function sa(e,t,r,o,n){let a=e[t];(typeof a!="string"||!o.includes(a))&&n.push(`${r}.${t} must be one of ${o.join(", ")}`)}function jr(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 gl(){return(await Wm()).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 qo(e){let r=(await Wm()).find(o=>o.pack.id===e);if(!r)throw new Error(`Policy pack not found: ${e}`);return{...r.pack,source:r.source}}async function fl(e){try{let{value:t,source:r}=e.file?{value:JSON.parse(await ml(e.file,"utf8")),source:wt.resolve(e.file)}:await SS(e.id),o=Ir(t),n=rt(t)?Vm(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?wt.resolve(e.file):null,errors:[t instanceof Error?t.message:"Unknown policy pack validation error"],warnings:[]}}}async function Wm(){let e=await Jm(),t=[];for(let r of e){let o=JSON.parse(await ml(r,"utf8")),n=Ir(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 SS(e){if(!e)throw new Error("policy packs validate requires <id> or --file <path>");let t=await Jm();for(let r of t){let o=JSON.parse(await ml(r,"utf8"));if(rt(o)&&o.id===e)return{value:o,source:r}}throw new Error(`Policy pack not found: ${e}`)}async function Jm(){let e=AS(),t=(await wS(e)).filter(r=>r.endsWith(".json")).map(r=>wt.join(e,r)).sort();if(t.length===0)throw new Error(`No policy packs found in ${e}`);return t}function AS(){let e=wt.dirname(RS(import.meta.url)),r=[wt.resolve(process.cwd(),"policy-packs"),wt.resolve(e,"../../../policy-packs"),wt.resolve(e,"../../../../policy-packs"),wt.resolve(e,"../../../../../policy-packs")].find(o=>kS(o));if(!r)throw new Error("Built-in policy pack catalog not found");return r}async function bl(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 PS(e),o=ve.resolve(e.targetRoot??process.cwd()),n=new Date().toISOString(),a=await xS({home:t.home,pack:r.pack,targetRoot:o,createdAt:n}),s=a.map(qm),i=a.filter(p=>p.changed),l=VS(r.pack),c=e.apply&&i.length>0?await DS({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 kl(g,"after"),p.push(g)}catch(g){throw await OS(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=>qm(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: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 h({home:t.home,type:e.apply?"policy_pack_apply":"policy_pack_apply_dry_run",details:WS(d,e.approvalEvidence)}),d}async function vl(e){let t=await v(e.home),r=NS(await ia(e.snapshotPath,"utf8"),e.snapshotPath),o=r.files.map(a=>CS(a));if(e.apply)for(let a of r.files)await kl(a,"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 PS(e){if(e.file){let r=ve.resolve(e.file),o=JSON.parse(await ia(r,"utf8")),n=Ir(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 qo(e.id);return{pack:t,source:t.source}}async function xS(e){let t=[];for(let r of e.pack.standing_orders)t.push(await jS(e.home,e.pack,r));for(let r of e.pack.policy_proposals)t.push(await IS(e.home,e.pack,r,e.createdAt));for(let r of e.pack.managed_blocks)t.push(await TS(e.targetRoot,e.pack,r));return t}async function jS(e,t,r){if(r.action==="add"&&r.authority==="operator-approved"){let n=ve.join(e,"standing-orders",`${r.id}.yaml`);return await hl("standing_order",n,HS(r,t))}let o=ve.join(e,"proposals",`standing-order-${t.id}-${r.id}.md`);return await hl("standing_order",o,$S(r,t))}async function IS(e,t,r,o){let n=o.replaceAll(/[:.]/gu,"-"),a=ve.join(e,"proposals",`${n}-${t.id}-${r.target}.md`);return await hl("policy_proposal",a,FS(r,t,o))}async function TS(e,t,r){let o=ve.resolve(e,r.target);if(!qS(e,o))throw new Error(`Policy pack managed block target escapes target root: ${r.target}`);let n=_l(o),a=n?await ia(o,"utf8"):null,s=US(a,t,r);return zm("managed_block",o,n,a,s)}async function hl(e,t,r){let o=_l(t),n=o?await ia(t,"utf8"):null;return zm(e,t,o,n,r)}function zm(e,t,r,o,n){let a=o===null?null:A(o),s=n===null?null:A(n),i=o!==n;return{kind:e,targetPath:t,action:i?r?"replace":"create":"noop",changed:i,beforeHash:a,afterHash:s,diff:JS(o,n),beforeExists:r,beforeContent:o,afterContent:n}}function qm(e){return{kind:e.kind,targetPath:e.targetPath,action:e.action,changed:e.changed,beforeHash:e.beforeHash,afterHash:e.afterHash,diff:e.diff}}function CS(e){return{kind:e.kind,targetPath:e.targetPath,action:e.beforeExists?"replace":"remove",changed:!0,beforeHash:e.afterHash,afterHash:e.beforeHash,diff:Ym(e.afterHash,e.beforeHash)}}async function kl(e,t){let r=t==="before"?e.beforeExists:e.afterHash!==null,o=t==="before"?e.beforeContent:e.afterContent;r&&o!==null?(await Gm(ve.dirname(e.targetPath),{recursive:!0,mode:448}),me(e.targetPath,{allowSymlinkTarget:!0}),await Km(e.targetPath,o,{encoding:"utf8",mode:384})):_l(e.targetPath)&&await ES(e.targetPath)}async function OS(e){for(let t of[...e].reverse())await kl(t,"before")}function NS(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=MS(r);if(o.length>0)throw new Error(`Invalid policy pack snapshot ${t}: ${o.join("; ")}`);return r}function MS(e){let t=[];if(!yl(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 yl(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(...LS(o,`files[${n}]`))}):t.push("files must be an array"),t}function LS(e,t){let r=[];if(!yl(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"||!ve.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 yl(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function DS(e){let t=ve.join(e.home,"backups","policy-packs");await Gm(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=ve.join(t,o);return await Km(n,JSON.stringify(r,null,2),{encoding:"utf8",mode:384,flag:"wx"}),n}function HS(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(`
1088
- `)}function $S(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(`
1089
- `)}function FS(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(`
1090
- `)}function US(e,t,r){let o=BS(t,r);if(e===null||e.length===0)return o;let n=Xm(t,r),a=e.indexOf(n.start),s=e.indexOf(n.end);if(a>=0&&s>a){let l=s+n.end.length,c=e.slice(l).replace(/^\n/u,"");return`${e.slice(0,a)}${o}${c}`}let i=e.endsWith(`
1081
+ `}import{readdir as pS,readFile as mS,realpath as gS}from"node:fs/promises";import Er from"node:path";var fS=4,hS=500,yS=12e3,Vo={exactSegments:[".aws",".docker",".gnupg",".kube",".netrc",".next",".npmrc",".pypirc",".ssh","build","coverage","dist","node_modules","out","vendor"],segmentPrefixes:[".env","id_rsa"],segmentSuffixes:[".key",".pem"],segmentContains:["credential"],deniedNestedSegments:[[".git","objects"]]},wm=[{filename:"package-lock.json",packageManager:"npm"},{filename:"npm-shrinkwrap.json",packageManager:"npm"},{filename:"pnpm-lock.yaml",packageManager:"pnpm"},{filename:"yarn.lock",packageManager:"yarn"},{filename:"bun.lock",packageManager:"bun"},{filename:"bun.lockb",packageManager:"bun"},{filename:"deno.lock",packageManager:"deno"},{filename:"poetry.lock",packageManager:"poetry"},{filename:"uv.lock",packageManager:"uv"},{filename:"Pipfile.lock",packageManager:"pipenv"},{filename:"go.sum",packageManager:"go modules"},{filename:"Cargo.lock",packageManager:"cargo"},{filename:"composer.lock",packageManager:"composer"},{filename:"Gemfile.lock",packageManager:"bundler"}],Sm=[{filename:"package.json",language:"JavaScript/TypeScript",parser:AS},{filename:"pyproject.toml",language:"Python",parser:ES},{filename:"requirements.txt",language:"Python",parser:PS},{filename:"go.mod",language:"Go",packageManager:"go modules",parser:CS},{filename:"Cargo.toml",language:"Rust",packageManager:"cargo",parser:xS},{filename:"pom.xml",language:"Java",packageManager:"maven",parser:jS},{filename:"build.gradle",language:"Java/Kotlin",packageManager:"gradle",parser:km},{filename:"settings.gradle",language:"Java/Kotlin",packageManager:"gradle",parser:km},{filename:"composer.json",language:"PHP",packageManager:"composer",parser:IS},{filename:"Gemfile",language:"Ruby",packageManager:"bundler",parser:TS}],_S=["README.md","README.markdown","README.txt","README"],bS={readdir:pS,readFile:mS,realpath:gS};async function Qi(e={}){let t=e.fileSystem??bS,r=await kS(e.root??process.cwd(),t),o=e.maxDepth??fS,n=e.maxEntries??hS,a=e.readmeMaxBytes??yS,s=Ze(),i=new Set,l=[],c={truncated:!1,max_depth:o,max_entries:n,entries_seen:0,reasons:[]},d=null,p={get value(){return d},set value(k){d=k}};await vS({fs:t,root:r,readmeMaxBytes:a,facts:s,manifests:i,readmeRef:p});let g=await wS(r,t),y=await Rm({fs:t,root:r,current:r,relativeSegments:[],depth:0,maxDepth:o,maxEntries:n,readmeMaxBytes:a,facts:s,manifests:i,truncation:c,readmeRef:p});return c.truncated&&l.push(`scan truncated: ${c.reasons.join(", ")}`),{schema_version:1,root:r,generated_at:new Date().toISOString(),languages:Xi(s.languages),frameworks:Xi(s.frameworks),tooling:{package_managers:Xi(s.packageManagers),test_runners:[...s.testRunners].sort(),linters:[...s.linters].sort()},manifests:[...i].sort(),git_remotes:NS(g),structure:y,readme:d??{file:null,summary:"",bytes_read:0,truncated:!1,fenced_code_blocks_stripped:!1},truncation:c,warnings:l}}function Pr(e){let t=e.map(r=>r.toLowerCase());for(let r of t)if(Vo.exactSegments.includes(r)||Vo.segmentPrefixes.some(o=>r.startsWith(o))||Vo.segmentSuffixes.some(o=>r.endsWith(o))||Vo.segmentContains.some(o=>r.includes(o)))return!0;return Vo.deniedNestedSegments.some(r=>DS(t,r))}async function vS(e){let t;try{t=await e.fs.readdir(e.root,{withFileTypes:!0})}catch{return}for(let r of t.sort((o,n)=>o.name.localeCompare(n.name))){if(!r.isFile())continue;let o=r.name,n=[r.name];if(Pr(n))continue;let a=Er.join(e.root,r.name);if(Im(r.name)){await Am(a,o,e);continue}if(Tm(r.name)){jm(r.name,o,e.facts);continue}!e.readmeRef.value&&Cm(r.name)&&(e.readmeRef.value=await Em(a,o,e.fs,e.readmeMaxBytes))}}async function kS(e,t){let r=Er.resolve(e);try{return await t.realpath(r)}catch{return r}}async function Rm(e){let r={name:e.relativeSegments.at(-1)??(Er.basename(e.root)||e.root),type:"directory",children:[]};if(e.depth>=e.maxDepth)return Yi(e.truncation,`max_depth:${e.maxDepth}`),r;if(e.truncation.entries_seen>=e.maxEntries)return Yi(e.truncation,`max_entries:${e.maxEntries}`),r;let o;try{o=await e.fs.readdir(e.current,{withFileTypes:!0})}catch{return r}for(let n of o.sort((a,s)=>a.name.localeCompare(s.name))){let a=[...e.relativeSegments,n.name];if(Pr(a))continue;if(e.truncation.entries_seen>=e.maxEntries){Yi(e.truncation,`max_entries:${e.maxEntries}`);break}e.truncation.entries_seen+=1;let s=Er.join(e.current,n.name),i=a.join("/");if(n.isDirectory()){r.children?.push(await Rm({...e,current:s,relativeSegments:a,depth:e.depth+1}));continue}if(n.isFile()){if(Im(n.name)){r.children?.push({name:n.name,type:"metadata_file"}),e.manifests.has(i)||await Am(s,i,e);continue}if(Tm(n.name)){r.children?.push({name:n.name,type:"metadata_file"}),jm(n.name,i,e.facts);continue}Cm(n.name)&&((!e.readmeRef.value||e.readmeRef.value.file===i)&&r.children?.push({name:n.name,type:"metadata_file"}),e.readmeRef.value||(e.readmeRef.value=await Em(s,i,e.fs,e.readmeMaxBytes)))}}return r.children?.length===0&&delete r.children,r}async function Am(e,t,r){let o=Er.basename(t),n=Sm.find(a=>a.filename===o);if(n&&!Pr(t.split("/"))&&!r.manifests.has(t)){r.manifests.add(t),Q(r.facts.languages,n.language,t),"packageManager"in n&&n.packageManager&&Q(r.facts.packageManagers,n.packageManager,t);try{let a=await r.fs.readFile(e,{encoding:"utf8"});OS(r.facts,n.parser(a,t))}catch{}}}async function Em(e,t,r,o){if(Pr(t.split("/")))return{file:null,summary:"",bytes_read:0,truncated:!1,fenced_code_blocks_stripped:!1};let n=await r.readFile(e,{encoding:"utf8"}),a=Buffer.byteLength(n,"utf8"),s=a>o?n.slice(0,o):n,i=MS(s);return{file:t,summary:LS(i,2e3),bytes_read:Math.min(a,o),truncated:a>o,fenced_code_blocks_stripped:i!==s}}async function wS(e,t){if(Pr([".git","config"]))return[];try{let o=await t.readFile(Er.join(e,".git","config"),{encoding:"utf8"});return SS(o)}catch{return[]}}function SS(e){let t=[],r=!1;for(let o of e.split(/\r?\n/u)){if(o.match(/^\s*\[remote\s+"[^"]+"\]\s*$/u)){r=!0;continue}if(/^\s*\[/u.test(o)){r=!1;continue}if(!r)continue;let a=o.match(/^\s*url\s*=\s*(.+?)\s*$/u)?.[1];if(!a)continue;let s=RS(a);s&&t.push(s)}return t}function RS(e){let t=e.trim().replace(/\.git$/u,""),r=t.match(/^git@([^:]+):(.+)$/u),o=t.match(/^(?:https?|ssh):\/\/(?:[^@/\s]+@)?([^/]+)\/(.+)$/u),n=r??o;if(!n?.[1]||!n[2])return null;let a=n[1],s=(a.includes("@")?a.slice(a.lastIndexOf("@")+1):a).toLowerCase().replace(/:\d+$/u,"");if(!s)return null;let l=n[2].split("/").filter(Boolean).at(-1);return l?{host:s,name:l.toLowerCase()}:null}function AS(e,t){try{let r=JSON.parse(e),o=new Set([...Object.keys(r.dependencies??{}),...Object.keys(r.devDependencies??{})]),n=Ze();o.has("typescript")&&Q(n.languages,"TypeScript",t);for(let[a,s]of[["react","React"],["next","Next.js"],["vue","Vue"],["nuxt","Nuxt"],["svelte","Svelte"],["astro","Astro"],["express","Express"],["fastify","Fastify"],["vite","Vite"]])o.has(a)&&Q(n.frameworks,s,t);for(let[a,s]of Object.entries(r.scripts??{})){let i=`${a} ${s}`.toLowerCase();(a==="test"||/\b(vitest|jest|node --test|mocha)\b/u.test(i))&&n.testRunners.add(s.includes("vitest")?"vitest":s.includes("jest")?"jest":"npm test"),(a==="lint"||/\beslint\b/u.test(i))&&n.linters.add("eslint")}return n}catch{return{}}}function ES(e,t){let r=Ze(),o=e.toLowerCase();return o.includes("[tool.poetry")&&Q(r.packageManagers,"poetry",t),o.includes("[tool.uv")&&Q(r.packageManagers,"uv",t),Pm(o,t,r),xm(o,r),r}function PS(e,t){let r=Ze();return Q(r.packageManagers,"pip",t),Pm(e.toLowerCase(),t,r),xm(e.toLowerCase(),r),r}function xS(e,t){let r=Ze();return(e.toLowerCase().includes("actix")||e.toLowerCase().includes("axum"))&&Q(r.frameworks,e.toLowerCase().includes("axum")?"Axum":"Actix",t),r}function jS(e,t){let r=Ze();return e.toLowerCase().includes("spring-boot")&&Q(r.frameworks,"Spring Boot",t),r}function km(e,t){let r=Ze();return e.toLowerCase().includes("springframework.boot")&&Q(r.frameworks,"Spring Boot",t),r}function IS(e,t){let r=Ze();return e.toLowerCase().includes("laravel/framework")&&Q(r.frameworks,"Laravel",t),r}function TS(e,t){let r=Ze();return/gem\s+["']rails["']/u.test(e)&&Q(r.frameworks,"Rails",t),r}function CS(){return{}}function Pm(e,t,r){for(let[o,n]of[["django","Django"],["fastapi","FastAPI"],["flask","Flask"]])e.includes(o)&&Q(r.frameworks,n,t)}function xm(e,t){e.includes("pytest")&&t.testRunners.add("pytest"),e.includes("ruff")&&t.linters.add("ruff")}function jm(e,t,r){let o=wm.find(n=>n.filename===e);o&&Q(r.packageManagers,o.packageManager,t)}function Im(e){return Sm.some(t=>t.filename===e)}function Tm(e){return wm.some(t=>t.filename===e)}function Cm(e){return _S.some(t=>t.toLowerCase()===e.toLowerCase())}function Ze(){return{languages:new Map,frameworks:new Map,packageManagers:new Map,testRunners:new Set,linters:new Set}}function Q(e,t,r){let o=e.get(t)??new Set;o.add(r),e.set(t,o)}function OS(e,t){for(let[r,o]of t.languages??[])for(let n of o)Q(e.languages,r,n);for(let[r,o]of t.frameworks??[])for(let n of o)Q(e.frameworks,r,n);for(let[r,o]of t.packageManagers??[])for(let n of o)Q(e.packageManagers,r,n);for(let r of t.testRunners??[])e.testRunners.add(r);for(let r of t.linters??[])e.linters.add(r)}function Xi(e){return[...e.entries()].map(([t,r])=>({name:t,evidence:[...r].sort()})).sort((t,r)=>t.name.localeCompare(r.name))}function NS(e){let t=new Set;return e.filter(r=>{let o=`${r.host}/${r.name}`;return t.has(o)?!1:(t.add(o),!0)}).sort((r,o)=>`${r.host}/${r.name}`.localeCompare(`${o.host}/${o.name}`))}function MS(e){return e.replace(/```[\s\S]*?```/gu,"").replace(/~~~[\s\S]*?~~~/gu,"")}function LS(e,t){let r=e.split(/\r?\n/u).map(o=>o.trim()).filter(Boolean).join(`
1082
+ `);return r.length>t?`${r.slice(0,t-3)}...`:r}function Yi(e,t){e.truncated=!0,e.reasons.includes(t)||e.reasons.push(t)}function DS(e,t){for(let r=0;r<=e.length-t.length;r+=1)if(t.every((o,n)=>e[r+n]===o))return!0;return!1}import{mkdir as FS,readFile as US,writeFile as BS}from"node:fs/promises";import tr from"node:path";async function el(e){let t=f(e.home),r=_(t.database),o;try{let n=r.findPendingApprovalMatch(Zi(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 a=r.createApproval({id:T("approval"),...Zi(e)});o={approval:a.approval,created:!!a.approval,available:a.available,warning:a.warning}}finally{r.close()}return o.created&&o.approval&&await h({home:t.home,type:"approval_requested",details:rl(o.approval)}),o}async function xr(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:rl(o.approval)}),o}async function tl(e){let t=f(e.home),r=_(t.database),o;try{let n=r.createDecidedApproval({id:T("approval"),...Zi(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:{...rl(o.approval),standing_order:e.standingOrderId}}),o}function oa(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 na(e={}){let t=_(f(e.home).database);try{return t.listApprovals(e.status)}finally{t.close()}}function Zi(e){return{action:e.action,class:e.class,target:e.target??null,project:e.project??null,host:e.host??null}}function rl(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 et(e){let t=await kt(e),r=await HS(e,t);if(r){let n=await tl({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 el({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 HS(e,t){return t.decision!=="allowed"||!t.matched_standing_order||!$S(e.className)?null:(await vt(e.home)).find(o=>o.id===t.matched_standing_order&&o.allowed.includes(e.action)&&Ji(o,e))??null}function $S(e){return e==="write_project"||e==="external_write"}async function nl(e){let t=f(e.home),r=K(e.scan.root,t.home),o={id:r.id,root:e.scan.root},n=VS(e.scan,o.id),a=WS(e.scan),s=JS(e.scan),i=await ol(t.home,"USER.md"),l=await ol(t.home,"TOOLS.md");return{schema_version:1,dry_run_default:!0,generated_at:e.generatedAt??new Date().toISOString(),scan:e.scan,project:o,sinks:{candidate_memories:n,user_md:{sink:"managed_markdown",target:"USER.md",managed_content:a,merged_preview:pr(i,a)},tools_md:{sink:"managed_markdown",target:"TOOLS.md",managed_content:s,merged_preview:pr(l,s)},project_registry:{sink:"project_registry",root:e.scan.root,project_id:r.id,resolution:r}},warnings:[...e.scan.warnings,...e.scan.truncation.truncated?["Proposal is based on a truncated scan; review before applying."]:[]]}}async function al(e){let t=await v(e.home),r=e.host??"codex",o=[],n=e.proposal.project.id;return o.push(await qS({home:t.home,proposal:e.proposal,host:r,project:n})),o.push(await Om({home:t.home,proposal:e.proposal,host:r,project:n,sink:"user_md"})),o.push(await Om({home:t.home,proposal:e.proposal,host:r,project:n,sink:"tools_md"})),o.push(await GS({home:t.home,proposal:e.proposal,host:r,project:n})),{applied:o.some(a=>a.applied),dry_run:!1,home:t.home,proposal:e.proposal,sinks:o,warnings:o.flatMap(a=>a.warning?[a.warning]:[])}}function VS(e,t){let r=[],o=[Fe("Languages",e.languages.map(n=>n.name)),Fe("Frameworks",e.frameworks.map(n=>n.name)),Fe("Package managers",e.tooling.package_managers.map(n=>n.name)),Fe("Test runners",e.tooling.test_runners),Fe("Linters",e.tooling.linters)].filter(Boolean);return o.length>0&&r.push({sink:"candidate_memory",project:t,content:[`Dev-environment scan stack facts for ${tr.basename(e.root)}.`,"",...o].join(`
1083
+ `),confidence:.6,authority:"observed",sensitivity:"normal",source:{kind:"dev_environment_scan",root:e.root,schema_version:e.schema_version}}),(e.manifests.length>0||e.readme.summary.length>0)&&r.push({sink:"candidate_memory",project:t,content:[`Dev-environment scan conventions for ${tr.basename(e.root)}.`,"",e.manifests.length>0?`Manifests: ${e.manifests.join(", ")}`:null,e.readme.summary.length>0?`README summary: ${e.readme.summary}`:null,e.truncation.truncated?`Scan was truncated: ${e.truncation.reasons.join(", ")}`:null].filter(n=>!!n).join(`
1084
+ `),confidence:e.truncation.truncated?.45:.55,authority:"observed",sensitivity:"normal",source:{kind:"dev_environment_scan",root:e.root,schema_version:e.schema_version}}),r}function WS(e){return["## Engineering Preferences","","Detected local project context from `nativesoul scan`.","",...Nm([Fe("Languages",e.languages.map(r=>r.name)),Fe("Frameworks",e.frameworks.map(r=>r.name)),e.truncation.truncated?`Scan truncated: ${e.truncation.reasons.join(", ")}`:null])].join(`
1085
+ `)}function JS(e){return["## Local Tool Conventions","","Detected by `nativesoul scan`; verify before treating as policy.","",...Nm([Fe("Package managers",e.tooling.package_managers.map(r=>r.name)),Fe("Test runners",e.tooling.test_runners),Fe("Linters",e.tooling.linters),e.manifests.length>0?`Manifests: ${e.manifests.join(", ")}`:null])].join(`
1086
+ `)}async function qS(e){let t=await et({home:e.home,action:"scan.apply.candidate_memories",className:"write_local",target:"memory:candidate",project:e.project,host:e.host});if(t.evaluation.decision!=="allowed")return await jr(e.home,"scan.apply.candidate_memories","blocked",e.project,{decision:t.evaluation.decision}),sl("candidate_memories","memory:candidate",t,"scan.apply.candidate_memories");let r=[];for(let o of e.proposal.sinks.candidate_memories)r.push(await ee(e.home,o));return await jr(e.home,"scan.apply.candidate_memories","ok",e.project,{count:r.length}),{sink:"candidate_memories",target:"memory:candidate",applied:!0,skipped:!1,policy_gate:t,audit_event_type:"scan.apply.candidate_memories",warning:null,memory_ids:r.map(o=>o.id)}}async function Om(e){let t=e.proposal.sinks[e.sink],r=await et({home:e.home,action:`scan.apply.${e.sink}`,className:"write_local",target:t.target,project:e.project,host:e.host});if(r.evaluation.decision!=="allowed")return await jr(e.home,`scan.apply.${e.sink}`,"blocked",e.project,{decision:r.evaluation.decision}),sl(e.sink,t.target,r,`scan.apply.${e.sink}`);let o=KS(e.home,t.target);await FS(tr.dirname(o),{recursive:!0,mode:448});let n=await ol(e.home,t.target),a=pr(n,t.managed_content);return await BS(o,a,{encoding:"utf8",mode:384}),await jr(e.home,`scan.apply.${e.sink}`,"ok",e.project,{target:t.target}),{sink:e.sink,target:t.target,applied:!0,skipped:!1,policy_gate:r,audit_event_type:`scan.apply.${e.sink}`,warning:null}}async function GS(e){let t=await et({home:e.home,action:"scan.apply.project_registry",className:"write_local",target:"project_registry",project:e.project,host:e.host});if(t.evaluation.decision!=="allowed")return await jr(e.home,"scan.apply.project_registry","blocked",e.project,{decision:t.evaluation.decision}),sl("project_registry","project_registry",t,"scan.apply.project_registry");let r=await uo({home:e.home,resolution:e.proposal.sinks.project_registry.resolution});return await jr(e.home,"scan.apply.project_registry",r.touched?"ok":"error",e.project,{inserted:r.inserted,degraded:r.degraded,warning:r.warning}),{sink:"project_registry",target:"project_registry",applied:r.touched,skipped:!1,policy_gate:t,audit_event_type:"scan.apply.project_registry",warning:r.warning,project_result:r}}function sl(e,t,r,o){return{sink:e,target:t,applied:!1,skipped:!0,policy_gate:r,audit_event_type:o,warning:`POLICY_GATE_BLOCKED:${r.evaluation.decision}`}}async function jr(e,t,r,o,n){await h({home:e,type:t,result:r,details:{project:o,...n}})}function KS(e,t){return pe(tr.join(e,t),{root:e,protectedFiles:[tr.join(e,"SOUL.md"),tr.join(e,"POLICY.md")]})}async function ol(e,t){try{return await US(tr.join(e,t),"utf8")}catch{return""}}function Fe(e,t){return t.length>0?`${e}: ${t.join(", ")}`:null}function Nm(e){let t=e.filter(r=>!!r).map(r=>`- ${r}`);return t.length>0?t:["- No local conventions detected from metadata files."]}import{readFile as Mm}from"node:fs/promises";import Lm from"node:path";var aa=1500;async function Wo(e){let t=await v(e.home),r=await YS(t.home),o=await QS(t.home),n=new Date,a=zS(e.ttlSeconds??r.ttlSeconds),s=new Date(n.getTime()+a*1e3).toISOString(),i=cl(e.project,e.slot),l=_(t.database),c;try{c=l.claimHeartbeatLease({id:T("lease"),slot:e.slot,holder:e.host,idempotencyKey:i,now:n.toISOString(),expiresAt:s})}finally{l.close()}return await h({home:t.home,type:c.claimed?"heartbeat_claimed":"heartbeat_skipped",details:{slot:e.slot,host:e.host,project:e.project,lease_id:c.lease.id,reason:c.reason}}),{slot:e.slot,host:e.host,project:e.project,claimed:c.claimed,reason:c.reason,silent_ack:c.claimed||c.reason==="LEASE_OCCUPIED"&&!r.skipWhenBusy?null:"HEARTBEAT_OK",lease:c.lease,...c.claimed&&o?{heartbeat_checklist:o}:{}}}async function Jo(e){let t=await v(e.home),r=new Date().toISOString(),o=cl(e.project,e.slot),n=H(e.result??"HEARTBEAT_OK"),a=H(XS(e.evidence??{},e.workItemId)),s=H(e.cost??{}),i=or(s),l=_(t.database),c;try{c=l.completeHeartbeatLease({idempotencyKey:o,host:e.host,project:e.project,result:n,evidence:a,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 ll(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 cl(e,t){return`heartbeat:${e}:${t}`}function zS(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e),1),1440*60):aa}function XS(e,t){return t?{...e&&typeof e=="object"&&!Array.isArray(e)?e:{},work_item_id:t}:e}async function YS(e){let t;try{t=await Mm(Lm.join(e,"config.yaml"),"utf8")}catch{return{ttlSeconds:aa,skipWhenBusy:!0}}return{ttlSeconds:ZS(t),skipWhenBusy:eR(t,"skip_when_busy",!0)}}async function QS(e){let t;try{t=await Mm(Lm.join(e,"HEARTBEAT.md"),"utf8")}catch{return""}return t.split(/\r?\n/u).filter(r=>{let o=r.trim();return o.length>0&&!o.startsWith("#")}).join(`
1087
+ `).trim()}function ZS(e){let t=il(e,"ttl_seconds"),r=il(e,"lease_ttl"),o=tR(e,"heartbeat_ttl_seconds"),n=rR(t??r??o);return Number.isFinite(n)?n:aa}function eR(e,t,r){let o=il(e,t);return o?/^(true|yes|1)$/i.test(o)?!0:/^(false|no|0)$/i.test(o)?!1:r:r}function il(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 tR(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`^\\s*${r}:\\s*([^#\\n]+)`,"mu"))?.[1]?.trim().replace(/^["']|["']$/g,"")??null}function rR(e){if(!e)return aa;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 dl(e){let t=await v(e.home);_(t.database).close();let o=qe(e.host),n=(await Promise.all(o.map(s=>Jr(s)))).flat(),a=[];for(let s of o){let i=Ke(s,e.surface);for(let l of i){let c=n.find(R=>R.host===s),d=_r(s,e.targetRoot,l),p=d.managedBlock?await Kr({home:t.home,host:s,apply:e.apply,targetPath:d.managedBlock}):oR(s,l,!e.apply),g=await Ao({home:t.home,host:s,apply:e.apply,targetPath:d.mcpRegistration,commandMode:"package"}),y=await pi({home:t.home,host:s,surface:l,apply:e.apply,targetPath:d.plugin}),k=await yt({home:t.home,host:s,surface:l,mode:"leader",apply:e.apply,pluginEnabled:y.enabled,hostConfigRoot:Ye(s,e.targetRoot),targetRoot:e.targetRoot}),S=e.apply?await Tt({home:t.home,host:s}):[],U=e.apply?S.reduce((R,Rt)=>R+Rt.count,0):c?.sources.length??0,ve=k.warnings.filter(R=>R==="NATIVE_SCHEDULE_UNSUPPORTED").map(()=>"NATIVE_SCHEDULE_AVAILABLE_NOT_ENABLED"),ke=[...k.warnings.filter(R=>R!=="NATIVE_SCHEDULE_UNSUPPORTED"),...y.issues.map(R=>R.code),...c?.detected?[]:[`${s.toUpperCase()}_NOT_DETECTED`]],nt=[p.backupPath,g.backupPath,y.backupPath].filter(R=>R!==null),Ue=ke.length===0&&U>0?"ready":"degraded";a.push({host:s,surface:l,detected:c?.detected??!1,status:Ue,managed_block:p,mcp_registration:g,plugin:y,schedule:k,capability_count:U,snapshots:nt,warnings:ke,notices:ve})}}return{dryRun:!e.apply,applied:e.apply,home:t.home,hosts:a,status:a.every(s=>s.status==="ready")?"ready":"degraded"}}function oR(e,t,r){let o=E("");return{host:e,targetPath:`not-applicable:${Bt(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 nR from"node:path";import{rm as Dm}from"node:fs/promises";var ul="DELETE_NATIVESOUL_HOME";async function pl(e){if(e.purgeData===!0&&e.confirmPurge!==ul)throw new Error(`--purge-data requires --confirm-purge-nativesoul-data ${ul}`);let t=await v(e.home);_(t.database).close();let o=qe(e.host);if(e.apply)for(let l of o)for(let c of Ke(l,e.surface))await Hm({home:t.home,host:l,surface:c,apply:!1,targetRoot:e.targetRoot});let n=[];for(let l of o)for(let c of Ke(l,e.surface))n.push(await Hm({home:t.home,host:l,surface:c,apply:e.apply,targetRoot:e.targetRoot}));let a={requested:e.purgeData===!0,confirmed:e.confirmPurge===ul,applied:e.apply&&e.purgeData===!0,preserved:!(e.apply&&e.purgeData===!0)},s=nR.join(t.home,"backups"),i={path:s,applied:e.apply,preserved:!e.apply};return i.applied&&await Dm(s,{recursive:!0,force:!0}),a.applied&&await Dm(t.home,{recursive:!0,force:!0}),{dryRun:!e.apply,applied:e.apply,home:t.home,hosts:n,backups_purge:i,data_purge:a,status:n.every(l=>l.status==="ready")?"ready":"degraded"}}async function Hm(e){let t=_r(e.host,e.targetRoot,e.surface),r=t.managedBlock?await gs({home:e.home,host:e.host,apply:e.apply,targetPath:t.managedBlock}):aR(e.host,e.surface,!e.apply),o=await fi({home:e.home,host:e.host,apply:e.apply,targetPath:t.mcpRegistration}),n=await mi({home:e.home,host:e.host,surface:e.surface,apply:e.apply,targetPath:t.plugin}),a=[r.backupPath,o.backupPath,n.backupPath].filter(s=>s!==null);return{host:e.host,surface:e.surface,status:"ready",managed_block:r,mcp_registration:o,plugin:n,snapshots:a,warnings:["SCHEDULE_TEARDOWN_NOT_PERFORMED"]}}function aR(e,t,r){let o=E("");return{host:e,targetPath:`not-applicable:${Bt(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}}var Fm={"memory.promote":{action:"memory.promote",className:"write_local"},"memory.forget":{action:"memory.forget",className:"write_local"},"memory.reject":{action:"memory.reject",className:"write_local"},"work_item.create":{action:"work_item.create",className:"write_local"},"work_item.claim":{action:"work_item.claim",className:"write_local"},"work_item.complete":{action:"work_item.complete",className:"write_local"},"install.apply":{action:"install.apply",className:"write_local"},"policy_pack.apply":{action:"policy_pack.apply",className:"write_local"}};async function rr(e,t={}){let r=Fm[e],o={home:t.home,action:r.action,className:r.className,target:t.target??void 0,project:t.project??void 0,host:t.host??void 0},n,a,s,i;try{let l=await et(o);n=l.evaluation,a=l.approval?.id??null,s=l.approval_created,i=l.warning}catch(l){return await $m(r,t,["POLICY_GATE_UNAVAILABLE"],"error"),{status:"deny",decision:"denied",reason:`policy gate unavailable (fail-closed): ${l.message}`,evaluation:null}}return n.decision==="allowed"?{status:"allow",decision:"allowed",evaluation:n}:n.decision==="approval_required"?{status:"approval_required",decision:"approval_required",approvalId:a,approvalCreated:s,warning:i,evaluation:n}:(await $m(r,t,n.reasons,"blocked"),{status:"deny",decision:n.decision,reason:`${r.action} ${n.decision}: ${n.reasons.join(", ")}`,evaluation:n})}async function $m(e,t,r,o){try{let n=await v(t.home);await h({home:n.home,type:"policy_blocked",result:"blocked",details:{boundary:"sensitive_operation",action:e.action,class:e.className,target:t.target??null,project:t.project??null,host:t.host??null,outcome:o,reasons:r}})}catch{}}import{existsSync as _l}from"node:fs";import{mkdir as Gm,readFile as ia,rm as ER,writeFile as Km}from"node:fs/promises";import be from"node:path";import{existsSync as kR}from"node:fs";import{readdir as wR,readFile as ml}from"node:fs/promises";import wt from"node:path";import{fileURLToPath as SR}from"node:url";import Um from"node:path";var sR=new Set(["id","version","title","description","intended_use","approvals","standing_orders","policy_proposals","managed_blocks","rollback","metadata"]),iR=new Set(["id","action","authority","allowed","approval_required","scope_projects","scope_hosts","reason"]),lR=new Set(["target","summary","rationale","rollback_note"]),cR=new Set(["target","marker","content","rollback_key"]),dR=new Set(["strategy","restores","notes"]),uR=new Set(["maturity","owner","source"]),pR=new Set(["SOUL.MD","POLICY.MD"]),Bm=["AGENTS.md","CLAUDE.md","GEMINI.md","Agents.md",".claude/CLAUDE.md"],mR=new Set(Bm);function Tr(e){let t=[];return tt(e)?(Cr(e,sR,"pack",t),ne(e,"id","pack",t,/^[a-z0-9][a-z0-9-]{2,63}$/u),ne(e,"version","pack",t,/^[0-9]+\.[0-9]+\.[0-9]+$/u),ne(e,"title","pack",t),ne(e,"description","pack",t),ne(e,"intended_use","pack",t),Ir(e.approvals,"pack.approvals",t,!1),gR(e.standing_orders,t),fR(e.policy_proposals,t),hR(e.managed_blocks,t),yR(e.rollback,t),_R(e.metadata,t),vR(e,t),t):["Policy pack must be an object"]}function tt(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Vm(e){return typeof e=="string"?e:null}function gR(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(!tt(o)){t.push(`${n} must be an object`);continue}Cr(o,iR,n,t),ne(o,"id",n,t,/^[a-z0-9][a-z0-9-]{2,63}$/u),sa(o,"action",n,["add","propose"],t),sa(o,"authority",n,["operator-approved","proposal"],t),Ir(o.allowed,`${n}.allowed`,t,!0),Ir(o.approval_required,`${n}.approval_required`,t,!0),Ir(o.scope_projects,`${n}.scope_projects`,t,!0),Ir(o.scope_hosts,`${n}.scope_hosts`,t,!0),ne(o,"reason",n,t);let a=Array.isArray(o.allowed)?o.allowed:[],s=Array.isArray(o.approval_required)?o.approval_required:[];a.length===0&&s.length===0&&t.push(`${n} must declare at least one allowed or approval_required action`)}}function fR(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(!tt(o)){t.push(`${n} must be an object`);continue}Cr(o,lR,n,t),sa(o,"target",n,["SOUL.md","POLICY.md"],t),ne(o,"summary",n,t),ne(o,"rationale",n,t),ne(o,"rollback_note",n,t)}}function hR(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(!tt(o)){t.push(`${n} must be an object`);continue}Cr(o,cR,n,t),ne(o,"target",n,t),ne(o,"marker",n,t),ne(o,"content",n,t),ne(o,"rollback_key",n,t),typeof o.target=="string"&&bR(o.target,n,t)}}function yR(e,t){if(!tt(e)){t.push("pack.rollback must be an object");return}Cr(e,dR,"pack.rollback",t),sa(e,"strategy","pack.rollback",["proposal-only","managed-block","snapshot-required"],t),Ir(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"),ne(e,"notes","pack.rollback",t)}function _R(e,t){if(e!==void 0){if(!tt(e)){t.push("pack.metadata must be an object");return}Cr(e,uR,"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 bR(e,t,r){let o=e.replaceAll("\\","/"),n=Um.basename(o).toUpperCase();(Um.isAbsolute(e)||o.includes("../")||o.startsWith("../"))&&r.push(`${t}.target must be a relative managed host file path`),pR.has(n)&&r.push(`${t}.target must not target protected SOUL.md or POLICY.md`),mR.has(o)||r.push(`${t}.target is outside supported managed-block scope`)}function vR(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 Cr(e,t,r,o){for(let n of Object.keys(e))t.has(n)||o.push(`${r}.${n} is not allowed`)}function ne(e,t,r,o,n){let a=e[t];if(typeof a!="string"||a.trim()===""){o.push(`${r}.${t} must be a non-empty string`);return}n&&!n.test(a)&&o.push(`${r}.${t} has invalid format`)}function sa(e,t,r,o,n){let a=e[t];(typeof a!="string"||!o.includes(a))&&n.push(`${r}.${t} must be one of ${o.join(", ")}`)}function Ir(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 gl(){return(await Wm()).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 qo(e){let r=(await Wm()).find(o=>o.pack.id===e);if(!r)throw new Error(`Policy pack not found: ${e}`);return{...r.pack,source:r.source}}async function fl(e){try{let{value:t,source:r}=e.file?{value:JSON.parse(await ml(e.file,"utf8")),source:wt.resolve(e.file)}:await RR(e.id),o=Tr(t),n=tt(t)?Vm(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?wt.resolve(e.file):null,errors:[t instanceof Error?t.message:"Unknown policy pack validation error"],warnings:[]}}}async function Wm(){let e=await Jm(),t=[];for(let r of e){let o=JSON.parse(await ml(r,"utf8")),n=Tr(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 RR(e){if(!e)throw new Error("policy packs validate requires <id> or --file <path>");let t=await Jm();for(let r of t){let o=JSON.parse(await ml(r,"utf8"));if(tt(o)&&o.id===e)return{value:o,source:r}}throw new Error(`Policy pack not found: ${e}`)}async function Jm(){let e=AR(),t=(await wR(e)).filter(r=>r.endsWith(".json")).map(r=>wt.join(e,r)).sort();if(t.length===0)throw new Error(`No policy packs found in ${e}`);return t}function AR(){let e=wt.dirname(SR(import.meta.url)),r=[wt.resolve(process.cwd(),"policy-packs"),wt.resolve(e,"../../../policy-packs"),wt.resolve(e,"../../../../policy-packs"),wt.resolve(e,"../../../../../policy-packs")].find(o=>kR(o));if(!r)throw new Error("Built-in policy pack catalog not found");return r}async function bl(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 PR(e),o=be.resolve(e.targetRoot??process.cwd()),n=new Date().toISOString(),a=await xR({home:t.home,pack:r.pack,targetRoot:o,createdAt:n}),s=a.map(qm),i=a.filter(p=>p.changed),l=VR(r.pack),c=e.apply&&i.length>0?await DR({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 kl(g,"after"),p.push(g)}catch(g){throw await OR(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=>qm(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: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 h({home:t.home,type:e.apply?"policy_pack_apply":"policy_pack_apply_dry_run",details:WR(d,e.approvalEvidence)}),d}async function vl(e){let t=await v(e.home),r=NR(await ia(e.snapshotPath,"utf8"),e.snapshotPath),o=r.files.map(a=>CR(a));if(e.apply)for(let a of r.files)await kl(a,"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 PR(e){if(e.file){let r=be.resolve(e.file),o=JSON.parse(await ia(r,"utf8")),n=Tr(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 qo(e.id);return{pack:t,source:t.source}}async function xR(e){let t=[];for(let r of e.pack.standing_orders)t.push(await jR(e.home,e.pack,r));for(let r of e.pack.policy_proposals)t.push(await IR(e.home,e.pack,r,e.createdAt));for(let r of e.pack.managed_blocks)t.push(await TR(e.targetRoot,e.pack,r));return t}async function jR(e,t,r){if(r.action==="add"&&r.authority==="operator-approved"){let n=be.join(e,"standing-orders",`${r.id}.yaml`);return await hl("standing_order",n,HR(r,t))}let o=be.join(e,"proposals",`standing-order-${t.id}-${r.id}.md`);return await hl("standing_order",o,$R(r,t))}async function IR(e,t,r,o){let n=o.replaceAll(/[:.]/gu,"-"),a=be.join(e,"proposals",`${n}-${t.id}-${r.target}.md`);return await hl("policy_proposal",a,FR(r,t,o))}async function TR(e,t,r){let o=be.resolve(e,r.target);if(!qR(e,o))throw new Error(`Policy pack managed block target escapes target root: ${r.target}`);let n=_l(o),a=n?await ia(o,"utf8"):null,s=UR(a,t,r);return zm("managed_block",o,n,a,s)}async function hl(e,t,r){let o=_l(t),n=o?await ia(t,"utf8"):null;return zm(e,t,o,n,r)}function zm(e,t,r,o,n){let a=o===null?null:E(o),s=n===null?null:E(n),i=o!==n;return{kind:e,targetPath:t,action:i?r?"replace":"create":"noop",changed:i,beforeHash:a,afterHash:s,diff:JR(o,n),beforeExists:r,beforeContent:o,afterContent:n}}function qm(e){return{kind:e.kind,targetPath:e.targetPath,action:e.action,changed:e.changed,beforeHash:e.beforeHash,afterHash:e.afterHash,diff:e.diff}}function CR(e){return{kind:e.kind,targetPath:e.targetPath,action:e.beforeExists?"replace":"remove",changed:!0,beforeHash:e.afterHash,afterHash:e.beforeHash,diff:Ym(e.afterHash,e.beforeHash)}}async function kl(e,t){let r=t==="before"?e.beforeExists:e.afterHash!==null,o=t==="before"?e.beforeContent:e.afterContent;r&&o!==null?(await Gm(be.dirname(e.targetPath),{recursive:!0,mode:448}),pe(e.targetPath,{allowSymlinkTarget:!0}),await Km(e.targetPath,o,{encoding:"utf8",mode:384})):_l(e.targetPath)&&await ER(e.targetPath)}async function OR(e){for(let t of[...e].reverse())await kl(t,"before")}function NR(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=MR(r);if(o.length>0)throw new Error(`Invalid policy pack snapshot ${t}: ${o.join("; ")}`);return r}function MR(e){let t=[];if(!yl(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 yl(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(...LR(o,`files[${n}]`))}):t.push("files must be an array"),t}function LR(e,t){let r=[];if(!yl(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"||!be.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 yl(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function DR(e){let t=be.join(e.home,"backups","policy-packs");await Gm(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=be.join(t,o);return await Km(n,JSON.stringify(r,null,2),{encoding:"utf8",mode:384,flag:"wx"}),n}function HR(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(`
1088
+ `)}function $R(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(`
1089
+ `)}function FR(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(`
1090
+ `)}function UR(e,t,r){let o=BR(t,r);if(e===null||e.length===0)return o;let n=Xm(t,r),a=e.indexOf(n.start),s=e.indexOf(n.end);if(a>=0&&s>a){let l=s+n.end.length,c=e.slice(l).replace(/^\n/u,"");return`${e.slice(0,a)}${o}${c}`}let i=e.endsWith(`
1091
1091
  `)?`
1092
1092
  `:`
1093
1093
 
1094
- `;return`${e}${i}${o}`}function BS(e,t){let r=Xm(e,t),o=t.content.endsWith(`
1094
+ `;return`${e}${i}${o}`}function BR(e,t){let r=Xm(e,t),o=t.content.endsWith(`
1095
1095
  `)?t.content:`${t.content}
1096
1096
  `;return`${r.start}
1097
1097
  ${o}${r.end}
1098
- `}function Xm(e,t){return{start:`<!-- nativesoul:policy-pack:${e.id}:${t.marker}:start v1 -->`,end:`<!-- nativesoul:policy-pack:${e.id}:${t.marker}:end -->`}}function VS(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 WS(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 JS(e,t){return e===t?"No changes.":Ym(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 Ym(e,t,r=0,o=0){return[`before: ${e??"missing"}`,`after: ${t??"missing"}`,`lines_before: ${r}`,`lines_after: ${o}`].join(`
1099
- `)}function qS(e,t){let r=ve.relative(e,t);return r===""||!r.startsWith("..")&&!ve.isAbsolute(r)}import GS from"node:path";async function Cr(e={}){let t=f(e.home),r=e.host??"all",[o,n,a,s]=await Promise.all([it(t.home),S(In(t.home)),S(cr(t.home)),Gt({home:t.home,host:r,surface:e.surface,targetRoot:e.targetRoot})]);return Ys({home:t.home,targetRoot:e.targetRoot?GS.resolve(e.targetRoot):null,host:r,profile:o,onboardingComplete:n,activationComplete:a,hosts:s.hosts})}async function Go(e={}){let t=await Cr(e);if(!e.profile||t.profile?.profile===e.profile)return t;let r={...t.profile??jn,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 KS=["codex","claude","antigravity","gemini","grok"];async function la(e={}){let t=await v(e.home),r=await it(t.home),o=e.leaderHost??eA(r?.scheduler_host),n=o??e.host??"all",a=zS({cadence:e.cadence??r?.heartbeat_cadence,projectScope:e.projectScope??L(process.cwd(),t.home),behavior:e.behavior,mode:e.mode}),s=await XS({home:t.home,host:n,surface:e.surface,mode:a.mode,heartbeat:Zm(a),targetRoot:e.targetRoot}),i=YS(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:a,candidates:s,warnings:l}}async function wl(e={}){let t=await v(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,n=await la({...e,home:t.home}),a=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:a,applied_reconcile:null,warnings:n.warnings};if(r)return{dry_run:!0,applied:!1,user_confirmed:o,action:"planned",plan:n,dry_run_reconcile:a,applied_reconcile:null,warnings:[]};if(!o)return{dry_run:!1,applied:!1,user_confirmed:!1,action:"rejected",plan:n,dry_run_reconcile:a,applied_reconcile:null,warnings:["HEARTBEAT_ACTIVATION_REQUIRES_USER_CONFIRMED"]};let s=await yt({home:t.home,host:n.recommended_leader.host,surface:n.recommended_leader.surface,mode:n.profile.mode,apply:!0,heartbeat:Zm(n.profile),hostConfigRoot:Qe(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:s.schedule.native_schedule_supported,native_id:s.schedule.native_id}}),{dry_run:!1,applied:!0,user_confirmed:!0,action:"applied",plan:n,dry_run_reconcile:a,applied_reconcile:s,warnings:s.warnings}}function zS(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 XS(e){let t=[];for(let r of Ge(e.host))for(let o of ze(r,e.surface)){let n=await yt({home:e.home,host:r,surface:o,mode:e.mode,apply:!1,heartbeat:e.heartbeat,hostConfigRoot:Qe(r,e.targetRoot),targetRoot:e.targetRoot});t.push({host:r,surface:o,status:QS(n),native_schedule_supported:n.schedule.native_schedule_supported,native_id:n.schedule.native_id,reason:ZS(n),dry_run:n})}return t}function YS(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)=>Qm(o)-Qm(n))[0]??null}function Qm(e){let t=KS.indexOf(e.host),r=e.surface==="claude-desktop"?-.25:e.surface==="claude-code"?0:.25;return(t===-1?99:t)+r}function QS(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 ZS(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 Zm(e){return{cadence:e.cadence,skipWhenBusy:e.skip_when_busy,projectScope:e.project_scope,behavior:e.behavior}}function eA(e){return e==="codex"||e==="claude"||e==="grok"||e==="antigravity"||e==="gemini"?e:null}import{randomUUID as tA}from"node:crypto";import rA from"node:path";var oA="NativeSoul activation verification marker";async function Ko(e={}){let t=iA(e),r=K(t.projectCwd,e.home),o=await Gt({home:e.home,host:e.host??"all",surface:e.surface,targetRoot:e.targetRoot}),n=[];for(let c of o.hosts)n.push(await nA({home:o.home,inputHost:c,testCwd:t.projectCwd}));let a=await sA({home:e.home,testProject:`${r.id}-${tA()}`,apply:e.apply===!0,userConfirmed:e.userConfirmed===!0,retainTestData:e.retainTestData===!0}),s=[...new Set([...n.flatMap(c=>c.recommendations),...a.status==="failed"?["Review memory persistence and rerun verification."]:[]])],i=n.map(c=>c.status),l=cA(i,a.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:a,hosts:n,recommendations:s}}async function nA(e){let t=[],r=await aA({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=lA(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 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:n},recommendations:t}}async function aA(e){let t=[...e.warnings],r=[],o="ready",n=!1,a="",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:${Rl(i)}`),s="failed"}try{let i=await qs({home:e.home,host:e.host,projectCwd:e.cwd,recordTelemetry:!1});a=i.targetPath,n=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:a,stale:n}}}async function sA(e){let t=[],r=null,o=!1,n=!1;try{let a=`verify-${e.testProject}`,s=`${oA} ${e.testProject}`;r=await te(e.home,{project:a,content:s,confidence:.91,source:{host:"activation-verification",session_id:`verification-${e.testProject}`}});let i=await Dt(e.home,s,a,8),l=await Lt({home:e.home,project:a,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 Ot(e.home,r.id);r=d,n=r.id===d.id&&r.status==="active"}if(!e.retainTestData&&r)try{r.status==="candidate"?await Nt(e.home,r.id):await Mt(e.home,r.id),o=!0}catch(d){t.push(`memory_cleanup_failed:${Rl(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(a){return t.push(`memory_recall_check_failed:${Rl(a)}`),{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 iA(e){return{projectCwd:rA.resolve(e.projectCwd??process.cwd())}}function lA(e){return e==="native"?"native":e==="official-fallback"?"official_fallback":"unsupported"}function cA(e,t){return e.includes("blocked_by_host")?"blocked_by_host":e.includes("degraded")||t==="failed"?"degraded":e.length>0?"ready":"degraded"}function Rl(e){return e instanceof Error?e.message:String(e)}async function eg(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 ca(e){let t=f(e);if(!dA(t.database))return{home:t.home,initialized:!1,database:t.database,migrations:0,memories:0,events:0,capabilities:0,ledger:uA()};let r=_(t.database,{readOnly:!0});try{return{home:t.home,initialized:!0,database:t.database,...r.counts()}}finally{r.close()}}function uA(){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(pA(e),null,2)}
1098
+ `}function Xm(e,t){return{start:`<!-- nativesoul:policy-pack:${e.id}:${t.marker}:start v1 -->`,end:`<!-- nativesoul:policy-pack:${e.id}:${t.marker}:end -->`}}function VR(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 WR(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 JR(e,t){return e===t?"No changes.":Ym(e===null?null:E(e),t===null?null:E(t),e===null?0:e.split(/\r?\n/u).length,t===null?0:t.split(/\r?\n/u).length)}function Ym(e,t,r=0,o=0){return[`before: ${e??"missing"}`,`after: ${t??"missing"}`,`lines_before: ${r}`,`lines_after: ${o}`].join(`
1099
+ `)}function qR(e,t){let r=be.relative(e,t);return r===""||!r.startsWith("..")&&!be.isAbsolute(r)}import GR from"node:path";async function Or(e={}){let t=f(e.home),r=e.host??"all",[o,n,a,s]=await Promise.all([it(t.home),A(In(t.home)),A(dr(t.home)),Kt({home:t.home,host:r,surface:e.surface,targetRoot:e.targetRoot})]);return Ys({home:t.home,targetRoot:e.targetRoot?GR.resolve(e.targetRoot):null,host:r,profile:o,onboardingComplete:n,activationComplete:a,hosts:s.hosts})}async function Go(e={}){let t=await Or(e);if(!e.profile||t.profile?.profile===e.profile)return t;let r={...t.profile??jn,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 KR=["codex","claude","antigravity","gemini","grok"];async function la(e={}){let t=await v(e.home),r=await it(t.home),o=e.leaderHost??eA(r?.scheduler_host),n=o??e.host??"all",a=zR({cadence:e.cadence??r?.heartbeat_cadence,projectScope:e.projectScope??L(process.cwd(),t.home),behavior:e.behavior,mode:e.mode}),s=await XR({home:t.home,host:n,surface:e.surface,mode:a.mode,heartbeat:Zm(a),targetRoot:e.targetRoot}),i=YR(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:a,candidates:s,warnings:l}}async function wl(e={}){let t=await v(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,n=await la({...e,home:t.home}),a=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:a,applied_reconcile:null,warnings:n.warnings};if(r)return{dry_run:!0,applied:!1,user_confirmed:o,action:"planned",plan:n,dry_run_reconcile:a,applied_reconcile:null,warnings:[]};if(!o)return{dry_run:!1,applied:!1,user_confirmed:!1,action:"rejected",plan:n,dry_run_reconcile:a,applied_reconcile:null,warnings:["HEARTBEAT_ACTIVATION_REQUIRES_USER_CONFIRMED"]};let s=await yt({home:t.home,host:n.recommended_leader.host,surface:n.recommended_leader.surface,mode:n.profile.mode,apply:!0,heartbeat:Zm(n.profile),hostConfigRoot:Ye(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:s.schedule.native_schedule_supported,native_id:s.schedule.native_id}}),{dry_run:!1,applied:!0,user_confirmed:!0,action:"applied",plan:n,dry_run_reconcile:a,applied_reconcile:s,warnings:s.warnings}}function zR(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 XR(e){let t=[];for(let r of qe(e.host))for(let o of Ke(r,e.surface)){let n=await yt({home:e.home,host:r,surface:o,mode:e.mode,apply:!1,heartbeat:e.heartbeat,hostConfigRoot:Ye(r,e.targetRoot),targetRoot:e.targetRoot});t.push({host:r,surface:o,status:QR(n),native_schedule_supported:n.schedule.native_schedule_supported,native_id:n.schedule.native_id,reason:ZR(n),dry_run:n})}return t}function YR(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)=>Qm(o)-Qm(n))[0]??null}function Qm(e){let t=KR.indexOf(e.host),r=e.surface==="claude-desktop"?-.25:e.surface==="claude-code"?0:.25;return(t===-1?99:t)+r}function QR(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 ZR(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 Zm(e){return{cadence:e.cadence,skipWhenBusy:e.skip_when_busy,projectScope:e.project_scope,behavior:e.behavior}}function eA(e){return e==="codex"||e==="claude"||e==="grok"||e==="antigravity"||e==="gemini"?e:null}import{randomUUID as tA}from"node:crypto";import rA from"node:path";var oA="NativeSoul activation verification marker";async function Ko(e={}){let t=iA(e),r=K(t.projectCwd,e.home),o=await Kt({home:e.home,host:e.host??"all",surface:e.surface,targetRoot:e.targetRoot}),n=[];for(let c of o.hosts)n.push(await nA({home:o.home,inputHost:c,testCwd:t.projectCwd}));let a=await sA({home:e.home,testProject:`${r.id}-${tA()}`,apply:e.apply===!0,userConfirmed:e.userConfirmed===!0,retainTestData:e.retainTestData===!0}),s=[...new Set([...n.flatMap(c=>c.recommendations),...a.status==="failed"?["Review memory persistence and rerun verification."]:[]])],i=n.map(c=>c.status),l=cA(i,a.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:a,hosts:n,recommendations:s}}async function nA(e){let t=[],r=await aA({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=lA(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 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:n},recommendations:t}}async function aA(e){let t=[...e.warnings],r=[],o="ready",n=!1,a="",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:${Sl(i)}`),s="failed"}try{let i=await qs({home:e.home,host:e.host,projectCwd:e.cwd,recordTelemetry:!1});a=i.targetPath,n=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:a,stale:n}}}async function sA(e){let t=[],r=null,o=!1,n=!1;try{let a=`verify-${e.testProject}`,s=`${oA} ${e.testProject}`;r=await ee(e.home,{project:a,content:s,confidence:.91,source:{host:"activation-verification",session_id:`verification-${e.testProject}`}});let i=await Ht(e.home,s,a,8),l=await Dt({home:e.home,project:a,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 Nt(e.home,r.id);r=d,n=r.id===d.id&&r.status==="active"}if(!e.retainTestData&&r)try{r.status==="candidate"?await Mt(e.home,r.id):await Lt(e.home,r.id),o=!0}catch(d){t.push(`memory_cleanup_failed:${Sl(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(a){return t.push(`memory_recall_check_failed:${Sl(a)}`),{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 iA(e){return{projectCwd:rA.resolve(e.projectCwd??process.cwd())}}function lA(e){return e==="native"?"native":e==="official-fallback"?"official_fallback":"unsupported"}function cA(e,t){return e.includes("blocked_by_host")?"blocked_by_host":e.includes("degraded")||t==="failed"?"degraded":e.length>0?"ready":"degraded"}function Sl(e){return e instanceof Error?e.message:String(e)}async function eg(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 ca(e){let t=f(e);if(!dA(t.database))return{home:t.home,initialized:!1,database:t.database,migrations:0,memories:0,events:0,capabilities:0,ledger:uA()};let r=_(t.database,{readOnly:!0});try{return{home:t.home,initialized:!0,database:t.database,...r.counts()}}finally{r.close()}}function uA(){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(pA(e),null,2)}
1100
1100
  `):process.stdout.write(`${r}
1101
- `)}function pA(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}async function zo(){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 Xo(e){let t=e.trim();if(t.length!==0)try{return JSON.parse(t)}catch{return t}}function tg(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 Sl(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 a=0;a<r.length;a+=1){let s=r[a];if(s)if(s==="-h")n.set("help",!0);else if(s.startsWith("--")){let i=s.slice(2),l=r[a+1];l&&!l.startsWith("--")?(n.set(i,l),a+=1):n.set(i,!0)}else o.push(s)}return{command:t,rest:o,flags:n}}function Al(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 Or=new Set(["codex","claude","grok","antigravity","gemini"]);function Yo(e){let t=u(e,"host")??"all";if(t==="all"||Or.has(t))return t;throw new Error(`Unsupported adapter host: ${t}`)}function rg(e){let t=u(e,"host");if(t&&Or.has(t))return t;throw new Error("This command requires --host codex|claude|grok|antigravity|gemini")}function ot(e){if(b(e,"all-hosts"))return"all";let t=u(e,"host")??"all";if(t==="all"||Or.has(t))return t;throw new Error(`Unsupported install host: ${t}`)}function Ie(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 Qo(e){let t=u(e,"host");if(t&&Or.has(t))return t;throw new Error("This command requires --host codex|claude|grok|antigravity|gemini")}function Zo(e){let t=u(e,"host");if(t!==void 0){if(Or.has(t))return t;throw new Error("This command accepts --host codex|claude|grok|antigravity|gemini")}}function og(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 ng(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 ag(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 sg(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 da(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 ua(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 El(e,t){let r=u(e,t);if(r!==void 0)return r.split(",").map(o=>o.trim()).filter(Boolean)}function ig(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 lg(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 pa(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 cg(e){let t=u(e,"host")??"generic";if(t==="generic"||Or.has(t))return t;throw new Error(`Unsupported MCP manifest host: ${t}`)}function Pl(e){return Qo(e)}function xl(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 dg(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 jl(e,t,r){let o=e.rest[0]??"status",n={home:t,host:ot(e.flags),surface:Ie(e.flags),targetRoot:u(e.flags,"target-root")};if(o==="status"){let a=await Cr(n);m(a,r,`Activation status: ${a.overall_status}`);return}if(o==="plan"){let a=await Go({...n,profile:mA(e)});m(a,r,`Activation plan: ${a.plan.length} dry-run action(s)`);return}if(o==="heartbeat"){let a=e.rest[1]??"plan",s={home:t,host:ot(e.flags),surface:Ie(e.flags),targetRoot:u(e.flags,"target-root"),leaderHost:gA(e),mode:pa(e.flags),cadence:u(e.flags,"cadence"),projectScope:u(e.flags,"project")??u(e.flags,"project-scope"),behavior:fA(e),user_confirmed:b(e.flags,"user-confirmed")};if(a==="plan"){let i=await la(s);m(i,r,i.recommended_leader?`Heartbeat leader recommended: ${i.recommended_leader.host}`:"Heartbeat native scheduler blocked by host");return}if(a==="apply"){let i=await wl({...s,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 mA(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 gA(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 fA(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 Il(e,t){let r=e.rest[0],o=Yo(e.flags);if(r==="hot-scan"){let n=await It({home:u(e.flags,"home"),host:o,delta:b(e.flags,"delta"),ttlSeconds:E(e.flags,"ttl-seconds")}),a=n.reduce((s,i)=>s+i.count,0);m(n,t,`Hot-scanned ${a} capability record(s)`);return}if(r==="scan"){let n=await Jr(o);m(n,t,`Scanned ${n.length} adapter(s)`);return}if(r==="doctor"){let n=await qr(o),a=n.reduce((s,i)=>s+i.diagnostics.length,0);m(n,t,`Adapter doctor found ${a} diagnostic(s)`);return}if(r==="managed-block"){let n=rg(e.flags),a=await Gr(n);m(a,t,`Managed block preview for ${a.host}: ${a.targetPath}`);return}if(r==="install-managed-block"){let n=Qo(e.flags),a=await Kr({home:u(e.flags,"home"),host:n,apply:b(e.flags,"apply"),targetPath:u(e.flags,"target")});m(a,t,`${a.dryRun?"Planned":"Applied"} managed block for ${a.host}: ${a.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 a=await ms({home:u(e.flags,"home"),snapshotPath:n,apply:b(e.flags,"apply")});m(a,t,`${a.dryRun?"Planned rollback":"Rolled back"} managed block target ${a.targetPath}`);return}throw new Error("adapters requires scan, hot-scan, doctor, or managed-block")}async function Tl(e,t,r){let o=e.rest[0];if(o==="list"){let n=na({home:t,status:ng(e.flags)});m(n,r,yA(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 a=n==="."?hA(t):oa({home:t,id:n}).approval;m(a,r,a?_A(a):`Approval not found: ${n}`),a||(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 a=oa({home:t,id:n}).approval;if(!a){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:a,applied:!1,action:"approve",warning:"requires --confirm"},r,`Approval approve dry-run: ${a.id} (${a.action}); rerun with --confirm to apply.`);return}let s=await Pr({home:t,id:n,status:"approved",reviewer:"cli",reason:u(e.flags,"reason")??null});m(s.approval,r,s.approval?`Approval approved: ${s.approval.id}`:`Approval not found: ${n}`),s.approval||(process.exitCode=1);return}if(o==="reject"){let n=e.rest[1]??u(e.flags,"id"),a=u(e.flags,"reason");if(!n||!a)throw new Error("approvals reject requires <id> --reason <text>");let s=await Pr({home:t,id:n,status:"rejected",reviewer:"cli",reason:a});m(s.approval,r,s.approval?`Approval rejected: ${s.approval.id}`:`Approval not found: ${n}`),s.approval||(process.exitCode=1);return}throw new Error("approvals requires list, show, approve, or reject")}function hA(e){return na({home:e,status:"pending"}).approvals[0]??null}function yA(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(`
1101
+ `)}function pA(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}async function zo(){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 Xo(e){let t=e.trim();if(t.length!==0)try{return JSON.parse(t)}catch{return t}}function tg(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 Rl(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 a=0;a<r.length;a+=1){let s=r[a];if(s)if(s==="-h")n.set("help",!0);else if(s.startsWith("--")){let i=s.slice(2),l=r[a+1];l&&!l.startsWith("--")?(n.set(i,l),a+=1):n.set(i,!0)}else o.push(s)}return{command:t,rest:o,flags:n}}function Al(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 P(e,t){let r=u(e,t);if(!r)return;let o=Number(r);return Number.isFinite(o)?o:void 0}var Nr=new Set(["codex","claude","grok","antigravity","gemini"]);function Yo(e){let t=u(e,"host")??"all";if(t==="all"||Nr.has(t))return t;throw new Error(`Unsupported adapter host: ${t}`)}function rg(e){let t=u(e,"host");if(t&&Nr.has(t))return t;throw new Error("This command requires --host codex|claude|grok|antigravity|gemini")}function rt(e){if(b(e,"all-hosts"))return"all";let t=u(e,"host")??"all";if(t==="all"||Nr.has(t))return t;throw new Error(`Unsupported install host: ${t}`)}function Ie(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 Qo(e){let t=u(e,"host");if(t&&Nr.has(t))return t;throw new Error("This command requires --host codex|claude|grok|antigravity|gemini")}function Zo(e){let t=u(e,"host");if(t!==void 0){if(Nr.has(t))return t;throw new Error("This command accepts --host codex|claude|grok|antigravity|gemini")}}function og(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 ng(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 ag(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 sg(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 da(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 ua(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 El(e,t){let r=u(e,t);if(r!==void 0)return r.split(",").map(o=>o.trim()).filter(Boolean)}function ig(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 lg(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 pa(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 cg(e){let t=u(e,"host")??"generic";if(t==="generic"||Nr.has(t))return t;throw new Error(`Unsupported MCP manifest host: ${t}`)}function Pl(e){return Qo(e)}function xl(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 dg(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 jl(e,t,r){let o=e.rest[0]??"status",n={home:t,host:rt(e.flags),surface:Ie(e.flags),targetRoot:u(e.flags,"target-root")};if(o==="status"){let a=await Or(n);m(a,r,`Activation status: ${a.overall_status}`);return}if(o==="plan"){let a=await Go({...n,profile:mA(e)});m(a,r,`Activation plan: ${a.plan.length} dry-run action(s)`);return}if(o==="heartbeat"){let a=e.rest[1]??"plan",s={home:t,host:rt(e.flags),surface:Ie(e.flags),targetRoot:u(e.flags,"target-root"),leaderHost:gA(e),mode:pa(e.flags),cadence:u(e.flags,"cadence"),projectScope:u(e.flags,"project")??u(e.flags,"project-scope"),behavior:fA(e),user_confirmed:b(e.flags,"user-confirmed")};if(a==="plan"){let i=await la(s);m(i,r,i.recommended_leader?`Heartbeat leader recommended: ${i.recommended_leader.host}`:"Heartbeat native scheduler blocked by host");return}if(a==="apply"){let i=await wl({...s,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 mA(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 gA(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 fA(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 Il(e,t){let r=e.rest[0],o=Yo(e.flags);if(r==="hot-scan"){let n=await Tt({home:u(e.flags,"home"),host:o,delta:b(e.flags,"delta"),ttlSeconds:P(e.flags,"ttl-seconds")}),a=n.reduce((s,i)=>s+i.count,0);m(n,t,`Hot-scanned ${a} capability record(s)`);return}if(r==="scan"){let n=await Jr(o);m(n,t,`Scanned ${n.length} adapter(s)`);return}if(r==="doctor"){let n=await qr(o),a=n.reduce((s,i)=>s+i.diagnostics.length,0);m(n,t,`Adapter doctor found ${a} diagnostic(s)`);return}if(r==="managed-block"){let n=rg(e.flags),a=await Gr(n);m(a,t,`Managed block preview for ${a.host}: ${a.targetPath}`);return}if(r==="install-managed-block"){let n=Qo(e.flags),a=await Kr({home:u(e.flags,"home"),host:n,apply:b(e.flags,"apply"),targetPath:u(e.flags,"target")});m(a,t,`${a.dryRun?"Planned":"Applied"} managed block for ${a.host}: ${a.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 a=await ms({home:u(e.flags,"home"),snapshotPath:n,apply:b(e.flags,"apply")});m(a,t,`${a.dryRun?"Planned rollback":"Rolled back"} managed block target ${a.targetPath}`);return}throw new Error("adapters requires scan, hot-scan, doctor, or managed-block")}async function Tl(e,t,r){let o=e.rest[0];if(o==="list"){let n=na({home:t,status:ng(e.flags)});m(n,r,yA(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 a=n==="."?hA(t):oa({home:t,id:n}).approval;m(a,r,a?_A(a):`Approval not found: ${n}`),a||(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 a=oa({home:t,id:n}).approval;if(!a){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:a,applied:!1,action:"approve",warning:"requires --confirm"},r,`Approval approve dry-run: ${a.id} (${a.action}); rerun with --confirm to apply.`);return}let s=await xr({home:t,id:n,status:"approved",reviewer:"cli",reason:u(e.flags,"reason")??null});m(s.approval,r,s.approval?`Approval approved: ${s.approval.id}`:`Approval not found: ${n}`),s.approval||(process.exitCode=1);return}if(o==="reject"){let n=e.rest[1]??u(e.flags,"id"),a=u(e.flags,"reason");if(!n||!a)throw new Error("approvals reject requires <id> --reason <text>");let s=await xr({home:t,id:n,status:"rejected",reviewer:"cli",reason:a});m(s.approval,r,s.approval?`Approval rejected: ${s.approval.id}`:`Approval not found: ${n}`),s.approval||(process.exitCode=1);return}throw new Error("approvals requires list, show, approve, or reject")}function hA(e){return na({home:e,status:"pending"}).approvals[0]??null}function yA(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(`
1102
1102
  `)}function _A(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(`
1103
- `)}async function Cl(e,t,r){let o=e.rest[0],n={home:t,type:u(e.flags,"type"),result:og(e.flags),limit:E(e.flags,"limit")};if(o==="list"){let a=await un(n);m(a,r,`${a.length} audit event(s)`);return}if(o==="export"){let a=ag(e.flags),s=await Ga({...n,format:a});if(a==="jsonl"){process.stdout.write(s.events.map(i=>JSON.stringify(i)).join(`
1103
+ `)}async function Cl(e,t,r){let o=e.rest[0],n={home:t,type:u(e.flags,"type"),result:og(e.flags),limit:P(e.flags,"limit")};if(o==="list"){let a=await un(n);m(a,r,`${a.length} audit event(s)`);return}if(o==="export"){let a=ag(e.flags),s=await Ga({...n,format:a});if(a==="jsonl"){process.stdout.write(s.events.map(i=>JSON.stringify(i)).join(`
1104
1104
  `)),s.events.length>0&&process.stdout.write(`
1105
1105
  `);return}process.stdout.write(`${JSON.stringify(s.events,null,2)}
1106
- `);return}throw new Error("audit requires list or export")}async function Ol(e,t,r){let o=e.rest[0];if(o==="refresh"){let n=await It({home:t,host:Yo(e.flags),delta:b(e.flags,"delta"),ttlSeconds:E(e.flags,"ttl-seconds")}),a=n.reduce((s,i)=>s+i.count,0);m(n,r,`Refreshed ${a} capability record(s)`);return}if(o==="learn"){let n=await ys({home:t,host:Yo(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 Ee({home:t,host:Zo(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")??""),a=await Yr({home:t,query:n,host:b(e.flags,"all-hosts")?void 0:Zo(e.flags)??"codex",readyOnly:b(e.flags,"ready-only"),limit:E(e.flags,"limit")});m(a,r,`${a.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 a=await Tt({home:t,uid:n});if(!a)throw new Error(`Capability not found: ${n}`);m(a,r,`Capability ${a.uid}: ready=${a.ready}`);return}if(o==="explain"){let n=e.rest[1]??u(e.flags,"uid");if(!n){ug("capabilities explain requires <uid> or --uid <uid>",r);return}let a=await $i({home:t,uid:n});if(!a){ug(bA(n),r);return}m(a,r,vA(a));return}throw new Error("capabilities requires refresh, learn, list, search, show, or explain")}function ug(e,t){if(t){m({error:e},!0,e),process.exitCode=1;return}throw new Error(e)}function bA(e){return`Capability not found: ${e}. Run "nativesoul capabilities search ${e} --all-hosts" to find available capability UIDs.`}function vA(e){return[`Capability ${e.uid}: ${e.readiness_label} (ready=${e.readiness.ready})`,`Source: ${e.source}`,`Schema hash: ${e.schema_hash??"none"}`,"Readiness signals:",...e.readiness_signals.map(kA)].join(`
1107
- `)}function kA(e){let t=e.satisfied?"\u2713":"\u2717",r=e.reason?` - ${e.reason}`:"";return`- ${t} ${e.signal}${r}`}async function Nl(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 a=u(e.flags,"project")??L(process.cwd(),t),s=await Qr({home:t,project:a,summary:n,dueAt:u(e.flags,"due-at")??null,ttlSeconds:E(e.flags,"ttl-seconds")});m(s,r,s.created?`Commitment created: ${s.commitment.id}`:`Commitment deduped: ${s.commitment.id}`);return}if(o==="list"){let n=await Zr({home:t,project:u(e.flags,"project"),status:sg(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 a=o==="complete"?await eo(t,n):await _s(t,n);m(a,r,`Commitment ${o}d: ${a.id}`);return}throw new Error("commitments requires create, list, complete, or dismiss")}async function Dl(e,t,r){let o=u(e.flags,"project")??K(process.cwd(),t).id,n=Uo({home:t,project:o,host:u(e.flags,"host"),since:u(e.flags,"since"),until:u(e.flags,"until"),groupBy:wA(e.flags),limit:E(e.flags,"limit")});m(n,r,RA(n))}function wA(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 RA(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: ${Ml(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}: ${Ml(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}: ${Ml(o)} (${Ll(o.reported_runs,o.total_runs)})`)}return t.join(`
1108
- `)}function Ml(e){return e.cost_reported_runs===0?"not reported by host":SA(e.total_usd)}function Ll(e,t){let r=t===0?0:Math.round(e/t*100);return`${e}/${t} reported (${r}%)`}function SA(e){return`$${e.toFixed(2)}`}async function Hl(e,t,r){let o=e.rest[0];if(o==="data"){let n=AA(e.flags),a=await Bo({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?EA(a,n):a,r,`Dashboard data ready: ${a.initialized?"initialized":"not initialized"}`);return}if(o==="viewer"){let n=await zi({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 AA(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 EA(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 $l(e,t,r){let o=e.rest[0];if(o==="m7"||o==="report"){let n=await Rr({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 Fl(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 a=u(e.flags,"project")??L(process.cwd(),t),s=u(e.flags,"host")??"codex",i=await Wo({home:t,slot:n,host:s,project:a,ttlSeconds:E(e.flags,"ttl-seconds")}),l=i.claimed?[`Heartbeat lease claimed: ${i.lease.id}`,i.heartbeat_checklist].filter(Boolean).join(`
1109
- `):"HEARTBEAT_OK";m(i,r,l);return}if(o==="complete"){let n=u(e.flags,"slot")??e.rest[1];if(!n)throw new Error("heartbeat complete requires --slot <id>");let a=u(e.flags,"project")??L(process.cwd(),t),s=u(e.flags,"host")??"codex",i=await Jo({home:t,slot:n,host:s,project:a,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 ll({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 Ul(e,t,r){let o=e.rest[0];if(o==="reconcile"){let n=Qo(e.flags),a=u(e.flags,"target-root"),s=await yt({home:t,host:n,surface:Ie(e.flags),mode:pa(e.flags),apply:b(e.flags,"apply"),hostConfigRoot:a?Qe(n,a):void 0,targetRoot:a});m(s,r,s.applied?`Schedule reconciled: ${s.schedule.id}`:`Schedule reconcile planned: ${s.schedule.id}`);return}if(o==="list"){let n=await Po({home:t,host:Zo(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 a=await yi({home:t,id:n,apply:b(e.flags,"apply")});m(a,r,a.applied?`Schedule disabled: ${n}`:`Schedule disable planned: ${n}`);return}throw new Error("schedule requires reconcile, list, or disable")}async function Bl(e,t,r){if(e.rest[0]==="openclaw"){let a=u(e.flags,"source")??e.rest[1];if(!a)throw new Error("import openclaw requires --source <path>");let s=await Si({home:t,sourcePath:a,cwd:u(e.flags,"cwd")??process.cwd(),project:u(e.flags,"project"),apply:b(e.flags,"apply"),limit:E(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 n=PA(e);if(n){let a=u(e.flags,"source")??e.rest[1];if(!a)throw new Error("import native requires --source <path>");let s=await xi({home:t,host:n,sourcePath:a,cwd:u(e.flags,"cwd")??process.cwd(),project:u(e.flags,"project"),apply:b(e.flags,"apply"),limit:E(e.flags,"limit")});m(s,r,s.applied?`${n} import applied: ${s.persisted_memories.length} candidate(s), ${s.warnings.length} warning(s), ${s.conflicts.length} conflict(s)`:`${n} 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 PA(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 xA}from"node:child_process";async function Vl(e,t,r){let[o,n]=e.rest;if(o==="activate"){if(!n)throw new Error("license activate requires a license key");let a=await Ti({home:t,key:n}),s=a.ok?{ok:!0,action:"activate",license:en(a.license),message:"License activated via Dodo"}:{ok:!1,action:"activate",reason:a.reason,license:en(a.license),message:`License activation failed: ${a.reason}`};m(s,r,s.message??"License activated via Dodo"),s.ok||(process.exitCode=1);return}if(o==="status"){let a=await xe(t),s=a?jA(a):ge,i=await TA(e),l=await Di({home:t,currentVersion:Xt,latestKnownVersion:i}),c={ok:!0,action:"status",license:en(s),update_entitlement:l,message:CA(s,l,b(e.flags,"check-updates"))};m(c,r,c.message??`License status: ${s.state}`);return}if(o==="deactivate"){let a=await Oi({home:t}),s=a.ok?{ok:!0,action:"deactivate",license:en(a.license),message:"License deactivated via Dodo; local NativeSoul data was not removed"}:{ok:!1,action:"deactivate",reason:a.reason,license:en(a.license),message:`License deactivation failed: ${a.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 jA(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 en(e){return{...e,license_key:e.license_key?IA(e.license_key):null}}function IA(e){return e.length<=8?"[REDACTED_LICENSE_KEY]":`${e.slice(0,4)}\u2026${e.slice(-4)}`}async function TA(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=xA(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 CA(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",a=[`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&&a.push(t.soft_nudge.message),a.join(`
1110
- `)}async function Wl(e,t,r){let o=await Li({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 pg={life_activation_status:async(e,t)=>await Cr({home:t,host:Jl(e.host),targetRoot:Rt(e.target_root)??Rt(e.targetRoot)}),life_activation_plan:async(e,t)=>await Go({home:t,host:Jl(e.host),targetRoot:Rt(e.target_root)??Rt(e.targetRoot),profile:OA(e.profile)}),life_activation_verify:async(e,t)=>await Ko({home:t,host:Jl(e.host),surface:NA(e.surface),targetRoot:Rt(e.target_root)??Rt(e.targetRoot),projectCwd:Rt(e.project_cwd)??Rt(e.projectCwd),apply:ql(e.apply),userConfirmed:ql(e["user-confirmed"]),retainTestData:ql(e["retain-test-data"])})},mg=[{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 Jl(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 OA(e){if(e!==void 0){if(e==="quickstart"||e==="advanced")return e;throw new Error("Invalid activation profile")}}function NA(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 Rt(e){return typeof e=="string"?e:void 0}function ql(e){return e===!0}var MA=["2025-11-25","2024-11-05","2024-10-07"],_g={...pg,life_status:(e,t)=>ca(t),life_bootstrap:async(e,t)=>await UA({home:t,host:C(e.host,"codex"),cwd:C(e.cwd,process.cwd()),query:F(e.query)}),life_recall:async(e,t)=>await Dt(t,C(e.query,""),C(e.project,"default"),ga(e.limit,5)),life_remember_propose:async(e,t)=>await te(t,{project:C(e.project,"default"),content:C(e.content,""),type:F(e.type),confidence:gg(e.confidence),source:{host:"mcp",session_id:"local"}}),life_memory_promote:async(e,t)=>await Ot(t,C(e.id,"")),life_memory_reject:async(e,t)=>await Nt(t,C(e.id,"")),life_memory_forget:async(e,t)=>await Mt(t,C(e.id,"")),life_memory_expire:async(e,t)=>await co(t,C(e.id,"")),life_capability_search:async(e,t)=>await Yr({home:t,query:C(e.query,""),host:WA(e)?void 0:F(e.host)??"codex",readyOnly:Nr(e.readyOnly,!1),limit:ga(e.limit,8)}),life_capability_status:async(e,t)=>{let r=C(e.uid,""),o=r?await Tt({home:t,uid:r}):null;if(!o)throw new Error(`Capability not found: ${r}`);return o},life_policy_evaluate:async(e,t)=>await kt({home:t,action:C(e.action,""),className:yg(e.class),target:F(e.target)}),life_approval_request:async(e,t)=>await KA({home:t,action:C(e.action,""),className:yg(e.class),target:F(e.target),project:F(e.project),host:F(e.host)}),life_approval_decide:async(e,t)=>{let r=C(e.id,""),o=await Pr({home:t,id:r,status:GA(e.status),reviewer:C(e.host,"mcp"),reason:F(e.reason)??null});if(!o.approval)throw new Error(`Approval not found: ${r}`);return o},life_commitment_create:async(e,t)=>await Qr({home:t,project:C(e.project,"default"),summary:C(e.summary,""),dueAt:F(e.due_at),ttlSeconds:gg(e.ttl_seconds),source:{host:"mcp",session_id:"local"}}),life_commitment_complete:async(e,t)=>await eo(t,C(e.id,"")),life_work_item_create:async(e,t)=>await Lo({home:t,project:C(e.project,"default"),title:C(e.title,""),description:F(e.description),priority:Gl(e.priority),source:"mcp",tags:fg(e.tags),host:F(e.host)}),life_work_item_list:async(e,t)=>await Do({home:t,project:F(e.project),status:hg(e.status),priority:Gl(e.priority),assignedHost:F(e.host),limit:ga(e.limit,50)}),life_work_item_claim:async(e,t)=>await Ho({home:t,id:C(e.id,""),host:C(e.host,"mcp")}),life_work_item_update:async(e,t)=>await $o({home:t,id:C(e.id,""),status:hg(e.status),priority:Gl(e.priority),assignedHost:F(e.host),description:F(e.description),tags:e.tags===void 0?void 0:fg(e.tags)}),life_work_item_complete:async(e,t)=>await Fo({home:t,id:C(e.id,""),status:VA(e.status)}),life_heartbeat_claim:async(e,t)=>await Wo({home:t,slot:C(e.slot,""),host:C(e.host,"codex"),project:C(e.project,"default"),ttlSeconds:ga(e.ttl_seconds,1500)}),life_heartbeat_complete:async(e,t)=>await Jo({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:F(e.work_item_id)}),life_onboarding_status:async(e,t)=>await oo(t),life_onboard_apply:async(e,t)=>await no({home:t,dry_run:Nr(e.dry_run,!0),user_confirmed:Nr(e.user_confirmed,!1),files:JA(e.files),config_patch:qA(e.config_patch)}),life_onboard_complete:async(e,t)=>await ao({home:t,archive:e.archive===void 0?!0:Nr(e.archive,!0)})},LA=new Set(Object.keys(_g));function DA(e){return e.method?.startsWith("notifications/")?!0:!Object.prototype.hasOwnProperty.call(e,"id")}async function fa(e,t){if(DA(e))return null;let r=e.id??null;try{if(e.method==="initialize"){let o=tn(e.params),n=F(o.protocolVersion),a=n&&MA.includes(n)?n:"2024-11-05";return nt(r,{protocolVersion:a,serverInfo:{name:"nativesoul",version:"0.1.0"},capabilities:{tools:{}}})}if(e.method==="ping")return nt(r,{});if(e.method==="resources/list")return nt(r,{resources:[]});if(e.method==="prompts/list")return nt(r,{prompts:[]});if(e.method==="tools/list")return nt(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, per-theme interview guidance, file_generation_rules, and optional heartbeat/scan offers. Call before drafting files.",inputSchema:{type:"object"}},...mg,{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 vr(t);if(!o.ok)return nt(r,o);let n=BA(e.params);return nt(r,await $A(n.name??"",n.arguments??{},t))}if(LA.has(e.method)){let o=await vr(t);return o.ok?nt(r,await vg(e.method,tn(e.params),t)):nt(r,o)}return ma(r,-32601,`Unknown method: ${e.method}`)}catch(o){return o instanceof Ct?ma(r,-32010,o.message,{code:o.code,id:o.id,from:o.from,to:o.to}):o instanceof Oe?ma(r,-32011,o.message,{code:o.code,id:o.id,status:o.status}):ma(r,-32603,o instanceof Error?o.message:"Unknown MCP error")}}async function bg(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 a=n.trim();a&&HA(a,e).catch(s=>{process.stderr.write(`NativeSoul MCP response error: ${zA(s)}
1106
+ `);return}throw new Error("audit requires list or export")}async function Ol(e,t,r){let o=e.rest[0];if(o==="refresh"){let n=await Tt({home:t,host:Yo(e.flags),delta:b(e.flags,"delta"),ttlSeconds:P(e.flags,"ttl-seconds")}),a=n.reduce((s,i)=>s+i.count,0);m(n,r,`Refreshed ${a} capability record(s)`);return}if(o==="learn"){let n=await ys({home:t,host:Yo(e.flags),limit:P(e.flags,"limit")});m(n,r,`Learned ${n.generated} capability card(s), changed ${n.changed}`);return}if(o==="list"){let n=await Ee({home:t,host:Zo(e.flags),readyOnly:b(e.flags,"ready-only"),limit:P(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")??""),a=await Yr({home:t,query:n,host:b(e.flags,"all-hosts")?void 0:Zo(e.flags)??"codex",readyOnly:b(e.flags,"ready-only"),limit:P(e.flags,"limit")});m(a,r,`${a.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 a=await Ct({home:t,uid:n});if(!a)throw new Error(`Capability not found: ${n}`);m(a,r,`Capability ${a.uid}: ready=${a.ready}`);return}if(o==="explain"){let n=e.rest[1]??u(e.flags,"uid");if(!n){ug("capabilities explain requires <uid> or --uid <uid>",r);return}let a=await $i({home:t,uid:n});if(!a){ug(bA(n),r);return}m(a,r,vA(a));return}throw new Error("capabilities requires refresh, learn, list, search, show, or explain")}function ug(e,t){if(t){m({error:e},!0,e),process.exitCode=1;return}throw new Error(e)}function bA(e){return`Capability not found: ${e}. Run "nativesoul capabilities search ${e} --all-hosts" to find available capability UIDs.`}function vA(e){return[`Capability ${e.uid}: ${e.readiness_label} (ready=${e.readiness.ready})`,`Source: ${e.source}`,`Schema hash: ${e.schema_hash??"none"}`,"Readiness signals:",...e.readiness_signals.map(kA)].join(`
1107
+ `)}function kA(e){let t=e.satisfied?"\u2713":"\u2717",r=e.reason?` - ${e.reason}`:"";return`- ${t} ${e.signal}${r}`}async function Nl(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 a=u(e.flags,"project")??L(process.cwd(),t),s=await Qr({home:t,project:a,summary:n,dueAt:u(e.flags,"due-at")??null,ttlSeconds:P(e.flags,"ttl-seconds")});m(s,r,s.created?`Commitment created: ${s.commitment.id}`:`Commitment deduped: ${s.commitment.id}`);return}if(o==="list"){let n=await Zr({home:t,project:u(e.flags,"project"),status:sg(e.flags),includeExpired:b(e.flags,"include-expired"),limit:P(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 a=o==="complete"?await eo(t,n):await _s(t,n);m(a,r,`Commitment ${o}d: ${a.id}`);return}throw new Error("commitments requires create, list, complete, or dismiss")}async function Dl(e,t,r){let o=u(e.flags,"project")??K(process.cwd(),t).id,n=Uo({home:t,project:o,host:u(e.flags,"host"),since:u(e.flags,"since"),until:u(e.flags,"until"),groupBy:wA(e.flags),limit:P(e.flags,"limit")});m(n,r,SA(n))}function wA(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 SA(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: ${Ml(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}: ${Ml(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}: ${Ml(o)} (${Ll(o.reported_runs,o.total_runs)})`)}return t.join(`
1108
+ `)}function Ml(e){return e.cost_reported_runs===0?"not reported by host":RA(e.total_usd)}function Ll(e,t){let r=t===0?0:Math.round(e/t*100);return`${e}/${t} reported (${r}%)`}function RA(e){return`$${e.toFixed(2)}`}async function Hl(e,t,r){let o=e.rest[0];if(o==="data"){let n=AA(e.flags),a=await Bo({home:t,project:u(e.flags,"project"),host:u(e.flags,"host"),limit:P(e.flags,"limit"),since:u(e.flags,"since"),until:u(e.flags,"until")});m(n?EA(a,n):a,r,`Dashboard data ready: ${a.initialized?"initialized":"not initialized"}`);return}if(o==="viewer"){let n=await zi({home:t,project:u(e.flags,"project"),host:u(e.flags,"host"),limit:P(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 AA(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 EA(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 $l(e,t,r){let o=e.rest[0];if(o==="m7"||o==="report"){let n=await Rr({home:t,project:u(e.flags,"project"),host:u(e.flags,"host"),limit:P(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 Fl(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 a=u(e.flags,"project")??L(process.cwd(),t),s=u(e.flags,"host")??"codex",i=await Wo({home:t,slot:n,host:s,project:a,ttlSeconds:P(e.flags,"ttl-seconds")}),l=i.claimed?[`Heartbeat lease claimed: ${i.lease.id}`,i.heartbeat_checklist].filter(Boolean).join(`
1109
+ `):"HEARTBEAT_OK";m(i,r,l);return}if(o==="complete"){let n=u(e.flags,"slot")??e.rest[1];if(!n)throw new Error("heartbeat complete requires --slot <id>");let a=u(e.flags,"project")??L(process.cwd(),t),s=u(e.flags,"host")??"codex",i=await Jo({home:t,slot:n,host:s,project:a,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 ll({home:t,project:u(e.flags,"project"),limit:P(e.flags,"limit")});m(n,r,`${n.length} heartbeat lease(s)`);return}throw new Error("heartbeat requires claim, complete, or status")}async function Ul(e,t,r){let o=e.rest[0];if(o==="reconcile"){let n=Qo(e.flags),a=u(e.flags,"target-root"),s=await yt({home:t,host:n,surface:Ie(e.flags),mode:pa(e.flags),apply:b(e.flags,"apply"),hostConfigRoot:a?Ye(n,a):void 0,targetRoot:a});m(s,r,s.applied?`Schedule reconciled: ${s.schedule.id}`:`Schedule reconcile planned: ${s.schedule.id}`);return}if(o==="list"){let n=await Po({home:t,host:Zo(e.flags),limit:P(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 a=await yi({home:t,id:n,apply:b(e.flags,"apply")});m(a,r,a.applied?`Schedule disabled: ${n}`:`Schedule disable planned: ${n}`);return}throw new Error("schedule requires reconcile, list, or disable")}async function Bl(e,t,r){if(e.rest[0]==="openclaw"){let a=u(e.flags,"source")??e.rest[1];if(!a)throw new Error("import openclaw requires --source <path>");let s=await Ri({home:t,sourcePath:a,cwd:u(e.flags,"cwd")??process.cwd(),project:u(e.flags,"project"),apply:b(e.flags,"apply"),limit:P(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 n=PA(e);if(n){let a=u(e.flags,"source")??e.rest[1];if(!a)throw new Error("import native requires --source <path>");let s=await xi({home:t,host:n,sourcePath:a,cwd:u(e.flags,"cwd")??process.cwd(),project:u(e.flags,"project"),apply:b(e.flags,"apply"),limit:P(e.flags,"limit")});m(s,r,s.applied?`${n} import applied: ${s.persisted_memories.length} candidate(s), ${s.warnings.length} warning(s), ${s.conflicts.length} conflict(s)`:`${n} 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 PA(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 xA}from"node:child_process";async function Vl(e,t,r){let[o,n]=e.rest;if(o==="activate"){if(!n)throw new Error("license activate requires a license key");let a=await Ti({home:t,key:n}),s=a.ok?{ok:!0,action:"activate",license:en(a.license),message:"License activated via Dodo"}:{ok:!1,action:"activate",reason:a.reason,license:en(a.license),message:`License activation failed: ${a.reason}`};m(s,r,s.message??"License activated via Dodo"),s.ok||(process.exitCode=1);return}if(o==="status"){let a=await xe(t),s=a?jA(a):me,i=await TA(e),l=await Di({home:t,currentVersion:Yt,latestKnownVersion:i}),c={ok:!0,action:"status",license:en(s),update_entitlement:l,message:CA(s,l,b(e.flags,"check-updates"))};m(c,r,c.message??`License status: ${s.state}`);return}if(o==="deactivate"){let a=await Oi({home:t}),s=a.ok?{ok:!0,action:"deactivate",license:en(a.license),message:"License deactivated via Dodo; local NativeSoul data was not removed"}:{ok:!1,action:"deactivate",reason:a.reason,license:en(a.license),message:`License deactivation failed: ${a.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 jA(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 en(e){return{...e,license_key:e.license_key?IA(e.license_key):null}}function IA(e){return e.length<=8?"[REDACTED_LICENSE_KEY]":`${e.slice(0,4)}\u2026${e.slice(-4)}`}async function TA(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=xA(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 CA(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",a=[`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&&a.push(t.soft_nudge.message),a.join(`
1110
+ `)}async function Wl(e,t,r){let o=await Li({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 pg={life_activation_status:async(e,t)=>await Or({home:t,host:Jl(e.host),targetRoot:St(e.target_root)??St(e.targetRoot)}),life_activation_plan:async(e,t)=>await Go({home:t,host:Jl(e.host),targetRoot:St(e.target_root)??St(e.targetRoot),profile:OA(e.profile)}),life_activation_verify:async(e,t)=>await Ko({home:t,host:Jl(e.host),surface:NA(e.surface),targetRoot:St(e.target_root)??St(e.targetRoot),projectCwd:St(e.project_cwd)??St(e.projectCwd),apply:ql(e.apply),userConfirmed:ql(e["user-confirmed"]),retainTestData:ql(e["retain-test-data"])})},mg=[{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 Jl(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 OA(e){if(e!==void 0){if(e==="quickstart"||e==="advanced")return e;throw new Error("Invalid activation profile")}}function NA(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 St(e){return typeof e=="string"?e:void 0}function ql(e){return e===!0}var MA=["2025-11-25","2024-11-05","2024-10-07"],_g={...pg,life_status:(e,t)=>ca(t),life_bootstrap:async(e,t)=>await UA({home:t,host:C(e.host,"codex"),cwd:C(e.cwd,process.cwd()),query:F(e.query)}),life_recall:async(e,t)=>await Ht(t,C(e.query,""),C(e.project,"default"),ga(e.limit,5)),life_remember_propose:async(e,t)=>await ee(t,{project:C(e.project,"default"),content:C(e.content,""),type:F(e.type),confidence:gg(e.confidence),source:{host:"mcp",session_id:"local"}}),life_memory_promote:async(e,t)=>await Nt(t,C(e.id,"")),life_memory_reject:async(e,t)=>await Mt(t,C(e.id,"")),life_memory_forget:async(e,t)=>await Lt(t,C(e.id,"")),life_memory_expire:async(e,t)=>await co(t,C(e.id,"")),life_capability_search:async(e,t)=>await Yr({home:t,query:C(e.query,""),host:WA(e)?void 0:F(e.host)??"codex",readyOnly:Mr(e.readyOnly,!1),limit:ga(e.limit,8)}),life_capability_status:async(e,t)=>{let r=C(e.uid,""),o=r?await Ct({home:t,uid:r}):null;if(!o)throw new Error(`Capability not found: ${r}`);return o},life_policy_evaluate:async(e,t)=>await kt({home:t,action:C(e.action,""),className:yg(e.class),target:F(e.target)}),life_approval_request:async(e,t)=>await KA({home:t,action:C(e.action,""),className:yg(e.class),target:F(e.target),project:F(e.project),host:F(e.host)}),life_approval_decide:async(e,t)=>{let r=C(e.id,""),o=await xr({home:t,id:r,status:GA(e.status),reviewer:C(e.host,"mcp"),reason:F(e.reason)??null});if(!o.approval)throw new Error(`Approval not found: ${r}`);return o},life_commitment_create:async(e,t)=>await Qr({home:t,project:C(e.project,"default"),summary:C(e.summary,""),dueAt:F(e.due_at),ttlSeconds:gg(e.ttl_seconds),source:{host:"mcp",session_id:"local"}}),life_commitment_complete:async(e,t)=>await eo(t,C(e.id,"")),life_work_item_create:async(e,t)=>await Lo({home:t,project:C(e.project,"default"),title:C(e.title,""),description:F(e.description),priority:Gl(e.priority),source:"mcp",tags:fg(e.tags),host:F(e.host)}),life_work_item_list:async(e,t)=>await Do({home:t,project:F(e.project),status:hg(e.status),priority:Gl(e.priority),assignedHost:F(e.host),limit:ga(e.limit,50)}),life_work_item_claim:async(e,t)=>await Ho({home:t,id:C(e.id,""),host:C(e.host,"mcp")}),life_work_item_update:async(e,t)=>await $o({home:t,id:C(e.id,""),status:hg(e.status),priority:Gl(e.priority),assignedHost:F(e.host),description:F(e.description),tags:e.tags===void 0?void 0:fg(e.tags)}),life_work_item_complete:async(e,t)=>await Fo({home:t,id:C(e.id,""),status:VA(e.status)}),life_heartbeat_claim:async(e,t)=>await Wo({home:t,slot:C(e.slot,""),host:C(e.host,"codex"),project:C(e.project,"default"),ttlSeconds:ga(e.ttl_seconds,1500)}),life_heartbeat_complete:async(e,t)=>await Jo({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:F(e.work_item_id)}),life_onboarding_status:async(e,t)=>await oo(t),life_onboard_apply:async(e,t)=>await no({home:t,dry_run:Mr(e.dry_run,!0),user_confirmed:Mr(e.user_confirmed,!1),files:JA(e.files),config_patch:qA(e.config_patch)}),life_onboard_complete:async(e,t)=>await ao({home:t,archive:e.archive===void 0?!0:Mr(e.archive,!0)})},LA=new Set(Object.keys(_g));function DA(e){return e.method?.startsWith("notifications/")?!0:!Object.prototype.hasOwnProperty.call(e,"id")}async function fa(e,t){if(DA(e))return null;let r=e.id??null;try{if(e.method==="initialize"){let o=tn(e.params),n=F(o.protocolVersion),a=n&&MA.includes(n)?n:"2024-11-05";return ot(r,{protocolVersion:a,serverInfo:{name:"nativesoul",version:"0.1.0"},capabilities:{tools:{}}})}if(e.method==="ping")return ot(r,{});if(e.method==="resources/list")return ot(r,{resources:[]});if(e.method==="prompts/list")return ot(r,{prompts:[]});if(e.method==="tools/list")return ot(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, per-theme interview guidance, file_generation_rules, and optional heartbeat/scan offers. Call before drafting files.",inputSchema:{type:"object"}},...mg,{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 kr(t);if(!o.ok)return ot(r,o);let n=BA(e.params);return ot(r,await $A(n.name??"",n.arguments??{},t))}if(LA.has(e.method)){let o=await kr(t);return o.ok?ot(r,await vg(e.method,tn(e.params),t)):ot(r,o)}return ma(r,-32601,`Unknown method: ${e.method}`)}catch(o){return o instanceof Ot?ma(r,-32010,o.message,{code:o.code,id:o.id,from:o.from,to:o.to}):o instanceof Ce?ma(r,-32011,o.message,{code:o.code,id:o.id,status:o.status}):ma(r,-32603,o instanceof Error?o.message:"Unknown MCP error")}}async function bg(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 a=n.trim();a&&HA(a,e).catch(s=>{process.stderr.write(`NativeSoul MCP response error: ${zA(s)}
1111
1111
  `)})}})}async function HA(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"}})}
1112
1112
  `);return}let o=await fa(r,t);o&&process.stdout.write(`${JSON.stringify(o)}
1113
- `)}async function $A(e,t,r){let o=await vg(e,t,r);return{content:[{type:"text",text:JSON.stringify(o)}]}}var FA={life_memory_promote:"memory.promote",life_memory_reject:"memory.reject",life_memory_forget:"memory.forget",life_work_item_create:"work_item.create",life_work_item_claim:"work_item.claim",life_work_item_complete:"work_item.complete"};async function vg(e,t,r){let o=_g[e];if(!o)throw new Error(`Unknown tool: ${e}`);let n=FA[e];if(n){let a=await tr(n,{home:r,target:F(t.id)??F(t.title)??null,project:F(t.project),host:F(t.host)});if(a.status==="deny")throw new Error(`Blocked by policy gate: ${a.reason}`);if(a.status==="approval_required")return{blocked:!0,allowed:!1,decision:"approval_required",approval_id:a.approvalId,approval_created:a.approvalCreated,wait:"human",instruction:a.approvalId?`approval ${a.approvalId} pending - run: nativesoul approvals approve ${a.approvalId} --confirm`:"approval pending but unavailable - inspect NativeSoul approval storage",warning:a.warning}}return await o(t,r)}async function UA(e){try{let t=await pt({...e,readOnly:!0});try{await Le({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 Le({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 nt(e,t){return{jsonrpc:"2.0",id:e,result:t}}function ma(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 BA(e){return tn(e)}function tn(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function C(e,t){return typeof e=="string"?e:t}function F(e){return typeof e=="string"?e:void 0}function ga(e,t){return typeof e=="number"?e:t}function gg(e){return typeof e=="number"?e:void 0}function fg(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function hg(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 VA(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 Gl(e){if(e!==void 0){if(e==="low"||e==="normal"||e==="high"||e==="urgent")return e;throw new Error("Invalid work item priority")}}function Nr(e,t){return typeof e=="boolean"?e:t}function WA(e){return Nr(e.allHosts,!1)||Nr(e.all_hosts,!1)}function JA(e){let t=tn(e),r={};for(let[o,n]of Object.entries(t))typeof n=="string"&&(r[o]=n);return r}function qA(e){let r=tn(e).hosts;if(!Array.isArray(r))return;let o=r.filter(n=>typeof n=="string");return o.length>0?{hosts:o}:void 0}function yg(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 GA(e){if(e==="approved"||e==="rejected")return e;throw new Error("life_approval_decide status must be approved or rejected")}async function KA(e){let t=await tt(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 zA(e){return e instanceof Error?e.message:"Unknown MCP response error"}async function Kl(e,t,r){let o=e.rest[0];if(!o){await bg(t);return}if(o==="manifest"){let n=qt({host:cg(e.flags),commandMode:xl(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 fa({jsonrpc:"2.0",id:1,method:"initialize"},t),a=await fa({jsonrpc:"2.0",id:2,method:"life_status"},t),s={ok:n!==null&&a!==null&&"result"in n&&"result"in a,initialize:n,status:a};m(s,r,s.ok?"MCP smoke passed":"MCP smoke failed");return}if(o==="install"){let n=await Ao({home:t,host:Pl(e.flags),targetPath:u(e.flags,"target"),apply:b(e.flags,"apply"),commandMode:xl(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 a=await hi({home:t,snapshotPath:n,apply:b(e.flags,"apply")});m(a,r,`${a.dryRun?"Planned rollback":"Rolled back"} MCP target ${a.targetPath}`);return}if(o==="doctor"){let n=await Eo({host:Pl(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 zl(e,t,r){let o=e.rest[0];if(o==="flush-hook"){let n=u(e.flags,"text")?"":await zo(),a=Xo(n),s=u(e.flags,"text")??(typeof a=="string"?a:void 0),i=await Cs({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 a=="string"?void 0:a});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 zo(),a=Xo(n),s=u(e.flags,"prompt")??tg(a),i=await Os({home:t,host:u(e.flags,"host")??"codex",cwd:u(e.flags,"cwd")??process.cwd(),prompt:s,limit:E(e.flags,"limit")});m(i,r,i.context||`Memory recall skipped: ${i.decision.reason}`);return}if(o==="index"){let n=await js({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 ki({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 a=u(e.flags,"project")??u(e.flags,"scope")??L(process.cwd(),t),s=await Ts(t,{content:n,project:a});m(s,r,`Memory added: ${s.id}`);return}if(o==="propose"){let n=u(e.flags,"text");if(!n)throw new Error("memory propose requires --text");let a=u(e.flags,"project")??u(e.flags,"scope")??L(process.cwd(),t),s=await te(t,{content:n,project:a});m(s,r,`Memory proposed: ${s.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 a=o==="promote"?await Ot(t,n):o==="reject"?await Nt(t,n):o==="forget"?await Mt(t,n):await co(t,n);m(a,r,`Memory ${o}d: ${a.id}`);return}if(o==="export"){let n=u(e.flags,"project")??u(e.flags,"scope"),a=await Lt({home:t,project:n,includeForgotten:b(e.flags,"include-forgotten"),limit:E(e.flags,"limit")});m(a,r,`${a.length} memor${a.length===1?"y":"ies"} exported`);return}if(o==="search"){let n=e.rest.slice(1).join(" ")||(u(e.flags,"query")??""),a=u(e.flags,"project")??L(process.cwd(),t),s=E(e.flags,"limit")??5,i=await Dt(t,n,a,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 Xl(e,t,r){let o=e.rest[0];if(o==="list"){let n=await Ms({home:t,status:ig(e.flags),limit:E(e.flags,"limit")});m(n,r,XA(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 a=await Ls({home:t,id:n,cwd:u(e.flags,"cwd")??process.cwd()});m(a,r,YA(a)),a.registry_available&&!a.registry&&(process.exitCode=1);return}if(o==="rename"){let n=e.rest[1]??u(e.flags,"id"),a=u(e.flags,"name");if(!n||!a)throw new Error("project rename requires <id|.> --name <display>");let s=await Ds({home:t,id:n,name:a,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 n=e.rest[1];if(n==="list"){let a=await Fs({home:t});m(a,r,Object.keys(a.aliases).length===0?"No project aliases":ZA(a.aliases));return}if(n==="add"){let a=e.rest[2],s=u(e.flags,"as");if(!a||!s)throw new Error("project alias add requires <id> --as <custom-id>");let i=await Us({home:t,id:a,alias:s,apply:b(e.flags,"apply")});m(i,r,kg(i));return}if(n==="remove"){let a=e.rest[2]??u(e.flags,"as");if(!a)throw new Error("project alias remove requires <custom-id>");let s=await Bs({home:t,alias:a,apply:b(e.flags,"apply")});m(s,r,kg(s));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 a=await Hs({home:t,id:n,includeMemories:b(e.flags,"include-memories"),apply:b(e.flags,"apply"),confirm:u(e.flags,"confirm")});m(a,r,eE(a)),(!a.found||a.mode==="forget_memories"&&!a.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 a=await $s({home:t,id:n});m(a,r,tE(a)),a.found||(process.exitCode=1);return}if(o==="pin"){let n=u(e.flags,"cwd")??process.cwd(),a=await vs({cwd:n,home:t,apply:b(e.flags,"apply")});m(a,r,a.applied?`Project marker pinned at ${a.marker_path} (${a.base_id})`:`Project pin dry-run: would write ${a.marker_path} (${a.base_id})`);return}throw new Error("project requires list, show, rename, alias, forget, reactivate, or pin")}function XA(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(`
1113
+ `)}async function $A(e,t,r){let o=await vg(e,t,r);return{content:[{type:"text",text:JSON.stringify(o)}]}}var FA={life_memory_promote:"memory.promote",life_memory_reject:"memory.reject",life_memory_forget:"memory.forget",life_work_item_create:"work_item.create",life_work_item_claim:"work_item.claim",life_work_item_complete:"work_item.complete"};async function vg(e,t,r){let o=_g[e];if(!o)throw new Error(`Unknown tool: ${e}`);let n=FA[e];if(n){let a=await rr(n,{home:r,target:F(t.id)??F(t.title)??null,project:F(t.project),host:F(t.host)});if(a.status==="deny")throw new Error(`Blocked by policy gate: ${a.reason}`);if(a.status==="approval_required")return{blocked:!0,allowed:!1,decision:"approval_required",approval_id:a.approvalId,approval_created:a.approvalCreated,wait:"human",instruction:a.approvalId?`approval ${a.approvalId} pending - run: nativesoul approvals approve ${a.approvalId} --confirm`:"approval pending but unavailable - inspect NativeSoul approval storage",warning:a.warning}}return await o(t,r)}async function UA(e){try{let t=await pt({...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 ot(e,t){return{jsonrpc:"2.0",id:e,result:t}}function ma(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 BA(e){return tn(e)}function tn(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function C(e,t){return typeof e=="string"?e:t}function F(e){return typeof e=="string"?e:void 0}function ga(e,t){return typeof e=="number"?e:t}function gg(e){return typeof e=="number"?e:void 0}function fg(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function hg(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 VA(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 Gl(e){if(e!==void 0){if(e==="low"||e==="normal"||e==="high"||e==="urgent")return e;throw new Error("Invalid work item priority")}}function Mr(e,t){return typeof e=="boolean"?e:t}function WA(e){return Mr(e.allHosts,!1)||Mr(e.all_hosts,!1)}function JA(e){let t=tn(e),r={};for(let[o,n]of Object.entries(t))typeof n=="string"&&(r[o]=n);return r}function qA(e){let r=tn(e).hosts;if(!Array.isArray(r))return;let o=r.filter(n=>typeof n=="string");return o.length>0?{hosts:o}:void 0}function yg(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 GA(e){if(e==="approved"||e==="rejected")return e;throw new Error("life_approval_decide status must be approved or rejected")}async function KA(e){let t=await et(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 zA(e){return e instanceof Error?e.message:"Unknown MCP response error"}async function Kl(e,t,r){let o=e.rest[0];if(!o){await bg(t);return}if(o==="manifest"){let n=Gt({host:cg(e.flags),commandMode:xl(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 fa({jsonrpc:"2.0",id:1,method:"initialize"},t),a=await fa({jsonrpc:"2.0",id:2,method:"life_status"},t),s={ok:n!==null&&a!==null&&"result"in n&&"result"in a,initialize:n,status:a};m(s,r,s.ok?"MCP smoke passed":"MCP smoke failed");return}if(o==="install"){let n=await Ao({home:t,host:Pl(e.flags),targetPath:u(e.flags,"target"),apply:b(e.flags,"apply"),commandMode:xl(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 a=await hi({home:t,snapshotPath:n,apply:b(e.flags,"apply")});m(a,r,`${a.dryRun?"Planned rollback":"Rolled back"} MCP target ${a.targetPath}`);return}if(o==="doctor"){let n=await Eo({host:Pl(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 zl(e,t,r){let o=e.rest[0];if(o==="flush-hook"){let n=u(e.flags,"text")?"":await zo(),a=Xo(n),s=u(e.flags,"text")??(typeof a=="string"?a:void 0),i=await Cs({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 a=="string"?void 0:a});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 zo(),a=Xo(n),s=u(e.flags,"prompt")??tg(a),i=await Os({home:t,host:u(e.flags,"host")??"codex",cwd:u(e.flags,"cwd")??process.cwd(),prompt:s,limit:P(e.flags,"limit")});m(i,r,i.context||`Memory recall skipped: ${i.decision.reason}`);return}if(o==="index"){let n=await js({home:t,limit:P(e.flags,"limit")});m(n,r,`Semantic index updated: ${n.indexed_count} indexed, ${n.skipped_unchanged} unchanged`);return}if(o==="reflect"){let n=await ki({home:t,cwd:u(e.flags,"cwd")??process.cwd(),project:u(e.flags,"project"),limit:P(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 a=u(e.flags,"project")??u(e.flags,"scope")??L(process.cwd(),t),s=await Ts(t,{content:n,project:a});m(s,r,`Memory added: ${s.id}`);return}if(o==="propose"){let n=u(e.flags,"text");if(!n)throw new Error("memory propose requires --text");let a=u(e.flags,"project")??u(e.flags,"scope")??L(process.cwd(),t),s=await ee(t,{content:n,project:a});m(s,r,`Memory proposed: ${s.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 a=o==="promote"?await Nt(t,n):o==="reject"?await Mt(t,n):o==="forget"?await Lt(t,n):await co(t,n);m(a,r,`Memory ${o}d: ${a.id}`);return}if(o==="export"){let n=u(e.flags,"project")??u(e.flags,"scope"),a=await Dt({home:t,project:n,includeForgotten:b(e.flags,"include-forgotten"),limit:P(e.flags,"limit")});m(a,r,`${a.length} memor${a.length===1?"y":"ies"} exported`);return}if(o==="search"){let n=e.rest.slice(1).join(" ")||(u(e.flags,"query")??""),a=u(e.flags,"project")??L(process.cwd(),t),s=P(e.flags,"limit")??5,i=await Ht(t,n,a,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 Xl(e,t,r){let o=e.rest[0];if(o==="list"){let n=await Ms({home:t,status:ig(e.flags),limit:P(e.flags,"limit")});m(n,r,XA(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 a=await Ls({home:t,id:n,cwd:u(e.flags,"cwd")??process.cwd()});m(a,r,YA(a)),a.registry_available&&!a.registry&&(process.exitCode=1);return}if(o==="rename"){let n=e.rest[1]??u(e.flags,"id"),a=u(e.flags,"name");if(!n||!a)throw new Error("project rename requires <id|.> --name <display>");let s=await Ds({home:t,id:n,name:a,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 n=e.rest[1];if(n==="list"){let a=await Fs({home:t});m(a,r,Object.keys(a.aliases).length===0?"No project aliases":ZA(a.aliases));return}if(n==="add"){let a=e.rest[2],s=u(e.flags,"as");if(!a||!s)throw new Error("project alias add requires <id> --as <custom-id>");let i=await Us({home:t,id:a,alias:s,apply:b(e.flags,"apply")});m(i,r,kg(i));return}if(n==="remove"){let a=e.rest[2]??u(e.flags,"as");if(!a)throw new Error("project alias remove requires <custom-id>");let s=await Bs({home:t,alias:a,apply:b(e.flags,"apply")});m(s,r,kg(s));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 a=await Hs({home:t,id:n,includeMemories:b(e.flags,"include-memories"),apply:b(e.flags,"apply"),confirm:u(e.flags,"confirm")});m(a,r,eE(a)),(!a.found||a.mode==="forget_memories"&&!a.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 a=await $s({home:t,id:n});m(a,r,tE(a)),a.found||(process.exitCode=1);return}if(o==="pin"){let n=u(e.flags,"cwd")??process.cwd(),a=await vs({cwd:n,home:t,apply:b(e.flags,"apply")});m(a,r,a.applied?`Project marker pinned at ${a.marker_path} (${a.base_id})`:`Project pin dry-run: would write ${a.marker_path} (${a.base_id})`);return}throw new Error("project requires list, show, rename, alias, forget, reactivate, or pin")}function XA(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(`
1114
1114
  `)}function YA(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??QA();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(`
1115
1115
  `)}function QA(){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 ZA(e){return Object.entries(e).map(([t,r])=>`${t} -> ${r}`).join(`
1116
1116
  `)}function kg(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 eE(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(`
1117
- `):e.mode==="forget_memories"?`Project forgotten: ${e.id}; memories affected: ${e.memories_affected}`:`Project archived: ${e.id}`:`Project not found: ${e.id}`}function tE(e){return e.found?`Project reactivated: ${e.id}`:`Project not found: ${e.id}`}import{readFile as rE}from"node:fs/promises";async function Ql(e,t,r){let o=e.rest[0];if(o==="status"){let n=await oo(t);m(n,r,n.ritual_pending?"Onboarding ritual pending":"Onboarding complete");return}if(o==="activation"){let n=oE(e),a=await Es({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:nE(e.flags),recall_auto_trigger_keywords:Yl(e.flags,"recall-keywords"),recall_auto_trigger_denylist:Yl(e.flags,"recall-denylist"),candidate_auto_promotion_threshold:aE(e.flags),standing_order_templates:Yl(e.flags,"standing-order-templates")}});m(a,r,a.applied?"Activation profile applied":"Activation profile dry-run planned");return}if(o==="verify"){let n=await Ko({home:t,host:ot(e.flags),surface:Ie(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 a=JSON.parse(await rE(n,"utf8")),s=await no({home:t,dry_run:b(e.flags,"apply")?!1:a.dry_run!==!1,user_confirmed:b(e.flags,"user-confirmed")||a.user_confirmed===!0,files:a.files,config_patch:a.config_patch});m(s,r,s.applied?"Onboarding files applied":"Onboarding dry-run planned");return}if(o==="complete"){let n=await ao({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 oE(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 nE(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 aE(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 Yl(e,t){let r=u(e,t);if(r)return r.split(",").map(o=>o.trim()).filter(Boolean)}async function Zl(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 a=await kt({home:t,action:n,className:lg(e.flags),target:u(e.flags,"target")});m(a,r,`Policy decision for ${a.action}: ${a.decision}`);return}if(o==="standing-orders"&&e.rest[1]==="list"){let n=await vt(t);m(n,r,`${n.length} standing order(s)`);return}if(o==="packs"){await sE(e,t,r);return}if(o==="pretooluse-hook"){let n=await zo(),a=Xo(n)??{},s=await Vi({home:t,host:u(e.flags,"host")??"codex",cwd:u(e.flags,"cwd"),payload:a});m(s,r,s.message);return}if(o==="propose-change"){let n=u(e.flags,"target")??e.rest[1],a=u(e.flags,"summary");if(!n||!a)throw new Error("policy propose-change requires --target SOUL.md|POLICY.md and --summary <text>");let s=await Wi({home:t,target:n,summary:a});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 sE(e,t,r){let o=e.rest[1];if(o==="list"){let n=await gl();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 a=await qo(n);m(a,r,`Policy pack ${a.id} ${a.version}`);return}if(o==="validate"){let n=e.rest[2]??u(e.flags,"id"),a=await fl({id:n,file:u(e.flags,"file")});m(a,r,a.valid?`Policy pack valid: ${a.id}`:`Policy pack invalid: ${a.errors.join("; ")}`);return}if(o==="apply"){let n=e.rest[2]??u(e.flags,"id");if(b(e.flags,"apply")){let s=await tr("policy_pack.apply",{home:t,target:n??u(e.flags,"file")??null});if(s.status==="deny")throw new Error(`Blocked by policy gate: ${s.reason}`);if(s.status==="approval_required"){m({blocked:!0,allowed:!1,decision:"approval_required",approval_id:s.approvalId,instruction:s.approvalId?`approval ${s.approvalId} pending - run: nativesoul approvals approve ${s.approvalId} --confirm`:"approval pending but unavailable"},r,`policy pack apply blocked: approval required${s.approvalId?` (${s.approvalId})`:""}`);return}}let a=await bl({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(a,r,`${a.dryRun?"Planned":"Applied"} policy pack ${a.pack.id}: ${a.files.filter(s=>s.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 a=await vl({home:t,snapshotPath:n,apply:b(e.flags,"apply")});m(a,r,`${a.dryRun?"Planned rollback":"Rolled back"} policy pack ${a.pack.id}: ${a.files.length} file change(s)`);return}throw new Error("policy packs requires list, show, validate, apply, or rollback")}async function ec(e,t,r){let o=e.rest[0]&&e.rest[0]!=="help"?e.rest[0]:process.cwd(),n=b(e.flags,"apply"),a=await Qi({root:o}),s=await nl({scan:a,home:t});if(!n){m({dry_run:!0,applied:!1,proposal:s},r,wg(s,!1));return}r||process.stdout.write(`${wg(s,!0)}
1117
+ `):e.mode==="forget_memories"?`Project forgotten: ${e.id}; memories affected: ${e.memories_affected}`:`Project archived: ${e.id}`:`Project not found: ${e.id}`}function tE(e){return e.found?`Project reactivated: ${e.id}`:`Project not found: ${e.id}`}import{readFile as rE}from"node:fs/promises";async function Ql(e,t,r){let o=e.rest[0];if(o==="status"){let n=await oo(t);m(n,r,n.ritual_pending?"Onboarding ritual pending":"Onboarding complete");return}if(o==="activation"){let n=oE(e),a=await Es({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:nE(e.flags),recall_auto_trigger_keywords:Yl(e.flags,"recall-keywords"),recall_auto_trigger_denylist:Yl(e.flags,"recall-denylist"),candidate_auto_promotion_threshold:aE(e.flags),standing_order_templates:Yl(e.flags,"standing-order-templates")}});m(a,r,a.applied?"Activation profile applied":"Activation profile dry-run planned");return}if(o==="verify"){let n=await Ko({home:t,host:rt(e.flags),surface:Ie(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 a=JSON.parse(await rE(n,"utf8")),s=await no({home:t,dry_run:b(e.flags,"apply")?!1:a.dry_run!==!1,user_confirmed:b(e.flags,"user-confirmed")||a.user_confirmed===!0,files:a.files,config_patch:a.config_patch});m(s,r,s.applied?"Onboarding files applied":"Onboarding dry-run planned");return}if(o==="complete"){let n=await ao({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 oE(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 nE(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 aE(e){let t=u(e,"candidate-confidence-threshold");if(t===void 0)return;let r=P(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 Yl(e,t){let r=u(e,t);if(r)return r.split(",").map(o=>o.trim()).filter(Boolean)}async function Zl(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 a=await kt({home:t,action:n,className:lg(e.flags),target:u(e.flags,"target")});m(a,r,`Policy decision for ${a.action}: ${a.decision}`);return}if(o==="standing-orders"&&e.rest[1]==="list"){let n=await vt(t);m(n,r,`${n.length} standing order(s)`);return}if(o==="packs"){await sE(e,t,r);return}if(o==="pretooluse-hook"){let n=await zo(),a=Xo(n)??{},s=await Vi({home:t,host:u(e.flags,"host")??"codex",cwd:u(e.flags,"cwd"),payload:a});m(s,r,s.message);return}if(o==="propose-change"){let n=u(e.flags,"target")??e.rest[1],a=u(e.flags,"summary");if(!n||!a)throw new Error("policy propose-change requires --target SOUL.md|POLICY.md and --summary <text>");let s=await Wi({home:t,target:n,summary:a});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 sE(e,t,r){let o=e.rest[1];if(o==="list"){let n=await gl();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 a=await qo(n);m(a,r,`Policy pack ${a.id} ${a.version}`);return}if(o==="validate"){let n=e.rest[2]??u(e.flags,"id"),a=await fl({id:n,file:u(e.flags,"file")});m(a,r,a.valid?`Policy pack valid: ${a.id}`:`Policy pack invalid: ${a.errors.join("; ")}`);return}if(o==="apply"){let n=e.rest[2]??u(e.flags,"id");if(b(e.flags,"apply")){let s=await rr("policy_pack.apply",{home:t,target:n??u(e.flags,"file")??null});if(s.status==="deny")throw new Error(`Blocked by policy gate: ${s.reason}`);if(s.status==="approval_required"){m({blocked:!0,allowed:!1,decision:"approval_required",approval_id:s.approvalId,instruction:s.approvalId?`approval ${s.approvalId} pending - run: nativesoul approvals approve ${s.approvalId} --confirm`:"approval pending but unavailable"},r,`policy pack apply blocked: approval required${s.approvalId?` (${s.approvalId})`:""}`);return}}let a=await bl({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(a,r,`${a.dryRun?"Planned":"Applied"} policy pack ${a.pack.id}: ${a.files.filter(s=>s.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 a=await vl({home:t,snapshotPath:n,apply:b(e.flags,"apply")});m(a,r,`${a.dryRun?"Planned rollback":"Rolled back"} policy pack ${a.pack.id}: ${a.files.length} file change(s)`);return}throw new Error("policy packs requires list, show, validate, apply, or rollback")}async function ec(e,t,r){let o=e.rest[0]&&e.rest[0]!=="help"?e.rest[0]:process.cwd(),n=b(e.flags,"apply"),a=await Qi({root:o}),s=await nl({scan:a,home:t});if(!n){m({dry_run:!0,applied:!1,proposal:s},r,wg(s,!1));return}r||process.stdout.write(`${wg(s,!0)}
1118
1118
  `);let i=await al({home:t,proposal:s,host:"codex"});m(i,r,iE(i))}function wg(e,t){let r=[t?"NativeSoul scan proposal (apply requested)":"NativeSoul scan proposal (dry-run; no writes)",`Root: ${e.scan.root}`,`Project: ${e.project.id}`,`Languages: ${e.scan.languages.map(o=>o.name).join(", ")||"none detected"}`,`Frameworks: ${e.scan.frameworks.map(o=>o.name).join(", ")||"none detected"}`,`Package managers: ${e.scan.tooling.package_managers.map(o=>o.name).join(", ")||"none detected"}`,`Test runners: ${e.scan.tooling.test_runners.join(", ")||"none detected"}`,`Linters: ${e.scan.tooling.linters.join(", ")||"none detected"}`,`Candidate memories: ${e.sinks.candidate_memories.length}`,`Managed blocks: ${e.sinks.user_md.target}, ${e.sinks.tools_md.target}`,`Project registry: ${e.sinks.project_registry.project_id}`,`Truncated: ${e.scan.truncation.truncated?e.scan.truncation.reasons.join(", "):"no"}`,"Targets: NativeSoul home only; SOUL.md and POLICY.md are not targets."];return e.warnings.length>0&&r.push("Warnings:",...e.warnings.map(o=>`- ${o}`)),r.join(`
1119
1119
  `)}function iE(e){let t=e.sinks.filter(n=>n.applied).length,r=e.sinks.filter(n=>n.skipped).length,o=[`NativeSoul scan applied: ${t}/${e.sinks.length} sinks wrote under ${e.home}`,`Skipped: ${r}`,...e.sinks.map(n=>`- ${n.sink}: ${n.applied?"applied":"skipped"} (${n.policy_gate.evaluation.decision})`)];return e.warnings.length>0&&o.push("Warnings:",...e.warnings.map(n=>`- ${n}`)),o.join(`
1120
- `)}async function rc(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 a=await Lo({home:t,project:u(e.flags,"project")??L(process.cwd(),t),title:n,description:u(e.flags,"description")??null,priority:ua(e.flags),source:"cli",tags:El(e.flags,"tags"),host:u(e.flags,"host")??null});m(a,r,`Work item created: ${a.id}`);return}if(o==="list"){let n=await Do({home:t,project:u(e.flags,"project"),status:da(e.flags),priority:ua(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=tc(e,"claim"),a=u(e.flags,"host")??"cli",s=await Ho({home:t,id:n,host:a});m(s,r,`Work item ${s.id} claimed by host ${a}`);return}if(o==="update"){let n=tc(e,"update"),a=da(e.flags),s=ua(e.flags),i=u(e.flags,"host"),l=u(e.flags,"description"),c=El(e.flags,"tags"),d=u(e.flags,"run");if(a===void 0&&s===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 $o({home:t,id:n,status:a,priority:s,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=tc(e,"complete"),a=da(e.flags);if(a!==void 0&&a!=="done"&&a!=="failed")throw new Error("work complete --status must be done or failed");let s=await Fo({home:t,id:n,status:a});m(s,r,`Work item completed: ${s.id} (${s.status})`);return}throw new Error("work requires create, list, claim, update, or complete")}function tc(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 oc(){process.stdout.write(`nativesoul
1120
+ `)}async function rc(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 a=await Lo({home:t,project:u(e.flags,"project")??L(process.cwd(),t),title:n,description:u(e.flags,"description")??null,priority:ua(e.flags),source:"cli",tags:El(e.flags,"tags"),host:u(e.flags,"host")??null});m(a,r,`Work item created: ${a.id}`);return}if(o==="list"){let n=await Do({home:t,project:u(e.flags,"project"),status:da(e.flags),priority:ua(e.flags),assignedHost:u(e.flags,"host"),limit:P(e.flags,"limit")});m(n,r,`${n.length} work item(s)`);return}if(o==="claim"){let n=tc(e,"claim"),a=u(e.flags,"host")??"cli",s=await Ho({home:t,id:n,host:a});m(s,r,`Work item ${s.id} claimed by host ${a}`);return}if(o==="update"){let n=tc(e,"update"),a=da(e.flags),s=ua(e.flags),i=u(e.flags,"host"),l=u(e.flags,"description"),c=El(e.flags,"tags"),d=u(e.flags,"run");if(a===void 0&&s===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 $o({home:t,id:n,status:a,priority:s,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=tc(e,"complete"),a=da(e.flags);if(a!==void 0&&a!=="done"&&a!=="failed")throw new Error("work complete --status must be done or failed");let s=await Fo({home:t,id:n,status:a});m(s,r,`Work item completed: ${s.id} (${s.status})`);return}throw new Error("work requires create, list, claim, update, or complete")}function tc(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 oc(){process.stdout.write(`nativesoul
1121
1121
 
1122
1122
  Commands:
1123
1123
  init [--home <path>] [--json]
@@ -1216,7 +1216,8 @@ Commands:
1216
1216
  onboard apply --payload-file <path> [--apply] [--user-confirmed] [--home <path>] [--json]
1217
1217
  onboard complete [--no-archive] [--home <path>] [--json]
1218
1218
  mcp [--home <path>]
1219
- `)}async function dE(e){let t=Sl(e);if(gE(t)){process.stdout.write(`${Xt}
1220
- `);return}if(Al(t)){oc();return}let r=u(t.flags,"home"),o=b(t.flags,"json");if(!fE(t)){let n=await vr(r);if(!n.ok){m(n,o,No(n)),process.exitCode=1;return}}switch(t.command){case"init":{let n=await eg(r);m(n,o,`NativeSoul initialized at ${n.home}`);return}case"status":{let n=ca(r);m(n,o,`NativeSoul ${n.initialized?"initialized":"not initialized"} at ${n.home}`);return}case"doctor":{if(b(t.flags,"deep")){let a=b(t.flags,"require-full-native"),s=await Gt({home:r,host:ot(t.flags),surface:Ie(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}`),a&&!s.full_native_matrix.require_full_native_ready&&(process.exitCode=1);return}let n=await ho(r);m(n,o,n.healthy?`NativeSoul healthy at ${n.home}`:`NativeSoul has ${n.issues.length} issue(s)`);return}case"install":{if(b(t.flags,"apply")){let a=await tr("install.apply",{home:r,target:u(t.flags,"target-root")??null});if(a.status==="deny")throw new Error(`Blocked by policy gate: ${a.reason}`);if(a.status==="approval_required"){m({blocked:!0,allowed:!1,decision:"approval_required",approval_id:a.approvalId,instruction:a.approvalId?`approval ${a.approvalId} pending - run: nativesoul approvals approve ${a.approvalId} --confirm`:"approval pending but unavailable"},o,`install apply blocked: approval required${a.approvalId?` (${a.approvalId})`:""}`);return}}let n=await dl({home:r,host:ot(t.flags),surface:Ie(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 pl({home:r,host:ot(t.flags),surface:Ie(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 zl(t,r,o);return}case"project":{await Xl(t,r,o);return}case"import":{await Bl(t,r,o);return}case"license":{await Vl(t,r,o);return}case"marketing-audit":{await Wl(t,r,o);return}case"commitments":{await Nl(t,r,o);return}case"work":{await rc(t,r,o);return}case"dashboard":{await Hl(t,r,o);return}case"cost":{await Dl(t,r,o);return}case"feedback":{await $l(t,r,o);return}case"adapters":{await Il(t,o);return}case"activate":{await jl(t,r,o);return}case"capabilities":{await Ol(t,r,o);return}case"audit":{await Cl(t,r,o);return}case"approvals":{await Tl(t,r,o);return}case"policy":{await Zl(t,r,o);return}case"scan":{await ec(t,r,o);return}case"heartbeat":{await Fl(t,r,o);return}case"schedule":{await Ul(t,r,o);return}case"bootstrap":{let n=u(t.flags,"cwd")??process.cwd(),a=u(t.flags,"host")??"codex",s=dg(t.flags);if(b(t.flags,"plan")){let l=await Xs({home:r,host:a,cwd:n,query:u(t.flags,"query")});m(l,o,uE(l));return}if(s==="cache"){try{let l=await pr({home:r,host:a,recordTelemetry:!1});m(l,o,l.content)}catch(l){try{let c=await pr({home:mo(n),host:a,recordTelemetry:!1});m(c,o,c.content);return}catch{}throw await pE({home:r,host:a,cwd:n,source:"bootstrap-cache",error:l}),l}return}let i=await pt({home:r,host:a,cwd:n,query:u(t.flags,"query"),readOnly:s==="inject"});if(s==="inject"){try{let l=await Ln({home:r,host:a,payload:i});m(l,o,l.content)}catch(l){try{let d=await Ln({home:mo(n),host:a,payload:i,recordTelemetry:!1});m(d,o,d.content);return}catch{}let c=mr({host:a,payload:i,degraded:!0,warnings:[`BOOTSTRAP_CACHE_WRITE_SKIPPED:${mE(l)}`]});m(c,o,c.content)}return}m(i,o,`Bootstrap ready for ${a} in project ${i.project.id}`);return}case"onboard":{await Ql(t,r,o);return}case"mcp":{await Kl(t,r,o);return}case"help":case void 0:oc();return;default:throw new Error(`Unknown command: ${t.command}`)}}function uE(e){let t=e.budget.softMax>0?Math.round(e.budget.used/e.budget.softMax*100):0,r=e.files.filter(a=>a.included).length,o=e.warnings.length,n=e.files.map(a=>{let s=a.included?"included":"omitted",i=a.truncated?" truncated":"";return`- ${a.role}: ${s}${i} - ${a.reason} (${a.injectedChars}/${a.rawChars} chars)`});return[`Context: ${e.budget.used}/${e.budget.softMax} ${e.budget.unit} (${t}%) \xB7 ${r} files \xB7 ${e.memoryRecall.returned} memories \xB7 ${o} warnings \xB7 policy: strict`,`Project: ${e.project.id}`,`Cache: ${e.cache.hit?"hit":"miss"}${e.cache.key?` (${e.cache.key})`:""}`,"Files:",...n,`Memory recall: ${e.memoryRecall.mode} \xB7 limit ${e.memoryRecall.limit} \xB7 returned ${e.memoryRecall.returned}${e.memoryRecall.query?` \xB7 query "${e.memoryRecall.query}"`:""}`,"Warnings:",...e.warnings.length>0?e.warnings.map(a=>`- ${a}`):["- none"]].join(`
1221
- `)}async function pE(e){try{await Le({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 mE(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"?e.code:"unavailable"}function gE(e){return e.command==="--version"||e.command==="-v"||e.command==="version"}function fE(e){if(e.command==="license"){let t=e.rest[0];return t==="activate"||t==="status"}return!1}function hE(){if(process.argv[1]===void 0)return!1;let e=cE(import.meta.url);try{return Rg(process.argv[1])===Rg(e)}catch{return lE.resolve(process.argv[1])===e}}hE()&&dE(process.argv.slice(2)).catch(e=>{let t=e instanceof Error?e.message:"Unknown error";process.stderr.write(`nativesoul error: ${t}
1222
- `),process.exitCode=1});export{dE as main,Sl as parseArgs,Al as shouldPrintHelp};
1219
+ `)}async function dE(e){let t=Rl(e);if(gE(t)){process.stdout.write(`${Yt}
1220
+ `);return}if(Al(t)){oc();return}let r=u(t.flags,"home"),o=b(t.flags,"json");if(!fE(t)){let n=await kr(r);if(!n.ok){m(n,o,No(n)),process.exitCode=1;return}}switch(t.command){case"init":{let n=await eg(r);m(n,o,`NativeSoul initialized at ${n.home}`);return}case"status":{let n=ca(r);m(n,o,`NativeSoul ${n.initialized?"initialized":"not initialized"} at ${n.home}`);return}case"doctor":{if(b(t.flags,"deep")){let a=b(t.flags,"require-full-native"),s=await Kt({home:r,host:rt(t.flags),surface:Ie(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}`),a&&!s.full_native_matrix.require_full_native_ready&&(process.exitCode=1);return}let n=await ho(r);m(n,o,n.healthy?`NativeSoul healthy at ${n.home}`:`NativeSoul has ${n.issues.length} issue(s)`);return}case"install":{if(b(t.flags,"apply")){let a=await rr("install.apply",{home:r,target:u(t.flags,"target-root")??null});if(a.status==="deny")throw new Error(`Blocked by policy gate: ${a.reason}`);if(a.status==="approval_required"){m({blocked:!0,allowed:!1,decision:"approval_required",approval_id:a.approvalId,instruction:a.approvalId?`approval ${a.approvalId} pending - run: nativesoul approvals approve ${a.approvalId} --confirm`:"approval pending but unavailable"},o,`install apply blocked: approval required${a.approvalId?` (${a.approvalId})`:""}`);return}}let n=await dl({home:r,host:rt(t.flags),surface:Ie(t.flags),apply:b(t.flags,"apply"),targetRoot:u(t.flags,"target-root")});{let a=n.applied?`NativeSoul install ${n.status}`:`NativeSoul install planned: ${n.status}`,s=n.hosts.filter(l=>l.notices.includes("NATIVE_SCHEDULE_AVAILABLE_NOT_ENABLED")).map(l=>l.host),i=s.length>0?`
1221
+ Native scheduling is available but not enabled on: ${[...new Set(s)].join(", ")}. Turn it on with \`nativesoul schedule reconcile --host <host> --mode leader --apply\`.`:"";m(n,o,`${a}${i}`)}return}case"uninstall":{let n=await pl({home:r,host:rt(t.flags),surface:Ie(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 zl(t,r,o);return}case"project":{await Xl(t,r,o);return}case"import":{await Bl(t,r,o);return}case"license":{await Vl(t,r,o);return}case"marketing-audit":{await Wl(t,r,o);return}case"commitments":{await Nl(t,r,o);return}case"work":{await rc(t,r,o);return}case"dashboard":{await Hl(t,r,o);return}case"cost":{await Dl(t,r,o);return}case"feedback":{await $l(t,r,o);return}case"adapters":{await Il(t,o);return}case"activate":{await jl(t,r,o);return}case"capabilities":{await Ol(t,r,o);return}case"audit":{await Cl(t,r,o);return}case"approvals":{await Tl(t,r,o);return}case"policy":{await Zl(t,r,o);return}case"scan":{await ec(t,r,o);return}case"heartbeat":{await Fl(t,r,o);return}case"schedule":{await Ul(t,r,o);return}case"bootstrap":{let n=u(t.flags,"cwd")??process.cwd(),a=u(t.flags,"host")??"codex",s=dg(t.flags);if(b(t.flags,"plan")){let l=await Xs({home:r,host:a,cwd:n,query:u(t.flags,"query")});m(l,o,uE(l));return}if(s==="cache"){try{let l=await mr({home:r,host:a,recordTelemetry:!1});m(l,o,l.content)}catch(l){try{let c=await mr({home:mo(n),host:a,recordTelemetry:!1});m(c,o,c.content);return}catch{}throw await pE({home:r,host:a,cwd:n,source:"bootstrap-cache",error:l}),l}return}let i=await pt({home:r,host:a,cwd:n,query:u(t.flags,"query"),readOnly:s==="inject"});if(s==="inject"){try{let l=await Ln({home:r,host:a,payload:i});m(l,o,l.content)}catch(l){try{let d=await Ln({home:mo(n),host:a,payload:i,recordTelemetry:!1});m(d,o,d.content);return}catch{}let c=gr({host:a,payload:i,degraded:!0,warnings:[`BOOTSTRAP_CACHE_WRITE_SKIPPED:${mE(l)}`]});m(c,o,c.content)}return}m(i,o,`Bootstrap ready for ${a} in project ${i.project.id}`);return}case"onboard":{await Ql(t,r,o);return}case"mcp":{await Kl(t,r,o);return}case"help":case void 0:oc();return;default:throw new Error(`Unknown command: ${t.command}`)}}function uE(e){let t=e.budget.softMax>0?Math.round(e.budget.used/e.budget.softMax*100):0,r=e.files.filter(a=>a.included).length,o=e.warnings.length,n=e.files.map(a=>{let s=a.included?"included":"omitted",i=a.truncated?" truncated":"";return`- ${a.role}: ${s}${i} - ${a.reason} (${a.injectedChars}/${a.rawChars} chars)`});return[`Context: ${e.budget.used}/${e.budget.softMax} ${e.budget.unit} (${t}%) \xB7 ${r} files \xB7 ${e.memoryRecall.returned} memories \xB7 ${o} warnings \xB7 policy: strict`,`Project: ${e.project.id}`,`Cache: ${e.cache.hit?"hit":"miss"}${e.cache.key?` (${e.cache.key})`:""}`,"Files:",...n,`Memory recall: ${e.memoryRecall.mode} \xB7 limit ${e.memoryRecall.limit} \xB7 returned ${e.memoryRecall.returned}${e.memoryRecall.query?` \xB7 query "${e.memoryRecall.query}"`:""}`,"Warnings:",...e.warnings.length>0?e.warnings.map(a=>`- ${a}`):["- none"]].join(`
1222
+ `)}async function pE(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 mE(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"?e.code:"unavailable"}function gE(e){return e.command==="--version"||e.command==="-v"||e.command==="version"}function fE(e){if(e.command==="license"){let t=e.rest[0];return t==="activate"||t==="status"}return!1}function hE(){if(process.argv[1]===void 0)return!1;let e=cE(import.meta.url);try{return Sg(process.argv[1])===Sg(e)}catch{return lE.resolve(process.argv[1])===e}}hE()&&dE(process.argv.slice(2)).catch(e=>{let t=e instanceof Error?e.message:"Unknown error";process.stderr.write(`nativesoul error: ${t}
1223
+ `),process.exitCode=1});export{dE as main,Rl as parseArgs,Al as shouldPrintHelp};