nativesoul 1.1.0 → 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 bg=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)bg(e,r,{get:t[r],enumerable:!0})};import{spawn as nf}from"node:child_process";import{access as af}from"node:fs/promises";import{constants as sf}from"node:fs";import{existsSync as lf}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"&&lf(a))return a;try{return await af(a,sf.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 nf(n,t,{stdio:r,shell:a})}var xt=St(()=>{"use strict"});import{constants as cf}from"node:fs";import{access as df,readFile as uf,stat as pf}from"node:fs/promises";import Vc from"node:os";import mf from"node:path";function j(e){return e==="~"?Vc.homedir():e.startsWith("~/")?mf.join(Vc.homedir(),e.slice(2)):e}async function P(e){try{return await df(e,cf.F_OK),!0}catch{return!1}}async function W(e){try{return(await pf(e)).isDirectory()}catch{return!1}}async function G(e){return await P(e)?uf(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 Af,readFile as Ef}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 xf(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 Ef(r,"utf8")).toLowerCase();return t===td||t.includes(Pf)||n.includes(`name: ${Qc}`)||n.includes(`# ${Qc}`)?`claude:scheduled-task:${t}`:null}async function xf(e){try{return(await Af(e,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>r.name)}catch{return[]}}var td,Pf,Qc,nd=St(()=>{"use strict";ue();td="nativesoul-heartbeat",Pf="nativesoul-heartbeat",Qc="life:heartbeat"});import{mkdir as jf,readFile as If,writeFile as Tf}from"node:fs/promises";import Fr from"node:path";import{fileURLToPath as Cf}from"node:url";async function sd(e){try{let t=Fr.join(e,ad);await jf(t,{recursive:!0,mode:448});let r=Fr.join(t,"SKILL.md"),o=await Nf();return await Tf(r,o??Of,"utf8"),!0}catch{return!1}}async function Nf(){let e=Fr.dirname(Cf(import.meta.url)),t=[Fr.resolve(process.cwd(),"plugins","claude-nativesoul","skills","life-heartbeat","SKILL.md"),Fr.resolve(e,"../../../../plugins/claude-nativesoul/skills/life-heartbeat/SKILL.md")];for(let r of t)if(await P(r))return If(r,"utf8");return null}var ad,KP,Of,id=St(()=>{"use strict";ue();ad="nativesoul-heartbeat",KP=`claude:scheduled-task:${ad}`,Of='---\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:()=>Mf});async function Mf(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:()=>Xf});import{readFile as ts}from"node:fs/promises";import hn from"node:path";import{spawnSync as Wf}from"node:child_process";async function Xf(e={}){let t=await Yf();if(t)return t;let r=await Qf(e.hostConfigRoot);return r||(e.apply?(await eh(),await Zf()):null)}async function Yf(){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 Qf(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 Zf(){let e=th();for(let t of e)for(let r of qf){let o=await rh(()=>nh(t,r),Kf),n=Pd(o);if(n)return n}return null}async function eh(){let e=await Ve("codex");e&&Wf(e,["app-server","daemon","start"],{encoding:"utf8",stdio:"ignore",timeout:1e4})}function th(){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 rh(e,t){for(let r=0;r<=t;r+=1){let o=await e();if(o!==null)return o;r<t&&await oh(zf)}return null}function oh(e){return new Promise(t=>{setTimeout(t,e)})}async function nh(e,t){let r=new AbortController,o=setTimeout(()=>r.abort(),Gf);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=ah(e);for(let r of t){let o=sh(r),n=JSON.stringify(r).toLowerCase();if(o&&Jf.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 ah(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 sh(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 Jf,qf,Gf,Kf,zf,jd=St(()=>{"use strict";ue();xt();Je();Jf=["life:heartbeat","nativesoul-heartbeat","life-heartbeat"],qf=["automation/list","automations/list","scheduledAutomation/list"],Gf=1e3,Kf=2,zf=150});import{realpathSync as yg}from"node:fs";import iE from"node:path";import{fileURLToPath as lE}from"node:url";import{existsSync as cA}from"node:fs";import{mkdirSync as Cg}from"node:fs";import Og from"node:path";import{pathToFileURL as Ng}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 Mr(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 Lr(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 Dr(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 Hr(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:Mr(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 bg=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(Lr)}function we(e,t){let r=e.prepare("SELECT * FROM projects WHERE id = ?").get(t);return r?Lr(r):null}function Ia(e,t,r,o=new Date().toISOString()){if(!$r(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(!$r(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(!$r(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,Rg(t.limit)).map(wg),warning:null}}function La(e,t){if(!$r(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:Lr(r),counts:yc(r),derived_last_seen_at:r.last_activity_at??null},warning:null}:{available:!0,detail:Sg(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,
@@ -118,7 +118,7 @@ LEFT JOIN semantic_counts s ON s.project_id = p.id
118
118
  LEFT JOIN commitment_counts c ON c.project_id = p.id
119
119
  LEFT JOIN run_counts r ON r.project_id = p.id
120
120
  LEFT JOIN session_counts se ON se.project_id = p.id
121
- LEFT JOIN activity a ON a.project_id = p.id`;function wg(e){return{...Lr(e),counts:yc(e),derived_last_seen_at:e.last_activity_at??null}}function yc(e){return{memories:{total:e.memory_count??0,active:e.active_memory_count??0,last_activity_at:e.memory_last_activity_at??null},semantic_memory_index:{total:e.semantic_index_count??0,last_activity_at:e.semantic_last_activity_at??null},commitments:{total:e.commitment_count??0,open:e.open_commitment_count??0,last_activity_at:e.commitment_last_activity_at??null},runs:{total:e.run_count??0,last_activity_at:e.run_last_activity_at??null},sessions:{total:e.session_count??0,last_activity_at:e.session_last_activity_at??null}}}function Rg(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),500)}function $r(e){return e.prepare("SELECT EXISTS(SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'projects') AS exists_count").get()?.exists_count===1}function _c(e,t,r,o){if(!$r(e))return{found:!1,previous:null,project:null};let n=we(e,t);return n?(e.prepare("UPDATE projects SET status = ?, updated_at = ? WHERE id = ?").run(r,o,t),{found:!0,previous:n,project:we(e,t)}):{found:!1,previous:null,project:null}}function Sg(e,t){let r=e.prepare("SELECT COUNT(*) AS count, SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) AS active_count, MAX(created_at) AS last_activity_at FROM memories WHERE scope_project = ?").get(t),o=e.prepare("SELECT COUNT(*) AS count, MAX(indexed_at) AS last_activity_at FROM semantic_memory_index WHERE scope_project = ?").get(t),n=e.prepare("SELECT COUNT(*) AS count, SUM(CASE WHEN status = 'open' THEN 1 ELSE 0 END) AS open_count, MAX(updated_at) AS last_activity_at FROM commitments WHERE project_id = ?").get(t),a=e.prepare("SELECT COUNT(*) AS count, MAX(COALESCE(completed_at, started_at)) AS last_activity_at FROM runs WHERE project_id = ?").get(t),s=e.prepare("SELECT COUNT(*) AS count, MAX(COALESCE(ended_at, started_at)) AS last_activity_at FROM sessions WHERE project_id = ?").get(t),i={memories:{total:r.count,active:r.active_count??0,last_activity_at:r.last_activity_at},semantic_memory_index:{total:o.count,last_activity_at:o.last_activity_at},commitments:{total:n.count,open:n.open_count??0,last_activity_at:n.last_activity_at},runs:{total:a.count,last_activity_at:a.last_activity_at},sessions:{total:s.count,last_activity_at:s.last_activity_at}};return{project:null,counts:i,derived_last_seen_at:Ag(i)}}function Ag(e){return[e.memories.last_activity_at,e.semantic_memory_index.last_activity_at,e.commitments.last_activity_at,e.runs.last_activity_at,e.sessions.last_activity_at].filter(r=>typeof r=="string"&&r.length>0).sort().at(-1)??null}function bc(e,t){let r=e.prepare(`INSERT INTO semantic_memory_index (
121
+ LEFT JOIN activity a ON a.project_id = p.id`;function xg(e){return{...Hr(e),counts:yc(e),derived_last_seen_at:e.last_activity_at??null}}function yc(e){return{memories:{total:e.memory_count??0,active:e.active_memory_count??0,last_activity_at:e.memory_last_activity_at??null},semantic_memory_index:{total:e.semantic_index_count??0,last_activity_at:e.semantic_last_activity_at??null},commitments:{total:e.commitment_count??0,open:e.open_commitment_count??0,last_activity_at:e.commitment_last_activity_at??null},runs:{total:e.run_count??0,last_activity_at:e.run_last_activity_at??null},sessions:{total:e.session_count??0,last_activity_at:e.session_last_activity_at??null}}}function jg(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),500)}function Ur(e){return e.prepare("SELECT EXISTS(SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'projects') AS exists_count").get()?.exists_count===1}function _c(e,t,r,o){if(!Ur(e))return{found:!1,previous:null,project:null};let n=we(e,t);return n?(e.prepare("UPDATE projects SET status = ?, updated_at = ? WHERE id = ?").run(r,o,t),{found:!0,previous:n,project:we(e,t)}):{found:!1,previous:null,project:null}}function Ig(e,t){let r=e.prepare("SELECT COUNT(*) AS count, SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) AS active_count, MAX(created_at) AS last_activity_at FROM memories WHERE scope_project = ?").get(t),o=e.prepare("SELECT COUNT(*) AS count, MAX(indexed_at) AS last_activity_at FROM semantic_memory_index WHERE scope_project = ?").get(t),n=e.prepare("SELECT COUNT(*) AS count, SUM(CASE WHEN status = 'open' THEN 1 ELSE 0 END) AS open_count, MAX(updated_at) AS last_activity_at FROM commitments WHERE project_id = ?").get(t),a=e.prepare("SELECT COUNT(*) AS count, MAX(COALESCE(completed_at, started_at)) AS last_activity_at FROM runs WHERE project_id = ?").get(t),s=e.prepare("SELECT COUNT(*) AS count, MAX(COALESCE(ended_at, started_at)) AS last_activity_at FROM sessions WHERE project_id = ?").get(t),i={memories:{total:r.count,active:r.active_count??0,last_activity_at:r.last_activity_at},semantic_memory_index:{total:o.count,last_activity_at:o.last_activity_at},commitments:{total:n.count,open:n.open_count??0,last_activity_at:n.last_activity_at},runs:{total:a.count,last_activity_at:a.last_activity_at},sessions:{total:s.count,last_activity_at:s.last_activity_at}};return{project:null,counts:i,derived_last_seen_at:Tg(i)}}function Tg(e){return[e.memories.last_activity_at,e.semantic_memory_index.last_activity_at,e.commitments.last_activity_at,e.runs.last_activity_at,e.sessions.last_activity_at].filter(r=>typeof r=="string"&&r.length>0).sort().at(-1)??null}function bc(e,t){let r=e.prepare(`INSERT INTO semantic_memory_index (
122
122
  memory_id, scope_project, source_json, schema_version, provider_id, model_id,
123
123
  content_hash, embedding_json, indexed_text, indexed_at
124
124
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
@@ -155,7 +155,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function wg(e){return{...Lr(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,15 +168,15 @@ LEFT JOIN activity a ON a.project_id = p.id`;function wg(e){return{...Lr(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=xg(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
- ) 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 xg(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 Ig}from"node:module";var Tg=Ig(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=Tg("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(`
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 (
181
181
  version INTEGER PRIMARY KEY,
182
182
  name TEXT NOT NULL,
@@ -214,7 +214,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function wg(e){return{...Lr(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 wg(e){return{...Lr(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 wg(e){return{...Lr(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 wg(e){return{...Lr(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 wg(e){return{...Lr(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 wg(e){return{...Lr(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 wg(e){return{...Lr(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||Cg(Og.dirname(t),{recursive:!0,mode:448});let{DatabaseSync:o}=jc(),n=r.readOnly?Mg(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 wg(e){return{...Lr(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 ")}
@@ -481,9 +481,9 @@ LEFT JOIN activity a ON a.project_id = p.id`;function wg(e){return{...Lr(e),coun
481
481
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.project_id,t.summary,t.status,t.due_at,t.ttl_expires_at,JSON.stringify(t.source),t.created_at,t.updated_at);let r=this.getCommitment(t.id);if(!r)throw new Error(`Commitment not found after insert: ${t.id}`);return r}createOpenCommitmentIfMissing(t,r){this.db.exec("BEGIN IMMEDIATE");try{this.expireCommitments(r);let o=Oc(t.summary),n=this.listCommitments({project:t.project_id,status:"open",includeExpired:!1,limit:200,now:r,skipExpire:!0}).find(s=>Oc(s.summary)===o);if(n)return this.db.exec("COMMIT"),{created:!1,commitment:n};this.db.prepare(`INSERT INTO commitments (id, project_id, summary, status, due_at, ttl_expires_at, source_json, created_at, updated_at)
482
482
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.project_id,t.summary,t.status,t.due_at,t.ttl_expires_at,JSON.stringify(t.source),t.created_at,t.updated_at);let a=this.getCommitment(t.id);if(!a)throw new Error(`Commitment not found after insert: ${t.id}`);return this.db.exec("COMMIT"),{created:!0,commitment:a}}catch(o){throw this.db.exec("ROLLBACK"),o}}listCommitments(t){t.skipExpire||this.expireCommitments(t.now);let r=[],o=[];t.project&&(r.push("project_id = ?"),o.push(t.project)),t.status?(r.push("status = ?"),o.push(t.status)):t.includeExpired||r.push("status != 'expired'");let n=r.length?`WHERE ${r.join(" AND ")}`:"";return this.db.prepare(`SELECT * FROM commitments ${n} ORDER BY updated_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(an)}updateCommitmentStatus(t,r,o){return this.expireCommitments(o),this.db.prepare("UPDATE commitments SET status = ?, updated_at = ? WHERE id = ?").run(r,o,t),this.getCommitment(t)}claimHeartbeatLease(t){this.db.exec("BEGIN IMMEDIATE");try{let r=this.db.prepare("SELECT * FROM leases WHERE idempotency_key = ?").get(t.idempotencyKey);if(r){if(r.status==="claimed"&&Date.parse(r.expires_at)<=Date.parse(t.now)){this.db.prepare(`UPDATE leases
483
483
  SET holder = ?, expires_at = ?, status = 'claimed', created_at = ?, completed_at = NULL
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:Dr(r),claimed:!1,reason:r.status==="completed"?"LEASE_ALREADY_COMPLETED":"LEASE_OCCUPIED"}}this.db.prepare(`INSERT INTO leases (id, slot, holder, idempotency_key, expires_at, status, created_at, completed_at)
485
- VALUES (?, ?, ?, ?, ?, 'claimed', ?, NULL)`).run(t.id,t.slot,t.holder,t.idempotencyKey,t.expiresAt,t.now);let o=this.getLeaseById(t.id);if(!o)throw new Error(`Lease not found after claim: ${t.id}`);return this.db.exec("COMMIT"),{lease:o,claimed:!0,reason:null}}catch(r){throw this.db.exec("ROLLBACK"),r}}completeHeartbeatLease(t){this.db.exec("BEGIN IMMEDIATE");try{let r=this.db.prepare("SELECT * FROM leases WHERE idempotency_key = ?").get(t.idempotencyKey);if(!r)throw new Error(`Heartbeat lease not found: ${t.idempotencyKey}`);if(r.status==="completed"){let a=this.latestHeartbeatRun(t.project,r.slot);return this.db.exec("COMMIT"),{lease:Dr(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(Dr)}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(Hr)}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(Hr)}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
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
+ 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(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 wg(e){return{...Lr(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?Dr(r):null}getHeartbeatRunById(t){let r=this.db.prepare("SELECT * FROM runs WHERE id = ?").get(t);return r?Hr(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?Hr(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 Lg(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 Mg(e){return`${Ng(e).href}?mode=ro&immutable=1`}function Oc(e){return e.trim().replace(/\s+/gu," ").toLocaleLowerCase()}function Lg(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 Qg,mkdir as Zg}from"node:fs/promises";import ef from"node:os";import tf from"node:path";import{createHash as Dg,randomUUID as Hg}from"node:crypto";function T(e){return`${e}_${Hg()}`}function A(e){return`sha256:${Dg("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 Fg}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 Ug=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 Ug)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&&Fg(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 Bg,writeFile as Wa}from"node:fs/promises";import{constants as Vg,existsSync as $c}from"node:fs";import{access as Wg}from"node:fs/promises";import Jg 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"],Gg=dn;function Fc(e){return Ne.resolve(e??process.env.NATIVESOUL_HOME??Ne.join(Jg.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 Wg(e,Vg.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(Gg)){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,zg(i,l),{encoding:"utf8",mode:384,flag:"wx"}),o.push(c)}catch(d){if(Xg(d)){n.push(c);continue}throw d}}let s=await Yg(t.home);return o.push(...s.createdFiles),n.push(...s.preservedFiles),{home:t.home,database:t.database,createdDirectories:r,createdFiles:o,preservedFiles:n}}function Kg(e=Intl.DateTimeFormat){return e().resolvedOptions().timeZone??"UTC"}function zg(e,t){return e!=="config.yaml"?t:t.replace(/^timezone: .+$/m,`timezone: ${Kg()}`)}function Xg(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST"}async function Yg(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)?Bg(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 Zg(tf.dirname(t.auditLog),{recursive:!0,mode:448}),await Qg(t.auditLog,`${JSON.stringify(n)}
852
- `,{encoding:"utf8",mode:384}),n}function qa(e,t){if(typeof e=="string")return rf(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 rf(e,t){return[[new RegExp(Ja(t),"gu"),"[REDACTED_NATIVESOUL_HOME]"],[new RegExp(Ja(process.cwd()),"gu"),"[REDACTED_WORKSPACE]"],[new RegExp(Ja(ef.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:of(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 of(e){return Math.min(Math.max(e??50,1),500)}import De from"node:path";import{existsSync as k_}from"node:fs";import{mkdir as Bh,readdir as Vh,readFile as fs,writeFile as Wh}from"node:fs/promises";import{existsSync as Jh}from"node:fs";import Kr from"node:path";xt();ue();Je();ue();import{readdir as gf}from"node:fs/promises";import he from"node:path";var Se="antigravity",ff="~/.gemini/GEMINI.md",hf="~/.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",yf="official:antigravity-context-config:v1",_f="official:antigravity-features:v1",bf=[{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(hf)}function vf(){let e=Xa();return{root:e,globalInstruction:process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim()?he.join(e,"GEMINI.md"):j(ff)}}async function Kc(){let e=[],t=vf();await P(t.globalInstruction)&&e.push({uid:"antigravity:global-gemini-md",host:Se,nativeKind:"global_context",normalizedKind:"instruction",source:t.globalInstruction,schemaHash:yf}),await kf(t.root,e),await wf(t.root,e);for(let r of bf){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 kf(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 Rf(he.join(e,"commands"),t)}async function wf(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:_f})}async function Rf(e,t){if(!await W(e))return;let r=await gf(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 Sf(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 Sf(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 Lf 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:Ff(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(Lf.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=Df(r.surface),n=Hf(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:$f(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 Df(e){return e==="claude-code"||e==="claude-desktop"||e==="cloud"?e:void 0}function Hf(e){return e==="local_scheduled_task"||e==="cloud_routine"||e==="ui_only"?e:"unknown"}function $f(e){return e==="official_machine_readable"||e==="ui_only"||e==="unknown"?e:void 0}function Ff(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 Uf(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 Uf(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:${Bf(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=Vf(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 Bf(e){return M(e,{allowSlash:!0})}function Vf(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",ih=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=mh(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(fh(n),r);if(i.status==="ready")return i}let a=gh(t);if(a){let i=await os(hh(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=[...ch(r),...dh(o),...uh(n),...ph(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 lh(e,t){let r=new AbortController,o=setTimeout(()=>r.abort(),ih);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 ch(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 dh(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 uh(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 ph(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 mh(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 gh(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 fh(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 hh(e){return{call:t=>lh(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",yh="~/.gemini/extensions",_h="~/.gemini/settings.json",Ur="official:gemini-extension-config:v1",is="official:gemini-settings-config:v1",bh="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:bh}),await vh(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:Ur});let a=await Nd(n,{withFileTypes:!0});for(let s of a)s.isDirectory()&&await kh(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(_h),extensionsDirectory:j(yh)}}async function vh(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 kh(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?Ur: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:Ur});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:Ur})}await wh(Ae.join(e,"commands"),r)}async function wh(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:Ur})}}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",Rh="~/.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",Sh="official:grok-context-config:v1",Ah=[{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=Eh(),o=r.globalInstruction;await P(o)&&t.push({uid:"grok:global-agents-md",host:J,nativeKind:"global_context",normalizedKind:"instruction",source:o,schemaHash:Sh});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 Ph(i,t);for(let l of Ah){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 jh(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(Rh)}function Eh(){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 xh(q.join(e,"commands"),t)}async function Ph(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 xh(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 jh(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 Lh,writeFile as Sn}from"node:fs/promises";import{existsSync as An}from"node:fs";import Br from"node:path";import{lstatSync as Ih,realpathSync as Th,statSync as Ch}from"node:fs";import qe from"node:path";var Oh=process.platform!=="win32";function Nh(){let e=process.getuid;return typeof e=="function"?e.call(process):void 0}function qd(e){let t=e,r=[];for(;;)try{let o=Th(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 Mh(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(Ih(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=Ch(o);if(Oh){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??Nh();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(!Mh(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=Hh(o,e.host,e.block),a=o===null?null:A(o),s=A(n),i=$h(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(Br.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=Dh(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(Br.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(Br.dirname(r.targetPath),{recursive:!0,mode:448}),await Sn(r.targetPath,r.beforeContent,{encoding:"utf8",mode:384})):An(r.targetPath)&&await Lh(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 Dh(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(`
@@ -857,28 +857,28 @@ _Running context for today. Promote durable facts to curated memory later._
857
857
  `)&&(l=l.slice(1)),i.length>0&&l.length>0&&!i.endsWith(`
858
858
  `)&&!l.startsWith(`
859
859
  `)&&(i=`${i}
860
- `),`${i}${l}`}function Hh(e,t,r){let o=r.endsWith(`
860
+ `),`${i}${l}`}function Wh(e,t,r){let o=r.endsWith(`
861
861
  `)?r:`${r}
862
862
  `;if(e===null||e.length===0)return o;let{start:n,end:a}=En(t),s=e.indexOf(n),i=e.indexOf(a);if(s>=0&&i>s){let c=i+a.length,d=e.slice(c).replace(/^\n/u,"");return`${e.slice(0,s)}${o}${d}`}let l=e.endsWith(`
863
863
  `)?`
864
864
  `:`
865
865
 
866
- `;return`${e}${l}${o}`}function $h(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=Br.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=Br.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 Fh=["codex","claude","grok","antigravity","gemini"],Uh={codex:Cd,claude:Ed,grok:Jd,antigravity:Yc,gemini:Ld};function Ge(e){return e==="all"?Fh:[e]}function Pn(e){return Ge(e)}function jt(e){return Uh[e]()}async function Vr(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 Wr(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 Jr(e){return jt(e).managedBlockPreview()}async function qr(e){let t=await Jr(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 Jr(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=>Kh({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(Kr.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 zr(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=Kr.join(t.home,"capabilities","cards"),o=[];if(!await S(r))return{cards:[],warnings:o};let n=(await Vh(r)).filter(c=>c.endsWith(".json")).sort(),a=ty(e.query??""),s=[];for(let c of n){let d=Kr.join(r,c),p;try{p=await fs(d,"utf8")}catch{o.push(`CAPABILITY_CARD_UNREADABLE:${c}`);continue}let g=Yh(p);if(!g){o.push(`CAPABILITY_CARD_MALFORMED:${c}`);continue}let y=Qh(g,e.host);s.push({card:y,score:Zh(g,e.host,a)})}let i=ay(e.limit),l=s.sort((c,d)=>d.score-c.score||c.card.uid.localeCompare(d.card.uid));return{cards:Gh(l,i).map(c=>c.card),warnings:o}}function Gh(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 zh({home:t.home,host:e.host,limit:e.limit}),o=Kr.join(t.home,"capabilities","cards");await Bh(o,{recursive:!0,mode:448});let n=[];for(let s of r){let i=Xh(s),l=`${JSON.stringify(i,null,2)}
868
- `,c=Kr.join(o,`${ny(s.uid)}.json`),d=Jh(c)?await fs(c,"utf8"):null,p=d===l?"unchanged":d===null?"created":"updated";p!=="unchanged"&&await Wh(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 Kh(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 zh(e){return e.host==="all"?Ee({home:e.home,limit:e.limit}):Ee({home:e.home,host:e.host,limit:e.limit})}function Xh(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:ry(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:oy(e),examples:[`Inspect ${e.uid} readiness before using it.`,`Prefer a ready capability on ${e.host}; otherwise report degraded status.`]};return H(r)}function Yh(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)||!ey(r)?null:t}function Qh(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:Gr(e.use_when).slice(0,2),requires:Gr(e.requires).slice(0,4),approval:e.approval,alternative_host:r,available_on_other_host:o}}function Zh(e,t,r){let o=ru([e.uid,e.host,e.native_kind,e.normalized_kind,e.source,e.schema_hash,...Gr(e.use_when),...Gr(e.requires),e.approval,...Gr(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 Gr(e){return e.filter(t=>typeof t=="string")}function tu(e){return typeof e=="object"&&e!==null}function ey(e){return tu(e)?["installed","enabled","active","authenticated","healthy","allowed","ready"].every(t=>typeof e[t]=="boolean"):!1}function ty(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 ry(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 oy(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 ny(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 ay(e){return Math.min(Math.max(e??5,1),8)}async function Xr(e){let t=await v(e.home),r=N(e.summary).value,o=new Date,n=e.ttlSeconds?new Date(o.getTime()+sy(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 Yr(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 Qr(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 sy(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e),1),365*24*60*60):1440*60}import{createHash as iy}from"node:crypto";import{existsSync as xn,mkdirSync as ly,realpathSync as cy,readFileSync as su,writeFileSync as dy}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=gy(r),n=o?fy(o):null,a=n?au(n):o??r,s=hy(a),i=n?"git-remote":o?"git-root":"path",l=py(s,a),c=uy(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?my(o):null}function bs(e,t){let r=ye.join(e,".nativesoul","project");return ly(ye.dirname(r),{recursive:!0,mode:448}),dy(r,`${t}
869
- `,{encoding:"utf8",mode:384}),r}async function Zr(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 uy(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 py(e,t){let r=iy("sha256").update(t).digest("hex").slice(0,10);return`${yy(e)}-${r}`}function my(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"")||"workspace"}function ks(e){try{return cy(ye.resolve(e))}catch{return ye.resolve(e)}}function gy(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 fy(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 hy(e){let t=e.replace(/\/+$/u,"");return ye.basename(t)||"workspace"}function yy(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 _y,writeFile as by}from"node:fs/promises";import vy from"node:path";async function Rs(e){let t=f(e.home),r=vy.join(t.home,"config.yaml"),o=await S(r)?await _y(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=ky(o,s,n),c=l!==o;return e.apply&&c&&(me(r,{root:t.home}),await by(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 ky(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 Fy}from"node:fs/promises";import Is from"node:path";import{mkdir as _u,rename as xy,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 eo(e){return Ss[e].nativeSchedule==="supported"}function mu(e){return Ss[e].scheduleSurfaceScoped}function gu(e){return Ss[e].pluginApply}import{mkdir as wy,readFile as Ry,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=Sy(e.profile,e.options),i=Ey(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 wy(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 Ry(yu(e),"utf8"));return Py(t)?t:null}catch{return null}}function Sy(e,t){return{...jn,...Ay(t),profile:e,updated_at:new Date().toISOString()}}function Ay(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 Ey(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 Py(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 jy=["entity","soul","human","collaboration","continuity"],Iy=["codex","claude","grok","antigravity","gemini"],Ty=["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 -->",Cy={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"]}]}},Oy={"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 to(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:[...Ty],writable_files:[...vu],interview_themes:[...jy],interview_guidance:Cy,instruction_doc:"llm-install.txt",apply_defaults:{dry_run:!0,user_confirmed:!1},file_generation_rules:Oy,activation:n,offers:Ny(n)}}function Ny(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:Iy.map(t=>({host:t,status:eo(t)?"available":"blocked_by_host",reason:eo(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 ro(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"?My(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 oo(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 xy(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 My(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 Ly={minLength:1,removeStopwords:!1,normalizeDiacritics:!1};function Tn(e,t={}){let r={...Ly,...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||!Dy.has(n))??[]))}function no(e,t={}){return new Set(Tn(e,t))}function xs(e,t){let r=Tn(e);if(r.length===0)return 0;let o=no(t),n=r.filter(a=>o.has(a)).length;return Number((n/r.length).toFixed(6))}function Ru(e,t,r={}){let o=no(e,r),n=no(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 Dy=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=Hy(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 ao(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 Hy(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
- ${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=$y(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 $y(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 so(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}},Uy=new Map([["candidate",new Set(["active","rejected"])],["active",new Set(["forgotten","expired"])],["superseded",new Set],["rejected",new Set],["forgotten",new Set],["expired",new Set]]),By=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 Zr({cwd:r,home:t.home});let o=L(r,t.home),n=e.event?.trim()||"session-end",a=Vy(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 Vy(e,t){let r=e?.trim();if(r)return{text:xu(r),source:"text"};let o=Wy(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 Wy(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 Jy(t.home),a=Iu(e.prompt,n),s=Math.min(Math.max(e.limit??3,1),3),i=[];if(a.triggered){let l=ao({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 Jy(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 io(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=Gy(t.database),o=await de(t.home,"MEMORY.md"),n=ur(o,Ky(r));n!==o&&await Fy(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 zy({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 Gy(e){let t=_(e);try{return t.listMemories({status:"active",limit:By})}finally{t.close()}}function Ky(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(`
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 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 Uy.get(e)?.has(t)??!1}async function zy(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=ao({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 lo(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:${t_(o)}`}}finally{r?.close()}}async function Ms(e={}){let t=f(e.home),r=Qy(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==="."?Xy(e.cwd??process.cwd(),t.home):Yy(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=Zy(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:e_(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 Xy(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 Yy(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 Qy(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),500)}function Zy(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 e_(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 t_(e){return(e instanceof Error?e.message:String(e)).replace(/[^a-zA-Z0-9_.:-]+/g,"_").slice(0,120)}var r_=/^-\s*\*\*([^:*]+):\*\*\s*(.*)$/u;function Ht(e,t){let r=o_(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(r_);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 o_(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 m_,mkdir as $u,readFile as g_,rename as f_,stat as h_,writeFile as y_}from"node:fs/promises";import{existsSync as Fu}from"node:fs";import $t from"node:path";import{mkdir as n_,readFile as a_,rename as s_,writeFile as i_}from"node:fs/promises";import co from"node:path";var l_=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?co.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:p_(e.error),recorded_at:e.recordedAt??new Date().toISOString()};return r.hosts[e.host]=o,await d_(t.home,r),await h({home:t.home,type:u_(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 c_();let o=JSON.parse(await a_(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>l_}}function c_(){return{schema:1,hosts:{}}}async function d_(e,t){let r=Js(e);await n_(co.dirname(r),{recursive:!0,mode:448});let o=co.join(co.dirname(r),`.last-handshake-${T("tmp")}.tmp`);await i_(o,`${JSON.stringify(t,null,2)}
907
- `,{encoding:"utf8",mode:384}),await s_(o,r)}function Js(e){return co.join(e,"state","last-handshake.json")}function u_(e){return`handshake_${e}`}function p_(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 b_(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 y_(s,r.content,{encoding:"utf8",mode:384}),await f_(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 __({home:t.home,host:e.host,targetPath:r,recordTelemetry:e.recordTelemetry});let o=await g_(r,"utf8"),n=await h_(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=v_(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:uo(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 uo(e){return $t.join(e,".nativesoul-cache")}async function __(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 b_(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 m_(r,n),n}function Ks(e){return Math.ceil(e.length/4)}function v_(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 A_(t.home),o=Math.min(Math.max(e.tokensMax??r.defaultTokens,1),Uu),n=[];e.readOnly!==!0&&await Zr({cwd:e.cwd,home:t.home});let a=K(e.cwd,t.home),s=a.id;if(e.readOnly!==!0){let V=await lo({home:t.home,resolution:a});V.warning&&n.push(V.warning)}let i=E_({explicitQuery:e.query,project:s,host:e.host,cwd:e.cwd,seed:r.memoryQuerySeed}),l=await w_({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 j_(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 Yr({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:P_(),user:{preferences_summary:x_(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},Or=I_(x,o),rn=so(JSON.stringify(Or)),Nr={...Or,context_budget:{tokens_used:rn,tokens_max:o}};return Bu.set(Nr,{files:R_({home:t.home,identityText:k,soulText:R,agentsText:U,userText:Z,bootstrapText:ke,payload:Nr}),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}}),Nr}async function w_(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=ao({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:${S_(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 R_(e){return[po({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"}),po({home:e.home,relativePath:"SOUL.md",role:"soul_summary",rawText:e.soulText,injectedText:e.payload.soul_summary,fallbackReason:"missing; default soul summary injected"}),po({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"}),po({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"}),po({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 po(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:k_(r),key:r}}function S_(e){return(e instanceof Error?e.message:String(e)).replace(/[^a-zA-Z0-9_.:-]+/g,"_").slice(0,120)}async function A_(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 E_(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 P_(){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 x_(e){let t=e.trim();return t.length===0?"No curated user preferences yet.":t.length<=160?t:`${t.slice(0,157)}...`}async function j_(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 I_(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=>so(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:T_(e),mcp:C_(e),plugins_hooks:O_(e),heartbeat:N_(e),recall_auto_trigger:M_(e),memory_candidate_hooks:L_(e),memory_promotion_policy:D_(e),cross_host_verification:H_(e)},r=Object.values(t),o=$_(r),n=r.flatMap(s=>s.plan_actions),a=F_(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 T_(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 C_(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 O_(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 N_(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 M_(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 L_(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 D_(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 H_(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 $_(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 F_(e,t,r){return{overall_status:t,profile:e?.profile??null,active:mo(r,"active"),not_configured:mo(r,"not_configured"),approval_required:mo(r,"approval_required"),blocked_by_host:mo(r,"blocked_by_host"),degraded:mo(r,"degraded"),full_native_claimed:!1}}function mo(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 U_}from"node:fs";import B_ from"node:path";async function go(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(B_.join(t.home,a))||r.push({code:"MISSING_HUMAN_FILE",severity:"warn",message:`${a} is missing`,remediation:"Run nativesoul init"});if(!U_(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(...V_(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 V_(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 fo(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"?[fo(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):W_()}function W_(){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 sv}from"node:fs";import{readFile as iv,stat as lv}from"node:fs/promises";import jp from"node:path";import hr from"node:path";import{existsSync as ui}from"node:fs";import{cp as Nb,mkdir as Mb,rm as kp}from"node:fs/promises";import Lb from"node:path";import{existsSync as gt}from"node:fs";import{readFile as Gn}from"node:fs/promises";import Xe from"node:path";import J_ from"node:path";function gr(e){return e.split(/[\\/]/u).join("/")}function mt(e,t){return gr(J_.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 K_}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 z_ from"node:os";import B from"node:path";import{existsSync as q_}from"node:fs";import ho from"node:os";import ne from"node:path";import{fileURLToPath as G_}from"node:url";function He(e,t,r){return yo(e,t)?r?ne.join(ne.resolve(r),e,"plugins","nativesoul"):e==="claude"?ne.join(ho.homedir(),".claude","plugins","nativesoul"):e==="codex"?ne.join(ho.homedir(),".codex","plugins","nativesoul"):e==="gemini"?ne.join(ho.homedir(),".gemini","extensions","nativesoul"):e==="grok"?ne.join(ho.homedir(),".grok","plugins","nativesoul"):e==="antigravity"?ne.join(ho.homedir(),".antigravity","plugins","nativesoul"):null:null}function yo(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(G_(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:bo(`node ${JSON.stringify(n)} session-start --host claude --project-env CLAUDE_PROJECT_DIR`),UserPromptSubmit:bo(`node ${JSON.stringify(n)} prompt-bootstrap --host claude --project-env CLAUDE_PROJECT_DIR`),PreToolUse:bo(`node ${JSON.stringify(n)} pre-tool-use --host claude --project-env CLAUDE_PROJECT_DIR`),Stop:bo(`node ${JSON.stringify(n)} memory-flush --host claude --project-env CLAUDE_PROJECT_DIR`),PreCompact:bo(`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:_o(`node ${JSON.stringify(n)} session-start --host grok --project-env GROK_WORKSPACE_ROOT`),UserPromptSubmit:_o(`node ${JSON.stringify(n)} prompt-bootstrap --host grok --project-env GROK_WORKSPACE_ROOT`),PreToolUse:_o(`node ${JSON.stringify(n)} pre-tool-use --host grok --project-env GROK_WORKSPACE_ROOT`),Stop:_o(`node ${JSON.stringify(n)} memory-flush --host grok --project-env GROK_WORKSPACE_ROOT`),PreCompact:_o(`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,rb(),{encoding:"utf8",mode:384});let n=Vt(o)?await Wt(o,"utf8"):"";await Un(B.dirname(o),{recursive:!0,mode:448}),await Bn(o,ob(n,"agent",`name = "${Vn}"`),"utf8")}function ap(e,t,r){if(t!=="default"||!eb(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:X_},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:Y_},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=K_(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 X_(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 Y_(e){return/^Enabled plugin:/i.test(e)||/\balready enabled\b/i.test(e)}async function sp(e){let t=e?tb(e):B.join(z_.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 Q_(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")&&nb(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 Q_(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])=>Z_(t,o,n))}function Z_(e,t,r){let o=e[t];return Array.isArray(o)?o.some(n=>ri(n)?.includes(r)===!0):!1}function eb(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 tb(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 _o(e){return{hooks:[{type:"command",command:e,timeout:9}]}}function rb(){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
- `)}function ob(e,t,r){let o=`[${t}]
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
+ `)}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 nb(e){return e.match(/\[agent\][\s\S]*?(?=\n\[|$)/u)?.[0]?.match(/\bname\s*=\s*["']([^"']+)["']/u)?.[1]??null}function bo(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 ab 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"}],sb={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 vo(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 ib(e){return e==="grok"||e==="gemini"||e==="antigravity"?sb[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=>ab.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 ib(e).filter(({event:r,commandFragment:o})=>!lb(t,r,o)).map(({event:r})=>r)}function ko(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 lb(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||!yo(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=vo(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 cb(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 db({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 cb(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 db(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 ub,mkdir as pb,readFile as mb,readdir as gb}from"node:fs/promises";import ii from"node:path";async function li(e,t,r,o){let n=ii.join(e,"backups","plugins");await pb(n,{recursive:!0,mode:448});let a=ii.join(n,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-${t}-${r}-${T("plugin")}`);return await ub(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 mb(o,"utf8");return`${n}\0${A(a)}`}));return A(r.sort().join(`
919
- `))}async function fr(e){let t=await gb(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 Sb}from"node:fs";import{cp as Ab,mkdir as Eb,readFile as di,writeFile as Pb}from"node:fs/promises";import Ye from"node:path";import{fileURLToPath as xb}from"node:url";import{spawnSync as fb}from"node:child_process";import{accessSync as hb,constants as yb,existsSync as mp}from"node:fs";import Jt from"node:path";function qt(e){let t=_b(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:Rb(e.host,n),warnings:[...t.warnings,...e.host==="generic"?[]:[`${e.host.toUpperCase()}_MCP_REGISTRATION_NOT_APPLIED`]]}}function _b(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"?bb(t):{command:"nativesoul-mcp",args:[],warnings:gp("nativesoul-mcp")?[]:["NATIVESOUL_MCP_COMMAND_NOT_ON_PATH"]}}function bb(e){let t=kb();if(t)return{command:t,args:[],warnings:[]};let r=gp("nativesoul-mcp");if(r)return{command:r,args:[],warnings:[]};let o=vb(e);if(mp(o))return{command:process.execPath,args:[o],warnings:["NATIVESOUL_MCP_COMMAND_LOCAL_DIST"]};let n=wb();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 vb(e){return Jt.join(e??process.cwd(),"dist","packages","mcp-server","src","index.js")}function kb(){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 wb(){let e=fb("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 hb(e,yb.X_OK),!0}catch{return!1}}function Rb(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&&ko(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 Eb(r,{recursive:!0,mode:448}),await Ab(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 Pb(r,a,"utf8")}))}function bp(){let e=Ye.dirname(xb(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=>Sb(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?jb(n,qt({host:e.host,commandMode:"package",home:e.home}).mcpServers.nativesoul):n,s=o&&e.targetPath&&ko(e.host)?Ib(a,e.targetPath):a;return`${JSON.stringify(s,null,2)}
921
- `}function jb(e,t){return{...e,mcpServers:{nativesoul:t}}}function Ib(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=>Tb(s,t))]:[n,a]));return{...e,hooks:o}}function Tb(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=>Cb(n,t))}:e}function Cb(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)} ${Ob(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 Ob(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 Mb(Lb.dirname(e.targetPath),{recursive:!0,mode:448}),await kp(e.targetPath,{recursive:!0,force:!0}),await Nb(r,e.targetPath,{recursive:!0}),ko(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&&yo(e.host,e.surface)?await ft({host:e.host,surface:e.surface,targetPath:e.targetPath}):null,d=vo(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=vo(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=fo(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 Db,constants as Hb,existsSync as ht}from"node:fs";import{mkdir as Kn,readFile as _r,rm as $b,writeFile as zn}from"node:fs/promises";import X from"node:path";async function Ro(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(Fb(wo(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=Ub(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 $b(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 So(e){let t=X.resolve(e.targetPath??Xn(e.host)),r=Xu(e.host,e.targetPath),o=ht(t),n=[],a=await Bb(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=wo(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:[]}:Vb(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 wo(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 Fb(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 Ub(e){if(e===null)return null;let t=wo(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 Bb(e,t,r){if(e!=="claude"||r===null||X.resolve(r)===t||!ht(r))return null;try{let o=wo(await _r(r,"utf8")),n=gi(o);if(!n)return null;if(ht(t)){let a=wo(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 Vb(e,t,r){let o=[],n=Wb(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(Jb(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 Wb(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 Db(e,Hb.X_OK),!0}catch{return!1}}function Jb(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=fo(e.host,r),n=e.hostConfigRoot??(e.targetRoot?Qe(e.host,e.targetRoot):void 0),a=await Xb({host:e.host,surface:o,targetRoot:e.targetRoot,explicit:e.pluginEnabled}),s=new Date().toISOString(),i=Kb(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:Yb(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?Gb(t.database,c):c,p={dryRun:!e.apply,applied:e.apply,schedule:d,adapter_result:l,warnings:zb(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 Ao(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 Gb(e,t){let r=_(e);try{return r.upsertSchedule(t)}finally{r.close()}}function Kb(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 zb(e,t,r){return t!=="unsupported"?[]:eo(e)?r===!1?["NATIVE_SCHEDULE_UNSUPPORTED_NO_FALLBACK_INSTALLED"]:["NATIVE_SCHEDULE_UNSUPPORTED"]:[]}async function Xb(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 Yb(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=>Zb(y,t)),s=ov(e.capabilities,e.adapterDiagnostics),i=[Eo("native_package",r,t,e.plugin.targetPath??e.plugin.package_kind,"Native package/extension is not installed or enabled."),Eo("native_hooks",o,t,e.plugin.targetPath??e.plugin.package_kind,"Native lifecycle hook registration is missing."),Eo("mcp",n,t,e.mcpRegistration.targetPath,"MCP registration is missing or invalid."),Eo("native_scheduler",a,t,tv(e.schedules),nv(e.host,e.schedules)),Eo("official_inventory",s,t,rv(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:av({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 Eo(e,t,r,o,n){return{requirement:e,satisfied:t,evidence:t?[{source_kind:"doctor",reference:o,observed_at:r,confidence:Qb(o)}]:[],missing_reason:t?null:n}}function Qb(e){return e.startsWith("not-applicable:")||e==="missing"?"low":"medium"}function Zb(e,t){return e.enabled&&e.native_schedule_supported&&e.native_id!==null&&!ev(e.updated_at,t)}function ev(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 tv(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 rv(e){return e.find(t=>t.ready)?.source??"missing"}function ov(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 nv(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 av(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}):hv(e.host,e.surface),n=await So({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 Ao({home:e.home,host:e.host,limit:200,readOnly:!0}):[]).filter(x=>cv(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 Wr(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 pv({host:e.host,managedBlock:o,handshake:s}),U=await mv(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=uv({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 cv(e,t,r){return e!=="claude"?!0:dv(r.desired)===t}function dv(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 uv(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 pv(e){if(!e.managedBlock.configured||e.managedBlock.targetPath.startsWith("not-applicable:"))return[];let t=10080*60*1e3,r=await fv(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 mv(e){let t=gv(e).map(r=>jp.resolve(process.cwd(),r));for(let r of t){if(!sv(r))continue;let o=await iv(r,"utf8"),n=so(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 gv(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 fv(e){try{let t=await lv(e);return Math.max(Date.now()-t.mtimeMs,0)}catch{return null}}function hv(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 go(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:yv(a),semantic_index:i,hosts:a,issues:p}}function yv(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 _v}from"node:fs";import{mkdir as bv,readdir as vv,readFile as kv,writeFile as wv}from"node:fs/promises";import Po 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 Rv(r.home,r.database,o,n),s=Av(o,a,n),i=xv({applied:t,project:o,proposals:s,dailyNotes:a.dailyNotes,candidates:a.candidates,activeMemories:a.activeMemories,auditEvents:a.auditEvents}),l=null;return t&&(l=await Ev(r.home,i),await Pv(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:Po.join(r.home,c),modified:!1}))}}async function Rv(e,t,r,o){let n=await Sv(e,o);if(!_v(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 Sv(e,t){let r=Po.join(e,"memory","daily");if(!await S(r))return[];let n=(await vv(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=Po.join(r,s),l=N(await kv(i,"utf8")).value.trim();l.length>0&&a.push({id:`daily:${s}`,path:i,text:l})}return a}function Av(e,t,r){let o=[];for(let n of t.candidates){let a=Cp(n.content,t.activeMemories),s=Iv(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=jv(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 Ev(e,t){let r=Po.join(e,"proposals");await bv(r,{recursive:!0,mode:448});let o=Po.join(r,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-reflection.md`);return await wv(o,t,{encoding:"utf8",mode:384,flag:"wx"}),o}async function Pv(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(`
924
- `),confidence:.5,authority:"reflection_proposal",source:{kind:"reflection",proposal_id:r.id,evidence:r.evidence}});r.persisted_memory_id=o.id}}function xv(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
- `)}function jv(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
- ${o.content}`);(!r||n>r.score)&&(r={memory:o,score:n})}return r}function Iv(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 no(e,{minLength:3,normalizeDiacritics:!0,removeStopwords:!0})}import{lstat as Tv,readdir as Cv,readFile as Ov}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 Nv(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=$v(l,n),p=Fv(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:Bv(y)}),y}async function Dp(e,t){let r;try{r=await Tv(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 Cv(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 Nv(e,t){let r;try{r=await Ov(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"?Mv(e,r,t):o===".jsonl"?Lv(e,r,t):Dv(e,r)}function Mv(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:Hv(o)??[o]).flatMap((a,s)=>Hp(a,e,s))}function Lv(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 Dv(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 Hv(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:Uv(e,["confidence","score"]),sourcePath:t,raw:Ri(e)}]:[]}function $v(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:Vv(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 Fv(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 Uv(e,t){for(let r of t){let o=e[r];if(typeof o=="number"&&Number.isFinite(o))return o}return null}function Bv(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 Vv(e){return Re(e)}import{lstat as Wv,readFile as Jv}from"node:fs/promises";import xo 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 Gv(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=xo.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 Kv(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 zv(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=Zv(e.host,c,a),g=await ek(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:tk(k)}),k}async function Kv(e,t,r){let o;try{o=await Wv(t)}catch{return r.push({code:"NATIVE_IMPORT_SOURCE_UNREADABLE",host:e,source_path:t,message:"Source path is not readable."}),[]}return o.isFile()?nk(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 zv(e,t,r){let o;try{o=await Jv(t,"utf8")}catch{return r.push({code:"NATIVE_IMPORT_FILE_UNREADABLE",host:e,source_path:t,message:"File could not be read."}),[]}let n=xo.extname(t).toLowerCase();return n===".json"?Xv(e,t,o,r):n===".jsonl"?Yv(e,t,o,r):Qv(t,o)}function Xv(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:rk(n)??[n]).flatMap((s,i)=>Fp(s,t,i))}function Yv(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 Qv(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"])??`${xo.basename(t)}:${r+1}`,content:o,project:Ei(e,["project","project_id","scope_project","workspace","repo"]),confidence:ok(e,["confidence","score"]),sourcePath:t,raw:Pi(e)}]:[]}function Zv(e,t,r){return t.map((o,n)=>{let a=N(o.content),s=o.id??`${xo.basename(o.sourcePath)}:${n+1}`,i=Up(a.value);return{source_system:e,source_path:o.sourcePath,source_id:s,source_hash:Gv(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 ek(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 tk(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 rk(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 ok(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 nk(e){return zt.includes(xo.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 ak,mkdir as sk,readFile as ik,rm as lk,writeFile as ck}from"node:fs/promises";import{randomUUID as dk}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 ik(t,"utf8"));return uk(r)?r:null}catch{return null}}async function jo(e,t){let r=Yn(e);return await sk(Bp.dirname(r),{recursive:!0,mode:448}),await ck(r,`${JSON.stringify(t,null,2)}
928
- `,{encoding:"utf8",mode:384}),await ak(r,384),t}async function Ii(e){await lk(Yn(e),{force:!0})}async function Qn(e){let t=await xe(e);if(t?.instance_id)return t.instance_id;let r=dk();return await jo(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 uk(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.0",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 mk="https://api.dodopayments.com",gk=1440*60*1e3,fk=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 jo(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:wk(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"&&hk(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 jo(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"&&yk(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 hk(e,t){return e?t.getTime()-new Date(e).getTime()<gk:!1}function yk(e,t,r=fk){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,_k(e.endpointBaseUrl)).toString(),{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify(r)}),a=await bk(n);return n.ok?t==="/licenses/validate"&&a.valid!==!0?{ok:!1,reason:Wp(a)}:{ok:!0,license_key_instance_id:vk(a),purchased_at:kk(a)}:{ok:!1,reason:Wp(a)}}catch{return{ok:!1,reason:"NETWORK"}}}function _k(e=process.env.NATIVESOUL_DODO_LICENSE_API_BASE_URL??mk){return e.endsWith("/")?e:`${e}/`}async function bk(e){try{let t=await e.json();return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}}function vk(e){let r=[e.license_key_instance_id,e.licenseKeyInstanceId,e.id,Io(e.data)?e.data.license_key_instance_id:null,Io(e.data)?e.data.id:null].find(o=>typeof o=="string"&&o.length>0);return typeof r=="string"?r:null}function kk(e){let t=Io(e.data)?e.data:{},r=Io(e.license_key)?e.license_key:Io(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 wk(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 Io(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?Rk(r):null,reason:o}})}function Rk(e){return e.length<=8?"[REDACTED_LICENSE_KEY]":`${e.slice(0,4)}\u2026${e.slice(-4)}`}var To="https://docs.nativesoul.dev/account/licensing";async function vr(e){let t=Sk(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??To;return{ok:!1,reason:a,activate_url:s,message:Co({reason:a,activate_url:s}),license:n.license}}catch{let o=t.activateUrl??To;return{ok:!1,reason:"UNLICENSED",activate_url:o,message:Co({reason:"UNLICENSED",activate_url:o}),license:ge}}}function Co(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 Sk(e){return typeof e=="string"?{home:e}:e??{}}import{readdir as Ak,readFile as Jp,stat as Ek}from"node:fs/promises";import Mi from"node:path";var Pk=["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=xk(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=Oo(l);for(let d of Pk)c.includes(Oo(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(Oo(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 jk(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=Ik(p,i,d.text);s.push(g),g.result==="fail"&&a.push(Tk(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 xk(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=Ck(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 Ek(e)).isDirectory())return[]}catch{return[]}let t=await Ak(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 jk(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 Ik(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&&!Oo(r).includes(Oo(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 Tk(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 Ck(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 Oo(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?Ok(t.updates_until,e.now??new Date):"unknown",n=r?Nk(e.latestKnownVersion,t.version_at_activation??null):"unknown",a=e.upgradeUrl??To,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 Ok(e,t){if(!e)return"unknown";let r=Date.parse(e);return Number.isNaN(r)?"unknown":t.getTime()<=r?"active":"lapsed"}function Nk(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 Mk=["installed","enabled","active","authenticated","healthy","allowed","ready"];async function $i(e){let t=await Tt(e);if(!t)return null;let r=Lk(t);return{schema_version:1,uid:t.uid,capability:t,readiness:r,readiness_label:_t(t),readiness_signals:Mk.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 Lk(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 No(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 Mo(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:Hk(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 Lo(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 Do(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:Fk(t.metadata,H(e.metadata)),completedAt:Ui(o)?r:void 0,updatedAt:r,details:{priority:e.priority??null,assigned_host:e.assignedHost??null,fields:Dk(e),redacted:e.description!==void 0&&e.description!==null&&n!==e.description}}}})}async function Ho(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,...$k(o)}})}function Dk(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 Hk(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),200)}function $k(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{value:e}}function Fk(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 Rw,readFile as Sw}from"node:fs/promises";import mm from"node:path";import{existsSync as Uk}from"node:fs";var Bk=50;function $o(e={}){let t=Yk(e.limit),r=Gk(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(!Uk(a.database))return Xk(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=Jk(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:Wk(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=Mr(s.cost_json);Vk(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:Qk(a),coverage:e.length===0?0:t/e.length}}function Vk(e){return"source"in e&&e.source==="host-reported"}function Wk(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 Jk(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 Gk(e){return{since:e.since?Kk(e.since):null,until:e.until?nm(e.until,"until"):null}}function Kk(e){let t=zk(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 zk(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 Xk(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 Yk(e){return e===void 0||!Number.isFinite(e)?Bk:Math.max(1,Math.min(Math.trunc(e),500))}function Qk(e){return Math.round(e*1e8)/1e8}import{mkdir as rw,readdir as ow,readFile as nw,writeFile as aw}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:Zk(o,[a,s].filter(Boolean).join(" ")),target:a,project:Y(t.project)??Y(t.project_id)??Y(r.project)??Y(r.project_id)}}function Zk(e,t){let r=`${e} ${t??""}`.toLowerCase();return/\b(bash|shell|sh|zsh|exec_command)\b/u.test(e.toLowerCase())?ew(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 ew(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 sw=new Set(["SOUL.MD","POLICY.MD"]),iw=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 ow(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 nw(i,"utf8");a.push(lw(l,i))}return sm.set(t.home,{expiresAt:Date.now()+iw,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&&sw.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=cw(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 rw(Qt.dirname(s),{recursive:!0,mode:448}),me(s,{root:t.home}),await aw(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 lw(e,t){return{id:dw(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 cw(e){let t=im(e);return t==="SOUL.MD"?"SOUL.md":t==="POLICY.MD"?"POLICY.md":null}function dw(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 uw=/(?: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=ww(e.limit);if(!await S(t.database))return pw(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=>kw(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:mw(d),bootstrap:gw(d),recall:fw(d),capability_readiness:hw(p),heartbeat:yw(l,c),no_op_suppression:_w(d),rollback:bw(d),secret_leakage_checks:cm(d)},m7_gate:vw(d,p,g,c)})}finally{n.close()}}function pw(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 mw(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 gw(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 fw(e){return{recalled:fe(e,["memory_recalled"]),proposed:fe(e,["memory_proposed"]),promoted:fe(e,["memory_promoted"])}}function hw(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 yw(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 _w(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 bw(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:uw.test(t)?1:0,redaction_markers:(t.match(/\[REDACTED_/gu)??[]).length}}function vw(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 kw(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 ww(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e??200),1),500):200}function pm(e){return sr(H(e))}var Aw=["candidate","active","superseded","rejected","forgotten","expired"],qi=["inbox","assigned","in_progress","review","blocked","done","failed"];async function Fo(e={}){let t=f(e.home),r=Ww(e.limit),o=Uw(e);if(!await S(t.database))return fm(await Ew(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=$w(await vt(t.home),e),k=await Lw(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||Bw(D,{key:"host",value:e.host})).slice(0,r),x=Be.filter(D=>D.type==="policy_blocked"),Or=Be.filter(D=>Vw(D)).length,rn=Pw(a,e,o,r),Nr=jw(a,e,o,r,k,Or),V=Cw(a,e,r),_g={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:Fw(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:Or}},work:rn,approvals:Nr,cost:V,feedback:await Rr({home:t.home,project:e.project,host:e.host,limit:r})};return fm(_g)}finally{a.close()}}async function Ew(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:Nw(),cost:Mw(),feedback:await Rr({home:e,project:r.project,host:r.host,limit:o})}}function Pw(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=>xw(e,l));i.length>0&&a.push({status:s,count:i.length,items:i})}return{columns:a}}function xw(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:Ow(t.metadata,"run_id")??r?.id??null,priority:t.priority,updated_at:t.updated_at}}function jw(e,t,r,o,n,a){let s=e.listApprovals("pending").approvals.filter(l=>Tw(l,t)).filter(l=>Ze([l],r,c=>c.created_at).length>0).slice(0,o).map(Iw);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 Iw(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 Tw(e,t){return(!t.project||e.project===t.project)&&(!t.host||e.host===t.host)}function Cw(e,t,r){let o=$o({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 Ow(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 Nw(){return{pending:[],counts:{pending:0}}}function Mw(){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 Lw(e){let t=mm.join(e,"proposals"),r;try{r=await Rw(t)}catch{return[]}let o=[];for(let n of r.filter(a=>a.endsWith(".md")).sort()){let a=await Sw(mm.join(t,n),"utf8");o.push({filename:n,target:Dw(a,"Target"),summary:Hw(a,"Summary")})}return o}function Dw(e,t){return e.match(new RegExp(`^${t}:\\s*(.+)$`,"mu"))?.[1]?.trim()??null}function Hw(e,t){return e.match(new RegExp(`^## ${t}\\s*$\\n+([\\s\\S]*?)(?:\\n+## |$)`,"mu"))?.[1]?.trim()??null}function $w(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 Fw(e){let t=ym();for(let r of e)t[r.status]+=1;return t}function ym(){return Object.fromEntries(Aw.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 Uw(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 Bw(e,t){return ce(e.details,t.key,t.value)}function Vw(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 Ww(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 Jw,writeFile as qw}from"node:fs/promises";import Gi from"node:path";async function zi(e={}){let t=await Fo(e),r=Gi.resolve(e.output??Gi.join(f(e.home).home,"generated","dashboard","index.html"));return await Jw(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=rR(e.capabilities),r=e.audit.policy_blocks.length,o=e.policy.counts.approvals_required,n=Gw(e),a=n?n.work.columns.reduce((s,i)=>s+i.items.length,0):0;return`<!doctype html>
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
+ `),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
+ `)}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
+ ${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 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>${aR()}</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?Kw(n):""}
962
- ${n?zw(n):""}
963
- ${n?Xw(n):""}
961
+ ${n?eS(n):""}
962
+ ${n?tS(n):""}
963
+ ${n?rS(n):""}
964
964
 
965
- ${je("Memory Lifecycle",[eR(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 ${oR(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",[tR(),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 ${nR(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 Gw(e){return e.schema_version>=2&&"work"in e&&"approvals"in e&&"cost"in e?e:null}function Kw(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(Qw(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 ${Zw(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 zw(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 Xw(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(Yw(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 Yw(e){return`${e.reported_runs}/${e.runs} reported (${Math.round(e.coverage*100)}%)`}function Qw(e){return e.replaceAll("_"," ").replace(/\b\w/g,t=>t.toUpperCase())}function Zw(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 eR(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 tR(){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 rR(e){return{total:e.length,ready:e.filter(t=>t.ready).length}}function oR(e){return e==="active"?"green":e==="candidate"?"amber":e==="rejected"||e==="forgotten"?"red":"neutral"}function nR(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 aR(){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;
@@ -1068,8 +1068,8 @@ body:before{content:"";position:fixed;inset:0;pointer-events:none;background-ima
1068
1068
  h1{margin:0;color:var(--text-100);font:700 44px/1.05 var(--font-display);letter-spacing:0}.lede{max-width:680px;margin:12px 0 0;color:var(--text-400)}
1069
1069
  .terminal{background:#0b0d15;border:1px solid var(--ink-700);border-radius:var(--radius-md);overflow:hidden;box-shadow:var(--shadow-md);font-family:var(--font-mono)}.traffic{display:flex;align-items:center;gap:6px;padding:10px 14px;border-bottom:1px solid rgba(255,255,255,.06)}.traffic i{width:10px;height:10px;border-radius:50%;background:#ff5f57}.traffic i:nth-child(2){background:#febc2e}.traffic i:nth-child(3){background:#28c840}.traffic span{margin-left:6px;color:var(--text-500);font-size:12px}.terminal code{display:block;padding:14px 16px;color:var(--text-100);font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
1070
1070
  .summary-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:14px;margin-bottom:14px}.metric,.panel{background:var(--ink-850);border:1px solid var(--ink-700);border-radius:var(--radius-lg);box-shadow:var(--shadow-md)}.metric{padding:18px}.metric.red{border-color:rgba(255,68,68,.40);box-shadow:var(--glow-sm)}.metric span,.metric small{display:block;color:var(--text-400);font:600 11px/1.3 var(--font-mono);letter-spacing:.04em;text-transform:uppercase}.metric strong{display:block;margin:10px 0;color:var(--text-100);font:700 32px/1 var(--font-display)}.metric.green strong{color:var(--green-400)}.metric.cyan strong{color:var(--cyan-400)}.metric.amber strong{color:var(--amber-400)}.metric.red strong{color:var(--red-400)}
1071
- .layout{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.panel{padding:18px;min-width:0}.panel-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
1072
- .records{list-style:none;margin:0;padding:0;display:grid;gap:8px}.records li{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px;border:1px solid rgba(255,255,255,.06);border-radius:10px;background:rgba(0,0,0,.18);min-width:0}.records strong{display:block;color:var(--text-100);font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.records small{display:block;color:var(--text-500);font:500 11px/1.4 var(--font-mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:460px}
1071
+ .layout{display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:14px;align-items:start}.panel{padding:18px;min-width:0;max-height:440px;display:flex;flex-direction:column;overflow:hidden}.panel-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
1072
+ .records{list-style:none;margin:0;padding:0 4px 0 0;display:grid;gap:8px;overflow-y:auto;min-height:0;flex:1 1 auto}.records::-webkit-scrollbar{width:8px}.records::-webkit-scrollbar-thumb{background:var(--ink-700);border-radius:8px}.records li{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px;border:1px solid rgba(255,255,255,.06);border-radius:10px;background:rgba(0,0,0,.18);min-width:0}.records li>div{min-width:0;flex:1 1 auto}.records strong{display:block;color:var(--text-100);font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.records small{display:block;color:var(--text-500);font:500 11px/1.4 var(--font-mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
1073
1073
  .chip{flex:0 0 auto;border:1px solid var(--ink-600);border-radius:999px;padding:5px 8px;background:rgba(0,0,0,.25);color:var(--text-400);font:700 10px/1 var(--font-mono);letter-spacing:.04em;text-transform:uppercase}.chip.green{color:var(--green-400);border-color:rgba(62,207,142,.35)}.chip.cyan{color:var(--cyan-400);border-color:rgba(86,199,214,.35)}.chip.amber{color:var(--amber-400);border-color:rgba(245,165,36,.35)}.chip.red{color:var(--red-400);border-color:rgba(255,68,68,.35)}
1074
1074
  .legend{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:12px}.legend span{display:inline-flex;align-items:center;gap:6px;color:var(--text-400);font:700 10px/1 var(--font-mono);text-transform:uppercase}.legend i{width:8px;height:8px;border-radius:50%;background:var(--text-500)}.legend .green{background:var(--green-400)}.legend .cyan{background:var(--cyan-400)}.legend .amber{background:var(--amber-400)}.legend .red{background:var(--red-400)}
1075
1075
  .lifecycle{display:flex;height:10px;overflow:hidden;border-radius:999px;background:#0b0d15;border:1px solid rgba(255,255,255,.06);margin-bottom:12px}.lifecycle span{min-width:0}.lifecycle .green{background:var(--green-400)}.lifecycle .amber{background:var(--amber-400)}.lifecycle .red{background:var(--red-500)}.lifecycle .neutral{background:var(--ink-600)}
@@ -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 sR,readFile as iR,realpath as lR}from"node:fs/promises";import Bo from"node:path";var cR=4,dR=500,uR=12e3,Uo={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:vR},{filename:"pyproject.toml",language:"Python",parser:kR},{filename:"requirements.txt",language:"Python",parser:wR},{filename:"go.mod",language:"Go",packageManager:"go modules",parser:PR},{filename:"Cargo.toml",language:"Rust",packageManager:"cargo",parser:RR},{filename:"pom.xml",language:"Java",packageManager:"maven",parser:SR},{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:AR},{filename:"Gemfile",language:"Ruby",packageManager:"bundler",parser:ER}],pR=["README.md","README.markdown","README.txt","README"],mR={readdir:sR,readFile:iR,realpath:lR};async function Qi(e={}){let t=e.fileSystem??mR,r=await gR(e.root??process.cwd(),t),o=e.maxDepth??cR,n=e.maxEntries??dR,a=e.readmeMaxBytes??uR,s=et(),i=new Set,l=[],c={truncated:!1,max_depth:o,max_entries:n,entries_seen:0,reasons:[]},d=null,p=await Sm({fs:t,root:r,current:r,relativeSegments:[],depth:0,maxDepth:o,maxEntries:n,readmeMaxBytes:a,facts:s,manifests:i,truncation:c,readmeRef:{get value(){return d},set value(y){d=y}}}),g=await yR(r,t);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:OR(g),structure:p,readme:d??{file:null,summary:"",bytes_read:0,truncated:!1,fenced_code_blocks_stripped:!1},truncation:c,warnings:l}}function Vo(e){let t=e.map(r=>r.toLowerCase());for(let r of t)if(Uo.exactSegments.includes(r)||Uo.segmentPrefixes.some(o=>r.startsWith(o))||Uo.segmentSuffixes.some(o=>r.endsWith(o))||Uo.segmentContains.some(o=>r.includes(o)))return!0;return Uo.deniedNestedSegments.some(r=>LR(t,r))}async function gR(e,t){let r=Bo.resolve(e);try{return await t.realpath(r)}catch{return r}}async function Sm(e){let r={name:e.relativeSegments.at(-1)??(Bo.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(Vo(a))continue;if(e.truncation.entries_seen>=e.maxEntries){Yi(e.truncation,`max_entries:${e.maxEntries}`);break}e.truncation.entries_seen+=1;let s=Bo.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(jR(n.name)){r.children?.push({name:n.name,type:"metadata_file"}),await fR(s,i,e);continue}if(IR(n.name)){r.children?.push({name:n.name,type:"metadata_file"}),xR(n.name,i,e.facts);continue}!e.readmeRef.value&&TR(n.name)&&(r.children?.push({name:n.name,type:"metadata_file"}),e.readmeRef.value=await hR(s,i,e.fs,e.readmeMaxBytes))}}return r.children?.length===0&&delete r.children,r}async function fR(e,t,r){let o=Bo.basename(t),n=Rm.find(a=>a.filename===o);if(n&&!Vo(t.split("/"))){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"});CR(r.facts,n.parser(a,t))}catch{}}}async function hR(e,t,r,o){if(Vo(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=NR(s);return{file:t,summary:MR(i,2e3),bytes_read:Math.min(a,o),truncated:a>o,fenced_code_blocks_stripped:i!==s}}async function yR(e,t){if(Vo([".git","config"]))return[];try{let o=await t.readFile(Bo.join(e,".git","config"),{encoding:"utf8"});return _R(o)}catch{return[]}}function _R(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=bR(a);s&&t.push(s)}return t}function bR(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 vR(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 kR(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),Am(o,t,r),Em(o,r),r}function wR(e,t){let r=et();return Q(r.packageManagers,"pip",t),Am(e.toLowerCase(),t,r),Em(e.toLowerCase(),r),r}function RR(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 SR(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 AR(e,t){let r=et();return e.toLowerCase().includes("laravel/framework")&&Q(r.frameworks,"Laravel",t),r}function ER(e,t){let r=et();return/gem\s+["']rails["']/u.test(e)&&Q(r.frameworks,"Rails",t),r}function PR(){return{}}function Am(e,t,r){for(let[o,n]of[["django","Django"],["fastapi","FastAPI"],["flask","Flask"]])e.includes(o)&&Q(r.frameworks,n,t)}function Em(e,t){e.includes("pytest")&&t.testRunners.add("pytest"),e.includes("ruff")&&t.linters.add("ruff")}function xR(e,t,r){let o=wm.find(n=>n.filename===e);o&&Q(r.packageManagers,o.packageManager,t)}function jR(e){return Rm.some(t=>t.filename===e)}function IR(e){return wm.some(t=>t.filename===e)}function TR(e){return pR.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 CR(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 OR(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 NR(e){return e.replace(/```[\s\S]*?```/gu,"").replace(/~~~[\s\S]*?~~~/gu,"")}function MR(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 LR(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 $R,readFile as FR,writeFile as UR}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 Ar(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 DR(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 DR(e,t){return t.decision!=="allowed"||!t.matched_standing_order||!HR(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 HR(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=BR(e.scan,o.id),a=VR(e.scan),s=WR(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 JR({home:t.home,proposal:e.proposal,host:r,project:n})),o.push(await Pm({home:t.home,proposal:e.proposal,host:r,project:n,sink:"user_md"})),o.push(await Pm({home:t.home,proposal:e.proposal,host:r,project:n,sink:"tools_md"})),o.push(await qR({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 BR(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 VR(e){return["## Engineering Preferences","","Detected local project context from `nativesoul scan`.","",...xm([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 WR(e){return["## Local Tool Conventions","","Detected by `nativesoul scan`; verify before treating as policy.","",...xm([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 JR(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 Er(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 Er(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 Pm(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 Er(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=GR(e.home,t.target);await $R(er.dirname(o),{recursive:!0,mode:448});let n=await ol(e.home,t.target),a=ur(n,t.managed_content);return await UR(o,a,{encoding:"utf8",mode:384}),await Er(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 qR(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 Er(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 lo({home:e.home,resolution:e.proposal.sinks.project_registry.resolution});return await Er(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 Er(e,t,r,o,n){await h({home:e,type:t,result:r,details:{project:o,...n}})}function GR(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 FR(er.join(e,t),"utf8")}catch{return""}}function Ue(e,t){return t.length>0?`${e}: ${t.join(", ")}`:null}function xm(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 jm}from"node:fs/promises";import Im from"node:path";var aa=1500;async function Wo(e){let t=await v(e.home),r=await XR(t.home),o=await YR(t.home),n=new Date,a=KR(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(zR(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 KR(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e),1),1440*60):aa}function zR(e,t){return t?{...e&&typeof e=="object"&&!Array.isArray(e)?e:{},work_item_id:t}:e}async function XR(e){let t;try{t=await jm(Im.join(e,"config.yaml"),"utf8")}catch{return{ttlSeconds:aa,skipWhenBusy:!0}}return{ttlSeconds:QR(t),skipWhenBusy:ZR(t,"skip_when_busy",!0)}}async function YR(e){let t;try{t=await jm(Im.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 QR(e){let t=il(e,"ttl_seconds"),r=il(e,"lease_ttl"),o=eS(e,"heartbeat_ttl_seconds"),n=tS(t??r??o);return Number.isFinite(n)?n:aa}function ZR(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 eS(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`^\\s*${r}:\\s*([^#\\n]+)`,"mu"))?.[1]?.trim().replace(/^["']|["']$/g,"")??null}function tS(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=>Vr(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 qr({home:t.home,host:s,apply:e.apply,targetPath:d.managedBlock}):rS(s,l,!e.apply),g=await Ro({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 rS(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 oS from"node:path";import{rm as Tm}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 Cm({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 Cm({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=oS.join(t.home,"backups"),i={path:s,applied:e.apply,preserved:!e.apply};return i.applied&&await Tm(s,{recursive:!0,force:!0}),a.applied&&await Tm(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 Cm(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}):nS(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 nS(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 Nm={"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=Nm[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 Om(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 Om(r,t,n.reasons,"blocked"),{status:"deny",decision:n.decision,reason:`${r.action} ${n.decision}: ${n.reasons.join(", ")}`,evaluation:n})}async function Om(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 Um,readFile as ia,rm as AS,writeFile as Bm}from"node:fs/promises";import ve from"node:path";import{existsSync as vS}from"node:fs";import{readdir as kS,readFile as ml}from"node:fs/promises";import wt from"node:path";import{fileURLToPath as wS}from"node:url";import Mm from"node:path";var aS=new Set(["id","version","title","description","intended_use","approvals","standing_orders","policy_proposals","managed_blocks","rollback","metadata"]),sS=new Set(["id","action","authority","allowed","approval_required","scope_projects","scope_hosts","reason"]),iS=new Set(["target","summary","rationale","rollback_note"]),lS=new Set(["target","marker","content","rollback_key"]),cS=new Set(["strategy","restores","notes"]),dS=new Set(["maturity","owner","source"]),uS=new Set(["SOUL.MD","POLICY.MD"]),Lm=["AGENTS.md","CLAUDE.md","GEMINI.md","Agents.md",".claude/CLAUDE.md"],pS=new Set(Lm);function xr(e){let t=[];return rt(e)?(jr(e,aS,"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),Pr(e.approvals,"pack.approvals",t,!1),mS(e.standing_orders,t),gS(e.policy_proposals,t),fS(e.managed_blocks,t),hS(e.rollback,t),yS(e.metadata,t),bS(e,t),t):["Policy pack must be an object"]}function rt(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Dm(e){return typeof e=="string"?e:null}function mS(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}jr(o,sS,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),Pr(o.allowed,`${n}.allowed`,t,!0),Pr(o.approval_required,`${n}.approval_required`,t,!0),Pr(o.scope_projects,`${n}.scope_projects`,t,!0),Pr(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 gS(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}jr(o,iS,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 fS(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}jr(o,lS,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"&&_S(o.target,n,t)}}function hS(e,t){if(!rt(e)){t.push("pack.rollback must be an object");return}jr(e,cS,"pack.rollback",t),sa(e,"strategy","pack.rollback",["proposal-only","managed-block","snapshot-required"],t),Pr(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 yS(e,t){if(e!==void 0){if(!rt(e)){t.push("pack.metadata must be an object");return}jr(e,dS,"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 _S(e,t,r){let o=e.replaceAll("\\","/"),n=Mm.basename(o).toUpperCase();(Mm.isAbsolute(e)||o.includes("../")||o.startsWith("../"))&&r.push(`${t}.target must be a relative managed host file path`),uS.has(n)&&r.push(`${t}.target must not target protected SOUL.md or POLICY.md`),pS.has(o)||r.push(`${t}.target is outside supported managed-block scope`)}function bS(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 jr(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 Pr(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 Hm()).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 Hm()).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 RS(e.id),o=xr(t),n=rt(t)?Dm(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 Hm(){let e=await $m(),t=[];for(let r of e){let o=JSON.parse(await ml(r,"utf8")),n=xr(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 RS(e){if(!e)throw new Error("policy packs validate requires <id> or --file <path>");let t=await $m();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 $m(){let e=SS(),t=(await kS(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 SS(){let e=wt.dirname(wS(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=>vS(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 ES(e),o=ve.resolve(e.targetRoot??process.cwd()),n=new Date().toISOString(),a=await PS({home:t.home,pack:r.pack,targetRoot:o,createdAt:n}),s=a.map(Fm),i=a.filter(p=>p.changed),l=BS(r.pack),c=e.apply&&i.length>0?await LS({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 CS(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=>Fm(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:VS(d,e.approvalEvidence)}),d}async function vl(e){let t=await v(e.home),r=OS(await ia(e.snapshotPath,"utf8"),e.snapshotPath),o=r.files.map(a=>TS(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 ES(e){if(e.file){let r=ve.resolve(e.file),o=JSON.parse(await ia(r,"utf8")),n=xr(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 PS(e){let t=[];for(let r of e.pack.standing_orders)t.push(await xS(e.home,e.pack,r));for(let r of e.pack.policy_proposals)t.push(await jS(e.home,e.pack,r,e.createdAt));for(let r of e.pack.managed_blocks)t.push(await IS(e.targetRoot,e.pack,r));return t}async function xS(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,DS(r,t))}let o=ve.join(e,"proposals",`standing-order-${t.id}-${r.id}.md`);return await hl("standing_order",o,HS(r,t))}async function jS(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,$S(r,t,o))}async function IS(e,t,r){let o=ve.resolve(e,r.target);if(!JS(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=FS(a,t,r);return Vm("managed_block",o,n,a,s)}async function hl(e,t,r){let o=_l(t),n=o?await ia(t,"utf8"):null;return Vm(e,t,o,n,r)}function Vm(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:WS(o,n),beforeExists:r,beforeContent:o,afterContent:n}}function Fm(e){return{kind:e.kind,targetPath:e.targetPath,action:e.action,changed:e.changed,beforeHash:e.beforeHash,afterHash:e.afterHash,diff:e.diff}}function TS(e){return{kind:e.kind,targetPath:e.targetPath,action:e.beforeExists?"replace":"remove",changed:!0,beforeHash:e.afterHash,afterHash:e.beforeHash,diff:Jm(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 Um(ve.dirname(e.targetPath),{recursive:!0,mode:448}),me(e.targetPath,{allowSymlinkTarget:!0}),await Bm(e.targetPath,o,{encoding:"utf8",mode:384})):_l(e.targetPath)&&await AS(e.targetPath)}async function CS(e){for(let t of[...e].reverse())await kl(t,"before")}function OS(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=NS(r);if(o.length>0)throw new Error(`Invalid policy pack snapshot ${t}: ${o.join("; ")}`);return r}function NS(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(...MS(o,`files[${n}]`))}):t.push("files must be an array"),t}function MS(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 LS(e){let t=ve.join(e.home,"backups","policy-packs");await Um(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 Bm(n,JSON.stringify(r,null,2),{encoding:"utf8",mode:384,flag:"wx"}),n}function DS(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 HS(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 $S(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 FS(e,t,r){let o=US(t,r);if(e===null||e.length===0)return o;let n=Wm(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 US(e,t){let r=Wm(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 Wm(e,t){return{start:`<!-- nativesoul:policy-pack:${e.id}:${t.marker}:start v1 -->`,end:`<!-- nativesoul:policy-pack:${e.id}:${t.marker}:end -->`}}function BS(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 VS(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 WS(e,t){return e===t?"No changes.":Jm(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 Jm(e,t,r=0,o=0){return[`before: ${e??"missing"}`,`after: ${t??"missing"}`,`lines_before: ${r}`,`lines_after: ${o}`].join(`
1099
- `)}function JS(e,t){let r=ve.relative(e,t);return r===""||!r.startsWith("..")&&!ve.isAbsolute(r)}import qS from"node:path";async function Ir(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?qS.resolve(e.targetRoot):null,host:r,profile:o,onboardingComplete:n,activationComplete:a,hosts:s.hosts})}async function Go(e={}){let t=await Ir(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 GS=["codex","claude","antigravity","gemini","grok"];async function la(e={}){let t=await v(e.home),r=await it(t.home),o=e.leaderHost??ZS(r?.scheduler_host),n=o??e.host??"all",a=KS({cadence:e.cadence??r?.heartbeat_cadence,projectScope:e.projectScope??L(process.cwd(),t.home),behavior:e.behavior,mode:e.mode}),s=await zS({home:t.home,host:n,surface:e.surface,mode:a.mode,heartbeat:Gm(a),targetRoot:e.targetRoot}),i=XS(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:Gm(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 KS(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 zS(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:YS(n),native_schedule_supported:n.schedule.native_schedule_supported,native_id:n.schedule.native_id,reason:QS(n),dry_run:n})}return t}function XS(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=GS.indexOf(e.host),r=e.surface==="claude-desktop"?-.25:e.surface==="claude-code"?0:.25;return(t===-1?99:t)+r}function YS(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 QS(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 Gm(e){return{cadence:e.cadence,skipWhenBusy:e.skip_when_busy,projectScope:e.project_scope,behavior:e.behavior}}function ZS(e){return e==="codex"||e==="claude"||e==="grok"||e==="antigravity"||e==="gemini"?e:null}import{randomUUID as eA}from"node:crypto";import tA from"node:path";var rA="NativeSoul activation verification marker";async function Ko(e={}){let t=sA(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 oA({home:o.home,inputHost:c,testCwd:t.projectCwd}));let a=await aA({home:e.home,testProject:`${r.id}-${eA()}`,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=lA(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 oA(e){let t=[],r=await nA({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=iA(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 nA(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 aA(e){let t=[],r=null,o=!1,n=!1;try{let a=`verify-${e.testProject}`,s=`${rA} ${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 sA(e){return{projectCwd:tA.resolve(e.projectCwd??process.cwd())}}function iA(e){return e==="native"?"native":e==="official-fallback"?"official_fallback":"unsupported"}function lA(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 Km(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(!cA(t.database))return{home:t.home,initialized:!1,database:t.database,migrations:0,memories:0,events:0,capabilities:0,ledger:dA()};let r=_(t.database,{readOnly:!0});try{return{home:t.home,initialized:!0,database:t.database,...r.counts()}}finally{r.close()}}function dA(){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(uA(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 uA(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 zm(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 Tr=new Set(["codex","claude","grok","antigravity","gemini"]);function Yo(e){let t=u(e,"host")??"all";if(t==="all"||Tr.has(t))return t;throw new Error(`Unsupported adapter host: ${t}`)}function Xm(e){let t=u(e,"host");if(t&&Tr.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"||Tr.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&&Tr.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(Tr.has(t))return t;throw new Error("This command accepts --host codex|claude|grok|antigravity|gemini")}}function Ym(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 Qm(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 Zm(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 eg(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 tg(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 rg(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 og(e){let t=u(e,"host")??"generic";if(t==="generic"||Tr.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 ng(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 Ir(n);m(a,r,`Activation status: ${a.overall_status}`);return}if(o==="plan"){let a=await Go({...n,profile:pA(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:mA(e),mode:pa(e.flags),cadence:u(e.flags,"cadence"),projectScope:u(e.flags,"project")??u(e.flags,"project-scope"),behavior:gA(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 pA(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 mA(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 gA(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 Vr(o);m(n,t,`Scanned ${n.length} adapter(s)`);return}if(r==="doctor"){let n=await Wr(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=Xm(e.flags),a=await Jr(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 qr({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:Qm(e.flags)});m(n,r,hA(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==="."?fA(t):oa({home:t,id:n}).approval;m(a,r,a?yA(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 Ar({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 Ar({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 fA(e){return na({home:e,status:"pending"}).approvals[0]??null}function hA(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
- `)}function yA(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:Ym(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=Zm(e.flags),s=await Ga({...n,format:a});if(a==="jsonl"){process.stdout.write(s.events.map(i=>JSON.stringify(i)).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
+ `)}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: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 zr({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){ag("capabilities explain requires <uid> or --uid <uid>",r);return}let a=await $i({home:t,uid:n});if(!a){ag(_A(n),r);return}m(a,r,bA(a));return}throw new Error("capabilities requires refresh, learn, list, search, show, or explain")}function ag(e,t){if(t){m({error:e},!0,e),process.exitCode=1;return}throw new Error(e)}function _A(e){return`Capability not found: ${e}. Run "nativesoul capabilities search ${e} --all-hosts" to find available capability UIDs.`}function bA(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(vA)].join(`
1107
- `)}function vA(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 Xr({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 Yr({home:t,project:u(e.flags,"project"),status:eg(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 Qr(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=$o({home:t,project:o,host:u(e.flags,"host"),since:u(e.flags,"since"),until:u(e.flags,"until"),groupBy:kA(e.flags),limit:E(e.flags,"limit")});m(n,r,wA(n))}function kA(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 wA(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=SA(e.flags),a=await Fo({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?AA(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 SA(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 AA(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 Ao({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=EA(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 EA(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 PA}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?xA(a):ge,i=await IA(e),l=await Di({home:t,currentVersion:Xt,latestKnownVersion:i}),c={ok:!0,action:"status",license:en(s),update_entitlement:l,message:TA(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 xA(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?jA(e.license_key):null}}function jA(e){return e.length<=8?"[REDACTED_LICENSE_KEY]":`${e.slice(0,4)}\u2026${e.slice(-4)}`}async function IA(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=PA(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 TA(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 sg={life_activation_status:async(e,t)=>await Ir({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:CA(e.profile)}),life_activation_verify:async(e,t)=>await Ko({home:t,host:Jl(e.host),surface:OA(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"])})},ig=[{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 CA(e){if(e!==void 0){if(e==="quickstart"||e==="advanced")return e;throw new Error("Invalid activation profile")}}function OA(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 NA=["2025-11-25","2024-11-05","2024-10-07"],pg={...sg,life_status:(e,t)=>ca(t),life_bootstrap:async(e,t)=>await FA({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:lg(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 io(t,C(e.id,"")),life_capability_search:async(e,t)=>await zr({home:t,query:C(e.query,""),host:VA(e)?void 0:F(e.host)??"codex",readyOnly:Cr(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:ug(e.class),target:F(e.target)}),life_approval_request:async(e,t)=>await GA({home:t,action:C(e.action,""),className:ug(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 Ar({home:t,id:r,status:qA(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 Xr({home:t,project:C(e.project,"default"),summary:C(e.summary,""),dueAt:F(e.due_at),ttlSeconds:lg(e.ttl_seconds),source:{host:"mcp",session_id:"local"}}),life_commitment_complete:async(e,t)=>await Qr(t,C(e.id,"")),life_work_item_create:async(e,t)=>await No({home:t,project:C(e.project,"default"),title:C(e.title,""),description:F(e.description),priority:Gl(e.priority),source:"mcp",tags:cg(e.tags),host:F(e.host)}),life_work_item_list:async(e,t)=>await Mo({home:t,project:F(e.project),status:dg(e.status),priority:Gl(e.priority),assignedHost:F(e.host),limit:ga(e.limit,50)}),life_work_item_claim:async(e,t)=>await Lo({home:t,id:C(e.id,""),host:C(e.host,"mcp")}),life_work_item_update:async(e,t)=>await Do({home:t,id:C(e.id,""),status:dg(e.status),priority:Gl(e.priority),assignedHost:F(e.host),description:F(e.description),tags:e.tags===void 0?void 0:cg(e.tags)}),life_work_item_complete:async(e,t)=>await Ho({home:t,id:C(e.id,""),status:BA(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 to(t),life_onboard_apply:async(e,t)=>await ro({home:t,dry_run:Cr(e.dry_run,!0),user_confirmed:Cr(e.user_confirmed,!1),files:WA(e.files),config_patch:JA(e.config_patch)}),life_onboard_complete:async(e,t)=>await oo({home:t,archive:e.archive===void 0?!0:Cr(e.archive,!0)})},MA=new Set(Object.keys(pg));function LA(e){return e.method?.startsWith("notifications/")?!0:!Object.prototype.hasOwnProperty.call(e,"id")}async function fa(e,t){if(LA(e))return null;let r=e.id??null;try{if(e.method==="initialize"){let o=tn(e.params),n=F(o.protocolVersion),a=n&&NA.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"}},...ig,{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=UA(e.params);return nt(r,await HA(n.name??"",n.arguments??{},t))}if(MA.has(e.method)){let o=await vr(t);return o.ok?nt(r,await gg(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 mg(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&&DA(a,e).catch(s=>{process.stderr.write(`NativeSoul MCP response error: ${KA(s)}
1111
- `)})}})}async function DA(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"}})}
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
+ `)})}})}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 HA(e,t,r){let o=await gg(e,t,r);return{content:[{type:"text",text:JSON.stringify(o)}]}}var $A={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 gg(e,t,r){let o=pg[e];if(!o)throw new Error(`Unknown tool: ${e}`);let n=$A[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 FA(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 UA(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 lg(e){return typeof e=="number"?e:void 0}function cg(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function dg(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 BA(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 Cr(e,t){return typeof e=="boolean"?e:t}function VA(e){return Cr(e.allHosts,!1)||Cr(e.all_hosts,!1)}function WA(e){let t=tn(e),r={};for(let[o,n]of Object.entries(t))typeof n=="string"&&(r[o]=n);return r}function JA(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 ug(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 qA(e){if(e==="approved"||e==="rejected")return e;throw new Error("life_approval_decide status must be approved or rejected")}async function GA(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 KA(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 mg(t);return}if(o==="manifest"){let n=qt({host:og(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 Ro({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 So({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")??zm(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 io(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:tg(e.flags),limit:E(e.flags,"limit")});m(n,r,zA(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,XA(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":QA(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,fg(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,fg(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,ZA(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,eE(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 zA(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
- `)}function XA(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??YA();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
- `)}function YA(){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 QA(e){return Object.entries(e).map(([t,r])=>`${t} -> ${r}`).join(`
1116
- `)}function fg(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 ZA(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 eE(e){return e.found?`Project reactivated: ${e.id}`:`Project not found: ${e.id}`}import{readFile as tE}from"node:fs/promises";async function Ql(e,t,r){let o=e.rest[0];if(o==="status"){let n=await to(t);m(n,r,n.ritual_pending?"Onboarding ritual pending":"Onboarding complete");return}if(o==="activation"){let n=rE(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:oE(e.flags),recall_auto_trigger_keywords:Yl(e.flags,"recall-keywords"),recall_auto_trigger_denylist:Yl(e.flags,"recall-denylist"),candidate_auto_promotion_threshold:nE(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 tE(n,"utf8")),s=await ro({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 oo({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 rE(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 oE(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 nE(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:rg(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 aE(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 aE(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,hg(s,!1));return}r||process.stdout.write(`${hg(s,!0)}
1118
- `);let i=await al({home:t,proposal:s,host:"codex"});m(i,r,sE(i))}function hg(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
- `)}function sE(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 No({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 Mo({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 Lo({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 Do({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 Ho({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
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
+ `)}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
+ `)}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
+ `)}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: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
+ `);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
+ `)}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: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 cE(e){let t=Sl(e);if(mE(t)){process.stdout.write(`${Xt}
1220
- `);return}if(Al(t)){oc();return}let r=u(t.flags,"home"),o=b(t.flags,"json");if(!gE(t)){let n=await vr(r);if(!n.ok){m(n,o,Co(n)),process.exitCode=1;return}}switch(t.command){case"init":{let n=await Km(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 go(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=ng(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,dE(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:uo(n),host:a,recordTelemetry:!1});m(c,o,c.content);return}catch{}throw await uE({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:uo(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:${pE(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 dE(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 uE(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 pE(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"?e.code:"unavailable"}function mE(e){return e.command==="--version"||e.command==="-v"||e.command==="version"}function gE(e){if(e.command==="license"){let t=e.rest[0];return t==="activate"||t==="status"}return!1}function fE(){if(process.argv[1]===void 0)return!1;let e=lE(import.meta.url);try{return yg(process.argv[1])===yg(e)}catch{return iE.resolve(process.argv[1])===e}}fE()&&cE(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{cE 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};