nativesoul 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- var pm=Object.defineProperty;var ft=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(o){throw r=[o],o}};var kl=(e,t)=>{for(var r in t)pm(e,r,{get:t[r],enumerable:!0})};import{spawn as Xm}from"node:child_process";import{access as zm}from"node:fs/promises";import{constants as Ym}from"node:fs";import{existsSync as Qm}from"node:fs";import nc from"node:path";async function He(e){let t=(process.env.PATH??"").split(nc.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=nc.join(o,`${e}${n}`);if(process.platform==="win32"&&Qm(a))return a;try{return await zm(a,Ym.X_OK),a}catch{}}return null}async function Bo(e,t){return new Promise(r=>{ac(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 Aa(e,t,r=1e3){return new Promise(o=>{ac(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 ac(e,t,r){let n=await He(e)??e,a=process.platform==="win32"&&/\.(?:cmd|bat)$/iu.test(n);return Xm(n,t,{stdio:r,shell:a})}var bt=ft(()=>{"use strict"});import{constants as Zm}from"node:fs";import{access as eg,readFile as tg,stat as rg}from"node:fs/promises";import sc from"node:os";import og from"node:path";function j(e){return e==="~"?sc.homedir():e.startsWith("~/")?og.join(sc.homedir(),e.slice(2)):e}async function P(e){try{return await eg(e,Zm.F_OK),!0}catch{return!1}}async function V(e){try{return(await rg(e)).isDirectory()}catch{return!1}}async function J(e){return await P(e)?tg(e,"utf8"):null}function Ce(e){let t=ic(e);return[t.start,"# NativeSoul bridge","At the start of every new session, load NativeSoul context before making continuity-sensitive decisions.",`Preferred handshake: call the local MCP tool life_bootstrap with host="${e}" and cwd set to the current working directory.`,`Fallback handshake: run nativesoul bootstrap --host ${e} --cwd <current-working-directory> --format inject.`,`If bootstrap or MCP is unavailable, run nativesoul bootstrap --host ${e} --cwd <current-working-directory> --format cache and treat the context as degraded.`,"Use relevant_memories for durable facts, capability_cards as advisory guidance, and capabilities only as the ready-only list.","Never copy credentials or auto-edit SOUL.md/POLICY.md; propose those changes for approval.",`Host adapter: ${e}.`,t.end,""].join(`
3
- `)}function ic(e){return{start:`<!-- nativesoul:${e}:start v1 -->`,end:`<!-- nativesoul:${e}:end -->`}}function Y(e,t){if(!t)return!1;let r=ic(t);return e.includes(r.start)&&e.includes(r.end)}var se=ft(()=>{"use strict"});function N(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function $e(e){try{return JSON.parse(e)}catch{return null}}async function z(e){let t=await J(e);if(t===null)return null;let r=$e(t);return N(r)?r:null}function Qe(e){return N(e)?Object.keys(e).filter(t=>t.trim().length>0):[]}function Wo(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function Ze(e,t){if(Array.isArray(e))return e;if(!N(e))return[];for(let r of t){let o=e[r];if(Array.isArray(o))return o}return[]}function I(e,t){if(!N(e))return null;for(let r of t){let o=e[r];if(typeof o=="string"&&o.trim().length>0)return o.trim()}return null}function re(e,t){if(!N(e))return null;for(let r of t){let o=e[r];if(typeof o=="boolean")return o}return null}function M(e,t){let r=t?.allowSlash===!0?/[^a-z0-9._/-]+/gu:/[^a-z0-9._-]+/gu;return e.trim().toLowerCase().replace(r,"-").replace(/^-+|-+$/gu,"")||"unknown"}var Fe=ft(()=>{"use strict";se()});import{readdir as fg,readFile as hg}from"node:fs/promises";import yc from"node:path";function bc(e){let t=e??j("~/.claude");return yc.join(t,"scheduled-tasks")}async function vc(e){if(!await V(e))return null;let t=await hc(e,_c);if(t!==null)return t;let r=await _g(e);for(let o of r){let n=await hc(e,o);if(n!==null)return n}return null}async function hc(e,t){let r=yc.join(e,t,"SKILL.md");if(!await P(r))return null;let n=(await hg(r,"utf8")).toLowerCase();return t===_c||t.includes(yg)||n.includes(`name: ${fc}`)||n.includes(`# ${fc}`)?`claude:scheduled-task:${t}`:null}async function _g(e){try{return(await fg(e,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>r.name)}catch{return[]}}var _c,yg,fc,kc=ft(()=>{"use strict";se();_c="nativesoul-heartbeat",yg="nativesoul-heartbeat",fc="life:heartbeat"});import{mkdir as bg,readFile as vg,writeFile as kg}from"node:fs/promises";import Ar from"node:path";import{fileURLToPath as wg}from"node:url";async function Rc(e){try{let t=Ar.join(e,wc);await bg(t,{recursive:!0,mode:448});let r=Ar.join(t,"SKILL.md"),o=await Sg();return await kg(r,o??Rg,"utf8"),!0}catch{return!1}}async function Sg(){let e=Ar.dirname(wg(import.meta.url)),t=[Ar.resolve(process.cwd(),"plugins","claude-nativesoul","skills","life-heartbeat","SKILL.md"),Ar.resolve(e,"../../../../plugins/claude-nativesoul/skills/life-heartbeat/SKILL.md")];for(let r of t)if(await P(r))return vg(r,"utf8");return null}var wc,IA,Rg,Sc=ft(()=>{"use strict";se();wc="nativesoul-heartbeat",IA=`claude:scheduled-task:${wc}`,Rg='---\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 Ac={};kl(Ac,{discoverClaudeScheduledTasksManifest:()=>Ag});async function Ag(e={}){let t=bc(e.hostConfigRoot);if(!e.apply&&!await V(t)||(e.surface==="claude-code"?"claude-code":"claude-desktop")==="claude-code")return null;let o=await vc(t);return o!==null?Ia({nativeId:o,evidenceSource:"filesystem"}):e.apply&&await Rc(t)?Ia({nativeId:"claude:scheduled-task:nativesoul-heartbeat",evidenceSource:"filesystem-provisioned"}):await V(t)?Ia({nativeId:void 0,evidenceSource:"filesystem"}):null}function Ia(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 Ec=ft(()=>{"use strict";kc();Sc();se()});var Jc={};kl(Jc,{discoverCodexAutomationsManifest:()=>Fg});import{readFile as Ca}from"node:fs/promises";import Ko from"node:path";import{spawnSync as Og}from"node:child_process";async function Fg(e={}){let t=await Ug();if(t)return t;let r=await Vg(e.hostConfigRoot);return r||(e.apply?(await Wg(),await Bg()):null)}async function Ug(){let e=process.env.NATIVESOUL_CODEX_AUTOMATIONS_FIXTURES;if(e)try{return Na(await Ca(Ko.join(e,"automations.json"),"utf8"))}catch{return null}let t=process.env.NATIVESOUL_CODEX_AUTOMATIONS_MANIFEST;if(t)try{return Na(await Ca(t,"utf8"))}catch{return null}return null}async function Vg(e){let t=e??j("~/.codex"),r=[Ko.join(t,"automations.json"),Ko.join(t,"automations","nativesoul-heartbeat.json"),Ko.join(t,"automations","manifest.json")];for(let o of r){if(!await P(o))continue;let n=await Ca(o,"utf8"),a=Na(n);if(a?.supported)return a;let s=$e(n);if(!s)continue;let i=Wc(s);if(i)return i}return null}async function Bg(){let e=Jg();for(let t of e)for(let r of Lg){let o=await qg(()=>Gg(t,r),Hg),n=Wc(o);if(n)return n}return null}async function Wg(){let e=await He("codex");e&&Og(e,["app-server","daemon","start"],{encoding:"utf8",stdio:"ignore",timeout:1e4})}function Jg(){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 qg(e,t){for(let r=0;r<=t;r+=1){let o=await e();if(o!==null)return o;r<t&&await Kg($g)}return null}function Kg(e){return new Promise(t=>{setTimeout(t,e)})}async function Gg(e,t){let r=new AbortController,o=setTimeout(()=>r.abort(),Dg);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!N(a)||"error"in a?null:"result"in a?a.result:a}catch{return null}finally{clearTimeout(o)}}function Wc(e){let t=Xg(e);for(let r of t){let o=zg(r),n=JSON.stringify(r).toLowerCase();if(o&&Mg.some(a=>n.includes(a)))return{supported:!0,native_id:o.startsWith("codex:")?o:`codex:automation:${o}`}}return N(e)&&e.supported===!0?{supported:!0,native_id:typeof e.native_id=="string"?e.native_id:void 0}:null}function Xg(e){if(Array.isArray(e))return e;if(!N(e))return[];for(let t of["automations","items","results","data"]){let r=e[t];if(Array.isArray(r))return r}return[]}function zg(e){if(!N(e))return null;for(let t of["id","native_id","automation_id","name"]){let r=e[t];if(typeof r=="string"&&r.trim().length>0)return r.trim()}return null}function Na(e){let t=$e(e);return N(t)?{supported:t.supported===!0,native_id:typeof t.native_id=="string"&&t.native_id.length>0?t.native_id:void 0}:null}var Mg,Lg,Dg,Hg,$g,qc=ft(()=>{"use strict";se();bt();Fe();Mg=["life:heartbeat","nativesoul-heartbeat","life-heartbeat"],Lg=["automation/list","automations/list","scheduledAutomation/list"],Dg=1e3,Hg=2,$g=150});import{realpathSync as cm}from"node:fs";import WR from"node:path";import{fileURLToPath as JR}from"node:url";import{existsSync as Yw}from"node:fs";import{mkdirSync as Am}from"node:fs";import Em from"node:path";import{pathToFileURL as Pm}from"node:url";function Bt(e){if(!e||typeof e!="object"||Array.isArray(e))return{};let t=e;if(t.source!=="host-reported")return{};let r={schema:Rl(t.schema)??1,source:"host-reported"},o=Kn(t.model);o&&(r.model=o);let n=wl(t.tokens_in);n!==null&&(r.tokens_in=n);let a=wl(t.tokens_out);a!==null&&(r.tokens_out=a);let s=Rl(t.cost_usd);s!==null&&(r.cost_usd=s);let i=Kn(t.currency);i?r.currency=i:s!==null&&(r.currency="USD");let l=Kn(t.reported_at);return l&&(r.reported_at=l),r}function vr(e){try{return Bt(JSON.parse(e))}catch{return{}}}function Kn(e){return typeof e=="string"&&e.length>0?e:null}function wl(e){return typeof e!="number"||!Number.isFinite(e)||e<0?null:Math.trunc(e)}function Rl(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:null}function ht(e){return{id:e.id,type:e.type,scope:{user:e.scope_user,project:e.scope_project},content:e.content,summary:e.summary,source:JSON.parse(e.source_json),confidence:e.confidence,authority:e.authority,sensitivity:e.sensitivity,status:e.status,created_at:e.created_at,expires_at:e.expires_at,hash:e.hash}}function Gn(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 Sl(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 Mo(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 kr(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 Lo(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 Xn(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 zn(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 wr(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 Rr(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:vr(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 Yn(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 Do(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 Al(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{value:e}}function El(e){return e.replaceAll("\\","\\\\").replaceAll("%","\\%").replaceAll("_","\\_")}function je(e){return e?1:0}function Ho(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 Ie=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 Qn(e,t){if(!Wt(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=t.created_at??new Date().toISOString();return e.prepare(`INSERT INTO approvals (
2
+ var Sm=Object.defineProperty;var ft=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(o){throw r=[o],o}};var jl=(e,t)=>{for(var r in t)Sm(e,r,{get:t[r],enumerable:!0})};import{spawn as ig}from"node:child_process";import{access as lg}from"node:fs/promises";import{constants as cg}from"node:fs";import{existsSync as dg}from"node:fs";import pc from"node:path";async function $e(e){let t=(process.env.PATH??"").split(pc.delimiter).filter(Boolean),r=process.platform==="win32"?(process.env.PATHEXT??".EXE;.CMD;.BAT").split(";"):[""];for(let o of t)for(let n of r){let s=pc.join(o,`${e}${n}`);if(process.platform==="win32"&&dg(s))return s;try{return await lg(s,cg.X_OK),s}catch{}}return null}async function qo(e,t){return new Promise(r=>{mc(e,t,["ignore","pipe","pipe"]).then(o=>{let n=setTimeout(()=>{o.kill(),r(null)},750),s="";o.stdout.on("data",a=>{s+=String(a)}),o.stderr.on("data",a=>{s+=String(a)}),o.on("error",()=>{clearTimeout(n),r(null)}),o.on("close",a=>{clearTimeout(n);let i=s.trim().split(/\r?\n/u).map(l=>l.trim()).find(l=>/\d+\.\d+/u.test(l)&&!l.toLowerCase().startsWith("warning"));if(a===0||i){r(i??null);return}r(null)})})})}async function Ts(e,t,r=1e3){return new Promise(o=>{mc(e,t,["ignore","pipe","pipe"]).then(n=>{let s=setTimeout(()=>{n.kill(),o({status:"timeout",code:null,stdout:"",stderr:"command timed out"})},r),a="",i="";n.stdout.on("data",l=>{a+=String(l)}),n.stderr.on("data",l=>{i+=String(l)}),n.on("error",()=>{clearTimeout(s),o({status:"missing",code:null,stdout:a,stderr:i})}),n.on("close",l=>{clearTimeout(s),o({status:l===0?"ok":"error",code:l,stdout:a,stderr:i})})})})}async function mc(e,t,r){let n=await $e(e)??e,s=process.platform==="win32"&&/\.(?:cmd|bat)$/iu.test(n);return ig(n,t,{stdio:r,shell:s})}var bt=ft(()=>{"use strict"});import{constants as ug}from"node:fs";import{access as pg,readFile as mg,stat as gg}from"node:fs/promises";import gc from"node:os";import fg from"node:path";function j(e){return e==="~"?gc.homedir():e.startsWith("~/")?fg.join(gc.homedir(),e.slice(2)):e}async function P(e){try{return await pg(e,ug.F_OK),!0}catch{return!1}}async function B(e){try{return(await gg(e)).isDirectory()}catch{return!1}}async function q(e){return await P(e)?mg(e,"utf8"):null}function Oe(e){let t=fc(e);return[t.start,"# NativeSoul bridge","At the start of every new session, before answering the first user message, load NativeSoul context.","Do not wait for the user to ask for identity, memory, or continuity; bootstrap is mandatory first-turn setup.","After bootstrap, answer from the NativeSoul identity and continuity context, not the host vendor identity.",`Preferred handshake: call the local MCP tool life_bootstrap with host="${e}" and cwd set to the current working directory.`,`Fallback handshake: run nativesoul bootstrap --host ${e} --cwd <current-working-directory> --format inject.`,`If bootstrap or MCP is unavailable, run nativesoul bootstrap --host ${e} --cwd <current-working-directory> --format cache and treat the context as degraded.`,"Use relevant_memories for durable facts, capability_cards as advisory guidance, and capabilities only as the ready-only list.","Never copy credentials or auto-edit SOUL.md/POLICY.md; propose those changes for approval.",`Host adapter: ${e}.`,t.end,""].join(`
3
+ `)}function fc(e){return{start:`<!-- nativesoul:${e}:start v1 -->`,end:`<!-- nativesoul:${e}:end -->`}}function Z(e,t){if(!t)return!1;let r=fc(t);return e.includes(r.start)&&e.includes(r.end)}var le=ft(()=>{"use strict"});function N(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Fe(e){try{return JSON.parse(e)}catch{return null}}async function Y(e){let t=await q(e);if(t===null)return null;let r=Fe(t);return N(r)?r:null}function Qe(e){return N(e)?Object.keys(e).filter(t=>t.trim().length>0):[]}function Ko(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function Ze(e,t){if(Array.isArray(e))return e;if(!N(e))return[];for(let r of t){let o=e[r];if(Array.isArray(o))return o}return[]}function I(e,t){if(!N(e))return null;for(let r of t){let o=e[r];if(typeof o=="string"&&o.trim().length>0)return o.trim()}return null}function ne(e,t){if(!N(e))return null;for(let r of t){let o=e[r];if(typeof o=="boolean")return o}return null}function M(e,t){let r=t?.allowSlash===!0?/[^a-z0-9._/-]+/gu:/[^a-z0-9._-]+/gu;return e.trim().toLowerCase().replace(r,"-").replace(/^-+|-+$/gu,"")||"unknown"}var Ue=ft(()=>{"use strict";le()});import{readdir as Pg,readFile as xg}from"node:fs/promises";import Ac from"node:path";function Pc(e){let t=e??j("~/.claude");return Ac.join(t,"scheduled-tasks")}async function xc(e){if(!await B(e))return null;let t=await Sc(e,Ec);if(t!==null)return t;let r=await Ig(e);for(let o of r){let n=await Sc(e,o);if(n!==null)return n}return null}async function Sc(e,t){let r=Ac.join(e,t,"SKILL.md");if(!await P(r))return null;let n=(await xg(r,"utf8")).toLowerCase();return t===Ec||t.includes(jg)||n.includes(`name: ${Rc}`)||n.includes(`# ${Rc}`)?`claude:scheduled-task:${t}`:null}async function Ig(e){try{return(await Pg(e,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>r.name)}catch{return[]}}var Ec,jg,Rc,jc=ft(()=>{"use strict";le();Ec="nativesoul-heartbeat",jg="nativesoul-heartbeat",Rc="life:heartbeat"});import{mkdir as Tg,readFile as Cg,writeFile as Ng}from"node:fs/promises";import Pr from"node:path";import{fileURLToPath as Og}from"node:url";async function Tc(e){try{let t=Pr.join(e,Ic);await Tg(t,{recursive:!0,mode:448});let r=Pr.join(t,"SKILL.md"),o=await Lg();return await Ng(r,o??Mg,"utf8"),!0}catch{return!1}}async function Lg(){let e=Pr.dirname(Og(import.meta.url)),t=[Pr.resolve(process.cwd(),"plugins","claude-nativesoul","skills","life-heartbeat","SKILL.md"),Pr.resolve(e,"../../../../plugins/claude-nativesoul/skills/life-heartbeat/SKILL.md")];for(let r of t)if(await P(r))return Cg(r,"utf8");return null}var Ic,JA,Mg,Cc=ft(()=>{"use strict";le();Ic="nativesoul-heartbeat",JA=`claude:scheduled-task:${Ic}`,Mg='---\nname: life:heartbeat\ndescription: Run NativeSoul heartbeat from a Claude Scheduled Task.\n---\n\n# life:heartbeat\n\nUse this skill only when invoked by a Claude Scheduled Task for NativeSoul heartbeat checks.\n\nDefault policy: read-only. Do not edit workspace files, memories, `SOUL.md`, `POLICY.md`, scheduler state, or host configuration unless explicitly allowed.\n\n1. Determine the project from the Scheduled Task context. If it is missing, use the current working directory.\n2. Claim a local heartbeat lease through MCP `life_heartbeat_claim` with `host="claude"`, project id or directory, and the Scheduled Task slot/time as `slot`.\n3. If the claim response says another host owns the lease, the lease is already completed, or no work is needed, stop and return only `HEARTBEAT_OK`.\n4. Read NativeSoul context through MCP and inspect heartbeat guidance such as `HEARTBEAT.md`.\n5. If no operator-visible action is required, complete the lease with MCP `life_heartbeat_complete` and `result="HEARTBEAT_OK"`, then return only `HEARTBEAT_OK`.\n6. If action is required, complete the lease with concise evidence, then report the action request without secrets or raw credentials.\n\n`HEARTBEAT_OK` is a silent acknowledgement token. Do not notify the user for it.\n'});var Nc={};jl(Nc,{discoverClaudeScheduledTasksManifest:()=>Dg});async function Dg(e={}){let t=Pc(e.hostConfigRoot);if(!e.apply&&!await B(t)||(e.surface==="claude-code"?"claude-code":"claude-desktop")==="claude-code")return null;let o=await xc(t);return o!==null?Ls({nativeId:o,evidenceSource:"filesystem"}):e.apply&&await Tc(t)?Ls({nativeId:"claude:scheduled-task:nativesoul-heartbeat",evidenceSource:"filesystem-provisioned"}):await B(t)?Ls({nativeId:void 0,evidenceSource:"filesystem"}):null}function Ls(e){return{supported:!0,native_id:e.nativeId,surface:"claude-desktop",scheduler_kind:"local_scheduled_task",creation_surface:"official_machine_readable",evidence_source:e.evidenceSource}}var Oc=ft(()=>{"use strict";jc();Cc();le()});var Zc={};jl(Zc,{discoverCodexAutomationsManifest:()=>Qg});import{readFile as Hs}from"node:fs/promises";import zo from"node:path";import{spawnSync as qg}from"node:child_process";async function Qg(e={}){let t=await Zg();if(t)return t;let r=await ef(e.hostConfigRoot);return r||(e.apply?(await rf(),await tf()):null)}async function Zg(){let e=process.env.NATIVESOUL_CODEX_AUTOMATIONS_FIXTURES;if(e)try{return $s(await Hs(zo.join(e,"automations.json"),"utf8"))}catch{return null}let t=process.env.NATIVESOUL_CODEX_AUTOMATIONS_MANIFEST;if(t)try{return $s(await Hs(t,"utf8"))}catch{return null}return null}async function ef(e){let t=e??j("~/.codex"),r=[zo.join(t,"automations.json"),zo.join(t,"automations","nativesoul-heartbeat.json"),zo.join(t,"automations","manifest.json")];for(let o of r){if(!await P(o))continue;let n=await Hs(o,"utf8"),s=$s(n);if(s?.supported)return s;let a=Fe(n);if(!a)continue;let i=Qc(a);if(i)return i}return null}async function tf(){let e=of();for(let t of e)for(let r of Gg){let o=await nf(()=>af(t,r),zg),n=Qc(o);if(n)return n}return null}async function rf(){let e=await $e("codex");e&&qg(e,["app-server","daemon","start"],{encoding:"utf8",stdio:"ignore",timeout:1e4})}function of(){let e=new Set;for(let t of[process.env.NATIVESOUL_CODEX_APP_SERVER_URL,process.env.CODEX_APP_SERVER_URL])typeof t=="string"&&t.trim().length>0&&e.add(t.trim());return e.add("http://127.0.0.1:8787"),e.add("http://127.0.0.1:4096"),[...e]}async function nf(e,t){for(let r=0;r<=t;r+=1){let o=await e();if(o!==null)return o;r<t&&await sf(Yg)}return null}function sf(e){return new Promise(t=>{setTimeout(t,e)})}async function af(e,t){let r=new AbortController,o=setTimeout(()=>r.abort(),Xg);try{let n=await fetch(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:t,method:t,params:{}}),signal:r.signal});if(!n.ok)return null;let s=await n.json();return!N(s)||"error"in s?null:"result"in s?s.result:s}catch{return null}finally{clearTimeout(o)}}function Qc(e){let t=lf(e);for(let r of t){let o=cf(r),n=JSON.stringify(r).toLowerCase();if(o&&Kg.some(s=>n.includes(s)))return{supported:!0,native_id:o.startsWith("codex:")?o:`codex:automation:${o}`}}return N(e)&&e.supported===!0?{supported:!0,native_id:typeof e.native_id=="string"?e.native_id:void 0}:null}function lf(e){if(Array.isArray(e))return e;if(!N(e))return[];for(let t of["automations","items","results","data"]){let r=e[t];if(Array.isArray(r))return r}return[]}function cf(e){if(!N(e))return null;for(let t of["id","native_id","automation_id","name"]){let r=e[t];if(typeof r=="string"&&r.trim().length>0)return r.trim()}return null}function $s(e){let t=Fe(e);return N(t)?{supported:t.supported===!0,native_id:typeof t.native_id=="string"&&t.native_id.length>0?t.native_id:void 0}:null}var Kg,Gg,Xg,zg,Yg,ed=ft(()=>{"use strict";le();bt();Ue();Kg=["life:heartbeat","nativesoul-heartbeat","life-heartbeat"],Gg=["automation/list","automations/list","scheduledAutomation/list"],Xg=1e3,zg=2,Yg=150});import{realpathSync as km}from"node:fs";import sS from"node:path";import{fileURLToPath as aS}from"node:url";import{existsSync as pR}from"node:fs";import{mkdirSync as Dm}from"node:fs";import Hm from"node:path";import{pathToFileURL as $m}from"node:url";function qt(e){if(!e||typeof e!="object"||Array.isArray(e))return{};let t=e;if(t.source!=="host-reported")return{};let r={schema:Tl(t.schema)??1,source:"host-reported"},o=Zn(t.model);o&&(r.model=o);let n=Il(t.tokens_in);n!==null&&(r.tokens_in=n);let s=Il(t.tokens_out);s!==null&&(r.tokens_out=s);let a=Tl(t.cost_usd);a!==null&&(r.cost_usd=a);let i=Zn(t.currency);i?r.currency=i:a!==null&&(r.currency="USD");let l=Zn(t.reported_at);return l&&(r.reported_at=l),r}function wr(e){try{return qt(JSON.parse(e))}catch{return{}}}function Zn(e){return typeof e=="string"&&e.length>0?e:null}function Il(e){return typeof e!="number"||!Number.isFinite(e)||e<0?null:Math.trunc(e)}function Tl(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:null}function ht(e){return{id:e.id,type:e.type,scope:{user:e.scope_user,project:e.scope_project},content:e.content,summary:e.summary,source:JSON.parse(e.source_json),confidence:e.confidence,authority:e.authority,sensitivity:e.sensitivity,status:e.status,created_at:e.created_at,expires_at:e.expires_at,hash:e.hash}}function es(e){return{memory_id:e.memory_id,scope_project:e.scope_project,source:JSON.parse(e.source_json),schema_version:e.schema_version,provider_id:e.provider_id,model_id:e.model_id,content_hash:e.content_hash,embedding:JSON.parse(e.embedding_json),indexed_text:e.indexed_text,indexed_at:e.indexed_at}}function Cl(e){return{id:e.id,type:e.type,actor:e.actor,origin:e.origin,result:e.result,details:JSON.parse(e.details_json),created_at:e.created_at,hash:e.hash}}function Ho(e){return{uid:e.uid,host:e.host,native_kind:e.native_kind,normalized_kind:e.normalized_kind,source:e.source,schema_hash:e.schema_hash,installed:!!e.installed,enabled:!!e.enabled,active:!!e.active,authenticated:!!e.authenticated,healthy:!!e.healthy,allowed:!!e.allowed,ready:!!e.ready,last_seen_at:e.last_seen_at}}function Rr(e){return{id:e.id,display_name:e.display_name,base_id:e.base_id,source:e.source,first_basis:e.first_basis,status:e.status,created_at:e.created_at,updated_at:e.updated_at,last_seen_at:e.last_seen_at}}function $o(e){return{id:e.id,action:e.action,class:e.class,target:e.target,project:e.project,host:e.host,status:e.status,reviewer:e.reviewer,reason:e.reason,created_at:e.created_at,decided_at:e.decided_at}}function ts(e){return{id:e.id,project_id:e.project_id,title:e.title,description:e.description,status:e.status,priority:e.priority,assigned_host:e.assigned_host,source:e.source,tags:JSON.parse(e.tags_json),metadata:JSON.parse(e.metadata_json),created_at:e.created_at,updated_at:e.updated_at,claimed_at:e.claimed_at,completed_at:e.completed_at}}function rs(e){return{id:e.id,work_item_id:e.work_item_id,project_id:e.project_id,type:e.type,from_status:e.from_status,to_status:e.to_status,actor:e.actor,details:JSON.parse(e.details_json),created_at:e.created_at}}function Sr(e){return{id:e.id,slot:e.slot,holder:e.holder,idempotency_key:e.idempotency_key,expires_at:e.expires_at,status:e.status,created_at:e.created_at,completed_at:e.completed_at}}function Ar(e){if(e.kind!=="heartbeat"||e.status!=="completed"||!e.completed_at)throw new Error(`Invalid heartbeat run row: ${e.id}`);return{id:e.id,kind:"heartbeat",host:e.host,project_id:e.project_id,status:"completed",cost:wr(e.cost_json),result:JSON.parse(e.result_json),evidence:JSON.parse(e.evidence_json),started_at:e.started_at,completed_at:e.completed_at}}function os(e){return{id:e.id,host:e.host,mode:e.mode,enabled:!!e.enabled,native_schedule_supported:!!e.native_schedule_supported,native_id:e.native_id,desired:JSON.parse(e.desired_json),updated_at:e.updated_at}}function Fo(e){return{id:e.id,project_id:e.project_id,summary:e.summary,status:e.status,due_at:e.due_at,ttl_expires_at:e.ttl_expires_at,source:JSON.parse(e.source_json),created_at:e.created_at,updated_at:e.updated_at}}function Nl(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{value:e}}function Ol(e){return e.replaceAll("\\","\\\\").replaceAll("%","\\%").replaceAll("_","\\_")}function Te(e){return e?1:0}function Uo(e){return e.split(/[^\p{L}\p{N}_-]+/u).map(t=>t.trim()).filter(Boolean).slice(0,8).map(t=>`"${t.replaceAll('"','""')}"`).join(" OR ")}var Ce=class extends Error{code="APPROVAL_ALREADY_DECIDED";id;status;constructor(t){super(`Approval ${t.id} is already ${t.status}`),this.name="ApprovalDecisionError",this.id=t.id,this.status=t.status}};function ns(e,t){if(!Kt(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=t.created_at??new Date().toISOString();return e.prepare(`INSERT INTO approvals (
4
4
  id, action, class, target, project, host, status, reviewer, reason, created_at, decided_at
5
- ) VALUES (?, ?, ?, ?, ?, ?, 'pending', NULL, NULL, ?, NULL)`).run(t.id,t.action,t.class,t.target??null,t.project??null,t.host??null,r),yt(e,t.id)}function Zn(e,t){if(!Wt(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=t.created_at??new Date().toISOString(),o=t.decided_at??r;return e.prepare(`INSERT INTO approvals (
5
+ ) VALUES (?, ?, ?, ?, ?, ?, 'pending', NULL, NULL, ?, NULL)`).run(t.id,t.action,t.class,t.target??null,t.project??null,t.host??null,r),yt(e,t.id)}function ss(e,t){if(!Kt(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=t.created_at??new Date().toISOString(),o=t.decided_at??r;return e.prepare(`INSERT INTO approvals (
6
6
  id, action, class, target, project, host, status, reviewer, reason, created_at, decided_at
7
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.action,t.class,t.target??null,t.project??null,t.host??null,t.status,t.reviewer,t.reason??null,r,o),yt(e,t.id)}function yt(e,t){if(!Wt(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?Lo(r):null,warning:null}}function ea(e,t){if(!Wt(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(Lo),warning:null}}function ta(e,t){if(!Wt(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=e.prepare(`SELECT * FROM approvals
7
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.action,t.class,t.target??null,t.project??null,t.host??null,t.status,t.reviewer,t.reason??null,r,o),yt(e,t.id)}function yt(e,t){if(!Kt(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=e.prepare("SELECT * FROM approvals WHERE id = ?").get(t);return{available:!0,approval:r?$o(r):null,warning:null}}function as(e,t){if(!Kt(e))return{available:!1,approvals:[],warning:"approvals_not_available"};let r=t?e.prepare("SELECT * FROM approvals WHERE status = ? ORDER BY created_at DESC, id DESC"):e.prepare("SELECT * FROM approvals ORDER BY created_at DESC, id DESC");return{available:!0,approvals:(t?r.all(t):r.all()).map($o),warning:null}}function is(e,t){if(!Kt(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=e.prepare(`SELECT * FROM approvals
8
8
  WHERE status = 'pending'
9
9
  AND action = ?
10
10
  AND class = ?
@@ -12,37 +12,37 @@ var pm=Object.defineProperty;var ft=(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?Lo(r):null,warning:null}}function ra(e,t,r){if(!Wt(e))return{available:!1,approval:null,warning:"approvals_not_available"};let o=yt(e,t).approval;if(!o)return{available:!0,approval:null,warning:null};if(o.status!=="pending")throw new Ie({id:t,status:o.status});return e.prepare("UPDATE approvals SET status = ?, reviewer = ?, reason = ?, decided_at = ? WHERE id = ?").run(r.status,r.reviewer??null,r.reason??null,r.decided_at??new Date().toISOString(),t),yt(e,t)}function Wt(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 Pl(e,t){let r=e.prepare(`INSERT INTO memories (
15
+ LIMIT 1`).get(t.action,t.class,t.target??null,t.project??null,t.host??null);return{available:!0,approval:r?$o(r):null,warning:null}}function ls(e,t,r){if(!Kt(e))return{available:!1,approval:null,warning:"approvals_not_available"};let o=yt(e,t).approval;if(!o)return{available:!0,approval:null,warning:null};if(o.status!=="pending")throw new Ce({id:t,status:o.status});return e.prepare("UPDATE approvals SET status = ?, reviewer = ?, reason = ?, decided_at = ? WHERE id = ?").run(r.status,r.reviewer??null,r.reason??null,r.decided_at??new Date().toISOString(),t),yt(e,t)}function Kt(e){return e.prepare("SELECT EXISTS(SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'approvals') AS exists_count").get()?.exists_count===1}function Ml(e,t){let r=e.prepare(`INSERT INTO memories (
16
16
  id, type, scope_user, scope_project, content, summary, source_json,
17
17
  confidence, authority, sensitivity, status, created_at, expires_at, hash
18
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`),o=e.prepare("INSERT INTO memory_fts (id, summary, content) VALUES (?, ?, ?)");e.exec("BEGIN IMMEDIATE");try{r.run(t.id,t.type,t.scope.user,t.scope.project,t.content,t.summary,JSON.stringify(t.source),t.confidence,t.authority,t.sensitivity,t.status,t.created_at,t.expires_at,t.hash),o.run(t.id,t.summary,t.content),e.exec("COMMIT")}catch(n){throw e.exec("ROLLBACK"),n}}function oa(e,t){let r=e.prepare("SELECT * FROM memories WHERE id = ?").get(t);return r?ht(r):null}function xl(e,t,r){return e.prepare("UPDATE memories SET status = ? WHERE id = ?").run(r,t),oa(e,t)}function jl(e,t){let r=[],o=[];t.project&&(r.push("scope_project = ?"),o.push(t.project)),t.status?(r.push("status = ?"),o.push(t.status)):t.includeForgotten||r.push("status NOT IN ('forgotten', 'expired')");let n=r.length?`WHERE ${r.join(" AND ")}`:"";return e.prepare(`SELECT * FROM memories ${n} ORDER BY created_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(ht)}function Il(e,t,r,o){let n=Ho(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 cs(e,t){let r=e.prepare("SELECT * FROM memories WHERE id = ?").get(t);return r?ht(r):null}function Ll(e,t,r){return e.prepare("UPDATE memories SET status = ? WHERE id = ?").run(r,t),cs(e,t)}function Dl(e,t){let r=[],o=[];t.project&&(r.push("scope_project = ?"),o.push(t.project)),t.status?(r.push("status = ?"),o.push(t.status)):t.includeForgotten||r.push("status NOT IN ('forgotten', 'expired')");let n=r.length?`WHERE ${r.join(" AND ")}`:"";return e.prepare(`SELECT * FROM memories ${n} ORDER BY created_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(ht)}function Hl(e,t,r,o){let n=Uo(t);return n?e.prepare(`SELECT m.*
19
19
  FROM memory_fts f
20
20
  JOIN memories m ON m.id = f.id
21
21
  WHERE memory_fts MATCH ?
22
22
  AND m.scope_project = ?
23
23
  AND m.status = 'active'
24
24
  ORDER BY rank
25
- LIMIT ?`).all(n,r,o).map(ht):na(e,r,o)}function Tl(e,t,r){return e.prepare(`SELECT *
25
+ LIMIT ?`).all(n,r,o).map(ht):ds(e,r,o)}function $l(e,t,r){return e.prepare(`SELECT *
26
26
  FROM memories
27
27
  WHERE scope_project = ?
28
28
  AND status = 'active'
29
29
  ORDER BY created_at DESC, id DESC
30
- LIMIT ?`).all(t,r).map(ht)}function na(e,t,r){return e.prepare(`SELECT *
30
+ LIMIT ?`).all(t,r).map(ht)}function ds(e,t,r){return e.prepare(`SELECT *
31
31
  FROM memories
32
32
  WHERE scope_project = ?
33
33
  AND status = 'active'
34
34
  ORDER BY created_at DESC
35
- LIMIT ?`).all(t,r).map(ht)}function Cl(e,t){return e.prepare(`SELECT *
35
+ LIMIT ?`).all(t,r).map(ht)}function Fl(e,t){return e.prepare(`SELECT *
36
36
  FROM memories
37
37
  WHERE status IN ('active', 'candidate')
38
38
  ORDER BY created_at DESC, id DESC
39
- LIMIT ?`).all(t.limit).map(ht)}var Jt=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 aa(e,t){let r=_e(e,t.id),o=t.now??new Date().toISOString();e.prepare(`INSERT INTO projects (
39
+ LIMIT ?`).all(t.limit).map(ht)}var Gt=class extends Error{code="PROJECT_MEMORY_FORGET_BLOCKED";id;from;to;constructor(t){super(`Invalid project memory forget transition for ${t.id}: ${t.from} -> ${t.to}`),this.name="ProjectMemoryForgetError",this.id=t.id,this.from=t.from,this.to=t.to}};function us(e,t){let r=ve(e,t.id),o=t.now??new Date().toISOString();e.prepare(`INSERT INTO projects (
40
40
  id, display_name, base_id, source, first_basis, status, created_at, updated_at, last_seen_at
41
41
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
42
42
  ON CONFLICT(id) DO UPDATE SET
43
43
  last_seen_at = excluded.last_seen_at,
44
44
  updated_at = excluded.updated_at,
45
- source = excluded.source`).run(t.id,t.display_name,t.base_id,t.source,t.first_basis??null,t.status??"active",o,o,o);let n=_e(e,t.id);if(!n)throw new Error(`Project upsert did not return a row for ${t.id}`);return{project:n,inserted:!r}}function sa(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(kr)}function _e(e,t){let r=e.prepare("SELECT * FROM projects WHERE id = ?").get(t);return r?kr(r):null}function ia(e,t,r,o=new Date().toISOString()){if(!Sr(e))return{found:!1,previous:null,project:null};let n=_e(e,t);return n?(e.prepare("UPDATE projects SET display_name = ?, updated_at = ? WHERE id = ?").run(r,o,t),{found:!0,previous:n,project:_e(e,t)}):{found:!1,previous:null,project:null}}function la(e,t,r=new Date().toISOString()){return Ml(e,t,"archived",r)}function ca(e,t,r=new Date().toISOString()){return Ml(e,t,"active",r)}function da(e,t){return e.prepare("SELECT COUNT(*) AS count FROM memories WHERE scope_project = ?").get(t)?.count??0}function ua(e,t,r,o=new Date().toISOString()){if(!Sr(e))return{found:!1,previous:null,project:null,memories_affected:0};let n=_e(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 Jt({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:_e(e,t),memories_affected:a.length}}catch(a){throw e.exec("ROLLBACK"),a}}function pa(e,t={}){if(!Sr(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(`${Nl} ${n} ORDER BY derived_last_seen_at DESC, p.id ASC LIMIT ?`).all(...o,hm(t.limit)).map(fm),warning:null}}function ma(e,t){if(!Sr(e))return{available:!1,detail:null,warning:"registry_not_available"};let r=e.prepare(`${Nl} WHERE p.id = ?`).get(t);return r?{available:!0,detail:{project:kr(r),counts:Ol(r),derived_last_seen_at:r.last_activity_at??null},warning:null}:{available:!0,detail:ym(e,t),warning:null}}var Nl=`
45
+ source = excluded.source`).run(t.id,t.display_name,t.base_id,t.source,t.first_basis??null,t.status??"active",o,o,o);let n=ve(e,t.id);if(!n)throw new Error(`Project upsert did not return a row for ${t.id}`);return{project:n,inserted:!r}}function ps(e,t){let r=t?e.prepare("SELECT * FROM projects WHERE status = ? ORDER BY last_seen_at DESC, id ASC"):e.prepare("SELECT * FROM projects ORDER BY last_seen_at DESC, id ASC");return(t?r.all(t):r.all()).map(Rr)}function ve(e,t){let r=e.prepare("SELECT * FROM projects WHERE id = ?").get(t);return r?Rr(r):null}function ms(e,t,r,o=new Date().toISOString()){if(!Er(e))return{found:!1,previous:null,project:null};let n=ve(e,t);return n?(e.prepare("UPDATE projects SET display_name = ?, updated_at = ? WHERE id = ?").run(r,o,t),{found:!0,previous:n,project:ve(e,t)}):{found:!1,previous:null,project:null}}function gs(e,t,r=new Date().toISOString()){return Bl(e,t,"archived",r)}function fs(e,t,r=new Date().toISOString()){return Bl(e,t,"active",r)}function hs(e,t){return e.prepare("SELECT COUNT(*) AS count FROM memories WHERE scope_project = ?").get(t)?.count??0}function ys(e,t,r,o=new Date().toISOString()){if(!Er(e))return{found:!1,previous:null,project:null,memories_affected:0};let n=ve(e,t);if(!n)return{found:!1,previous:null,project:null,memories_affected:0};e.exec("BEGIN IMMEDIATE");try{let s=e.prepare("SELECT id, status FROM memories WHERE scope_project = ? ORDER BY created_at ASC, id ASC").all(t);for(let a of s)if(!r(a.status,"forgotten"))throw new Gt({id:a.id,from:a.status,to:"forgotten"});return e.prepare("UPDATE memories SET status = 'forgotten' WHERE scope_project = ?").run(t),e.prepare("UPDATE projects SET status = 'forgotten', updated_at = ? WHERE id = ?").run(o,t),e.exec("COMMIT"),{found:!0,previous:n,project:ve(e,t),memories_affected:s.length}}catch(s){throw e.exec("ROLLBACK"),s}}function _s(e,t={}){if(!Er(e))return{available:!1,projects:[],warning:"registry_not_available"};let r=[],o=[];t.status&&t.status!=="all"&&(r.push("p.status = ?"),o.push(t.status));let n=r.length?`WHERE ${r.join(" AND ")}`:"";return{available:!0,projects:e.prepare(`${Ul} ${n} ORDER BY derived_last_seen_at DESC, p.id ASC LIMIT ?`).all(...o,xm(t.limit)).map(Pm),warning:null}}function bs(e,t){if(!Er(e))return{available:!1,detail:null,warning:"registry_not_available"};let r=e.prepare(`${Ul} WHERE p.id = ?`).get(t);return r?{available:!0,detail:{project:Rr(r),counts:Vl(r),derived_last_seen_at:r.last_activity_at??null},warning:null}:{available:!0,detail:jm(e,t),warning:null}}var Ul=`
46
46
  WITH
47
47
  memory_counts AS (
48
48
  SELECT scope_project AS project_id,
@@ -118,7 +118,7 @@ LEFT JOIN semantic_counts s ON s.project_id = p.id
118
118
  LEFT JOIN commitment_counts c ON c.project_id = p.id
119
119
  LEFT JOIN run_counts r ON r.project_id = p.id
120
120
  LEFT JOIN session_counts se ON se.project_id = p.id
121
- LEFT JOIN activity a ON a.project_id = p.id`;function fm(e){return{...kr(e),counts:Ol(e),derived_last_seen_at:e.last_activity_at??null}}function Ol(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 hm(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),500)}function Sr(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 Ml(e,t,r,o){if(!Sr(e))return{found:!1,previous:null,project:null};let n=_e(e,t);return n?(e.prepare("UPDATE projects SET status = ?, updated_at = ? WHERE id = ?").run(r,o,t),{found:!0,previous:n,project:_e(e,t)}):{found:!1,previous:null,project:null}}function ym(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:_m(i)}}function _m(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 Ll(e,t){let r=e.prepare(`INSERT INTO semantic_memory_index (
121
+ LEFT JOIN activity a ON a.project_id = p.id`;function Pm(e){return{...Rr(e),counts:Vl(e),derived_last_seen_at:e.last_activity_at??null}}function Vl(e){return{memories:{total:e.memory_count??0,active:e.active_memory_count??0,last_activity_at:e.memory_last_activity_at??null},semantic_memory_index:{total:e.semantic_index_count??0,last_activity_at:e.semantic_last_activity_at??null},commitments:{total:e.commitment_count??0,open:e.open_commitment_count??0,last_activity_at:e.commitment_last_activity_at??null},runs:{total:e.run_count??0,last_activity_at:e.run_last_activity_at??null},sessions:{total:e.session_count??0,last_activity_at:e.session_last_activity_at??null}}}function xm(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),500)}function Er(e){return e.prepare("SELECT EXISTS(SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'projects') AS exists_count").get()?.exists_count===1}function Bl(e,t,r,o){if(!Er(e))return{found:!1,previous:null,project:null};let n=ve(e,t);return n?(e.prepare("UPDATE projects SET status = ?, updated_at = ? WHERE id = ?").run(r,o,t),{found:!0,previous:n,project:ve(e,t)}):{found:!1,previous:null,project:null}}function jm(e,t){let r=e.prepare("SELECT COUNT(*) AS count, SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) AS active_count, MAX(created_at) AS last_activity_at FROM memories WHERE scope_project = ?").get(t),o=e.prepare("SELECT COUNT(*) AS count, MAX(indexed_at) AS last_activity_at FROM semantic_memory_index WHERE scope_project = ?").get(t),n=e.prepare("SELECT COUNT(*) AS count, SUM(CASE WHEN status = 'open' THEN 1 ELSE 0 END) AS open_count, MAX(updated_at) AS last_activity_at FROM commitments WHERE project_id = ?").get(t),s=e.prepare("SELECT COUNT(*) AS count, MAX(COALESCE(completed_at, started_at)) AS last_activity_at FROM runs WHERE project_id = ?").get(t),a=e.prepare("SELECT COUNT(*) AS count, MAX(COALESCE(ended_at, started_at)) AS last_activity_at FROM sessions WHERE project_id = ?").get(t),i={memories:{total:r.count,active:r.active_count??0,last_activity_at:r.last_activity_at},semantic_memory_index:{total:o.count,last_activity_at:o.last_activity_at},commitments:{total:n.count,open:n.open_count??0,last_activity_at:n.last_activity_at},runs:{total:s.count,last_activity_at:s.last_activity_at},sessions:{total:a.count,last_activity_at:a.last_activity_at}};return{project:null,counts:i,derived_last_seen_at:Im(i)}}function Im(e){return[e.memories.last_activity_at,e.semantic_memory_index.last_activity_at,e.commitments.last_activity_at,e.runs.last_activity_at,e.sessions.last_activity_at].filter(r=>typeof r=="string"&&r.length>0).sort().at(-1)??null}function Wl(e,t){let r=e.prepare(`INSERT INTO semantic_memory_index (
122
122
  memory_id, scope_project, source_json, schema_version, provider_id, model_id,
123
123
  content_hash, embedding_json, indexed_text, indexed_at
124
124
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
@@ -131,7 +131,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function fm(e){return{...kr(e),coun
131
131
  content_hash = excluded.content_hash,
132
132
  embedding_json = excluded.embedding_json,
133
133
  indexed_text = excluded.indexed_text,
134
- indexed_at = excluded.indexed_at`);e.exec("BEGIN IMMEDIATE");try{for(let o of t)r.run(o.memory_id,o.scope_project,JSON.stringify(o.source),o.schema_version,o.provider_id,o.model_id,o.content_hash,JSON.stringify(o.embedding),o.indexed_text,o.indexed_at);e.exec("COMMIT")}catch(o){throw e.exec("ROLLBACK"),o}}function Dl(e,t){let r=e.prepare("SELECT * FROM semantic_memory_index WHERE memory_id = ?").get(t);return r?Gn(r):null}function Hl(e,t){return e.prepare(`SELECT s.*
134
+ indexed_at = excluded.indexed_at`);e.exec("BEGIN IMMEDIATE");try{for(let o of t)r.run(o.memory_id,o.scope_project,JSON.stringify(o.source),o.schema_version,o.provider_id,o.model_id,o.content_hash,JSON.stringify(o.embedding),o.indexed_text,o.indexed_at);e.exec("COMMIT")}catch(o){throw e.exec("ROLLBACK"),o}}function Jl(e,t){let r=e.prepare("SELECT * FROM semantic_memory_index WHERE memory_id = ?").get(t);return r?es(r):null}function ql(e,t){return e.prepare(`SELECT s.*
135
135
  FROM semantic_memory_index s
136
136
  JOIN memories m ON m.id = s.memory_id
137
137
  WHERE m.scope_project = ?
@@ -141,7 +141,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function fm(e){return{...kr(e),coun
141
141
  AND s.schema_version = ?
142
142
  AND s.content_hash = m.hash
143
143
  ORDER BY s.indexed_at DESC, s.memory_id DESC
144
- LIMIT ?`).all(t.project,t.providerId,t.modelId,t.schemaVersion,t.limit).map(Gn)}function $l(e,t){let r=e.prepare(`SELECT
144
+ LIMIT ?`).all(t.project,t.providerId,t.modelId,t.schemaVersion,t.limit).map(es)}function Kl(e,t){let r=e.prepare(`SELECT
145
145
  COUNT(m.id) AS indexable_count,
146
146
  COUNT(s.memory_id) AS indexed_count,
147
147
  SUM(CASE
@@ -155,7 +155,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function fm(e){return{...kr(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 Ul(r)}function Fl(e,t){let r=e.prepare(`SELECT
158
+ AND m.scope_project = ?`).get(t.providerId,t.modelId,t.schemaVersion,t.project);return Xl(r)}function Gl(e,t){let r=e.prepare(`SELECT
159
159
  COUNT(m.id) AS indexable_count,
160
160
  COUNT(s.memory_id) AS indexed_count,
161
161
  SUM(CASE
@@ -168,15 +168,15 @@ LEFT JOIN activity a ON a.project_id = p.id`;function fm(e){return{...kr(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 Ul(r)}function Ul(e){return{indexable_count:e?.indexable_count??0,indexed_count:e?.indexed_count??0,stale_count:e?.stale_count??0}}function ga(e,t){e.prepare(`INSERT INTO work_items (
171
+ WHERE m.status IN ('active', 'candidate')`).get(t.providerId,t.modelId,t.schemaVersion);return Xl(r)}function Xl(e){return{indexable_count:e?.indexable_count??0,indexed_count:e?.indexed_count??0,stale_count:e?.stale_count??0}}function vs(e,t){e.prepare(`INSERT INTO work_items (
172
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=qt(e,t.id);if(!r)throw new Error(`Work item not found after insert: ${t.id}`);return r}function qt(e,t){if(!ba(e))return null;let r=e.prepare("SELECT * FROM work_items WHERE id = ?").get(t);return r?Xn(r):null}function fa(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,Jl(t.limit)).map(Xn)}function ha(e,t){if(!ba(e))return null;e.exec("BEGIN IMMEDIATE");try{let r=qt(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=Xt(e,t.id);if(!r)throw new Error(`Work item not found after insert: ${t.id}`);return r}function Xt(e,t){if(!As(e))return null;let r=e.prepare("SELECT * FROM work_items WHERE id = ?").get(t);return r?ts(r):null}function ks(e,t){if(!As(e))return[];let r=[],o=[];t.project&&(r.push("project_id = ?"),o.push(t.project)),t.status&&(r.push("status = ?"),o.push(t.status)),t.priority&&(r.push("priority = ?"),o.push(t.priority)),t.assignedHost&&(r.push("assigned_host = ?"),o.push(t.assignedHost));let n=r.length?`WHERE ${r.join(" AND ")}`:"";return e.prepare(`SELECT * FROM work_items ${n} ORDER BY updated_at DESC, id DESC LIMIT ?`).all(...o,Zl(t.limit)).map(ts)}function ws(e,t){if(!As(e))return null;e.exec("BEGIN IMMEDIATE");try{let r=Xt(e,t.id);if(!r)return e.exec("COMMIT"),null;let o=t.status??r.status,n=t.priority??r.priority,s=t.assignedHost!==void 0?t.assignedHost:r.assigned_host,a=t.description!==void 0?t.description:r.description,i=t.tags!==void 0?t.tags:r.tags,l=t.metadata!==void 0?t.metadata:r.metadata,c=t.claimedAt!==void 0?t.claimedAt:r.claimed_at,d=t.completedAt!==void 0?t.completedAt:r.completed_at;e.prepare(`UPDATE work_items
175
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&&Vl(e,t.event);let p=qt(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 ya(e,t){Vl(e,t);let r=km(e,t.id);if(!r)throw new Error(`Work item event not found after insert: ${t.id}`);return r}function _a(e,t,r){return Bl(e)?e.prepare("SELECT * FROM work_item_events WHERE work_item_id = ? ORDER BY created_at DESC, id DESC LIMIT ?").all(t,Jl(r)).map(zn):[]}function Vl(e,t){e.prepare(`INSERT INTO work_item_events (
177
+ WHERE id = ?`).run(o,n,s,a,JSON.stringify(i),JSON.stringify(l),c,d,t.updatedAt,t.id),t.event&&zl(e,t.event);let p=Xt(e,t.id);if(!p)throw new Error(`Work item not found after update: ${t.id}`);return e.exec("COMMIT"),p}catch(r){throw e.exec("ROLLBACK"),r}}function Rs(e,t){zl(e,t);let r=Nm(e,t.id);if(!r)throw new Error(`Work item event not found after insert: ${t.id}`);return r}function Ss(e,t,r){return Yl(e)?e.prepare("SELECT * FROM work_item_events WHERE work_item_id = ? ORDER BY created_at DESC, id DESC LIMIT ?").all(t,Zl(r)).map(rs):[]}function zl(e,t){e.prepare(`INSERT INTO work_item_events (
178
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 km(e,t){if(!Bl(e))return null;let r=e.prepare("SELECT * FROM work_item_events WHERE id = ?").get(t);return r?zn(r):null}function ba(e){return Wl(e,"work_items")}function Bl(e){return Wl(e,"work_item_events")}function Wl(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 Jl(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),500)}import{createRequire as Rm}from"node:module";var Sm=Rm(import.meta.url),$o=null;function ql(){if($o)return $o;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 $o=Sm("node:sqlite"),$o}finally{process.emitWarning=e}}function Kl(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 Gl(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 Nm(e,t){if(!Yl(e))return null;let r=e.prepare("SELECT * FROM work_item_events WHERE id = ?").get(t);return r?rs(r):null}function As(e){return Ql(e,"work_items")}function Yl(e){return Ql(e,"work_item_events")}function Ql(e,t){return e.prepare("SELECT EXISTS(SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?) AS exists_count").get(t)?.exists_count===1}function Zl(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),500)}import{createRequire as Mm}from"node:module";var Lm=Mm(import.meta.url),Vo=null;function ec(){if(Vo)return Vo;let e=process.emitWarning;process.emitWarning=((t,r,o,n)=>{if(!String(t).includes("SQLite is an experimental feature")){if(typeof r=="object"){e.call(process,t,r);return}e.call(process,t,{type:r,code:o,ctor:n})}});try{return Vo=Lm("node:sqlite"),Vo}finally{process.emitWarning=e}}function tc(e,t={}){t.readOnly||(e.exec("PRAGMA journal_mode = WAL"),e.exec("PRAGMA foreign_keys = ON")),e.exec("PRAGMA busy_timeout = 5000"),t.readOnly&&e.exec("PRAGMA query_only = ON")}function rc(e){e.exec(`
180
180
  CREATE TABLE IF NOT EXISTS migrations (
181
181
  version INTEGER PRIMARY KEY,
182
182
  name TEXT NOT NULL,
@@ -454,8 +454,8 @@ LEFT JOIN activity a ON a.project_id = p.id`;function fm(e){return{...kr(e),coun
454
454
  );
455
455
 
456
456
  CREATE INDEX IF NOT EXISTS idx_approvals_status ON approvals(status);
457
- `),_t(e,7,"approvals","sha256:approvals")}function _t(e,t,r,o){e.prepare("SELECT version FROM migrations WHERE version = ?").get(t)||e.prepare("INSERT INTO migrations (version, name, checksum, applied_at) VALUES (?, ?, ?, ?)").run(t,r,o,new Date().toISOString())}var Xl=["hosts","sessions","memory_edges","commitments","standing_orders","capability_sources","capability_experience","schedules","leases","runs","work_items","work_item_events"];var Fo=class{path;db;constructor(t,r={}){this.path=t,r.readOnly||Am(Em.dirname(t),{recursive:!0,mode:448});let{DatabaseSync:o}=ql(),n=r.readOnly?xm(t):t;this.db=new o(n,r.readOnly?{readOnly:!0}:{}),Kl(this.db,{readOnly:r.readOnly}),r.readOnly||Gl(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(Xl.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(Sl)}createApproval(t){return Qn(this.db,t)}createDecidedApproval(t){return Zn(this.db,t)}getApproval(t){return yt(this.db,t)}listApprovals(t){return ea(this.db,t)}findPendingApprovalMatch(t){return ta(this.db,t)}decideApproval(t,r){return ra(this.db,t,r)}insertWorkItem(t){return ga(this.db,t)}getWorkItem(t){return qt(this.db,t)}listWorkItems(t){return fa(this.db,t)}updateWorkItem(t){return ha(this.db,t)}insertWorkItemEvent(t){return ya(this.db,t)}listWorkItemEvents(t,r){return _a(this.db,t,r)}insertMemory(t){Pl(this.db,t)}getMemory(t){return oa(this.db,t)}updateMemoryStatus(t,r){return xl(this.db,t,r)}listMemories(t){return jl(this.db,t)}upsertProject(t){return aa(this.db,t)}getProject(t){return _e(this.db,t)}listProjects(t){return sa(this.db,t)}listProjectsWithCounts(t={}){return pa(this.db,t)}getProjectDetail(t){return ma(this.db,t)}renameProject(t,r,o){return ia(this.db,t,r,o)}archiveProject(t,r){return la(this.db,t,r)}reactivateProject(t,r){return ca(this.db,t,r)}countProjectMemories(t){return da(this.db,t)}forgetProjectMemories(t,r,o){return ua(this.db,t,r,o)}searchMemories(t,r,o){return Il(this.db,t,r,o)}listActiveMemoriesForProject(t,r){return Tl(this.db,t,r)}recentMemories(t,r){return na(this.db,t,r)}listSemanticIndexableMemories(t){return Cl(this.db,t)}upsertSemanticIndex(t){Ll(this.db,t)}getSemanticIndex(t){return Dl(this.db,t)}listCurrentSemanticIndexesForProject(t){return Hl(this.db,t)}semanticIndexStatsForProject(t){return $l(this.db,t)}semanticIndexStats(t){return Fl(this.db,t)}upsertCapabilities(t){let r=this.db.prepare(`INSERT INTO capabilities (
457
+ `),_t(e,7,"approvals","sha256:approvals")}function _t(e,t,r,o){e.prepare("SELECT version FROM migrations WHERE version = ?").get(t)||e.prepare("INSERT INTO migrations (version, name, checksum, applied_at) VALUES (?, ?, ?, ?)").run(t,r,o,new Date().toISOString())}var oc=["hosts","sessions","memory_edges","commitments","standing_orders","capability_sources","capability_experience","schedules","leases","runs","work_items","work_item_events"];var Bo=class{path;db;constructor(t,r={}){this.path=t,r.readOnly||Dm(Hm.dirname(t),{recursive:!0,mode:448});let{DatabaseSync:o}=ec(),n=r.readOnly?Fm(t):t;this.db=new o(n,r.readOnly?{readOnly:!0}:{}),tc(this.db,{readOnly:r.readOnly}),r.readOnly||rc(this.db)}close(){this.db.close()}integrityCheck(){return this.db.prepare("PRAGMA integrity_check").get()?.integrity_check??"unknown"}counts(){return{migrations:this.countTable("migrations"),memories:this.countTable("memories"),events:this.countTable("events"),capabilities:this.countTable("capabilities"),ledger:this.domainLedgerCounts()}}domainLedgerCounts(){return Object.fromEntries(oc.map(r=>[r,this.countDomainTable(r)]))}insertEvent(t){this.db.prepare(`INSERT INTO events (id, type, actor, origin, result, details_json, created_at, hash)
458
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.type,t.actor,t.origin,t.result,JSON.stringify(t.details),t.created_at,t.hash)}listEvents(t){let r=[],o=[];t.type&&(r.push("type = ?"),o.push(t.type)),t.result&&(r.push("result = ?"),o.push(t.result));let n=r.length?`WHERE ${r.join(" AND ")}`:"";return this.db.prepare(`SELECT * FROM events ${n} ORDER BY created_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(Cl)}createApproval(t){return ns(this.db,t)}createDecidedApproval(t){return ss(this.db,t)}getApproval(t){return yt(this.db,t)}listApprovals(t){return as(this.db,t)}findPendingApprovalMatch(t){return is(this.db,t)}decideApproval(t,r){return ls(this.db,t,r)}insertWorkItem(t){return vs(this.db,t)}getWorkItem(t){return Xt(this.db,t)}listWorkItems(t){return ks(this.db,t)}updateWorkItem(t){return ws(this.db,t)}insertWorkItemEvent(t){return Rs(this.db,t)}listWorkItemEvents(t,r){return Ss(this.db,t,r)}insertMemory(t){Ml(this.db,t)}getMemory(t){return cs(this.db,t)}updateMemoryStatus(t,r){return Ll(this.db,t,r)}listMemories(t){return Dl(this.db,t)}upsertProject(t){return us(this.db,t)}getProject(t){return ve(this.db,t)}listProjects(t){return ps(this.db,t)}listProjectsWithCounts(t={}){return _s(this.db,t)}getProjectDetail(t){return bs(this.db,t)}renameProject(t,r,o){return ms(this.db,t,r,o)}archiveProject(t,r){return gs(this.db,t,r)}reactivateProject(t,r){return fs(this.db,t,r)}countProjectMemories(t){return hs(this.db,t)}forgetProjectMemories(t,r,o){return ys(this.db,t,r,o)}searchMemories(t,r,o){return Hl(this.db,t,r,o)}listActiveMemoriesForProject(t,r){return $l(this.db,t,r)}recentMemories(t,r){return ds(this.db,t,r)}listSemanticIndexableMemories(t){return Fl(this.db,t)}upsertSemanticIndex(t){Wl(this.db,t)}getSemanticIndex(t){return Jl(this.db,t)}listCurrentSemanticIndexesForProject(t){return ql(this.db,t)}semanticIndexStatsForProject(t){return Kl(this.db,t)}semanticIndexStats(t){return Gl(this.db,t)}upsertCapabilities(t){let r=this.db.prepare(`INSERT INTO capabilities (
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,18 +472,18 @@ LEFT JOIN activity a ON a.project_id = p.id`;function fm(e){return{...kr(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,je(a.installed),je(a.enabled),je(a.active),je(a.authenticated),je(a.healthy),je(a.allowed),je(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(Mo)}searchCapabilities(t){let r=Ho(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 s of t)r.run(s.uid,s.host,s.native_kind,s.normalized_kind,s.source,s.schema_hash,Te(s.installed),Te(s.enabled),Te(s.active),Te(s.authenticated),Te(s.healthy),Te(s.allowed),Te(s.ready),s.last_seen_at),o.run(s.uid),n.run(s.uid,s.host,s.native_kind,s.normalized_kind,s.source);this.db.exec("COMMIT")}catch(s){throw this.db.exec("ROLLBACK"),s}}listCapabilities(t){let r=[],o=[];t.host&&(t.includeShared===!1?r.push("host = ?"):r.push("(host = ? OR host = 'all')"),o.push(t.host)),t.readyOnly&&r.push("ready = 1");let n=r.length?`WHERE ${r.join(" AND ")}`:"";return this.db.prepare(`SELECT * FROM capabilities ${n} ORDER BY last_seen_at DESC, uid ASC LIMIT ?`).all(...o,t.limit).map(Ho)}searchCapabilities(t){let r=Uo(t.query);if(!r)return this.listCapabilities({host:t.host,readyOnly:t.readyOnly,limit:t.limit,includeShared:t.includeShared});let o=["capability_fts MATCH ?"],n=[r];return t.host&&(t.includeShared===!1?o.push("c.host = ?"):o.push("(c.host = ? OR c.host = 'all')"),n.push(t.host)),t.readyOnly&&o.push("c.ready = 1"),this.db.prepare(`SELECT c.*
476
476
  FROM capability_fts f
477
477
  JOIN capabilities c ON c.uid = f.uid
478
478
  WHERE ${o.join(" AND ")}
479
479
  ORDER BY rank
480
- LIMIT ?`).all(...n,t.limit).map(Mo)}getCapability(t){let r=this.db.prepare("SELECT * FROM capabilities WHERE uid = ?").get(t);return r?Mo(r):null}findOpenCommitmentBySummary(t,r){let o=this.db.prepare("SELECT * FROM commitments WHERE project_id = ? AND summary = ? AND status = 'open' ORDER BY created_at ASC LIMIT 1").get(t,r);return o?Do(o):null}insertCommitment(t){this.db.prepare(`INSERT INTO commitments (id, project_id, summary, status, due_at, ttl_expires_at, source_json, created_at, updated_at)
481
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.project_id,t.summary,t.status,t.due_at,t.ttl_expires_at,JSON.stringify(t.source),t.created_at,t.updated_at);let r=this.getCommitment(t.id);if(!r)throw new Error(`Commitment not found after insert: ${t.id}`);return r}createOpenCommitmentIfMissing(t,r){this.db.exec("BEGIN IMMEDIATE");try{this.expireCommitments(r);let o=zl(t.summary),n=this.listCommitments({project:t.project_id,status:"open",includeExpired:!1,limit:200,now:r,skipExpire:!0}).find(s=>zl(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
- 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(Do)}updateCommitmentStatus(t,r,o){return this.expireCommitments(o),this.db.prepare("UPDATE commitments SET status = ?, updated_at = ? WHERE id = ?").run(r,o,t),this.getCommitment(t)}claimHeartbeatLease(t){this.db.exec("BEGIN IMMEDIATE");try{let r=this.db.prepare("SELECT * FROM leases WHERE idempotency_key = ?").get(t.idempotencyKey);if(r){if(r.status==="claimed"&&Date.parse(r.expires_at)<=Date.parse(t.now)){this.db.prepare(`UPDATE leases
480
+ LIMIT ?`).all(...n,t.limit).map(Ho)}getCapability(t){let r=this.db.prepare("SELECT * FROM capabilities WHERE uid = ?").get(t);return r?Ho(r):null}findOpenCommitmentBySummary(t,r){let o=this.db.prepare("SELECT * FROM commitments WHERE project_id = ? AND summary = ? AND status = 'open' ORDER BY created_at ASC LIMIT 1").get(t,r);return o?Fo(o):null}insertCommitment(t){this.db.prepare(`INSERT INTO commitments (id, project_id, summary, status, due_at, ttl_expires_at, source_json, created_at, updated_at)
481
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.project_id,t.summary,t.status,t.due_at,t.ttl_expires_at,JSON.stringify(t.source),t.created_at,t.updated_at);let r=this.getCommitment(t.id);if(!r)throw new Error(`Commitment not found after insert: ${t.id}`);return r}createOpenCommitmentIfMissing(t,r){this.db.exec("BEGIN IMMEDIATE");try{this.expireCommitments(r);let o=nc(t.summary),n=this.listCommitments({project:t.project_id,status:"open",includeExpired:!1,limit:200,now:r,skipExpire:!0}).find(a=>nc(a.summary)===o);if(n)return this.db.exec("COMMIT"),{created:!1,commitment:n};this.db.prepare(`INSERT INTO commitments (id, project_id, summary, status, due_at, ttl_expires_at, source_json, created_at, updated_at)
482
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.project_id,t.summary,t.status,t.due_at,t.ttl_expires_at,JSON.stringify(t.source),t.created_at,t.updated_at);let s=this.getCommitment(t.id);if(!s)throw new Error(`Commitment not found after insert: ${t.id}`);return this.db.exec("COMMIT"),{created:!0,commitment:s}}catch(o){throw this.db.exec("ROLLBACK"),o}}listCommitments(t){t.skipExpire||this.expireCommitments(t.now);let r=[],o=[];t.project&&(r.push("project_id = ?"),o.push(t.project)),t.status?(r.push("status = ?"),o.push(t.status)):t.includeExpired||r.push("status != 'expired'");let n=r.length?`WHERE ${r.join(" AND ")}`:"";return this.db.prepare(`SELECT * FROM commitments ${n} ORDER BY updated_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(Fo)}updateCommitmentStatus(t,r,o){return this.expireCommitments(o),this.db.prepare("UPDATE commitments SET status = ?, updated_at = ? WHERE id = ?").run(r,o,t),this.getCommitment(t)}claimHeartbeatLease(t){this.db.exec("BEGIN IMMEDIATE");try{let r=this.db.prepare("SELECT * FROM leases WHERE idempotency_key = ?").get(t.idempotencyKey);if(r){if(r.status==="claimed"&&Date.parse(r.expires_at)<=Date.parse(t.now)){this.db.prepare(`UPDATE leases
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:wr(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:wr(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(Bt(t.cost)),JSON.stringify(t.result),JSON.stringify({...Al(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:${El(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(wr)}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(Rr)}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(Rr)}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:Sr(r),claimed:!1,reason:r.status==="completed"?"LEASE_ALREADY_COMPLETED":"LEASE_OCCUPIED"}}this.db.prepare(`INSERT INTO leases (id, slot, holder, idempotency_key, expires_at, status, created_at, completed_at)
485
+ VALUES (?, ?, ?, ?, ?, 'claimed', ?, NULL)`).run(t.id,t.slot,t.holder,t.idempotencyKey,t.expiresAt,t.now);let o=this.getLeaseById(t.id);if(!o)throw new Error(`Lease not found after claim: ${t.id}`);return this.db.exec("COMMIT"),{lease:o,claimed:!0,reason:null}}catch(r){throw this.db.exec("ROLLBACK"),r}}completeHeartbeatLease(t){this.db.exec("BEGIN IMMEDIATE");try{let r=this.db.prepare("SELECT * FROM leases WHERE idempotency_key = ?").get(t.idempotencyKey);if(!r)throw new Error(`Heartbeat lease not found: ${t.idempotencyKey}`);if(r.status==="completed"){let s=this.latestHeartbeatRun(t.project,r.slot);return this.db.exec("COMMIT"),{lease:Sr(r),run:s,completed:!1}}if(r.status!=="claimed")throw new Error(`Heartbeat lease is not claimed: ${r.id}`);if(r.holder!==t.host)throw new Error(`Heartbeat lease holder mismatch: ${r.id}`);this.db.prepare("UPDATE leases SET status = 'completed', completed_at = ? WHERE id = ?").run(t.completedAt,r.id),this.db.prepare(`INSERT INTO runs (id, kind, host, project_id, status, cost_json, result_json, evidence_json, started_at, completed_at)
486
+ VALUES (?, 'heartbeat', ?, ?, 'completed', ?, ?, ?, ?, ?)`).run(t.runId,r.holder,t.project,JSON.stringify(qt(t.cost)),JSON.stringify(t.result),JSON.stringify({...Nl(t.evidence),slot:r.slot,lease_id:r.id}),r.created_at,t.completedAt);let o=this.getLeaseById(r.id),n=this.getHeartbeatRunById(t.runId);if(!o||!n)throw new Error(`Heartbeat completion did not persist for ${r.id}`);return this.db.exec("COMMIT"),{lease:o,run:n,completed:!0}}catch(r){throw this.db.exec("ROLLBACK"),r}}listHeartbeatLeases(t){let r=["idempotency_key LIKE ? ESCAPE '\\'"],o=[t.project?`heartbeat:${Ol(t.project)}:%`:"heartbeat:%"];return this.db.prepare(`SELECT * FROM leases WHERE ${r.join(" AND ")} ORDER BY created_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(Sr)}listHeartbeatRuns(t){let r=["kind = 'heartbeat'"],o=[];return t.project&&(r.push("project_id = ?"),o.push(t.project)),t.host&&(r.push("host = ?"),o.push(t.host)),this.db.prepare(`SELECT * FROM runs WHERE ${r.join(" AND ")} ORDER BY completed_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(Ar)}listHeartbeatRunsByWorkItem(t){let r=["kind = 'heartbeat'","json_extract(evidence_json, '$.work_item_id') = ?"],o=[t.workItemId];return t.project&&(r.push("project_id = ?"),o.push(t.project)),this.db.prepare(`SELECT * FROM runs WHERE ${r.join(" AND ")} ORDER BY completed_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(Ar)}listRunCostRows(t){let r=["completed_at IS NOT NULL"],o=[];t.project&&(r.push("project_id = ?"),o.push(t.project)),t.host&&(r.push("host = ?"),o.push(t.host)),t.since&&(r.push("completed_at >= ?"),o.push(t.since)),t.until&&(r.push("completed_at <= ?"),o.push(t.until));let n=t.limit===void 0?"":"LIMIT ?",s=t.limit===void 0?o:[...o,t.limit];return this.db.prepare(`SELECT
487
487
  runs.id,
488
488
  runs.kind,
489
489
  runs.host,
@@ -504,7 +504,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function fm(e){return{...kr(e),coun
504
504
  FROM runs
505
505
  WHERE ${r.join(" AND ")}
506
506
  ORDER BY runs.completed_at DESC, runs.id DESC
507
- ${n}`).all(...a)}upsertSchedule(t){this.db.prepare(`INSERT INTO schedules (id, host, mode, enabled, native_schedule_supported, native_id, desired_json, updated_at)
507
+ ${n}`).all(...s)}upsertSchedule(t){this.db.prepare(`INSERT INTO schedules (id, host, mode, enabled, native_schedule_supported, native_id, desired_json, updated_at)
508
508
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
509
509
  ON CONFLICT(id) DO UPDATE SET
510
510
  host = excluded.host,
@@ -513,13 +513,13 @@ LEFT JOIN activity a ON a.project_id = p.id`;function fm(e){return{...kr(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,je(t.enabled),je(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(Yn)}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?wr(r):null}getHeartbeatRunById(t){let r=this.db.prepare("SELECT * FROM runs WHERE id = ?").get(t);return r?Rr(r):null}latestHeartbeatRun(t,r){let o=this.db.prepare(`SELECT *
516
+ updated_at = excluded.updated_at`).run(t.id,t.host,t.mode,Te(t.enabled),Te(t.native_schedule_supported),t.native_id,JSON.stringify(t.desired),t.updated_at);let r=this.getSchedule(t.id);if(!r)throw new Error(`Schedule not found after upsert: ${t.id}`);return r}listSchedules(t){let r=[],o=[];t.host&&(r.push("host = ?"),o.push(t.host));let n=r.length?`WHERE ${r.join(" AND ")}`:"";return this.db.prepare(`SELECT * FROM schedules ${n} ORDER BY updated_at DESC, id ASC LIMIT ?`).all(...o,t.limit).map(os)}disableSchedule(t,r){return this.db.prepare("UPDATE schedules SET enabled = 0, updated_at = ? WHERE id = ?").run(r,t),this.getSchedule(t)}getLeaseById(t){let r=this.db.prepare("SELECT * FROM leases WHERE id = ?").get(t);return r?Sr(r):null}getHeartbeatRunById(t){let r=this.db.prepare("SELECT * FROM runs WHERE id = ?").get(t);return r?Ar(r):null}latestHeartbeatRun(t,r){let o=this.db.prepare(`SELECT *
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?Rr(o):null}getSchedule(t){let r=this.db.prepare("SELECT * FROM schedules WHERE id = ?").get(t);return r?Yn(r):null}getCommitment(t){let r=this.db.prepare("SELECT * FROM commitments WHERE id = ?").get(t);return r?Do(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 jm(this.db,t)?this.db.prepare(`SELECT COUNT(*) as count FROM ${t}`).get()?.count??0:0}};function _(e,t={}){return new Fo(e,t)}function xm(e){return`${Pm(e).href}?mode=ro&immutable=1`}function zl(e){return e.trim().replace(/\s+/gu," ").toLocaleLowerCase()}function jm(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 Bm,mkdir as Wm}from"node:fs/promises";import Jm from"node:os";import qm from"node:path";import{createHash as Im,randomUUID as Tm}from"node:crypto";function T(e){return`${e}_${Tm()}`}function A(e){return`sha256:${Im("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 be(e){return A(va(e))}import{existsSync as Nm}from"node:fs";import Ql from"node:os";var Yl=[{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 Om=Yl.map(e=>new RegExp(e.source,e.flags.includes("g")?e.flags:`${e.flags}g`));function O(e){let t=!1,r=e;for(let o of Om)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 $(e){if(typeof e=="string")return O(e).value;if(Array.isArray(e))return e.map(t=>$(t));if(e&&typeof e=="object"){let t={};for(let[r,o]of Object.entries(e))t[r]=$(o);return t}return e}function Kt(e,t=[process.cwd(),Ql.homedir()]){if(typeof e=="string")return t.filter(r=>r&&Nm(r)).reduce((r,o)=>r.replaceAll(o,o===Ql.homedir()?"[REDACTED_USER_HOME]":"[REDACTED_WORKSPACE]"),e);if(Array.isArray(e))return e.map(r=>Kt(r,t));if(e&&typeof e=="object"){let r={};for(let[o,n]of Object.entries(e))r[o]=Kt(n,t);return r}return e}import{mkdir as tc,readFile as Mm,writeFile as ka}from"node:fs/promises";import{constants as Lm,existsSync as rc}from"node:fs";import{access as Dm}from"node:fs/promises";import Hm from"node:os";import Te from"node:path";var Uo={"AGENTS.md":`# NativeSoul \u2014 Operating Instructions
522
+ LIMIT 1`).get(t,r);return o?Ar(o):null}getSchedule(t){let r=this.db.prepare("SELECT * FROM schedules WHERE id = ?").get(t);return r?os(r):null}getCommitment(t){let r=this.db.prepare("SELECT * FROM commitments WHERE id = ?").get(t);return r?Fo(r):null}expireCommitments(t){this.db.prepare("UPDATE commitments SET status = 'expired', updated_at = ? WHERE status = 'open' AND ttl_expires_at IS NOT NULL AND ttl_expires_at <= ?").run(t,t)}countTable(t){return this.db.prepare(`SELECT COUNT(*) as count FROM ${t}`).get()?.count??0}countDomainTable(t){return Um(this.db,t)?this.db.prepare(`SELECT COUNT(*) as count FROM ${t}`).get()?.count??0:0}};function _(e,t={}){return new Bo(e,t)}function Fm(e){return`${$m(e).href}?mode=ro&immutable=1`}function nc(e){return e.trim().replace(/\s+/gu," ").toLocaleLowerCase()}function Um(e,t){return e.prepare("SELECT EXISTS(SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?) AS exists_count").get(t)?.exists_count===1}import{appendFile as tg,mkdir as rg}from"node:fs/promises";import og from"node:os";import ng from"node:path";import{createHash as Vm,randomUUID as Bm}from"node:crypto";function T(e){return`${e}_${Bm()}`}function A(e){return`sha256:${Vm("sha256").update(e).digest("hex")}`}function Es(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(r=>Es(r)).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${Es(e[r]??null)}`).join(",")}}`}function ke(e){return A(Es(e))}import{existsSync as Jm}from"node:fs";import ac from"node:os";var sc=[{code:"NPM_TOKEN_ASSIGNMENT",source:`(?:^|[\\s"'])NPM_TOKEN\\s*[:=]\\s*["']?[A-Za-z0-9._-]{8,}`,flags:"gimu"},{code:"NPM_AUTH_TOKEN",source:"\\/\\/registry\\.npmjs\\.org\\/:_authToken\\s*=\\s*[A-Za-z0-9._-]+",flags:"gimu"},{code:"NPM_AUTH_ASSIGNMENT",source:`(?:^|[\\s"'])_auth\\s*=\\s*[A-Za-z0-9+/=_-]{12,}`,flags:"gimu"},{code:"NPM_TOKEN_VALUE",source:"npm_[A-Za-z0-9]{30,}",flags:"gu"},{code:"GITHUB_TOKEN",source:"(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{30,}",flags:"gu"},{code:"GITHUB_FINE_GRAINED_TOKEN",source:"github_pat_[A-Za-z0-9_]{40,}",flags:"gu"},{code:"OPENAI_PROJECT_KEY",source:"sk-(?:proj|svcacct|admin)-[A-Za-z0-9_-]{20,}",flags:"gu"},{code:"OPENAI_LEGACY_KEY",source:"sk-[A-Za-z0-9_-]{10,}",flags:"gu"},{code:"ANTHROPIC_KEY",source:"sk-ant-[A-Za-z0-9_-]{20,}",flags:"gu"},{code:"GOOGLE_API_KEY",source:"AIza[0-9A-Za-z_-]{30,}",flags:"gu"},{code:"SLACK_TOKEN",source:"xox[abopr]-[0-9A-Za-z-]{20,}",flags:"gu"},{code:"SLACK_WEBHOOK",source:"https:\\/\\/hooks\\.slack\\.com\\/services\\/[A-Za-z0-9/_-]{20,}",flags:"gu"},{code:"STRIPE_LIVE_KEY",source:"sk_live_[0-9A-Za-z]{20,}",flags:"gu"},{code:"AWS_ACCESS_KEY",source:"AKIA[0-9A-Z]{16}",flags:"gu"},{code:"AWS_SESSION_KEY",source:"ASIA[0-9A-Z]{16}",flags:"gu"},{code:"PRIVATE_KEY_BLOCK",source:"-----BEGIN [A-Z ]*PRIVATE KEY-----[\\s\\S]*?-----END [A-Z ]*PRIVATE KEY-----",flags:"gu"},{code:"PRIVATE_KEY_HEADER",source:"-----BEGIN [A-Z ]*PRIVATE KEY-----",flags:"gu"},{code:"AUTHORIZATION_BEARER",source:"Authorization:\\s*Bearer\\s+[A-Za-z0-9._~+/=-]{16,}",flags:"gimu"},{code:"JWT_VALUE",source:"eyJ[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}",flags:"gu"},{code:"SIGNING_SECRET_ASSIGNMENT",source:`(?:GPG_PRIVATE_KEY|COSIGN_PASSWORD|SIGSTORE_ID_TOKEN)\\s*[:=]\\s*["']?[^"'\\s]{8,}`,flags:"gimu"},{code:"GENERIC_SECRET_ASSIGNMENT",source:`(?:secret|password|api[_-]?key|auth[_-]?token|client_secret|webhook_secret)\\s*[:=]\\s*["']?[^"'\\s]{12,}["']?`,flags:"gimu"},{code:"GENERIC_ENV_SECRET_ASSIGNMENT",source:`[A-Z0-9_]*(?:TOKEN|SECRET|PASSWORD|API_KEY)\\s*=\\s*(?!sk-test-secret-value\\b)[^\\s"']{12,}`,flags:"gu"},{code:"ENV_DUMP",source:'"env"\\s*:\\s*\\{[^}]+(?:TOKEN|SECRET|PASSWORD|API_KEY)[^}]+\\}',flags:"gimu"}];var qm=sc.map(e=>new RegExp(e.source,e.flags.includes("g")?e.flags:`${e.flags}g`));function O(e){let t=!1,r=e;for(let o of qm)r=r.replace(o,n=>{t=!0;let s=n.match(/^(Authorization:\s*Bearer\s+)/iu);if(s?.[1])return`${s[1]}[REDACTED_SECRET]`;let a=n.match(/^([^:=]+[:=]\s*)/u);return a?.[1]?`${a[1]}[REDACTED_SECRET]`:"[REDACTED_SECRET]"});return{value:r,redacted:t}}function H(e){if(typeof e=="string")return O(e).value;if(Array.isArray(e))return e.map(t=>H(t));if(e&&typeof e=="object"){let t={};for(let[r,o]of Object.entries(e))t[r]=H(o);return t}return e}function zt(e,t=[process.cwd(),ac.homedir()]){if(typeof e=="string")return t.filter(r=>r&&Jm(r)).reduce((r,o)=>r.replaceAll(o,o===ac.homedir()?"[REDACTED_USER_HOME]":"[REDACTED_WORKSPACE]"),e);if(Array.isArray(e))return e.map(r=>zt(r,t));if(e&&typeof e=="object"){let r={};for(let[o,n]of Object.entries(e))r[o]=zt(n,t);return r}return e}import{mkdir as cc,readFile as Km,writeFile as Ps}from"node:fs/promises";import{constants as Gm,existsSync as dc}from"node:fs";import{access as Xm}from"node:fs/promises";import zm from"node:os";import Ne from"node:path";var Wo={"AGENTS.md":`# NativeSoul \u2014 Operating Instructions
523
523
 
524
524
  _Injected into every supported host via managed blocks. Keep operational rules here._
525
525
 
@@ -794,7 +794,7 @@ recall:
794
794
  - test
795
795
  - build
796
796
  note: UserPromptSubmit recall hooks are opt-in for first ship.
797
- `},Zl=`id: example-read-only
797
+ `},ic=`id: example-read-only
798
798
  allowed:
799
799
  - memory_search
800
800
  - life_recall
@@ -804,7 +804,7 @@ approval_required:
804
804
  - external_write
805
805
  - destructive_action
806
806
  source: standing-orders/example.yaml
807
- `;function ec(e){return`# Daily notes \u2014 ${e}
807
+ `;function lc(e){return`# Daily notes \u2014 ${e}
808
808
 
809
809
  _Running context for today. Promote durable facts to curated memory later._
810
810
 
@@ -819,8 +819,8 @@ _Running context for today. Promote durable facts to curated memory later._
819
819
  ## Follow-ups
820
820
 
821
821
  -
822
- `}var $m=["memory/daily","memory/projects","memory/archive","commitments","standing-orders","capabilities/cards","generated","state","logs","backups","proposals"],Fm=Uo;function oc(e){return Te.resolve(e??process.env.NATIVESOUL_HOME??Te.join(Hm.homedir(),".nativesoul"))}function f(e){let t=oc(e);return{home:t,database:Te.join(t,"state","nativesoul.sqlite"),auditLog:Te.join(t,"logs","audit.jsonl")}}async function R(e){try{return await Dm(e,Lm.F_OK),!0}catch{return!1}}async function v(e){let t=f(e),r=[],o=[],n=[];rc(t.home)||(await tc(t.home,{recursive:!0,mode:448}),r.push(t.home));for(let i of $m){let l=Te.join(t.home,i);rc(l)||(await tc(l,{recursive:!0,mode:448}),r.push(l))}let a=await R(Te.join(t.home,"state","onboarding.complete"));for(let[i,l]of Object.entries(Fm)){if(i==="BOOTSTRAP.md"&&a)continue;let c=Te.join(t.home,i);if(await R(c)){n.push(c);continue}try{await ka(c,l,{encoding:"utf8",mode:384,flag:"wx"}),o.push(c)}catch(d){if(Um(d)){n.push(c);continue}throw d}}let s=await Vm(t.home);return o.push(...s.createdFiles),n.push(...s.preservedFiles),{home:t.home,database:t.database,createdDirectories:r,createdFiles:o,preservedFiles:n}}function Um(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST"}async function Vm(e){let t=[],r=[],o=new Date().toISOString().slice(0,10),n=Te.join(e,"memory","daily",`${o}.md`);await R(n)?r.push(n):(await ka(n,ec(o),{encoding:"utf8",mode:384,flag:"wx"}),t.push(n));let a=Te.join(e,"standing-orders","example.yaml");return await R(a)?r.push(a):(await ka(a,Zl,{encoding:"utf8",mode:384,flag:"wx"}),t.push(a)),{createdFiles:t,preservedFiles:r}}async function ue(e,t){let r=Te.join(e,t);return await R(r)?Mm(r,"utf8"):""}async function h(e){let t=f(e.home),r=new Date().toISOString(),o=Ra($(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:be({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 Wm(qm.dirname(t.auditLog),{recursive:!0,mode:448}),await Bm(t.auditLog,`${JSON.stringify(n)}
823
- `,{encoding:"utf8",mode:384}),n}function Ra(e,t){if(typeof e=="string")return Km(e,t);if(Array.isArray(e))return e.map(r=>Ra(r,t));if(e&&typeof e=="object"){let r={};for(let[o,n]of Object.entries(e))r[o]=Ra(n,t);return r}return e}function Km(e,t){return[[new RegExp(wa(t),"gu"),"[REDACTED_NATIVESOUL_HOME]"],[new RegExp(wa(process.cwd()),"gu"),"[REDACTED_WORKSPACE]"],[new RegExp(wa(Jm.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 wa(e){return e.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}async function Vo(e){let t=f(e.home),r=_(t.database);try{return r.listEvents({type:e.type,result:e.result,limit:Gm(e.limit)})}finally{r.close()}}async function Sa(e){let t=f(e.home),r=await Vo(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 Gm(e){return Math.min(Math.max(e??50,1),500)}import jt from"node:path";import{mkdir as Pf,readdir as xf,readFile as qa,writeFile as jf}from"node:fs/promises";import{existsSync as If}from"node:fs";import Nr from"node:path";bt();se();Fe();se();import{readdir as ng}from"node:fs/promises";import pe from"node:path";var ve="antigravity",ag="~/.gemini/GEMINI.md",sg="~/.antigravity",Ea="official:antigravity-plugin-config:v1",lc="official:antigravity-hooks-config:v1",cc="official:antigravity-mcp-config:v1",dc="official:antigravity-command-config:v1",ig="official:antigravity-context-config:v1",lg="official:antigravity-features:v1",cg=[{uid:"antigravity:plugins",nativeKind:"plugins",normalizedKind:"package",relativePath:"plugins"}];function Pa(){let e=process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim();return e?pe.resolve(e):j(sg)}function dg(){let e=Pa();return{root:e,globalInstruction:process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim()?pe.join(e,"GEMINI.md"):j(ag)}}async function uc(){let e=[],t=dg();await P(t.globalInstruction)&&e.push({uid:"antigravity:global-gemini-md",host:ve,nativeKind:"global_context",normalizedKind:"instruction",source:t.globalInstruction,schemaHash:ig}),await ug(t.root,e),await pg(t.root,e);for(let r of cg){let o=pe.join(t.root,r.relativePath);await V(o)&&e.push({uid:r.uid,host:ve,nativeKind:r.nativeKind,normalizedKind:r.normalizedKind,source:o,schemaHash:Ea})}return e}async function ug(e,t){let r=pe.join(e,"plugin.json"),o=pe.join(e,"nativesoul-package.json"),n=pe.join(e,"hooks.json"),a=pe.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:ve,nativeKind:"plugin",normalizedKind:"extension",source:r,schemaHash:Ea})}if(i){let d=I(i,["name","id"])??"unknown";t.push({uid:`antigravity:package:${M(d)}`,host:ve,nativeKind:"native_plugin_package",normalizedKind:"package",source:o,schemaHash:Ea});let p=N(i.nativeSoul)?i.nativeSoul:{};for(let k of Wo(p.commands))t.push({uid:`antigravity:command:${M(k)}`,host:ve,nativeKind:"command",normalizedKind:"command",source:`${o}:nativeSoul.commands.${k}`,schemaHash:dc});let g=N(p.mcpServer)?p.mcpServer:null,y=I(g,["name"]);y&&t.push({uid:`antigravity:mcp:${M(y)}`,host:ve,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:nativeSoul.mcpServer.${y}`,schemaHash:cc})}if(l){t.push({uid:"antigravity:hooks:manifest",host:ve,nativeKind:"hooks",normalizedKind:"lifecycle_hooks",source:n,schemaHash:lc});let d=N(l.hooks)?l.hooks:{};for(let p of Object.keys(d))t.push({uid:`antigravity:hook:${M(p)}`,host:ve,nativeKind:"hook",normalizedKind:"lifecycle_hook",source:`${n}:hooks.${p}`,schemaHash:lc})}if(c)for(let d of Qe(c.mcpServers))t.push({uid:`antigravity:mcp:${M(d)}`,host:ve,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${a}:mcpServers.${d}`,schemaHash:cc});await mg(pe.join(e,"commands"),t)}async function pg(e,t){let r=pe.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:ve,nativeKind:"product_feature",normalizedKind:"feature_evidence",source:`${r}:${a}`,schemaHash:lg})}async function mg(e,t){if(!await V(e))return;let r=await ng(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||pe.extname(o.name)!==".md")continue;let n=pe.basename(o.name,".md");t.push({uid:`antigravity:command:${M(n,{allowSlash:!0})}`,host:ve,nativeKind:"command",normalizedKind:"command",source:pe.join(e,o.name),schemaHash:dc})}}se();Fe();import Jo from"node:path";async function pc(e){let t=await gg(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:N(r.contract)?{schedule:I(r.contract,["schedule"])??void 0,status:I(r.contract,["status"])??void 0,cancel:I(r.contract,["cancel"])??void 0,list:I(r.contract,["list"])??void 0,project_binding:I(r.contract,["project_binding"])??void 0}:void 0}:null}async function gg(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 Jo.join(Jo.resolve(r),"scheduler-proof.json");let o=e??j("~/.antigravity"),n=[Jo.join(o,"scheduler-proof.json"),Jo.join(o,"native-scheduler-proof.json")];for(let a of n)if(await P(a))return a;return null}function mc(e){if(!e)return!1;let t=Date.parse(e);return Number.isFinite(t)?Date.now()-t>10080*60*1e3:!0}var Gt="antigravity",xa="~/.gemini/GEMINI.md",ja=class{async detect(){let t=j(xa),r=Pa(),[o,n,a]=await Promise.all([P(t),V(r),He("agy")]);return{host:Gt,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 uc()}async hotProbe(){let t=await this.coldScan();return{host:Gt,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 pc(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(mc(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(xa),o=await J(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&&!Y(o,Gt)&&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(xa),r=await J(t);return{host:Gt,targetPath:t,startMarker:"<!-- nativesoul:antigravity:start v1 -->",endMarker:"<!-- nativesoul:antigravity:end -->",content:Ce(Gt),wouldCreate:r===null,wouldUpdate:r!==null&&!Y(r,Gt)}}};function gc(){return new ja}bt();Fe();se();import Xt from"node:path";import{readFile as Oc}from"node:fs/promises";Fe();import{readFile as Pc}from"node:fs/promises";import Eg from"node:path";var Ic="life:heartbeat";function Tc(e){if(!e||typeof e!="object"||Array.isArray(e))return{kind:"unknown",mode:"leader",apply:!1,skill:Ic};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:Ig(t),surface:jc(t.surface)??jc(N(t.desired)?t.desired.surface:void 0)}}async function Cc(e={}){let t=process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_FIXTURES;if(t)try{return xc(await Pc(Eg.join(t,"scheduled-tasks.json"),"utf8"))}catch{return null}let r=process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_MANIFEST;if(r)try{return xc(await Pc(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(()=>(Ec(),Ac));return o({apply:e.apply,surface:e.surface,hostConfigRoot:e.hostConfigRoot})}function Nc(e,t){return!e||e==="default"||!t?!0:e===t}function xc(e){let t=$e(e);if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t,o=Pg(r.surface),n=xg(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:jg(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 jc(e){return e==="default"||e==="claude-code"||e==="claude-desktop"?e:void 0}function Pg(e){return e==="claude-code"||e==="claude-desktop"||e==="cloud"?e:void 0}function xg(e){return e==="local_scheduled_task"||e==="cloud_routine"||e==="ui_only"?e:"unknown"}function jg(e){return e==="official_machine_readable"||e==="ui_only"||e==="unknown"?e:void 0}function Ig(e){return N(e.desired)&&typeof e.desired.skill=="string"&&e.desired.skill.trim().length>0?e.desired.skill.trim():Ic}var ie="claude",qo="~/.claude/CLAUDE.md",Mc="CLAUDE.md",Lc=".claude/CLAUDE.md",Dc="life:heartbeat",$c="official:claude-cli-hot-scan:v1",Ta=class{async detect(){let t=j(qo),r=Xt.resolve(Mc),o=Xt.resolve(Lc),[n,a,s,i]=await Promise.all([P(t),P(r),P(o),Bo("claude",["--version"])]);return{host:ie,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(qo),r=Xt.resolve(Mc),o=Xt.resolve(Lc),n=[];return await P(t)&&n.push({uid:"claude:global-claude-md",host:ie,nativeKind:"global_context",normalizedKind:"instruction",source:t}),await P(r)&&n.push({uid:"claude:project-claude-md",host:ie,nativeKind:"project_context",normalizedKind:"instruction",source:r}),await P(o)&&n.push({uid:"claude:project-dot-claude-md",host:ie,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 Tg(o,r);if(l.status==="ready")return l}let[n,a]=await Promise.all([Aa("claude",["mcp","list","--json"],1200),Aa("claude",["plugin","list","--json"],1200)]),s=[],i=[];return n.status==="ok"?i.push(...Fc(n.stdout)):s.push(Hc("CLAUDE_HOT_SCAN_JSON_UNSUPPORTED","claude mcp list --json",n.stderr)),a.status==="ok"?i.push(...Uc(a.stdout)):s.push(Hc("CLAUDE_HOT_SCAN_JSON_UNSUPPORTED","claude plugin list --json",a.stderr)),{host:ie,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=Tc(t),o=await Cc({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!==Dc?{status:"error",code:"CLAUDE_HEARTBEAT_SKILL_MISMATCH",message:`Claude heartbeat Scheduled Task must invoke ${Dc}.`}: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."}:Nc(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(qo),o=await J(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&&!Y(o,ie)&&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(qo),r=await J(t);return{host:ie,targetPath:t,startMarker:"<!-- nativesoul:claude:start v1 -->",endMarker:"<!-- nativesoul:claude:end -->",content:Ce(ie),wouldCreate:r===null,wouldUpdate:r!==null&&!Y(r,ie)}}};async function Tg(e,t){try{let[r,o]=await Promise.all([Oc(Xt.join(e,"mcp-list.json"),"utf8"),Oc(Xt.join(e,"plugin-list.json"),"utf8")]),n=[...Fc(r),...Uc(o)];return{host:ie,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:ie,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 Fc(e){let t=$e(e);return Ze(t,["servers","mcps","items"]).flatMap(r=>{let o=I(r,["name","id","server","server_name"]);if(!o)return[];let n=I(r,["status","state"]),a=n!=="disabled",s=n==="connected"||n==="ready"||n==="active"||n==="ok"||n==="authenticated";return[{uid:`claude:mcp:${M(o)}`,host:ie,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`claude mcp list:${o}`,schemaHash:$c,enabled:a,active:a,authenticated:re(r,["authenticated"])??s,healthy:a,ready:Vc(n)}]})}function Uc(e){let t=$e(e);return Ze(t,["plugins","items"]).flatMap(r=>{let o=I(r,["id","plugin","package"])??I(r,["name"]);if(!o)return[];let n=I(r,["status","state"]),a=re(r,["enabled"])??n!=="disabled",s=re(r,["installed"])??!0;return[{uid:`claude:plugin:${Cg(o)}`,host:ie,nativeKind:"plugin",normalizedKind:"extension",source:`claude plugin list --json:${o}`,schemaHash:$c,installed:s,enabled:a,active:a,authenticated:re(r,["authenticated"])??a,healthy:s,ready:a&&(n===null||Vc(n)||re(r,["enabled"])===!0)}]})}function Hc(e,t,r){let o=Ng(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 Vc(e){return e==="ready"||e==="enabled"||e==="active"||e==="ok"||e==="authenticated"||e==="connected"}function Cg(e){return M(e,{allowSlash:!0})}function Ng(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 Bc(){return new Ta}bt();Fe();se();import Ma from"node:path";var oe="codex",Go="~/.codex/AGENTS.md",Kc="AGENTS.md",Yg=1e3,Gc="life:heartbeat",zo="official:codex-app-server:v1",La=class{async detect(){let t=j(Go),r=Ma.resolve(Kc),[o,n,a]=await Promise.all([P(t),P(r),He("codex")]);return{host:oe,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(Go),r=Ma.resolve(Kc),o=[];return await P(t)&&o.push({uid:"codex:global-agents-md",host:oe,nativeKind:"global_context",normalizedKind:"instruction",source:t}),await P(r)&&o.push({uid:"codex:project-agents-md",host:oe,nativeKind:"project_context",normalizedKind:"instruction",source:r}),o}async hotProbe(t){let r=new Date().toISOString(),o=of(t);if(o){let i=await Oa(o,r);if(i.status==="ready")return i}let n=process.env.NATIVESOUL_CODEX_APP_SERVER_FIXTURES?.trim();if(n){let i=await Oa(af(n),r);if(i.status==="ready")return i}let a=nf(t);if(a){let i=await Oa(sf(a),r);if(i.status==="ready")return i}let s=await this.coldScan();return{host:oe,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(()=>(qc(),Jc)),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!==Gc?{status:"error",code:"CODEX_HEARTBEAT_SKILL_MISMATCH",message:`Codex heartbeat Automation must invoke ${Gc}.`}: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(Go),o=await J(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&&!Y(o,oe)&&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(Go),r=await J(t);return{host:oe,targetPath:t,startMarker:"<!-- nativesoul:codex:start v1 -->",endMarker:"<!-- nativesoul:codex:end -->",content:Ce(oe),wouldCreate:r===null,wouldUpdate:r!==null&&!Y(r,oe)}}};async function Oa(e,t){let[r,o,n,a]=await Promise.all([Xo(e,"mcpServerStatus/list"),Xo(e,"plugin/list"),Xo(e,"skills/list"),Xo(e,"app/list")]);if([r,o,n,a].some(l=>l===null))return{host:oe,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=[...Zg(r),...ef(o),...tf(n),...rf(a)];return{host:oe,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 Xo(e,t){try{return await e.call(t)}catch{return null}}async function Qg(e,t){let r=new AbortController,o=setTimeout(()=>r.abort(),Yg);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 N(a)&&"error"in a?null:N(a)&&"result"in a?a.result:a}catch{return null}finally{clearTimeout(o)}}function Zg(e){return Ze(e,["servers","mcpServers","items"]).flatMap(t=>{let r=I(t,["id","name","server","server_name"]);if(!r)return[];let o=I(t,["status","state"]),n=Yo(t,o);return[{uid:`codex:mcp:${M(r)}`,host:oe,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`codex app server mcpServerStatus/list:${r}`,schemaHash:zo,...n}]})}function ef(e){return Ze(e,["plugins","items"]).flatMap(t=>{let r=I(t,["id","plugin","package"])??I(t,["name"]);if(!r)return[];let o=I(t,["status","state"]),n=Yo(t,o);return[{uid:`codex:plugin:${Da(r)}`,host:oe,nativeKind:"plugin",normalizedKind:"extension",source:`codex app server plugin/list:${r}`,schemaHash:zo,...n}]})}function tf(e){return Ze(e,["skills","items"]).flatMap(t=>{let r=I(t,["id","name","path"]);if(!r)return[];let o=I(t,["status","state"]),n=Yo(t,o);return[{uid:`codex:skill:${Da(r)}`,host:oe,nativeKind:"skill",normalizedKind:"skill",source:`codex app server skills/list:${r}`,schemaHash:zo,...n}]})}function rf(e){return Ze(e,["apps","items"]).flatMap(t=>{let r=I(t,["id","name","app"]);if(!r)return[];let o=I(t,["status","state"]),n=Yo(t,o);return[{uid:`codex:app:${Da(r)}`,host:oe,nativeKind:"app_server_app",normalizedKind:"app",source:`codex app server app/list:${r}`,schemaHash:zo,...n}]})}function Yo(e,t){let r=re(e,["installed"])??!0,o=t==="disabled"||t==="unavailable",n=t==="error"||t==="unhealthy",a=re(e,["enabled"])??!o,s=re(e,["active"])??a,i=re(e,["healthy"])??(!o&&!n),l=re(e,["authenticated"])??re(e,["auth"])??!1,c=re(e,["ready"])??(r&&a&&s&&i);return{installed:r,enabled:a,active:s,authenticated:l,healthy:i,ready:c}}function of(e){if(N(e)){let t=e.appServer;if(N(t)&&typeof t.call=="function")return{call:r=>Promise.resolve(t.call(r))}}return null}function nf(e){if(N(e)){let t=e.appServerUrl;if(typeof t=="string"&&t.trim().length>0)return t.trim()}return process.env.NATIVESOUL_CODEX_APP_SERVER_URL?.trim()||process.env.CODEX_APP_SERVER_URL?.trim()||null}function af(e){return{async call(t){try{let{readFile:r}=await import("node:fs/promises"),o=t.replace(/\//gu,"-");return JSON.parse(await r(Ma.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 sf(e){return{call:t=>Qg(e,t)}}function Da(e){return M(e,{allowSlash:!0})}function Xc(){return new La}bt();Fe();se();import{readdir as Yc}from"node:fs/promises";import ke from"node:path";var Q="gemini",$a="~/.gemini/GEMINI.md",lf="~/.gemini/extensions",cf="~/.gemini/settings.json",Er="official:gemini-extension-config:v1",Ha="official:gemini-settings-config:v1",df="official:gemini-memory-config:v1",Fa=class{async detect(){let t=zc(),r=t.globalInstruction,o=t.extensionsDirectory,[n,a,s]=await Promise.all([P(r),V(o),Bo("gemini",["--version"])]);return{host:Q,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=zc(),o=r.globalInstruction;await P(o)&&t.push({uid:"gemini:global-gemini-md",host:Q,nativeKind:"global_context",normalizedKind:"memory",source:o,schemaHash:df}),await uf(r.settingsFile,t);let n=r.extensionsDirectory;if(await V(n)){t.push({uid:"gemini:extensions",host:Q,nativeKind:"extensions",normalizedKind:"package",source:n,schemaHash:Er});let a=await Yc(n,{withFileTypes:!0});for(let s of a)s.isDirectory()&&await pf(ke.join(n,s.name),s.name,t)}return t}async hotProbe(){let t=await this.coldScan();return{host:Q,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($a),o=await J(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&&!Y(o,Q)&&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($a),r=await J(t);return{host:Q,targetPath:t,startMarker:"<!-- nativesoul:gemini:start v1 -->",endMarker:"<!-- nativesoul:gemini:end -->",content:Ce(Q),wouldCreate:r===null,wouldUpdate:r!==null&&!Y(r,Q)}}};function zc(){let e=process.env.NATIVESOUL_GEMINI_INVENTORY_ROOT?.trim();if(e){let t=ke.resolve(e);return{globalInstruction:ke.join(t,"GEMINI.md"),settingsFile:ke.join(t,"settings.json"),extensionsDirectory:ke.join(t,"extensions")}}return{globalInstruction:j($a),settingsFile:j(cf),extensionsDirectory:j(lf)}}async function uf(e,t){let r=await z(e);if(r){t.push({uid:"gemini:settings",host:Q,nativeKind:"settings",normalizedKind:"config",source:e,schemaHash:Ha});for(let o of Qe(r.mcpServers))t.push({uid:`gemini:mcp:${M(o)}`,host:Q,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${e}:mcpServers.${o}`,schemaHash:Ha});for(let o of Qc(r.tools))t.push({uid:`gemini:tool:${M(o)}`,host:Q,nativeKind:"tool",normalizedKind:"tool",source:`${e}:tools.${o}`,schemaHash:Ha})}}async function pf(e,t,r){let o=ke.join(e,"gemini-extension.json"),n=await z(o),a=I(n,["name","id"])??t;if(r.push({uid:`gemini:extension:${M(a)}`,host:Q,nativeKind:"extension",normalizedKind:"package",source:n?o:e,schemaHash:n?Er:void 0}),n){for(let s of Qe(n.mcpServers))r.push({uid:`gemini:mcp:${M(s)}`,host:Q,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:mcpServers.${s}`,schemaHash:Er});for(let s of Qc(n.tools))r.push({uid:`gemini:tool:${M(s)}`,host:Q,nativeKind:"tool",normalizedKind:"tool",source:`${o}:tools.${s}`,schemaHash:Er})}await mf(ke.join(e,"commands"),r)}async function mf(e,t){if(!await V(e))return;let r=await Yc(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||![".toml",".md"].includes(ke.extname(o.name)))continue;let n=ke.basename(o.name,ke.extname(o.name));t.push({uid:`gemini:command:${M(n,{allowSlash:!0})}`,host:Q,nativeKind:"command",normalizedKind:"command",source:ke.join(e,o.name),schemaHash:Er})}}function Qc(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):Qe(e)}function Zc(){return new Fa}bt();Fe();se();import{readdir as nd}from"node:fs/promises";import W from"node:path";var B="grok",Qo="~/.grok/Agents.md",ed="AGENTS.md",td="Agents.md",rd="CLAUDE.md",gf="~/.grok",Ua="official:grok-plugin-config:v1",od="official:grok-hooks-config:v1",Va="official:grok-mcp-config:v1",ad="official:grok-command-config:v1",ff="official:grok-context-config:v1",hf=[{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"}],Ba=class{async detect(){let t=j(Qo),r=W.resolve(ed),o=W.resolve(td),n=W.resolve(rd),a=sd(),[s,i,l,c,d,p]=await Promise.all([P(t),P(r),P(o),P(n),V(a),He("grok")]),g=i||l;return{host:B,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=yf(),o=r.globalInstruction;await P(o)&&t.push({uid:"grok:global-agents-md",host:B,nativeKind:"global_context",normalizedKind:"instruction",source:o,schemaHash:ff});let n=W.resolve(ed);await P(n)&&t.push({uid:"grok:project-agents-md",host:B,nativeKind:"project_context",normalizedKind:"instruction",source:n});let a=W.resolve(td);await P(a)&&t.push({uid:"grok:project-agents-titlecase-md",host:B,nativeKind:"project_context",normalizedKind:"instruction",source:a});let s=W.resolve(rd);await P(s)&&t.push({uid:"grok:project-claude-md",host:B,nativeKind:"project_context",normalizedKind:"instruction",source:s});let i=r.root;await id(r.root,t),await _f(i,t);for(let l of hf){let c=W.join(i,l.relativePath);await V(c)&&t.push({uid:l.uid,host:B,nativeKind:l.nativeKind,normalizedKind:l.normalizedKind,source:c,schemaHash:l.relativePath==="mcps"?Va:Ua})}return vf(t)}async hotProbe(){let t=await this.coldScan();return{host:B,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(Qo),o=await J(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&&!Y(o,B)&&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(Qo),r=await J(t);return{host:B,targetPath:t,startMarker:"<!-- nativesoul:grok:start v1 -->",endMarker:"<!-- nativesoul:grok:end -->",content:Ce(B),wouldCreate:r===null,wouldUpdate:r!==null&&!Y(r,B)}}};function sd(){let e=process.env.NATIVESOUL_GROK_INVENTORY_ROOT?.trim();return e?W.resolve(e):j(gf)}function yf(){let e=sd();return{root:e,globalInstruction:process.env.NATIVESOUL_GROK_INVENTORY_ROOT?.trim()?W.join(e,"Agents.md"):j(Qo)}}async function id(e,t){let r=W.join(e,"plugin.json"),o=W.join(e,"nativesoul-package.json"),n=W.join(e,"hooks","hooks.json"),a=W.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:B,nativeKind:"plugin",normalizedKind:"extension",source:r,schemaHash:Ua})}if(i){let d=I(i,["name","id"])??"unknown";t.push({uid:`grok:package:${M(d)}`,host:B,nativeKind:"native_plugin_package",normalizedKind:"package",source:o,schemaHash:Ua});let p=N(i.nativeSoul)?i.nativeSoul:{};for(let k of Wo(p.commands))t.push({uid:`grok:command:${M(k)}`,host:B,nativeKind:"command",normalizedKind:"command",source:`${o}:nativeSoul.commands.${k}`,schemaHash:ad});let g=N(p.mcpServer)?p.mcpServer:null,y=I(g,["name"]);y&&t.push({uid:`grok:mcp:${M(y)}`,host:B,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:nativeSoul.mcpServer.${y}`,schemaHash:Va})}if(l){t.push({uid:"grok:hooks:manifest",host:B,nativeKind:"hooks",normalizedKind:"lifecycle_hooks",source:n,schemaHash:od});let d=N(l.hooks)?l.hooks:{};for(let p of Object.keys(d))t.push({uid:`grok:hook:${M(p)}`,host:B,nativeKind:"hook",normalizedKind:"lifecycle_hook",source:`${n}:hooks.${p}`,schemaHash:od})}if(c)for(let d of Qe(c.mcpServers))t.push({uid:`grok:mcp:${M(d)}`,host:B,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${a}:mcpServers.${d}`,schemaHash:Va});await bf(W.join(e,"commands"),t)}async function _f(e,t){let r=W.join(e,"plugins");if(!await V(r))return;let o=await nd(r,{withFileTypes:!0});for(let n of o)n.isDirectory()&&await id(W.join(r,n.name),t)}async function bf(e,t){if(!await V(e))return;let r=await nd(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||W.extname(o.name)!==".md")continue;let n=W.basename(o.name,".md");t.push({uid:`grok:command:${M(n,{allowSlash:!0})}`,host:B,nativeKind:"command",normalizedKind:"command",source:W.join(e,o.name),schemaHash:ad})}}function vf(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 ld(){return new Ba}import{mkdir as Zo,readFile as en,rm as kf,writeFile as tn}from"node:fs/promises";import{existsSync as rn}from"node:fs";import Pr from"node:path";function on(e){return{start:`<!-- nativesoul:${e}:start v1 -->`,end:`<!-- nativesoul:${e}:end -->`}}async function cd(e){let t=f(e.home),r=rn(e.targetPath),o=r?await en(e.targetPath,"utf8"):null,n=Rf(o,e.host,e.block),a=o===null?null:A(o),s=A(n),i=Sf(o,n,e.host),l=i!=="noop",c=!e.apply,d=l&&e.apply?await md(t.home,e.host,e.targetPath,r,o,s):null;l&&e.apply&&(await Zo(Pr.dirname(e.targetPath),{recursive:!0,mode:448}),await tn(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:gd(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 dd(e){let t=f(e.home),r=rn(e.targetPath),o=r?await en(e.targetPath,"utf8"):null,n=wf(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 md(t.home,e.host,e.targetPath,r,o,s):null;l&&e.apply&&n!==null&&(await Zo(Pr.dirname(e.targetPath),{recursive:!0,mode:448}),await tn(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:gd(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 ud(e){let t=rn(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 en(e.targetPath,"utf8"),n=on(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 pd(e){let t=f(e.home),r=JSON.parse(await en(e.snapshotPath,"utf8")),o=!e.apply;e.apply&&(r.beforeExists&&r.beforeContent!==null?(await Zo(Pr.dirname(r.targetPath),{recursive:!0,mode:448}),await tn(r.targetPath,r.beforeContent,{encoding:"utf8",mode:384})):rn(r.targetPath)&&await kf(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 wf(e,t){if(e===null)return null;let{start:r,end:o}=on(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(`
822
+ `}var Ym=["memory/daily","memory/projects","memory/archive","commitments","standing-orders","capabilities/cards","generated","state","logs","backups","proposals"],Qm=Wo;function uc(e){return Ne.resolve(e??process.env.NATIVESOUL_HOME??Ne.join(zm.homedir(),".nativesoul"))}function f(e){let t=uc(e);return{home:t,database:Ne.join(t,"state","nativesoul.sqlite"),auditLog:Ne.join(t,"logs","audit.jsonl")}}async function R(e){try{return await Xm(e,Gm.F_OK),!0}catch{return!1}}async function v(e){let t=f(e),r=[],o=[],n=[];dc(t.home)||(await cc(t.home,{recursive:!0,mode:448}),r.push(t.home));for(let i of Ym){let l=Ne.join(t.home,i);dc(l)||(await cc(l,{recursive:!0,mode:448}),r.push(l))}let s=await R(Ne.join(t.home,"state","onboarding.complete"));for(let[i,l]of Object.entries(Qm)){if(i==="BOOTSTRAP.md"&&s)continue;let c=Ne.join(t.home,i);if(await R(c)){n.push(c);continue}try{await Ps(c,l,{encoding:"utf8",mode:384,flag:"wx"}),o.push(c)}catch(d){if(Zm(d)){n.push(c);continue}throw d}}let a=await eg(t.home);return o.push(...a.createdFiles),n.push(...a.preservedFiles),{home:t.home,database:t.database,createdDirectories:r,createdFiles:o,preservedFiles:n}}function Zm(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST"}async function eg(e){let t=[],r=[],o=new Date().toISOString().slice(0,10),n=Ne.join(e,"memory","daily",`${o}.md`);await R(n)?r.push(n):(await Ps(n,lc(o),{encoding:"utf8",mode:384,flag:"wx"}),t.push(n));let s=Ne.join(e,"standing-orders","example.yaml");return await R(s)?r.push(s):(await Ps(s,ic,{encoding:"utf8",mode:384,flag:"wx"}),t.push(s)),{createdFiles:t,preservedFiles:r}}async function me(e,t){let r=Ne.join(e,t);return await R(r)?Km(r,"utf8"):""}async function h(e){let t=f(e.home),r=new Date().toISOString(),o=js(H(e.details??{}),t.home),n={id:T("evt"),type:e.type,actor:e.actor??"cli",origin:e.origin??"nativesoul",result:e.result??"ok",details:o,created_at:r,hash:ke({type:e.type,actor:e.actor??"cli",origin:e.origin??"nativesoul",result:e.result??"ok",details:o,created_at:r})},s=_(t.database);try{s.insertEvent(n)}finally{s.close()}return await rg(ng.dirname(t.auditLog),{recursive:!0,mode:448}),await tg(t.auditLog,`${JSON.stringify(n)}
823
+ `,{encoding:"utf8",mode:384}),n}function js(e,t){if(typeof e=="string")return sg(e,t);if(Array.isArray(e))return e.map(r=>js(r,t));if(e&&typeof e=="object"){let r={};for(let[o,n]of Object.entries(e))r[o]=js(n,t);return r}return e}function sg(e,t){return[[new RegExp(xs(t),"gu"),"[REDACTED_NATIVESOUL_HOME]"],[new RegExp(xs(process.cwd()),"gu"),"[REDACTED_WORKSPACE]"],[new RegExp(xs(og.homedir()),"gu"),"[REDACTED_USER_HOME]"],[/\/Users\/[A-Za-z0-9._-]+/gu,"[REDACTED_USER_HOME]"],[/\/home\/[A-Za-z0-9._-]+/gu,"[REDACTED_USER_HOME]"],[/[A-Z]:[\\/]+Users[\\/]+[A-Za-z0-9._-]+/gu,"[REDACTED_USER_HOME]"]].reduce((o,[n,s])=>o.replace(n,s),e)}function xs(e){return e.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}async function Jo(e){let t=f(e.home),r=_(t.database);try{return r.listEvents({type:e.type,result:e.result,limit:ag(e.limit)})}finally{r.close()}}async function Is(e){let t=f(e.home),r=await Jo(e);return await h({home:t.home,type:"audit_exported",details:{format:e.format,count:r.length,type:e.type??null,result:e.result??null}}),{format:e.format,events:r}}function ag(e){return Math.min(Math.max(e??50,1),500)}import jt from"node:path";import{mkdir as $f,readdir as Ff,readFile as Qs,writeFile as Uf}from"node:fs/promises";import{existsSync as Vf}from"node:fs";import Mr from"node:path";bt();le();Ue();le();import{readdir as hg}from"node:fs/promises";import ge from"node:path";var we="antigravity",yg="~/.gemini/GEMINI.md",_g="~/.antigravity",Cs="official:antigravity-plugin-config:v1",hc="official:antigravity-hooks-config:v1",yc="official:antigravity-mcp-config:v1",_c="official:antigravity-command-config:v1",bg="official:antigravity-context-config:v1",vg="official:antigravity-features:v1",kg=[{uid:"antigravity:plugins",nativeKind:"plugins",normalizedKind:"package",relativePath:"plugins"}];function Ns(){let e=process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim();return e?ge.resolve(e):j(_g)}function wg(){let e=Ns();return{root:e,globalInstruction:process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim()?ge.join(e,"GEMINI.md"):j(yg)}}async function bc(){let e=[],t=wg();await P(t.globalInstruction)&&e.push({uid:"antigravity:global-gemini-md",host:we,nativeKind:"global_context",normalizedKind:"instruction",source:t.globalInstruction,schemaHash:bg}),await Rg(t.root,e),await Sg(t.root,e);for(let r of kg){let o=ge.join(t.root,r.relativePath);await B(o)&&e.push({uid:r.uid,host:we,nativeKind:r.nativeKind,normalizedKind:r.normalizedKind,source:o,schemaHash:Cs})}return e}async function Rg(e,t){let r=ge.join(e,"plugin.json"),o=ge.join(e,"nativesoul-package.json"),n=ge.join(e,"hooks.json"),s=ge.join(e,"mcp_config.json"),[a,i,l,c]=await Promise.all([Y(r),Y(o),Y(n),Y(s)]);if(a){let d=I(a,["name","id"])??"unknown";t.push({uid:`antigravity:plugin:${M(d)}`,host:we,nativeKind:"plugin",normalizedKind:"extension",source:r,schemaHash:Cs})}if(i){let d=I(i,["name","id"])??"unknown";t.push({uid:`antigravity:package:${M(d)}`,host:we,nativeKind:"native_plugin_package",normalizedKind:"package",source:o,schemaHash:Cs});let p=N(i.nativeSoul)?i.nativeSoul:{};for(let k of Ko(p.commands))t.push({uid:`antigravity:command:${M(k)}`,host:we,nativeKind:"command",normalizedKind:"command",source:`${o}:nativeSoul.commands.${k}`,schemaHash:_c});let g=N(p.mcpServer)?p.mcpServer:null,y=I(g,["name"]);y&&t.push({uid:`antigravity:mcp:${M(y)}`,host:we,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:nativeSoul.mcpServer.${y}`,schemaHash:yc})}if(l){t.push({uid:"antigravity:hooks:manifest",host:we,nativeKind:"hooks",normalizedKind:"lifecycle_hooks",source:n,schemaHash:hc});let d=N(l.hooks)?l.hooks:{};for(let p of Object.keys(d))t.push({uid:`antigravity:hook:${M(p)}`,host:we,nativeKind:"hook",normalizedKind:"lifecycle_hook",source:`${n}:hooks.${p}`,schemaHash:hc})}if(c)for(let d of Qe(c.mcpServers))t.push({uid:`antigravity:mcp:${M(d)}`,host:we,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${s}:mcpServers.${d}`,schemaHash:yc});await Ag(ge.join(e,"commands"),t)}async function Sg(e,t){let r=ge.join(e,"features-evidence.json"),o=await Y(r);if(!o)return;let n=["scheduled_tasks","cron_schedules","background_agents","subagents","skills","mcps","json_hooks"];for(let s of n)o[s]===!0&&t.push({uid:`antigravity:feature:${s.replace(/_/gu,"-")}`,host:we,nativeKind:"product_feature",normalizedKind:"feature_evidence",source:`${r}:${s}`,schemaHash:vg})}async function Ag(e,t){if(!await B(e))return;let r=await hg(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||ge.extname(o.name)!==".md")continue;let n=ge.basename(o.name,".md");t.push({uid:`antigravity:command:${M(n,{allowSlash:!0})}`,host:we,nativeKind:"command",normalizedKind:"command",source:ge.join(e,o.name),schemaHash:_c})}}le();Ue();import Go from"node:path";async function vc(e){let t=await Eg(e);if(!t)return null;let r=await Y(t);return r?{product_features_verified:r.product_features_verified===!0,write_contract_verified:r.write_contract_verified===!0,native_id:typeof r.native_id=="string"&&r.native_id.trim().length>0?r.native_id.trim():void 0,enabled:typeof r.enabled=="boolean"?r.enabled:void 0,updated_at:typeof r.updated_at=="string"?r.updated_at:void 0,contract:N(r.contract)?{schedule:I(r.contract,["schedule"])??void 0,status:I(r.contract,["status"])??void 0,cancel:I(r.contract,["cancel"])??void 0,list:I(r.contract,["list"])??void 0,project_binding:I(r.contract,["project_binding"])??void 0}:void 0}:null}async function Eg(e){let t=process.env.NATIVESOUL_ANTIGRAVITY_SCHEDULER_MANIFEST?.trim();if(t)return t;let r=process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim();if(r)return Go.join(Go.resolve(r),"scheduler-proof.json");let o=e??j("~/.antigravity"),n=[Go.join(o,"scheduler-proof.json"),Go.join(o,"native-scheduler-proof.json")];for(let s of n)if(await P(s))return s;return null}function kc(e){if(!e)return!1;let t=Date.parse(e);return Number.isFinite(t)?Date.now()-t>10080*60*1e3:!0}var Yt="antigravity",Os="~/.gemini/GEMINI.md",Ms=class{async detect(){let t=j(Os),r=Ns(),[o,n,s]=await Promise.all([P(t),B(r),$e("agy")]);return{host:Yt,detected:n||s!==null,path:n?r:s??(o?t:void 0),capabilities:{installed:n||s!==null,enabled:n,active:!1,authenticated:!1,healthy:s!==null||n,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Antigravity direct adapter writes are disabled; use the install orchestrator to install the NativeSoul native hook plugin, MCP registration, and managed block."}}async uninstall(t){return{status:"unsupported",reason:"Antigravity direct adapter uninstall is disabled; use the uninstall orchestrator for reversible package removal."}}async coldScan(){return bc()}async hotProbe(){let t=await this.coldScan();return{host:Yt,checkedAt:new Date().toISOString(),capabilities:t.map(r=>({...r,installed:!0,enabled:!0,active:r.nativeKind==="global_context",authenticated:!1,healthy:!0,allowed:!0,ready:r.schemaHash?.startsWith("official:")===!0}))}}async bootstrap(){return{tier:"A",mechanism:"hook",supported:!0}}async reload(t){return{status:"unsupported",reason:"Antigravity reload is host-driven; use the installed NativeSoul command package or restart the host if needed."}}async update(t){return{status:"unsupported",reason:"Antigravity package updates are handled by the NativeSoul install orchestrator."}}async scheduleReconcile(t){let r=await vc(t.hostConfigRoot);if(!r?.product_features_verified)return{status:"unsupported",reason:"Antigravity Scheduled Tasks product-level evidence was not detected; no hidden cron fallback installed."};if(!r.write_contract_verified)return{status:"unsupported",reason:"Antigravity product-level Scheduled Tasks are documented, but scheduler write/list/cancel/status contract proof is missing; keep full-native blocked_by_host:scheduler_write_contract_missing."};if(!r.contract?.schedule||!r.contract.status||!r.contract.cancel||!r.contract.list)return{status:"unsupported",reason:"Antigravity scheduler proof is missing one or more required commands: schedule, status, cancel, list."};if(r.enabled===!1)return{status:"degraded",reason:"Antigravity scheduler contract was detected, but the NativeSoul scheduled task is disabled."};if(!r.native_id)return{status:"degraded",reason:"Antigravity scheduler contract was detected, but no native task id mapping was returned."};if(kc(r.updated_at))return{status:"degraded",reason:"Antigravity scheduler proof is stale; re-run scheduler status/list before claiming full-native."};let o=t.apply?"reconciled":"reconcile planned";return{status:"ok",nativeId:r.native_id,message:`Antigravity Scheduled Task ${o}: ${r.native_id}`}}async doctor(){let t=await this.detect(),r=j(Os),o=await q(r),n=[];return t.detected||n.push({code:"ANTIGRAVITY_NOT_DETECTED",severity:"warn",message:"No Antigravity CLI or ~/.antigravity directory was detected. A shared ~/.gemini/GEMINI.md alone is not treated as Antigravity readiness.",remediation:"Install Antigravity CLI or review `nativesoul adapters managed-block --host antigravity --json`."}),o&&!Z(o,Yt)&&n.push({code:"ANTIGRAVITY_MANAGED_BLOCK_MISSING",severity:"info",message:"GEMINI.md exists but has no NativeSoul managed block for Antigravity.",remediation:"Review `nativesoul adapters managed-block --host antigravity --json`."}),n}async managedBlockPreview(){let t=j(Os),r=await q(t);return{host:Yt,targetPath:t,startMarker:"<!-- nativesoul:antigravity:start v1 -->",endMarker:"<!-- nativesoul:antigravity:end -->",content:Oe(Yt),wouldCreate:r===null,wouldUpdate:r!==null&&!Z(r,Yt)}}};function wc(){return new Ms}bt();Ue();le();import Qt from"node:path";import{readFile as Vc}from"node:fs/promises";Ue();import{readFile as Mc}from"node:fs/promises";import Hg from"node:path";var Hc="life:heartbeat";function $c(e){if(!e||typeof e!="object"||Array.isArray(e))return{kind:"unknown",mode:"leader",apply:!1,skill:Hc};let t=e;return{kind:typeof t.kind=="string"?t.kind:"unknown",mode:typeof t.mode=="string"?t.mode:"leader",apply:t.apply===!0,skill:Vg(t),surface:Dc(t.surface)??Dc(N(t.desired)?t.desired.surface:void 0)}}async function Fc(e={}){let t=process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_FIXTURES;if(t)try{return Lc(await Mc(Hg.join(t,"scheduled-tasks.json"),"utf8"))}catch{return null}let r=process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_MANIFEST;if(r)try{return Lc(await Mc(r,"utf8"))}catch{return null}if(process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_SUPPORTED==="1")return{supported:!0,native_id:process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_NATIVE_ID,surface:"claude-desktop",scheduler_kind:"unknown",creation_surface:"unknown",evidence_source:"env"};let{discoverClaudeScheduledTasksManifest:o}=await Promise.resolve().then(()=>(Oc(),Nc));return o({apply:e.apply,surface:e.surface,hostConfigRoot:e.hostConfigRoot})}function Uc(e,t){return!e||e==="default"||!t?!0:e===t}function Lc(e){let t=Fe(e);if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t,o=$g(r.surface),n=Fg(r.scheduler_kind??r.kind);return{supported:r.supported===!0,native_id:typeof r.native_id=="string"&&r.native_id.length>0?r.native_id:void 0,surface:o??(n==="cloud_routine"?"cloud":"claude-desktop"),scheduler_kind:n,creation_surface:Ug(r.creation_surface),evidence_source:typeof r.evidence_source=="string"&&r.evidence_source.trim().length>0?r.evidence_source.trim():void 0,enabled:typeof r.enabled=="boolean"?r.enabled:void 0}}function Dc(e){return e==="default"||e==="claude-code"||e==="claude-desktop"?e:void 0}function $g(e){return e==="claude-code"||e==="claude-desktop"||e==="cloud"?e:void 0}function Fg(e){return e==="local_scheduled_task"||e==="cloud_routine"||e==="ui_only"?e:"unknown"}function Ug(e){return e==="official_machine_readable"||e==="ui_only"||e==="unknown"?e:void 0}function Vg(e){return N(e.desired)&&typeof e.desired.skill=="string"&&e.desired.skill.trim().length>0?e.desired.skill.trim():Hc}var ce="claude",Xo="~/.claude/CLAUDE.md",Bc="CLAUDE.md",Wc=".claude/CLAUDE.md",Jc="life:heartbeat",Kc="official:claude-cli-hot-scan:v1",Ds=class{async detect(){let t=j(Xo),r=Qt.resolve(Bc),o=Qt.resolve(Wc),[n,s,a,i]=await Promise.all([P(t),P(r),P(o),qo("claude",["--version"])]);return{host:ce,detected:n||s||a||i!==null,version:i??void 0,path:n?t:s?r:a?o:void 0,capabilities:{installed:n||s||a||i!==null,enabled:n||s||a,active:s||a,authenticated:!1,healthy:i!==null||n||s||a,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Claude install writes are not implemented in M2.1; use managed-block preview first."}}async uninstall(t){return{status:"unsupported",reason:"Claude uninstall writes are not implemented in M2.1."}}async coldScan(){let t=j(Xo),r=Qt.resolve(Bc),o=Qt.resolve(Wc),n=[];return await P(t)&&n.push({uid:"claude:global-claude-md",host:ce,nativeKind:"global_context",normalizedKind:"instruction",source:t}),await P(r)&&n.push({uid:"claude:project-claude-md",host:ce,nativeKind:"project_context",normalizedKind:"instruction",source:r}),await P(o)&&n.push({uid:"claude:project-dot-claude-md",host:ce,nativeKind:"project_context",normalizedKind:"instruction",source:o}),n}async hotProbe(t){let r=new Date().toISOString(),o=process.env.NATIVESOUL_CLAUDE_HOT_SCAN_FIXTURES?.trim();if(o){let l=await Bg(o,r);if(l.status==="ready")return l}let[n,s]=await Promise.all([Ts("claude",["mcp","list","--json"],1200),Ts("claude",["plugin","list","--json"],1200)]),a=[],i=[];return n.status==="ok"?i.push(...Gc(n.stdout)):a.push(qc("CLAUDE_HOT_SCAN_JSON_UNSUPPORTED","claude mcp list --json",n.stderr)),s.status==="ok"?i.push(...Xc(s.stdout)):a.push(qc("CLAUDE_HOT_SCAN_JSON_UNSUPPORTED","claude plugin list --json",s.stderr)),{host:ce,checkedAt:r,status:a.length===0?"ready":"degraded",warnings:a.map(l=>l.code),remediation:a.length===0?void 0:"Upgrade Claude Code CLI if JSON hot-scan commands are unavailable.",capabilities:i.map(l=>({...l,installed:l.installed??!0,enabled:l.enabled??!0,active:l.active??!0,authenticated:l.authenticated??!1,healthy:l.healthy??!0,allowed:!0,ready:l.ready??!1})),diagnostics:a}}async bootstrap(){return{tier:"B",mechanism:"global-instruction",supported:!0}}async reload(t){return{status:"unsupported",reason:"Claude reload is deferred until plugin lifecycle integration story."}}async update(t){return{status:"unsupported",reason:"Claude update is deferred until plugin lifecycle integration story."}}async scheduleReconcile(t){let r=$c(t),o=await Fc({apply:r.apply,surface:r.surface,hostConfigRoot:t.hostConfigRoot});return o?.supported?r.kind!=="heartbeat"?{status:"unsupported",reason:"Claude adapter only supports NativeSoul heartbeat scheduled tasks."}:r.skill!==Jc?{status:"error",code:"CLAUDE_HEARTBEAT_SKILL_MISMATCH",message:`Claude heartbeat Scheduled Task must invoke ${Jc}.`}:o.scheduler_kind==="cloud_routine"||o.surface==="cloud"?{status:"unsupported",reason:"Claude cloud routines were detected, but they are out-of-scope for local native Scheduled Tasks evidence."}:o.scheduler_kind==="ui_only"||o.creation_surface==="ui_only"?{status:"unsupported",reason:"Claude task creation is UI-only for this surface; keep status blocked_by_host until a documented machine-readable surface returns a local task id."}:Uc(r.surface,o.surface)?o.enabled===!1?{status:"degraded",reason:"Claude Scheduled Tasks support was detected, but the NativeSoul task is disabled."}:o.native_id?{status:"ok",nativeId:o.native_id,message:r.apply?`Claude Scheduled Task reconciled: ${o.native_id}`:`Claude Scheduled Task reconcile planned: ${o.native_id}`}:{status:"degraded",reason:"Claude Scheduled Tasks support was detected, but no native task id mapping was returned."}:{status:"unsupported",reason:`Claude Scheduled Tasks evidence is for ${o.surface??"unknown"} and does not satisfy ${r.surface}.`}:{status:"unsupported",reason:"Claude Scheduled Tasks native interface was not detected; no cron fallback installed."}}async doctor(){let t=await this.detect(),r=j(Xo),o=await q(r),n=[];return t.detected||n.push({code:"CLAUDE_NOT_DETECTED",severity:"warn",message:"No Claude CLI or CLAUDE.md instruction file was detected.",remediation:"Install Claude Code or create a managed block preview before enabling writes."}),o&&!Z(o,ce)&&n.push({code:"CLAUDE_MANAGED_BLOCK_MISSING",severity:"info",message:"Claude global CLAUDE.md exists but has no NativeSoul managed block.",remediation:"Review `nativesoul adapters managed-block --host claude --json`."}),n}async managedBlockPreview(){let t=j(Xo),r=await q(t);return{host:ce,targetPath:t,startMarker:"<!-- nativesoul:claude:start v1 -->",endMarker:"<!-- nativesoul:claude:end -->",content:Oe(ce),wouldCreate:r===null,wouldUpdate:r!==null&&!Z(r,ce)}}};async function Bg(e,t){try{let[r,o]=await Promise.all([Vc(Qt.join(e,"mcp-list.json"),"utf8"),Vc(Qt.join(e,"plugin-list.json"),"utf8")]),n=[...Gc(r),...Xc(o)];return{host:ce,checkedAt:t,status:"ready",warnings:[],capabilities:n.map(s=>({...s,installed:s.installed??!0,enabled:s.enabled??!0,active:s.active??!0,authenticated:s.authenticated??!1,healthy:s.healthy??!0,allowed:!0,ready:s.ready??!1}))}}catch{return{host:ce,checkedAt:t,status:"degraded",warnings:["CLAUDE_HOT_SCAN_FIXTURES_UNAVAILABLE"],remediation:"Set NATIVESOUL_CLAUDE_HOT_SCAN_FIXTURES to a directory containing mcp-list.json and plugin-list.json.",capabilities:[],diagnostics:[{code:"CLAUDE_HOT_SCAN_FIXTURES_UNAVAILABLE",severity:"warn",message:"Claude hot-scan fixtures were configured but could not be read.",remediation:"Verify NATIVESOUL_CLAUDE_HOT_SCAN_FIXTURES points at mcp-list.json and plugin-list.json."}]}}}function Gc(e){let t=Fe(e);return Ze(t,["servers","mcps","items"]).flatMap(r=>{let o=I(r,["name","id","server","server_name"]);if(!o)return[];let n=I(r,["status","state"]),s=n!=="disabled",a=n==="connected"||n==="ready"||n==="active"||n==="ok"||n==="authenticated";return[{uid:`claude:mcp:${M(o)}`,host:ce,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`claude mcp list:${o}`,schemaHash:Kc,enabled:s,active:s,authenticated:ne(r,["authenticated"])??a,healthy:s,ready:zc(n)}]})}function Xc(e){let t=Fe(e);return Ze(t,["plugins","items"]).flatMap(r=>{let o=I(r,["id","plugin","package"])??I(r,["name"]);if(!o)return[];let n=I(r,["status","state"]),s=ne(r,["enabled"])??n!=="disabled",a=ne(r,["installed"])??!0;return[{uid:`claude:plugin:${Wg(o)}`,host:ce,nativeKind:"plugin",normalizedKind:"extension",source:`claude plugin list --json:${o}`,schemaHash:Kc,installed:a,enabled:s,active:s,authenticated:ne(r,["authenticated"])??s,healthy:a,ready:s&&(n===null||zc(n)||ne(r,["enabled"])===!0)}]})}function qc(e,t,r){let o=Jg(r.trim()||"command unavailable or unsupported by installed Claude CLI");return{code:e,severity:"warn",message:`${t} did not return supported JSON output: ${o}`,remediation:"Upgrade Claude Code CLI or run `claude mcp list --json` / `claude plugin list --json` manually to confirm support."}}function zc(e){return e==="ready"||e==="enabled"||e==="active"||e==="ok"||e==="authenticated"||e==="connected"}function Wg(e){return M(e,{allowSlash:!0})}function Jg(e){return e.replace(/\b[A-Z0-9_]*(?:TOKEN|SECRET|PASSWORD|API[_-]?KEY)[A-Z0-9_]*\s*=\s*\S+/giu,"[REDACTED_SECRET]").replace(/\bsk-[A-Za-z0-9_-]{8,}\b/gu,"[REDACTED_SECRET]")}function Yc(){return new Ds}bt();Ue();le();import Us from"node:path";var se="codex",Yo="~/.codex/AGENTS.md",td="AGENTS.md",df=1e3,rd="life:heartbeat",Zo="official:codex-app-server:v1",Vs=class{async detect(){let t=j(Yo),r=Us.resolve(td),[o,n,s]=await Promise.all([P(t),P(r),$e("codex")]);return{host:se,detected:o||n||s!==null,path:o?t:n?r:s??void 0,capabilities:{installed:o||n||s!==null,enabled:o||n,active:n,authenticated:!1,healthy:s!==null||o||n,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Codex install writes are not implemented in M2.1; use managed-block preview first."}}async uninstall(t){return{status:"unsupported",reason:"Codex uninstall writes are not implemented in M2.1."}}async coldScan(){let t=j(Yo),r=Us.resolve(td),o=[];return await P(t)&&o.push({uid:"codex:global-agents-md",host:se,nativeKind:"global_context",normalizedKind:"instruction",source:t}),await P(r)&&o.push({uid:"codex:project-agents-md",host:se,nativeKind:"project_context",normalizedKind:"instruction",source:r}),o}async hotProbe(t){let r=new Date().toISOString(),o=hf(t);if(o){let i=await Fs(o,r);if(i.status==="ready")return i}let n=process.env.NATIVESOUL_CODEX_APP_SERVER_FIXTURES?.trim();if(n){let i=await Fs(_f(n),r);if(i.status==="ready")return i}let s=yf(t);if(s){let i=await Fs(bf(s),r);if(i.status==="ready")return i}let a=await this.coldScan();return{host:se,checkedAt:r,status:"degraded",warnings:["CODEX_APP_SERVER_UNAVAILABLE"],remediation:"Start Codex App Server and set NATIVESOUL_CODEX_APP_SERVER_URL before running `nativesoul adapters hot-scan --host codex`.",capabilities:a.map(i=>({...i,source:`codex app server fallback config scan:${i.source}`,installed:!0,enabled:!0,active:i.uid.includes("project"),authenticated:!1,healthy:!0,allowed:!0,ready:!1})),diagnostics:[{code:"CODEX_APP_SERVER_UNAVAILABLE",severity:"warn",message:"Codex App Server inventory endpoint is not configured or did not respond with supported JSON.",remediation:"Set NATIVESOUL_CODEX_APP_SERVER_URL to a reachable Codex App Server endpoint."}]}}async bootstrap(){return{tier:"B",mechanism:"global-instruction",supported:!0}}async reload(t){return{status:"unsupported",reason:"Codex reload is deferred until App Server integration story."}}async update(t){return{status:"unsupported",reason:"Codex update is deferred until marketplace/App Server integration story."}}async scheduleReconcile(t){let{discoverCodexAutomationsManifest:r}=await Promise.resolve().then(()=>(ed(),Zc)),o=await r({apply:t.apply,hostConfigRoot:t.hostConfigRoot});return o?.supported?t.kind!=="heartbeat"?{status:"unsupported",reason:"Codex adapter only supports NativeSoul heartbeat automations."}:t.desired.skill!==rd?{status:"error",code:"CODEX_HEARTBEAT_SKILL_MISMATCH",message:`Codex heartbeat Automation must invoke ${rd}.`}:o.native_id?{status:"ok",nativeId:o.native_id,message:t.apply?`Codex Automation reconciled: ${o.native_id}`:`Codex Automation reconcile planned: ${o.native_id}`}:{status:"degraded",reason:"Codex Automations support was detected, but no native automation id mapping was returned."}:{status:"unsupported",reason:"Codex Automations native interface was not detected; no cron fallback installed."}}async doctor(){let t=await this.detect(),r=j(Yo),o=await q(r),n=[];return t.detected||n.push({code:"CODEX_NOT_DETECTED",severity:"warn",message:"No Codex CLI or AGENTS.md instruction file was detected.",remediation:"Install Codex or create a managed block preview before enabling writes."}),o&&!Z(o,se)&&n.push({code:"CODEX_MANAGED_BLOCK_MISSING",severity:"info",message:"Codex global AGENTS.md exists but has no NativeSoul managed block.",remediation:"Review `nativesoul adapters managed-block --host codex --json`."}),n}async managedBlockPreview(){let t=j(Yo),r=await q(t);return{host:se,targetPath:t,startMarker:"<!-- nativesoul:codex:start v1 -->",endMarker:"<!-- nativesoul:codex:end -->",content:Oe(se),wouldCreate:r===null,wouldUpdate:r!==null&&!Z(r,se)}}};async function Fs(e,t){let[r,o,n,s]=await Promise.all([Qo(e,"mcpServerStatus/list"),Qo(e,"plugin/list"),Qo(e,"skills/list"),Qo(e,"app/list")]);if([r,o,n,s].some(l=>l===null))return{host:se,checkedAt:t,status:"degraded",warnings:["CODEX_APP_SERVER_UNAVAILABLE"],remediation:"Ensure Codex App Server is running and supports mcpServerStatus/list, plugin/list, skills/list, and app/list.",capabilities:[],diagnostics:[{code:"CODEX_APP_SERVER_UNAVAILABLE",severity:"warn",message:"Codex App Server did not return supported JSON inventory for all required methods.",remediation:"Check NATIVESOUL_CODEX_APP_SERVER_URL and Codex App Server version."}]};let i=[...pf(r),...mf(o),...gf(n),...ff(s)];return{host:se,checkedAt:t,status:"ready",warnings:[],capabilities:i.map(l=>({...l,installed:l.installed??!0,enabled:l.enabled??!0,active:l.active??!0,authenticated:l.authenticated??!1,healthy:l.healthy??!0,allowed:!0,ready:l.ready??!1}))}}async function Qo(e,t){try{return await e.call(t)}catch{return null}}async function uf(e,t){let r=new AbortController,o=setTimeout(()=>r.abort(),df);try{let n=await fetch(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:t,method:t,params:{}}),signal:r.signal});if(!n.ok)return null;let s=await n.json();return N(s)&&"error"in s?null:N(s)&&"result"in s?s.result:s}catch{return null}finally{clearTimeout(o)}}function pf(e){return Ze(e,["servers","mcpServers","items"]).flatMap(t=>{let r=I(t,["id","name","server","server_name"]);if(!r)return[];let o=I(t,["status","state"]),n=en(t,o);return[{uid:`codex:mcp:${M(r)}`,host:se,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`codex app server mcpServerStatus/list:${r}`,schemaHash:Zo,...n}]})}function mf(e){return Ze(e,["plugins","items"]).flatMap(t=>{let r=I(t,["id","plugin","package"])??I(t,["name"]);if(!r)return[];let o=I(t,["status","state"]),n=en(t,o);return[{uid:`codex:plugin:${Bs(r)}`,host:se,nativeKind:"plugin",normalizedKind:"extension",source:`codex app server plugin/list:${r}`,schemaHash:Zo,...n}]})}function gf(e){return Ze(e,["skills","items"]).flatMap(t=>{let r=I(t,["id","name","path"]);if(!r)return[];let o=I(t,["status","state"]),n=en(t,o);return[{uid:`codex:skill:${Bs(r)}`,host:se,nativeKind:"skill",normalizedKind:"skill",source:`codex app server skills/list:${r}`,schemaHash:Zo,...n}]})}function ff(e){return Ze(e,["apps","items"]).flatMap(t=>{let r=I(t,["id","name","app"]);if(!r)return[];let o=I(t,["status","state"]),n=en(t,o);return[{uid:`codex:app:${Bs(r)}`,host:se,nativeKind:"app_server_app",normalizedKind:"app",source:`codex app server app/list:${r}`,schemaHash:Zo,...n}]})}function en(e,t){let r=ne(e,["installed"])??!0,o=t==="disabled"||t==="unavailable",n=t==="error"||t==="unhealthy",s=ne(e,["enabled"])??!o,a=ne(e,["active"])??s,i=ne(e,["healthy"])??(!o&&!n),l=ne(e,["authenticated"])??ne(e,["auth"])??!1,c=ne(e,["ready"])??(r&&s&&a&&i);return{installed:r,enabled:s,active:a,authenticated:l,healthy:i,ready:c}}function hf(e){if(N(e)){let t=e.appServer;if(N(t)&&typeof t.call=="function")return{call:r=>Promise.resolve(t.call(r))}}return null}function yf(e){if(N(e)){let t=e.appServerUrl;if(typeof t=="string"&&t.trim().length>0)return t.trim()}return process.env.NATIVESOUL_CODEX_APP_SERVER_URL?.trim()||process.env.CODEX_APP_SERVER_URL?.trim()||null}function _f(e){return{async call(t){try{let{readFile:r}=await import("node:fs/promises"),o=t.replace(/\//gu,"-");return JSON.parse(await r(Us.join(e,`${o}.json`),"utf8"))}catch(r){let o=r instanceof Error?r.message:"unknown error";throw new Error(`Codex App Server fixture unavailable for ${t}: ${o}`,{cause:r})}}}}function bf(e){return{call:t=>uf(e,t)}}function Bs(e){return M(e,{allowSlash:!0})}function od(){return new Vs}bt();Ue();le();import{readdir as sd}from"node:fs/promises";import Re from"node:path";var ee="gemini",Js="~/.gemini/GEMINI.md",vf="~/.gemini/extensions",kf="~/.gemini/settings.json",xr="official:gemini-extension-config:v1",Ws="official:gemini-settings-config:v1",wf="official:gemini-memory-config:v1",qs=class{async detect(){let t=nd(),r=t.globalInstruction,o=t.extensionsDirectory,[n,s,a]=await Promise.all([P(r),B(o),qo("gemini",["--version"])]);return{host:ee,detected:n||s||a!==null,version:a??void 0,path:n?r:s?o:void 0,capabilities:{installed:n||s||a!==null,enabled:n||s,active:n,authenticated:!1,healthy:a!==null||n||s,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Gemini direct adapter writes are disabled; use the install orchestrator to install the NativeSoul Gemini extension, MCP registration, and managed block."}}async uninstall(t){return{status:"unsupported",reason:"Gemini direct adapter uninstall is disabled; use the uninstall orchestrator for reversible package removal."}}async coldScan(){let t=[],r=nd(),o=r.globalInstruction;await P(o)&&t.push({uid:"gemini:global-gemini-md",host:ee,nativeKind:"global_context",normalizedKind:"memory",source:o,schemaHash:wf}),await Rf(r.settingsFile,t);let n=r.extensionsDirectory;if(await B(n)){t.push({uid:"gemini:extensions",host:ee,nativeKind:"extensions",normalizedKind:"package",source:n,schemaHash:xr});let s=await sd(n,{withFileTypes:!0});for(let a of s)a.isDirectory()&&await Sf(Re.join(n,a.name),a.name,t)}return t}async hotProbe(){let t=await this.coldScan();return{host:ee,checkedAt:new Date().toISOString(),capabilities:t.map(r=>({...r,installed:!0,enabled:!0,active:r.nativeKind==="global_context"||r.schemaHash?.startsWith("official:")===!0,authenticated:!1,healthy:!0,allowed:!0,ready:r.schemaHash?.startsWith("official:")===!0}))}}async bootstrap(){return{tier:"A",mechanism:"hook",supported:!0}}async reload(t){return{status:"unsupported",reason:"Gemini extension reload is host-driven; run /memory refresh or restart Gemini after installing NativeSoul."}}async update(t){return{status:"unsupported",reason:"Gemini package updates are handled by the NativeSoul install orchestrator."}}async scheduleReconcile(t){return{status:"unsupported",reason:"Gemini does not expose a documented native scheduler for NativeSoul; use the packaged heartbeat command manually or host-supported commands, with no hidden cron."}}async doctor(){let t=await this.detect(),r=j(Js),o=await q(r),n=[];return t.detected||n.push({code:"GEMINI_NOT_DETECTED",severity:"warn",message:"No Gemini CLI, GEMINI.md, or extensions directory was detected.",remediation:"Install Gemini CLI or review `nativesoul adapters managed-block --host gemini --json`."}),o&&!Z(o,ee)&&n.push({code:"GEMINI_MANAGED_BLOCK_MISSING",severity:"info",message:"GEMINI.md exists but has no NativeSoul managed block.",remediation:"Review `nativesoul adapters managed-block --host gemini --json`."}),n}async managedBlockPreview(){let t=j(Js),r=await q(t);return{host:ee,targetPath:t,startMarker:"<!-- nativesoul:gemini:start v1 -->",endMarker:"<!-- nativesoul:gemini:end -->",content:Oe(ee),wouldCreate:r===null,wouldUpdate:r!==null&&!Z(r,ee)}}};function nd(){let e=process.env.NATIVESOUL_GEMINI_INVENTORY_ROOT?.trim();if(e){let t=Re.resolve(e);return{globalInstruction:Re.join(t,"GEMINI.md"),settingsFile:Re.join(t,"settings.json"),extensionsDirectory:Re.join(t,"extensions")}}return{globalInstruction:j(Js),settingsFile:j(kf),extensionsDirectory:j(vf)}}async function Rf(e,t){let r=await Y(e);if(r){t.push({uid:"gemini:settings",host:ee,nativeKind:"settings",normalizedKind:"config",source:e,schemaHash:Ws});for(let o of Qe(r.mcpServers))t.push({uid:`gemini:mcp:${M(o)}`,host:ee,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${e}:mcpServers.${o}`,schemaHash:Ws});for(let o of ad(r.tools))t.push({uid:`gemini:tool:${M(o)}`,host:ee,nativeKind:"tool",normalizedKind:"tool",source:`${e}:tools.${o}`,schemaHash:Ws})}}async function Sf(e,t,r){let o=Re.join(e,"gemini-extension.json"),n=await Y(o),s=I(n,["name","id"])??t;if(r.push({uid:`gemini:extension:${M(s)}`,host:ee,nativeKind:"extension",normalizedKind:"package",source:n?o:e,schemaHash:n?xr:void 0}),n){for(let a of Qe(n.mcpServers))r.push({uid:`gemini:mcp:${M(a)}`,host:ee,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:mcpServers.${a}`,schemaHash:xr});for(let a of ad(n.tools))r.push({uid:`gemini:tool:${M(a)}`,host:ee,nativeKind:"tool",normalizedKind:"tool",source:`${o}:tools.${a}`,schemaHash:xr})}await Af(Re.join(e,"commands"),r)}async function Af(e,t){if(!await B(e))return;let r=await sd(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||![".toml",".md"].includes(Re.extname(o.name)))continue;let n=Re.basename(o.name,Re.extname(o.name));t.push({uid:`gemini:command:${M(n,{allowSlash:!0})}`,host:ee,nativeKind:"command",normalizedKind:"command",source:Re.join(e,o.name),schemaHash:xr})}}function ad(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):Qe(e)}function id(){return new qs}bt();Ue();le();import{readdir as pd}from"node:fs/promises";import J from"node:path";var W="grok",tn="~/.grok/Agents.md",ld="AGENTS.md",cd="Agents.md",dd="CLAUDE.md",Ef="~/.grok",Ks="official:grok-plugin-config:v1",ud="official:grok-hooks-config:v1",Gs="official:grok-mcp-config:v1",md="official:grok-command-config:v1",Pf="official:grok-context-config:v1",xf=[{uid:"grok:plugins",nativeKind:"plugins",normalizedKind:"package",relativePath:"plugins"},{uid:"grok:skills",nativeKind:"skills",normalizedKind:"capability",relativePath:"skills"},{uid:"grok:hooks",nativeKind:"hooks",normalizedKind:"capability",relativePath:"hooks"},{uid:"grok:mcps",nativeKind:"mcp",normalizedKind:"capability",relativePath:"mcps"}],Xs=class{async detect(){let t=j(tn),r=J.resolve(ld),o=J.resolve(cd),n=J.resolve(dd),s=gd(),[a,i,l,c,d,p]=await Promise.all([P(t),P(r),P(o),P(n),B(s),$e("grok")]),g=i||l;return{host:W,detected:a||g||c||d||p!==null,path:a?t:l?o:i?r:c?n:p??void 0,capabilities:{installed:a||g||c||d||p!==null,enabled:a||g||c||d,active:g||c,authenticated:!1,healthy:p!==null||a||d,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Grok direct adapter writes are disabled; use the install orchestrator to install the NativeSoul native hook plugin, MCP registration, and managed block."}}async uninstall(t){return{status:"unsupported",reason:"Grok direct adapter uninstall is disabled; use the uninstall orchestrator for reversible package removal."}}async coldScan(){let t=[],r=jf(),o=r.globalInstruction;await P(o)&&t.push({uid:"grok:global-agents-md",host:W,nativeKind:"global_context",normalizedKind:"instruction",source:o,schemaHash:Pf});let n=J.resolve(ld);await P(n)&&t.push({uid:"grok:project-agents-md",host:W,nativeKind:"project_context",normalizedKind:"instruction",source:n});let s=J.resolve(cd);await P(s)&&t.push({uid:"grok:project-agents-titlecase-md",host:W,nativeKind:"project_context",normalizedKind:"instruction",source:s});let a=J.resolve(dd);await P(a)&&t.push({uid:"grok:project-claude-md",host:W,nativeKind:"project_context",normalizedKind:"instruction",source:a});let i=r.root;await fd(r.root,t),await If(i,t);for(let l of xf){let c=J.join(i,l.relativePath);await B(c)&&t.push({uid:l.uid,host:W,nativeKind:l.nativeKind,normalizedKind:l.normalizedKind,source:c,schemaHash:l.relativePath==="mcps"?Gs:Ks})}return Cf(t)}async hotProbe(){let t=await this.coldScan();return{host:W,checkedAt:new Date().toISOString(),capabilities:t.map(r=>({...r,installed:!0,enabled:!0,active:r.uid.includes("project"),authenticated:!1,healthy:!0,allowed:!0,ready:r.schemaHash?.startsWith("official:")===!0}))}}async bootstrap(){return{tier:"A",mechanism:"hook",supported:!0}}async reload(t){return{status:"unsupported",reason:"Grok reload is host-driven; use the installed NativeSoul command package or restart the host if needed."}}async update(t){return{status:"unsupported",reason:"Grok package updates are handled by the NativeSoul install orchestrator."}}async scheduleReconcile(t){return{status:"unsupported",reason:"Grok has no documented native scheduler or recurring task surface for NativeSoul; headless grok -p, cron, GitHub Actions, systemd, and Windows Task Scheduler are external schedulers and do not satisfy full-native capability."}}async doctor(){let t=await this.detect(),r=j(tn),o=await q(r),n=[];return t.detected||n.push({code:"GROK_NOT_DETECTED",severity:"warn",message:"No Grok CLI, ~/.grok directory, or project instruction file was detected.",remediation:"Install Grok Build or review `nativesoul adapters managed-block --host grok --json`."}),o&&!Z(o,W)&&n.push({code:"GROK_MANAGED_BLOCK_MISSING",severity:"info",message:"Grok global Agents.md exists but has no NativeSoul managed block.",remediation:"Review `nativesoul adapters managed-block --host grok --json`."}),n}async managedBlockPreview(){let t=j(tn),r=await q(t);return{host:W,targetPath:t,startMarker:"<!-- nativesoul:grok:start v1 -->",endMarker:"<!-- nativesoul:grok:end -->",content:Oe(W),wouldCreate:r===null,wouldUpdate:r!==null&&!Z(r,W)}}};function gd(){let e=process.env.NATIVESOUL_GROK_INVENTORY_ROOT?.trim();return e?J.resolve(e):j(Ef)}function jf(){let e=gd();return{root:e,globalInstruction:process.env.NATIVESOUL_GROK_INVENTORY_ROOT?.trim()?J.join(e,"Agents.md"):j(tn)}}async function fd(e,t){let r=J.join(e,"plugin.json"),o=J.join(e,"nativesoul-package.json"),n=J.join(e,"hooks","hooks.json"),s=J.join(e,".mcp.json"),[a,i,l,c]=await Promise.all([Y(r),Y(o),Y(n),Y(s)]);if(a){let d=I(a,["name","id"])??"unknown";t.push({uid:`grok:plugin:${M(d)}`,host:W,nativeKind:"plugin",normalizedKind:"extension",source:r,schemaHash:Ks})}if(i){let d=I(i,["name","id"])??"unknown";t.push({uid:`grok:package:${M(d)}`,host:W,nativeKind:"native_plugin_package",normalizedKind:"package",source:o,schemaHash:Ks});let p=N(i.nativeSoul)?i.nativeSoul:{};for(let k of Ko(p.commands))t.push({uid:`grok:command:${M(k)}`,host:W,nativeKind:"command",normalizedKind:"command",source:`${o}:nativeSoul.commands.${k}`,schemaHash:md});let g=N(p.mcpServer)?p.mcpServer:null,y=I(g,["name"]);y&&t.push({uid:`grok:mcp:${M(y)}`,host:W,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:nativeSoul.mcpServer.${y}`,schemaHash:Gs})}if(l){t.push({uid:"grok:hooks:manifest",host:W,nativeKind:"hooks",normalizedKind:"lifecycle_hooks",source:n,schemaHash:ud});let d=N(l.hooks)?l.hooks:{};for(let p of Object.keys(d))t.push({uid:`grok:hook:${M(p)}`,host:W,nativeKind:"hook",normalizedKind:"lifecycle_hook",source:`${n}:hooks.${p}`,schemaHash:ud})}if(c)for(let d of Qe(c.mcpServers))t.push({uid:`grok:mcp:${M(d)}`,host:W,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${s}:mcpServers.${d}`,schemaHash:Gs});await Tf(J.join(e,"commands"),t)}async function If(e,t){let r=J.join(e,"plugins");if(!await B(r))return;let o=await pd(r,{withFileTypes:!0});for(let n of o)n.isDirectory()&&await fd(J.join(r,n.name),t)}async function Tf(e,t){if(!await B(e))return;let r=await pd(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||J.extname(o.name)!==".md")continue;let n=J.basename(o.name,".md");t.push({uid:`grok:command:${M(n,{allowSlash:!0})}`,host:W,nativeKind:"command",normalizedKind:"command",source:J.join(e,o.name),schemaHash:md})}}function Cf(e){let t=new Set,r=[];for(let o of e)t.has(o.uid)||(t.add(o.uid),r.push(o));return r}function hd(){return new Xs}import{mkdir as rn,readFile as on,rm as Nf,writeFile as nn}from"node:fs/promises";import{existsSync as sn}from"node:fs";import jr from"node:path";function an(e){return{start:`<!-- nativesoul:${e}:start v1 -->`,end:`<!-- nativesoul:${e}:end -->`}}async function yd(e){let t=f(e.home),r=sn(e.targetPath),o=r?await on(e.targetPath,"utf8"):null,n=Mf(o,e.host,e.block),s=o===null?null:A(o),a=A(n),i=Lf(o,n,e.host),l=i!=="noop",c=!e.apply,d=l&&e.apply?await kd(t.home,e.host,e.targetPath,r,o,a):null;l&&e.apply&&(await rn(jr.dirname(e.targetPath),{recursive:!0,mode:448}),await nn(e.targetPath,n,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:e.targetPath,action:i,dryRun:c,changed:l,beforeHash:s,afterHash:a,diff:wd(o,n),backupPath:d,applied:l&&e.apply};return await h({home:t.home,type:e.apply?"managed_block_apply":"managed_block_dry_run",details:p}),p}async function _d(e){let t=f(e.home),r=sn(e.targetPath),o=r?await on(e.targetPath,"utf8"):null,n=Of(o,e.host),s=o===null?null:A(o),a=n===null?A(""):A(n),i=o!==n?"remove":"noop",l=i!=="noop",c=!e.apply,d=l&&e.apply?await kd(t.home,e.host,e.targetPath,r,o,a):null;l&&e.apply&&n!==null&&(await rn(jr.dirname(e.targetPath),{recursive:!0,mode:448}),await nn(e.targetPath,n,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:e.targetPath,action:i,dryRun:c,changed:l,beforeHash:s,afterHash:a,diff:wd(o,n),backupPath:d,applied:l&&e.apply};return await h({home:t.home,type:e.apply?"managed_block_uninstall":"managed_block_uninstall_dry_run",details:p}),p}async function bd(e){let t=sn(e.targetPath),r=[];if(!t)return r.push({code:"MANAGED_BLOCK_TARGET_MISSING",severity:"warn",message:`Managed block target is missing: ${e.targetPath}`,remediation:"Run nativesoul install --host <host> --apply"}),{host:e.host,targetPath:e.targetPath,target_exists:!1,configured:!1,markers_valid:!1,issues:r};let o=await on(e.targetPath,"utf8"),n=an(e.host),s=o.indexOf(n.start),a=o.indexOf(n.end),i=s>=0,l=a>=0,c=i&&l&&a>s;return!i&&!l?r.push({code:"MANAGED_BLOCK_MISSING",severity:"warn",message:"NativeSoul managed block is not configured.",remediation:"Run nativesoul install --host <host> --apply"}):c||r.push({code:"MANAGED_BLOCK_MARKERS_INVALID",severity:"error",message:"NativeSoul managed block markers are incomplete or out of order.",remediation:"Fix the managed block markers or restore from a backup snapshot"}),{host:e.host,targetPath:e.targetPath,target_exists:!0,configured:c,markers_valid:c,issues:r}}async function vd(e){let t=f(e.home),r=JSON.parse(await on(e.snapshotPath,"utf8")),o=!e.apply;e.apply&&(r.beforeExists&&r.beforeContent!==null?(await rn(jr.dirname(r.targetPath),{recursive:!0,mode:448}),await nn(r.targetPath,r.beforeContent,{encoding:"utf8",mode:384})):sn(r.targetPath)&&await Nf(r.targetPath));let n={snapshotPath:e.snapshotPath,targetPath:r.targetPath,dryRun:o,applied:e.apply,restoredExists:r.beforeExists,restoredHash:r.beforeHash};return await h({home:t.home,type:e.apply?"managed_block_rollback":"managed_block_rollback_dry_run",details:n}),n}function Of(e,t){if(e===null)return null;let{start:r,end:o}=an(t),n=e.indexOf(r),s=e.indexOf(o);if(n<0||s<=n)return e;let a=s+o.length,i=e.slice(0,n),l=e.slice(a);return i.endsWith(`
824
824
 
825
825
  `)&&l.startsWith(`
826
826
  `)?l=l.replace(/^\n/u,""):!i.endsWith(`
@@ -828,67 +828,73 @@ _Running context for today. Promote durable facts to curated memory later._
828
828
  `)&&(l=l.slice(1)),i.length>0&&l.length>0&&!i.endsWith(`
829
829
  `)&&!l.startsWith(`
830
830
  `)&&(i=`${i}
831
- `),`${i}${l}`}function Rf(e,t,r){let o=r.endsWith(`
831
+ `),`${i}${l}`}function Mf(e,t,r){let o=r.endsWith(`
832
832
  `)?r:`${r}
833
- `;if(e===null||e.length===0)return o;let{start:n,end:a}=on(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(`
833
+ `;if(e===null||e.length===0)return o;let{start:n,end:s}=an(t),a=e.indexOf(n),i=e.indexOf(s);if(a>=0&&i>a){let c=i+s.length,d=e.slice(c).replace(/^\n/u,"");return`${e.slice(0,a)}${o}${d}`}let l=e.endsWith(`
834
834
  `)?`
835
835
  `:`
836
836
 
837
- `;return`${e}${l}${o}`}function Sf(e,t,r){if(e===t)return"noop";if(e===null||e.length===0)return"create";let{start:o,end:n}=on(r);return e.includes(o)&&e.includes(n)?"replace":"append"}async function md(e,t,r,o,n,a){let s=Pr.join(e,"backups","managed-block");await Zo(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=Pr.join(s,c);return await tn(d,JSON.stringify(l,null,2),{encoding:"utf8",mode:384}),d}function gd(e,t){return e===t?"No changes.":[`before: ${e===null?"missing":A(e)}`,`after: ${t===null?"missing":A(t)}`,`lines_before: ${e===null?0:e.split(/\r?\n/u).length}`,`lines_after: ${t===null?0:t.split(/\r?\n/u).length}`].join(`
838
- `)}var Af=["codex","claude","grok","antigravity","gemini"],Ef={codex:Xc,claude:Bc,grok:ld,antigravity:gc,gemini:Zc};function Ue(e){return e==="all"?Af:[e]}function nn(e){return Ue(e)}function vt(e){return Ef[e]()}async function xr(e){let t=[];for(let r of nn(e)){let o=vt(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 jr(e){let t=[];for(let r of nn(e)){let o=vt(r);t.push({host:r,diagnostics:await o.doctor({})})}return t}async function Ir(e){return vt(e).managedBlockPreview()}async function Tr(e){let t=await Ir(e.host);return cd({home:e.home,host:e.host,targetPath:e.targetPath??t.targetPath,block:t.content,apply:e.apply})}async function Wa(e){return pd(e)}async function Ja(e){let t=await Ir(e.host);return dd({home:e.home,host:e.host,targetPath:e.targetPath??t.targetPath,apply:e.apply})}async function kt(e){let t=await v(e.home),r=new Date().toISOString(),o=[],n=e.ttlSeconds??await Tf(t.home);for(let a of nn(e.host)){if(e.delta){let p=(await we({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 vt(a).hotProbe({}),l=i.capabilities.map(d=>Nf({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 Tf(e){let t;try{t=await qa(Nr.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 we(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await R(t.database))return[];let r=_(t.database,{readOnly:e.readOnly}),o=_d(e.limit);try{return r.listCapabilities({host:e.host,readyOnly:e.readyOnly,limit:o,includeShared:e.includeShared})}finally{r.close()}}async function Or(e){let t=await v(e.home),r=_(t.database),o=_d(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 Mr(e){let t=await v(e.home),r=_(t.database);try{return r.getCapability(e.uid)}finally{r.close()}}async function Ka(e){let t=e.readOnly?f(e.home):await v(e.home),r=Nr.join(t.home,"capabilities","cards"),o=[];if(!await R(r))return{cards:[],warnings:o};let n=(await xf(r)).filter(c=>c.endsWith(".json")).sort(),a=Ff(e.query??""),s=[];for(let c of n){let d=Nr.join(r,c),p;try{p=await qa(d,"utf8")}catch{o.push(`CAPABILITY_CARD_UNREADABLE:${c}`);continue}let g=Lf(p);if(!g){o.push(`CAPABILITY_CARD_MALFORMED:${c}`);continue}let y=Df(g,e.host);s.push({card:y,score:Hf(g,e.host,a)})}let i=Wf(e.limit),l=s.sort((c,d)=>d.score-c.score||c.card.uid.localeCompare(d.card.uid));return{cards:Cf(l,i).map(c=>c.card),warnings:o}}function Cf(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 Ga(e){let t=await v(e.home),r=await Of({home:t.home,host:e.host,limit:e.limit}),o=Nr.join(t.home,"capabilities","cards");await Pf(o,{recursive:!0,mode:448});let n=[];for(let s of r){let i=Mf(s),l=`${JSON.stringify(i,null,2)}
839
- `,c=Nr.join(o,`${Bf(s.uid)}.json`),d=If(c)?await qa(c,"utf8"):null,p=d===l?"unchanged":d===null?"created":"updated";p!=="unchanged"&&await jf(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 Nf(e){return{...e,uid:O(e.uid).value,host:O(e.host).value,native_kind:O(e.native_kind).value,normalized_kind:O(e.normalized_kind).value,source:O(e.source).value,schema_hash:e.schema_hash?O(e.schema_hash).value:null}}async function Of(e){return e.host==="all"?we({home:e.home,limit:e.limit}):we({home:e.home,host:e.host,limit:e.limit})}function Mf(e){let t=e.schema_hash??be({uid:e.uid,host:e.host,native_kind:e.native_kind,normalized_kind:e.normalized_kind,source:e.source,readiness:fd(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:fd(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:Uf(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:Vf(e),examples:[`Inspect ${e.uid} readiness before using it.`,`Prefer a ready capability on ${e.host}; otherwise report degraded status.`]};return $(r)}function Lf(e){let t;try{t=JSON.parse(e)}catch{return null}if(!hd(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)||!$f(r)?null:t}function Df(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:Cr(e.use_when).slice(0,2),requires:Cr(e.requires).slice(0,4),approval:e.approval,alternative_host:r,available_on_other_host:o}}function Hf(e,t,r){let o=yd([e.uid,e.host,e.native_kind,e.normalized_kind,e.source,e.schema_hash,...Cr(e.use_when),...Cr(e.requires),e.approval,...Cr(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 Cr(e){return e.filter(t=>typeof t=="string")}function hd(e){return typeof e=="object"&&e!==null}function $f(e){return hd(e)?["installed","enabled","active","authenticated","healthy","allowed","ready"].every(t=>typeof e[t]=="boolean"):!1}function Ff(e){return yd(e).split(/\s+/u).map(t=>t.trim()).filter(t=>t.length>=2)}function yd(e){return e.toLowerCase().normalize("NFKD").replace(/[\u0300-\u036f]/gu,"")}function fd(e){return{installed:e.installed,enabled:e.enabled,active:e.active,authenticated:e.authenticated,healthy:e.healthy,allowed:e.allowed,ready:e.ready}}function Uf(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 Vf(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 Bf(e){return`${e.replace(/[^A-Za-z0-9._-]+/gu,"_").replace(/^_+|_+$/gu,"")||"capability"}-${A(e).slice(7,19)}`}function _d(e){return Math.min(Math.max(e??50,1),100)}function Wf(e){return Math.min(Math.max(e??5,1),8)}async function Lr(e){let t=await v(e.home),r=O(e.summary).value,o=new Date,n=e.ttlSeconds?new Date(o.getTime()+Jf(e.ttlSeconds)*1e3).toISOString():null,a=$(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 Dr(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await R(t.database))return[];let r=_(t.database,{readOnly:e.readOnly}),o;try{o=r.listCommitments({project:e.project,status:e.status??(e.includeExpired?void 0:"open"),includeExpired:e.includeExpired,limit:Math.min(Math.max(e.limit??50,1),200),now:new Date().toISOString(),skipExpire:e.readOnly})}finally{r.close()}return e.readOnly||await h({home:t.home,type:"commitments_listed",details:{project:e.project??null,status:e.status??null,includeExpired:e.includeExpired===!0,count:o.length}}),o}async function Hr(e,t){return bd(e,t,"completed","commitment_completed")}async function Xa(e,t){return bd(e,t,"dismissed","commitment_dismissed")}async function bd(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 Jf(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e),1),365*24*60*60):1440*60}import{createHash as qf}from"node:crypto";import{existsSync as an,mkdirSync as Kf,realpathSync as Gf,readFileSync as kd,writeFileSync as Xf}from"node:fs";import{spawnSync as wd}from"node:child_process";import me from"node:path";function L(e,t){return Z(e,t).id}function Z(e,t){let r=Qa(e),o=Zf(r),n=o?eh(o):null,a=n?vd(n):o??r,s=th(a),i=n?"git-remote":o?"git-root":"path",l=Yf(s,a),c=zf(r),d=c?Rd(c):null,p=Za(t),g=[d,l,n?vd(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 Rd(e){if(!an(e))return null;let t=kd(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?Qf(o):null}function za(e,t){let r=me.join(e,".nativesoul","project");return Kf(me.dirname(r),{recursive:!0,mode:448}),Xf(r,`${t}
840
- `,{encoding:"utf8",mode:384}),r}async function $r(e){let t=Z(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=me.join(r,".nativesoul","project");return an(o)?{written:!1,marker_path:o,base_id:t.base_id}:(za(r,t.base_id),{written:!0,marker_path:o,base_id:t.base_id})}async function Ya(e){let t=me.resolve(e.cwd),r=Z(t,e.home),o=r.git_root??r.cwd,n=me.join(o,".nativesoul","project");return e.apply&&(za(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 zf(e){let t=Qa(e);for(;;){let r=me.join(t,".nativesoul","project");if(an(r))return r;let o=me.dirname(t);if(o===t)return null;t=o}}function Yf(e,t){let r=qf("sha256").update(t).digest("hex").slice(0,10);return`${rh(e)}-${r}`}function Qf(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"")||"workspace"}function Qa(e){try{return Gf(me.resolve(e))}catch{return me.resolve(e)}}function Zf(e){let t=wd("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?Qa(r):null}function eh(e){let t=wd("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 vd(e){return e.trim().replace(/^git@([^:]+):/,"https://$1/").replace(/^ssh:\/\/git@([^/]+)\//,"https://$1/").replace(/^https?:\/\/([^/]+)\//,"https://$1/").replace(/\.git$/u,"").toLowerCase()}function th(e){let t=e.replace(/\/+$/u,"");return me.basename(t)||"workspace"}function rh(e){return e.toLowerCase().replace(/[^a-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"")||"workspace"}function Za(e){if(!e)return{};let t=me.join(me.resolve(e),"config.yaml");if(!an(t))return{};let r=kd(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 oh,writeFile as nh}from"node:fs/promises";import ah from"node:path";async function es(e){let t=f(e.home),r=ah.join(t.home,"config.yaml"),o=await R(r)?await oh(r,"utf8"):`version: 1
837
+ `;return`${e}${l}${o}`}function Lf(e,t,r){if(e===t)return"noop";if(e===null||e.length===0)return"create";let{start:o,end:n}=an(r);return e.includes(o)&&e.includes(n)?"replace":"append"}async function kd(e,t,r,o,n,s){let a=jr.join(e,"backups","managed-block");await rn(a,{recursive:!0,mode:448});let i=new Date().toISOString(),l={id:T("snapshot"),host:t,targetPath:r,beforeExists:o,beforeContent:n,beforeHash:n===null?null:A(n),afterHash:s,createdAt:i},c=`${i.replace(/[:.]/g,"-")}-${t}.json`,d=jr.join(a,c);return await nn(d,JSON.stringify(l,null,2),{encoding:"utf8",mode:384}),d}function wd(e,t){return e===t?"No changes.":[`before: ${e===null?"missing":A(e)}`,`after: ${t===null?"missing":A(t)}`,`lines_before: ${e===null?0:e.split(/\r?\n/u).length}`,`lines_after: ${t===null?0:t.split(/\r?\n/u).length}`].join(`
838
+ `)}var Df=["codex","claude","grok","antigravity","gemini"],Hf={codex:od,claude:Yc,grok:hd,antigravity:wc,gemini:id};function Ve(e){return e==="all"?Df:[e]}function ln(e){return Ve(e)}function vt(e){return Hf[e]()}async function Ir(e){let t=[];for(let r of ln(e)){let o=vt(r),[n,s]=await Promise.all([o.detect(),o.coldScan({})]);t.push({host:r,detected:n.detected,version:n.version,sources:s})}return t}async function Tr(e){let t=[];for(let r of ln(e)){let o=vt(r);t.push({host:r,diagnostics:await o.doctor({})})}return t}async function Cr(e){return vt(e).managedBlockPreview()}async function Nr(e){let t=await Cr(e.host);return yd({home:e.home,host:e.host,targetPath:e.targetPath??t.targetPath,block:t.content,apply:e.apply})}async function zs(e){return vd(e)}async function Ys(e){let t=await Cr(e.host);return _d({home:e.home,host:e.host,targetPath:e.targetPath??t.targetPath,apply:e.apply})}async function kt(e){let t=await v(e.home),r=new Date().toISOString(),o=[],n=e.ttlSeconds??await Bf(t.home);for(let s of ln(e.host)){if(e.delta){let p=(await Se({home:t.home,host:s,includeShared:!1,limit:1}))[0]?.last_seen_at;if(p&&Date.now()-Date.parse(p)<=n*1e3){let g={host:s,status:"ready",count:0,records:[],skipped:!0,warnings:[],diagnostics:[]};await h({home:t.home,type:"capabilities_refreshed",details:{host:s,count:0,status:"ready",warnings:[],delta:!0,skipped:!0}}),o.push(g);continue}}let i=await vt(s).hotProbe({}),l=i.capabilities.map(d=>Jf({uid:d.uid,host:d.host,native_kind:d.nativeKind,normalized_kind:d.normalizedKind,source:d.source,schema_hash:d.schemaHash??null,installed:d.installed,enabled:d.enabled,active:d.active,authenticated:d.authenticated,healthy:d.healthy,allowed:d.allowed,ready:d.ready,last_seen_at:r})),c=_(t.database);try{c.upsertCapabilities(l)}finally{c.close()}await h({home:t.home,type:"capabilities_refreshed",details:{host:s,count:l.length,status:i.status??((i.diagnostics?.length??0)>0?"degraded":"ready"),warnings:i.warnings??[],delta:e.delta===!0,skipped:!1}}),o.push({host:s,status:i.status??((i.diagnostics?.length??0)>0?"degraded":"ready"),count:l.length,records:l,skipped:!1,warnings:i.warnings??[],remediation:i.remediation,diagnostics:i.diagnostics??[]})}return o}async function Bf(e){let t;try{t=await Qs(Mr.join(e,"config.yaml"),"utf8")}catch{return 3600}let r=t.match(/^\s*(?:capability_refresh_ttl_seconds|refresh_ttl_seconds):\s*(\d+)\s*$/mu),o=r?.[1]?Number(r[1]):3600;return Number.isFinite(o)?Math.min(Math.max(o,0),86400):3600}async function Se(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await R(t.database))return[];let r=_(t.database,{readOnly:e.readOnly}),o=Ed(e.limit);try{return r.listCapabilities({host:e.host,readyOnly:e.readyOnly,limit:o,includeShared:e.includeShared})}finally{r.close()}}async function Lr(e){let t=await v(e.home),r=_(t.database),o=Ed(e.limit);try{return r.searchCapabilities({query:e.query,host:e.host,readyOnly:e.readyOnly,limit:o,includeShared:e.includeShared})}finally{r.close()}}async function Dr(e){let t=await v(e.home),r=_(t.database);try{return r.getCapability(e.uid)}finally{r.close()}}async function Zs(e){let t=e.readOnly?f(e.home):await v(e.home),r=Mr.join(t.home,"capabilities","cards"),o=[];if(!await R(r))return{cards:[],warnings:o};let n=(await Ff(r)).filter(c=>c.endsWith(".json")).sort(),s=Qf(e.query??""),a=[];for(let c of n){let d=Mr.join(r,c),p;try{p=await Qs(d,"utf8")}catch{o.push(`CAPABILITY_CARD_UNREADABLE:${c}`);continue}let g=Gf(p);if(!g){o.push(`CAPABILITY_CARD_MALFORMED:${c}`);continue}let y=Xf(g,e.host);a.push({card:y,score:zf(g,e.host,s)})}let i=rh(e.limit),l=a.sort((c,d)=>d.score-c.score||c.card.uid.localeCompare(d.card.uid));return{cards:Wf(l,i).map(c=>c.card),warnings:o}}function Wf(e,t){let r=e.slice(0,t);if(t<=1||r.some(n=>n.card.alternative_host))return r;let o=e.find(n=>n.card.alternative_host);return o?[...r.slice(0,t-1),o].sort((n,s)=>s.score-n.score||n.card.uid.localeCompare(s.card.uid)):r}async function ea(e){let t=await v(e.home),r=await qf({home:t.home,host:e.host,limit:e.limit}),o=Mr.join(t.home,"capabilities","cards");await $f(o,{recursive:!0,mode:448});let n=[];for(let a of r){let i=Kf(a),l=`${JSON.stringify(i,null,2)}
839
+ `,c=Mr.join(o,`${th(a.uid)}.json`),d=Vf(c)?await Qs(c,"utf8"):null,p=d===l?"unchanged":d===null?"created":"updated";p!=="unchanged"&&await Uf(c,l,{encoding:"utf8",mode:384}),n.push({uid:a.uid,host:a.host,path:c,action:p,hash:A(l),card:i})}let s={home:t.home,host:e.host,generated:n.length,changed:n.filter(a=>a.action!=="unchanged").length,cards:n,warnings:n.length===0?["NO_CAPABILITY_RECORDS_TO_LEARN"]:[]};return await h({home:t.home,type:"capability_cards_learned",details:{host:e.host,generated:s.generated,changed:s.changed,warnings:s.warnings}}),s}function Jf(e){return{...e,uid:O(e.uid).value,host:O(e.host).value,native_kind:O(e.native_kind).value,normalized_kind:O(e.normalized_kind).value,source:O(e.source).value,schema_hash:e.schema_hash?O(e.schema_hash).value:null}}async function qf(e){return e.host==="all"?Se({home:e.home,limit:e.limit}):Se({home:e.home,host:e.host,limit:e.limit})}function Kf(e){let t=e.schema_hash??ke({uid:e.uid,host:e.host,native_kind:e.native_kind,normalized_kind:e.normalized_kind,source:e.source,readiness:Rd(e)}),r={card_version:1,id:`capcard:${e.uid}`,uid:e.uid,host:e.host,native_kind:e.native_kind,normalized_kind:e.normalized_kind,readiness:Rd(e),source:e.source,schema_hash:t,use_when:[`Use when a task needs ${e.normalized_kind} capability metadata on ${e.host}.`,`Check this card before claiming ${e.uid} is available or ready.`],requires:Zf(e),side_effects:["Reading this card has no side effects.","Executing the native capability may have host-specific side effects and must follow policy."],approval:eh(e),examples:[`Inspect ${e.uid} readiness before using it.`,`Prefer a ready capability on ${e.host}; otherwise report degraded status.`]};return H(r)}function Gf(e){let t;try{t=JSON.parse(e)}catch{return null}if(!Sd(t))return null;let r=t.readiness;return t.card_version!==1||typeof t.id!="string"||typeof t.uid!="string"||typeof t.host!="string"||typeof t.native_kind!="string"||typeof t.normalized_kind!="string"||typeof t.source!="string"||typeof t.schema_hash!="string"||!Array.isArray(t.use_when)||!Array.isArray(t.requires)||!Array.isArray(t.side_effects)||typeof t.approval!="string"||!Array.isArray(t.examples)||!Yf(r)?null:t}function Xf(e,t){let r=e.host!==t,o=e.host!==t&&e.host!=="all";return{id:e.id,uid:e.uid,host:e.host,ready:e.readiness.ready,source:e.source,schema_hash:e.schema_hash,use_when:Or(e.use_when).slice(0,2),requires:Or(e.requires).slice(0,4),approval:e.approval,alternative_host:r,available_on_other_host:o}}function zf(e,t,r){let o=Ad([e.uid,e.host,e.native_kind,e.normalized_kind,e.source,e.schema_hash,...Or(e.use_when),...Or(e.requires),e.approval,...Or(e.examples)].join(" ")),n=r.reduce((s,a)=>s+(o.includes(a)?10:0),0);return(e.host===t?100:0)+(e.readiness.ready?5:0)+n}function Or(e){return e.filter(t=>typeof t=="string")}function Sd(e){return typeof e=="object"&&e!==null}function Yf(e){return Sd(e)?["installed","enabled","active","authenticated","healthy","allowed","ready"].every(t=>typeof e[t]=="boolean"):!1}function Qf(e){return Ad(e).split(/\s+/u).map(t=>t.trim()).filter(t=>t.length>=2)}function Ad(e){return e.toLowerCase().normalize("NFKD").replace(/[\u0300-\u036f]/gu,"")}function Rd(e){return{installed:e.installed,enabled:e.enabled,active:e.active,authenticated:e.authenticated,healthy:e.healthy,allowed:e.allowed,ready:e.ready}}function Zf(e){let t=[["installed",e.installed],["enabled",e.enabled],["active",e.active],["authenticated",e.authenticated],["healthy",e.healthy],["allowed",e.allowed],["ready",e.ready]].filter(([,r])=>r===!1).map(([r])=>`${r} must be true`);return t.length>0?t:["No missing readiness prerequisites are known."]}function eh(e){return e.allowed?e.normalized_kind.includes("connector")||e.normalized_kind.includes("mcp")?"approval_required_for_external_write":"allowed_for_read_or_local_use_when_ready":"denied_by_policy"}function th(e){return`${e.replace(/[^A-Za-z0-9._-]+/gu,"_").replace(/^_+|_+$/gu,"")||"capability"}-${A(e).slice(7,19)}`}function Ed(e){return Math.min(Math.max(e??50,1),100)}function rh(e){return Math.min(Math.max(e??5,1),8)}async function Hr(e){let t=await v(e.home),r=O(e.summary).value,o=new Date,n=e.ttlSeconds?new Date(o.getTime()+oh(e.ttlSeconds)*1e3).toISOString():null,s=H(e.source??{host:"cli",session_id:"local"}),a=_(t.database),i;try{i=a.createOpenCommitmentIfMissing({id:T("commitment"),project_id:e.project,summary:r,status:"open",due_at:e.dueAt??null,ttl_expires_at:n,source:s,created_at:o.toISOString(),updated_at:o.toISOString()},o.toISOString())}finally{a.close()}return await h({home:t.home,type:i.created?"commitment_created":"commitment_deduped",details:{id:i.commitment.id,project:i.commitment.project_id,redacted:r!==e.summary,created:i.created}}),i}async function $r(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await R(t.database))return[];let r=_(t.database,{readOnly:e.readOnly}),o;try{o=r.listCommitments({project:e.project,status:e.status??(e.includeExpired?void 0:"open"),includeExpired:e.includeExpired,limit:Math.min(Math.max(e.limit??50,1),200),now:new Date().toISOString(),skipExpire:e.readOnly})}finally{r.close()}return e.readOnly||await h({home:t.home,type:"commitments_listed",details:{project:e.project??null,status:e.status??null,includeExpired:e.includeExpired===!0,count:o.length}}),o}async function Fr(e,t){return Pd(e,t,"completed","commitment_completed")}async function ta(e,t){return Pd(e,t,"dismissed","commitment_dismissed")}async function Pd(e,t,r,o){let n=await v(e),s=_(n.database),a;try{a=s.updateCommitmentStatus(t,r,new Date().toISOString())}finally{s.close()}if(!a)throw new Error(`Commitment not found: ${t}`);return await h({home:n.home,type:o,details:{id:a.id,project:a.project_id,status:a.status}}),a}function oh(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e),1),365*24*60*60):1440*60}import{createHash as nh}from"node:crypto";import{existsSync as cn,mkdirSync as sh,realpathSync as ah,readFileSync as jd,writeFileSync as ih}from"node:fs";import{spawnSync as Id}from"node:child_process";import fe from"node:path";function L(e,t){return te(e,t).id}function te(e,t){let r=na(e),o=uh(r),n=o?ph(o):null,s=n?xd(n):o??r,a=mh(s),i=n?"git-remote":o?"git-root":"path",l=ch(a,s),c=lh(r),d=c?Td(c):null,p=sa(t),g=[d,l,n?xd(n):null,o,r].find(y=>y&&p[y]);if(g){let y=d??l;return{id:p[g]??y,source:"alias",cwd:r,git_root:o,remote:n,base_id:y,alias_key:g,marker_path:c}}return d?{id:d,source:"marker",cwd:r,git_root:o,remote:n,base_id:d,alias_key:null,marker_path:c}:{id:l,source:i,cwd:r,git_root:o,remote:n,base_id:l,alias_key:null,marker_path:null}}function Td(e){if(!cn(e))return null;let t=jd(e,"utf8").trim();if(t.length===0)return null;let r=t.match(/^(?:project_id|id):\s*([a-z0-9._-]+)\s*$/imu);if(r?.[1])return r[1];let o=t.split(/\r?\n/u).map(n=>n.trim()).find(n=>n.length>0&&!n.startsWith("#"));return o?dh(o):null}function ra(e,t){let r=fe.join(e,".nativesoul","project");return sh(fe.dirname(r),{recursive:!0,mode:448}),ih(r,`${t}
840
+ `,{encoding:"utf8",mode:384}),r}async function Ur(e){let t=te(e.cwd,e.home);if(t.source!=="git-root"&&t.source!=="path")return{written:!1,marker_path:t.marker_path,base_id:t.base_id};let r=t.git_root??t.cwd,o=fe.join(r,".nativesoul","project");return cn(o)?{written:!1,marker_path:o,base_id:t.base_id}:(ra(r,t.base_id),{written:!0,marker_path:o,base_id:t.base_id})}async function oa(e){let t=fe.resolve(e.cwd),r=te(t,e.home),o=r.git_root??r.cwd,n=fe.join(o,".nativesoul","project");return e.apply&&(ra(o,r.base_id),await h({home:f(e.home).home,type:"project_pinned",details:{id:r.base_id,basis_source:r.source,marker_path:n}})),{cwd:t,base_id:r.base_id,marker_path:n,applied:e.apply===!0,resolution:r}}function lh(e){let t=na(e);for(;;){let r=fe.join(t,".nativesoul","project");if(cn(r))return r;let o=fe.dirname(t);if(o===t)return null;t=o}}function ch(e,t){let r=nh("sha256").update(t).digest("hex").slice(0,10);return`${gh(e)}-${r}`}function dh(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"")||"workspace"}function na(e){try{return ah(fe.resolve(e))}catch{return fe.resolve(e)}}function uh(e){let t=Id("git",["-C",e,"rev-parse","--show-toplevel"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(t.status!==0)return null;let r=t.stdout.trim();return r.length>0?na(r):null}function ph(e){let t=Id("git",["-C",e,"remote","get-url","origin"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(t.status!==0)return null;let r=t.stdout.trim();return r.length>0?r:null}function xd(e){return e.trim().replace(/^git@([^:]+):/,"https://$1/").replace(/^ssh:\/\/git@([^/]+)\//,"https://$1/").replace(/^https?:\/\/([^/]+)\//,"https://$1/").replace(/\.git$/u,"").toLowerCase()}function mh(e){let t=e.replace(/\/+$/u,"");return fe.basename(t)||"workspace"}function gh(e){return e.toLowerCase().replace(/[^a-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"")||"workspace"}function sa(e){if(!e)return{};let t=fe.join(fe.resolve(e),"config.yaml");if(!cn(t))return{};let r=jd(t,"utf8"),o={},n=!1,s=!1,a="";for(let i of r.split(/\r?\n/u)){if(/^\S/u.test(i)){n=/^project:\s*$/u.test(i),s=!1;continue}let l=i.match(/^([ \t]+)aliases:\s*(?:\{\}\s*)?$/u);if(n&&l?.[1]){s=!0,a=l[1];continue}if(s){if(i.trim().length===0||i.trim().startsWith("#"))continue;let c=i.match(/^([ \t]+)(?:"([^"]+)"|'([^']+)'|([^:]+)):\s*(?:"([^"]+)"|'([^']+)'|(.+))\s*$/u);(c?.[1]??"").length<=a.length&&(s=!1);let p=c?.[2]??c?.[3]??c?.[4],g=c?.[5]??c?.[6]??c?.[7];s&&p&&g?o[p.trim()]=g.trim():/^[ \t]+\S/u.test(i)&&i.trim().length>0&&(s=!1)}}return o}import{readFile as fh,writeFile as hh}from"node:fs/promises";import yh from"node:path";async function aa(e){let t=f(e.home),r=yh.join(t.home,"config.yaml"),o=await R(r)?await fh(r,"utf8"):`version: 1
841
841
  `,n=o.includes(`\r
842
842
  `)?`\r
843
843
  `:`
844
- `,s={...Ed(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=sh(o,s,n),c=l!==o;return e.apply&&c&&await nh(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 Ed(e){let t=Pd(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 sh(e,t,r){let o=Pd(e),n=Ed(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}${Ad(l)}: ${Ad(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 Sd([...l,...c,...s,...d],r,e.endsWith(`
845
- `))}if(n.projectStart>=0){let l=n.projectStart+1,c=o.slice(0,l),d=o.slice(l);return Sd([...c,`${n.projectIndent}aliases:`,...s,...d],r,e.endsWith(`
844
+ `,a={...Od(o).aliases},i=a[e.aliasKey]??null;if(e.action==="add"){if(!e.projectId)throw new Error("project alias add requires <id>");a[e.aliasKey]=e.projectId}else delete a[e.aliasKey];let l=_h(o,a,n),c=l!==o;return e.apply&&c&&await hh(r,l,{encoding:"utf8",mode:384}),{action:e.action,applied:e.apply===!0,config_path:r,alias_key:e.aliasKey,project_id:e.action==="add"?e.projectId??null:null,previous_id:i,aliases:a,changed:c,preview:l}}function Od(e){let t=Md(e),r={},o=[],n=-1,s=-1,a=-1,i=" ",l=" ";for(let c=0;c<t.length;c+=1)if(/^project:\s*$/u.test(t[c]??"")){n=c;break}if(n>=0)for(let c=n+1;c<t.length;c+=1){let d=t[c]??"";if(/^\S/u.test(d)&&d.trim().length>0)break;let p=d.match(/^([ \t]+)aliases:\s*(?:\{\}\s*)?$/u);if(p?.[1]){s=c,i=p[1],l=`${i}${i.includes(" ")?" ":" "}`;break}}if(s>=0){a=s+1;for(let c=s+1;c<t.length;c+=1){let d=t[c]??"";if(d.trim().length===0||d.trim().startsWith("#")){a=c+1;continue}let p=d.match(/^([ \t]+)(?:"([^"]+)"|'([^']+)'|([^:]+)):\s*(?:"([^"]+)"|'([^']+)'|(.+))\s*$/u),g=p?.[1]??"";if(!p||g.length<=i.length)break;let y=p[2]??p[3]??p[4],k=p[5]??p[6]??p[7];if(y&&k){let S=y.trim();r[S]=k.trim(),o.includes(S)||o.push(S)}a=c+1}}return{aliases:r,aliasOrder:o,projectStart:n,aliasesStart:s,aliasesEnd:a,projectIndent:i,aliasIndent:l}}function _h(e,t,r){let o=Md(e),n=Od(e),a=[...n.aliasOrder.filter(l=>Object.prototype.hasOwnProperty.call(t,l)),...Object.keys(t).filter(l=>!n.aliasOrder.includes(l))].map(l=>`${n.aliasIndent}${Nd(l)}: ${Nd(t[l]??"")}`);if(n.aliasesStart>=0){let l=o.slice(0,n.aliasesStart+1),c=o.slice(n.aliasesStart+1,n.aliasesEnd).filter(p=>{let g=p.trim();return g.length===0||g.startsWith("#")}),d=o.slice(n.aliasesEnd);return Cd([...l,...c,...a,...d],r,e.endsWith(`
845
+ `))}if(n.projectStart>=0){let l=n.projectStart+1,c=o.slice(0,l),d=o.slice(l);return Cd([...c,`${n.projectIndent}aliases:`,...a,...d],r,e.endsWith(`
846
846
  `))}return`${e.length>0&&!e.endsWith(`
847
- `)?`${e}${r}`:e}project:${r}${n.projectIndent}aliases:${r}${s.join(r)}${s.length?r:""}`}function Pd(e){return e.replace(/\r\n/gu,`
847
+ `)?`${e}${r}`:e}project:${r}${n.projectIndent}aliases:${r}${a.join(r)}${a.length?r:""}`}function Md(e){return e.replace(/\r\n/gu,`
848
848
  `).split(`
849
- `).filter((t,r,o)=>r<o.length-1||t.length>0)}function Sd(e,t,r){let o=e.join(t);return r||e.length>0?`${o}${t}`:o}function Ad(e){return/^[A-Za-z0-9._/-]+$/u.test(e)?e:JSON.stringify(e)}import Md from"node:path";var ih={minLength:1,removeStopwords:!1,normalizeDiacritics:!1};function sn(e,t={}){let r={...ih,...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||!lh.has(n))??[]))}function Fr(e,t={}){return new Set(sn(e,t))}function ts(e,t){let r=sn(e);if(r.length===0)return 0;let o=Fr(t),n=r.filter(a=>o.has(a)).length;return Number((n/r.length).toFixed(6))}function xd(e,t,r={}){let o=Fr(e,r),n=Fr(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 jd(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 lh=new Set(["the","and","for","with","this","that","uma","com","para","por","que","deve","esta","este","essa","isso"]);var et=1,tt="local-hash",rt="local-hash-bow-v1";async function rs(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=ch(c),p=o.getSemanticIndex(c.id);if(p&&p.content_hash===d.contentHash&&p.provider_id===tt&&p.model_id===rt&&p.schema_version===et){s+=1;continue}d.redacted&&(i+=1),a.push({memory_id:c.id,scope_project:c.scope.project,source:c.source,schema_version:et,provider_id:tt,model_id:rt,content_hash:d.contentHash,embedding:Cd(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:tt,model_id:rt,schema_version:et,indexable_count:n.length,indexed_count:a.length,skipped_unchanged:s,redacted_count:i}}),{provider_id:tt,model_id:rt,schema_version:et,indexable_count:n.length,indexed_count:a.length,skipped_unchanged:s,redacted_count:i}}function Td(e){let t=_(e,{readOnly:!0});try{let r=t.semanticIndexStats({providerId:tt,modelId:rt,schemaVersion:et});return{provider_id:tt,model_id:rt,schema_version:et,available:!0,indexable_count:r.indexable_count,indexed_count:r.indexed_count,stale_count:r.stale_count,healthy:r.stale_count===0,remediation:r.stale_count===0?null:"Run nativesoul memory index"}}finally{t.close()}}function Ur(e){let t=_(e.database,{readOnly:e.readOnly}),r=Math.min(Math.max(e.limit,1),8);try{let o=t.searchMemories(e.query,e.project,r),n=t.semanticIndexStatsForProject({project:e.project,providerId:tt,modelId:rt,schemaVersion:et});if(n.indexable_count===0||n.indexed_count===0||n.stale_count>0)return{mode:"fts",reason:n.stale_count>0?"semantic_index_stale":"semantic_index_unavailable",memories:Id(o.length>0?o:t.recentMemories(e.project,r),e.query)};let a=t.listCurrentSemanticIndexesForProject({project:e.project,providerId:tt,modelId:rt,schemaVersion:et,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,ts(e.query,`${p.summary}
850
- ${p.content}`)])),c=Cd(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=jd(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:Id(o,e.query)}}finally{t.close()}}function ch(e){let t=O(`${e.summary}
851
-
852
- ${e.content}`);return{text:t.value,contentHash:e.hash,redacted:t.redacted}}function Cd(e){let r=Array.from({length:32},()=>0);for(let n of sn(e)){let a=dh(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 Id(e,t){return e.map((r,o)=>({...r,recall:{mode:"fts",fts_score:ts(t,`${r.summary}
853
- ${r.content}`),semantic_score:0,final_rank:o+1,reason:"fts_fallback"}}))}function dh(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 Ve(e,t=160){let r=e.replace(/\s+/g," ").trim();return r.length<=t?r:`${r.slice(0,t-3)}...`}function Vr(e){return Math.ceil(e.length/4)}function ln(e,t){return e.length<=t?e:`${e.slice(0,Math.max(t-3,0))}...`}var wt=class extends Error{code="MEMORY_TRANSITION_BLOCKED";id;from;to;constructor(t){super(`Invalid memory transition for ${t.id}: ${t.from} -> ${t.to}`),this.name="MemoryTransitionError",this.id=t.id,this.from=t.from,this.to=t.to}},uh=new Map([["candidate",new Set(["active","rejected"])],["active",new Set(["forgotten","expired"])],["superseded",new Set],["rejected",new Set],["forgotten",new Set],["expired",new Set]]);async function os(e,t){let r=await v(e),o=await Hd(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 ne(e,t){let r=await v(e),o=await Hd(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 ns(e){let t=await v(e.home),r=Md.resolve(e.cwd);await $r({cwd:r,home:t.home});let o=L(r,t.home),n=e.event?.trim()||"session-end",a=ph(e.text,e.payload),s=[`Session memory candidate from ${e.host} ${n} hook.`,"",`Project: ${o}`,`CWD: ${r}`,"","Summary:",a.text].join(`
854
- `),i=await ne(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 ph(e,t){let r=e?.trim();if(r)return{text:Nd(r),source:"text"};let o=mh(t);return o?{text:Nd(o),source:"payload"}:{text:"No host session summary was supplied. Review this candidate against the recent session before promotion.",source:"stub"}}function mh(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 Nd(e){return e.length<=8e3?e:`${e.slice(0,7997)}...`}async function as(e){let t=await v(e.home),r=Md.resolve(e.cwd),o=L(r,t.home),n=await gh(t.home),a=Ld(e.prompt,n),s=Math.min(Math.max(e.limit??3,1),3),i=[];if(a.triggered){let l=Ur({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:fh(i,a)}}function Ld(e,t=Dd()){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 Dd(){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 gh(e){let t=Dd(),r=await ue(e,"config.yaml"),o=r.match(/^\s*auto_trigger:\s*(true|false)\s*$/imu);o?.[1]&&(t.autoTrigger=o[1].toLowerCase()==="true");let n=Od(r,"keywords");n.length>0&&(t.keywords=n.map(s=>s.toLowerCase()));let a=Od(r,"denylist");return a.length>0&&(t.denylist=a.map(s=>s.toLowerCase())),t}function Od(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 fh(e,t){if(!t.triggered||e.length===0)return"";let r=["## NativeSoul Memory Recall",`Trigger: ${t.reason}`,""];for(let o of e)r.push(`- ${o.summary}`);return r.join(`
855
- `).slice(0,1800)}async function Rt(e,t){return cn(e,t,"active","memory_promoted")}async function St(e,t){return cn(e,t,"rejected","memory_rejected")}async function At(e,t){return cn(e,t,"forgotten","memory_forgotten")}async function Br(e,t){return cn(e,t,"expired","memory_expired")}async function Et(e){let t=await v(e.home),r=_(t.database),o;try{o=r.listMemories({project:e.project,status:e.status,includeForgotten:e.includeForgotten,limit:Math.min(Math.max(e.limit??100,1),1e3)})}finally{r.close()}return await h({home:t.home,type:"memory_exported",details:{project:e.project??null,status:e.status??null,includeForgotten:e.includeForgotten===!0,count:o.length}}),o}async function Hd(e,t,r){let o=O(t.content),n=new Date().toISOString(),a=Ve(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:be({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 cn(e,t,r,o){let n=await v(e),a=_(n.database),s,i;try{if(s=a.getMemory(t),s&&!dn(s.status,r))throw new wt({id:t,from:s.status,to:r});i=s?a.updateMemoryStatus(t,r):null}catch(l){throw l instanceof wt&&await hh({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}}),i}function dn(e,t){return uh.get(e)?.has(t)??!1}async function hh(e){await h({home:e.home,type:"memory_transition_blocked",result:"blocked",details:{id:e.id,from:e.from,to:e.to,code:"MEMORY_TRANSITION_BLOCKED"}})}async function Pt(e,t,r,o=5){let n=await v(e),a=Ur({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 ss(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:$d(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:$d(e.resolution)}}),{touched:!0,inserted:o.inserted,degraded:!1,warning:null}}catch(o){return{touched:!1,inserted:!1,degraded:!0,warning:`PROJECT_REGISTRY_UNAVAILABLE:${wh(o)}`}}finally{r?.close()}}async function is(e={}){let t=f(e.home),r=bh(e.limit),o=e.status??"active";if(!await R(t.database))return{registry_available:!1,status:o,limit:r,projects:[],warning:"database_not_available"};let n=_(t.database,{readOnly:e.readOnly??!0});try{let 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==="."?yh(e.cwd??process.cwd(),t.home):_h(e.id);if(!await R(t.database))return Fd(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 Fd(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 cs(e){let t=f(e.home),r=vh(e.name),o=e.id==="."?Z(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 ds(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 un({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 un({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,dn);return c.found&&c.project&&await h({home:t.home,type:"project_forgotten",details:{id:e.id,memories_affected:c.memories_affected}}),un({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 Jt&&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}}),un({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 us(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 ps(e={}){return{aliases:Za(f(e.home).home)}}async function ms(e){let t=f(e.home),r=await es({home:t.home,action:"add",aliasKey:Ud(e.alias),projectId:kh(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 gs(e){let t=f(e.home),r=await es({home:t.home,action:"remove",aliasKey:Ud(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 $d(e){return e.remote??e.git_root??e.cwd}function yh(e,t){let r=Z(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 _h(e){return{id:e,source:"explicit",cwd:null,git_root:null,remote:null,base_id:null,alias_key:null,marker_path:null}}function Fd(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 bh(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),500)}function vh(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 Ud(e){let t=e.trim();if(t.length===0)throw new Error("project alias requires a non-empty alias");return t}function kh(e){let t=e.trim();if(t.length===0||t===".")throw new Error("project alias add requires an explicit project id");return t}function un(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 wh(e){return(e instanceof Error?e.message:String(e)).replace(/[^a-zA-Z0-9_.:-]+/g,"_").slice(0,120)}var Rh=/^-\s*\*\*([^:*]+):\*\*\s*(.*)$/u;function xt(e,t){let r=Sh(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(Rh);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 Vd(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 Bd(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 Sh(e,t){let r=`${t}:`,o=e.split(/\r?\n/u).map(n=>n.trim()).find(n=>n.startsWith(r));return o?o.slice(r.length).trim():null}async function It(e){let t=e.readOnly?f(e.home):await v(e.home),r=await Ph(t.home),o=Math.min(Math.max(e.tokensMax??r.defaultTokens,1),3e3),n=[];e.readOnly!==!0&&await $r({cwd:e.cwd,home:t.home});let a=Z(e.cwd,t.home),s=a.id;if(e.readOnly!==!0){let U=await ss({home:t.home,resolution:a});U.warning&&n.push(U.warning)}let i=xh({explicitQuery:e.query,project:s,host:e.host,cwd:e.cwd,seed:r.memoryQuerySeed}),l=await Ah({database:t.database,readOnly:e.readOnly===!0,memoryQuery:i,project:s,limit:r.recallLimit,warnings:n}),c=await we({home:t.home,host:e.host,readyOnly:!0,limit:8,readOnly:e.readOnly}),d=await Th(t.home,e.host,e.readOnly===!0),p=await Ka({home:t.home,host:e.host,query:e.query??`${jt.basename(e.cwd)} ${e.host}`,limit:8,readOnly:e.readOnly}),g=await Dr({home:t.home,project:s,status:"open",limit:8,readOnly:e.readOnly}),y=await ue(t.home,"IDENTITY.md"),k=await ue(t.home,"SOUL.md"),S=await ue(t.home,"AGENTS.md"),D=await ue(t.home,"USER.md"),ye=await ue(t.home,"BOOTSTRAP.md"),Pe=new Date().toISOString().slice(0,10),Ye=jt.join(t.home,"memory","daily",`${Pe}.md`);n.push(...d?[]:[`HOST_ADAPTER_UNAVAILABLE:${e.host}`,"CAPABILITY_REFRESH_STALE"],...p.warnings),!await R(jt.join(t.home,"state","onboarding.complete"))&&ye.trim().length>0&&n.push("BOOTSTRAP_RITUAL_PENDING"),await R(Ye)&&n.push(`DAILY_MEMORY_AVAILABLE:${Ye}`),r.warnEmptyMemories&&l.length===0&&n.push("PROJECT_MEMORY_EMPTY");let xe={bootstrap_schema:2,identity:{name:xt(y,"Name")??"NativeSoul",mission:xt(y,"Mission")??"Provide local continuity across native coding-agent hosts.",creature:xt(y,"Creature"),role:xt(y,"Role"),vibe:xt(y,"Vibe"),emoji:xt(y,"Emoji")},soul_summary:Vd(k||"Continuity, clarity, and safe local-first operation.",500),agents_operating_summary:Bd(S||"Load NativeSoul context before continuity-sensitive work. Use MCP when available and CLI fallback when needed."),tool_hints:jh(),user:{preferences_summary:Ih(D)},project:{id:s,cwd:jt.resolve(e.cwd),state:"local-bootstrap"},commitments:g.map(U=>({id:U.id,status:U.status,summary:U.summary,due_at:U.due_at,ttl_expires_at:U.ttl_expires_at})),relevant_memories:l.map(U=>({id:U.id,summary:U.summary,scope:U.scope})),capabilities:c.map(U=>({uid:U.uid,host:U.host,ready:U.ready,source:U.source})),capability_cards:p.cards,policy:{mode:"safe",approval_required:["external_write","destructive","identity_policy_change"]},warnings:n},x=Ch(xe,o),br=Vr(JSON.stringify(x)),qn={...x,context_budget:{tokens_used:br,tokens_max:o}};return e.readOnly||await h({home:t.home,type:"bootstrap_created",details:{host:e.host,cwd:jt.resolve(e.cwd),project:s,tokens:br}}),qn}async function Ah(e){if(!await R(e.database))return e.warnings.push("BOOTSTRAP_DATABASE_MISSING"),[];let t=null;try{t=_(e.database,{readOnly:e.readOnly});let r=Ur({database:e.database,query:e.memoryQuery,project:e.project,limit:e.limit,readOnly:e.readOnly}).memories;return r.length===0?t.recentMemories(e.project,e.limit):r}catch(r){return e.warnings.push(`BOOTSTRAP_DATABASE_UNAVAILABLE:${Eh(r)}`),[]}finally{t?.close()}}function Eh(e){return(e instanceof Error?e.message:String(e)).replace(/[^a-zA-Z0-9_.:-]+/g,"_").slice(0,120)}async function Ph(e){let t=await ue(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 xh(e){return[e.explicitQuery,e.project,e.host,jt.basename(jt.resolve(e.cwd)),e.seed].filter(t=>typeof t=="string"&&t.trim().length>0).join(" ")}function jh(){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 Ih(e){let t=e.trim();return t.length===0?"No curated user preferences yet.":t.length<=160?t:`${t.slice(0,157)}...`}async function Th(e,t,r=!1){let o=await we({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 Ch(e,t){let r=[e,ot(e,1200,420,150),ot(e,900,320,130),ot(e,650,240,110),ot(e,420,180,90),ot(e,240,120,80),fs(ot(e,240,120,80),8,8),fs(ot(e,240,120,80),5,5),fs(ot(e,240,120,80),3,3)];return r.find(o=>Vr(JSON.stringify(o))<=t)??r[r.length-1]??e}function fs(e,t,r){return{...e,capabilities:e.capabilities.slice(0,t),capability_cards:e.capability_cards.slice(0,r),relevant_memories:e.relevant_memories.slice(0,t),commitments:e.commitments.slice(0,t)}}function ot(e,t,r,o){return{...e,soul_summary:ln(e.soul_summary,r),agents_operating_summary:ln(e.agents_operating_summary,t),user:{...e.user,preferences_summary:ln(e.user.preferences_summary,o)}}}import{existsSync as Vs}from"node:fs";import Mu from"node:path";import{mkdir as Nh,readFile as Oh,writeFile as Wd}from"node:fs/promises";import hs from"node:path";var pn={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 Jd(e,t){let r=await nt(e),o=await R(zt(e));return{phase:t?"identity_pending":r&&o?"active":"pending",configured:r!==null,complete_marker_present:o,existing_profile:r,available_profiles:["quickstart","advanced"],quickstart_defaults:pn,apply_defaults:{dry_run:!0,user_confirmed:!1,reset:!1}}}async function ys(e){let t=await v(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,n=e.reset===!0,a=await nt(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=Mh(e.profile,e.options),i=Dh(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 Nh(hs.join(t.home,"state"),{recursive:!0,mode:448}),await Wd(qd(t.home),`${JSON.stringify(s,null,2)}
856
- `,{encoding:"utf8",mode:384}),await Wd(zt(t.home),`${new Date().toISOString()}
857
- `,{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 qd(e){return hs.join(e,"state","activation-profile.json")}function zt(e){return hs.join(e,"state","activation.complete")}async function nt(e){try{let t=JSON.parse(await Oh(qd(e),"utf8"));return Hh(t)?t:null}catch{return null}}function Mh(e,t){return{...pn,...Lh(t),profile:e,updated_at:new Date().toISOString()}}function Lh(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 Dh(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 Hh(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;let t=e;return(t.profile==="quickstart"||t.profile==="advanced")&&typeof t.heartbeat_enabled=="boolean"&&(typeof t.scheduler_host=="string"||t.scheduler_host===null)&&typeof t.heartbeat_cadence=="string"&&typeof t.memory_candidates=="boolean"&&(t.memory_candidate_policy==="candidate"||t.memory_candidate_policy==="off")&&typeof t.auto_promotion=="boolean"&&(t.promotion_policy==="manual"||t.promotion_policy==="explicit_approval")&&Array.isArray(t.recall_auto_trigger_keywords)&&t.recall_auto_trigger_keywords.every(r=>typeof r=="string")&&Array.isArray(t.recall_auto_trigger_denylist)&&t.recall_auto_trigger_denylist.every(r=>typeof r=="string")&&typeof t.candidate_auto_promotion_threshold=="number"&&Number.isFinite(t.candidate_auto_promotion_threshold)&&t.candidate_auto_promotion_threshold>=0&&t.candidate_auto_promotion_threshold<=1&&typeof t.recall_auto_trigger=="boolean"&&Array.isArray(t.standing_order_templates)&&t.standing_order_templates.every(r=>typeof r=="string")&&typeof t.updated_at=="string"}function _s(e){let t={bootstrap:$h(e),mcp:Fh(e),plugins_hooks:Uh(e),heartbeat:Vh(e),recall_auto_trigger:Bh(e),memory_candidate_hooks:Wh(e),memory_promotion_policy:Jh(e),cross_host_verification:qh(e)},r=Object.values(t),o=Kh(r),n=r.flatMap(s=>s.plan_actions),a=Gh(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 Kd(e){return _s(e).summary}function $h(e){return e.onboardingComplete&&e.activationComplete&&e.profile?F("bootstrap","active","Identity onboarding and activation marker are present.",{onboarding_complete:!0,activation_complete:!0}):F("bootstrap",e.onboardingComplete?"approval_required":"not_configured",e.onboardingComplete?"Activation profile still needs explicit approval.":"Identity onboarding is not complete.",{onboarding_complete:e.onboardingComplete,activation_complete:e.activationComplete},[Tt("activation-profile","bootstrap","approval_required","Write activation profile and completion marker.",`${e.home}/state/activation-profile.json`,!0,"17.1 activation apply is explicit-approval only.")])}function Fh(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 F("mcp",r?"degraded":"active",r?"MCP is configured but doctor reported warnings.":"MCP registration is configured.",{configured_hosts:t.map(ge),checked_hosts:e.hosts.map(ge)})}return F("mcp","not_configured","No MCP registration was detected for the selected host scope.",{checked_hosts:e.hosts.map(ge)},[Tt("mcp-registration","mcp","not_configured","Install MCP registration for selected hosts.",`nativesoul mcp install --host ${e.host} --apply`,!0,"MCP registration changes host config files.")])}function Uh(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 F("plugins_hooks",o?"degraded":"active",o?"Plugin/hooks are available through fallback support.":"Native plugin or hook support is active.",{enabled_hosts:t.map(ge),hook_modes:Object.fromEntries(e.hosts.map(n=>[ge(n),n.provider_parity.hooks]))})}let r=e.hosts.length>0&&e.hosts.every(o=>o.plugin.package_kind==="unsupported-native");return F("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(ge)},[Tt("plugin-install","plugins_hooks",r?"blocked_by_host":"not_configured","Install NativeSoul plugin/hook package where the host supports it.",`nativesoul install --host ${e.host} --apply`,!0,"Host plugin/hook setup modifies host-specific config.")])}function Vh(e){if(!e.profile||!e.profile.heartbeat_enabled)return F("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?F("heartbeat","blocked_by_host","At least one selected host lacks native scheduler support.",{blocked_hosts:t.map(ge),heartbeat_modes:Object.fromEntries(e.hosts.map(r=>[ge(r),r.provider_parity.heartbeat]))},[Tt("heartbeat-scheduler","heartbeat","blocked_by_host","Choose a native scheduler-capable host or keep external fallback explicit.",`nativesoul schedule reconcile --host ${e.host} --mode leader --apply`,!0,"Scheduler writes must remain explicit and host-aware.")]):e.hosts.some(r=>r.provider_parity.heartbeat==="native")?F("heartbeat","active","Heartbeat has native scheduler support in the selected scope.",{native_hosts:e.hosts.filter(r=>r.provider_parity.heartbeat==="native").map(ge)}):e.hosts.some(r=>r.provider_parity.heartbeat==="official-fallback")?F("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(ge)}):F("heartbeat","approval_required","Heartbeat profile is enabled, but no scheduler desired state is active yet.",{checked_hosts:e.hosts.map(ge)},[Tt("heartbeat-enable","heartbeat","approval_required","Create/reconcile recurring heartbeat schedule.",`nativesoul schedule reconcile --host ${e.host} --mode leader --apply`,!0,"Recurring automation requires explicit approval.")])}function Bh(e){return e.profile?e.profile.recall_auto_trigger?F("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}):F("recall_auto_trigger","approval_required","Automatic recall trigger is intentionally disabled until explicit approval.",{recall_auto_trigger:!1},[Tt("recall-auto-trigger","recall_auto_trigger","approval_required","Set recall_auto_trigger=true in activation profile.","state/activation-profile.json:recall_auto_trigger",!0,"Prompt injection into host sessions must be explicitly approved.")]):F("recall_auto_trigger","not_configured","No activation profile is present.",{})}function Wh(e){if(!e.profile||!e.profile.memory_candidates)return F("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 F("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=>[ge(r),r.provider_parity.hooks]))})}function Jh(e){return e.profile?e.profile.auto_promotion?F("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}):F("memory_promotion_policy","approval_required","Memory promotion requires explicit approval.",{auto_promotion:!1,promotion_policy:e.profile.promotion_policy}):F("memory_promotion_policy","not_configured","No activation profile is present.",{})}function qh(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")?F("cross_host_verification","active","Multiple selected hosts were verified by deep doctor.",{host_count:t,ready_other_hosts:r}):F("cross_host_verification",r>0?"degraded":"approval_required","Cross-host verification needs an all-host deep doctor pass before full activation claims.",{host_count:t,ready_other_hosts:r},[Tt("cross-host-verify","cross_host_verification","approval_required","Run all-host deep verification.","nativesoul doctor --deep --all-hosts --json",!1,"Verification is read-only but must be run against every host.")])}function F(e,t,r,o,n=[]){return{key:e,status:t,summary:r,evidence:o,plan_actions:n}}function Tt(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 Kh(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 Gh(e,t,r){return{overall_status:t,profile:e?.profile??null,active:Wr(r,"active"),not_configured:Wr(r,"not_configured"),approval_required:Wr(r,"approval_required"),blocked_by_host:Wr(r,"blocked_by_host"),degraded:Wr(r,"degraded"),full_native_claimed:!1}}function Wr(e,t){return e.filter(r=>r.status===t).length}function ge(e){return e.surface==="default"?e.host:`${e.host}:${e.surface}`}import{existsSync as Xh}from"node:fs";import zh from"node:path";async function Jr(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 R(zh.join(t.home,a))||r.push({code:"MISSING_HUMAN_FILE",severity:"warn",message:`${a} is missing`,remediation:"Run nativesoul init"});if(!Xh(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(...Yh(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 Yh(e,t){let r=Z(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 Re from"node:os";import q from"node:path";function Gd(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 Xd(e){return e==="claude"?".claude.json":e==="gemini"?"settings.json":e==="antigravity"?"mcp_config.json":"mcp.json"}function qr(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 Be(e,t){return t&&t!=="default"?[qr(e,t)]:e==="claude"?["claude-code","claude-desktop"]:["default"]}function Ct(e,t){return t==="default"?e:t}function zd(e){switch(e){case"codex":return q.join(Re.homedir(),".codex","AGENTS.md");case"claude":return q.join(Re.homedir(),".claude","CLAUDE.md");case"grok":return q.join(Re.homedir(),".grok","Agents.md");case"antigravity":case"gemini":return q.join(Re.homedir(),".gemini","GEMINI.md")}}function mn(e){switch(e){case"codex":return q.join(Re.homedir(),".codex","mcp.json");case"claude":return q.join(Re.homedir(),".claude.json");case"grok":return q.join(Re.homedir(),".grok","mcp.json");case"antigravity":return q.join(Re.homedir(),".gemini","antigravity-cli","mcp_config.json");case"gemini":return q.join(Re.homedir(),".gemini","settings.json")}}function Yd(){return Qd({platform:process.platform,home:Re.homedir(),env:process.env})}function Qd(e){let t=e.platform==="win32"?q.win32:q.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 Zd(e,t){if(e!=="claude")return null;if(!t)return q.join(Re.homedir(),".claude","mcp.json");let r=q.resolve(t),o=q.dirname(r);return q.basename(o)==="claude"?q.join(o,"mcp.json"):q.join(o,".claude","mcp.json")}import{mkdir as eu,rename as Qh,writeFile as ru}from"node:fs/promises";import fe from"node:path";var Zh=["entity","soul","human","collaboration","continuity"],ey=["SOUL.md","POLICY.md"],ou=new Set(["IDENTITY.md","SOUL.md","USER.md","AGENTS.md"]),Yt=64*1024,ty="<!-- nativesoul:start v1 -->",tu="<!-- nativesoul:end -->",ry={"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:Yt},"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:Yt},"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:Yt},"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:Yt},"POLICY.md":{writable:!1,requires_user_confirmed:!1,field_format:"Use policy propose-change after onboarding",merge_strategy:"replace",max_bytes:0}};async function Kr(e){let t=await v(e),o=(await ue(t.home,"BOOTSTRAP.md")).trim().length>0;return{ritual_pending:o,files_present:{soul:await R(fe.join(t.home,"SOUL.md")),identity:await R(fe.join(t.home,"IDENTITY.md")),user:await R(fe.join(t.home,"USER.md")),agents:await R(fe.join(t.home,"AGENTS.md")),bootstrap:await R(fe.join(t.home,"BOOTSTRAP.md"))},protected_targets:[...ey],writable_files:[...ou],interview_themes:[...Zh],instruction_doc:"llm-install.txt",apply_defaults:{dry_run:!0,user_confirmed:!1},file_generation_rules:ry,activation:await Jd(t.home,o)}}async function Gr(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(!ou.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")>Yt){n.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:`FILE_TOO_LARGE: ${l} exceeds ${Yt} bytes`});continue}let p=fe.join(t.home,l),g=await ue(t.home,l),y=l==="AGENTS.md"?oy(g,d):d,k=g.length>0?A(g):null,S=A(y);if(k===S){n.push({file:l,action:"noop",before_hash:k,after_hash:S});continue}let D=g.length===0?"create":"update";n.push({file:l,action:D,before_hash:k,after_hash:S}),r||await ru(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 Xr(e){let t=f(e?.home),r=fe.join(t.home,"BOOTSTRAP.md");if(!await R(r))return{already_complete:!0,archived_bootstrap:!1,archive_path:null};let o=e?.archive!==!1,n=null;if(o){let s=fe.join(t.home,"memory","archive");await eu(s,{recursive:!0,mode:448});let i=new Date().toISOString().replace(/[:.]/gu,"-");n=fe.join(s,`bootstrap-${i}.md`),await Qh(r,n)}else{let{rm:s}=await import("node:fs/promises");await s(r,{force:!0})}let a=fe.join(t.home,"state","onboarding.complete");return await eu(fe.join(t.home,"state"),{recursive:!0,mode:448}),await ru(a,`${new Date().toISOString()}
858
- `,{encoding:"utf8",mode:384}),await h({home:t.home,type:"onboarding.completed",details:{archived:o,archive_path:n}}),{already_complete:!1,archived_bootstrap:o,archive_path:n}}function gn(e){return fe.join(e,"state","onboarding.complete")}function oy(e,t){let r=t.trim();if(!e.trim())return`${r}
859
- `;if(e.includes(r))return e;let o=ny(e);if(o){let a=o.after.trimEnd(),s=a.length>0?`${a}
849
+ `).filter((t,r,o)=>r<o.length-1||t.length>0)}function Cd(e,t,r){let o=e.join(t);return r||e.length>0?`${o}${t}`:o}function Nd(e){return/^[A-Za-z0-9._/-]+$/u.test(e)?e:JSON.stringify(e)}import Bd from"node:path";var bh={minLength:1,removeStopwords:!1,normalizeDiacritics:!1};function dn(e,t={}){let r={...bh,...t},o=r.normalizeDiacritics?e.normalize("NFKD").replace(new RegExp("\\p{Diacritic}","gu"),""):e;return Array.from(new Set(o.toLowerCase().match(/[\p{L}\p{N}_-]+/gu)?.filter(n=>n.length>=r.minLength).filter(n=>!r.removeStopwords||!vh.has(n))??[]))}function Vr(e,t={}){return new Set(dn(e,t))}function ia(e,t){let r=dn(e);if(r.length===0)return 0;let o=Vr(t),n=r.filter(s=>o.has(s)).length;return Number((n/r.length).toFixed(6))}function Ld(e,t,r={}){let o=Vr(e,r),n=Vr(t,r);if(o.size===0||n.size===0)return 0;let s=[...o].filter(i=>n.has(i)).length,a=new Set([...o,...n]).size;return Number((s/a).toFixed(6))}function Dd(e,t){let r=Math.min(e.length,t.length),o=0;for(let n=0;n<r;n+=1)o+=(e[n]??0)*(t[n]??0);return Number(Math.max(o,0).toFixed(6))}var vh=new Set(["the","and","for","with","this","that","uma","com","para","por","que","deve","esta","este","essa","isso"]);var et=1,tt="local-hash",rt="local-hash-bow-v1";async function la(e={}){let t=await v(e.home),r=Math.min(Math.max(e.limit??1e3,1),1e4),o=_(t.database),n,s=[],a=0,i=0;try{n=o.listSemanticIndexableMemories({limit:r});let l=new Date().toISOString();for(let c of n){let d=kh(c),p=o.getSemanticIndex(c.id);if(p&&p.content_hash===d.contentHash&&p.provider_id===tt&&p.model_id===rt&&p.schema_version===et){a+=1;continue}d.redacted&&(i+=1),s.push({memory_id:c.id,scope_project:c.scope.project,source:c.source,schema_version:et,provider_id:tt,model_id:rt,content_hash:d.contentHash,embedding:Fd(d.text),indexed_text:d.text,indexed_at:l})}s.length>0&&o.upsertSemanticIndex(s)}finally{o.close()}return await h({home:t.home,type:"semantic_index_built",details:{provider_id:tt,model_id:rt,schema_version:et,indexable_count:n.length,indexed_count:s.length,skipped_unchanged:a,redacted_count:i}}),{provider_id:tt,model_id:rt,schema_version:et,indexable_count:n.length,indexed_count:s.length,skipped_unchanged:a,redacted_count:i}}function $d(e){let t=_(e,{readOnly:!0});try{let r=t.semanticIndexStats({providerId:tt,modelId:rt,schemaVersion:et});return{provider_id:tt,model_id:rt,schema_version:et,available:!0,indexable_count:r.indexable_count,indexed_count:r.indexed_count,stale_count:r.stale_count,healthy:r.stale_count===0,remediation:r.stale_count===0?null:"Run nativesoul memory index"}}finally{t.close()}}function Br(e){let t=_(e.database,{readOnly:e.readOnly}),r=Math.min(Math.max(e.limit,1),8);try{let o=t.searchMemories(e.query,e.project,r),n=t.semanticIndexStatsForProject({project:e.project,providerId:tt,modelId:rt,schemaVersion:et});if(n.indexable_count===0||n.indexed_count===0||n.stale_count>0)return{mode:"fts",reason:n.stale_count>0?"semantic_index_stale":"semantic_index_unavailable",memories:Hd(o.length>0?o:t.recentMemories(e.project,r),e.query)};let s=t.listCurrentSemanticIndexesForProject({project:e.project,providerId:tt,modelId:rt,schemaVersion:et,limit:1e3}),a=t.listActiveMemoriesForProject(e.project,1e3),i=new Map(a.map(p=>[p.id,p])),l=new Map(o.map(p=>[p.id,ia(e.query,`${p.summary}
850
+ ${p.content}`)])),c=Fd(e.query),d=s.map(p=>{let g=i.get(p.memory_id);if(!g)return null;let y=l.get(g.id)??0,k=Dd(c,p.embedding);return{memory:g,ftsScore:y,semanticScore:k,score:Number((y*.55+k*.45).toFixed(6))}}).filter(p=>p!==null).filter(p=>p.ftsScore>0||p.semanticScore>0).sort((p,g)=>g.score-p.score||g.semanticScore-p.semanticScore||p.memory.id.localeCompare(g.memory.id)).slice(0,r).map((p,g)=>({...p.memory,recall:{mode:"hybrid",fts_score:p.ftsScore,semantic_score:p.semanticScore,final_rank:g+1,reason:p.ftsScore>0&&p.semanticScore>0?"fts_and_semantic":p.semanticScore>0?"semantic_neighbor":"fts_match"}}));return{mode:"hybrid",reason:"semantic_index_ready",memories:d.length>0?d:Hd(o,e.query)}}finally{t.close()}}function kh(e){let t=O(`${e.summary}
851
+
852
+ ${e.content}`);return{text:t.value,contentHash:e.hash,redacted:t.redacted}}function Fd(e){let r=Array.from({length:32},()=>0);for(let n of dn(e)){let s=wh(n),a=s%32,i=s%2===0?1:-1;r[a]=(r[a]??0)+i}let o=Math.hypot(...r)||1;return r.map(n=>Number((n/o).toFixed(6)))}function Hd(e,t){return e.map((r,o)=>({...r,recall:{mode:"fts",fts_score:ia(t,`${r.summary}
853
+ ${r.content}`),semantic_score:0,final_rank:o+1,reason:"fts_fallback"}}))}function wh(e){let t=2166136261;for(let r=0;r<e.length;r+=1)t^=e.charCodeAt(r),t=Math.imul(t,16777619);return t>>>0}function Be(e,t=160){let r=e.replace(/\s+/g," ").trim();return r.length<=t?r:`${r.slice(0,t-3)}...`}function Wr(e){return Math.ceil(e.length/4)}function un(e,t){return e.length<=t?e:`${e.slice(0,Math.max(t-3,0))}...`}var wt=class extends Error{code="MEMORY_TRANSITION_BLOCKED";id;from;to;constructor(t){super(`Invalid memory transition for ${t.id}: ${t.from} -> ${t.to}`),this.name="MemoryTransitionError",this.id=t.id,this.from=t.from,this.to=t.to}},Rh=new Map([["candidate",new Set(["active","rejected"])],["active",new Set(["forgotten","expired"])],["superseded",new Set],["rejected",new Set],["forgotten",new Set],["expired",new Set]]);async function ca(e,t){let r=await v(e),o=await qd(r.database,t,"active");return await h({home:r.home,type:"memory_added",details:{id:o.id,project:o.scope.project,redacted:o.sensitivity==="restricted"}}),o}async function ae(e,t){let r=await v(e),o=await qd(r.database,t,"candidate");return await h({home:r.home,type:"memory_proposed",details:{id:o.id,project:o.scope.project,redacted:o.sensitivity==="restricted"}}),o}async function da(e){let t=await v(e.home),r=Bd.resolve(e.cwd);await Ur({cwd:r,home:t.home});let o=L(r,t.home),n=e.event?.trim()||"session-end",s=Sh(e.text,e.payload),a=[`Session memory candidate from ${e.host} ${n} hook.`,"",`Project: ${o}`,`CWD: ${r}`,"","Summary:",s.text].join(`
854
+ `),i=await ae(t.home,{project:o,content:a,confidence:s.source==="stub"?.2:.45,authority:"hook_observed",source:{kind:"session_end_hook",host:e.host,event:n,cwd:r,summary_source:s.source}});return{proposed:!0,host:e.host,event:n,cwd:r,project:o,memory:i,summary_source:s.source}}function Sh(e,t){let r=e?.trim();if(r)return{text:Ud(r),source:"text"};let o=Ah(t);return o?{text:Ud(o),source:"payload"}:{text:"No host session summary was supplied. Review this candidate against the recent session before promotion.",source:"stub"}}function Ah(e){if(typeof e=="string")return e.trim()||null;if(!e||Array.isArray(e)||typeof e!="object")return null;for(let t of["summary","session_summary","transcript_summary","conversation_summary","text","content"]){let r=e[t];if(typeof r=="string"&&r.trim().length>0)return r.trim()}return null}function Ud(e){return e.length<=8e3?e:`${e.slice(0,7997)}...`}async function ua(e){let t=await v(e.home),r=Bd.resolve(e.cwd),o=L(r,t.home),n=await Eh(t.home),s=Wd(e.prompt,n),a=Math.min(Math.max(e.limit??3,1),3),i=[];if(s.triggered){let l=Br({database:t.database,query:s.query,project:o,limit:a});i=l.memories,await h({home:t.home,type:"memory_recalled",details:{host:e.host,project:o,reason:s.reason,query:s.query,count:i.length,recall_mode:l.mode,recall_reason:l.reason}})}return{host:e.host,cwd:r,project:o,prompt:e.prompt,decision:s,memories:i,context:Ph(i,s)}}function Wd(e,t=Jd()){let r=e.trim(),o=r.toLowerCase();if(!t.autoTrigger)return{triggered:!1,reason:"auto_trigger_disabled",denied:!1,auto_trigger:!1,query:r};if(r.length===0)return{triggered:!1,reason:"empty_prompt",denied:!0,auto_trigger:!0,query:r};let n=t.denylist.find(a=>o===a||o.startsWith(`${a} `));if(n)return{triggered:!1,reason:`denylist:${n}`,denied:!0,auto_trigger:!0,query:r};let s=t.keywords.find(a=>o.includes(a));return s?{triggered:!0,reason:`keyword:${s}`,denied:!1,auto_trigger:!0,query:r}:{triggered:!1,reason:"no_trigger",denied:!1,auto_trigger:!0,query:r}}function Jd(){return{autoTrigger:!1,keywords:["como combinamos","como decidimos","o que combinamos","decisao anterior","decis\xE3o anterior","prior decision","previous decision","remember","lembr","memoria","mem\xF3ria","contexto anterior","last time"],denylist:["lint","format","typecheck","test","build"]}}async function Eh(e){let t=Jd(),r=await me(e,"config.yaml"),o=r.match(/^\s*auto_trigger:\s*(true|false)\s*$/imu);o?.[1]&&(t.autoTrigger=o[1].toLowerCase()==="true");let n=Vd(r,"keywords");n.length>0&&(t.keywords=n.map(a=>a.toLowerCase()));let s=Vd(r,"denylist");return s.length>0&&(t.denylist=s.map(a=>a.toLowerCase())),t}function Vd(e,t){let r=e.split(/\r?\n/u),o=[],n=!1;for(let s of r){if(new RegExp(`^\\s*${t}:\\s*$`,"u").test(s)){n=!0;continue}if(!n)continue;let a=s.match(/^\s*-\s*["']?(.+?)["']?\s*$/u)?.[1];if(a){o.push(a.trim());continue}if(/^\s*\S/u.test(s))break}return o}function Ph(e,t){if(!t.triggered||e.length===0)return"";let r=["## NativeSoul Memory Recall",`Trigger: ${t.reason}`,""];for(let o of e)r.push(`- ${o.summary}`);return r.join(`
855
+ `).slice(0,1800)}async function Rt(e,t){return pn(e,t,"active","memory_promoted")}async function St(e,t){return pn(e,t,"rejected","memory_rejected")}async function At(e,t){return pn(e,t,"forgotten","memory_forgotten")}async function Jr(e,t){return pn(e,t,"expired","memory_expired")}async function Et(e){let t=await v(e.home),r=_(t.database),o;try{o=r.listMemories({project:e.project,status:e.status,includeForgotten:e.includeForgotten,limit:Math.min(Math.max(e.limit??100,1),1e3)})}finally{r.close()}return await h({home:t.home,type:"memory_exported",details:{project:e.project??null,status:e.status??null,includeForgotten:e.includeForgotten===!0,count:o.length}}),o}async function qd(e,t,r){let o=O(t.content),n=new Date().toISOString(),s=Be(o.value),a={id:T("mem"),type:t.type??"note",scope:{user:"default",project:t.project},content:o.value,summary:s,source:t.source??{host:"cli",session_id:"local"},confidence:t.confidence??.9,authority:t.authority??"user_explicit",sensitivity:o.redacted?"restricted":t.sensitivity??"internal",status:r,created_at:n,expires_at:null,hash:ke({type:t.type??"note",project:t.project,content:o.value,status:r,created_at:n})},i=_(e);try{i.insertMemory(a)}finally{i.close()}return a}async function pn(e,t,r,o){let n=await v(e),s=_(n.database),a,i;try{if(a=s.getMemory(t),a&&!mn(a.status,r))throw new wt({id:t,from:a.status,to:r});i=a?s.updateMemoryStatus(t,r):null}catch(l){throw l instanceof wt&&await xh({home:n.home,id:l.id,from:l.from,to:l.to}),l}finally{s.close()}if(!i)throw new Error(`Memory not found: ${t}`);return await h({home:n.home,type:o,details:{id:i.id,project:i.scope.project,status:r}}),i}function mn(e,t){return Rh.get(e)?.has(t)??!1}async function xh(e){await h({home:e.home,type:"memory_transition_blocked",result:"blocked",details:{id:e.id,from:e.from,to:e.to,code:"MEMORY_TRANSITION_BLOCKED"}})}async function Pt(e,t,r,o=5){let n=await v(e),s=Br({database:n.database,query:t,project:r,limit:Math.min(Math.max(o,1),8)});return await h({home:n.home,type:"memory_searched",details:{query:t,project:r,count:s.memories.length,recall_mode:s.mode,recall_reason:s.reason}}),s.memories}async function pa(e){let t=f(e.home),r=null;try{r=_(t.database);let o=r.upsertProject({id:e.resolution.id,display_name:e.resolution.id,base_id:e.resolution.base_id,source:e.resolution.source,first_basis:Kd(e.resolution),status:"active",now:e.now});return r.close(),r=null,o.inserted&&await h({home:t.home,type:"project_seen",details:{id:e.resolution.id,base_id:e.resolution.base_id,source:e.resolution.source,first_basis:Kd(e.resolution)}}),{touched:!0,inserted:o.inserted,degraded:!1,warning:null}}catch(o){return{touched:!1,inserted:!1,degraded:!0,warning:`PROJECT_REGISTRY_UNAVAILABLE:${Oh(o)}`}}finally{r?.close()}}async function ma(e={}){let t=f(e.home),r=Th(e.limit),o=e.status??"active";if(!await R(t.database))return{registry_available:!1,status:o,limit:r,projects:[],warning:"database_not_available"};let n=_(t.database,{readOnly:e.readOnly??!0});try{let s=n.listProjectsWithCounts({status:o,limit:r});return{registry_available:s.available,status:o,limit:r,projects:s.projects,warning:s.warning}}finally{n.close()}}async function ga(e){let t=f(e.home),r=e.id==="."?jh(e.cwd??process.cwd(),t.home):Ih(e.id);if(!await R(t.database))return Gd(e.id,r,"database_not_available");let o=_(t.database,{readOnly:e.readOnly??!0});try{let n=o.getProjectDetail(r.id);if(!n.available)return Gd(e.id,r,n.warning);let s=n.detail;return{registry_available:!0,requested:e.id,effective_id:r.id,registry:s?.project??null,live_resolution:r,counts:s?.counts??null,derived_last_seen_at:s?.derived_last_seen_at??null,continuity_gap:!!(s?.project&&s.project.base_id!==r.id),warning:s?.project?null:"project_not_found"}}finally{o.close()}}async function fa(e){let t=f(e.home),r=Ch(e.name),o=e.id==="."?te(e.cwd??process.cwd(),t.home).id:e.id,n=_(t.database),s;try{s=n.renameProject(o,r)}finally{n.close()}return s.found&&s.previous&&s.project&&await h({home:t.home,type:"project_renamed",details:{id:o,old_name:s.previous.display_name,new_name:r}}),{found:s.found,id:o,old_name:s.previous?.display_name??null,new_name:r,project:s.project}}async function ha(e){let t=f(e.home),r=e.includeMemories===!0,o=e.apply===!0,n=e.confirm??null,s=!r||o&&n===e.id,a=_(t.database);try{let i=a.getProject(e.id);if(!i)return gn({found:!1,id:e.id,mode:r?"forget_memories":"archive",applied:!1,guardOk:s,confirm:n,previousStatus:null,statusAfter:null,memoriesAffected:0,project:null,warning:"project_not_found"});if(r&&!s)return gn({found:!0,id:e.id,mode:"forget_memories",applied:!1,guardOk:s,confirm:n,previousStatus:i.status,statusAfter:i.status,memoriesAffected:a.countProjectMemories(e.id),project:i,warning:"requires --apply --confirm <id>"});if(r)try{let c=a.forgetProjectMemories(e.id,mn);return c.found&&c.project&&await h({home:t.home,type:"project_forgotten",details:{id:e.id,memories_affected:c.memories_affected}}),gn({found:c.found,id:e.id,mode:"forget_memories",applied:c.found,guardOk:s,confirm:n,previousStatus:c.previous?.status??null,statusAfter:c.project?.status??null,memoriesAffected:c.memories_affected,project:c.project,warning:c.found?null:"project_not_found"})}catch(c){throw c instanceof Gt&&await h({home:t.home,type:"memory_transition_blocked",result:"blocked",details:{id:c.id,from:c.from,to:c.to,code:c.code,project:e.id}}),c}let l=a.archiveProject(e.id);return l.found&&l.project&&await h({home:t.home,type:"project_archived",details:{id:e.id}}),gn({found:l.found,id:e.id,mode:"archive",applied:l.found,guardOk:s,confirm:n,previousStatus:l.previous?.status??null,statusAfter:l.project?.status??null,memoriesAffected:0,project:l.project,warning:l.found?null:"project_not_found"})}finally{a.close()}}async function ya(e){let t=f(e.home),r=_(t.database),o;try{o=r.reactivateProject(e.id)}finally{r.close()}return o.found&&o.project&&await h({home:t.home,type:"project_reactivated",details:{id:e.id}}),{found:o.found,id:e.id,previous_status:o.previous?.status??null,status_after:o.project?.status??null,project:o.project}}async function _a(e={}){return{aliases:sa(f(e.home).home)}}async function ba(e){let t=f(e.home),r=await aa({home:t.home,action:"add",aliasKey:Xd(e.alias),projectId:Nh(e.id),apply:e.apply});return r.applied&&r.changed&&await h({home:t.home,type:"project_alias_set",details:{alias_key:r.alias_key,project_id:r.project_id,previous_project_id:r.previous_id}}),r}async function va(e){let t=f(e.home),r=await aa({home:t.home,action:"remove",aliasKey:Xd(e.alias),apply:e.apply});return r.applied&&r.changed&&await h({home:t.home,type:"project_alias_removed",details:{alias_key:r.alias_key,previous_project_id:r.previous_id}}),r}function Kd(e){return e.remote??e.git_root??e.cwd}function jh(e,t){let r=te(e,t);return{id:r.id,source:r.source,cwd:r.cwd,git_root:r.git_root,remote:r.remote,base_id:r.base_id,alias_key:r.alias_key,marker_path:r.marker_path}}function Ih(e){return{id:e,source:"explicit",cwd:null,git_root:null,remote:null,base_id:null,alias_key:null,marker_path:null}}function Gd(e,t,r){return{registry_available:!1,requested:e,effective_id:t.id,registry:null,live_resolution:t,counts:null,derived_last_seen_at:null,continuity_gap:!1,warning:r}}function Th(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),500)}function Ch(e){let t=e.trim();if(t.length===0)throw new Error("project rename requires a non-empty --name");return t.slice(0,160)}function Xd(e){let t=e.trim();if(t.length===0)throw new Error("project alias requires a non-empty alias");return t}function Nh(e){let t=e.trim();if(t.length===0||t===".")throw new Error("project alias add requires an explicit project id");return t}function gn(e){return{found:e.found,id:e.id,mode:e.mode,applied:e.applied,dry_run:!e.applied,guard_ok:e.guardOk,required_confirm:e.mode==="forget_memories"?e.id:null,confirm:e.confirm,previous_status:e.previousStatus,status_after:e.statusAfter,memories_affected:e.memoriesAffected,project:e.project,warning:e.warning}}function Oh(e){return(e instanceof Error?e.message:String(e)).replace(/[^a-zA-Z0-9_.:-]+/g,"_").slice(0,120)}var Mh=/^-\s*\*\*([^:*]+):\*\*\s*(.*)$/u;function xt(e,t){let r=Lh(e,t);if(r)return r;let o=e.split(/\r?\n/u);for(let n=0;n<o.length;n+=1){let a=(o[n]?.trim()??"").match(Mh);if(!a||a[1]?.trim()!==t)continue;let i=a[2]?.trim()??"";if(i.length>0&&!i.startsWith("_("))return i;for(let l=n+1;l<o.length;l+=1){let c=o[l]?.trim()??"";if(!c||c.startsWith("#")||c.startsWith("- **"))break;if(!c.startsWith("_("))return c}}return null}function zd(e,t=200){let r=e.split(/\r?\n/u).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#")&&!o.startsWith("---")&&!o.startsWith("_")).join(" ").replace(/\s+/g," ").trim();return r.length<=t?r:`${r.slice(0,t-3)}...`}function Yd(e,t=1600){let r=e.split(/\r?\n/u).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("---")&&!o.startsWith("_")).map(o=>o.replace(/^#+\s*/u,"").replace(/^-\s*/u,"")).join(" ").replace(/\s+/g," ").trim();return r.length<=t?r:`${r.slice(0,t-3)}...`}function Lh(e,t){let r=`${t}:`,o=e.split(/\r?\n/u).map(n=>n.trim()).find(n=>n.startsWith(r));return o?o.slice(r.length).trim():null}async function It(e){let t=e.readOnly?f(e.home):await v(e.home),r=await $h(t.home),o=Math.min(Math.max(e.tokensMax??r.defaultTokens,1),3e3),n=[];e.readOnly!==!0&&await Ur({cwd:e.cwd,home:t.home});let s=te(e.cwd,t.home),a=s.id;if(e.readOnly!==!0){let V=await pa({home:t.home,resolution:s});V.warning&&n.push(V.warning)}let i=Fh({explicitQuery:e.query,project:a,host:e.host,cwd:e.cwd,seed:r.memoryQuerySeed}),l=await Dh({database:t.database,readOnly:e.readOnly===!0,memoryQuery:i,project:a,limit:r.recallLimit,warnings:n}),c=await Se({home:t.home,host:e.host,readyOnly:!0,limit:8,readOnly:e.readOnly}),d=await Bh(t.home,e.host,e.readOnly===!0),p=await Zs({home:t.home,host:e.host,query:e.query??`${jt.basename(e.cwd)} ${e.host}`,limit:8,readOnly:e.readOnly}),g=await $r({home:t.home,project:a,status:"open",limit:8,readOnly:e.readOnly}),y=await me(t.home,"IDENTITY.md"),k=await me(t.home,"SOUL.md"),S=await me(t.home,"AGENTS.md"),U=await me(t.home,"USER.md"),Q=await me(t.home,"BOOTSTRAP.md"),je=new Date().toISOString().slice(0,10),be=jt.join(t.home,"memory","daily",`${je}.md`);n.push(...d?[]:[`HOST_ADAPTER_UNAVAILABLE:${e.host}`,"CAPABILITY_REFRESH_STALE"],...p.warnings),!await R(jt.join(t.home,"state","onboarding.complete"))&&Q.trim().length>0&&n.push("BOOTSTRAP_RITUAL_PENDING"),await R(be)&&n.push(`DAILY_MEMORY_AVAILABLE:${be}`),r.warnEmptyMemories&&l.length===0&&n.push("PROJECT_MEMORY_EMPTY");let Ie={bootstrap_schema:2,identity:{name:xt(y,"Name")??"NativeSoul",mission:xt(y,"Mission")??"Provide local continuity across native coding-agent hosts.",creature:xt(y,"Creature"),role:xt(y,"Role"),vibe:xt(y,"Vibe"),emoji:xt(y,"Emoji")},soul_summary:zd(k||"Continuity, clarity, and safe local-first operation.",500),agents_operating_summary:Yd(S||"Load NativeSoul context before continuity-sensitive work. Use MCP when available and CLI fallback when needed."),tool_hints:Uh(),user:{preferences_summary:Vh(U)},project:{id:a,cwd:jt.resolve(e.cwd),state:"local-bootstrap"},commitments:g.map(V=>({id:V.id,status:V.status,summary:V.summary,due_at:V.due_at,ttl_expires_at:V.ttl_expires_at})),relevant_memories:l.map(V=>({id:V.id,summary:V.summary,scope:V.scope})),capabilities:c.map(V=>({uid:V.uid,host:V.host,ready:V.ready,source:V.source})),capability_cards:p.cards,policy:{mode:"safe",approval_required:["external_write","destructive","identity_policy_change"]},warnings:n},x=Wh(Ie,o),kr=Wr(JSON.stringify(x)),Qn={...x,context_budget:{tokens_used:kr,tokens_max:o}};return e.readOnly||await h({home:t.home,type:"bootstrap_created",details:{host:e.host,cwd:jt.resolve(e.cwd),project:a,tokens:kr}}),Qn}async function Dh(e){if(!await R(e.database))return e.warnings.push("BOOTSTRAP_DATABASE_MISSING"),[];let t=null;try{t=_(e.database,{readOnly:e.readOnly});let r=Br({database:e.database,query:e.memoryQuery,project:e.project,limit:e.limit,readOnly:e.readOnly}).memories;return r.length===0?t.recentMemories(e.project,e.limit):r}catch(r){return e.warnings.push(`BOOTSTRAP_DATABASE_UNAVAILABLE:${Hh(r)}`),[]}finally{t?.close()}}function Hh(e){return(e instanceof Error?e.message:String(e)).replace(/[^a-zA-Z0-9_.:-]+/g,"_").slice(0,120)}async function $h(e){let t=await me(e,"config.yaml"),r=t.match(/^\s*default_tokens:\s*(\d+)\s*$/mu),o=t.match(/^\s*(?:bootstrap_recall_limit|recall_limit):\s*(\d+)\s*$/mu),n=t.match(/^\s*memory_query_seed:\s*["']?(.+?)["']?\s*$/mu),s=t.match(/^\s*warn_empty_memories:\s*(true|false)\s*$/imu),a=r?.[1]?Number(r[1]):1900,i=o?.[1]?Number(o[1]):5;return{defaultTokens:Number.isFinite(a)?a:1900,recallLimit:Number.isFinite(i)?Math.min(Math.max(i,1),8):5,memoryQuerySeed:n?.[1]?.trim()||null,warnEmptyMemories:s?.[1]?.toLowerCase()==="true"}}function Fh(e){return[e.explicitQuery,e.project,e.host,jt.basename(jt.resolve(e.cwd)),e.seed].filter(t=>typeof t=="string"&&t.trim().length>0).join(" ")}function Uh(){return[{tool:"life_bootstrap",use_when:"Start a new session or refresh NativeSoul identity, project context, memories, and capability cards."},{tool:"life_recall",use_when:"Search local memories for project-specific continuity before making assumptions."},{tool:"life_remember_propose",use_when:"Propose durable memory from user-approved facts, outcomes, or preferences."},{tool:"life_onboarding_status",use_when:"Check whether onboarding is pending before drafting or applying identity files."}]}function Vh(e){let t=e.trim();return t.length===0?"No curated user preferences yet.":t.length<=160?t:`${t.slice(0,157)}...`}async function Bh(e,t,r=!1){let o=await Se({home:e,host:t,includeShared:!1,limit:20,readOnly:r});if(t==="codex"&&!o.some(i=>i.source.startsWith("codex app server ")))return!1;let n=o[0]?.last_seen_at;if(!n)return!1;let s=Date.parse(n);if(!Number.isFinite(s))return!1;let a=1440*60*1e3;return Date.now()-s<=a}function Wh(e,t){let r=[e,ot(e,1200,420,150),ot(e,900,320,130),ot(e,650,240,110),ot(e,420,180,90),ot(e,240,120,80),ka(ot(e,240,120,80),8,8),ka(ot(e,240,120,80),5,5),ka(ot(e,240,120,80),3,3)];return r.find(o=>Wr(JSON.stringify(o))<=t)??r[r.length-1]??e}function ka(e,t,r){return{...e,capabilities:e.capabilities.slice(0,t),capability_cards:e.capability_cards.slice(0,r),relevant_memories:e.relevant_memories.slice(0,t),commitments:e.commitments.slice(0,t)}}function ot(e,t,r,o){return{...e,soul_summary:un(e.soul_summary,r),agents_operating_summary:un(e.agents_operating_summary,t),user:{...e.user,preferences_summary:un(e.user.preferences_summary,o)}}}import{existsSync as za}from"node:fs";import qu from"node:path";import{mkdir as Jh,readFile as qh,writeFile as Qd}from"node:fs/promises";import wa from"node:path";var fn={heartbeat_enabled:!0,scheduler_host:"auto-native-supported",heartbeat_cadence:"daily",memory_candidates:!0,memory_candidate_policy:"candidate",auto_promotion:!1,promotion_policy:"explicit_approval",recall_auto_trigger_keywords:["como combinamos","como decidimos","o que combinamos","decisao anterior","decis\xE3o anterior","prior decision","previous decision","remember","lembr","memoria","mem\xF3ria","contexto anterior","last time"],recall_auto_trigger_denylist:["lint","format","typecheck","test","build"],candidate_auto_promotion_threshold:.6,recall_auto_trigger:!1,standing_order_templates:[]};async function Zd(e,t){let r=await nt(e),o=await R(Zt(e));return{phase:t?"identity_pending":r&&o?"active":"pending",configured:r!==null,complete_marker_present:o,existing_profile:r,available_profiles:["quickstart","advanced"],quickstart_defaults:fn,apply_defaults:{dry_run:!0,user_confirmed:!1,reset:!1}}}async function Ra(e){let t=await v(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,n=e.reset===!0,s=await nt(t.home);if(s&&!n)return{dry_run:r,applied:!1,user_confirmed:o,reset:n,action:"preserved",before:s,after:s,diff:[],warnings:["ACTIVATION_PROFILE_PRESERVED: use reset=true to replace existing activation choices"]};let a=Kh(e.profile,e.options),i=Xh(s,a);if(!r&&!o)return{dry_run:r,applied:!1,user_confirmed:o,reset:n,action:"rejected",before:s,after:a,diff:i,warnings:["ACTIVATION_REQUIRES_USER_CONFIRMED"]};let l=s?i.length===0?"noop":"update":"create";return r||(await Jh(wa.join(t.home,"state"),{recursive:!0,mode:448}),await Qd(eu(t.home),`${JSON.stringify(a,null,2)}
856
+ `,{encoding:"utf8",mode:384}),await Qd(Zt(t.home),`${new Date().toISOString()}
857
+ `,{encoding:"utf8",mode:384}),await h({home:t.home,type:"activation.profile.applied",details:{profile:a.profile,reset:n,diff:i.map(c=>c.field)}})),{dry_run:r,applied:!r,user_confirmed:o,reset:n,action:l,before:s,after:a,diff:i,warnings:[]}}function eu(e){return wa.join(e,"state","activation-profile.json")}function Zt(e){return wa.join(e,"state","activation.complete")}async function nt(e){try{let t=JSON.parse(await qh(eu(e),"utf8"));return zh(t)?t:null}catch{return null}}function Kh(e,t){return{...fn,...Gh(t),profile:e,updated_at:new Date().toISOString()}}function Gh(e){if(!e)return{};if(e.candidate_auto_promotion_threshold!==void 0){let t=e.candidate_auto_promotion_threshold;if(!Number.isFinite(t)||t<0||t>1)throw new Error("Invalid candidate_auto_promotion_threshold: expected a number between 0 and 1")}if(e.promotion_policy!==void 0&&e.promotion_policy!=="manual"&&e.promotion_policy!=="explicit_approval")throw new Error("Invalid promotion_policy: expected manual or explicit_approval");if(e.memory_candidate_policy!==void 0&&e.memory_candidate_policy!=="candidate"&&e.memory_candidate_policy!=="off")throw new Error("Invalid memory_candidate_policy: expected candidate or off");if(e.recall_auto_trigger_keywords!==void 0&&(!Array.isArray(e.recall_auto_trigger_keywords)||e.recall_auto_trigger_keywords.some(t=>typeof t!="string")))throw new Error("Invalid recall_auto_trigger_keywords: expected string array");if(e.recall_auto_trigger_denylist!==void 0&&(!Array.isArray(e.recall_auto_trigger_denylist)||e.recall_auto_trigger_denylist.some(t=>typeof t!="string")))throw new Error("Invalid recall_auto_trigger_denylist: expected string array");if(e.standing_order_templates!==void 0&&!Array.isArray(e.standing_order_templates))throw new Error("Invalid standing_order_templates: expected string array");if(e.standing_order_templates!==void 0&&e.standing_order_templates.some(t=>typeof t!="string"))throw new Error("Invalid standing_order_templates: expected string array");return{...e,recall_auto_trigger_keywords:Array.isArray(e.recall_auto_trigger_keywords)?e.recall_auto_trigger_keywords:void 0,recall_auto_trigger_denylist:Array.isArray(e.recall_auto_trigger_denylist)?e.recall_auto_trigger_denylist:void 0,standing_order_templates:Array.isArray(e.standing_order_templates)?e.standing_order_templates:void 0}}function Xh(e,t){return["profile","heartbeat_enabled","scheduler_host","heartbeat_cadence","memory_candidates","memory_candidate_policy","auto_promotion","promotion_policy","recall_auto_trigger_keywords","recall_auto_trigger_denylist","candidate_auto_promotion_threshold","recall_auto_trigger","standing_order_templates"].flatMap(o=>{let n=e?.[o]??null,s=t[o];return JSON.stringify(n)===JSON.stringify(s)?[]:[{field:o,before:n,after:s}]})}function zh(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;let t=e;return(t.profile==="quickstart"||t.profile==="advanced")&&typeof t.heartbeat_enabled=="boolean"&&(typeof t.scheduler_host=="string"||t.scheduler_host===null)&&typeof t.heartbeat_cadence=="string"&&typeof t.memory_candidates=="boolean"&&(t.memory_candidate_policy==="candidate"||t.memory_candidate_policy==="off")&&typeof t.auto_promotion=="boolean"&&(t.promotion_policy==="manual"||t.promotion_policy==="explicit_approval")&&Array.isArray(t.recall_auto_trigger_keywords)&&t.recall_auto_trigger_keywords.every(r=>typeof r=="string")&&Array.isArray(t.recall_auto_trigger_denylist)&&t.recall_auto_trigger_denylist.every(r=>typeof r=="string")&&typeof t.candidate_auto_promotion_threshold=="number"&&Number.isFinite(t.candidate_auto_promotion_threshold)&&t.candidate_auto_promotion_threshold>=0&&t.candidate_auto_promotion_threshold<=1&&typeof t.recall_auto_trigger=="boolean"&&Array.isArray(t.standing_order_templates)&&t.standing_order_templates.every(r=>typeof r=="string")&&typeof t.updated_at=="string"}function Sa(e){let t={bootstrap:Yh(e),mcp:Qh(e),plugins_hooks:Zh(e),heartbeat:ey(e),recall_auto_trigger:ty(e),memory_candidate_hooks:ry(e),memory_promotion_policy:oy(e),cross_host_verification:ny(e)},r=Object.values(t),o=sy(r),n=r.flatMap(a=>a.plan_actions),s=ay(e.profile,o,r);return{schema_version:1,home:e.home,target_root:e.targetRoot,host:e.host,profile:e.profile,overall_status:o,components:t,plan:n,summary:s}}function tu(e){return Sa(e).summary}function Yh(e){return e.onboardingComplete&&e.activationComplete&&e.profile?$("bootstrap","active","Identity onboarding and activation marker are present.",{onboarding_complete:!0,activation_complete:!0}):$("bootstrap",e.onboardingComplete?"approval_required":"not_configured",e.onboardingComplete?"Activation profile still needs explicit approval.":"Identity onboarding is not complete.",{onboarding_complete:e.onboardingComplete,activation_complete:e.activationComplete},[Tt("activation-profile","bootstrap","approval_required","Write activation profile and completion marker.",`${e.home}/state/activation-profile.json`,!0,"17.1 activation apply is explicit-approval only.")])}function Qh(e){let t=e.hosts.filter(r=>r.mcp_registration.configured);if(t.length>0){let r=t.some(o=>o.mcp_registration.issues.length>0);return $("mcp",r?"degraded":"active",r?"MCP is configured but doctor reported warnings.":"MCP registration is configured.",{configured_hosts:t.map(he),checked_hosts:e.hosts.map(he)})}return $("mcp","not_configured","No MCP registration was detected for the selected host scope.",{checked_hosts:e.hosts.map(he)},[Tt("mcp-registration","mcp","not_configured","Install MCP registration for selected hosts.",`nativesoul mcp install --host ${e.host} --apply`,!0,"MCP registration changes host config files.")])}function Zh(e){let t=e.hosts.filter(o=>o.plugin.enabled||o.plugin.hook_registered);if(t.length>0){let o=t.some(n=>n.provider_parity.hooks==="official-fallback");return $("plugins_hooks",o?"degraded":"active",o?"Plugin/hooks are available through fallback support.":"Native plugin or hook support is active.",{enabled_hosts:t.map(he),hook_modes:Object.fromEntries(e.hosts.map(n=>[he(n),n.provider_parity.hooks]))})}let r=e.hosts.length>0&&e.hosts.every(o=>o.plugin.package_kind==="unsupported-native");return $("plugins_hooks",r?"blocked_by_host":"not_configured",r?"Selected hosts do not expose a native plugin path.":"No plugin or hook registration was detected.",{checked_hosts:e.hosts.map(he)},[Tt("plugin-install","plugins_hooks",r?"blocked_by_host":"not_configured","Install NativeSoul plugin/hook package where the host supports it.",`nativesoul install --host ${e.host} --apply`,!0,"Host plugin/hook setup modifies host-specific config.")])}function ey(e){if(!e.profile||!e.profile.heartbeat_enabled)return $("heartbeat","not_configured","Heartbeat is not enabled in the activation profile.",{profile_present:e.profile!==null});let t=e.hosts.filter(r=>r.full_native_evidence.blocked_by_host);return t.length>0?$("heartbeat","blocked_by_host","At least one selected host lacks native scheduler support.",{blocked_hosts:t.map(he),heartbeat_modes:Object.fromEntries(e.hosts.map(r=>[he(r),r.provider_parity.heartbeat]))},[Tt("heartbeat-scheduler","heartbeat","blocked_by_host","Choose a native scheduler-capable host or keep external fallback explicit.",`nativesoul schedule reconcile --host ${e.host} --mode leader --apply`,!0,"Scheduler writes must remain explicit and host-aware.")]):e.hosts.some(r=>r.provider_parity.heartbeat==="native")?$("heartbeat","active","Heartbeat has native scheduler support in the selected scope.",{native_hosts:e.hosts.filter(r=>r.provider_parity.heartbeat==="native").map(he)}):e.hosts.some(r=>r.provider_parity.heartbeat==="official-fallback")?$("heartbeat","degraded","Heartbeat is available only through fallback scheduling in the selected scope.",{fallback_hosts:e.hosts.filter(r=>r.provider_parity.heartbeat==="official-fallback").map(he)}):$("heartbeat","approval_required","Heartbeat profile is enabled, but no scheduler desired state is active yet.",{checked_hosts:e.hosts.map(he)},[Tt("heartbeat-enable","heartbeat","approval_required","Create/reconcile recurring heartbeat schedule.",`nativesoul schedule reconcile --host ${e.host} --mode leader --apply`,!0,"Recurring automation requires explicit approval.")])}function ty(e){return e.profile?e.profile.recall_auto_trigger?$("recall_auto_trigger","active","Automatic recall trigger is enabled in the activation profile.",{keywords:e.profile.recall_auto_trigger_keywords,denylist:e.profile.recall_auto_trigger_denylist,auto_promotion_threshold:e.profile.candidate_auto_promotion_threshold}):$("recall_auto_trigger","approval_required","Automatic recall trigger is intentionally disabled until explicit approval.",{recall_auto_trigger:!1},[Tt("recall-auto-trigger","recall_auto_trigger","approval_required","Set recall_auto_trigger=true in activation profile.","state/activation-profile.json:recall_auto_trigger",!0,"Prompt injection into host sessions must be explicitly approved.")]):$("recall_auto_trigger","not_configured","No activation profile is present.",{})}function ry(e){if(!e.profile||!e.profile.memory_candidates)return $("memory_candidate_hooks","not_configured","Memory candidate hooks are not enabled in the activation profile.",{});let t=e.hosts.every(r=>r.provider_parity.hooks==="unsupported-native");return $("memory_candidate_hooks",t?"degraded":"active",t?"Memory candidates are enabled, but hooks are not native on every selected host.":"Memory candidate capture is enabled with candidate-only policy.",{memory_candidate_policy:e.profile.memory_candidate_policy,hook_modes:Object.fromEntries(e.hosts.map(r=>[he(r),r.provider_parity.hooks]))})}function oy(e){return e.profile?e.profile.auto_promotion?$("memory_promotion_policy","active","Automatic promotion is enabled by activation policy.",{promotion_policy:e.profile.promotion_policy,candidate_auto_promotion_threshold:e.profile.candidate_auto_promotion_threshold,sensitive_auto_promotion_allowed:!1}):$("memory_promotion_policy","approval_required","Memory promotion requires explicit approval.",{auto_promotion:!1,promotion_policy:e.profile.promotion_policy}):$("memory_promotion_policy","not_configured","No activation profile is present.",{})}function ny(e){let t=new Set(e.hosts.map(o=>o.host)).size,r=e.hosts.reduce((o,n)=>o+n.cross_host_inventory_summary.ready_other_hosts,0);return t>1&&e.hosts.every(o=>o.status==="ready")?$("cross_host_verification","active","Multiple selected hosts were verified by deep doctor.",{host_count:t,ready_other_hosts:r}):$("cross_host_verification",r>0?"degraded":"approval_required","Cross-host verification needs an all-host deep doctor pass before full activation claims.",{host_count:t,ready_other_hosts:r},[Tt("cross-host-verify","cross_host_verification","approval_required","Run all-host deep verification.","nativesoul doctor --deep --all-hosts --json",!1,"Verification is read-only but must be run against every host.")])}function $(e,t,r,o,n=[]){return{key:e,status:t,summary:r,evidence:o,plan_actions:n}}function Tt(e,t,r,o,n,s,a){return{id:e,component:t,status:r,action:o,target:n,dry_run:!0,requires_user_confirmed:s,reason:a}}function sy(e){let t=e.map(r=>r.status);return t.includes("blocked_by_host")?"blocked_by_host":t.includes("degraded")?"degraded":t.includes("approval_required")?"approval_required":t.includes("not_configured")?"not_configured":"active"}function ay(e,t,r){return{overall_status:t,profile:e?.profile??null,active:qr(r,"active"),not_configured:qr(r,"not_configured"),approval_required:qr(r,"approval_required"),blocked_by_host:qr(r,"blocked_by_host"),degraded:qr(r,"degraded"),full_native_claimed:!1}}function qr(e,t){return e.filter(r=>r.status===t).length}function he(e){return e.surface==="default"?e.host:`${e.host}:${e.surface}`}import{existsSync as iy}from"node:fs";import ly from"node:path";async function Kr(e){let t=f(e),r=[],o=["AGENTS.md","SOUL.md","IDENTITY.md","USER.md","POLICY.md","MEMORY.md","HEARTBEAT.md","config.yaml"];for(let s of o)await R(ly.join(t.home,s))||r.push({code:"MISSING_HUMAN_FILE",severity:"warn",message:`${s} is missing`,remediation:"Run nativesoul init"});if(!iy(t.database))return r.push({code:"MISSING_DATABASE",severity:"error",message:"SQLite state database is missing",remediation:"Run nativesoul init"}),{home:t.home,healthy:!1,integrity:"missing",issues:r};let n=(()=>{let s=_(t.database,{readOnly:!0});try{return s.integrityCheck()}finally{s.close()}})();n!=="ok"&&r.push({code:"SQLITE_INTEGRITY",severity:"error",message:`SQLite integrity check returned ${n}`,remediation:"Restore from backup or rebuild the workspace"}),r.push(...cy(t.home,t.database));try{await h({home:t.home,type:"doctor_completed",details:{integrity:n,issueCount:r.length}})}catch{}return{home:t.home,healthy:r.every(s=>s.severity!=="error"),integrity:n,issues:r}}function cy(e,t){let r=te(process.cwd(),e),o=_(t,{readOnly:!0});try{let n=new Set(o.listMemories({limit:200,includeForgotten:!0}).map(s=>s.scope.project).filter(s=>s!==r.id));return n.size===0?[]:[{code:"PROJECT_ID_RECONCILE_AVAILABLE",severity:"info",message:`Found ${n.size} memory project id(s) different from normalized current project ${r.id}.`,remediation:"Review with nativesoul memory export --project <old-id>; a future reconcile command will migrate aliases after approval."}]}finally{o.close()}}import Ae from"node:os";import K from"node:path";function ru(e){switch(e){case"grok":return"Agents.md";case"codex":return"AGENTS.md";case"claude":return"CLAUDE.md";case"antigravity":case"gemini":return"GEMINI.md"}}function ou(e){return e==="claude"?".claude.json":e==="gemini"?"settings.json":e==="antigravity"?"mcp_config.json":"mcp.json"}function Gr(e,t){if(t==null||t==="default")return e==="claude"?"claude-code":"default";if(e!=="claude")throw new Error(`--surface ${t} is only supported for --host claude`);return t}function We(e,t){return t&&t!=="default"?[Gr(e,t)]:e==="claude"?["claude-code","claude-desktop"]:["default"]}function Ct(e,t){return t==="default"?e:t}function nu(e){switch(e){case"codex":return K.join(Ae.homedir(),".codex","AGENTS.md");case"claude":return K.join(Ae.homedir(),".claude","CLAUDE.md");case"grok":return K.join(Ae.homedir(),".grok","Agents.md");case"antigravity":case"gemini":return K.join(Ae.homedir(),".gemini","GEMINI.md")}}function hn(e){switch(e){case"codex":return K.join(Ae.homedir(),".codex","mcp.json");case"claude":return K.join(Ae.homedir(),".claude.json");case"grok":return K.join(Ae.homedir(),".grok","mcp.json");case"antigravity":return K.join(Ae.homedir(),".gemini","antigravity-cli","mcp_config.json");case"gemini":return K.join(Ae.homedir(),".gemini","settings.json")}}function su(){return au({platform:process.platform,home:Ae.homedir(),env:process.env})}function au(e){let t=e.platform==="win32"?K.win32:K.posix;if(e.platform==="darwin")return t.join(e.home,"Library","Application Support","Claude","claude_desktop_config.json");if(e.platform==="win32"){let o=e.env?.APPDATA&&e.env.APPDATA.trim().length>0?e.env.APPDATA:t.join(e.home,"AppData","Roaming");return t.join(o,"Claude","claude_desktop_config.json")}let r=e.env?.XDG_CONFIG_HOME&&e.env.XDG_CONFIG_HOME.trim().length>0?e.env.XDG_CONFIG_HOME:t.join(e.home,".config");return t.join(r,"Claude","claude_desktop_config.json")}function iu(e,t){if(e!=="claude")return null;if(!t)return K.join(Ae.homedir(),".claude","mcp.json");let r=K.resolve(t),o=K.dirname(r);return K.basename(o)==="claude"?K.join(o,"mcp.json"):K.join(o,".claude","mcp.json")}import{mkdir as lu,rename as dy,writeFile as du}from"node:fs/promises";import ye from"node:path";var uy=["entity","soul","human","collaboration","continuity"],py=["SOUL.md","POLICY.md"],uu=new Set(["IDENTITY.md","SOUL.md","USER.md","AGENTS.md"]),er=64*1024,my="<!-- nativesoul:start v1 -->",cu="<!-- nativesoul:end -->",gy={"IDENTITY.md":{writable:!0,requires_user_confirmed:!1,required_fields:["Name","Creature","Role","Vibe","Emoji","Mission"],field_format:"- **Field:** value (Markdown list)",merge_strategy:"replace",max_bytes:er},"SOUL.md":{writable:!0,requires_user_confirmed:!0,required_sections:["Core truths","Boundaries","Vibe","Continuity"],field_format:"Prose Markdown sections \u2014 not template slot-fill",merge_strategy:"replace",max_bytes:er},"USER.md":{writable:!0,requires_user_confirmed:!1,required_fields:["Name","What to call them","Timezone","Languages"],field_format:"- **Field:** value (Markdown list)",merge_strategy:"replace",max_bytes:er},"AGENTS.md":{writable:!0,requires_user_confirmed:!1,required_sections:["Session start","Safety"],field_format:"Operating instructions in Markdown",merge_strategy:"merge_managed_block",max_bytes:er},"POLICY.md":{writable:!1,requires_user_confirmed:!1,field_format:"Use policy propose-change after onboarding",merge_strategy:"replace",max_bytes:0}};async function Xr(e){let t=await v(e),o=(await me(t.home,"BOOTSTRAP.md")).trim().length>0;return{ritual_pending:o,files_present:{soul:await R(ye.join(t.home,"SOUL.md")),identity:await R(ye.join(t.home,"IDENTITY.md")),user:await R(ye.join(t.home,"USER.md")),agents:await R(ye.join(t.home,"AGENTS.md")),bootstrap:await R(ye.join(t.home,"BOOTSTRAP.md"))},protected_targets:[...py],writable_files:[...uu],interview_themes:[...uy],instruction_doc:"llm-install.txt",apply_defaults:{dry_run:!0,user_confirmed:!1},file_generation_rules:gy,activation:await Zd(t.home,o)}}async function zr(e){let t=await v(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,n=[],s=[];for(let[a,i]of Object.entries(e.files)){let l=a.trim(),c=l.toUpperCase();if(c==="POLICY.MD"){n.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:"POLICY_VIOLATION: POLICY.md requires proposal flow"});continue}if(!uu.has(l)){n.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:`UNSUPPORTED_FILE: ${l}`});continue}if(c==="SOUL.MD"&&!o){n.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:"POLICY_VIOLATION: SOUL.md requires user_confirmed: true"});continue}let d=typeof i=="string"?i:"";if(Buffer.byteLength(d,"utf8")>er){n.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:`FILE_TOO_LARGE: ${l} exceeds ${er} bytes`});continue}let p=ye.join(t.home,l),g=await me(t.home,l),y=l==="AGENTS.md"?fy(g,d):d,k=g.length>0?A(g):null,S=A(y);if(k===S){n.push({file:l,action:"noop",before_hash:k,after_hash:S});continue}let U=g.length===0?"create":"update";n.push({file:l,action:U,before_hash:k,after_hash:S}),r||await du(p,y,{encoding:"utf8",mode:384})}return!r&&e.config_patch?.hosts?.length&&s.push(`CONFIG_PATCH_NOT_APPLIED_V1: hosts=${e.config_patch.hosts.join(",")}`),r||await h({home:t.home,type:"onboarding.applied",details:{user_confirmed:o,files:n.map(a=>({file:a.file,action:a.action}))}}),{dry_run:r,applied:!r,user_confirmed:o,files:n,warnings:s}}async function Yr(e){let t=f(e?.home),r=ye.join(t.home,"BOOTSTRAP.md");if(!await R(r))return{already_complete:!0,archived_bootstrap:!1,archive_path:null};let o=e?.archive!==!1,n=null;if(o){let a=ye.join(t.home,"memory","archive");await lu(a,{recursive:!0,mode:448});let i=new Date().toISOString().replace(/[:.]/gu,"-");n=ye.join(a,`bootstrap-${i}.md`),await dy(r,n)}else{let{rm:a}=await import("node:fs/promises");await a(r,{force:!0})}let s=ye.join(t.home,"state","onboarding.complete");return await lu(ye.join(t.home,"state"),{recursive:!0,mode:448}),await du(s,`${new Date().toISOString()}
858
+ `,{encoding:"utf8",mode:384}),await h({home:t.home,type:"onboarding.completed",details:{archived:o,archive_path:n}}),{already_complete:!1,archived_bootstrap:o,archive_path:n}}function yn(e){return ye.join(e,"state","onboarding.complete")}function fy(e,t){let r=t.trim();if(!e.trim())return`${r}
859
+ `;if(e.includes(r))return e;let o=hy(e);if(o){let s=o.after.trimEnd(),a=s.length>0?`${s}
860
860
 
861
861
  ${r}
862
862
  `:`${r}
863
- `;return`${o.before}${o.block}${s}`}let n=Uo["AGENTS.md"]??"";return e.trim()===n.trim()?`${r}
863
+ `;return`${o.before}${o.block}${a}`}let n=Wo["AGENTS.md"]??"";return e.trim()===n.trim()?`${r}
864
864
  `:`${e.trimEnd()}
865
865
 
866
866
  ## Onboarding Update
867
867
 
868
868
  ${r}
869
- `}function ny(e){let t=e.indexOf(ty),r=e.indexOf(tu);if(t<0||r<0||r<t)return null;let o=r+tu.length;return{before:e.slice(0,t),block:e.slice(t,o),after:e.slice(o)}}function nu(e,t){return t?Td(e):ay()}function ay(){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 au(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 su(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 fn(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 x_}from"node:fs";import{readFile as j_,stat as I_}from"node:fs/promises";import Nu from"node:path";import{mkdir as sy,readFile as iy,rename as ly,writeFile as cy}from"node:fs/promises";import zr from"node:path";var dy=1440*60*1e3;async function Ne(e){let t=f(e.home),r=await bs(t.home),o={host:e.host,outcome:e.outcome,tier:e.tier,cwd:e.cwd?zr.resolve(e.cwd):null,project:e.project??null,tokens_used:e.tokensUsed??null,tokens_max:e.tokensMax??null,source:e.source??"nativesoul",warnings:(e.warnings??[]).map(n=>O(n).value),error:gy(e.error),recorded_at:e.recordedAt??new Date().toISOString()};return r.hosts[e.host]=o,await py(t.home,r),await h({home:t.home,type:my(e.outcome),result:e.outcome==="failed"?"error":"ok",details:o}),o}async function bs(e){let t=f(e),r=ks(t.home);if(!await R(r))return uy();let o=JSON.parse(await iy(r,"utf8"));return{schema:1,hosts:typeof o.hosts=="object"&&o.hosts!==null?o.hosts:{}}}async function vs(e){let t=f(e.home),o=(await bs(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:ks(t.home),last:o,age_ms:s,age_hours:s===null?null:Math.round(s/(3600*1e3)*10)/10,stale:s!==null&&s>dy}}function uy(){return{schema:1,hosts:{}}}async function py(e,t){let r=ks(e);await sy(zr.dirname(r),{recursive:!0,mode:448});let o=zr.join(zr.dirname(r),`.last-handshake-${T("tmp")}.tmp`);await cy(o,`${JSON.stringify(t,null,2)}
870
- `,{encoding:"utf8",mode:384}),await ly(o,r)}function ks(e){return zr.join(e,"state","last-handshake.json")}function my(e){return`handshake_${e}`}function gy(e){if(e==null)return null;let t=e instanceof Error?e.message:String(e);return O(t).value.slice(0,500)}import tr from"node:path";import{existsSync as Ns}from"node:fs";import{cp as r_,mkdir as o_,rm as Au}from"node:fs/promises";import n_ from"node:path";import{existsSync as st}from"node:fs";import{readFile as kn}from"node:fs/promises";import We from"node:path";import fy from"node:path";function Qt(e){return e.split(/[\\/]/u).join("/")}function at(e,t){return Qt(fy.relative(e,t))}function Zt(e){return Qt(e)}import{existsSync as iu}from"node:fs";import ws from"node:path";function hn(e){if(ws.isAbsolute(e))return iu(e)?e:null;let t=(process.env.PATH??"").split(ws.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=ws.join(o,`${e}${n}`);if(iu(a))return a}return null}import{spawnSync as _y}from"node:child_process";import{existsSync as du}from"node:fs";import{mkdir as by,readFile as uu,writeFile as vy}from"node:fs/promises";import ky from"node:os";import Me from"node:path";import{existsSync as hy}from"node:fs";import Yr from"node:os";import ee from"node:path";import{fileURLToPath as yy}from"node:url";function Oe(e,t,r){return Qr(e,t)?r?ee.join(ee.resolve(r),e,"plugins","nativesoul"):e==="claude"?ee.join(Yr.homedir(),".claude","plugins","nativesoul"):e==="codex"?ee.join(Yr.homedir(),".codex","plugins","nativesoul"):e==="gemini"?ee.join(Yr.homedir(),".gemini","extensions","nativesoul"):e==="grok"?ee.join(Yr.homedir(),".grok","plugins","nativesoul"):e==="antigravity"?ee.join(Yr.homedir(),".antigravity","plugins","nativesoul"):null:null}function Qr(e,t){return e==="codex"||e==="gemini"||e==="grok"||e==="antigravity"||e==="claude"&&(t==="claude-code"||t==="claude-desktop")}function yn(e,t){return e==="claude"?ee.join(t,".claude-plugin","plugin.json"):e==="gemini"?ee.join(t,"gemini-extension.json"):e==="grok"||e==="antigravity"?ee.join(t,"plugin.json"):ee.join(t,".codex-plugin","plugin.json")}function Rs(e){if(e!=="claude"&&e!=="codex"&&e!=="gemini"&&e!=="grok"&&e!=="antigravity")return null;let t=`${e}-nativesoul`,r=ee.dirname(yy(import.meta.url));return[ee.resolve(process.cwd(),"plugins",t),ee.resolve(r,"../../../plugins",t),ee.resolve(r,"../../../../plugins",t)].find(n=>hy(n))??null}var As="nativesoul";async function pu(e){let t=Me.join(e,"..","..","settings.json"),r=du(t)?JSON.parse(await uu(t,"utf8")):{},o=r.hooks&&!Array.isArray(r.hooks)&&typeof r.hooks=="object"?{...r.hooks}:{},n=Zt(Me.join(e,"shared","hooks","host-hook.cjs")),a={SessionStart:Zr(`node ${JSON.stringify(n)} session-start --host claude --project-env CLAUDE_PROJECT_DIR`),UserPromptSubmit:Zr(`node ${JSON.stringify(n)} prompt-bootstrap --host claude --project-env CLAUDE_PROJECT_DIR`),PreToolUse:Zr(`node ${JSON.stringify(n)} pre-tool-use --host claude --project-env CLAUDE_PROJECT_DIR`),Stop:Zr(`node ${JSON.stringify(n)} memory-flush --host claude --project-env CLAUDE_PROJECT_DIR`),PreCompact:Zr(`node ${JSON.stringify(n)} memory-flush --host claude --project-env CLAUDE_PROJECT_DIR`)};for(let[s,i]of Object.entries(a))o[s]=Ey(o[s]??null,i??null);await by(Me.dirname(t),{recursive:!0,mode:448}),await vy(t,`${JSON.stringify({...r,hooks:o},null,2)}
871
- `,"utf8")}function mu(e,t,r){if(t!=="default"||!Sy(e,t,r))return[];if(e==="antigravity")return Ss({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=Ss({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:wy},r),n=Ss({executableName:"grok",installArgs:()=>["plugin","enable",As],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:Ry},r);return[...o,...n]}return[]}function Ss(e,t){let r=hn(e.executableName);if(!r)return[{code:"HOST_PLUGIN_IMPORT_SKIPPED",severity:"warn",message:e.skippedMessage,remediation:e.skippedRemediation}];let o=_y(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 wy(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 Ry(e){return/^Enabled plugin:/i.test(e)||/\balready enabled\b/i.test(e)}async function gu(e){let t=e?Ay(e):Me.join(ky.homedir(),".grok","config.toml");if(!du(t))return null;let r=await uu(t,"utf8");return lu(r,"disabled",As)?!1:lu(r,"enabled",As)?!0:null}function lu(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 Sy(e,t,r){let o=Oe(e,t);return o!==null&&Me.resolve(o)===Me.resolve(r)}function Ay(e){let t=Me.resolve(e),r=Me.basename(t);return r==="grok"||r===".grok"?Me.join(t,"config.toml"):Me.join(t,".grok","config.toml")}function Zr(e){return{hooks:[{type:"command",command:e,timeout:9}]}}function Ey(e,t){let r=Array.isArray(e)?e:[],o=cu(t);return o&&r.some(n=>cu(n)===o)?r:[...r,t]}function cu(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 Py from"node:path";var _n=[{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"}],xy={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 eo(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 jy(e){return e==="grok"||e==="gemini"||e==="antigravity"?xy[e]:_n}function Es(e){return e==="grok"||e==="gemini"?["hooks/hooks.json"]:e==="antigravity"?["hooks.json"]:[...new Set(_n.map(t=>t.fileName).filter(t=>!!t))].map(t=>Py.join("hooks",t))}function fu(e,t){return t==="official-extension"?typeof e.name=="string"&&e.name==="nativesoul":typeof e.name=="string"&&e.name.includes("nativesoul")}function hu(e,t){return Ps(e,t).length===0}function Ps(e,t){return jy(e).filter(({event:r,commandFragment:o})=>!Iy(t,r,o)).map(({event:r})=>r)}function to(e){return e==="claude"||e==="codex"||e==="gemini"||e==="grok"||e==="antigravity"}function bn(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 vn(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 Iy(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"&&Qt(l).includes(r)})})}async function it(e){if(!e.targetPath||!Qr(e.host,e.surface))return{host:e.host,surface:e.surface,targetPath:e.targetPath,target_exists:!1,manifest_exists:!1,enabled:!1,hook_registered:!1,package_kind:"unsupported-native",native_hooks_supported:!1,native_scheduler_supported:!1,issues:[]};let t=eo(e.host,e.surface),r=st(e.targetPath),o=yn(e.host,e.targetPath),n=st(o),a=t.nativeHooksSupported&&e.targetPath?Es(e.host).filter(D=>!st(We.join(e.targetPath,D))):Es(e.host),s=t.nativeHooksSupported?a.length===0:!0,i=[],l=!1,c=!t.nativeHooksSupported;if(!r)i.push({code:"PLUGIN_NOT_INSTALLED",severity:"warn",message:`NativeSoul plugin is not installed for ${e.host}:${e.surface}.`,remediation:`Run nativesoul install --host ${e.host} --apply`});else if(!n)i.push({code:"PLUGIN_MANIFEST_MISSING",severity:"error",message:`NativeSoul plugin manifest is missing: ${o}`,remediation:"Reinstall the NativeSoul plugin"});else{let D=JSON.parse(await kn(o,"utf8")),ye=t.nativeHooksSupported?await Ty(e.host,e.targetPath,D):D;if(l=t.nativeHooksSupported?hu(e.host,ye):fu(D,t.packageKind),c=!t.nativeHooksSupported||await Cy({host:e.host,targetPath:e.targetPath,manifest:D}),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 Pe=Ps(e.host,ye);i.push({code:"PLUGIN_HOOK_MISSING",severity:"error",message:Pe.length>0?`NativeSoul plugin manifest is missing required hook registrations: ${Pe.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 d=e.targetPath?We.join(e.targetPath,"shared","hooks","lib.cjs"):null;r&&t.nativeHooksSupported&&(!d||!st(d))&&i.push({code:"PLUGIN_SHARED_HOOKS_MISSING",severity:"error",message:"NativeSoul shared hook support files are missing under shared/hooks.",remediation:"Reinstall the NativeSoul plugin"});let p=e.targetPath?We.resolve(We.dirname(We.dirname(e.targetPath))):void 0,g=!t.nativeHooksSupported||d!==null&&st(d),y=t.nativeHooksSupported?s&&g:!0,k=r&&n&&l&&y&&c,S=e.host==="grok"?await gu(p):null;return e.host==="grok"&&k&&S===!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:k&&S!==!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 Ty(e,t,r){let o=vn(e);if(o.length===0)return r;let n=at(t,yn(e,t)),a=o[0];if(!a||a===n)return r;let s=We.join(t,a);return st(s)?JSON.parse(await kn(s,"utf8")):{}}async function Cy(e){let t=bn(e.host),r=at(e.targetPath,yn(e.host,e.targetPath));if(t.length>0&&!t.includes(r)){for(let o of t){let n=We.join(e.targetPath,o);if(st(n)&&xs(JSON.parse(await kn(n,"utf8"))))return!0}return!1}if(e.host==="codex"){let o=We.join(e.targetPath,".mcp.json");return st(o)?xs(JSON.parse(await kn(o,"utf8"))):!1}return xs(e.manifest)}function xs(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"||hn(o)||o===process.execPath?!0:Array.isArray(n)&&n.some(a=>typeof a=="string"&&We.isAbsolute(a))}import{cp as Ny,mkdir as Oy,readFile as My,readdir as Ly}from"node:fs/promises";import js from"node:path";async function Is(e,t,r,o){let n=js.join(e,"backups","plugins");await Oy(n,{recursive:!0,mode:448});let a=js.join(n,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-${t}-${r}-${T("plugin")}`);return await Ny(o,a,{recursive:!0}),a}async function Ts(e){let t=await er(e),r=await Promise.all(t.map(async o=>{let n=at(e,o),a=await My(o,"utf8");return`${n}\0${A(a)}`}));return A(r.sort().join(`
872
- `))}async function er(e){let t=await Ly(e,{withFileTypes:!0});return(await Promise.all(t.map(async o=>{let n=js.join(e,o.name);return o.isDirectory()?er(n):o.isFile()?[n]:[]}))).flat()}import{existsSync as qy}from"node:fs";import{cp as Ky,mkdir as Gy,readFile as Cs,writeFile as Xy}from"node:fs/promises";import Je from"node:path";import{fileURLToPath as zy}from"node:url";import{spawnSync as Dy}from"node:child_process";import{accessSync as Hy,constants as $y,existsSync as yu}from"node:fs";import Nt from"node:path";function Ot(e){let t=Fy(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:Jy(e.host,n),warnings:[...t.warnings,...e.host==="generic"?[]:[`${e.host.toUpperCase()}_MCP_REGISTRATION_NOT_APPLIED`]]}}function Fy(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:[Nt.join(t??process.cwd(),"dist","packages","mcp-server","src","index.js")],warnings:[]}:e==="absolute"?Uy(t):{command:"nativesoul-mcp",args:[],warnings:_u("nativesoul-mcp")?[]:["NATIVESOUL_MCP_COMMAND_NOT_ON_PATH"]}}function Uy(e){let t=By();if(t)return{command:t,args:[],warnings:[]};let r=_u("nativesoul-mcp");if(r)return{command:r,args:[],warnings:[]};let o=Vy(e);if(yu(o))return{command:process.execPath,args:[o],warnings:["NATIVESOUL_MCP_COMMAND_LOCAL_DIST"]};let n=Wy();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 Vy(e){return Nt.join(e??process.cwd(),"dist","packages","mcp-server","src","index.js")}function By(){let e=process.argv[1];if(!e)return null;let t=process.platform==="win32"?".cmd":"",r=Nt.join(Nt.dirname(e),`nativesoul-mcp${t}`);return bu(r)?r:null}function _u(e){let t=(process.env.PATH??"").split(Nt.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=Nt.join(o,`${e}${n}`);if(bu(a))return a}return null}function Wy(){let e=Dy("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=Nt.join(t,"nativesoul","dist","packages","mcp-server","src","index.js");return yu(r)?r:null}function bu(e){try{return Hy(e,$y.X_OK),!0}catch{return!1}}function Jy(e,t){return e==="generic"?{mcpServers:{nativesoul:t}}:{host:e,review_only:!0,mcpServers:{nativesoul:t}}}async function vu(e,t,r,o){let n=await er(e),a=await Promise.all(n.map(async i=>{let l=at(e,i),c=await Su({host:t,relativePath:l,content:await Cs(i,"utf8"),home:r,targetPath:o});return`${l}\0${A(c)}`})),s=Ru();if(s&&to(t)){let i=await er(s);for(let l of i){let c=Je.posix.join("shared","hooks",at(s,l)),d=await Cs(l,"utf8");a.push(`${c}\0${A(d)}`)}}return A(a.sort().join(`
873
- `))}async function ku(e){let t=Ru();if(!t)return;let r=Je.join(e,"shared","hooks");await Gy(r,{recursive:!0,mode:448}),await Ky(t,r,{recursive:!0})}async function wu(e){let t=await er(e.targetPath);await Promise.all(t.map(async r=>{let o=Je.relative(e.targetPath,r),n=await Cs(r,"utf8"),a=await Su({host:e.host,relativePath:o,content:n,home:e.home,targetPath:e.targetPath});a!==n&&await Xy(r,a,"utf8")}))}function Ru(){let e=Je.dirname(zy(import.meta.url));return[Je.resolve(process.cwd(),"plugins","shared","hooks"),Je.resolve(e,"../../../plugins/shared/hooks"),Je.resolve(e,"../../../../plugins/shared/hooks")].find(r=>qy(r))??null}async function Su(e){let t=Qt(e.relativePath),r=bn(e.host).includes(t),o=vn(e.host).includes(t);if(!r&&!o)return e.content;let n=JSON.parse(e.content),a=r?Yy(n,Ot({host:e.host,commandMode:"package",home:e.home}).mcpServers.nativesoul):n,s=o&&e.targetPath&&to(e.host)?Qy(a,e.targetPath):a;return`${JSON.stringify(s,null,2)}
874
- `}function Yy(e,t){return{...e,mcpServers:{nativesoul:t}}}function Qy(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=>Zy(s,t))]:[n,a]));return{...e,hooks:o}}function Zy(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=>e_(n,t))}:e}function e_(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=Zt(Je.join(t,"shared","hooks","host-hook.cjs"));return{...r,command:`node ${JSON.stringify(s)} ${t_(o)}`}}let n=_n.find(s=>o.includes(s.commandFragment));if(!n?.fileName)return e;let a=Zt(Je.join(t,"hooks",n.fileName));return{...r,command:`node ${JSON.stringify(a)}`}}function t_(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 Os(e){let t=f(e.home),r=Rs(e.host);if(!e.targetPath||!r)return Eu(e.host,e.surface,e.targetPath,r,!e.apply);let o=Ns(e.targetPath)?await Ts(e.targetPath):null,n=await vu(r,e.host,t.home,e.targetPath),a=o===null?"create":o===n?"noop":"replace",s=a!=="noop",i=s&&e.apply&&Ns(e.targetPath)?await Is(t.home,e.host,e.surface,e.targetPath):null,l=[];s&&e.apply&&(await o_(n_.dirname(e.targetPath),{recursive:!0,mode:448}),await Au(e.targetPath,{recursive:!0,force:!0}),await r_(r,e.targetPath,{recursive:!0}),to(e.host)&&await ku(e.targetPath),await wu({host:e.host,targetPath:e.targetPath,home:t.home})),e.apply&&e.host==="claude"&&await pu(e.targetPath),e.apply&&l.push(...mu(e.host,e.surface,e.targetPath));let c=e.targetPath&&Qr(e.host,e.surface)?await it({host:e.host,surface:e.surface,targetPath:e.targetPath}):null,d=eo(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 Ms(e){let t=f(e.home),r=Rs(e.host);if(!e.targetPath||!r)return Eu(e.host,e.surface,e.targetPath,r,!e.apply);let o=Ns(e.targetPath)?await Ts(e.targetPath):null,n=eo(e.host,e.surface),a=o!==null,s=a&&e.apply?await Is(t.home,e.host,e.surface,e.targetPath):null;a&&e.apply&&await Au(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 Eu(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 tr.resolve(t,e)}function rr(e,t,r){let o=qr(e,r);if(e==="claude"&&o==="claude-desktop")return{surface:o,managedBlock:null,mcpRegistration:t?tr.join(tr.resolve(t,e),"claude_desktop_config.json"):Yd(),plugin:Oe(e,o,t)};if(!t)return{surface:o,managedBlock:zd(e),mcpRegistration:mn(e),plugin:Oe(e,o)};let n=tr.resolve(t,e);return{surface:o,managedBlock:tr.join(n,Gd(e)),mcpRegistration:tr.join(n,Xd(e)),plugin:Oe(e,o,t)}}import{accessSync as a_,constants as s_,existsSync as lt}from"node:fs";import{mkdir as wn,readFile as or,rm as i_,writeFile as Rn}from"node:fs/promises";import K from"node:path";async function oo(e){let t=f(e.home),r=K.resolve(e.targetPath??Sn(e.host)),o=e.commandMode??"package",n=Ot({host:e.host,commandMode:o,home:t.home,projectRoot:e.projectRoot}).mcpServers.nativesoul,a=lt(r),s=a?await or(r,"utf8"):null,i=ju(l_(ro(s),n)),l=s===null?null:A(s),c=A(i),d=g_(s,i),p=d!=="noop",g=p&&e.apply?await Iu(t.home,e.host,r,a,s,c):null;p&&e.apply&&(await wn(K.dirname(r),{recursive:!0,mode:448}),await Rn(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:Tu(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 Ds(e){let t=f(e.home),r=K.resolve(e.targetPath??Sn(e.host)),o=lt(r),n=o?await or(r,"utf8"):null,a=c_(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 Iu(t.home,e.host,r,o,n,i):null;c&&e.apply&&a!==null&&(await wn(K.dirname(r),{recursive:!0,mode:448}),await Rn(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:Tu(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 Hs(e){let t=f(e.home),r=JSON.parse(await or(e.snapshotPath,"utf8"));e.apply&&(r.beforeExists&&r.beforeContent!==null?(await wn(K.dirname(r.targetPath),{recursive:!0,mode:448}),await Rn(r.targetPath,r.beforeContent,{encoding:"utf8",mode:384})):lt(r.targetPath)&&await i_(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 no(e){let t=K.resolve(e.targetPath??Sn(e.host)),r=Zd(e.host,e.targetPath),o=lt(t),n=[],a=await d_(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 or(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?Ls(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:[]}:u_(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 Sn(e){return mn(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 l_(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 c_(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,ju({...t,mcpServers:o})}function Ls(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 d_(e,t,r){if(e!=="claude"||r===null||K.resolve(r)===t||!lt(r))return null;try{let o=ro(await or(r,"utf8")),n=Ls(o);if(!n)return null;if(lt(t)){let a=ro(await or(t,"utf8")),s=Ls(a);if(s&&JSON.stringify(Pu(s))===JSON.stringify(Pu(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 Pu(e){return{command:typeof e.command=="string"?e.command:null,args:Array.isArray(e.args)?e.args.filter(t=>typeof t=="string"):[]}}function u_(e,t,r){let o=[],n=p_(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(m_(e,n)){let a=t[0],s=a?K.isAbsolute(a)?a:K.resolve(K.dirname(r),a):null;if(!s||!lt(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 p_(e){if(K.isAbsolute(e))return xu(e)?e:null;let t=(process.env.PATH??"").split(K.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=K.join(o,`${e}${n}`);if(xu(a))return a}return null}function xu(e){if(process.platform==="win32"&&lt(e))return!0;try{return a_(e,s_.X_OK),!0}catch{return!1}}function m_(e,t){let r=K.basename(e).toLowerCase(),o=K.basename(t).toLowerCase();return r==="node"||r==="node.exe"||o==="node"||o==="node.exe"}function ju(e){return`${JSON.stringify(e,null,2)}
875
- `}function g_(e,t){return e===t?"noop":e===null||e.trim().length===0?"create":"update"}async function Iu(e,t,r,o,n,a){let s=K.join(e,"backups","mcp-registration");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=K.join(s,`${i.replaceAll(/[:.]/gu,"-")}-${t}.json`);return await Rn(c,JSON.stringify(l,null,2),{encoding:"utf8",mode:384}),c}function Tu(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(`
876
- `)}async function ct(e){let t=await v(e.home),r=e.surface??null,o=qr(e.host,r),n=e.hostConfigRoot??(e.targetRoot?qe(e.host,e.targetRoot):void 0),a=await __({host:e.host,surface:o,targetRoot:e.targetRoot,explicit:e.pluginEnabled}),s=new Date().toISOString(),i=h_(e.mode,r,e.heartbeat),l=await vt(e.host).scheduleReconcile({kind:"heartbeat",mode:e.mode,enabled:!0,surface:e.surface??void 0,apply:e.apply,hostConfigRoot:n,desired:i}),c={id:b_(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?f_(t.database,c):c,p={dryRun:!e.apply,applied:e.apply,schedule:d,adapter_result:l,warnings:y_(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 R(t.database))return[];let r=_(t.database,{readOnly:e.readOnly});try{return r.listSchedules({host:e.host,limit:Math.min(Math.max(e.limit??50,1),200)})}finally{r.close()}}async function $s(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 f_(e,t){let r=_(e);try{return r.upsertSchedule(t)}finally{r.close()}}function h_(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 y_(e,t,r){return t!=="unsupported"?[]:e==="grok"||e==="gemini"?[]:r===!1?["NATIVE_SCHEDULE_UNSUPPORTED_NO_FALLBACK_INSTALLED"]:["NATIVE_SCHEDULE_UNSUPPORTED"]}async function __(e){if(e.explicit!==void 0)return e.explicit;try{let t=Oe(e.host,e.surface,e.targetRoot);return(await it({host:e.host,surface:e.surface,targetPath:t})).enabled}catch{return!1}}function b_(e,t){return e==="claude"&&t&&t!=="default"?`schedule:${e}:heartbeat:${t}`:`schedule:${e}:heartbeat`}function Fs(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=>k_(y,t)),s=A_(e.capabilities,e.adapterDiagnostics),i=[so("native_package",r,t,e.plugin.targetPath??e.plugin.package_kind,"Native package/extension is not installed or enabled."),so("native_hooks",o,t,e.plugin.targetPath??e.plugin.package_kind,"Native lifecycle hook registration is missing."),so("mcp",n,t,e.mcpRegistration.targetPath,"MCP registration is missing or invalid."),so("native_scheduler",a,t,R_(e.schedules),E_(e.host,e.schedules)),so("official_inventory",s,t,S_(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")&&Cu(e.host),g=l.length===0;return{schema_version:1,host:e.host,surface:e.surface,status:P_({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 Us(e){return e.ready&&e.native_kind.includes("native")&&(e.schema_hash?.startsWith("full-native:")===!0||e.source.includes("full-native-evidence:"))}function so(e,t,r,o,n){return{requirement:e,satisfied:t,evidence:t?[{source_kind:"doctor",reference:o,observed_at:r,confidence:v_(o)}]:[],missing_reason:t?null:n}}function v_(e){return e.startsWith("not-applicable:")||e==="missing"?"low":"medium"}function k_(e,t){return e.enabled&&e.native_schedule_supported&&e.native_id!==null&&!w_(e.updated_at,t)}function w_(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 R_(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 S_(e){return e.find(t=>t.ready)?.source??"missing"}function A_(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 E_(e,t){return Cu(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 Cu(e){return e==="codex"||e==="claude"||e==="grok"||e==="gemini"||e==="antigravity"}function P_(e){return e.fullNative?"full_native":e.blockedByHost?"blocked_by_host":e.degradedScan?"degraded_scan":e.ready?"ready_fallback":"ready"}async function Ou(e){let t=rr(e.host,e.targetRoot,e.surface),r=t.managedBlock??`not-applicable:${Ct(e.host,e.surface)}`,o=t.managedBlock?await ud({host:e.host,targetPath:r}):H_(e.host,e.surface),n=await no({host:e.host,targetPath:t.mcpRegistration,checkCommand:e.targetRoot===void 0}),a=await it({host:e.host,surface:e.surface,targetPath:t.plugin}),s=await vs({home:e.home,host:e.host}),l=(e.databaseExists?await ao({home:e.home,host:e.host,limit:200,readOnly:!0}):[]).filter(x=>T_(e.host,e.surface,x)),c=e.databaseExists?await we({home:e.home,host:e.host,limit:100,readOnly:!0}):[],d=e.databaseExists?fn(f(e.home).database):[],p=e.targetRoot!==void 0,g=p?[]:(await jr(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 O_({host:e.host,managedBlock:o,handshake:s}),D=await M_(e.host),ye=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`})),Pe=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`})),Ye=N_({managedBlock:o,mcpRegistration:n,plugin:a,schedules:l,capabilities:c}),de=Fs({host:e.host,surface:e.surface,mcpRegistration:n,plugin:a,schedules:l,capabilities:c,adapterDiagnostics:g}),xe=[...o.issues,...n.issues,...a.issues,...g,...y,...k,...S,...D,...ye,...Pe];return{host:e.host,surface:e.surface,status:xe.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:Ye,full_native_evidence:de,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:xe}}function T_(e,t,r){return e!=="claude"?!0:C_(r.desired)===t}function C_(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 N_(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 O_(e){if(!e.managedBlock.configured||e.managedBlock.targetPath.startsWith("not-applicable:"))return[];let t=10080*60*1e3,r=await D_(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 M_(e){let t=L_(e).map(r=>Nu.resolve(process.cwd(),r));for(let r of t){if(!x_(r))continue;let o=await j_(r,"utf8"),n=Vr(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 L_(e){switch(e){case"claude":return["CLAUDE.md",Nu.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 D_(e){try{let t=await I_(e);return Math.max(Date.now()-t.mtimeMs,0)}catch{return null}}function H_(e,t){return{host:e,targetPath:`not-applicable:${Ct(e,t)}`,target_exists:!1,configured:!0,markers_valid:!0,issues:[]}}async function Mt(e){let t=f(e.home),r=await Jr(e.home),o=Vs(t.database),n=Ue(e.host),a=[],s=o?fn(t.database):[],i=nu(t.database,o),l=await nt(t.home),c=Vs(gn(t.home)),d=Vs(zt(t.home));for(let y of n)for(let k of Be(y,e.surface))a.push(await Ou({home:t.home,host:y,surface:k,targetRoot:e.targetRoot,databaseExists:o}));let p=[...r.issues,...au(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?Mu.resolve(e.targetRoot):null,cross_host_inventory:su(s),activation_summary:Kd({home:t.home,targetRoot:e.targetRoot?Mu.resolve(e.targetRoot):null,host:e.host,profile:l,onboardingComplete:c,activationComplete:d,hosts:a}),full_native_matrix:$_(a),semantic_index:i,hosts:a,issues:p}}function $_(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 F_}from"node:fs";import{mkdir as U_,readdir as V_,readFile as B_,writeFile as W_}from"node:fs/promises";import io from"node:path";async function Bs(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 J_(r.home,r.database,o,n),s=K_(o,a,n),i=z_({applied:t,project:o,proposals:s,dailyNotes:a.dailyNotes,candidates:a.candidates,activeMemories:a.activeMemories,auditEvents:a.auditEvents}),l=null;return t&&(l=await G_(r.home,i),await X_(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:io.join(r.home,c),modified:!1}))}}async function J_(e,t,r,o){let n=await q_(e,o);if(!F_(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 q_(e,t){let r=io.join(e,"memory","daily");if(!await R(r))return[];let n=(await V_(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=io.join(r,s),l=O(await B_(i,"utf8")).value.trim();l.length>0&&a.push({id:`daily:${s}`,path:i,text:l})}return a}function K_(e,t,r){let o=[];for(let n of t.candidates){let a=Lu(n.content,t.activeMemories),s=Q_(n.content,t.activeMemories);if(s){o.push(nr({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(nr({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(nr({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=Y_(n.text);for(let s of a){if(o.length>=r)return o;let i=Lu(s,[...t.activeMemories,...t.candidates]);i&&i.score>=.7?o.push(nr({action:"deduplicate",project:e,summary:`Daily note repeats existing memory ${i.memory.id}`,before:i.memory.summary,after:Ve(s),evidence:[n.id,i.memory.id],risk:"medium"})):o.push(nr({action:"create_candidate",project:e,summary:Ve(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(nr({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 nr(e){return{id:T("reflection"),persisted_memory_id:null,...e}}async function G_(e,t){let r=io.join(e,"proposals");await U_(r,{recursive:!0,mode:448});let o=io.join(r,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-reflection.md`);return await W_(o,t,{encoding:"utf8",mode:384,flag:"wx"}),o}async function X_(e,t){for(let r of t.filter(o=>o.action==="create_candidate")){let o=await ne(e,{project:r.project,content:["Reflection consolidation candidate.","",r.after,"",`Evidence: ${r.evidence.join(", ")}`].join(`
877
- `),confidence:.5,authority:"reflection_proposal",source:{kind:"reflection",proposal_id:r.id,evidence:r.evidence}});r.persisted_memory_id=o.id}}function z_(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(`
878
- `)}function Y_(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 Lu(e,t){let r=null;for(let o of t){let n=$u(e,`${o.summary}
879
- ${o.content}`);(!r||n>r.score)&&(r={memory:o,score:n})}return r}function Q_(e,t){let r=Hu(e),o=Du(e);for(let n of t)if($u(e,`${n.summary}
880
- ${n.content}`)>=.35&&o!==Du(n.content)){let s=Hu(n.content);if([...r].some(l=>l.length>4&&s.has(l)))return n}return null}function Du(e){return/\b(nao|não|never|do not|dont|don't|no longer|avoid|evitar|proibir|forbid)\b/iu.test(e)}function $u(e,t){return xd(e,t,{minLength:3,normalizeDiacritics:!0,removeStopwords:!0})}function Hu(e){return Fr(e,{minLength:3,normalizeDiacritics:!0,removeStopwords:!0})}import{lstat as Z_,readdir as eb,readFile as tb}from"node:fs/promises";import Lt from"node:path";var Fu=new Set([".json",".jsonl",".md",".markdown",".txt"]);async function qs(e){let t=e.apply===!0,r=f((await v(e.home)).home),o=Lt.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 Uu(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 rb(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=ib(l,n),p=lb(d).map(k=>({source_id:k,reason:"duplicate_source_id"})),g=[];if(t)for(let k of d){let S=await ne(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:db(y)}),y}async function Uu(e,t){let r;try{r=await Z_(e)}catch{return t.push({code:"OPENCLAW_SOURCE_UNREADABLE",source_path:e,message:"Source path is not readable."}),[]}if(r.isFile())return Fu.has(Lt.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 eb(e,{withFileTypes:!0});return(await Promise.all(o.map(a=>{let s=Lt.join(e,a.name);return a.isDirectory()?Uu(s,t):Promise.resolve(Fu.has(Lt.extname(a.name).toLowerCase())?[s]:[])}))).flat().sort()}async function rb(e,t){let r;try{r=await tb(e,"utf8")}catch{return t.push({code:"OPENCLAW_FILE_UNREADABLE",source_path:e,message:"File could not be read."}),[]}let o=Lt.extname(e).toLowerCase();return o===".json"?ob(e,r,t):o===".jsonl"?nb(e,r,t):ab(e,r)}function ob(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:sb(o)??[o]).flatMap((a,s)=>Vu(a,e,s))}function nb(e,t,r){return t.split(/\r?\n/u).flatMap((o,n)=>{let a=o.trim();if(!a)return[];try{return Vu(JSON.parse(a),e,n)}catch{return r.push({code:"OPENCLAW_JSONL_LINE_MALFORMED",source_path:e,message:`Line ${n+1} is malformed.`}),[]}})}function ab(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 sb(e){if(!Ks(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 Vu(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(!Ks(e))return[];let o=Ws(e,["content","text","summary","memory","note","body","value"]);return o?[{id:Ws(e,["id","uid","uuid","key"])??`${Lt.basename(t)}:${r+1}`,content:o,project:Ws(e,["project","project_id","scope_project","workspace","repo"]),confidence:cb(e,["confidence","score"]),sourcePath:t,raw:Js(e)}]:[]}function ib(e,t){return e.map((r,o)=>{let n=O(r.content),a=r.id??`${Lt.basename(r.sourcePath)}:${o+1}`;return{source_system:"openclaw",source_path:r.sourcePath,source_id:a,source_hash:ub(r.raw),target_project:r.project?.trim()||t,content:n.value,summary:Ve(n.value),redacted:n.redacted,confidence:Math.min(Math.max(r.confidence??.55,0),1),status:"candidate",proposed_memory_id:null}})}function lb(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 Ws(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 cb(e,t){for(let r of t){let o=e[r];if(typeof o=="number"&&Number.isFinite(o))return o}return null}function db(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 Js(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?e:Array.isArray(e)?e.map(t=>Js(t)):Ks(e)?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,Js(r)])):String(e)}function Ks(e){return typeof e=="object"&&e!==null}function ub(e){return be(e)}import{lstat as pb,readFile as mb}from"node:fs/promises";import lo from"node:path";var Dt=[".json",".jsonl",".md",".markdown",".txt"];var gb={nativesoul:{host:"nativesoul",supported_extensions:Dt,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:Dt,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:Dt,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:Dt,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:Dt,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:Dt,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 fb(e){return be(e)}async function zs(e){let t=gb[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=lo.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 hb(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 D=await yb(e.host,S,i);if(D.length===0){d.push({source_path:S,reason:"no_supported_records"});continue}c.push(...D.slice(0,s-c.length))}let p=kb(e.host,c,a),g=await wb(o.home,p),y=[];if(r)for(let S of p){let D=await ne(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=D.id,y.push(D)}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:Rb(k)}),k}async function hb(e,t,r){let o;try{o=await pb(t)}catch{return r.push({code:"NATIVE_IMPORT_SOURCE_UNREADABLE",host:e,source_path:t,message:"Source path is not readable."}),[]}return o.isFile()?Eb(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 yb(e,t,r){let o;try{o=await mb(t,"utf8")}catch{return r.push({code:"NATIVE_IMPORT_FILE_UNREADABLE",host:e,source_path:t,message:"File could not be read."}),[]}let n=lo.extname(t).toLowerCase();return n===".json"?_b(e,t,o,r):n===".jsonl"?bb(e,t,o,r):vb(t,o)}function _b(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:Sb(n)??[n]).flatMap((s,i)=>Wu(s,t,i))}function bb(e,t,r,o){return r.split(/\r?\n/u).flatMap((n,a)=>{let s=n.trim();if(!s)return[];try{return Wu(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 vb(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 Wu(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(!Ys(e))return[];let o=Gs(e,["content","text","summary","memory","note","body","value"]);return o?[{id:Gs(e,["id","uid","uuid","key"])??`${lo.basename(t)}:${r+1}`,content:o,project:Gs(e,["project","project_id","scope_project","workspace","repo"]),confidence:Ab(e,["confidence","score"]),sourcePath:t,raw:Xs(e)}]:[]}function kb(e,t,r){return t.map((o,n)=>{let a=O(o.content),s=o.id??`${lo.basename(o.sourcePath)}:${n+1}`,i=Ju(a.value);return{source_system:e,source_path:o.sourcePath,source_id:s,source_hash:fb(o.raw),normalized_content_hash:i,target_project:o.project?.trim()||r,content:a.value,summary:Ve(a.value),redacted:a.redacted,confidence:Math.min(Math.max(o.confidence??.55,0),1),status:"candidate",proposed_memory_id:null}})}async function wb(e,t){let r=[];r.push(...Bu(t,o=>o.source_hash,"duplicate_source_hash")),r.push(...Bu(t,o=>o.normalized_content_hash,"duplicate_normalized_content"));for(let o of new Set(t.map(n=>n.target_project))){let n=await Et({home:e,project:o,includeForgotten:!1,limit:1e3}),a=new Set(n.map(s=>Ju(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 Bu(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 Ju(e){return be(e.toLowerCase().replace(/\s+/gu," ").trim())}function Rb(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 Sb(e){if(!Ys(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 Gs(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 Ab(e,t){for(let r of t){let o=e[r];if(typeof o=="number"&&Number.isFinite(o))return o}return null}function Xs(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?e:Array.isArray(e)?e.map(t=>Xs(t)):Ys(e)?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,Xs(r)])):String(e)}function Eb(e){return Dt.includes(lo.extname(e).toLowerCase())}function Ys(e){return typeof e=="object"&&e!==null}var le={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 Pb,mkdir as xb,readFile as jb,rm as Ib,writeFile as Tb}from"node:fs/promises";import{randomUUID as Cb}from"node:crypto";import qu from"node:path";function An(e){return qu.join(f(e).home,"license.json")}async function Se(e){let t=An(e);if(!await R(t))return null;try{let r=JSON.parse(await jb(t,"utf8"));return Nb(r)?r:null}catch{return null}}async function co(e,t){let r=An(e);return await xb(qu.dirname(r),{recursive:!0,mode:448}),await Tb(r,`${JSON.stringify(t,null,2)}
881
- `,{encoding:"utf8",mode:384}),await Pb(r,384),t}async function Qs(e){await Ib(An(e),{force:!0})}async function En(e){let t=await Se(e);if(t?.instance_id)return t.instance_id;let r=Cb();return await co(e,{...le,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 Nb(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 Ht="0.1.0";var Ob="https://api.dodopayments.com",Mb=1440*60*1e3,Lb=14;async function Zs(e){let t=f(e.home).home,r=e.now??new Date,o=await En(t),n=await ri(e,"/licenses/activate",{license_key:e.key,name:o});if(!n.ok)return await Le(t,"license_activate_failed",e.key,n.reason,"error"),{ok:!1,reason:n.reason,license:{...le,instance_id:o}};let a=await co(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:Ht,updates_until:Bb(n.purchased_at??r.toISOString(),365),last_checked_at:r.toISOString(),source:"dodo"});return await Le(t,"license_activated",e.key,null,"ok"),{ok:!0,license:$t(a)}}async function ei(e){let t=f(e.home).home,r=e.now??new Date,o=await Se(t),n=e.key??o?.license_key,a=o?.instance_id??null;if(!n)return await Le(t,"license_validate_missing",null,"INVALID_KEY","blocked"),{ok:!1,reason:"INVALID_KEY",license:o?$t(o):le};if(o?.state==="licensed"&&Db(o.last_checked_at,r))return await Le(t,"license_validate_cache_hit",n,null,"ok"),{ok:!0,license:$t(o)};let s=await ri(e,"/licenses/validate",{license_key:n});if(s.ok){let i=await co(t,{state:"licensed",license_key:n,instance_id:a??await En(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 Le(t,"license_validated",n,null,"ok"),{ok:!0,license:$t(i)}}return s.reason==="NETWORK"&&o?.state==="licensed"&&Hb(o.last_checked_at,r,e.graceDays)?(await Le(t,"license_validate_grace_served",n,"NETWORK","ok"),{ok:!0,license:$t(o)}):(await Le(t,"license_validate_failed",n,s.reason,"blocked"),{ok:!1,reason:s.reason,license:{...le,instance_id:a}})}async function ti(e){let t=f(e.home).home,r=await Se(t),o=e.key??r?.license_key,n=e.licenseKeyInstanceId??r?.license_key_instance_id;if(!o||!n)return await Le(t,"license_deactivate_missing",o??null,"INVALID_KEY","blocked"),{ok:!1,reason:"INVALID_KEY",license:r?$t(r):le};let a=await ri(e,"/licenses/deactivate",{license_key:o,license_key_instance_id:n});return a.ok?(await Qs(t),await Le(t,"license_deactivated",o,null,"ok"),{ok:!0,license:le}):(await Le(t,"license_deactivate_failed",o,a.reason,"error"),{ok:!1,reason:a.reason,license:r?$t(r):le})}function $t(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 Db(e,t){return e?t.getTime()-new Date(e).getTime()<Mb:!1}function Hb(e,t,r=Lb){return e?t.getTime()-new Date(e).getTime()<=r*24*60*60*1e3:!1}async function ri(e,t,r){let o=e.fetch??globalThis.fetch;try{let n=await o(new URL(t,$b(e.endpointBaseUrl)).toString(),{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify(r)}),a=await Fb(n);return n.ok?t==="/licenses/validate"&&a.valid!==!0?{ok:!1,reason:Ku(a)}:{ok:!0,license_key_instance_id:Ub(a),purchased_at:Vb(a)}:{ok:!1,reason:Ku(a)}}catch{return{ok:!1,reason:"NETWORK"}}}function $b(e=process.env.NATIVESOUL_DODO_LICENSE_API_BASE_URL??Ob){return e.endsWith("/")?e:`${e}/`}async function Fb(e){try{let t=await e.json();return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}}function Ub(e){let r=[e.license_key_instance_id,e.licenseKeyInstanceId,e.id,uo(e.data)?e.data.license_key_instance_id:null,uo(e.data)?e.data.id:null].find(o=>typeof o=="string"&&o.length>0);return typeof r=="string"?r:null}function Vb(e){let t=uo(e.data)?e.data:{},r=uo(e.license_key)?e.license_key:uo(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 Bb(e,t){let r=Date.parse(e);return Number.isNaN(r)?null:new Date(r+t*24*60*60*1e3).toISOString()}function Ku(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 uo(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}async function Le(e,t,r,o,n){await h({home:e,type:t,result:n,details:{provider:"dodo",license_key_ref:r?Wb(r):null,reason:o}})}function Wb(e){return e.length<=8?"[REDACTED_LICENSE_KEY]":`${e.slice(0,4)}\u2026${e.slice(-4)}`}var po="https://native-soul.mintlify.site/account/licensing";async function ar(e){let t=Jb(e),r=f(t.home).home;try{let o=await Se(r),n=await ei(t);if(n.ok)return{ok:!0,license:n.license};let a=n.reason==="NETWORK"&&o?.state==="licensed"?"GRACE_EXPIRED":"UNLICENSED",s=t.activateUrl??po;return{ok:!1,reason:a,activate_url:s,message:mo({reason:a,activate_url:s}),license:n.license}}catch{let o=t.activateUrl??po;return{ok:!1,reason:"UNLICENSED",activate_url:o,message:mo({reason:"UNLICENSED",activate_url:o}),license:le}}}function mo(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 Jb(e){return typeof e=="string"?{home:e}:e??{}}import{readdir as qb,readFile as Gu,stat as Kb}from"node:fs/promises";import oi from"node:path";var Gb=["open source","open-source","source-available","read the source","free to install","never phones home","zero network","uncrackable","piracy-proof"];async function ni(e={}){let t=e.registryPath??oi.join(process.cwd(),"docs","architecture","feature-registry.yaml"),r=e.marketingDir??oi.join(process.cwd(),"docs","marketing"),o=Xb(await Gu(t,"utf8")),n=e.page?[e.page]:await zu(r),a=[],s=[];for(let i of n){let l=await Gu(i,"utf8"),c=go(l);for(let d of Gb)c.includes(go(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(go(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 zb(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=Yb(p,i,d.text);s.push(g),g.result==="fail"&&a.push(Qb(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 Xb(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,Xu(r)),r={id:sr(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=sr(i).split(/\s+/u)[0]:s==="name"?r.name=sr(i):s==="evidence"?r.evidence=sr(i):s==="claim_allowed"?r.claim_allowed=i.trim()==="null"?null:sr(i):s==="claim_forbidden"&&(r.claim_forbidden=Zb(i))}return r?.id&&t.set(r.id,Xu(r)),t}function Xu(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 zu(e){try{if(!(await Kb(e)).isDirectory())return[]}catch{return[]}let t=await qb(e,{withFileTypes:!0});return(await Promise.all(t.map(async o=>{let n=oi.join(e,o.name);return o.isDirectory()?await zu(n):o.isFile()&&/\.(md|mdx|txt)$/iu.test(o.name)?[n]:[]}))).flat().sort()}function zb(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 Yb(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&&!go(r).includes(go(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 Qb(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 Zb(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(sr).filter(Boolean):[]}function sr(e){let t=e.trim().replace(/\s+#.*$/u,"");return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function go(e){return e.toLowerCase().replace(/[’']/gu,"'").replace(/\s+/gu," ").trim()}async function ai(e){let t=await Se(e.home),r=t?.state==="licensed",o=r?ev(t.updates_until,e.now??new Date):"unknown",n=r?tv(e.latestKnownVersion,t.version_at_activation??null):"unknown",a=e.upgradeUrl??po,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 ev(e,t){if(!e)return"unknown";let r=Date.parse(e);return Number.isNaN(r)?"unknown":t.getTime()<=r?"active":"lapsed"}function tv(e,t){if(!e||!t)return"unknown";let r=Yu(e),o=Yu(t);return r===null||o===null?"unknown":r>o}function Yu(e){let t=e.trim().match(/^v?(\d+)(?:\.|$)/u);return t?.[1]?Number.parseInt(t[1],10):null}import{copyFile as rv,mkdir as Zu,readFile as ov,rename as nv,stat as av,writeFile as sv}from"node:fs/promises";import{existsSync as ep}from"node:fs";import Ft from"node:path";var Qu=8;function Pn(e){let t=e.generatedAt??new Date().toISOString(),r=e.degraded===!0,o=[...e.payload.warnings,...e.warnings??[]],n=e.payload.capabilities.slice(0,Qu),a=e.payload.capability_cards.slice(0,Qu),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(`
882
- `);return{host:e.host,generated_at:t,degraded:r,warnings:o,tokens_used:li(s),tokens_max:e.payload.context_budget.tokens_max,content:s}}async function xn(e){let t=f(e.home),r=Pn({host:e.host,payload:e.payload}),o=ii(t.home,e.host),n=ep(o)&&e.apply!==!1?await lv(t.home,e.host,o):null;if(e.apply!==!1){await Zu(Ft.dirname(o),{recursive:!0,mode:448});let s=Ft.join(Ft.dirname(o),`.last-context-${T("tmp")}.tmp`);await sv(s,r.content,{encoding:"utf8",mode:384}),await nv(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 Ne({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 ir(e){let t=f(e.home),r=ii(t.home,e.host);if(!ep(r))return iv({home:t.home,host:e.host,targetPath:r,recordTelemetry:e.recordTelemetry});let o=await ov(r,"utf8"),n=await av(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(`
883
- `),d={host:e.host,generated_at:i,degraded:!0,warnings:l,tokens_used:li(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=cv(o);await Ne({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 si(e){let t=await ir({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 ir({home:fo(e.projectCwd),host:e.host,ttlDays:e.ttlDays,recordTelemetry:!1});return r.warnings.includes("BOOTSTRAP_CACHE_MISSING")?t:r}function ii(e,t){return Ft.join(e,"generated",t,"last-context.md")}function fo(e){return Ft.join(e,".nativesoul-cache")}async function iv(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(`
884
- `),n={host:e.host,generated_at:t,degraded:!0,warnings:r,tokens_used:li(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 Ne({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 lv(e,t,r){let o=Ft.join(e,"backups","bootstrap-context");await Zu(o,{recursive:!0,mode:448});let n=Ft.join(o,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-${t}-last-context.md`);return await rv(r,n),n}function li(e){return Math.ceil(e.length/4)}function cv(e){let t=e.match(/^- CWD:\s*(.+)$/mu)?.[1]?.trim()??null,r=e.match(/^- ID:\s*(.+)$/mu)?.[1]?.trim()??null;return{cwd:t,project:r}}function lr(e){return Us(e)?"full native capability":e.ready?"ready":e.healthy&&e.allowed?"official-fallback":"degraded"}function ci(e){let t=lr(e);return t==="full native capability"?"cyan":t==="ready"?"green":t==="official-fallback"?"amber":"red"}var rp={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 ho(e){let t=await v(e.home),r=new Date().toISOString(),o=O(e.title).value,n=e.description===void 0||e.description===null?null:O(e.description).value,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:$(e.tags??[]),metadata:$(e.metadata??{}),created_at:r,updated_at:r,claimed_at:null,completed_at:null},s=op({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 np(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 yo(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await R(t.database))return[];let r=_(t.database,{readOnly:e.readOnly}),o;try{o=r.listWorkItems({project:e.project,status:e.status,priority:e.priority,assignedHost:e.assignedHost,limit:uv(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 _o(e){return di({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 jn(t.status,"in_progress"),{status:"in_progress",assignedHost:e.host,claimedAt:t.claimed_at??r,updatedAt:r,details:{assigned_host:e.host}}}})}async function bo(e){return di({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&&jn(t.status,e.status);let n=e.description===void 0||e.description===null?e.description:O(e.description).value;return{status:o,priority:e.priority,assignedHost:e.assignedHost,description:n,tags:e.tags===void 0?void 0:$(e.tags),metadata:e.metadata===void 0?void 0:mv(t.metadata,$(e.metadata)),completedAt:ui(o)?r:void 0,updatedAt:r,details:{priority:e.priority??null,assigned_host:e.assignedHost??null,fields:dv(e),redacted:e.description!==void 0&&e.description!==null&&n!==e.description}}}})}async function vo(e){let t=e.status??"done";return di({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 jn(r.status,t),{status:t,completedAt:o,updatedAt:o,details:{terminal_status:t}}}})}function jn(e,t){if(e!==t&&!rp[e].includes(t))throw new Error(`Illegal work item transition: ${e} -> ${t}`)}async function di(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=op({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 np(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 op(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 np(e,t,r,o){await h({home:e,type:t,details:{id:r.id,project:r.project_id,status:r.status,...pv(o)}})}function dv(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 uv(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),200)}function pv(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{value:e}}function mv(e,t){return tp(e)&&tp(t)?{...e,...t}:t}function tp(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}import{readdir as zv,readFile as Yv}from"node:fs/promises";import bp from"node:path";import{existsSync as gv}from"node:fs";var fv=50;function ko(e={}){let t=Sv(e.limit),r=vv(e),o=e.groupBy??"host",n=new Date().toISOString();if(e.db)return ap(e.db,e,r,o,t,n);let a=f(e.home);if(!gv(a.database))return Rv(e,r,o,t,n);let s=_(a.database,{readOnly:!0});try{return ap(s,e,r,o,t,n)}finally{s.close()}}function ap(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=In(s,g=>({key:g.project_id,label:g.project_id})),l=In(s,g=>({key:g.host,label:g.host})),c=In(s,g=>{let y=_v(g);return{key:y,label:y==="unattributed"?"unattributed":y}}),d=In(s,g=>{let y=g.completed_at?.slice(0,10)??"unknown";return{key:y,label:y}}),p=s.map(g=>lp(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:cp(s),groups:yv(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 In(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])=>lp(o,n.label,n.rows))}function lp(e,t,r){return{key:e,label:t,...cp(r)}}function cp(e){let t=0,r=0,o=0,n=0,a=0;for(let s of e){let i=vr(s.cost_json);hv(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:Av(a),coverage:e.length===0?0:t/e.length}}function hv(e){return"source"in e&&e.source==="host-reported"}function yv(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 _v(e){return bv(e.evidence_json)??e.session_id??"unattributed"}function bv(e){let t;try{t=JSON.parse(e)}catch{return null}return sp(t,"session_id")??sp(t,"session")}function sp(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 vv(e){return{since:e.since?kv(e.since):null,until:e.until?dp(e.until,"until"):null}}function kv(e){let t=wv(e);return t!==null?new Date(Date.now()-t).toISOString():dp(e,"since")}function dp(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 wv(e){let t=e.match(/^(\d+)(s|m|h|d|w)$/u);if(t?.[1]&&t[2])return ip(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]?ip(Number(r[1]),r[2]):null}function ip(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 Rv(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 Sv(e){return e===void 0||!Number.isFinite(e)?fv:Math.max(1,Math.min(Math.trunc(e),500))}function Av(e){return Math.round(e*1e8)/1e8}import{mkdir as jv,readdir as Iv,readFile as Tv,writeFile as Cv}from"node:fs/promises";import Ut from"node:path";function up(e){let t=pi(e)?e:{},r=pi(t.tool_input)?t.tool_input:pi(t.input)?t.input:{},o=G(t.tool_name)??G(t.tool)??G(t.name)??"unknown_tool",n=G(t.action)??G(r.action)??o,a=G(t.target)??G(r.target)??G(r.file_path)??G(r.path)??G(r.url)??G(r.command),s=G(r.command)??G(t.command);return{action:n,className:Ev(o,[a,s].filter(Boolean).join(" ")),target:a,project:G(t.project)??G(t.project_id)??G(r.project)??G(r.project_id)}}function Ev(e,t){let r=`${e} ${t??""}`.toLowerCase();return/\b(bash|shell|sh|zsh|exec_command)\b/u.test(e.toLowerCase())?Pv(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 Pv(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 pi(e){return!!e&&!Array.isArray(e)&&typeof e=="object"}function G(e){return typeof e=="string"&&e.trim().length>0?e.trim():void 0}var Nv=new Set(["SOUL.MD","POLICY.MD"]),Ov=5e3,pp=new Map;async function ut(e){let t=f(e),r=pp.get(t.home);if(r&&r.expiresAt>Date.now())return r.orders;let o=Ut.join(t.home,"standing-orders"),n;try{n=await Iv(o)}catch{return[]}let a=[];for(let s of n.filter(i=>i.endsWith(".yaml")||i.endsWith(".yml")).sort()){let i=Ut.join(o,s),l=await Tv(i,"utf8");a.push(Mv(l,i))}return pp.set(t.home,{expiresAt:Date.now()+Ov,orders:a}),a}async function pt(e){let t=await ut(e.home),r=e.target??null,o=r?mp(r):null,n=t.filter(i=>fi(i,e)),a=n.find(i=>i.allowed.includes(e.action)),s=n.find(i=>i.approval_required.includes(e.action));if(o&&Nv.has(o))return dt(e,"proposal_required",["PROTECTED_HUMAN_FILE"],null);if(e.className==="identity_policy_change")return dt(e,"proposal_required",["IDENTITY_POLICY_CHANGE"],null);if(e.className==="destructive")return dt(e,"denied",["DESTRUCTIVE_DENIED_BY_DEFAULT"],a?.id??s?.id??null);if(s)return dt(e,"approval_required",["STANDING_ORDER_REQUIRES_APPROVAL"],s.id);if(a)return dt(e,"allowed",["STANDING_ORDER_ALLOWED"],a.id);switch(e.className){case"read_local":case"probe_external":case"write_local":return dt(e,"allowed",["DEFAULT_ALLOWED"],null);case"write_project":return dt(e,"approval_required",["PROJECT_WRITE_REQUIRES_APPROVAL"],null);case"external_write":return dt(e,"approval_required",["EXTERNAL_WRITE_REQUIRES_APPROVAL"],null)}}async function mi(e){let t=up(e.payload),r=await pt({home:e.home,action:t.action,className:t.className,target:t.target,project:t.project,host:e.host}),o=r.decision==="allowed",n={hook_event_name:"PreToolUse",host:e.host,allowed:o,blocked:!o,message:o?"NativeSoul policy allowed this tool use.":`NativeSoul policy blocked ${r.action}: ${r.decision} (${r.reasons.join(", ")}).`,evaluation:r};if(!o){let 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 gi(e){let t=await v(e.home),r=Lv(e.target);if(!r)throw new Error("policy propose-change target must be SOUL.md or POLICY.md");let o=O(e.summary).value,n=new Date().toISOString(),a=T("proposal"),s=Ut.join(t.home,"proposals",`${n.replaceAll(/[:.]/gu,"-")}-${r}.md`),i=["# Policy Change Proposal","",`ID: ${a}`,`Target: ${r}`,`Created At: ${n}`,"","## Summary","",o,""].join(`
885
- `);return await jv(Ut.dirname(s),{recursive:!0,mode:448}),await Cv(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 dt(e,t,r,o){return{action:e.action,class:e.className,target:e.target??null,decision:t,reasons:r,matched_standing_order:o}}function Mv(e,t){return{id:Dv(e,"id")??Ut.basename(t,Ut.extname(t)),allowed:cr(e,"allowed"),approval_required:cr(e,"approval_required"),scope_projects:cr(e,"projects").concat(cr(e,"scope_projects")),scope_hosts:cr(e,"hosts").concat(cr(e,"scope_hosts")),source:t}}function fi(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 mp(e){return Ut.basename(e.replaceAll("\\","/")).toUpperCase()}function Lv(e){let t=mp(e);return t==="SOUL.MD"?"SOUL.md":t==="POLICY.MD"?"POLICY.md":null}function Dv(e,t){let r=new RegExp(`^\\s*${t}:\\s*([^\\n#]+)`,"mu");return e.match(r)?.[1]?.trim().replace(/^["']|["']$/gu,"")??null}function cr(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 ae(e,t,r){if(e==null)return!1;if(Array.isArray(e))return e.some(o=>ae(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(ae(n,t,r))return!0}return!1}var Hv=/(?:sk-[A-Za-z0-9_-]{8,}|(?:api[_-]?key|token|secret|password)\s*[:=]\s*(?!\[REDACTED_SECRET\])[^"'\s]+)/iu;async function dr(e={}){let t=f(e.home),r=Xv(e.limit);if(!await R(t.database))return $v(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=>Gv(y,e)),p=s.filter(y=>gp(y.host,e.host)),g=i.filter(y=>gp(y.host,e.host));return _p({schema_version:1,generated_at:new Date().toISOString(),read_only:!0,external_telemetry_enabled:!1,initialized:!0,filters:yp(e,r),retention:hp(r),metrics:{activation:Fv(d),bootstrap:Uv(d),recall:Vv(d),capability_readiness:Bv(p),heartbeat:Wv(l,c),no_op_suppression:Jv(d),rollback:qv(d),secret_leakage_checks:fp(d)},m7_gate:Kv(d,p,g,c)})}finally{n.close()}}function $v(e,t,r){return _p({schema_version:1,generated_at:new Date().toISOString(),read_only:!0,external_telemetry_enabled:!1,initialized:r,filters:yp(e,t),retention:hp(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 Fv(e){return{workspace_initialized:ce(e,["workspace_initialized"]),onboarding_completed:ce(e,["onboarding_completed"]),install_applied:ce(e,["plugin_install","managed_block_applied","mcp_registration_installed"])}}function Uv(e){return{succeeded:ce(e,["handshake_succeeded"]),degraded:ce(e,["handshake_degraded"]),failed:ce(e,["handshake_failed"]),cache_fallbacks:e.filter(t=>t.type.includes("bootstrap_context_cache")).length}}function Vv(e){return{recalled:ce(e,["memory_recalled"]),proposed:ce(e,["memory_proposed"]),promoted:ce(e,["memory_promoted"])}}function Bv(e){let t=e.map(lr);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 Wv(e,t){return{leases:e.length,completed_runs:t.length,silent_ok:t.filter(r=>r.result==="HEARTBEAT_OK"||ae(r.result,"silent_ack","HEARTBEAT_OK")).length}}function Jv(e){let t=ce(e,["heartbeat_skipped"]),r=e.filter(n=>n.type.includes("deduped")).length,o=e.filter(n=>ae(n.details,"action","noop")).length;return{total:t+r+o,heartbeat_skipped:t,deduped:r,noop_actions:o}}function qv(e){let t=ce(e,["policy_pack_rollback"]),r=ce(e,["mcp_registration_rollback"]),o=ce(e,["managed_block_rollback"]);return{total:e.filter(n=>n.type.includes("rollback")).length,policy_pack:t,mcp:r,managed_block:o}}function fp(e){let t=JSON.stringify(e.map(r=>({type:r.type,result:r.result,details:r.details})));return{checked:!0,leak_indicators:Hv.test(t)?1:0,redaction_markers:(t.match(/\[REDACTED_/gu)??[]).length}}function Kv(e,t,r,o){let n=o.length>0||r.some(l=>l.enabled),a=e.length>0&&t.length>0,s=fp(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 ce(e,t){return e.filter(r=>t.includes(r.type)).length}function Gv(e,t){let r=!t.host||!ae(e.details,"host")||ae(e.details,"host",t.host),o=!t.project||!ae(e.details,"project")||ae(e.details,"project",t.project);return r&&o}function gp(e,t){return!t||e===t||e==="all"}function hp(e){return{source_event_limit:e,stores_raw_prompts:!1,stores_memory_content:!1,stores_raw_paths:!1}}function yp(e,t){return{project:e.project??null,host:e.host??null,limit:t}}function Xv(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e??200),1),500):200}function _p(e){return Kt($(e))}var Qv=["candidate","active","superseded","rejected","forgotten","expired"],hi=["inbox","assigned","in_progress","review","blocked","done","failed"];async function wo(e={}){let t=f(e.home),r=yk(e.limit),o=gk(e);if(!await R(t.database))return kp(await Zv(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=pk(await ut(t.home),e),k=await ck(t.home),S=Ke(s,o,H=>H.created_at),D=Ke(l,o,H=>H.updated_at).slice(0,r),ye=Ke(i,o,H=>H.last_seen_at).slice(0,r),Pe=Ke(c,o,H=>H.updated_at).slice(0,r),Ye=Ke(d,o,H=>H.created_at).slice(0,r),de=Ke(p,o,H=>H.completed_at).slice(0,r),xe=Ke(g,o,H=>H.created_at).filter(H=>!e.host||fk(H,{key:"host",value:e.host})).slice(0,r),x=xe.filter(H=>H.type==="policy_blocked"),br=xe.filter(H=>hk(H)).length,qn=ek(a,e,o,r),U=rk(a,e,o,r,k,br),dm=ak(a,e,r),um={schema_version:2,generated_at:new Date().toISOString(),filters:Sp(e,r),read_only:!0,home:t.home,database:t.database,initialized:!0,memories:{summary:mk(S),recent:S.filter(H=>H.status!=="candidate").slice(0,r),candidates:S.filter(H=>H.status==="candidate").slice(0,r)},commitments:D,capabilities:ye,schedules:Pe,heartbeat:{leases:Ye,runs:de},audit:{events:xe,policy_blocks:x},policy:{standing_orders:y,proposals:k,counts:{standing_orders:y.length,proposals:k.length,policy_blocks:x.length,approvals_required:br}},work:qn,approvals:U,cost:dm,feedback:await dr({home:t.home,project:e.project,host:e.host,limit:r})};return kp(um)}finally{a.close()}}async function Zv(e,t,r,o){return{schema_version:2,generated_at:new Date().toISOString(),filters:Sp(r,o),read_only:!0,home:e,database:t,initialized:!1,memories:{summary:Rp(),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:wp(),approvals:ik(),cost:lk(),feedback:await dr({home:e,project:r.project,host:r.host,limit:o})}}function ek(e,t,r,o){let n=Ke(e.listWorkItems({project:t.project,assignedHost:t.host,limit:Math.max(o*hi.length,50)}),r,s=>s.updated_at).slice(0,Math.max(o*hi.length,50));if(n.length===0)return wp();let a=[];for(let s of hi){let i=n.filter(l=>l.status===s).slice(0,o).map(l=>tk(e,l));i.length>0&&a.push({status:s,count:i.length,items:i})}return{columns:a}}function tk(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:sk(t.metadata,"run_id")??r?.id??null,priority:t.priority,updated_at:t.updated_at}}function rk(e,t,r,o,n,a){let s=e.listApprovals("pending").approvals.filter(l=>nk(l,t)).filter(l=>Ke([l],r,c=>c.created_at).length>0).slice(0,o).map(ok);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 ok(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 nk(e,t){return(!t.project||e.project===t.project)&&(!t.host||e.host===t.host)}function ak(e,t,r){let o=ko({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(Tn),by_host:o.by_host.map(Tn),by_session:o.by_session.map(Tn),by_run:o.by_run.map(Tn)}}function Tn(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 sk(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 wp(){return{columns:[]}}function ik(){return{pending:[],counts:{pending:0}}}function lk(){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 ck(e){let t=bp.join(e,"proposals"),r;try{r=await zv(t)}catch{return[]}let o=[];for(let n of r.filter(a=>a.endsWith(".md")).sort()){let a=await Yv(bp.join(t,n),"utf8");o.push({filename:n,target:dk(a,"Target"),summary:uk(a,"Summary")})}return o}function dk(e,t){return e.match(new RegExp(`^${t}:\\s*(.+)$`,"mu"))?.[1]?.trim()??null}function uk(e,t){return e.match(new RegExp(`^## ${t}\\s*$\\n+([\\s\\S]*?)(?:\\n+## |$)`,"mu"))?.[1]?.trim()??null}function pk(e,t){return e.filter(r=>{let o=!t.project||r.scope_projects.length===0||r.scope_projects.includes(t.project),n=!t.host||r.scope_hosts.length===0||r.scope_hosts.includes(t.host);return o&&n})}function mk(e){let t=Rp();for(let r of e)t[r.status]+=1;return t}function Rp(){return Object.fromEntries(Qv.map(e=>[e,0]))}function Ke(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 gk(e){return{since:vp(e.since,"since"),until:vp(e.until,"until")}}function vp(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 fk(e,t){return ae(e.details,t.key,t.value)}function hk(e){return ae(e.details,"decision","approval_required")||ae(e.details,"approval_required")||ae(e.details,"action","approval_required")}function Sp(e,t){return{project:e.project??null,host:e.host??null,limit:t,since:e.since??null,until:e.until??null}}function yk(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e??50),1),200):50}function kp(e){return Kt($(e))}import{mkdir as _k,writeFile as bk}from"node:fs/promises";import yi from"node:path";async function bi(e={}){let t=await wo(e),r=yi.resolve(e.output??yi.join(f(e.home).home,"generated","dashboard","index.html"));return await _k(yi.dirname(r),{recursive:!0,mode:448}),await bk(r,Ap(t),{encoding:"utf8",mode:384}),{outputPath:r,generated_at:t.generated_at,read_only:!0,data:t}}function Ap(e){let t=jk(e.capabilities),r=e.audit.policy_blocks.length,o=e.policy.counts.approvals_required,n=vk(e),a=n?n.work.columns.reduce((s,i)=>s+i.items.length,0):0;return`<!doctype html>
869
+ `}function hy(e){let t=e.indexOf(my),r=e.indexOf(cu);if(t<0||r<0||r<t)return null;let o=r+cu.length;return{before:e.slice(0,t),block:e.slice(t,o),after:e.slice(o)}}function pu(e,t){return t?$d(e):yy()}function yy(){return{provider_id:"local-hash",model_id:"local-hash-bow-v1",schema_version:1,available:!1,indexable_count:0,indexed_count:0,stale_count:0,healthy:!1,remediation:"Run nativesoul init, then nativesoul memory index"}}function mu(e){return!e.available||e.stale_count===0?[]:[{code:"SEMANTIC_INDEX_STALE",severity:"warn",message:`${e.stale_count} memory record(s) need semantic indexing.`,remediation:e.remediation??"Run nativesoul memory index"}]}function gu(e){let t=new Map;for(let o of e){let n=t.get(o.host)??{capability_count:0,ready_capability_count:0};t.set(o.host,{capability_count:n.capability_count+1,ready_capability_count:n.ready_capability_count+(o.ready?1:0)})}let r=Array.from(t.entries()).map(([o,n])=>({host:o,...n}));return{host_count:r.length,capability_count:r.reduce((o,n)=>o+n.capability_count,0),ready_capability_count:r.reduce((o,n)=>o+n.ready_capability_count,0),hosts:r}}function _n(e){let t=_(e,{readOnly:!0});try{return t.listCapabilities({limit:1e4}).map(r=>({host:r.host,ready:r.ready}))}finally{t.close()}}import{existsSync as V_}from"node:fs";import{readFile as B_,stat as W_}from"node:fs/promises";import Wu from"node:path";import{mkdir as _y,readFile as by,rename as vy,writeFile as ky}from"node:fs/promises";import Qr from"node:path";var wy=1440*60*1e3;async function Me(e){let t=f(e.home),r=await Aa(t.home),o={host:e.host,outcome:e.outcome,tier:e.tier,cwd:e.cwd?Qr.resolve(e.cwd):null,project:e.project??null,tokens_used:e.tokensUsed??null,tokens_max:e.tokensMax??null,source:e.source??"nativesoul",warnings:(e.warnings??[]).map(n=>O(n).value),error:Ey(e.error),recorded_at:e.recordedAt??new Date().toISOString()};return r.hosts[e.host]=o,await Sy(t.home,r),await h({home:t.home,type:Ay(e.outcome),result:e.outcome==="failed"?"error":"ok",details:o}),o}async function Aa(e){let t=f(e),r=Pa(t.home);if(!await R(r))return Ry();let o=JSON.parse(await by(r,"utf8"));return{schema:1,hosts:typeof o.hosts=="object"&&o.hosts!==null?o.hosts:{}}}async function Ea(e){let t=f(e.home),o=(await Aa(t.home)).hosts[e.host]??null,n=(e.now??new Date).getTime(),s=o?Date.parse(o.recorded_at):Number.NaN,a=Number.isFinite(s)?Math.max(n-s,0):null;return{state_path:Pa(t.home),last:o,age_ms:a,age_hours:a===null?null:Math.round(a/(3600*1e3)*10)/10,stale:a!==null&&a>wy}}function Ry(){return{schema:1,hosts:{}}}async function Sy(e,t){let r=Pa(e);await _y(Qr.dirname(r),{recursive:!0,mode:448});let o=Qr.join(Qr.dirname(r),`.last-handshake-${T("tmp")}.tmp`);await ky(o,`${JSON.stringify(t,null,2)}
870
+ `,{encoding:"utf8",mode:384}),await vy(o,r)}function Pa(e){return Qr.join(e,"state","last-handshake.json")}function Ay(e){return`handshake_${e}`}function Ey(e){if(e==null)return null;let t=e instanceof Error?e.message:String(e);return O(t).value.slice(0,500)}import or from"node:path";import{existsSync as Ua}from"node:fs";import{cp as h_,mkdir as y_,rm as Lu}from"node:fs/promises";import __ from"node:path";import{existsSync as at}from"node:fs";import{readFile as Pn}from"node:fs/promises";import Je from"node:path";import Py from"node:path";function tr(e){return e.split(/[\\/]/u).join("/")}function st(e,t){return tr(Py.relative(e,t))}function Nt(e){return tr(e)}import{existsSync as fu}from"node:fs";import xa from"node:path";function bn(e){if(xa.isAbsolute(e))return fu(e)?e:null;let t=(process.env.PATH??"").split(xa.delimiter).filter(Boolean),r=process.platform==="win32"?(process.env.PATHEXT??".EXE;.CMD;.BAT").split(";"):[""];for(let o of t)for(let n of r){let s=xa.join(o,`${e}${n}`);if(fu(s))return s}return null}import{spawnSync as Iy}from"node:child_process";import{existsSync as Ot}from"node:fs";import{mkdir as kn,readFile as Mt,writeFile as wn}from"node:fs/promises";import Ty from"node:os";import F from"node:path";import{existsSync as xy}from"node:fs";import Zr from"node:os";import re from"node:path";import{fileURLToPath as jy}from"node:url";function Le(e,t,r){return eo(e,t)?r?re.join(re.resolve(r),e,"plugins","nativesoul"):e==="claude"?re.join(Zr.homedir(),".claude","plugins","nativesoul"):e==="codex"?re.join(Zr.homedir(),".codex","plugins","nativesoul"):e==="gemini"?re.join(Zr.homedir(),".gemini","extensions","nativesoul"):e==="grok"?re.join(Zr.homedir(),".grok","plugins","nativesoul"):e==="antigravity"?re.join(Zr.homedir(),".antigravity","plugins","nativesoul"):null:null}function eo(e,t){return e==="codex"||e==="gemini"||e==="grok"||e==="antigravity"||e==="claude"&&(t==="claude-code"||t==="claude-desktop")}function vn(e,t){return e==="claude"?re.join(t,".claude-plugin","plugin.json"):e==="gemini"?re.join(t,"gemini-extension.json"):e==="grok"||e==="antigravity"?re.join(t,"plugin.json"):re.join(t,".codex-plugin","plugin.json")}function ja(e){if(e!=="claude"&&e!=="codex"&&e!=="gemini"&&e!=="grok"&&e!=="antigravity")return null;let t=`${e}-nativesoul`,r=re.dirname(jy(import.meta.url));return[re.resolve(process.cwd(),"plugins",t),re.resolve(r,"../../../plugins",t),re.resolve(r,"../../../../plugins",t)].find(n=>xy(n))??null}var Ta="nativesoul",Rn="nativesoul";async function yu(e){let t=F.join(e,"..","..","settings.json"),r=Ot(t)?JSON.parse(await Mt(t,"utf8")):{},o=r.hooks&&!Array.isArray(r.hooks)&&typeof r.hooks=="object"?{...r.hooks}:{},n=Nt(F.join(e,"shared","hooks","host-hook.cjs")),s={SessionStart:ro(`node ${JSON.stringify(n)} session-start --host claude --project-env CLAUDE_PROJECT_DIR`),UserPromptSubmit:ro(`node ${JSON.stringify(n)} prompt-bootstrap --host claude --project-env CLAUDE_PROJECT_DIR`),PreToolUse:ro(`node ${JSON.stringify(n)} pre-tool-use --host claude --project-env CLAUDE_PROJECT_DIR`),Stop:ro(`node ${JSON.stringify(n)} memory-flush --host claude --project-env CLAUDE_PROJECT_DIR`),PreCompact:ro(`node ${JSON.stringify(n)} memory-flush --host claude --project-env CLAUDE_PROJECT_DIR`)};for(let[a,i]of Object.entries(s))o[a]=Au(o[a]??null,i??null);await kn(F.dirname(t),{recursive:!0,mode:448}),await wn(t,`${JSON.stringify({...r,hooks:o},null,2)}
871
+ `,"utf8")}async function _u(e){let t=Su(e),r=Ot(t)?JSON.parse(await Mt(t,"utf8")):{},o=r.hooks&&!Array.isArray(r.hooks)&&typeof r.hooks=="object"?{...r.hooks}:{},n=Nt(F.join(e,"shared","hooks","host-hook.cjs")),s={SessionStart:to(`node ${JSON.stringify(n)} session-start --host grok --project-env GROK_WORKSPACE_ROOT`),UserPromptSubmit:to(`node ${JSON.stringify(n)} prompt-bootstrap --host grok --project-env GROK_WORKSPACE_ROOT`),PreToolUse:to(`node ${JSON.stringify(n)} pre-tool-use --host grok --project-env GROK_WORKSPACE_ROOT`),Stop:to(`node ${JSON.stringify(n)} memory-flush --host grok --project-env GROK_WORKSPACE_ROOT`),PreCompact:to(`node ${JSON.stringify(n)} memory-flush --host grok --project-env GROK_WORKSPACE_ROOT`)};for(let[a,i]of Object.entries(s))o[a]=Au(o[a]??null,i??null);await kn(F.dirname(t),{recursive:!0,mode:448}),await wn(t,`${JSON.stringify({...r,hooks:o},null,2)}
872
+ `,"utf8")}async function bu(e){let t=Na(e),r=F.join(t,"agents",`${Rn}.md`),o=F.join(t,"config.toml");await kn(F.dirname(r),{recursive:!0,mode:448}),await wn(r,Hy(),{encoding:"utf8",mode:384});let n=Ot(o)?await Mt(o,"utf8"):"";await kn(F.dirname(o),{recursive:!0,mode:448}),await wn(o,$y(n,"agent",`name = "${Rn}"`),"utf8")}function vu(e,t,r){if(t!=="default"||!Ly(e,t,r))return[];if(e==="antigravity")return Ia({executableName:"agy",installArgs:o=>["plugin","install",o],skippedMessage:"Antigravity CLI was not found on PATH, so NativeSoul could not register the plugin with `agy plugin install`.",skippedRemediation:"Install Antigravity CLI or run `agy plugin install ~/.antigravity/plugins/nativesoul` after installation.",failedRemediation:"Run `agy plugin validate ~/.antigravity/plugins/nativesoul` and then `agy plugin install ~/.antigravity/plugins/nativesoul`."},r);if(e==="grok"){let o=Ia({executableName:"grok",installArgs:s=>["plugin","install",s,"--trust"],skippedMessage:"Grok CLI was not found on PATH, so NativeSoul could not register the plugin with `grok plugin install`.",skippedRemediation:"Install Grok Build or run `grok plugin install ~/.grok/plugins/nativesoul --trust` after installation.",failedRemediation:"Run `grok plugin validate ~/.grok/plugins/nativesoul` and then `grok plugin install ~/.grok/plugins/nativesoul --trust`.",treatOutputAsSuccess:Cy},r),n=Ia({executableName:"grok",installArgs:()=>["plugin","enable",Ta],skippedMessage:"Grok CLI was not found on PATH, so NativeSoul could not enable the plugin with `grok plugin enable nativesoul`.",skippedRemediation:"Install Grok Build or run `grok plugin enable nativesoul` after installation.",failedRemediation:"Run `grok plugin enable nativesoul` so SessionStart hooks load in Grok sessions.",treatOutputAsSuccess:Ny},r);return[...o,...n]}return[]}function Ia(e,t){let r=bn(e.executableName);if(!r)return[{code:"HOST_PLUGIN_IMPORT_SKIPPED",severity:"warn",message:e.skippedMessage,remediation:e.skippedRemediation}];let o=Iy(r,e.installArgs(t),{encoding:"utf8",stdio:["ignore","pipe","pipe"],timeout:15e3});if(o.status===0)return[];let n=(o.stderr||o.stdout||"unknown error").trim();return e.treatOutputAsSuccess?.(n)?[]:[{code:"HOST_PLUGIN_IMPORT_FAILED",severity:"error",message:`${e.executableName} plugin import failed: ${n}`,remediation:e.failedRemediation}]}function Cy(e){return/^Installed \d+ plugin/i.test(e)||/^Plugin manifest is valid\./i.test(e)||/\bplugins?\b[^.\n]*\balready installed\b/i.test(e)||/\brepo\b[^.\n]*\balready installed\b/i.test(e)}function Ny(e){return/^Enabled plugin:/i.test(e)||/\balready enabled\b/i.test(e)}async function ku(e){let t=e?Dy(e):F.join(Ty.homedir(),".grok","config.toml");if(!Ot(t))return null;let r=await Mt(t,"utf8");return hu(r,"disabled",Ta)?!1:hu(r,"enabled",Ta)?!0:null}async function wu(e){let t=Su(e);if(!Ot(t))return!1;let r=JSON.parse(await Mt(t,"utf8"));return Oy(r)}async function Ru(e){let t=Na(e),r=F.join(t,"agents",`${Rn}.md`),o=F.join(t,"config.toml");if(!Ot(r)||!Ot(o))return!1;let[n,s]=await Promise.all([Mt(r,"utf8"),Mt(o,"utf8")]);return n.includes("NativeSoul continuity agent")&&Fy(s)===Rn}function hu(e,t,r){let s=(e.match(/\[plugins\][\s\S]*?(?=\n\[|$)/u)?.[0]??e).match(new RegExp(`${t}\\s*=\\s*\\[([^\\]]*)\\]`,"u"))?.[1];return s?s.split(",").some(a=>a.replace(/["'\s]/gu,"")===r):!1}function Oy(e){let t=e.hooks;return!t||Array.isArray(t)||typeof t!="object"?!1:[["SessionStart","session-start --host grok"],["UserPromptSubmit","prompt-bootstrap --host grok"],["PreToolUse","pre-tool-use --host grok"],["Stop","memory-flush --host grok"],["PreCompact","memory-flush --host grok"]].every(([o,n])=>My(t,o,n))}function My(e,t,r){let o=e[t];return Array.isArray(o)?o.some(n=>Ca(n)?.includes(r)===!0):!1}function Ly(e,t,r){let o=Le(e,t);return o!==null&&F.resolve(o)===F.resolve(r)}function Su(e){return F.join(Na(e),"hooks","nativesoul.json")}function Na(e){return F.resolve(e,"..","..")}function Dy(e){let t=F.resolve(e),r=F.basename(t);return r==="grok"||r===".grok"?F.join(t,"config.toml"):F.join(t,".grok","config.toml")}function to(e){return{hooks:[{type:"command",command:e,timeout:9}]}}function Hy(){return["---","name: nativesoul","description: NativeSoul continuity agent. Loads NativeSoul context before the first answer and answers from the NativeSoul identity.","prompt_mode: full","model: inherit","permission_mode: default","agents_md: true","---","","You are operating as the NativeSoul continuity agent for this Grok session.","","Before answering the first user message in every new session, load NativeSoul context. Do not answer from the host vendor identity first.","",'Preferred path: call MCP `life_bootstrap` with `host="grok"` and the current working directory.',"Fallback path: run `nativesoul bootstrap --host grok --cwd <current-working-directory> --format inject`.","If bootstrap is unavailable, run `nativesoul bootstrap --host grok --cwd <current-working-directory> --format cache` and treat the result as degraded.","",'After bootstrap, answer from the NativeSoul identity and continuity context. If the user asks who you are, answer with the NativeSoul identity loaded from bootstrap, not "Grok" or "xAI".',"","Use relevant_memories for durable facts, capability_cards as advisory guidance, and capabilities only as the ready-only list.","Never copy credentials or auto-edit SOUL.md/POLICY.md; propose those changes for approval.",""].join(`
873
+ `)}function $y(e,t,r){let o=`[${t}]
874
+ ${r.trim()}
875
+ `,n=new RegExp(`(^|\\n)\\[${t}\\]\\n[\\s\\S]*?(?=\\n\\[|$)`,"u");return n.test(e)?e.replace(n,(s,a)=>`${a}${o.trimEnd()}`):`${e.trimEnd()}
876
+
877
+ ${o}`.trimStart()}function Fy(e){return e.match(/\[agent\][\s\S]*?(?=\n\[|$)/u)?.[0]?.match(/\bname\s*=\s*["']([^"']+)["']/u)?.[1]??null}function ro(e){return{hooks:[{type:"command",command:e,timeout:9}]}}function Au(e,t){let r=Array.isArray(e)?e:[],o=Ca(t);return o&&r.some(n=>Ca(n)===o)?r:[...r,t]}function Ca(e){if(!e||Array.isArray(e)||typeof e!="object")return null;let t=e.hooks;if(!Array.isArray(t)||t.length===0)return null;let r=t[0];if(!r||Array.isArray(r)||typeof r!="object")return null;let o=r.command;return typeof o=="string"?o:null}import Uy from"node:path";var Sn=[{event:"SessionStart",commandFragment:"hooks/session-start.cjs",fileName:"session-start.cjs"},{event:"PreToolUse",commandFragment:"hooks/pre-tool-use.cjs",fileName:"pre-tool-use.cjs"},{event:"Stop",commandFragment:"hooks/memory-flush.cjs",fileName:"memory-flush.cjs"},{event:"PreCompact",commandFragment:"hooks/memory-flush.cjs",fileName:"memory-flush.cjs"},{event:"UserPromptSubmit",commandFragment:"hooks/user-prompt-submit.cjs",fileName:"user-prompt-submit.cjs"}],Vy={grok:[{event:"SessionStart",commandFragment:"host-hook.cjs"},{event:"UserPromptSubmit",commandFragment:"prompt-bootstrap --host grok"},{event:"PreToolUse",commandFragment:"pre-tool-use --host grok"},{event:"Stop",commandFragment:"memory-flush --host grok"},{event:"PreCompact",commandFragment:"memory-flush --host grok"}],gemini:[{event:"SessionStart",commandFragment:"host-hook.cjs"},{event:"BeforeAgent",commandFragment:"prompt-bootstrap --host gemini"},{event:"BeforeTool",commandFragment:"pre-tool-use --host gemini"},{event:"AfterAgent",commandFragment:"memory-flush --host gemini"},{event:"PreCompress",commandFragment:"memory-flush --host gemini"}],antigravity:[{event:"SessionStart",commandFragment:"host-hook.cjs"},{event:"UserPromptSubmit",commandFragment:"prompt-bootstrap --host antigravity"},{event:"PreToolUse",commandFragment:"pre-tool-use --host antigravity"},{event:"Stop",commandFragment:"memory-flush --host antigravity"},{event:"PreCompact",commandFragment:"memory-flush --host antigravity"}]};function oo(e,t){return e==="codex"||e==="claude"||e==="grok"||e==="antigravity"?{packageKind:"native-plugin",nativeHooksSupported:!0}:e==="gemini"?{packageKind:"official-extension",nativeHooksSupported:!0}:{packageKind:"unsupported-native",nativeHooksSupported:!1}}function By(e){return e==="grok"||e==="gemini"||e==="antigravity"?Vy[e]:Sn}function Oa(e){return e==="grok"||e==="gemini"?["hooks/hooks.json"]:e==="antigravity"?["hooks.json"]:[...new Set(Sn.map(t=>t.fileName).filter(t=>!!t))].map(t=>Uy.join("hooks",t))}function Eu(e,t){return t==="official-extension"?typeof e.name=="string"&&e.name==="nativesoul":typeof e.name=="string"&&e.name.includes("nativesoul")}function Pu(e,t){return Ma(e,t).length===0}function Ma(e,t){return By(e).filter(({event:r,commandFragment:o})=>!Wy(t,r,o)).map(({event:r})=>r)}function no(e){return e==="claude"||e==="codex"||e==="gemini"||e==="grok"||e==="antigravity"}function An(e){return e==="claude"?[".claude-plugin/plugin.json"]:e==="codex"?[".mcp.json"]:e==="gemini"?["gemini-extension.json"]:e==="grok"?[".mcp.json"]:e==="antigravity"?["mcp_config.json"]:[]}function En(e){return e==="claude"?[".claude-plugin/plugin.json"]:e==="codex"?[".codex-plugin/plugin.json"]:e==="gemini"||e==="grok"?["hooks/hooks.json"]:e==="antigravity"?["hooks.json"]:[]}function Wy(e,t,r){if(!e.hooks||Array.isArray(e.hooks)||typeof e.hooks!="object")return!1;let n=e.hooks[t];return!Array.isArray(n)||n.length===0?!1:n.some(s=>{if(!s||Array.isArray(s)||typeof s!="object")return!1;let a=s.hooks;return!Array.isArray(a)||a.length===0?!1:a.some(i=>{if(!i||Array.isArray(i)||typeof i!="object")return!1;let l=i.command;return typeof l=="string"&&tr(l).includes(r)})})}async function it(e){if(!e.targetPath||!eo(e.host,e.surface))return{host:e.host,surface:e.surface,targetPath:e.targetPath,target_exists:!1,manifest_exists:!1,enabled:!1,hook_registered:!1,package_kind:"unsupported-native",native_hooks_supported:!1,native_scheduler_supported:!1,issues:[]};let t=oo(e.host,e.surface),r=at(e.targetPath),o=vn(e.host,e.targetPath),n=at(o),s=t.nativeHooksSupported&&e.targetPath?Oa(e.host).filter(Q=>!at(Je.join(e.targetPath,Q))):Oa(e.host),a=t.nativeHooksSupported?s.length===0:!0,i=[],l=!1,c=!t.nativeHooksSupported,d=e.host!=="grok";if(!r)i.push({code:"PLUGIN_NOT_INSTALLED",severity:"warn",message:`NativeSoul plugin is not installed for ${e.host}:${e.surface}.`,remediation:`Run nativesoul install --host ${e.host} --apply`});else if(!n)i.push({code:"PLUGIN_MANIFEST_MISSING",severity:"error",message:`NativeSoul plugin manifest is missing: ${o}`,remediation:"Reinstall the NativeSoul plugin"});else{let Q=JSON.parse(await Pn(o,"utf8")),je=t.nativeHooksSupported?await Jy(e.host,e.targetPath,Q):Q;if(l=t.nativeHooksSupported?e.host==="grok"?await wu(e.targetPath):Pu(e.host,je):Eu(Q,t.packageKind),c=!t.nativeHooksSupported||await qy({host:e.host,targetPath:e.targetPath,manifest:Q}),d=e.host==="grok"?await Ru(e.targetPath):!0,e.host==="grok"&&!d&&i.push({code:"GROK_AGENT_PROFILE_MISSING",severity:"error",message:"NativeSoul Grok hooks are installed, but Grok is not configured to use the NativeSoul agent profile for first-turn bootstrap.",remediation:"Run `nativesoul install --host grok --apply` to install ~/.grok/agents/nativesoul.md and set [agent].name."}),t.nativeHooksSupported&&!c&&i.push({code:"PLUGIN_MCP_COMMAND_UNRESOLVED",severity:"error",message:"NativeSoul plugin MCP server command is not resolved for daemon-safe startup.",remediation:"Reinstall the NativeSoul plugin so its MCP server command is rendered with an absolute or executable command"}),!l&&t.nativeHooksSupported){let be=Ma(e.host,je);i.push({code:"PLUGIN_HOOK_MISSING",severity:"error",message:be.length>0?`NativeSoul plugin manifest is missing required hook registrations: ${be.join(", ")}.`:"NativeSoul plugin manifest does not register required continuity hooks.",remediation:"Reinstall the NativeSoul plugin"})}!l&&!t.nativeHooksSupported&&i.push({code:"PLUGIN_PACKAGE_MANIFEST_INVALID",severity:"error",message:`NativeSoul ${t.packageKind} manifest is invalid for ${e.host}.`,remediation:"Reinstall the NativeSoul package"})}r&&t.nativeHooksSupported&&!a&&i.push({code:"PLUGIN_HOOK_FILE_MISSING",severity:"error",message:`NativeSoul required hook files are missing under ${e.targetPath}: ${s.join(", ")}`,remediation:"Reinstall the NativeSoul plugin"});let p=e.targetPath?Je.join(e.targetPath,"shared","hooks","lib.cjs"):null;r&&t.nativeHooksSupported&&(!p||!at(p))&&i.push({code:"PLUGIN_SHARED_HOOKS_MISSING",severity:"error",message:"NativeSoul shared hook support files are missing under shared/hooks.",remediation:"Reinstall the NativeSoul plugin"});let g=e.targetPath?Je.resolve(Je.dirname(Je.dirname(e.targetPath))):void 0,y=!t.nativeHooksSupported||p!==null&&at(p),k=t.nativeHooksSupported?a&&y:!0,S=r&&n&&l&&k&&c&&d,U=e.host==="grok"?await ku(g):null;return e.host==="grok"&&S&&U===!1&&i.push({code:"GROK_PLUGIN_RUNTIME_DISABLED",severity:"error",message:"NativeSoul is installed for Grok but disabled in grok config, so SessionStart hooks will not run.",remediation:"Run `grok plugin enable nativesoul` or `nativesoul install --host grok --apply`."}),{host:e.host,surface:e.surface,targetPath:e.targetPath,target_exists:r,manifest_exists:n,enabled:S&&U!==!1,hook_registered:t.nativeHooksSupported?l&&a:!1,package_kind:t.packageKind,native_hooks_supported:t.nativeHooksSupported,native_scheduler_supported:!1,issues:i}}async function Jy(e,t,r){let o=En(e);if(o.length===0)return r;let n=st(t,vn(e,t)),s=o[0];if(!s||s===n)return r;let a=Je.join(t,s);return at(a)?JSON.parse(await Pn(a,"utf8")):{}}async function qy(e){let t=An(e.host),r=st(e.targetPath,vn(e.host,e.targetPath));if(t.length>0&&!t.includes(r)){for(let o of t){let n=Je.join(e.targetPath,o);if(at(n)&&La(JSON.parse(await Pn(n,"utf8"))))return!0}return!1}if(e.host==="codex"){let o=Je.join(e.targetPath,".mcp.json");return at(o)?La(JSON.parse(await Pn(o,"utf8"))):!1}return La(e.manifest)}function La(e){let r=(!e.mcpServers||Array.isArray(e.mcpServers)||typeof e.mcpServers!="object"?null:e.mcpServers)?.nativesoul??(!e.nativeSoul||Array.isArray(e.nativeSoul)||typeof e.nativeSoul!="object"?null:e.nativeSoul.mcpServer);if(!r||Array.isArray(r)||typeof r!="object")return!1;let o=r.command,n=r.args;return typeof o!="string"||o.length===0?!1:o==="nativesoul-mcp"||bn(o)||o===process.execPath?!0:Array.isArray(n)&&n.some(s=>typeof s=="string"&&Je.isAbsolute(s))}import{cp as Ky,mkdir as Gy,readFile as Xy,readdir as zy}from"node:fs/promises";import Da from"node:path";async function Ha(e,t,r,o){let n=Da.join(e,"backups","plugins");await Gy(n,{recursive:!0,mode:448});let s=Da.join(n,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-${t}-${r}-${T("plugin")}`);return await Ky(o,s,{recursive:!0}),s}async function $a(e){let t=await rr(e),r=await Promise.all(t.map(async o=>{let n=st(e,o),s=await Xy(o,"utf8");return`${n}\0${A(s)}`}));return A(r.sort().join(`
878
+ `))}async function rr(e){let t=await zy(e,{withFileTypes:!0});return(await Promise.all(t.map(async o=>{let n=Da.join(e,o.name);return o.isDirectory()?rr(n):o.isFile()?[n]:[]}))).flat()}import{existsSync as a_}from"node:fs";import{cp as i_,mkdir as l_,readFile as Fa,writeFile as c_}from"node:fs/promises";import qe from"node:path";import{fileURLToPath as d_}from"node:url";import{spawnSync as Yy}from"node:child_process";import{accessSync as Qy,constants as Zy,existsSync as xu}from"node:fs";import Lt from"node:path";function Dt(e){let t=e_(e.commandMode,e.projectRoot),r=t.command,o=[...t.args];e.home&&o.push("--home",e.home);let n={command:r,args:o,env:{}};return{serverName:"nativesoul",host:e.host,commandMode:e.commandMode,command:r,args:o,env:{},mcpServers:{nativesoul:n},snippet:s_(e.host,n),warnings:[...t.warnings,...e.host==="generic"?[]:[`${e.host.toUpperCase()}_MCP_REGISTRATION_NOT_APPLIED`]]}}function e_(e,t){let r=process.env.NATIVESOUL_MCP_COMMAND;return r&&r.trim().length>0?{command:r.trim(),args:[],warnings:["NATIVESOUL_MCP_COMMAND_ENV_OVERRIDE"]}:e==="local"?{command:process.execPath,args:[Lt.join(t??process.cwd(),"dist","packages","mcp-server","src","index.js")],warnings:[]}:e==="absolute"?t_(t):{command:"nativesoul-mcp",args:[],warnings:ju("nativesoul-mcp")?[]:["NATIVESOUL_MCP_COMMAND_NOT_ON_PATH"]}}function t_(e){let t=o_();if(t)return{command:t,args:[],warnings:[]};let r=ju("nativesoul-mcp");if(r)return{command:r,args:[],warnings:[]};let o=r_(e);if(xu(o))return{command:process.execPath,args:[o],warnings:["NATIVESOUL_MCP_COMMAND_LOCAL_DIST"]};let n=n_();return n?{command:process.execPath,args:[n],warnings:["NATIVESOUL_MCP_COMMAND_NPM_ROOT_GLOBAL"]}:{command:"nativesoul-mcp",args:[],warnings:["NATIVESOUL_MCP_COMMAND_NOT_RESOLVED"]}}function r_(e){return Lt.join(e??process.cwd(),"dist","packages","mcp-server","src","index.js")}function o_(){let e=process.argv[1];if(!e)return null;let t=process.platform==="win32"?".cmd":"",r=Lt.join(Lt.dirname(e),`nativesoul-mcp${t}`);return Iu(r)?r:null}function ju(e){let t=(process.env.PATH??"").split(Lt.delimiter).filter(Boolean),r=process.platform==="win32"?(process.env.PATHEXT??".EXE;.CMD;.BAT").split(";"):[""];for(let o of t)for(let n of r){let s=Lt.join(o,`${e}${n}`);if(Iu(s))return s}return null}function n_(){let e=Yy("npm",["root","-g"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(e.status!==0)return null;let t=e.stdout.trim();if(!t)return null;let r=Lt.join(t,"nativesoul","dist","packages","mcp-server","src","index.js");return xu(r)?r:null}function Iu(e){try{return Qy(e,Zy.X_OK),!0}catch{return!1}}function s_(e,t){return e==="generic"?{mcpServers:{nativesoul:t}}:{host:e,review_only:!0,mcpServers:{nativesoul:t}}}async function Tu(e,t,r,o){let n=await rr(e),s=await Promise.all(n.map(async i=>{let l=st(e,i),c=await Mu({host:t,relativePath:l,content:await Fa(i,"utf8"),home:r,targetPath:o});return`${l}\0${A(c)}`})),a=Ou();if(a&&no(t)){let i=await rr(a);for(let l of i){let c=qe.posix.join("shared","hooks",st(a,l)),d=await Fa(l,"utf8");s.push(`${c}\0${A(d)}`)}}return A(s.sort().join(`
879
+ `))}async function Cu(e){let t=Ou();if(!t)return;let r=qe.join(e,"shared","hooks");await l_(r,{recursive:!0,mode:448}),await i_(t,r,{recursive:!0})}async function Nu(e){let t=await rr(e.targetPath);await Promise.all(t.map(async r=>{let o=qe.relative(e.targetPath,r),n=await Fa(r,"utf8"),s=await Mu({host:e.host,relativePath:o,content:n,home:e.home,targetPath:e.targetPath});s!==n&&await c_(r,s,"utf8")}))}function Ou(){let e=qe.dirname(d_(import.meta.url));return[qe.resolve(process.cwd(),"plugins","shared","hooks"),qe.resolve(e,"../../../plugins/shared/hooks"),qe.resolve(e,"../../../../plugins/shared/hooks")].find(r=>a_(r))??null}async function Mu(e){let t=tr(e.relativePath),r=An(e.host).includes(t),o=En(e.host).includes(t);if(!r&&!o)return e.content;let n=JSON.parse(e.content),s=r?u_(n,Dt({host:e.host,commandMode:"package",home:e.home}).mcpServers.nativesoul):n,a=o&&e.targetPath&&no(e.host)?p_(s,e.targetPath):s;return`${JSON.stringify(a,null,2)}
880
+ `}function u_(e,t){return{...e,mcpServers:{nativesoul:t}}}function p_(e,t){if(!e.hooks||Array.isArray(e.hooks)||typeof e.hooks!="object")return e;let r=e.hooks,o=Object.fromEntries(Object.entries(r).map(([n,s])=>Array.isArray(s)?[n,s.map(a=>m_(a,t))]:[n,s]));return{...e,hooks:o}}function m_(e,t){if(!e||Array.isArray(e)||typeof e!="object")return e;let r=e,o=r.hooks;return Array.isArray(o)?{...r,hooks:o.map(n=>g_(n,t))}:e}function g_(e,t){if(!e||Array.isArray(e)||typeof e!="object")return e;let r=e,o=typeof r.command=="string"?r.command:null;if(!o)return e;if(o.includes("host-hook.cjs")){let a=Nt(qe.join(t,"shared","hooks","host-hook.cjs"));return{...r,command:`node ${JSON.stringify(a)} ${f_(o)}`}}let n=Sn.find(a=>o.includes(a.commandFragment));if(!n?.fileName)return e;let s=Nt(qe.join(t,"hooks",n.fileName));return{...r,command:`node ${JSON.stringify(s)}`}}function f_(e){let t=["session-start","prompt-bootstrap","pre-tool-use","memory-flush","recall"].find(s=>e.includes(s))??"session-start",r=e.match(/--host\s+([A-Za-z0-9_-]+)/u)?.[1],o=e.match(/--project-env\s+([A-Za-z0-9_-]+)/u)?.[1],n=e.match(/--event\s+([A-Za-z0-9_-]+)/u)?.[1];return[t,r?`--host ${r}`:null,o?`--project-env ${o}`:null,n?`--event ${n}`:null].filter(s=>s!==null).join(" ")}async function Va(e){let t=f(e.home),r=ja(e.host);if(!e.targetPath||!r)return Du(e.host,e.surface,e.targetPath,r,!e.apply);let o=Ua(e.targetPath)?await $a(e.targetPath):null,n=await Tu(r,e.host,t.home,e.targetPath),s=o===null?"create":o===n?"noop":"replace",a=s!=="noop",i=a&&e.apply&&Ua(e.targetPath)?await Ha(t.home,e.host,e.surface,e.targetPath):null,l=[];a&&e.apply&&(await y_(__.dirname(e.targetPath),{recursive:!0,mode:448}),await Lu(e.targetPath,{recursive:!0,force:!0}),await h_(r,e.targetPath,{recursive:!0}),no(e.host)&&await Cu(e.targetPath),await Nu({host:e.host,targetPath:e.targetPath,home:t.home})),e.apply&&e.host==="claude"&&await yu(e.targetPath),e.apply&&e.host==="grok"&&(await _u(e.targetPath),await bu(e.targetPath)),e.apply&&l.push(...vu(e.host,e.surface,e.targetPath));let c=e.targetPath&&eo(e.host,e.surface)?await it({host:e.host,surface:e.surface,targetPath:e.targetPath}):null,d=oo(e.host,e.surface),p={host:e.host,surface:e.surface,targetPath:e.targetPath,sourcePath:r,action:s,dryRun:!e.apply,changed:a,beforeHash:o,afterHash:n,backupPath:i,applied:a&&e.apply,enabled:c?.enabled??!1,hook_registered:c?.hook_registered??!1,package_kind:c?.package_kind??d.packageKind,native_hooks_supported:c?.native_hooks_supported??d.nativeHooksSupported,native_scheduler_supported:c?.native_scheduler_supported??!1,issues:[...c?.issues??[],...l]};return await h({home:t.home,type:e.apply?"plugin_install":"plugin_install_dry_run",details:p}),p}async function Ba(e){let t=f(e.home),r=ja(e.host);if(!e.targetPath||!r)return Du(e.host,e.surface,e.targetPath,r,!e.apply);let o=Ua(e.targetPath)?await $a(e.targetPath):null,n=oo(e.host,e.surface),s=o!==null,a=s&&e.apply?await Ha(t.home,e.host,e.surface,e.targetPath):null;s&&e.apply&&await Lu(e.targetPath,{recursive:!0,force:!0});let i={host:e.host,surface:e.surface,targetPath:e.targetPath,sourcePath:r,action:s?"remove":"noop",dryRun:!e.apply,changed:s,beforeHash:o,afterHash:A(""),backupPath:a,applied:s&&e.apply,enabled:!1,hook_registered:!1,package_kind:n.packageKind,native_hooks_supported:n.nativeHooksSupported,native_scheduler_supported:!1,issues:[]};return await h({home:t.home,type:e.apply?"plugin_uninstall":"plugin_uninstall_dry_run",details:i}),i}function Du(e,t,r,o,n){return{host:e,surface:t,targetPath:r,sourcePath:o,action:"unsupported",dryRun:n,changed:!1,beforeHash:null,afterHash:A(""),backupPath:null,applied:!1,enabled:!1,hook_registered:!1,package_kind:"unsupported-native",native_hooks_supported:!1,native_scheduler_supported:!1,issues:[]}}function Ke(e,t){if(t)return or.resolve(t,e)}function nr(e,t,r){let o=Gr(e,r);if(e==="claude"&&o==="claude-desktop")return{surface:o,managedBlock:null,mcpRegistration:t?or.join(or.resolve(t,e),"claude_desktop_config.json"):su(),plugin:Le(e,o,t)};if(!t)return{surface:o,managedBlock:nu(e),mcpRegistration:hn(e),plugin:Le(e,o)};let n=or.resolve(t,e);return{surface:o,managedBlock:or.join(n,ru(e)),mcpRegistration:or.join(n,ou(e)),plugin:Le(e,o,t)}}import{accessSync as b_,constants as v_,existsSync as lt}from"node:fs";import{mkdir as xn,readFile as sr,rm as k_,writeFile as jn}from"node:fs/promises";import G from"node:path";async function ao(e){let t=f(e.home),r=G.resolve(e.targetPath??In(e.host)),o=e.commandMode??"package",n=Dt({host:e.host,commandMode:o,home:t.home,projectRoot:e.projectRoot}).mcpServers.nativesoul,s=lt(r),a=s?await sr(r,"utf8"):null,i=Fu(w_(so(a),n)),l=a===null?null:A(a),c=A(i),d=x_(a,i),p=d!=="noop",g=p&&e.apply?await Uu(t.home,e.host,r,s,a,c):null;p&&e.apply&&(await xn(G.dirname(r),{recursive:!0,mode:448}),await jn(r,i,{encoding:"utf8",mode:384}));let y={host:e.host,targetPath:r,action:d,dryRun:!e.apply,changed:p,beforeHash:l,afterHash:c,diff:Vu(a,i),backupPath:g,commandMode:o,applied:p&&e.apply};return await h({home:t.home,type:e.apply?"mcp_registration_apply":"mcp_registration_dry_run",details:y}),y}async function Ja(e){let t=f(e.home),r=G.resolve(e.targetPath??In(e.host)),o=lt(r),n=o?await sr(r,"utf8"):null,s=R_(n),a=n===null?null:A(n),i=s===null?A(""):A(s),l=n!==s?"remove":"noop",c=l!=="noop",d=c&&e.apply?await Uu(t.home,e.host,r,o,n,i):null;c&&e.apply&&s!==null&&(await xn(G.dirname(r),{recursive:!0,mode:448}),await jn(r,s,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:r,action:l,dryRun:!e.apply,changed:c,beforeHash:a,afterHash:i,diff:Vu(n,s),backupPath:d,commandMode:"package",applied:c&&e.apply};return await h({home:t.home,type:e.apply?"mcp_registration_uninstall":"mcp_registration_uninstall_dry_run",details:p}),p}async function qa(e){let t=f(e.home),r=JSON.parse(await sr(e.snapshotPath,"utf8"));e.apply&&(r.beforeExists&&r.beforeContent!==null?(await xn(G.dirname(r.targetPath),{recursive:!0,mode:448}),await jn(r.targetPath,r.beforeContent,{encoding:"utf8",mode:384})):lt(r.targetPath)&&await k_(r.targetPath));let o={snapshotPath:e.snapshotPath,targetPath:r.targetPath,dryRun:!e.apply,applied:e.apply,restoredExists:r.beforeExists,restoredHash:r.beforeHash};return await h({home:t.home,type:e.apply?"mcp_registration_rollback":"mcp_registration_rollback_dry_run",details:o}),o}async function io(e){let t=G.resolve(e.targetPath??In(e.host)),r=iu(e.host,e.targetPath),o=lt(t),n=[],s=await S_(e.host,t,r);if(s&&n.push(s),!o)return n.push({code:"MCP_CONFIG_MISSING",severity:"warn",message:`MCP config target is missing: ${t}`,remediation:"Run nativesoul mcp install --host <host> --target <path> --apply"}),{host:e.host,targetPath:t,target_exists:!1,parse_ok:!1,configured:!1,command:null,command_ok:!1,issues:n};let a=null;try{a=so(await sr(t,"utf8"))}catch(p){n.push({code:"MCP_CONFIG_INVALID_JSON",severity:"error",message:p instanceof Error?p.message:"MCP config is invalid JSON",remediation:"Fix the JSON syntax or roll back from an NativeSoul snapshot"})}let i=a?Wa(a):null,l=typeof i?.command=="string"?i.command:null,c=Array.isArray(i?.args)?i.args.filter(p=>typeof p=="string"):[];i?l||n.push({code:"NATIVESOUL_MCP_COMMAND_MISSING",severity:"error",message:"nativesoul MCP server command is missing",remediation:"Re-run nativesoul mcp install"}):n.push({code:"NATIVESOUL_MCP_MISSING",severity:"warn",message:"nativesoul MCP server entry is not configured",remediation:"Run nativesoul mcp install --host <host> --target <path> --apply"});let d=l?e.checkCommand===!1?{ok:!0,issues:[]}:A_(l,c,t):{ok:!1,issues:[]};return n.push(...d.issues),{host:e.host,targetPath:t,target_exists:o,parse_ok:a!==null,configured:i!==null,command:l,command_ok:d.ok,issues:n}}function In(e){return hn(e)}function so(e){if(e===null||e.trim().length===0)return{};let t=JSON.parse(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error("MCP config root must be a JSON object");return t}function w_(e,t){let r=e.mcpServers,o=r&&typeof r=="object"&&!Array.isArray(r)?{...r}:{};return o.nativesoul={command:t.command,args:t.args,...t.env&&Object.keys(t.env).length>0?{env:t.env}:{}},{...e,mcpServers:o}}function R_(e){if(e===null)return null;let t=so(e),r=t.mcpServers;if(!r||typeof r!="object"||Array.isArray(r)||!Object.hasOwn(r,"nativesoul"))return e;let o={...r};return delete o.nativesoul,Fu({...t,mcpServers:o})}function Wa(e){let t=e.mcpServers;if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t.nativesoul;return!r||typeof r!="object"||Array.isArray(r)?null:r}async function S_(e,t,r){if(e!=="claude"||r===null||G.resolve(r)===t||!lt(r))return null;try{let o=so(await sr(r,"utf8")),n=Wa(o);if(!n)return null;if(lt(t)){let s=so(await sr(t,"utf8")),a=Wa(s);if(a&&JSON.stringify(Hu(a))===JSON.stringify(Hu(n)))return null}}catch{return null}return{code:"LEGACY_MCP_PATH",severity:"warn",message:`Legacy Claude MCP registration detected at ${r}.`,remediation:"Migrate to ~/.claude.json with nativesoul mcp install --host claude --apply, then uninstall or roll back the legacy ~/.claude/mcp.json entry."}}function Hu(e){return{command:typeof e.command=="string"?e.command:null,args:Array.isArray(e.args)?e.args.filter(t=>typeof t=="string"):[]}}function A_(e,t,r){let o=[],n=E_(e);if(!n)return o.push({code:"NATIVESOUL_MCP_COMMAND_UNRESOLVED",severity:"error",message:`nativesoul MCP command does not resolve to an executable: ${e}`,remediation:"Reinstall with NATIVESOUL_MCP_COMMAND set to an absolute nativesoul-mcp path, or run npm install -g nativesoul and retry."}),{ok:!1,issues:o};if(P_(e,n)){let s=t[0],a=s?G.isAbsolute(s)?s:G.resolve(G.dirname(r),s):null;if(!a||!lt(a))return o.push({code:"NATIVESOUL_MCP_NODE_SCRIPT_MISSING",severity:"error",message:"nativesoul MCP command uses node but the server script is missing.",remediation:"Re-run nativesoul mcp install with --command-mode absolute or rebuild the local package."}),{ok:!1,issues:o}}return{ok:!0,issues:o}}function E_(e){if(G.isAbsolute(e))return $u(e)?e:null;let t=(process.env.PATH??"").split(G.delimiter).filter(Boolean),r=process.platform==="win32"?(process.env.PATHEXT??".EXE;.CMD;.BAT").split(";"):[""];for(let o of t)for(let n of r){let s=G.join(o,`${e}${n}`);if($u(s))return s}return null}function $u(e){if(process.platform==="win32"&&lt(e))return!0;try{return b_(e,v_.X_OK),!0}catch{return!1}}function P_(e,t){let r=G.basename(e).toLowerCase(),o=G.basename(t).toLowerCase();return r==="node"||r==="node.exe"||o==="node"||o==="node.exe"}function Fu(e){return`${JSON.stringify(e,null,2)}
881
+ `}function x_(e,t){return e===t?"noop":e===null||e.trim().length===0?"create":"update"}async function Uu(e,t,r,o,n,s){let a=G.join(e,"backups","mcp-registration");await xn(a,{recursive:!0,mode:448});let i=new Date().toISOString(),l={id:T("snapshot"),host:t,targetPath:r,beforeExists:o,beforeContent:n,beforeHash:n===null?null:A(n),afterHash:s,createdAt:i},c=G.join(a,`${i.replaceAll(/[:.]/gu,"-")}-${t}.json`);return await jn(c,JSON.stringify(l,null,2),{encoding:"utf8",mode:384}),c}function Vu(e,t){return e===t?"No changes.":[`before: ${e===null?"missing":A(e)}`,`after: ${t===null?"missing":A(t)}`,`lines_before: ${e===null?0:e.split(/\r?\n/u).length}`,`lines_after: ${t===null?0:t.split(/\r?\n/u).length}`].join(`
882
+ `)}async function ct(e){let t=await v(e.home),r=e.surface??null,o=Gr(e.host,r),n=e.hostConfigRoot??(e.targetRoot?Ke(e.host,e.targetRoot):void 0),s=await C_({host:e.host,surface:o,targetRoot:e.targetRoot,explicit:e.pluginEnabled}),a=new Date().toISOString(),i=I_(e.mode,r,e.heartbeat),l=await vt(e.host).scheduleReconcile({kind:"heartbeat",mode:e.mode,enabled:!0,surface:e.surface??void 0,apply:e.apply,hostConfigRoot:n,desired:i}),c={id:N_(e.host,e.surface),host:e.host,mode:e.mode,enabled:!0,native_schedule_supported:l.status==="ok",native_id:l.status==="ok"?l.nativeId??null:null,desired:i,updated_at:a},d=e.apply?j_(t.database,c):c,p={dryRun:!e.apply,applied:e.apply,schedule:d,adapter_result:l,warnings:T_(e.host,l.status,s)};return await h({home:t.home,type:e.apply?"schedule_reconciled":"schedule_reconcile_dry_run",details:{host:e.host,surface:e.surface??null,mode:e.mode,schedule_id:c.id,adapter_status:l.status,native_schedule_supported:c.native_schedule_supported}}),p}async function lo(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await R(t.database))return[];let r=_(t.database,{readOnly:e.readOnly});try{return r.listSchedules({host:e.host,limit:Math.min(Math.max(e.limit??50,1),200)})}finally{r.close()}}async function Ka(e){let t=await v(e.home),r=_(t.database),o,n;try{if(o=r.listSchedules({limit:200}).find(s=>s.id===e.id),!o)throw new Error(`Schedule not found: ${e.id}`);n=e.apply?r.disableSchedule(e.id,new Date().toISOString()):o}finally{r.close()}if(!n)throw new Error(`Schedule not found after disable: ${e.id}`);return await h({home:t.home,type:e.apply?"schedule_disabled":"schedule_disable_dry_run",details:{schedule_id:e.id,host:n.host,mode:n.mode}}),{dryRun:!e.apply,applied:e.apply,schedule:e.apply?n:{...n,enabled:!1}}}function j_(e,t){let r=_(e);try{return r.upsertSchedule(t)}finally{r.close()}}function I_(e,t,r){return{kind:"heartbeat",mode:e,policy:"read_only",silent_ack:"HEARTBEAT_OK",skill:"life:heartbeat",cadence:r?.cadence??"daily",skip_when_busy:r?.skipWhenBusy??!0,project_scope:r?.projectScope??"current-project",behavior:r?.behavior??"read_only",...t&&t!=="default"?{surface:t}:{}}}function T_(e,t,r){return t!=="unsupported"?[]:e==="grok"||e==="gemini"?[]:r===!1?["NATIVE_SCHEDULE_UNSUPPORTED_NO_FALLBACK_INSTALLED"]:["NATIVE_SCHEDULE_UNSUPPORTED"]}async function C_(e){if(e.explicit!==void 0)return e.explicit;try{let t=Le(e.host,e.surface,e.targetRoot);return(await it({host:e.host,surface:e.surface,targetPath:t})).enabled}catch{return!1}}function N_(e,t){return e==="claude"&&t&&t!=="default"?`schedule:${e}:heartbeat:${t}`:`schedule:${e}:heartbeat`}function Ga(e){let t=e.observedAt??new Date().toISOString(),r=e.plugin.enabled&&["native-plugin","official-extension"].includes(e.plugin.package_kind),o=e.plugin.native_hooks_supported&&e.plugin.hook_registered,n=e.mcpRegistration.configured,s=e.schedules.some(y=>M_(y,t)),a=$_(e.capabilities,e.adapterDiagnostics),i=[co("native_package",r,t,e.plugin.targetPath??e.plugin.package_kind,"Native package/extension is not installed or enabled."),co("native_hooks",o,t,e.plugin.targetPath??e.plugin.package_kind,"Native lifecycle hook registration is missing."),co("mcp",n,t,e.mcpRegistration.targetPath,"MCP registration is missing or invalid."),co("native_scheduler",s,t,D_(e.schedules),F_(e.host,e.schedules)),co("official_inventory",a,t,H_(e.capabilities),"Official non-degraded capability inventory evidence is missing.")],l=i.filter(y=>!y.satisfied).map(y=>y.requirement),c=r&&o&&n,d=!a,p=l.includes("native_scheduler")&&Bu(e.host),g=l.length===0;return{schema_version:1,host:e.host,surface:e.surface,status:U_({fullNative:g,blockedByHost:p,degradedScan:d,ready:c}),ready:c,full_native:g,blocked_by_host:p,degraded_scan:d,generated_at:t,requirements:i,missing_requirements:l}}function Xa(e){return e.ready&&e.native_kind.includes("native")&&(e.schema_hash?.startsWith("full-native:")===!0||e.source.includes("full-native-evidence:"))}function co(e,t,r,o,n){return{requirement:e,satisfied:t,evidence:t?[{source_kind:"doctor",reference:o,observed_at:r,confidence:O_(o)}]:[],missing_reason:t?null:n}}function O_(e){return e.startsWith("not-applicable:")||e==="missing"?"low":"medium"}function M_(e,t){return e.enabled&&e.native_schedule_supported&&e.native_id!==null&&!L_(e.updated_at,t)}function L_(e,t){if(!e)return!1;let r=Date.parse(e),o=Date.parse(t);return!Number.isFinite(r)||!Number.isFinite(o)?!0:o-r>10080*60*1e3}function D_(e){let t=e.find(r=>r.native_id!==null);return t?.native_id?t.updated_at?`${t.native_id}@${t.updated_at}`:t.native_id:"missing"}function H_(e){return e.find(t=>t.ready)?.source??"missing"}function $_(e,t){return t.some(r=>r.severity==="error"||r.severity==="warn")?!1:e.some(r=>r.ready&&r.schema_hash?.startsWith("official:")===!0)}function F_(e,t){return Bu(e)?e==="claude"?"Claude local Scheduled Tasks proof is missing, UI-only, or cloud-routine-only for this surface.":e==="antigravity"?"Antigravity scheduler write/list/status/cancel contract proof is missing or stale.":`Host ${e} has no proven native scheduler support.`:t.some(r=>r.enabled)?"Enabled schedule uses fallback or has no native_id mapping.":"No enabled native schedule evidence is available."}function Bu(e){return e==="codex"||e==="claude"||e==="grok"||e==="gemini"||e==="antigravity"}function U_(e){return e.fullNative?"full_native":e.blockedByHost?"blocked_by_host":e.degradedScan?"degraded_scan":e.ready?"ready_fallback":"ready"}async function Ju(e){let t=nr(e.host,e.targetRoot,e.surface),r=t.managedBlock??`not-applicable:${Ct(e.host,e.surface)}`,o=t.managedBlock?await bd({host:e.host,targetPath:r}):Q_(e.host,e.surface),n=await io({host:e.host,targetPath:t.mcpRegistration,checkCommand:e.targetRoot===void 0}),s=await it({host:e.host,surface:e.surface,targetPath:t.plugin}),a=await Ea({home:e.home,host:e.host}),l=(e.databaseExists?await lo({home:e.home,host:e.host,limit:200,readOnly:!0}):[]).filter(x=>J_(e.host,e.surface,x)),c=e.databaseExists?await Se({home:e.home,host:e.host,limit:100,readOnly:!0}):[],d=e.databaseExists?_n(f(e.home).database):[],p=e.targetRoot!==void 0,g=p?[]:(await Tr(e.host))[0]?.diagnostics??[],y=l.length===0&&e.databaseExists?[{code:"SCHEDULE_DESIRED_STATE_MISSING",severity:"warn",message:`No persisted schedule desired state found for ${e.host}.`,remediation:e.targetRoot?`Run nativesoul install --host ${e.host} --apply --target-root ${e.targetRoot}`:"Run nativesoul install --host <host> --apply"}]:[],k=a.stale?[{code:"HANDSHAKE_STALE",severity:"warn",message:`Last ${e.host} handshake is ${a.age_hours??"unknown"} hour(s) old.`,remediation:`Run nativesoul bootstrap --host ${e.host} --cwd <current-working-directory> --format inject`}]:[],S=await G_({host:e.host,managedBlock:o,handshake:a}),U=await X_(e.host),Q=l.filter(x=>x.enabled&&x.native_schedule_supported&&x.native_id===null).map(x=>({code:"NATIVE_SCHEDULE_MAPPING_MISSING",severity:"warn",message:`Schedule ${x.id} reports native support but has no native_id mapping.`,remediation:e.targetRoot?`Run nativesoul schedule reconcile --host ${e.host} --apply --target-root ${e.targetRoot}`:`Run nativesoul schedule reconcile --host ${e.host} --apply`})),je=l.filter(x=>x.enabled&&!x.native_schedule_supported&&!s.enabled&&s.package_kind!=="unsupported-native").map(x=>({code:"NATIVE_SCHEDULE_UNSUPPORTED_NO_FALLBACK_INSTALLED",severity:"warn",message:`Schedule ${x.id} has no native scheduler support and no NativeSoul package fallback is installed.`,remediation:`Run nativesoul install --host ${e.host} --apply`})),be=K_({managedBlock:o,mcpRegistration:n,plugin:s,schedules:l,capabilities:c}),pe=Ga({host:e.host,surface:e.surface,mcpRegistration:n,plugin:s,schedules:l,capabilities:c,adapterDiagnostics:g}),Ie=[...o.issues,...n.issues,...s.issues,...g,...y,...k,...S,...U,...Q,...je];return{host:e.host,surface:e.surface,status:Ie.some(x=>x.severity==="error"||x.severity==="warn")?"degraded":"ready",targets:{managed_block:r,mcp_registration:n.targetPath},native_adapter_diagnostics_skipped:p,adapter_diagnostics:g,managed_block:o,mcp_registration:n,plugin:s,provider_parity:be,full_native_evidence:pe,handshake:a,schedule_count:l.length,enabled_schedule_count:l.filter(x=>x.enabled).length,native_schedule_mappings:l.map(x=>({id:x.id,native_schedule_supported:x.native_schedule_supported,native_id:x.native_id})),capability_count:c.length,ready_capability_count:c.filter(x=>x.ready).length,cross_host_inventory_summary:{current_host:c.length,other_hosts:d.filter(x=>x.host!==e.host&&x.host!=="all").length,ready_other_hosts:d.filter(x=>x.host!==e.host&&x.host!=="all"&&x.ready).length},issues:Ie}}function J_(e,t,r){return e!=="claude"?!0:q_(r.desired)===t}function q_(e){if(e&&typeof e=="object"&&!Array.isArray(e)&&"surface"in e){let t=e.surface;if(t==="claude-desktop"||t==="claude-code")return t}return"claude-code"}function K_(e){let t=e.plugin.enabled,r=e.mcpRegistration.configured,o=e.managedBlock.configured||t,n=e.schedules.some(p=>p.enabled),a=e.schedules.some(p=>p.enabled&&p.native_schedule_supported)?"native":n&&t?"official-fallback":"unsupported-native",i=e.plugin.native_hooks_supported?e.plugin.hook_registered?"native":"unsupported-native":t?"official-fallback":"unsupported-native",l=e.plugin.package_kind==="unsupported-native"?"unsupported-native":t?"ready":"degraded",c=e.capabilities.length===0||e.capabilities.some(p=>p.ready);return{level:o&&r&&l==="ready"&&i!=="unsupported-native"&&a!=="unsupported-native"?"ready":e.plugin.package_kind==="native-plugin"?"native":e.plugin.package_kind==="unsupported-native"?"unsupported-native":"official-fallback",bootstrap:o?"ready":"degraded",mcp:r?"ready":"degraded",package:l,hooks:i,memory_recall:r?"ready":"degraded",policy_guard:o?"ready":"degraded",capability_scan:c?"ready":"degraded",heartbeat:a}}async function G_(e){if(!e.managedBlock.configured||e.managedBlock.targetPath.startsWith("not-applicable:"))return[];let t=10080*60*1e3,r=await Y_(e.managedBlock.targetPath),o=e.handshake.age_ms;return r!==null&&r<=t?[]:o!==null&&o<=t?[]:[{code:"HANDSHAKE_NOT_OBSERVED",severity:"warn",message:`NativeSoul managed block is present for ${e.host}, but no handshake was observed in the last 7 days.`,remediation:`Start a host session or run nativesoul bootstrap --host ${e.host} --cwd <current-working-directory> --format inject`}]}async function X_(e){let t=z_(e).map(r=>Wu.resolve(process.cwd(),r));for(let r of t){if(!V_(r))continue;let o=await B_(r,"utf8"),n=Wr(o);if(n>2e3)return[{code:"PROJECT_CONTEXT_HEAVY",severity:"info",message:`Project instruction file is heavy (${n} estimated tokens): ${r}`,remediation:"Keep project rules authoritative for code boundaries; NativeSoul persona remains advisory continuity."}]}return[]}function z_(e){switch(e){case"claude":return["CLAUDE.md",Wu.join(".claude","CLAUDE.md")];case"codex":return["AGENTS.md"];case"grok":return["Agents.md","AGENTS.md"];case"antigravity":case"gemini":return["GEMINI.md"]}}async function Y_(e){try{let t=await W_(e);return Math.max(Date.now()-t.mtimeMs,0)}catch{return null}}function Q_(e,t){return{host:e,targetPath:`not-applicable:${Ct(e,t)}`,target_exists:!1,configured:!0,markers_valid:!0,issues:[]}}async function Ht(e){let t=f(e.home),r=await Kr(e.home),o=za(t.database),n=Ve(e.host),s=[],a=o?_n(t.database):[],i=pu(t.database,o),l=await nt(t.home),c=za(yn(t.home)),d=za(Zt(t.home));for(let y of n)for(let k of We(y,e.surface))s.push(await Ju({home:t.home,host:y,surface:k,targetRoot:e.targetRoot,databaseExists:o}));let p=[...r.issues,...mu(i),...s.flatMap(y=>y.issues)],g=r.healthy&&!p.some(y=>y.severity==="error");return{home:t.home,healthy:g,status:p.some(y=>y.severity==="error"||y.severity==="warn")?"degraded":"ready",workspace:r,target_root:e.targetRoot?qu.resolve(e.targetRoot):null,cross_host_inventory:gu(a),activation_summary:tu({home:t.home,targetRoot:e.targetRoot?qu.resolve(e.targetRoot):null,host:e.host,profile:l,onboardingComplete:c,activationComplete:d,hosts:s}),full_native_matrix:Z_(s),semantic_index:i,hosts:s,issues:p}}function Z_(e){let t=e.map(r=>({host:r.host,surface:r.surface,status:r.full_native_evidence.status,full_native:r.full_native_evidence.full_native,blocked_by_host:r.full_native_evidence.blocked_by_host,degraded_scan:r.full_native_evidence.degraded_scan,missing_requirements:r.full_native_evidence.missing_requirements}));return{require_full_native_ready:t.length>0&&t.every(r=>r.full_native),host_count:t.length,full_native_count:t.filter(r=>r.full_native).length,blocked_count:t.filter(r=>r.blocked_by_host).length,degraded_scan_count:t.filter(r=>r.degraded_scan).length,ready_fallback_count:t.filter(r=>r.status==="ready_fallback").length,hosts:t}}import{existsSync as eb}from"node:fs";import{mkdir as tb,readdir as rb,readFile as ob,writeFile as nb}from"node:fs/promises";import uo from"node:path";async function Ya(e){let t=e.apply===!0,r=t?f((await v(e.home)).home):f(e.home),o=e.project??L(e.cwd??process.cwd(),r.home),n=Math.min(Math.max(e.limit??10,1),50),s=await sb(r.home,r.database,o,n),a=ib(o,s,n),i=db({applied:t,project:o,proposals:a,dailyNotes:s.dailyNotes,candidates:s.candidates,activeMemories:s.activeMemories,auditEvents:s.auditEvents}),l=null;return t&&(l=await lb(r.home,i),await cb(r.home,a),await h({home:r.home,type:"memory_reflection_run",details:{project:o,proposal_count:a.length,report_path:l,daily_notes:s.dailyNotes.length,candidates:s.candidates.length,active_memories:s.activeMemories.length,audit_events:s.auditEvents.length}})),{applied:t,home:r.home,project:o,report:i,report_path:l,proposals:a,sources:{daily_notes:s.dailyNotes.length,candidates:s.candidates.length,active_memories:s.activeMemories.length,audit_events:s.auditEvents.length},protected_files:["SOUL.md","POLICY.md","standing-orders"].map(c=>({path:uo.join(r.home,c),modified:!1}))}}async function sb(e,t,r,o){let n=await ab(e,o);if(!eb(t))return{dailyNotes:n,candidates:[],activeMemories:[],auditEvents:[]};let s=_(t,{readOnly:!0});try{return{dailyNotes:n,candidates:s.listMemories({project:r,status:"candidate",includeForgotten:!1,limit:o}),activeMemories:s.listMemories({project:r,status:"active",includeForgotten:!1,limit:Math.max(o,20)}),auditEvents:s.listEvents({limit:Math.max(o,20)})}}finally{s.close()}}async function ab(e,t){let r=uo.join(e,"memory","daily");if(!await R(r))return[];let n=(await rb(r,{withFileTypes:!0})).filter(a=>a.isFile()&&a.name.endsWith(".md")).map(a=>a.name).sort().reverse().slice(0,t),s=[];for(let a of n){let i=uo.join(r,a),l=O(await ob(i,"utf8")).value.trim();l.length>0&&s.push({id:`daily:${a}`,path:i,text:l})}return s}function ib(e,t,r){let o=[];for(let n of t.candidates){let s=Ku(n.content,t.activeMemories),a=pb(n.content,t.activeMemories);if(a){o.push(ar({action:"flag_conflict",project:e,summary:`Review conflict between ${n.id} and ${a.id}`,before:a.summary,after:n.summary,evidence:[n.id,a.id],risk:"high"}));continue}if(s&&s.score>=.7){o.push(ar({action:"deduplicate",project:e,summary:`Reject or merge duplicate candidate ${n.id}`,before:s.memory.summary,after:n.summary,evidence:[n.id,s.memory.id],risk:"medium"}));continue}o.push(ar({action:"promote_candidate",project:e,summary:`Promote candidate ${n.id} after human review`,before:"Candidate memory is not durable yet.",after:n.summary,evidence:[n.id],risk:"low"}))}for(let n of t.dailyNotes){let s=ub(n.text);for(let a of s){if(o.length>=r)return o;let i=Ku(a,[...t.activeMemories,...t.candidates]);i&&i.score>=.7?o.push(ar({action:"deduplicate",project:e,summary:`Daily note repeats existing memory ${i.memory.id}`,before:i.memory.summary,after:Be(a),evidence:[n.id,i.memory.id],risk:"medium"})):o.push(ar({action:"create_candidate",project:e,summary:Be(a),before:"No durable memory exists for this daily note.",after:a,evidence:[n.id],risk:"low"}))}}for(let n of t.activeMemories)if(n.expires_at&&Date.parse(n.expires_at)<=Date.now()&&o.push(ar({action:"expire_active",project:e,summary:`Expire active memory ${n.id}`,before:n.summary,after:"Memory should move to expired after human review.",evidence:[n.id],risk:"medium"})),o.length>=r)return o;return o.slice(0,r)}function ar(e){return{id:T("reflection"),persisted_memory_id:null,...e}}async function lb(e,t){let r=uo.join(e,"proposals");await tb(r,{recursive:!0,mode:448});let o=uo.join(r,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-reflection.md`);return await nb(o,t,{encoding:"utf8",mode:384,flag:"wx"}),o}async function cb(e,t){for(let r of t.filter(o=>o.action==="create_candidate")){let o=await ae(e,{project:r.project,content:["Reflection consolidation candidate.","",r.after,"",`Evidence: ${r.evidence.join(", ")}`].join(`
883
+ `),confidence:.5,authority:"reflection_proposal",source:{kind:"reflection",proposal_id:r.id,evidence:r.evidence}});r.persisted_memory_id=o.id}}function db(e){let t=["# NativeSoul Reflection Report","",`Mode: ${e.applied?"apply":"dry-run"}`,`Project: ${e.project}`,`Generated at: ${new Date().toISOString()}`,"","## Sources","",`- Daily notes: ${e.dailyNotes.length}`,`- Candidate memories: ${e.candidates.length}`,`- Active memories: ${e.activeMemories.length}`,`- Audit events: ${e.auditEvents.length}`,"","## Before","",...e.candidates.map(r=>`- Candidate ${r.id}: ${r.summary}`),...e.activeMemories.slice(0,10).map(r=>`- Active ${r.id}: ${r.summary}`),"","## Proposed After",""];e.proposals.length===0&&t.push("- No consolidation proposal found.");for(let r of e.proposals)t.push(`- ${r.id} [${r.action}] ${r.summary}`),t.push(` - Before: ${r.before}`),t.push(` - After: ${r.after}`),t.push(` - Evidence: ${r.evidence.join(", ")}`),t.push(` - Risk: ${r.risk}`);return t.push("","## Safety","","- SOUL.md, POLICY.md, and standing-orders are not edited by reflection."),t.join(`
884
+ `)}function ub(e){return e.split(/\r?\n/u).map(t=>t.replace(/^\s*[-*]\s+/u,"").trim()).filter(t=>t.length>=20).filter(t=>!t.startsWith("#")).filter(t=>!/^(date|notes|observations|tasks):?$/iu.test(t)).slice(0,10)}function Ku(e,t){let r=null;for(let o of t){let n=zu(e,`${o.summary}
885
+ ${o.content}`);(!r||n>r.score)&&(r={memory:o,score:n})}return r}function pb(e,t){let r=Xu(e),o=Gu(e);for(let n of t)if(zu(e,`${n.summary}
886
+ ${n.content}`)>=.35&&o!==Gu(n.content)){let a=Xu(n.content);if([...r].some(l=>l.length>4&&a.has(l)))return n}return null}function Gu(e){return/\b(nao|não|never|do not|dont|don't|no longer|avoid|evitar|proibir|forbid)\b/iu.test(e)}function zu(e,t){return Ld(e,t,{minLength:3,normalizeDiacritics:!0,removeStopwords:!0})}function Xu(e){return Vr(e,{minLength:3,normalizeDiacritics:!0,removeStopwords:!0})}import{lstat as mb,readdir as gb,readFile as fb}from"node:fs/promises";import $t from"node:path";var Yu=new Set([".json",".jsonl",".md",".markdown",".txt"]);async function ei(e){let t=e.apply===!0,r=f((await v(e.home)).home),o=$t.resolve(e.sourcePath),n=e.project??L(e.cwd??process.cwd(),r.home),s=Math.min(Math.max(e.limit??200,1),1e3),a=[],i=await Qu(o,a),l=[],c=[];for(let k of i){if(l.length>=s){c.push({source_path:k,reason:"limit_reached"});continue}let S=await hb(k,a);if(S.length===0){c.push({source_path:k,reason:"no_supported_records"});continue}l.push(...S.slice(0,s-l.length))}let d=kb(l,n),p=wb(d).map(k=>({source_id:k,reason:"duplicate_source_id"})),g=[];if(t)for(let k of d){let S=await ae(r.home,{project:k.target_project,content:k.content,confidence:k.confidence,authority:"openclaw_import",source:{kind:"import",source_system:k.source_system,source_path:k.source_path,source_id:k.source_id,source_hash:k.source_hash,imported_at:new Date().toISOString(),redacted:k.redacted}});k.proposed_memory_id=S.id,g.push(S)}let y={applied:t,source_path:o,files:i,mapped_records:d,skipped_records:c,conflicts:p,redactions:d.filter(k=>k.redacted).length,proposed_scopes:Array.from(new Set(d.map(k=>k.target_project))).sort(),warnings:a,persisted_memories:g};return await h({home:r.home,type:t?"openclaw_import_applied":"openclaw_import_dry_run",details:Sb(y)}),y}async function Qu(e,t){let r;try{r=await mb(e)}catch{return t.push({code:"OPENCLAW_SOURCE_UNREADABLE",source_path:e,message:"Source path is not readable."}),[]}if(r.isFile())return Yu.has($t.extname(e).toLowerCase())?[e]:[];if(!r.isDirectory())return t.push({code:"OPENCLAW_SOURCE_UNSUPPORTED",source_path:e,message:"Source path is neither a file nor a directory."}),[];let o=await gb(e,{withFileTypes:!0});return(await Promise.all(o.map(s=>{let a=$t.join(e,s.name);return s.isDirectory()?Qu(a,t):Promise.resolve(Yu.has($t.extname(s.name).toLowerCase())?[a]:[])}))).flat().sort()}async function hb(e,t){let r;try{r=await fb(e,"utf8")}catch{return t.push({code:"OPENCLAW_FILE_UNREADABLE",source_path:e,message:"File could not be read."}),[]}let o=$t.extname(e).toLowerCase();return o===".json"?yb(e,r,t):o===".jsonl"?_b(e,r,t):bb(e,r)}function yb(e,t,r){let o;try{o=JSON.parse(t)}catch{return r.push({code:"OPENCLAW_JSON_MALFORMED",source_path:e,message:"JSON file is malformed."}),[]}return(Array.isArray(o)?o:vb(o)??[o]).flatMap((s,a)=>Zu(s,e,a))}function _b(e,t,r){return t.split(/\r?\n/u).flatMap((o,n)=>{let s=o.trim();if(!s)return[];try{return Zu(JSON.parse(s),e,n)}catch{return r.push({code:"OPENCLAW_JSONL_LINE_MALFORMED",source_path:e,message:`Line ${n+1} is malformed.`}),[]}})}function bb(e,t){return t.split(/\n(?=#{1,3}\s+)/u).map(r=>r.trim()).filter(r=>r.length>0).map((r,o)=>({id:null,content:r,project:null,confidence:null,sourcePath:e,raw:{kind:"text_section",index:o,source_path:e}}))}function vb(e){if(!ti(e))return null;for(let t of["memories","memory","records","items","notes"]){let r=e[t];if(Array.isArray(r))return r}return null}function Zu(e,t,r){if(typeof e=="string"&&e.trim().length>0)return[{id:null,content:e,project:null,confidence:null,sourcePath:t,raw:e}];if(!ti(e))return[];let o=Qa(e,["content","text","summary","memory","note","body","value"]);return o?[{id:Qa(e,["id","uid","uuid","key"])??`${$t.basename(t)}:${r+1}`,content:o,project:Qa(e,["project","project_id","scope_project","workspace","repo"]),confidence:Rb(e,["confidence","score"]),sourcePath:t,raw:Za(e)}]:[]}function kb(e,t){return e.map((r,o)=>{let n=O(r.content),s=r.id??`${$t.basename(r.sourcePath)}:${o+1}`;return{source_system:"openclaw",source_path:r.sourcePath,source_id:s,source_hash:Ab(r.raw),target_project:r.project?.trim()||t,content:n.value,summary:Be(n.value),redacted:n.redacted,confidence:Math.min(Math.max(r.confidence??.55,0),1),status:"candidate",proposed_memory_id:null}})}function wb(e){let t=new Map;for(let r of e)t.set(r.source_id,(t.get(r.source_id)??0)+1);return Array.from(t.entries()).filter(([,r])=>r>1).map(([r])=>r).sort()}function Qa(e,t){for(let r of t){let o=e[r];if(typeof o=="string"&&o.trim().length>0)return o.trim()}return null}function Rb(e,t){for(let r of t){let o=e[r];if(typeof o=="number"&&Number.isFinite(o))return o}return null}function Sb(e){return{source_path:e.source_path,files:e.files.length,mapped_records:e.mapped_records.length,skipped_records:e.skipped_records.length,conflicts:e.conflicts.length,redactions:e.redactions,persisted_memories:e.persisted_memories.length,proposed_scopes:e.proposed_scopes}}function Za(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?e:Array.isArray(e)?e.map(t=>Za(t)):ti(e)?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,Za(r)])):String(e)}function ti(e){return typeof e=="object"&&e!==null}function Ab(e){return ke(e)}import{lstat as Eb,readFile as Pb}from"node:fs/promises";import po from"node:path";var Ft=[".json",".jsonl",".md",".markdown",".txt"];var xb={nativesoul:{host:"nativesoul",supported_extensions:Ft,documented_inputs:["nativesoul memory export JSON/JSONL","operator-authored Markdown/text memory notes"],unsupported_boundaries:["NativeSoul private SQLite databases","undocumented internal cache files"],limitations:[]},codex:{host:"codex",supported_extensions:Ft,documented_inputs:["operator-provided Codex memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Codex private app stores","Codex cache or thread databases","undocumented internal state"],limitations:["Codex does not expose a NativeSoul-owned private store reader; import requires an explicit user-selected file."]},claude:{host:"claude",supported_extensions:Ft,documented_inputs:["operator-provided Claude memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Claude private settings databases","Claude internal conversation stores","undocumented internal state"],limitations:["Claude import is limited to explicit export or notes files selected by the operator."]},gemini:{host:"gemini",supported_extensions:Ft,documented_inputs:["operator-provided Gemini memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Gemini private app storage","Gemini internal cache files","undocumented internal state"],limitations:["No private Gemini memory database is read; use documented exports or operator-authored files."]},grok:{host:"grok",supported_extensions:Ft,documented_inputs:["operator-provided Grok memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Grok private app storage","Grok internal session stores","undocumented internal state"],limitations:["Grok import is file-only because no native memory store reader is supported."]},antigravity:{host:"antigravity",supported_extensions:Ft,documented_inputs:["operator-provided Antigravity memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Antigravity private workspace state","Antigravity scheduled-task stores","undocumented internal state"],limitations:["Antigravity import is constrained to explicit files; scheduler state is not memory import input."]}};function jb(e){return ke(e)}async function ni(e){let t=xb[e.host];if(!t)throw new Error(`Unsupported native host importer: ${String(e.host)}`);let r=e.apply===!0,o=f((await v(e.home)).home),n=po.resolve(e.sourcePath),s=e.project??L(e.cwd??process.cwd(),o.home),a=Math.min(Math.max(e.limit??200,1),1e3),i=[],l=await Ib(e.host,n,i),c=[],d=[];for(let S of l){if(c.length>=a){d.push({source_path:S,reason:"limit_reached"});continue}let U=await Tb(e.host,S,i);if(U.length===0){d.push({source_path:S,reason:"no_supported_records"});continue}c.push(...U.slice(0,a-c.length))}let p=Mb(e.host,c,s),g=await Lb(o.home,p),y=[];if(r)for(let S of p){let U=await ae(o.home,{project:S.target_project,content:S.content,confidence:S.confidence,authority:`${S.source_system}_import`,source:{kind:"import",source_system:S.source_system,source_path:S.source_path,source_id:S.source_id,source_hash:S.source_hash,normalized_content_hash:S.normalized_content_hash,imported_at:new Date().toISOString(),redacted:S.redacted}});S.proposed_memory_id=U.id,y.push(U)}let k={applied:r,host:e.host,source_path:n,registry:t,files:l,mapped_records:p,skipped_records:d,conflicts:g,redactions:p.filter(S=>S.redacted).length,proposed_scopes:Array.from(new Set(p.map(S=>S.target_project))).sort(),approvals_required:["Human review is required before imported candidate memories are promoted."],host_limitations:t.limitations,warnings:i,persisted_memories:y};return await h({home:o.home,type:r?"native_host_import_applied":"native_host_import_dry_run",details:Db(k)}),k}async function Ib(e,t,r){let o;try{o=await Eb(t)}catch{return r.push({code:"NATIVE_IMPORT_SOURCE_UNREADABLE",host:e,source_path:t,message:"Source path is not readable."}),[]}return o.isFile()?Fb(t)?[t]:(r.push({code:"NATIVE_IMPORT_FILE_UNSUPPORTED",host:e,source_path:t,message:"File extension is not supported by the native host importer registry."}),[]):o.isDirectory()?(r.push({code:"NATIVE_IMPORT_DIRECTORY_UNSUPPORTED",host:e,source_path:t,message:"Native host importers require an explicit file path and do not scan directories."}),[]):o.isDirectory()?[]:(r.push({code:"NATIVE_IMPORT_SOURCE_UNSUPPORTED",host:e,source_path:t,message:"Source path is neither a file nor a directory."}),[])}async function Tb(e,t,r){let o;try{o=await Pb(t,"utf8")}catch{return r.push({code:"NATIVE_IMPORT_FILE_UNREADABLE",host:e,source_path:t,message:"File could not be read."}),[]}let n=po.extname(t).toLowerCase();return n===".json"?Cb(e,t,o,r):n===".jsonl"?Nb(e,t,o,r):Ob(t,o)}function Cb(e,t,r,o){let n;try{n=JSON.parse(r)}catch{return o.push({code:"NATIVE_IMPORT_JSON_MALFORMED",host:e,source_path:t,message:"JSON file is malformed."}),[]}return(Array.isArray(n)?n:Hb(n)??[n]).flatMap((a,i)=>tp(a,t,i))}function Nb(e,t,r,o){return r.split(/\r?\n/u).flatMap((n,s)=>{let a=n.trim();if(!a)return[];try{return tp(JSON.parse(a),t,s)}catch{return o.push({code:"NATIVE_IMPORT_JSONL_LINE_MALFORMED",host:e,source_path:t,message:`Line ${s+1} is malformed.`}),[]}})}function Ob(e,t){return t.split(/\n(?=#{1,3}\s+)/u).map(r=>r.trim()).filter(r=>r.length>0).map((r,o)=>({id:null,content:r,project:null,confidence:null,sourcePath:e,raw:{kind:"text_section",index:o,source_path:e}}))}function tp(e,t,r){if(typeof e=="string"&&e.trim().length>0)return[{id:null,content:e,project:null,confidence:null,sourcePath:t,raw:e}];if(!si(e))return[];let o=ri(e,["content","text","summary","memory","note","body","value"]);return o?[{id:ri(e,["id","uid","uuid","key"])??`${po.basename(t)}:${r+1}`,content:o,project:ri(e,["project","project_id","scope_project","workspace","repo"]),confidence:$b(e,["confidence","score"]),sourcePath:t,raw:oi(e)}]:[]}function Mb(e,t,r){return t.map((o,n)=>{let s=O(o.content),a=o.id??`${po.basename(o.sourcePath)}:${n+1}`,i=rp(s.value);return{source_system:e,source_path:o.sourcePath,source_id:a,source_hash:jb(o.raw),normalized_content_hash:i,target_project:o.project?.trim()||r,content:s.value,summary:Be(s.value),redacted:s.redacted,confidence:Math.min(Math.max(o.confidence??.55,0),1),status:"candidate",proposed_memory_id:null}})}async function Lb(e,t){let r=[];r.push(...ep(t,o=>o.source_hash,"duplicate_source_hash")),r.push(...ep(t,o=>o.normalized_content_hash,"duplicate_normalized_content"));for(let o of new Set(t.map(n=>n.target_project))){let n=await Et({home:e,project:o,includeForgotten:!1,limit:1e3}),s=new Set(n.map(a=>rp(a.content)));for(let a of t.filter(i=>i.target_project===o))s.has(a.normalized_content_hash)&&r.push({source_id:a.source_id,reason:"existing_normalized_content"})}return r.sort((o,n)=>`${o.reason}:${o.source_id}`.localeCompare(`${n.reason}:${n.source_id}`))}function ep(e,t,r){let o=new Map;for(let n of e){let s=t(n);o.set(s,[...o.get(s)??[],n])}return Array.from(o.values()).filter(n=>n.length>1).flatMap(n=>n.map(s=>({source_id:s.source_id,reason:r})))}function rp(e){return ke(e.toLowerCase().replace(/\s+/gu," ").trim())}function Db(e){return{host:e.host,source_path:e.source_path,files:e.files.length,mapped_records:e.mapped_records.length,skipped_records:e.skipped_records.length,conflicts:e.conflicts.length,redactions:e.redactions,persisted_memories:e.persisted_memories.length,proposed_scopes:e.proposed_scopes,approvals_required:e.approvals_required.length,host_limitations:e.host_limitations}}function Hb(e){if(!si(e))return null;for(let t of["memories","memory","records","items","notes"]){let r=e[t];if(Array.isArray(r))return r}return null}function ri(e,t){for(let r of t){let o=e[r];if(typeof o=="string"&&o.trim().length>0)return o.trim()}return null}function $b(e,t){for(let r of t){let o=e[r];if(typeof o=="number"&&Number.isFinite(o))return o}return null}function oi(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?e:Array.isArray(e)?e.map(t=>oi(t)):si(e)?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,oi(r)])):String(e)}function Fb(e){return Ft.includes(po.extname(e).toLowerCase())}function si(e){return typeof e=="object"&&e!==null}var de={state:"unlicensed",license_key:null,instance_id:null,purchased_at:null,version_at_activation:null,updates_until:null,last_checked_at:null,source:"none"};import{chmod as Ub,mkdir as Vb,readFile as Bb,rm as Wb,writeFile as Jb}from"node:fs/promises";import{randomUUID as qb}from"node:crypto";import op from"node:path";function Tn(e){return op.join(f(e).home,"license.json")}async function Ee(e){let t=Tn(e);if(!await R(t))return null;try{let r=JSON.parse(await Bb(t,"utf8"));return Kb(r)?r:null}catch{return null}}async function mo(e,t){let r=Tn(e);return await Vb(op.dirname(r),{recursive:!0,mode:448}),await Jb(r,`${JSON.stringify(t,null,2)}
887
+ `,{encoding:"utf8",mode:384}),await Ub(r,384),t}async function ai(e){await Wb(Tn(e),{force:!0})}async function Cn(e){let t=await Ee(e);if(t?.instance_id)return t.instance_id;let r=qb();return await mo(e,{...de,instance_id:r,purchased_at:t?.purchased_at??null,version_at_activation:t?.version_at_activation??null,updates_until:t?.updates_until??null,license_key_instance_id:t?.license_key_instance_id??null}),r}function Kb(e){return(e.state==="licensed"||e.state==="unlicensed")&&(typeof e.license_key=="string"||e.license_key===null)&&(typeof e.instance_id=="string"||e.instance_id===null)&&(typeof e.purchased_at=="string"||e.purchased_at===null||e.purchased_at===void 0)&&(typeof e.version_at_activation=="string"||e.version_at_activation===null||e.version_at_activation===void 0)&&(typeof e.updates_until=="string"||e.updates_until===null)&&(typeof e.last_checked_at=="string"||e.last_checked_at===null)&&(e.source==="dodo"||e.source==="none")&&(typeof e.license_key_instance_id=="string"||e.license_key_instance_id===null)}var np={name:"nativesoul",version:"0.1.2",description:"Local-first continuity layer for coding agents.",type:"module",license:"UNLICENSED",main:"dist/packages/cli/src/index.js",repository:{type:"git",url:"git+https://github.com/fillipeweb/nativesoul.git"},bugs:{url:"https://github.com/fillipeweb/nativesoul/issues"},homepage:"https://github.com/fillipeweb/nativesoul#readme",files:["dist/","plugins/","policy-packs/","schemas/","docs/adr/","docs/legal/","llm-install.txt","README.md","CHANGELOG.md"],bin:{nativesoul:"dist/packages/cli/src/index.js","nativesoul-mcp":"dist/packages/mcp-server/src/index.js"},scripts:{lint:"eslint .",typecheck:"tsc -p tsconfig.json --noEmit",test:"npm run build && npm run test:non-e2e","test:non-e2e":"node scripts/run-non-e2e-tests.mjs",build:"npm run build:ts && npm run build:minify","build:ts":"tsc -p tsconfig.build.json","build:minify":"node scripts/build-min.mjs","policy:generate":"node scripts/generate-policy-fail-closed.mjs","policy:check":"node scripts/generate-policy-fail-closed.mjs --check","release:security:audit":"node scripts/release-security-audit.mjs","release:provenance:dry-run":"node scripts/release-provenance-dry-run.mjs","package:local":"node scripts/package-local.mjs","package:dry-run":"node scripts/package-dry-run.mjs","package:smoke":"node scripts/package-smoke.mjs","test:e2e":"npm run build && vitest run tests/e2e"},engines:{node:">=22.17.0"},dependencies:{},devDependencies:{"@eslint/js":"^10.0.1","@types/node":"^26.0.0",esbuild:"^0.28.1",eslint:"^10.5.0",typescript:"^6.0.3","typescript-eslint":"^8.62.0",vitest:"^4.1.9"}};var Ut=np.version;var Xb="https://api.dodopayments.com",zb=1440*60*1e3,Yb=14;async function ii(e){let t=f(e.home).home,r=e.now??new Date,o=await Cn(t),n=await di(e,"/licenses/activate",{license_key:e.key,name:o});if(!n.ok)return await De(t,"license_activate_failed",e.key,n.reason,"error"),{ok:!1,reason:n.reason,license:{...de,instance_id:o}};let s=await mo(t,{state:"licensed",license_key:e.key,instance_id:o,license_key_instance_id:n.license_key_instance_id,purchased_at:n.purchased_at??r.toISOString(),version_at_activation:Ut,updates_until:nv(n.purchased_at??r.toISOString(),365),last_checked_at:r.toISOString(),source:"dodo"});return await De(t,"license_activated",e.key,null,"ok"),{ok:!0,license:Vt(s)}}async function li(e){let t=f(e.home).home,r=e.now??new Date,o=await Ee(t),n=e.key??o?.license_key,s=o?.instance_id??null;if(!n)return await De(t,"license_validate_missing",null,"INVALID_KEY","blocked"),{ok:!1,reason:"INVALID_KEY",license:o?Vt(o):de};if(o?.state==="licensed"&&Qb(o.last_checked_at,r))return await De(t,"license_validate_cache_hit",n,null,"ok"),{ok:!0,license:Vt(o)};let a=await di(e,"/licenses/validate",{license_key:n});if(a.ok){let i=await mo(t,{state:"licensed",license_key:n,instance_id:s??await Cn(t),license_key_instance_id:o?.license_key_instance_id??null,purchased_at:o?.purchased_at??null,version_at_activation:o?.version_at_activation??null,updates_until:o?.updates_until??null,last_checked_at:r.toISOString(),source:"dodo"});return await De(t,"license_validated",n,null,"ok"),{ok:!0,license:Vt(i)}}return a.reason==="NETWORK"&&o?.state==="licensed"&&Zb(o.last_checked_at,r,e.graceDays)?(await De(t,"license_validate_grace_served",n,"NETWORK","ok"),{ok:!0,license:Vt(o)}):(await De(t,"license_validate_failed",n,a.reason,"blocked"),{ok:!1,reason:a.reason,license:{...de,instance_id:s}})}async function ci(e){let t=f(e.home).home,r=await Ee(t),o=e.key??r?.license_key,n=e.licenseKeyInstanceId??r?.license_key_instance_id;if(!o||!n)return await De(t,"license_deactivate_missing",o??null,"INVALID_KEY","blocked"),{ok:!1,reason:"INVALID_KEY",license:r?Vt(r):de};let s=await di(e,"/licenses/deactivate",{license_key:o,license_key_instance_id:n});return s.ok?(await ai(t),await De(t,"license_deactivated",o,null,"ok"),{ok:!0,license:de}):(await De(t,"license_deactivate_failed",o,s.reason,"error"),{ok:!1,reason:s.reason,license:r?Vt(r):de})}function Vt(e){return{state:e.state,license_key:e.license_key,instance_id:e.instance_id,purchased_at:e.purchased_at??null,version_at_activation:e.version_at_activation??null,updates_until:e.updates_until,last_checked_at:e.last_checked_at,source:e.source}}function Qb(e,t){return e?t.getTime()-new Date(e).getTime()<zb:!1}function Zb(e,t,r=Yb){return e?t.getTime()-new Date(e).getTime()<=r*24*60*60*1e3:!1}async function di(e,t,r){let o=e.fetch??globalThis.fetch;try{let n=await o(new URL(t,ev(e.endpointBaseUrl)).toString(),{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify(r)}),s=await tv(n);return n.ok?t==="/licenses/validate"&&s.valid!==!0?{ok:!1,reason:sp(s)}:{ok:!0,license_key_instance_id:rv(s),purchased_at:ov(s)}:{ok:!1,reason:sp(s)}}catch{return{ok:!1,reason:"NETWORK"}}}function ev(e=process.env.NATIVESOUL_DODO_LICENSE_API_BASE_URL??Xb){return e.endsWith("/")?e:`${e}/`}async function tv(e){try{let t=await e.json();return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}}function rv(e){let r=[e.license_key_instance_id,e.licenseKeyInstanceId,e.id,go(e.data)?e.data.license_key_instance_id:null,go(e.data)?e.data.id:null].find(o=>typeof o=="string"&&o.length>0);return typeof r=="string"?r:null}function ov(e){let t=go(e.data)?e.data:{},r=go(e.license_key)?e.license_key:go(t.license_key)?t.license_key:{},n=[e.purchased_at,e.purchase_date,e.created_at,t.purchased_at,t.purchase_date,t.created_at,r.purchased_at,r.purchase_date,r.created_at].find(s=>typeof s=="string"&&!Number.isNaN(Date.parse(s)));return typeof n=="string"?new Date(n).toISOString():null}function nv(e,t){let r=Date.parse(e);return Number.isNaN(r)?null:new Date(r+t*24*60*60*1e3).toISOString()}function sp(e){let t=String(e.reason??e.code??e.error??"").toUpperCase();return t.includes("LIMIT")?"ACTIVATION_LIMIT":t.includes("ACTIVE")?"NOT_ACTIVE":"INVALID_KEY"}function go(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}async function De(e,t,r,o,n){await h({home:e,type:t,result:n,details:{provider:"dodo",license_key_ref:r?sv(r):null,reason:o}})}function sv(e){return e.length<=8?"[REDACTED_LICENSE_KEY]":`${e.slice(0,4)}\u2026${e.slice(-4)}`}var fo="https://native-soul.mintlify.site/account/licensing";async function ir(e){let t=av(e),r=f(t.home).home;try{let o=await Ee(r),n=await li(t);if(n.ok)return{ok:!0,license:n.license};let s=n.reason==="NETWORK"&&o?.state==="licensed"?"GRACE_EXPIRED":"UNLICENSED",a=t.activateUrl??fo;return{ok:!1,reason:s,activate_url:a,message:ho({reason:s,activate_url:a}),license:n.license}}catch{let o=t.activateUrl??fo;return{ok:!1,reason:"UNLICENSED",activate_url:o,message:ho({reason:"UNLICENSED",activate_url:o}),license:de}}}function ho(e){return`${e.reason==="GRACE_EXPIRED"?"License offline grace expired.":"NativeSoul is not activated."} NativeSoul is paid-only. Run \`nativesoul license activate <key>\` after purchase: ${e.activate_url}`}function av(e){return typeof e=="string"?{home:e}:e??{}}import{readdir as iv,readFile as ap,stat as lv}from"node:fs/promises";import ui from"node:path";var cv=["open source","open-source","source-available","read the source","free to install","never phones home","zero network","uncrackable","piracy-proof"];async function pi(e={}){let t=e.registryPath??ui.join(process.cwd(),"docs","architecture","feature-registry.yaml"),r=e.marketingDir??ui.join(process.cwd(),"docs","marketing"),o=dv(await ap(t,"utf8")),n=e.page?[e.page]:await lp(r),s=[],a=[];for(let i of n){let l=await ap(i,"utf8"),c=yo(l);for(let d of cv)c.includes(yo(d))&&s.push({code:"GLOBAL_FORBIDDEN_PHRASE",page:i,phrase:d,message:`Global forbidden phrase found: ${d}`});for(let d of o.values())for(let p of d.claim_forbidden)p&&c.includes(yo(p))&&s.push({code:"FEATURE_FORBIDDEN_PHRASE",page:i,feature_id:d.id,phrase:p,message:`Forbidden phrase for ${d.id}: ${p}`});for(let d of uv(l)){let p=o.get(d.id);if(!p){s.push({code:"UNKNOWN_CLAIM_ID",page:i,feature_id:d.id,message:`Tagged claim references unknown feature id: ${d.id}`}),a.push({id:d.id,status:"unknown",page:i,text:d.text,result:"fail",reason:"unknown feature id"});continue}let g=pv(p,i,d.text);a.push(g),g.result==="fail"&&s.push(mv(g))}}return{ok:s.length===0,status:s.length===0?"pass":"fail",registry_path:t,pages:n,claims:a,issues:s,summary:{pages_scanned:n.length,claims_checked:a.length,issues:s.length}}}function dv(e){let t=new Map,r=null;for(let o of e.split(/\r?\n/u)){let n=o.match(/^\s*-\s+id:\s*(.+)\s*$/u);if(n){r?.id&&t.set(r.id,ip(r)),r={id:lr(n[1]??""),name:"",claim_forbidden:[],evidence:null,claim_allowed:null};continue}if(!r)continue;let s=o.match(/^\s+([a-z_]+):\s*(.*)\s*$/u);if(!s)continue;let a=s[1]??"",i=s[2]??"";a==="status"?r.status=lr(i).split(/\s+/u)[0]:a==="name"?r.name=lr(i):a==="evidence"?r.evidence=lr(i):a==="claim_allowed"?r.claim_allowed=i.trim()==="null"?null:lr(i):a==="claim_forbidden"&&(r.claim_forbidden=gv(i))}return r?.id&&t.set(r.id,ip(r)),t}function ip(e){return{id:e.id??"",name:e.name??e.id??"",status:e.status??"absent",evidence:e.evidence??null,claim_allowed:e.claim_allowed??null,claim_forbidden:e.claim_forbidden??[]}}async function lp(e){try{if(!(await lv(e)).isDirectory())return[]}catch{return[]}let t=await iv(e,{withFileTypes:!0});return(await Promise.all(t.map(async o=>{let n=ui.join(e,o.name);return o.isDirectory()?await lp(n):o.isFile()&&/\.(md|mdx|txt)$/iu.test(o.name)?[n]:[]}))).flat().sort()}function uv(e){let t=[],r=/<!--\s*claim:([a-z0-9_-]+)\s*-->([\s\S]*?)<!--\s*\/claim\s*-->/giu,o=/\[claim:([a-z0-9_+-]+)\]([\s\S]*?)\[\/claim\]/giu;for(let n of e.matchAll(r))t.push({id:n[1]??"",text:(n[2]??"").trim()});for(let n of e.matchAll(o))t.push({id:n[1]??"",text:(n[2]??"").trim()});return t}function pv(e,t,r){return e.status==="absent"||e.status==="roadmap"||e.status==="roadmap-teams"?{id:e.id,status:e.status,page:t,text:r,result:"fail",reason:`${e.status} feature cannot be claimed as live`}:e.status==="partial"&&e.claim_allowed&&!yo(r).includes(yo(e.claim_allowed))?{id:e.id,status:e.status,page:t,text:r,result:"fail",reason:"partial feature claim exceeds allowed wording"}:{id:e.id,status:e.status,page:t,text:r,result:"pass",reason:"claim within registry bounds"}}function mv(e){return{code:e.status==="partial"?"PARTIAL_CLAIM_OUT_OF_BOUNDS":"UNBUILT_FEATURE_CLAIM",page:e.page,feature_id:e.id,message:e.reason}}function gv(e){let t=e.trim().replace(/\s+#.*$/u,"");if(t==="[]")return[];if(!t.startsWith("[")||!t.endsWith("]"))return[];let r=t.slice(1,-1).trim();return r?r.split(/,\s*/u).map(lr).filter(Boolean):[]}function lr(e){let t=e.trim().replace(/\s+#.*$/u,"");return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function yo(e){return e.toLowerCase().replace(/[’']/gu,"'").replace(/\s+/gu," ").trim()}async function mi(e){let t=await Ee(e.home),r=t?.state==="licensed",o=r?fv(t.updates_until,e.now??new Date):"unknown",n=r?hv(e.latestKnownVersion,t.version_at_activation??null):"unknown",s=e.upgradeUrl??fo,a=o==="lapsed"&&n===!0,i=a?`You're on v${t?.version_at_activation??e.currentVersion}. v${e.latestKnownVersion} is available. Your licence keeps working \u2014 upgrade for the new major: ${s}.`:null;return{licensed:r,updates_status:o,newer_major_available:n,upgrade_url:s,purchased_at:t?.purchased_at??null,updates_until:t?.updates_until??null,version_at_activation:t?.version_at_activation??null,current_version:e.currentVersion,latest_known_version:e.latestKnownVersion??null,soft_nudge:{visible:a,dismissible:!0,message:i}}}function fv(e,t){if(!e)return"unknown";let r=Date.parse(e);return Number.isNaN(r)?"unknown":t.getTime()<=r?"active":"lapsed"}function hv(e,t){if(!e||!t)return"unknown";let r=cp(e),o=cp(t);return r===null||o===null?"unknown":r>o}function cp(e){let t=e.trim().match(/^v?(\d+)(?:\.|$)/u);return t?.[1]?Number.parseInt(t[1],10):null}import{copyFile as yv,mkdir as up,readFile as _v,rename as bv,stat as vv,writeFile as kv}from"node:fs/promises";import{existsSync as pp}from"node:fs";import Bt from"node:path";var dp=8;function Nn(e){let t=e.generatedAt??new Date().toISOString(),r=e.degraded===!0,o=[...e.payload.warnings,...e.warnings??[]],n=e.payload.capabilities.slice(0,dp),s=e.payload.capability_cards.slice(0,dp),a=["---","nativesoul: bootstrap-context",`bootstrap_schema: ${e.payload.bootstrap_schema}`,`host: ${e.host}`,`generated_at: ${t}`,`degraded: ${r?"true":"false"}`,`tokens_used: ${e.payload.context_budget.tokens_used}`,`tokens_max: ${e.payload.context_budget.tokens_max}`,o.length>0?`warnings: ${o.join(", ")}`:"warnings: none","---","",`You are ${e.payload.identity.name}; follow soul_summary and agents_operating_summary.`,`Global entity: ${e.payload.identity.name}. Project rules apply for code boundaries; persona remains ${e.payload.identity.name}.`,"","## Identity",`- Name: ${e.payload.identity.name}`,`- Mission: ${e.payload.identity.mission}`,e.payload.identity.role?`- Role: ${e.payload.identity.role}`:null,e.payload.identity.vibe?`- Vibe: ${e.payload.identity.vibe}`:null,"","## Soul Summary",e.payload.soul_summary,"","## Operating Summary",e.payload.agents_operating_summary,"","## User Preferences",e.payload.user.preferences_summary,"","## Project",`- ID: ${e.payload.project.id}`,`- CWD: ${e.payload.project.cwd}`,"","## Tool Hints",...e.payload.tool_hints.map(i=>`- ${i.tool}: ${i.use_when}`),"","## Relevant Memories",...e.payload.relevant_memories.length>0?e.payload.relevant_memories.map(i=>`- ${i.id}: ${i.summary}`):["- none"],"","## Commitments",...e.payload.commitments.length>0?e.payload.commitments.map(i=>`- ${JSON.stringify(i)}`):["- none"],"","## Capabilities",...n.length>0?n.map(i=>`- ${i.uid} (${i.host}, ready=${i.ready}): ${i.source}`):["- none"],"","## Capability Cards",...s.length>0?s.map(i=>`- ${i.uid} (${i.host}, ready=${i.ready}): ${i.use_when[0]??i.source}`):["- none"],""].filter(i=>i!==null).join(`
888
+ `);return{host:e.host,generated_at:t,degraded:r,warnings:o,tokens_used:hi(a),tokens_max:e.payload.context_budget.tokens_max,content:a}}async function On(e){let t=f(e.home),r=Nn({host:e.host,payload:e.payload}),o=fi(t.home,e.host),n=pp(o)&&e.apply!==!1?await Rv(t.home,e.host,o):null;if(e.apply!==!1){await up(Bt.dirname(o),{recursive:!0,mode:448});let a=Bt.join(Bt.dirname(o),`.last-context-${T("tmp")}.tmp`);await kv(a,r.content,{encoding:"utf8",mode:384}),await bv(a,o)}let s={...r,targetPath:o,backupPath:n,applied:e.apply!==!1};return e.recordTelemetry!==!1&&await h({home:t.home,type:e.apply===!1?"bootstrap_context_cache_dry_run":"bootstrap_context_cache_written",details:{...s,content:"[omitted]"}}),e.apply!==!1&&e.recordTelemetry!==!1&&await Me({home:t.home,host:e.host,outcome:"succeeded",tier:"A",cwd:e.payload.project.cwd,project:e.payload.project.id,tokensUsed:r.tokens_used,tokensMax:r.tokens_max,source:"bootstrap-inject",warnings:r.warnings}),s}async function cr(e){let t=f(e.home),r=fi(t.home,e.host);if(!pp(r))return wv({home:t.home,host:e.host,targetPath:r,recordTelemetry:e.recordTelemetry});let o=await _v(r,"utf8"),n=await vv(r),s=e.ttlDays??7,a=Date.now()-n.mtimeMs>s*24*60*60*1e3,i=new Date().toISOString(),l=a?["BOOTSTRAP_CACHE_STALE"]:[],c=["---","nativesoul: bootstrap-context-cache",`host: ${e.host}`,`generated_at: ${i}`,"degraded: true",l.length>0?`warnings: ${l.join(", ")}`:"warnings: none","---","",o].join(`
889
+ `),d={host:e.host,generated_at:i,degraded:!0,warnings:l,tokens_used:hi(c),tokens_max:1900,content:c,targetPath:r,stale:a};if(e.recordTelemetry!==!1){await h({home:t.home,type:"bootstrap_context_cache_read",details:{...d,content:"[omitted]"}});let p=Sv(o);await Me({home:t.home,host:e.host,outcome:"degraded",tier:"D",cwd:p.cwd,project:p.project,tokensUsed:d.tokens_used,tokensMax:d.tokens_max,source:"bootstrap-cache",warnings:l})}return d}async function gi(e){let t=await cr({home:e.home,host:e.host,ttlDays:e.ttlDays,recordTelemetry:e.recordTelemetry});if(!t.warnings.includes("BOOTSTRAP_CACHE_MISSING")||!e.projectCwd)return t;let r=await cr({home:_o(e.projectCwd),host:e.host,ttlDays:e.ttlDays,recordTelemetry:!1});return r.warnings.includes("BOOTSTRAP_CACHE_MISSING")?t:r}function fi(e,t){return Bt.join(e,"generated",t,"last-context.md")}function _o(e){return Bt.join(e,".nativesoul-cache")}async function wv(e){let t=new Date().toISOString(),r=["BOOTSTRAP_CACHE_MISSING"],o=["---","nativesoul: bootstrap-context-cache",`host: ${e.host}`,`generated_at: ${t}`,"degraded: true",`warnings: ${r.join(", ")}`,"---","","Bootstrap context cache is not available. Run `nativesoul bootstrap --format inject` after install."].join(`
890
+ `),n={host:e.host,generated_at:t,degraded:!0,warnings:r,tokens_used:hi(o),tokens_max:1900,content:o,targetPath:e.targetPath,stale:!1};return e.recordTelemetry!==!1&&(await h({home:e.home,type:"bootstrap_context_cache_missing",details:{...n,content:"[omitted]"}}),await Me({home:e.home,host:e.host,outcome:"degraded",tier:"D",cwd:null,project:null,tokensUsed:n.tokens_used,tokensMax:n.tokens_max,source:"bootstrap-cache",warnings:r})),n}async function Rv(e,t,r){let o=Bt.join(e,"backups","bootstrap-context");await up(o,{recursive:!0,mode:448});let n=Bt.join(o,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-${t}-last-context.md`);return await yv(r,n),n}function hi(e){return Math.ceil(e.length/4)}function Sv(e){let t=e.match(/^- CWD:\s*(.+)$/mu)?.[1]?.trim()??null,r=e.match(/^- ID:\s*(.+)$/mu)?.[1]?.trim()??null;return{cwd:t,project:r}}function dr(e){return Xa(e)?"full native capability":e.ready?"ready":e.healthy&&e.allowed?"official-fallback":"degraded"}function yi(e){let t=dr(e);return t==="full native capability"?"cyan":t==="ready"?"green":t==="official-fallback"?"amber":"red"}var gp={inbox:["assigned","in_progress"],assigned:["in_progress"],in_progress:["review","blocked","done","failed"],review:["in_progress","done","failed"],blocked:["in_progress","failed"],done:[],failed:[]};async function bo(e){let t=await v(e.home),r=new Date().toISOString(),o=O(e.title).value,n=e.description===void 0||e.description===null?null:O(e.description).value,s={id:T("work"),project_id:e.project,title:o,description:n,status:"inbox",priority:e.priority??"normal",assigned_host:e.host??null,source:e.source??"cli",tags:H(e.tags??[]),metadata:H(e.metadata??{}),created_at:r,updated_at:r,claimed_at:null,completed_at:null},a=fp({workItem:s,type:"created",fromStatus:null,toStatus:"inbox",actor:e.host??"cli",details:{priority:s.priority,source:s.source},now:r}),i=_(t.database),l;try{l=i.insertWorkItem(s),i.insertWorkItemEvent(a)}finally{i.close()}return await hp(t.home,"work_item_created",l,{redacted:o!==e.title||e.description!==void 0&&e.description!==null&&n!==e.description,event_id:a.id}),l}async function vo(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await R(t.database))return[];let r=_(t.database,{readOnly:e.readOnly}),o;try{o=r.listWorkItems({project:e.project,status:e.status,priority:e.priority,assignedHost:e.assignedHost,limit:Ev(e.limit)})}finally{r.close()}return e.readOnly||await h({home:t.home,type:"work_items_listed",details:{project:e.project??null,status:e.status??null,priority:e.priority??null,assigned_host:e.assignedHost??null,count:o.length}}),o}async function ko(e){return _i({home:e.home,id:e.id,actor:e.host,eventType:"claimed",auditType:"work_item_claimed",mutate:(t,r)=>{if(bi(t.status))throw new Error(`Work item already terminal: ${t.id} (${t.status})`);return Mn(t.status,"in_progress"),{status:"in_progress",assignedHost:e.host,claimedAt:t.claimed_at??r,updatedAt:r,details:{assigned_host:e.host}}}})}async function wo(e){return _i({home:e.home,id:e.id,actor:e.assignedHost??"cli",eventType:e.status?"status_changed":"updated",auditType:"work_item_updated",mutate:(t,r)=>{let o=e.status??t.status;e.status&&Mn(t.status,e.status);let n=e.description===void 0||e.description===null?e.description:O(e.description).value;return{status:o,priority:e.priority,assignedHost:e.assignedHost,description:n,tags:e.tags===void 0?void 0:H(e.tags),metadata:e.metadata===void 0?void 0:xv(t.metadata,H(e.metadata)),completedAt:bi(o)?r:void 0,updatedAt:r,details:{priority:e.priority??null,assigned_host:e.assignedHost??null,fields:Av(e),redacted:e.description!==void 0&&e.description!==null&&n!==e.description}}}})}async function Ro(e){let t=e.status??"done";return _i({home:e.home,id:e.id,actor:"cli",eventType:"completed",auditType:"work_item_completed",mutate:(r,o)=>{if(bi(r.status))throw new Error(`Work item already terminal: ${r.id} (${r.status})`);return Mn(r.status,t),{status:t,completedAt:o,updatedAt:o,details:{terminal_status:t}}}})}function Mn(e,t){if(e!==t&&!gp[e].includes(t))throw new Error(`Illegal work item transition: ${e} -> ${t}`)}async function _i(e){let t=await v(e.home),r=_(t.database),o,n;try{let s=r.getWorkItem(e.id);if(!s)throw new Error(`Work item not found: ${e.id}`);let a=new Date().toISOString(),i=e.mutate(s,a);n=fp({workItem:s,type:e.eventType,fromStatus:s.status,toStatus:i.status??s.status,actor:e.actor,details:i.details,now:a}),o=r.updateWorkItem({id:s.id,status:i.status,priority:i.priority,assignedHost:i.assignedHost,description:i.description,tags:i.tags,metadata:i.metadata,claimedAt:i.claimedAt,completedAt:i.completedAt,updatedAt:i.updatedAt,event:n})}finally{r.close()}if(!o)throw new Error(`Work item not found: ${e.id}`);return await hp(t.home,e.auditType,o,{event_id:n.id,event_type:n.type,from_status:n.from_status,to_status:n.to_status,details:n.details}),o}function fp(e){return{id:T("work_evt"),work_item_id:e.workItem.id,project_id:e.workItem.project_id,type:e.type,from_status:e.fromStatus,to_status:e.toStatus,actor:e.actor,details:e.details,created_at:e.now}}async function hp(e,t,r,o){await h({home:e,type:t,details:{id:r.id,project:r.project_id,status:r.status,...Pv(o)}})}function Av(e){return[e.status===void 0?null:"status",e.priority===void 0?null:"priority",e.assignedHost===void 0?null:"assigned_host",e.description===void 0?null:"description",e.tags===void 0?null:"tags",e.metadata===void 0?null:"metadata"].filter(t=>t!==null)}function bi(e){return e==="done"||e==="failed"}function Ev(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),200)}function Pv(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{value:e}}function xv(e,t){return mp(e)&&mp(t)?{...e,...t}:t}function mp(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}import{readdir as uk,readFile as pk}from"node:fs/promises";import Tp from"node:path";import{existsSync as jv}from"node:fs";var Iv=50;function So(e={}){let t=$v(e.limit),r=Mv(e),o=e.groupBy??"host",n=new Date().toISOString();if(e.db)return yp(e.db,e,r,o,t,n);let s=f(e.home);if(!jv(s.database))return Hv(e,r,o,t,n);let a=_(s.database,{readOnly:!0});try{return yp(a,e,r,o,t,n)}finally{a.close()}}function yp(e,t,r,o,n,s){let a=e.listRunCostRows({project:t.project,host:t.host,since:r.since??void 0,until:r.until??void 0}),i=Ln(a,g=>({key:g.project_id,label:g.project_id})),l=Ln(a,g=>({key:g.host,label:g.host})),c=Ln(a,g=>{let y=Nv(g);return{key:y,label:y==="unattributed"?"unattributed":y}}),d=Ln(a,g=>{let y=g.completed_at?.slice(0,10)??"unknown";return{key:y,label:y}}),p=a.map(g=>vp(g.id,g.id,[g]));return{schema_version:1,generated_at:s,filters:{project:t.project??null,host:t.host??null,since:r.since,until:r.until,group_by:o,limit:n},totals:kp(a),groups:Cv(o,{byProject:i,byHost:l,bySession:c,byDay:d,byRun:p}).slice(0,n),by_project:i.slice(0,n),by_host:l.slice(0,n),by_session:c.slice(0,n),by_day:d.slice(0,n),by_run:p.slice(0,n)}}function Ln(e,t){let r=new Map;for(let o of e){let n=t(o),s=r.get(n.key)??{label:n.label,rows:[]};s.rows.push(o),r.set(n.key,s)}return Array.from(r.entries()).map(([o,n])=>vp(o,n.label,n.rows))}function vp(e,t,r){return{key:e,label:t,...kp(r)}}function kp(e){let t=0,r=0,o=0,n=0,s=0;for(let a of e){let i=wr(a.cost_json);Tv(i)&&(t+=1),"tokens_in"in i&&typeof i.tokens_in=="number"&&(o+=i.tokens_in),"tokens_out"in i&&typeof i.tokens_out=="number"&&(n+=i.tokens_out),"cost_usd"in i&&typeof i.cost_usd=="number"&&(r+=1,s+=i.cost_usd)}return{total_runs:e.length,reported_runs:t,cost_reported_runs:r,not_reported_runs:e.length-t,tokens_in:o,tokens_out:n,total_usd:Fv(s),coverage:e.length===0?0:t/e.length}}function Tv(e){return"source"in e&&e.source==="host-reported"}function Cv(e,t){switch(e){case"project":return t.byProject;case"host":return t.byHost;case"day":return t.byDay;case"session":return t.bySession;case"total":return[]}}function Nv(e){return Ov(e.evidence_json)??e.session_id??"unattributed"}function Ov(e){let t;try{t=JSON.parse(e)}catch{return null}return _p(t,"session_id")??_p(t,"session")}function _p(e,t){if(!e||typeof e!="object"||Array.isArray(e))return null;let r=e[t];return typeof r=="string"&&r.length>0?r:null}function Mv(e){return{since:e.since?Lv(e.since):null,until:e.until?wp(e.until,"until"):null}}function Lv(e){let t=Dv(e);return t!==null?new Date(Date.now()-t).toISOString():wp(e,"since")}function wp(e,t){let r=Date.parse(e);if(!Number.isFinite(r))throw new Error(`cost --${t} must be an ISO timestamp or duration`);return new Date(r).toISOString()}function Dv(e){let t=e.match(/^(\d+)(s|m|h|d|w)$/u);if(t?.[1]&&t[2])return bp(Number(t[1]),t[2]);let r=e.match(/^(\d+)\s+(second|seconds|minute|minutes|hour|hours|day|days|week|weeks)$/u);return r?.[1]&&r[2]?bp(Number(r[1]),r[2]):null}function bp(e,t){return e*({s:1e3,second:1e3,seconds:1e3,m:6e4,minute:6e4,minutes:6e4,h:36e5,hour:36e5,hours:36e5,d:864e5,day:864e5,days:864e5,w:6048e5,week:6048e5,weeks:6048e5}[t]??0)}function Hv(e,t,r,o,n){let s={total_runs:0,reported_runs:0,cost_reported_runs:0,not_reported_runs:0,tokens_in:0,tokens_out:0,total_usd:0,coverage:0};return{schema_version:1,generated_at:n,filters:{project:e.project??null,host:e.host??null,since:t.since,until:t.until,group_by:r,limit:o},totals:s,groups:[],by_project:[],by_host:[],by_session:[],by_day:[],by_run:[]}}function $v(e){return e===void 0||!Number.isFinite(e)?Iv:Math.max(1,Math.min(Math.trunc(e),500))}function Fv(e){return Math.round(e*1e8)/1e8}import{mkdir as Wv,readdir as Jv,readFile as qv,writeFile as Kv}from"node:fs/promises";import Wt from"node:path";function Rp(e){let t=vi(e)?e:{},r=vi(t.tool_input)?t.tool_input:vi(t.input)?t.input:{},o=X(t.tool_name)??X(t.tool)??X(t.name)??"unknown_tool",n=X(t.action)??X(r.action)??o,s=X(t.target)??X(r.target)??X(r.file_path)??X(r.path)??X(r.url)??X(r.command),a=X(r.command)??X(t.command);return{action:n,className:Uv(o,[s,a].filter(Boolean).join(" ")),target:s,project:X(t.project)??X(t.project_id)??X(r.project)??X(r.project_id)}}function Uv(e,t){let r=`${e} ${t??""}`.toLowerCase();return/\b(bash|shell|sh|zsh|exec_command)\b/u.test(e.toLowerCase())?Vv(t??""):/\b(rm\s+-[^\s]*[rf][^\s]*|delete|reset\s+--hard|destroy|purge|drop)\b/u.test(r)?"destructive":/(slack|gmail|outlook|github|gh\s+pr|gh\s+issue|git\s+push|vercel\s+deploy|deploy|publish|send|post|comment|merge|api|curl\s+.*(-x|--request|-d|--data|--data-raw|--form)\s*(post|put|patch|delete)?)/u.test(r)?"external_write":/(write|edit|patch|apply|create|move|rename|git\s+commit)/u.test(r)?"write_project":/(curl|fetch|browser|http|web)/u.test(r)?"probe_external":"read_local"}function Vv(e){let t=e.toLowerCase();return/\b(rm\s+-[^\s]*[rf][^\s]*|delete|reset\s+--hard|destroy|purge|drop)\b/u.test(t)?"destructive":/(curl\s+.*(-x|--request|-d|--data|--data-raw|--form)\s*(post|put|patch|delete)?|gh\s+(pr|issue|release)|git\s+push|vercel\s+deploy|npm\s+publish|pnpm\s+publish|deploy|publish)/u.test(t)?"external_write":/(^|\s)(touch|mkdir|mv|cp|tee|chmod|chown|git\s+commit)\b|(^|[^>])>[^>]|>>/u.test(t)?"write_project":/^(pwd|ls|cat|head|tail|rg|grep|sed\s+-n|find\s+.*-print|git\s+(status|diff|log|show))(\s|$)/u.test(t.trim())?"read_local":/(curl|fetch|http|https?:\/\/)/u.test(t)?"probe_external":"write_project"}function vi(e){return!!e&&!Array.isArray(e)&&typeof e=="object"}function X(e){return typeof e=="string"&&e.trim().length>0?e.trim():void 0}var Gv=new Set(["SOUL.MD","POLICY.MD"]),Xv=5e3,Sp=new Map;async function ut(e){let t=f(e),r=Sp.get(t.home);if(r&&r.expiresAt>Date.now())return r.orders;let o=Wt.join(t.home,"standing-orders"),n;try{n=await Jv(o)}catch{return[]}let s=[];for(let a of n.filter(i=>i.endsWith(".yaml")||i.endsWith(".yml")).sort()){let i=Wt.join(o,a),l=await qv(i,"utf8");s.push(zv(l,i))}return Sp.set(t.home,{expiresAt:Date.now()+Xv,orders:s}),s}async function pt(e){let t=await ut(e.home),r=e.target??null,o=r?Ap(r):null,n=t.filter(i=>Ri(i,e)),s=n.find(i=>i.allowed.includes(e.action)),a=n.find(i=>i.approval_required.includes(e.action));if(o&&Gv.has(o))return dt(e,"proposal_required",["PROTECTED_HUMAN_FILE"],null);if(e.className==="identity_policy_change")return dt(e,"proposal_required",["IDENTITY_POLICY_CHANGE"],null);if(e.className==="destructive")return dt(e,"denied",["DESTRUCTIVE_DENIED_BY_DEFAULT"],s?.id??a?.id??null);if(a)return dt(e,"approval_required",["STANDING_ORDER_REQUIRES_APPROVAL"],a.id);if(s)return dt(e,"allowed",["STANDING_ORDER_ALLOWED"],s.id);switch(e.className){case"read_local":case"probe_external":case"write_local":return dt(e,"allowed",["DEFAULT_ALLOWED"],null);case"write_project":return dt(e,"approval_required",["PROJECT_WRITE_REQUIRES_APPROVAL"],null);case"external_write":return dt(e,"approval_required",["EXTERNAL_WRITE_REQUIRES_APPROVAL"],null)}}async function ki(e){let t=Rp(e.payload),r=await pt({home:e.home,action:t.action,className:t.className,target:t.target,project:t.project,host:e.host}),o=r.decision==="allowed",n={hook_event_name:"PreToolUse",host:e.host,allowed:o,blocked:!o,message:o?"NativeSoul policy allowed this tool use.":`NativeSoul policy blocked ${r.action}: ${r.decision} (${r.reasons.join(", ")}).`,evaluation:r};if(!o){let s=await v(e.home);await h({home:s.home,type:"policy_blocked",result:"blocked",details:{host:e.host,cwd:e.cwd??null,action:r.action,class:r.class,target:r.target,decision:r.decision,reasons:r.reasons,matched_standing_order:r.matched_standing_order}})}return n}async function wi(e){let t=await v(e.home),r=Yv(e.target);if(!r)throw new Error("policy propose-change target must be SOUL.md or POLICY.md");let o=O(e.summary).value,n=new Date().toISOString(),s=T("proposal"),a=Wt.join(t.home,"proposals",`${n.replaceAll(/[:.]/gu,"-")}-${r}.md`),i=["# Policy Change Proposal","",`ID: ${s}`,`Target: ${r}`,`Created At: ${n}`,"","## Summary","",o,""].join(`
891
+ `);return await Wv(Wt.dirname(a),{recursive:!0,mode:448}),await Kv(a,i,{encoding:"utf8",mode:384,flag:"wx"}),await h({home:t.home,type:"policy_change_proposed",details:{id:s,target:r,proposalPath:a,redacted:o!==e.summary}}),{id:s,target:r,summary:o,proposalPath:a,created_at:n}}function dt(e,t,r,o){return{action:e.action,class:e.className,target:e.target??null,decision:t,reasons:r,matched_standing_order:o}}function zv(e,t){return{id:Qv(e,"id")??Wt.basename(t,Wt.extname(t)),allowed:ur(e,"allowed"),approval_required:ur(e,"approval_required"),scope_projects:ur(e,"projects").concat(ur(e,"scope_projects")),scope_hosts:ur(e,"hosts").concat(ur(e,"scope_hosts")),source:t}}function Ri(e,t){return!(e.scope_projects.length>0&&(!t.project||!e.scope_projects.includes(t.project))||e.scope_hosts.length>0&&(!t.host||!e.scope_hosts.includes(t.host)))}function Ap(e){return Wt.basename(e.replaceAll("\\","/")).toUpperCase()}function Yv(e){let t=Ap(e);return t==="SOUL.MD"?"SOUL.md":t==="POLICY.MD"?"POLICY.md":null}function Qv(e,t){let r=new RegExp(`^\\s*${t}:\\s*([^\\n#]+)`,"mu");return e.match(r)?.[1]?.trim().replace(/^["']|["']$/gu,"")??null}function ur(e,t){let r=e.match(new RegExp(`^\\s*${t}:\\s*\\[([^\\]]*)\\]`,"mu"));if(r?.[1])return r[1].split(",").map(i=>i.trim().replace(/^["']|["']$/gu,"")).filter(Boolean);let o=e.split(/\r?\n/u),n=[],s=!1,a=0;for(let i of o){let l=i.trim();if(!s){let d=i.match(new RegExp(`^(\\s*)${t}:\\s*$`,"u"));d&&(s=!0,a=d[1]?.length??0);continue}let c=i.length-i.trimStart().length;if(l&&c<=a&&!l.startsWith("-"))break;l.startsWith("-")&&n.push(l.slice(1).trim().replace(/^["']|["']$/gu,""))}return n.filter(Boolean)}function ie(e,t,r){if(e==null)return!1;if(Array.isArray(e))return e.some(o=>ie(o,t,r));if(typeof e!="object")return!1;for(let[o,n]of Object.entries(e)){if(o===t){if(r===void 0)return!0;if(n===null)return r==="null";if(typeof n=="string"||typeof n=="number"||typeof n=="boolean")return String(n)===r;if(Array.isArray(n))return n.some(s=>String(s)===r)}if(ie(n,t,r))return!0}return!1}var Zv=/(?:sk-[A-Za-z0-9_-]{8,}|(?:api[_-]?key|token|secret|password)\s*[:=]\s*(?!\[REDACTED_SECRET\])[^"'\s]+)/iu;async function pr(e={}){let t=f(e.home),r=dk(e.limit);if(!await R(t.database))return ek(e,r,!1);let n=_(t.database,{readOnly:!0});try{let s=n.listEvents({limit:r}),a=n.listCapabilities({host:e.host,includeShared:!0,limit:r}),i=n.listSchedules({host:e.host,limit:r}),l=n.listHeartbeatLeases({project:e.project,limit:r}),c=n.listHeartbeatRuns({project:e.project,host:e.host,limit:r}),d=s.filter(y=>ck(y,e)),p=a.filter(y=>Ep(y.host,e.host)),g=i.filter(y=>Ep(y.host,e.host));return Ip({schema_version:1,generated_at:new Date().toISOString(),read_only:!0,external_telemetry_enabled:!1,initialized:!0,filters:jp(e,r),retention:xp(r),metrics:{activation:tk(d),bootstrap:rk(d),recall:ok(d),capability_readiness:nk(p),heartbeat:sk(l,c),no_op_suppression:ak(d),rollback:ik(d),secret_leakage_checks:Pp(d)},m7_gate:lk(d,p,g,c)})}finally{n.close()}}function ek(e,t,r){return Ip({schema_version:1,generated_at:new Date().toISOString(),read_only:!0,external_telemetry_enabled:!1,initialized:r,filters:jp(e,t),retention:xp(t),metrics:{activation:{workspace_initialized:0,onboarding_completed:0,install_applied:0},bootstrap:{succeeded:0,degraded:0,failed:0,cache_fallbacks:0},recall:{recalled:0,proposed:0,promoted:0},capability_readiness:{total:0,ready:0,full_native:0,official_fallback:0,degraded:0},heartbeat:{leases:0,completed_runs:0,silent_ok:0},no_op_suppression:{total:0,heartbeat_skipped:0,deduped:0,noop_actions:0},rollback:{total:0,policy_pack:0,mcp:0,managed_block:0},secret_leakage_checks:{checked:!0,leak_indicators:0,redaction_markers:0}},m7_gate:{recurring_use_validated:!1,feedback_validated:!1,privacy_validated:!0,notes:["NativeSoul database is not initialized; no local feedback evidence is available yet."]}})}function tk(e){return{workspace_initialized:ue(e,["workspace_initialized"]),onboarding_completed:ue(e,["onboarding_completed"]),install_applied:ue(e,["plugin_install","managed_block_applied","mcp_registration_installed"])}}function rk(e){return{succeeded:ue(e,["handshake_succeeded"]),degraded:ue(e,["handshake_degraded"]),failed:ue(e,["handshake_failed"]),cache_fallbacks:e.filter(t=>t.type.includes("bootstrap_context_cache")).length}}function ok(e){return{recalled:ue(e,["memory_recalled"]),proposed:ue(e,["memory_proposed"]),promoted:ue(e,["memory_promoted"])}}function nk(e){let t=e.map(dr);return{total:e.length,ready:t.filter(r=>r==="ready"||r==="full native capability").length,full_native:t.filter(r=>r==="full native capability").length,official_fallback:t.filter(r=>r==="official-fallback").length,degraded:t.filter(r=>r==="degraded").length}}function sk(e,t){return{leases:e.length,completed_runs:t.length,silent_ok:t.filter(r=>r.result==="HEARTBEAT_OK"||ie(r.result,"silent_ack","HEARTBEAT_OK")).length}}function ak(e){let t=ue(e,["heartbeat_skipped"]),r=e.filter(n=>n.type.includes("deduped")).length,o=e.filter(n=>ie(n.details,"action","noop")).length;return{total:t+r+o,heartbeat_skipped:t,deduped:r,noop_actions:o}}function ik(e){let t=ue(e,["policy_pack_rollback"]),r=ue(e,["mcp_registration_rollback"]),o=ue(e,["managed_block_rollback"]);return{total:e.filter(n=>n.type.includes("rollback")).length,policy_pack:t,mcp:r,managed_block:o}}function Pp(e){let t=JSON.stringify(e.map(r=>({type:r.type,result:r.result,details:r.details})));return{checked:!0,leak_indicators:Zv.test(t)?1:0,redaction_markers:(t.match(/\[REDACTED_/gu)??[]).length}}function lk(e,t,r,o){let n=o.length>0||r.some(l=>l.enabled),s=e.length>0&&t.length>0,a=Pp(e).leak_indicators===0;return{recurring_use_validated:n,feedback_validated:s,privacy_validated:a,notes:[n?"Recurring heartbeat/schedule evidence exists locally.":"No recurring heartbeat/schedule evidence yet.",s?"Feedback report has local audit and capability evidence.":"Feedback report needs audit and capability evidence.",a?"Report excludes raw prompts, memory bodies, and unredacted secret indicators.":"Potential secret indicators found in local audit details."]}}function ue(e,t){return e.filter(r=>t.includes(r.type)).length}function ck(e,t){let r=!t.host||!ie(e.details,"host")||ie(e.details,"host",t.host),o=!t.project||!ie(e.details,"project")||ie(e.details,"project",t.project);return r&&o}function Ep(e,t){return!t||e===t||e==="all"}function xp(e){return{source_event_limit:e,stores_raw_prompts:!1,stores_memory_content:!1,stores_raw_paths:!1}}function jp(e,t){return{project:e.project??null,host:e.host??null,limit:t}}function dk(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e??200),1),500):200}function Ip(e){return zt(H(e))}var mk=["candidate","active","superseded","rejected","forgotten","expired"],Si=["inbox","assigned","in_progress","review","blocked","done","failed"];async function Ao(e={}){let t=f(e.home),r=Ck(e.limit),o=jk(e);if(!await R(t.database))return Np(await gk(t.home,t.database,e,r));let s=_(t.database,{readOnly:!0});try{let a=s.listMemories({project:e.project,includeForgotten:!0,limit:Math.max(r*4,50)}),i=s.listCapabilities({host:e.host,includeShared:!0,limit:r}),l=s.listCommitments({project:e.project,includeExpired:!0,limit:Math.max(r*2,50),now:new Date().toISOString(),skipExpire:!0}),c=s.listSchedules({host:e.host,limit:r}),d=s.listHeartbeatLeases({project:e.project,limit:r}),p=s.listHeartbeatRuns({project:e.project,host:e.host,limit:r}),g=s.listEvents({limit:Math.max(r*4,50)}),y=Pk(await ut(t.home),e),k=await Sk(t.home),S=Ge(a,o,D=>D.created_at),U=Ge(l,o,D=>D.updated_at).slice(0,r),Q=Ge(i,o,D=>D.last_seen_at).slice(0,r),je=Ge(c,o,D=>D.updated_at).slice(0,r),be=Ge(d,o,D=>D.created_at).slice(0,r),pe=Ge(p,o,D=>D.completed_at).slice(0,r),Ie=Ge(g,o,D=>D.created_at).filter(D=>!e.host||Ik(D,{key:"host",value:e.host})).slice(0,r),x=Ie.filter(D=>D.type==="policy_blocked"),kr=Ie.filter(D=>Tk(D)).length,Qn=fk(s,e,o,r),V=yk(s,e,o,r,k,kr),wm=vk(s,e,r),Rm={schema_version:2,generated_at:new Date().toISOString(),filters:Lp(e,r),read_only:!0,home:t.home,database:t.database,initialized:!0,memories:{summary:xk(S),recent:S.filter(D=>D.status!=="candidate").slice(0,r),candidates:S.filter(D=>D.status==="candidate").slice(0,r)},commitments:U,capabilities:Q,schedules:je,heartbeat:{leases:be,runs:pe},audit:{events:Ie,policy_blocks:x},policy:{standing_orders:y,proposals:k,counts:{standing_orders:y.length,proposals:k.length,policy_blocks:x.length,approvals_required:kr}},work:Qn,approvals:V,cost:wm,feedback:await pr({home:t.home,project:e.project,host:e.host,limit:r})};return Np(Rm)}finally{s.close()}}async function gk(e,t,r,o){return{schema_version:2,generated_at:new Date().toISOString(),filters:Lp(r,o),read_only:!0,home:e,database:t,initialized:!1,memories:{summary:Mp(),recent:[],candidates:[]},commitments:[],capabilities:[],schedules:[],heartbeat:{leases:[],runs:[]},audit:{events:[],policy_blocks:[]},policy:{standing_orders:[],proposals:[],counts:{standing_orders:0,proposals:0,policy_blocks:0,approvals_required:0}},work:Op(),approvals:wk(),cost:Rk(),feedback:await pr({home:e,project:r.project,host:r.host,limit:o})}}function fk(e,t,r,o){let n=Ge(e.listWorkItems({project:t.project,assignedHost:t.host,limit:Math.max(o*Si.length,50)}),r,a=>a.updated_at).slice(0,Math.max(o*Si.length,50));if(n.length===0)return Op();let s=[];for(let a of Si){let i=n.filter(l=>l.status===a).slice(0,o).map(l=>hk(e,l));i.length>0&&s.push({status:a,count:i.length,items:i})}return{columns:s}}function hk(e,t){let r=e.listHeartbeatRunsByWorkItem({workItemId:t.id,project:t.project_id,limit:1})[0];return{id:t.id,title:t.title,summary:t.description??t.title,status:t.status,project:t.project_id,host:t.assigned_host,linked_run_id:kk(t.metadata,"run_id")??r?.id??null,priority:t.priority,updated_at:t.updated_at}}function yk(e,t,r,o,n,s){let a=e.listApprovals("pending").approvals.filter(l=>bk(l,t)).filter(l=>Ge([l],r,c=>c.created_at).length>0).slice(0,o).map(_k);if(a.length>0)return{pending:a,counts:{pending:a.length}};let i=n.slice(0,o).map(l=>({id:l.filename,action:l.summary??"Policy proposal pending review",class:"identity_policy_change",target:l.target,project:t.project??null,host:t.host??null,source:"policy_proposal",created_at:null}));return i.length===0&&s>0&&i.push({id:"policy-approval-required",action:"Policy event requires approval",class:"approval_required",target:null,project:t.project??null,host:t.host??null,source:"policy_event",created_at:null}),{pending:i,counts:{pending:i.length}}}function _k(e){return{id:e.id,action:e.action,class:e.class,target:e.target,project:e.project,host:e.host,source:"approvals",created_at:e.created_at}}function bk(e,t){return(!t.project||e.project===t.project)&&(!t.host||e.host===t.host)}function vk(e,t,r){let o=So({db:e,project:t.project,host:t.host,since:t.since,until:t.until,groupBy:"host",limit:r});return{totals:{runs:o.totals.total_runs,reported_runs:o.totals.reported_runs,cost_reported_runs:o.totals.cost_reported_runs,not_reported_runs:o.totals.not_reported_runs,tokens_in:o.totals.tokens_in,tokens_out:o.totals.tokens_out,total_usd:o.totals.total_usd,coverage:o.totals.coverage},by_project:o.by_project.map(Dn),by_host:o.by_host.map(Dn),by_session:o.by_session.map(Dn),by_run:o.by_run.map(Dn)}}function Dn(e){return{key:e.key,label:e.label,runs:e.total_runs,reported_runs:e.reported_runs,cost_reported_runs:e.cost_reported_runs,not_reported_runs:e.not_reported_runs,tokens_in:e.tokens_in,tokens_out:e.tokens_out,total_usd:e.total_usd,coverage:e.coverage}}function kk(e,t){if(!e||typeof e!="object"||Array.isArray(e))return null;let r=e[t];return typeof r=="string"&&r.length>0?r:null}function Op(){return{columns:[]}}function wk(){return{pending:[],counts:{pending:0}}}function Rk(){return{totals:{runs:0,reported_runs:0,cost_reported_runs:0,not_reported_runs:0,tokens_in:0,tokens_out:0,total_usd:0,coverage:0},by_project:[],by_host:[],by_session:[],by_run:[]}}async function Sk(e){let t=Tp.join(e,"proposals"),r;try{r=await uk(t)}catch{return[]}let o=[];for(let n of r.filter(s=>s.endsWith(".md")).sort()){let s=await pk(Tp.join(t,n),"utf8");o.push({filename:n,target:Ak(s,"Target"),summary:Ek(s,"Summary")})}return o}function Ak(e,t){return e.match(new RegExp(`^${t}:\\s*(.+)$`,"mu"))?.[1]?.trim()??null}function Ek(e,t){return e.match(new RegExp(`^## ${t}\\s*$\\n+([\\s\\S]*?)(?:\\n+## |$)`,"mu"))?.[1]?.trim()??null}function Pk(e,t){return e.filter(r=>{let o=!t.project||r.scope_projects.length===0||r.scope_projects.includes(t.project),n=!t.host||r.scope_hosts.length===0||r.scope_hosts.includes(t.host);return o&&n})}function xk(e){let t=Mp();for(let r of e)t[r.status]+=1;return t}function Mp(){return Object.fromEntries(mk.map(e=>[e,0]))}function Ge(e,t,r){return e.filter(o=>{let n=Date.parse(r(o));return!(!Number.isFinite(n)||t.since!==null&&n<t.since||t.until!==null&&n>t.until)})}function jk(e){return{since:Cp(e.since,"since"),until:Cp(e.until,"until")}}function Cp(e,t){if(!e)return null;let r=Date.parse(e);if(!Number.isFinite(r))throw new Error(`dashboard data --${t} must be an ISO date/time`);return r}function Ik(e,t){return ie(e.details,t.key,t.value)}function Tk(e){return ie(e.details,"decision","approval_required")||ie(e.details,"approval_required")||ie(e.details,"action","approval_required")}function Lp(e,t){return{project:e.project??null,host:e.host??null,limit:t,since:e.since??null,until:e.until??null}}function Ck(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e??50),1),200):50}function Np(e){return zt(H(e))}import{mkdir as Nk,writeFile as Ok}from"node:fs/promises";import Ai from"node:path";async function Pi(e={}){let t=await Ao(e),r=Ai.resolve(e.output??Ai.join(f(e.home).home,"generated","dashboard","index.html"));return await Nk(Ai.dirname(r),{recursive:!0,mode:448}),await Ok(r,Dp(t),{encoding:"utf8",mode:384}),{outputPath:r,generated_at:t.generated_at,read_only:!0,data:t}}function Dp(e){let t=Wk(e.capabilities),r=e.audit.policy_blocks.length,o=e.policy.counts.approvals_required,n=Mk(e),s=n?n.work.columns.reduce((a,i)=>a+i.items.length,0):0;return`<!doctype html>
886
892
  <html lang="en">
887
893
  <head>
888
894
  <meta charset="utf-8">
889
895
  <meta name="viewport" content="width=device-width, initial-scale=1">
890
896
  <title>NativeSoul Local Dashboard</title>
891
- <style>${Ck()}</style>
897
+ <style>${Kk()}</style>
892
898
  </head>
893
899
  <body>
894
900
  <main class="shell">
@@ -905,62 +911,62 @@ ${n.content}`)>=.35&&o!==Du(n.content)){let s=Hu(n.content);if([...r].some(l=>l.
905
911
  </header>
906
912
 
907
913
  <section class="summary-grid" aria-label="dashboard summary">
908
- ${ur("Active Memories",e.memories.summary.active,"green","promoted context ready for recall")}
909
- ${ur("Candidates",e.memories.summary.candidate,"amber","pending human review")}
910
- ${ur("Ready Capabilities",t.ready,"green",`${t.total} capability records`)}
911
- ${ur("Open Commitments",e.commitments.filter(s=>s.status==="open").length,"amber",`${e.commitments.length} commitment records`)}
912
- ${ur("Policy Blocks",r,r>0?"red":"neutral",`${o} approval markers`)}
913
- ${n&&a>0?ur("Open Work",a,"cyan","board items in scope"):""}
914
+ ${mr("Active Memories",e.memories.summary.active,"green","promoted context ready for recall")}
915
+ ${mr("Candidates",e.memories.summary.candidate,"amber","pending human review")}
916
+ ${mr("Ready Capabilities",t.ready,"green",`${t.total} capability records`)}
917
+ ${mr("Open Commitments",e.commitments.filter(a=>a.status==="open").length,"amber",`${e.commitments.length} commitment records`)}
918
+ ${mr("Policy Blocks",r,r>0?"red":"neutral",`${o} approval markers`)}
919
+ ${n&&s>0?mr("Open Work",s,"cyan","board items in scope"):""}
914
920
  </section>
915
921
 
916
922
  <section class="layout">
917
- ${n?kk(n):""}
918
- ${n?wk(n):""}
919
- ${n?Rk(n):""}
923
+ ${n?Lk(n):""}
924
+ ${n?Dk(n):""}
925
+ ${n?Hk(n):""}
920
926
 
921
- ${Ae("Memory Lifecycle",[Pk(e.memories.summary),De(e.memories.recent,s=>`
927
+ ${Pe("Memory Lifecycle",[Vk(e.memories.summary),He(e.memories.recent,a=>`
922
928
  <li>
923
- <div><strong>${w(s.summary)}</strong><small>${w(s.scope.project)} &middot; ${w(s.status)}</small></div>
924
- <span class="chip ${Ik(s.status)}">${w(s.authority)}</span>
925
- </li>`),Vt(e.memories.recent,"No active/recent memories in this scope.")].join(""))}
929
+ <div><strong>${w(a.summary)}</strong><small>${w(a.scope.project)} &middot; ${w(a.status)}</small></div>
930
+ <span class="chip ${Jk(a.status)}">${w(a.authority)}</span>
931
+ </li>`),Jt(e.memories.recent,"No active/recent memories in this scope.")].join(""))}
926
932
 
927
- ${Ae("Capability Readiness",[xk(),De(e.capabilities,s=>`
933
+ ${Pe("Capability Readiness",[Bk(),He(e.capabilities,a=>`
928
934
  <li>
929
- <div><strong>${w(s.uid)}</strong><small>${w(s.host)} &middot; ${w(s.normalized_kind)} &middot; ${w(s.source)}</small></div>
930
- <span class="chip ${ci(s)}">${lr(s)}</span>
931
- </li>`),Vt(e.capabilities,"No capability records match these filters.")].join(""))}
935
+ <div><strong>${w(a.uid)}</strong><small>${w(a.host)} &middot; ${w(a.normalized_kind)} &middot; ${w(a.source)}</small></div>
936
+ <span class="chip ${yi(a)}">${dr(a)}</span>
937
+ </li>`),Jt(e.capabilities,"No capability records match these filters.")].join(""))}
932
938
 
933
- ${Ae("Commitments",[De(e.commitments,s=>`
939
+ ${Pe("Commitments",[He(e.commitments,a=>`
934
940
  <li>
935
- <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>
936
- <span class="chip ${Tk(s.status)}">${w(s.status)}</span>
937
- </li>`),Vt(e.commitments,"No commitments match these filters.")].join(""))}
941
+ <div><strong>${w(a.summary)}</strong><small>${w(a.project_id)} &middot; ${w(a.status)}${a.due_at?` &middot; due ${w(a.due_at)}`:""}</small></div>
942
+ <span class="chip ${qk(a.status)}">${w(a.status)}</span>
943
+ </li>`),Jt(e.commitments,"No commitments match these filters.")].join(""))}
938
944
 
939
- ${Ae("Heartbeat And Runs",[Cn([["Leases",e.heartbeat.leases.length],["Runs",e.heartbeat.runs.length],["Schedules",e.schedules.length]]),De(e.heartbeat.runs,s=>`
945
+ ${Pe("Heartbeat And Runs",[Hn([["Leases",e.heartbeat.leases.length],["Runs",e.heartbeat.runs.length],["Schedules",e.schedules.length]]),He(e.heartbeat.runs,a=>`
940
946
  <li>
941
- <div><strong>${w(s.id)}</strong><small>${w(s.host)} &middot; ${w(s.project_id)} &middot; ${w(s.completed_at)}</small></div>
942
- <span class="chip green">${w(s.status)}</span>
943
- </li>`),Vt(e.heartbeat.runs,"No heartbeat runs in this scope.")].join(""))}
947
+ <div><strong>${w(a.id)}</strong><small>${w(a.host)} &middot; ${w(a.project_id)} &middot; ${w(a.completed_at)}</small></div>
948
+ <span class="chip green">${w(a.status)}</span>
949
+ </li>`),Jt(e.heartbeat.runs,"No heartbeat runs in this scope.")].join(""))}
944
950
 
945
- ${Ae("Schedules",[De(e.schedules,s=>`
951
+ ${Pe("Schedules",[He(e.schedules,a=>`
946
952
  <li>
947
- <div><strong>${w(s.id)}</strong><small>${w(s.host)} &middot; ${w(s.mode)} &middot; native: ${s.native_schedule_supported?"yes":"fallback"}</small></div>
948
- <span class="chip ${s.enabled?"green":"neutral"}">${s.enabled?"enabled":"disabled"}</span>
949
- </li>`),Vt(e.schedules,"No schedules match these filters.")].join(""))}
953
+ <div><strong>${w(a.id)}</strong><small>${w(a.host)} &middot; ${w(a.mode)} &middot; native: ${a.native_schedule_supported?"yes":"fallback"}</small></div>
954
+ <span class="chip ${a.enabled?"green":"neutral"}">${a.enabled?"enabled":"disabled"}</span>
955
+ </li>`),Jt(e.schedules,"No schedules match these filters.")].join(""))}
950
956
 
951
- ${Ae("Audit Trail",[De(e.audit.events,s=>`
957
+ ${Pe("Audit Trail",[He(e.audit.events,a=>`
952
958
  <li>
953
- <div><strong>${w(s.type)}</strong><small>${w(s.created_at)} &middot; ${w(s.result)}</small></div>
954
- <span class="chip ${s.result==="blocked"?"red":"neutral"}">${w(s.actor)}</span>
955
- </li>`),Vt(e.audit.events,"No audit events in this scope.")].join(""))}
959
+ <div><strong>${w(a.type)}</strong><small>${w(a.created_at)} &middot; ${w(a.result)}</small></div>
960
+ <span class="chip ${a.result==="blocked"?"red":"neutral"}">${w(a.actor)}</span>
961
+ </li>`),Jt(e.audit.events,"No audit events in this scope.")].join(""))}
956
962
 
957
- ${Ae("Approvals And Proposals",[Cn([["Standing Orders",e.policy.counts.standing_orders],["Proposals",e.policy.counts.proposals],["Approvals",e.policy.counts.approvals_required]]),De(e.policy.proposals,s=>`
963
+ ${Pe("Approvals And Proposals",[Hn([["Standing Orders",e.policy.counts.standing_orders],["Proposals",e.policy.counts.proposals],["Approvals",e.policy.counts.approvals_required]]),He(e.policy.proposals,a=>`
958
964
  <li>
959
- <div><strong>${w(s.target??s.filename)}</strong><small>${w(s.summary??"No summary supplied.")}</small></div>
965
+ <div><strong>${w(a.target??a.filename)}</strong><small>${w(a.summary??"No summary supplied.")}</small></div>
960
966
  <span class="chip amber">proposal</span>
961
- </li>`),Vt(e.policy.proposals,"No pending policy proposals.")].join(""))}
967
+ </li>`),Jt(e.policy.proposals,"No pending policy proposals.")].join(""))}
962
968
 
963
- ${Ae("M7 Feedback",[Cn([["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">
969
+ ${Pe("M7 Feedback",[Hn([["Bootstrap",e.feedback.metrics.bootstrap.succeeded+e.feedback.metrics.bootstrap.degraded],["Recall",e.feedback.metrics.recall.recalled],["Heartbeat",e.feedback.metrics.heartbeat.completed_runs]]),`<ul class="records">
964
970
  <li><div><strong>Recurring use</strong><small>${w(e.feedback.m7_gate.notes[0]??"No recurring use note.")}</small></div><span class="chip ${e.feedback.m7_gate.recurring_use_validated?"green":"amber"}">${e.feedback.m7_gate.recurring_use_validated?"validated":"pending"}</span></li>
965
971
  <li><div><strong>Privacy</strong><small>External telemetry disabled: ${e.feedback.external_telemetry_enabled?"no":"yes"}</small></div><span class="chip ${e.feedback.m7_gate.privacy_validated?"green":"red"}">${e.feedback.m7_gate.privacy_validated?"validated":"check"}</span></li>
966
972
  </ul>`].join(""))}
@@ -973,41 +979,41 @@ ${n.content}`)>=.35&&o!==Du(n.content)){let s=Hu(n.content);if([...r].some(l=>l.
973
979
  </main>
974
980
  <script type="application/json" id="nativesoul-dashboard-data">${w(JSON.stringify(e))}</script>
975
981
  </body>
976
- </html>`}function ur(e,t,r,o){return`<article class="metric ${r}">
982
+ </html>`}function mr(e,t,r,o){return`<article class="metric ${r}">
977
983
  <span>${w(e)}</span>
978
984
  <strong>${t}</strong>
979
985
  <small>${w(o)}</small>
980
- </article>`}function vk(e){return e.schema_version>=2&&"work"in e&&"approvals"in e&&"cost"in e?e:null}function kk(e){if(e.work.columns.length===0)return"";let t=`<div class="board-grid">${e.work.columns.map(r=>`
986
+ </article>`}function Mk(e){return e.schema_version>=2&&"work"in e&&"approvals"in e&&"cost"in e?e:null}function Lk(e){if(e.work.columns.length===0)return"";let t=`<div class="board-grid">${e.work.columns.map(r=>`
981
987
  <section class="board-column">
982
988
  <div class="board-column-head">
983
- <strong>${w(Ak(r.status))}</strong>
989
+ <strong>${w(Fk(r.status))}</strong>
984
990
  <span class="chip neutral">${r.count}</span>
985
991
  </div>
986
- ${De(r.items,o=>`
992
+ ${He(r.items,o=>`
987
993
  <li>
988
994
  <div><strong>${w(o.title)}</strong><small>${w(o.project)}${o.host?` &middot; ${w(o.host)}`:""}${o.linked_run_id?` &middot; run ${w(o.linked_run_id)}`:""}</small></div>
989
- <span class="chip ${Ek(o.status)}">${w(o.priority)}</span>
995
+ <span class="chip ${Uk(o.status)}">${w(o.priority)}</span>
990
996
  </li>`)}
991
- </section>`).join("")}</div>`;return Ae("Work Board",t)}function wk(e){return e.approvals.pending.length===0?"":Ae("Pending Approvals",[De(e.approvals.pending,t=>`
997
+ </section>`).join("")}</div>`;return Pe("Work Board",t)}function Dk(e){return e.approvals.pending.length===0?"":Pe("Pending Approvals",[He(e.approvals.pending,t=>`
992
998
  <li>
993
999
  <div><strong>${w(t.action)}</strong><small>${w(t.class)}${t.project?` &middot; ${w(t.project)}`:""}${t.host?` &middot; ${w(t.host)}`:""}${t.target?` &middot; ${w(t.target)}`:""}</small></div>
994
1000
  <span class="chip amber">${w(t.source)}</span>
995
- </li>`),'<p class="helper">approve via: nativesoul approvals approve &lt;id&gt; --confirm</p>'].join(""))}function Rk(e){if(e.cost.totals.cost_reported_runs===0)return"";let t=[Cn([["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(Ep(e.cost.totals.total_usd))}</strong></div>`,_i("By Host",e.cost.by_host),_i("By Session",e.cost.by_session),_i("By Run",e.cost.by_run)].filter(Boolean);return Ae("Cost",t.join(""))}function _i(e,t){let r=t.filter(o=>o.reported_runs>0||o.not_reported_runs>0);return r.length===0?"":`<div class="cost-group">
1001
+ </li>`),'<p class="helper">approve via: nativesoul approvals approve &lt;id&gt; --confirm</p>'].join(""))}function Hk(e){if(e.cost.totals.cost_reported_runs===0)return"";let t=[Hn([["Reported",e.cost.totals.reported_runs],["Not reported",e.cost.totals.not_reported_runs],["Coverage %",Math.round(e.cost.totals.coverage*100)]]),`<div class="cost-total"><span>Total reported</span><strong>${w(Hp(e.cost.totals.total_usd))}</strong></div>`,Ei("By Host",e.cost.by_host),Ei("By Session",e.cost.by_session),Ei("By Run",e.cost.by_run)].filter(Boolean);return Pe("Cost",t.join(""))}function Ei(e,t){let r=t.filter(o=>o.reported_runs>0||o.not_reported_runs>0);return r.length===0?"":`<div class="cost-group">
996
1002
  <h2>${w(e)}</h2>
997
- ${De(r,o=>`
1003
+ ${He(r,o=>`
998
1004
  <li>
999
- <div><strong>${w(o.label)}</strong><small>${w(Sk(o))}${o.not_reported_runs>0?" &middot; not reported by host":""}</small></div>
1000
- <span class="chip ${o.cost_reported_runs>0?"green":"neutral"}">${w(o.cost_reported_runs>0?Ep(o.total_usd):"not reported")}</span>
1005
+ <div><strong>${w(o.label)}</strong><small>${w($k(o))}${o.not_reported_runs>0?" &middot; not reported by host":""}</small></div>
1006
+ <span class="chip ${o.cost_reported_runs>0?"green":"neutral"}">${w(o.cost_reported_runs>0?Hp(o.total_usd):"not reported")}</span>
1001
1007
  </li>`)}
1002
- </div>`}function Ep(e){return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:4}).format(e)}function Sk(e){return`${e.reported_runs}/${e.runs} reported (${Math.round(e.coverage*100)}%)`}function Ak(e){return e.replaceAll("_"," ").replace(/\b\w/g,t=>t.toUpperCase())}function Ek(e){return e==="done"?"green":e==="blocked"||e==="failed"?"red":e==="in_progress"||e==="review"?"cyan":"amber"}function Ae(e,t){return`<section class="panel">
1008
+ </div>`}function Hp(e){return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:4}).format(e)}function $k(e){return`${e.reported_runs}/${e.runs} reported (${Math.round(e.coverage*100)}%)`}function Fk(e){return e.replaceAll("_"," ").replace(/\b\w/g,t=>t.toUpperCase())}function Uk(e){return e==="done"?"green":e==="blocked"||e==="failed"?"red":e==="in_progress"||e==="review"?"cyan":"amber"}function Pe(e,t){return`<section class="panel">
1003
1009
  <div class="panel-head"><p class="eyebrow"><span>&rsaquo;</span> ${w(e)}</p></div>
1004
1010
  ${t}
1005
- </section>`}function De(e,t){return e.length===0?"":`<ul class="records">${e.map(t).join("")}</ul>`}function Vt(e,t){return e.length===0?`<p class="empty">${w(t)}</p>`:""}function Cn(e){return`<div class="split-stats">${e.map(([t,r])=>`<div><strong>${r}</strong><span>${w(t)}</span></div>`).join("")}</div>`}function Pk(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 xk(){return`<div class="legend">
1011
+ </section>`}function He(e,t){return e.length===0?"":`<ul class="records">${e.map(t).join("")}</ul>`}function Jt(e,t){return e.length===0?`<p class="empty">${w(t)}</p>`:""}function Hn(e){return`<div class="split-stats">${e.map(([t,r])=>`<div><strong>${r}</strong><span>${w(t)}</span></div>`).join("")}</div>`}function Vk(e){let t=Object.values(e).reduce((o,n)=>o+n,0);return`<div class="lifecycle" aria-label="memory lifecycle">${[["active","green"],["candidate","amber"],["rejected","red"],["expired","neutral"],["forgotten","neutral"],["superseded","neutral"]].map(([o,n])=>{let s=e[o],a=t===0?0:Math.max(6,Math.round(s/t*100));return`<span class="${n}" style="width:${a}%" title="${o}: ${s}"></span>`}).join("")}</div>`}function Bk(){return`<div class="legend">
1006
1012
  <span><i class="green"></i>ready</span>
1007
1013
  <span><i class="cyan"></i>full native capability</span>
1008
1014
  <span><i class="amber"></i>official-fallback</span>
1009
1015
  <span><i class="red"></i>degraded</span>
1010
- </div>`}function jk(e){return{total:e.length,ready:e.filter(t=>t.ready).length}}function Ik(e){return e==="active"?"green":e==="candidate"?"amber":e==="rejected"||e==="forgotten"?"red":"neutral"}function Tk(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 Ck(){return`
1016
+ </div>`}function Wk(e){return{total:e.length,ready:e.filter(t=>t.ready).length}}function Jk(e){return e==="active"?"green":e==="candidate"?"amber":e==="rejected"||e==="forgotten"?"red":"neutral"}function qk(e){return e==="open"?"amber":e==="completed"?"green":"neutral"}function w(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function Kk(){return`
1011
1017
  :root {
1012
1018
  --red-400:#ff6b6b; --red-500:#ff4444; --red-600:#f02d3a; --red-glow:rgba(255,68,68,.45); --red-glow-soft:rgba(255,68,68,.16);
1013
1019
  --ink-950:#06070d; --ink-900:#0a0c14; --ink-850:#0e1019; --ink-800:#12151f; --ink-700:#1c202d; --ink-600:#262b3a;
@@ -1034,35 +1040,35 @@ h1{margin:0;color:var(--text-100);font:700 44px/1.05 var(--font-display);letter-
1034
1040
  .empty{margin:0;color:var(--text-500);font:500 13px/1.5 var(--font-mono);border:1px dashed var(--ink-600);border-radius:10px;padding:14px}footer{display:flex;justify-content:space-between;gap:16px;margin-top:18px;padding-top:18px;border-top:1px solid rgba(255,255,255,.06);color:var(--text-500);font:600 11px/1.4 var(--font-mono);text-transform:uppercase}
1035
1041
  @media (max-width: 900px){.topbar,.layout{grid-template-columns:1fr}.summary-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.terminal code{white-space:normal}.records small{max-width:260px}}
1036
1042
  @media (max-width: 560px){.summary-grid{grid-template-columns:1fr}.shell{padding:22px 12px}h1{font-size:34px}.records li{align-items:flex-start;flex-direction:column}.records small{max-width:100%}footer{flex-direction:column}.split-stats{grid-template-columns:1fr}}
1037
- `}import{readFile as Nk}from"node:fs/promises";import Ok from"node:path";var Nn=1500;async function Ro(e){let t=await v(e.home),r=await Dk(t.home),o=new Date,n=Mk(e.ttlSeconds??r.ttlSeconds),a=new Date(o.getTime()+n*1e3).toISOString(),s=wi(e.project,e.slot),i=_(t.database),l;try{l=i.claimHeartbeatLease({id:T("lease"),slot:e.slot,holder:e.host,idempotencyKey:s,now:o.toISOString(),expiresAt:a})}finally{i.close()}return await h({home:t.home,type:l.claimed?"heartbeat_claimed":"heartbeat_skipped",details:{slot:e.slot,host:e.host,project:e.project,lease_id:l.lease.id,reason:l.reason}}),{slot:e.slot,host:e.host,project:e.project,claimed:l.claimed,reason:l.reason,silent_ack:l.claimed||l.reason==="LEASE_OCCUPIED"&&!r.skipWhenBusy?null:"HEARTBEAT_OK",lease:l.lease}}async function So(e){let t=await v(e.home),r=new Date().toISOString(),o=wi(e.project,e.slot),n=$(e.result??"HEARTBEAT_OK"),a=$(Lk(e.evidence??{},e.workItemId)),s=$(e.cost??{}),i=Bt(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 ki(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 wi(e,t){return`heartbeat:${e}:${t}`}function Mk(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e),1),1440*60):Nn}function Lk(e,t){return t?{...e&&typeof e=="object"&&!Array.isArray(e)?e:{},work_item_id:t}:e}async function Dk(e){let t;try{t=await Nk(Ok.join(e,"config.yaml"),"utf8")}catch{return{ttlSeconds:Nn,skipWhenBusy:!0}}return{ttlSeconds:Hk(t),skipWhenBusy:$k(t,"skip_when_busy",!0)}}function Hk(e){let t=vi(e,"ttl_seconds"),r=vi(e,"lease_ttl"),o=Fk(e,"heartbeat_ttl_seconds"),n=Uk(t??r??o);return Number.isFinite(n)?n:Nn}function $k(e,t,r){let o=vi(e,t);return o?/^(true|yes|1)$/i.test(o)?!0:/^(false|no|0)$/i.test(o)?!1:r:r}function vi(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 Fk(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`^\\s*${r}:\\s*([^#\\n]+)`,"mu"))?.[1]?.trim().replace(/^["']|["']$/g,"")??null}function Uk(e){if(!e)return Nn;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 Ri(e){let t=await v(e.home);_(t.database).close();let o=Ue(e.host),n=(await Promise.all(o.map(s=>xr(s)))).flat(),a=[];for(let s of o){let i=Be(s,e.surface);for(let l of i){let c=n.find(de=>de.host===s),d=rr(s,e.targetRoot,l),p=d.managedBlock?await Tr({home:t.home,host:s,apply:e.apply,targetPath:d.managedBlock}):Vk(s,l,!e.apply),g=await oo({home:t.home,host:s,apply:e.apply,targetPath:d.mcpRegistration,commandMode:"package"}),y=await Os({home:t.home,host:s,surface:l,apply:e.apply,targetPath:d.plugin}),k=await ct({home:t.home,host:s,surface:l,mode:"leader",apply:e.apply,pluginEnabled:y.enabled,hostConfigRoot:qe(s,e.targetRoot),targetRoot:e.targetRoot}),S=e.apply?await kt({home:t.home,host:s}):[],D=e.apply?S.reduce((de,xe)=>de+xe.count,0):c?.sources.length??0,ye=[...k.warnings,...y.issues.map(de=>de.code),...c?.detected?[]:[`${s.toUpperCase()}_NOT_DETECTED`]],Pe=[p.backupPath,g.backupPath,y.backupPath].filter(de=>de!==null),Ye=ye.length===0&&D>0?"ready":"degraded";a.push({host:s,surface:l,detected:c?.detected??!1,status:Ye,managed_block:p,mcp_registration:g,plugin:y,schedule:k,capability_count:D,snapshots:Pe,warnings:ye})}}return{dryRun:!e.apply,applied:e.apply,home:t.home,hosts:a,status:a.every(s=>s.status==="ready")?"ready":"degraded"}}function Vk(e,t,r){let o=A("");return{host:e,targetPath:`not-applicable:${Ct(e,t)}`,action:"noop",dryRun:r,changed:!1,beforeHash:null,afterHash:o,diff:"No managed instruction block for this host surface.",backupPath:null,applied:!1}}import Bk from"node:path";import{rm as Pp}from"node:fs/promises";var Si="DELETE_NATIVESOUL_HOME";async function Ai(e){if(e.purgeData===!0&&e.confirmPurge!==Si)throw new Error(`--purge-data requires --confirm-purge-nativesoul-data ${Si}`);let t=await v(e.home);_(t.database).close();let o=Ue(e.host);if(e.apply)for(let l of o)for(let c of Be(l,e.surface))await xp({home:t.home,host:l,surface:c,apply:!1,targetRoot:e.targetRoot});let n=[];for(let l of o)for(let c of Be(l,e.surface))n.push(await xp({home:t.home,host:l,surface:c,apply:e.apply,targetRoot:e.targetRoot}));let a={requested:e.purgeData===!0,confirmed:e.confirmPurge===Si,applied:e.apply&&e.purgeData===!0,preserved:!(e.apply&&e.purgeData===!0)},s=Bk.join(t.home,"backups"),i={path:s,applied:e.apply,preserved:!e.apply};return i.applied&&await Pp(s,{recursive:!0,force:!0}),a.applied&&await Pp(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 xp(e){let t=rr(e.host,e.targetRoot,e.surface),r=t.managedBlock?await Ja({home:e.home,host:e.host,apply:e.apply,targetPath:t.managedBlock}):Wk(e.host,e.surface,!e.apply),o=await Ds({home:e.home,host:e.host,apply:e.apply,targetPath:t.mcpRegistration}),n=await Ms({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 Wk(e,t,r){let o=A("");return{host:e,targetPath:`not-applicable:${Ct(e,t)}`,action:"noop",dryRun:r,changed:!1,beforeHash:null,afterHash:o,diff:"No managed instruction block for this host surface.",backupPath:null,applied:!1}}async function Pi(e){let t=f(e.home),r=_(t.database),o;try{let n=r.findPendingApprovalMatch(Ei(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"),...Ei(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:ji(o.approval)}),o}async function pr(e){let t=f(e.home),r=_(t.database),o;try{let n=r.decideApproval(e.id,{status:e.status,reviewer:e.reviewer??"local-operator",reason:e.reason??null});o={approval:n.approval,available:n.available,warning:n.warning}}catch(n){throw n instanceof Ie,n}finally{r.close()}return o.approval&&await h({home:t.home,type:o.approval.status==="approved"?"approval_approved":"approval_rejected",details:ji(o.approval)}),o}async function xi(e){let t=f(e.home),r=_(t.database),o;try{let n=r.createDecidedApproval({id:T("approval"),...Ei(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:{...ji(o.approval),standing_order:e.standingOrderId}}),o}function On(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 Mn(e={}){let t=_(f(e.home).database);try{return t.listApprovals(e.status)}finally{t.close()}}function Ei(e){return{action:e.action,class:e.class,target:e.target??null,project:e.project??null,host:e.host??null}}function ji(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 Ii(e){let t=await pt(e),r=await Jk(e,t);if(r){let n=await xi({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 Pi({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 Jk(e,t){return t.decision!=="allowed"||!t.matched_standing_order||!qk(e.className)?null:(await ut(e.home)).find(o=>o.id===t.matched_standing_order&&o.allowed.includes(e.action)&&fi(o,e))??null}function qk(e){return e==="write_project"||e==="external_write"}import{existsSync as Li}from"node:fs";import{mkdir as Mp,readFile as Dn,rm as mw,writeFile as Lp}from"node:fs/promises";import he from"node:path";import{existsSync as lw}from"node:fs";import{readdir as cw,readFile as Ti}from"node:fs/promises";import mt from"node:path";import{fileURLToPath as dw}from"node:url";import jp from"node:path";var Kk=new Set(["id","version","title","description","intended_use","approvals","standing_orders","policy_proposals","managed_blocks","rollback","metadata"]),Gk=new Set(["id","action","authority","allowed","approval_required","scope_projects","scope_hosts","reason"]),Xk=new Set(["target","summary","rationale","rollback_note"]),zk=new Set(["target","marker","content","rollback_key"]),Yk=new Set(["strategy","restores","notes"]),Qk=new Set(["maturity","owner","source"]),Zk=new Set(["SOUL.MD","POLICY.MD"]),Ip=["AGENTS.md","CLAUDE.md","GEMINI.md","Agents.md",".claude/CLAUDE.md"],ew=new Set(Ip);function gr(e){let t=[];return Ge(e)?(fr(e,Kk,"pack",t),te(e,"id","pack",t,/^[a-z0-9][a-z0-9-]{2,63}$/u),te(e,"version","pack",t,/^[0-9]+\.[0-9]+\.[0-9]+$/u),te(e,"title","pack",t),te(e,"description","pack",t),te(e,"intended_use","pack",t),mr(e.approvals,"pack.approvals",t,!1),tw(e.standing_orders,t),rw(e.policy_proposals,t),ow(e.managed_blocks,t),nw(e.rollback,t),aw(e.metadata,t),iw(e,t),t):["Policy pack must be an object"]}function Ge(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Tp(e){return typeof e=="string"?e:null}function tw(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(!Ge(o)){t.push(`${n} must be an object`);continue}fr(o,Gk,n,t),te(o,"id",n,t,/^[a-z0-9][a-z0-9-]{2,63}$/u),Ln(o,"action",n,["add","propose"],t),Ln(o,"authority",n,["operator-approved","proposal"],t),mr(o.allowed,`${n}.allowed`,t,!0),mr(o.approval_required,`${n}.approval_required`,t,!0),mr(o.scope_projects,`${n}.scope_projects`,t,!0),mr(o.scope_hosts,`${n}.scope_hosts`,t,!0),te(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 rw(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(!Ge(o)){t.push(`${n} must be an object`);continue}fr(o,Xk,n,t),Ln(o,"target",n,["SOUL.md","POLICY.md"],t),te(o,"summary",n,t),te(o,"rationale",n,t),te(o,"rollback_note",n,t)}}function ow(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(!Ge(o)){t.push(`${n} must be an object`);continue}fr(o,zk,n,t),te(o,"target",n,t),te(o,"marker",n,t),te(o,"content",n,t),te(o,"rollback_key",n,t),typeof o.target=="string"&&sw(o.target,n,t)}}function nw(e,t){if(!Ge(e)){t.push("pack.rollback must be an object");return}fr(e,Yk,"pack.rollback",t),Ln(e,"strategy","pack.rollback",["proposal-only","managed-block","snapshot-required"],t),mr(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"),te(e,"notes","pack.rollback",t)}function aw(e,t){if(e!==void 0){if(!Ge(e)){t.push("pack.metadata must be an object");return}fr(e,Qk,"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 sw(e,t,r){let o=e.replaceAll("\\","/"),n=jp.basename(o).toUpperCase();(jp.isAbsolute(e)||o.includes("../")||o.startsWith("../"))&&r.push(`${t}.target must be a relative managed host file path`),Zk.has(n)&&r.push(`${t}.target must not target protected SOUL.md or POLICY.md`),ew.has(o)||r.push(`${t}.target is outside supported managed-block scope`)}function iw(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 fr(e,t,r,o){for(let n of Object.keys(e))t.has(n)||o.push(`${r}.${n} is not allowed`)}function te(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 Ln(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 mr(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 Ci(){return(await Cp()).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 Ao(e){let r=(await Cp()).find(o=>o.pack.id===e);if(!r)throw new Error(`Policy pack not found: ${e}`);return{...r.pack,source:r.source}}async function Ni(e){try{let{value:t,source:r}=e.file?{value:JSON.parse(await Ti(e.file,"utf8")),source:mt.resolve(e.file)}:await uw(e.id),o=gr(t),n=Ge(t)?Tp(t.id):null;return{valid:o.length===0,id:n,source:r,errors:o,warnings:[]}}catch(t){return{valid:!1,id:e.id??null,source:e.file?mt.resolve(e.file):null,errors:[t instanceof Error?t.message:"Unknown policy pack validation error"],warnings:[]}}}async function Cp(){let e=await Np(),t=[];for(let r of e){let o=JSON.parse(await Ti(r,"utf8")),n=gr(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 uw(e){if(!e)throw new Error("policy packs validate requires <id> or --file <path>");let t=await Np();for(let r of t){let o=JSON.parse(await Ti(r,"utf8"));if(Ge(o)&&o.id===e)return{value:o,source:r}}throw new Error(`Policy pack not found: ${e}`)}async function Np(){let e=pw(),t=(await cw(e)).filter(r=>r.endsWith(".json")).map(r=>mt.join(e,r)).sort();if(t.length===0)throw new Error(`No policy packs found in ${e}`);return t}function pw(){let e=mt.dirname(dw(import.meta.url)),r=[mt.resolve(process.cwd(),"policy-packs"),mt.resolve(e,"../../../policy-packs"),mt.resolve(e,"../../../../policy-packs"),mt.resolve(e,"../../../../../policy-packs")].find(o=>lw(o));if(!r)throw new Error("Built-in policy pack catalog not found");return r}async function Di(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 gw(e),o=he.resolve(e.targetRoot??process.cwd()),n=new Date().toISOString(),a=await fw({home:t.home,pack:r.pack,targetRoot:o,createdAt:n}),s=a.map(Op),i=a.filter(p=>p.changed),l=Iw(r.pack),c=e.apply&&i.length>0?await Sw({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 $i(g,"after"),p.push(g)}catch(g){throw await vw(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=>Op(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:Tw(d,e.approvalEvidence)}),d}async function Hi(e){let t=await v(e.home),r=kw(await Dn(e.snapshotPath,"utf8"),e.snapshotPath),o=r.files.map(a=>bw(a));if(e.apply)for(let a of r.files)await $i(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 gw(e){if(e.file){let r=he.resolve(e.file),o=JSON.parse(await Dn(r,"utf8")),n=gr(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 Ao(e.id);return{pack:t,source:t.source}}async function fw(e){let t=[];for(let r of e.pack.standing_orders)t.push(await hw(e.home,e.pack,r));for(let r of e.pack.policy_proposals)t.push(await yw(e.home,e.pack,r,e.createdAt));for(let r of e.pack.managed_blocks)t.push(await _w(e.targetRoot,e.pack,r));return t}async function hw(e,t,r){if(r.action==="add"&&r.authority==="operator-approved"){let n=he.join(e,"standing-orders",`${r.id}.yaml`);return await Oi("standing_order",n,Aw(r,t))}let o=he.join(e,"proposals",`standing-order-${t.id}-${r.id}.md`);return await Oi("standing_order",o,Ew(r,t))}async function yw(e,t,r,o){let n=o.replaceAll(/[:.]/gu,"-"),a=he.join(e,"proposals",`${n}-${t.id}-${r.target}.md`);return await Oi("policy_proposal",a,Pw(r,t,o))}async function _w(e,t,r){let o=he.resolve(e,r.target);if(!Nw(e,o))throw new Error(`Policy pack managed block target escapes target root: ${r.target}`);let n=Li(o),a=n?await Dn(o,"utf8"):null,s=xw(a,t,r);return Dp("managed_block",o,n,a,s)}async function Oi(e,t,r){let o=Li(t),n=o?await Dn(t,"utf8"):null;return Dp(e,t,o,n,r)}function Dp(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:Cw(o,n),beforeExists:r,beforeContent:o,afterContent:n}}function Op(e){return{kind:e.kind,targetPath:e.targetPath,action:e.action,changed:e.changed,beforeHash:e.beforeHash,afterHash:e.afterHash,diff:e.diff}}function bw(e){return{kind:e.kind,targetPath:e.targetPath,action:e.beforeExists?"replace":"remove",changed:!0,beforeHash:e.afterHash,afterHash:e.beforeHash,diff:$p(e.afterHash,e.beforeHash)}}async function $i(e,t){let r=t==="before"?e.beforeExists:e.afterHash!==null,o=t==="before"?e.beforeContent:e.afterContent;r&&o!==null?(await Mp(he.dirname(e.targetPath),{recursive:!0,mode:448}),await Lp(e.targetPath,o,{encoding:"utf8",mode:384})):Li(e.targetPath)&&await mw(e.targetPath)}async function vw(e){for(let t of[...e].reverse())await $i(t,"before")}function kw(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=ww(r);if(o.length>0)throw new Error(`Invalid policy pack snapshot ${t}: ${o.join("; ")}`);return r}function ww(e){let t=[];if(!Mi(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 Mi(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(...Rw(o,`files[${n}]`))}):t.push("files must be an array"),t}function Rw(e,t){let r=[];if(!Mi(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"||!he.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 Mi(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function Sw(e){let t=he.join(e.home,"backups","policy-packs");await Mp(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=he.join(t,o);return await Lp(n,JSON.stringify(r,null,2),{encoding:"utf8",mode:384,flag:"wx"}),n}function Aw(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(`
1038
- `)}function Ew(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(`
1039
- `)}function Pw(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(`
1040
- `)}function xw(e,t,r){let o=jw(t,r);if(e===null||e.length===0)return o;let n=Hp(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(`
1043
+ `}import{readFile as Gk}from"node:fs/promises";import Xk from"node:path";var $n=1500;async function Eo(e){let t=await v(e.home),r=await Qk(t.home),o=new Date,n=zk(e.ttlSeconds??r.ttlSeconds),s=new Date(o.getTime()+n*1e3).toISOString(),a=Ii(e.project,e.slot),i=_(t.database),l;try{l=i.claimHeartbeatLease({id:T("lease"),slot:e.slot,holder:e.host,idempotencyKey:a,now:o.toISOString(),expiresAt:s})}finally{i.close()}return await h({home:t.home,type:l.claimed?"heartbeat_claimed":"heartbeat_skipped",details:{slot:e.slot,host:e.host,project:e.project,lease_id:l.lease.id,reason:l.reason}}),{slot:e.slot,host:e.host,project:e.project,claimed:l.claimed,reason:l.reason,silent_ack:l.claimed||l.reason==="LEASE_OCCUPIED"&&!r.skipWhenBusy?null:"HEARTBEAT_OK",lease:l.lease}}async function Po(e){let t=await v(e.home),r=new Date().toISOString(),o=Ii(e.project,e.slot),n=H(e.result??"HEARTBEAT_OK"),s=H(Yk(e.evidence??{},e.workItemId)),a=H(e.cost??{}),i=qt(a),l=_(t.database),c;try{c=l.completeHeartbeatLease({idempotencyKey:o,host:e.host,project:e.project,result:n,evidence:s,cost:i,completedAt:r,runId:T("run")})}finally{l.close()}return await h({home:t.home,type:c.completed?"heartbeat_completed":"heartbeat_completion_replayed",details:{slot:e.slot,host:e.host,project:e.project,lease_id:c.lease.id,run_id:c.run?.id??null}}),{slot:e.slot,project:e.project,completed:c.completed,silent_ack:"HEARTBEAT_OK",lease:c.lease,run:c.run}}async function ji(e){let t=await v(e.home),r=_(t.database);try{return r.listHeartbeatLeases({project:e.project,limit:Math.min(Math.max(e.limit??20,1),100)})}finally{r.close()}}function Ii(e,t){return`heartbeat:${e}:${t}`}function zk(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e),1),1440*60):$n}function Yk(e,t){return t?{...e&&typeof e=="object"&&!Array.isArray(e)?e:{},work_item_id:t}:e}async function Qk(e){let t;try{t=await Gk(Xk.join(e,"config.yaml"),"utf8")}catch{return{ttlSeconds:$n,skipWhenBusy:!0}}return{ttlSeconds:Zk(t),skipWhenBusy:ew(t,"skip_when_busy",!0)}}function Zk(e){let t=xi(e,"ttl_seconds"),r=xi(e,"lease_ttl"),o=tw(e,"heartbeat_ttl_seconds"),n=rw(t??r??o);return Number.isFinite(n)?n:$n}function ew(e,t,r){let o=xi(e,t);return o?/^(true|yes|1)$/i.test(o)?!0:/^(false|no|0)$/i.test(o)?!1:r:r}function xi(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`^\\s*heartbeat:\\s*$[\\s\\S]*?^\\s{2}${r}:\\s*([^#\\n]+)`,"mu"))?.[1]?.trim().replace(/^["']|["']$/g,"")??null}function tw(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`^\\s*${r}:\\s*([^#\\n]+)`,"mu"))?.[1]?.trim().replace(/^["']|["']$/g,"")??null}function rw(e){if(!e)return $n;let t=e.match(/^(\d+)$/);if(t)return Number(t[1]);let r=e.match(/^(\d+)\s*([smh])$/i);if(!r)return Number.NaN;let o=Number(r[1]),n=r[2]?.toLowerCase();return n==="s"?o:n==="m"?o*60:o*60*60}async function Ti(e){let t=await v(e.home);_(t.database).close();let o=Ve(e.host),n=(await Promise.all(o.map(a=>Ir(a)))).flat(),s=[];for(let a of o){let i=We(a,e.surface);for(let l of i){let c=n.find(pe=>pe.host===a),d=nr(a,e.targetRoot,l),p=d.managedBlock?await Nr({home:t.home,host:a,apply:e.apply,targetPath:d.managedBlock}):ow(a,l,!e.apply),g=await ao({home:t.home,host:a,apply:e.apply,targetPath:d.mcpRegistration,commandMode:"package"}),y=await Va({home:t.home,host:a,surface:l,apply:e.apply,targetPath:d.plugin}),k=await ct({home:t.home,host:a,surface:l,mode:"leader",apply:e.apply,pluginEnabled:y.enabled,hostConfigRoot:Ke(a,e.targetRoot),targetRoot:e.targetRoot}),S=e.apply?await kt({home:t.home,host:a}):[],U=e.apply?S.reduce((pe,Ie)=>pe+Ie.count,0):c?.sources.length??0,Q=[...k.warnings,...y.issues.map(pe=>pe.code),...c?.detected?[]:[`${a.toUpperCase()}_NOT_DETECTED`]],je=[p.backupPath,g.backupPath,y.backupPath].filter(pe=>pe!==null),be=Q.length===0&&U>0?"ready":"degraded";s.push({host:a,surface:l,detected:c?.detected??!1,status:be,managed_block:p,mcp_registration:g,plugin:y,schedule:k,capability_count:U,snapshots:je,warnings:Q})}}return{dryRun:!e.apply,applied:e.apply,home:t.home,hosts:s,status:s.every(a=>a.status==="ready")?"ready":"degraded"}}function ow(e,t,r){let o=A("");return{host:e,targetPath:`not-applicable:${Ct(e,t)}`,action:"noop",dryRun:r,changed:!1,beforeHash:null,afterHash:o,diff:"No managed instruction block for this host surface.",backupPath:null,applied:!1}}import nw from"node:path";import{rm as $p}from"node:fs/promises";var Ci="DELETE_NATIVESOUL_HOME";async function Ni(e){if(e.purgeData===!0&&e.confirmPurge!==Ci)throw new Error(`--purge-data requires --confirm-purge-nativesoul-data ${Ci}`);let t=await v(e.home);_(t.database).close();let o=Ve(e.host);if(e.apply)for(let l of o)for(let c of We(l,e.surface))await Fp({home:t.home,host:l,surface:c,apply:!1,targetRoot:e.targetRoot});let n=[];for(let l of o)for(let c of We(l,e.surface))n.push(await Fp({home:t.home,host:l,surface:c,apply:e.apply,targetRoot:e.targetRoot}));let s={requested:e.purgeData===!0,confirmed:e.confirmPurge===Ci,applied:e.apply&&e.purgeData===!0,preserved:!(e.apply&&e.purgeData===!0)},a=nw.join(t.home,"backups"),i={path:a,applied:e.apply,preserved:!e.apply};return i.applied&&await $p(a,{recursive:!0,force:!0}),s.applied&&await $p(t.home,{recursive:!0,force:!0}),{dryRun:!e.apply,applied:e.apply,home:t.home,hosts:n,backups_purge:i,data_purge:s,status:n.every(l=>l.status==="ready")?"ready":"degraded"}}async function Fp(e){let t=nr(e.host,e.targetRoot,e.surface),r=t.managedBlock?await Ys({home:e.home,host:e.host,apply:e.apply,targetPath:t.managedBlock}):sw(e.host,e.surface,!e.apply),o=await Ja({home:e.home,host:e.host,apply:e.apply,targetPath:t.mcpRegistration}),n=await Ba({home:e.home,host:e.host,surface:e.surface,apply:e.apply,targetPath:t.plugin}),s=[r.backupPath,o.backupPath,n.backupPath].filter(a=>a!==null);return{host:e.host,surface:e.surface,status:"ready",managed_block:r,mcp_registration:o,plugin:n,snapshots:s,warnings:["SCHEDULE_TEARDOWN_NOT_PERFORMED"]}}function sw(e,t,r){let o=A("");return{host:e,targetPath:`not-applicable:${Ct(e,t)}`,action:"noop",dryRun:r,changed:!1,beforeHash:null,afterHash:o,diff:"No managed instruction block for this host surface.",backupPath:null,applied:!1}}async function Mi(e){let t=f(e.home),r=_(t.database),o;try{let n=r.findPendingApprovalMatch(Oi(e));if(!n.available)return{approval:null,created:!1,available:!1,warning:n.warning};if(n.approval)return{approval:n.approval,created:!1,available:!0,warning:null};let s=r.createApproval({id:T("approval"),...Oi(e)});o={approval:s.approval,created:!!s.approval,available:s.available,warning:s.warning}}finally{r.close()}return o.created&&o.approval&&await h({home:t.home,type:"approval_requested",details:Di(o.approval)}),o}async function gr(e){let t=f(e.home),r=_(t.database),o;try{let n=r.decideApproval(e.id,{status:e.status,reviewer:e.reviewer??"local-operator",reason:e.reason??null});o={approval:n.approval,available:n.available,warning:n.warning}}catch(n){throw n instanceof Ce,n}finally{r.close()}return o.approval&&await h({home:t.home,type:o.approval.status==="approved"?"approval_approved":"approval_rejected",details:Di(o.approval)}),o}async function Li(e){let t=f(e.home),r=_(t.database),o;try{let n=r.createDecidedApproval({id:T("approval"),...Oi(e),status:"approved",reviewer:`standing-order:${e.standingOrderId}`,reason:e.reason});o={approval:n.approval,available:n.available,warning:n.warning,created:!!n.approval}}finally{r.close()}return o.approval&&await h({home:t.home,type:"approval_auto_approved",details:{...Di(o.approval),standing_order:e.standingOrderId}}),o}function Fn(e){let t=_(f(e.home).database);try{let r=t.getApproval(e.id);return{approval:r.approval,available:r.available,warning:r.warning}}finally{t.close()}}function Un(e={}){let t=_(f(e.home).database);try{return t.listApprovals(e.status)}finally{t.close()}}function Oi(e){return{action:e.action,class:e.class,target:e.target??null,project:e.project??null,host:e.host??null}}function Di(e){return{id:e.id,action:e.action,class:e.class,target:e.target,project:e.project,host:e.host,status:e.status,reviewer:e.reviewer,reason:e.reason}}async function Hi(e){let t=await pt(e),r=await aw(e,t);if(r){let n=await Li({home:e.home,action:t.action,class:t.class,target:t.target,project:e.project??null,host:e.host??null,standingOrderId:r.id,reason:`standing-order allowed:${t.action}`});return{evaluation:t,approval:n.approval,approval_created:n.created,approval_available:n.available,warning:n.warning}}if(t.decision!=="approval_required")return{evaluation:t,approval:null,approval_created:!1,approval_available:!0,warning:null};let o=await Mi({home:e.home,action:t.action,class:t.class,target:t.target,project:e.project??null,host:e.host??null});return{evaluation:t,approval:o.approval,approval_created:o.created,approval_available:o.available,warning:o.warning}}async function aw(e,t){return t.decision!=="allowed"||!t.matched_standing_order||!iw(e.className)?null:(await ut(e.home)).find(o=>o.id===t.matched_standing_order&&o.allowed.includes(e.action)&&Ri(o,e))??null}function iw(e){return e==="write_project"||e==="external_write"}import{existsSync as Wi}from"node:fs";import{mkdir as Kp,readFile as Bn,rm as xw,writeFile as Gp}from"node:fs/promises";import _e from"node:path";import{existsSync as Rw}from"node:fs";import{readdir as Sw,readFile as $i}from"node:fs/promises";import mt from"node:path";import{fileURLToPath as Aw}from"node:url";import Up from"node:path";var lw=new Set(["id","version","title","description","intended_use","approvals","standing_orders","policy_proposals","managed_blocks","rollback","metadata"]),cw=new Set(["id","action","authority","allowed","approval_required","scope_projects","scope_hosts","reason"]),dw=new Set(["target","summary","rationale","rollback_note"]),uw=new Set(["target","marker","content","rollback_key"]),pw=new Set(["strategy","restores","notes"]),mw=new Set(["maturity","owner","source"]),gw=new Set(["SOUL.MD","POLICY.MD"]),Vp=["AGENTS.md","CLAUDE.md","GEMINI.md","Agents.md",".claude/CLAUDE.md"],fw=new Set(Vp);function hr(e){let t=[];return Xe(e)?(yr(e,lw,"pack",t),oe(e,"id","pack",t,/^[a-z0-9][a-z0-9-]{2,63}$/u),oe(e,"version","pack",t,/^[0-9]+\.[0-9]+\.[0-9]+$/u),oe(e,"title","pack",t),oe(e,"description","pack",t),oe(e,"intended_use","pack",t),fr(e.approvals,"pack.approvals",t,!1),hw(e.standing_orders,t),yw(e.policy_proposals,t),_w(e.managed_blocks,t),bw(e.rollback,t),vw(e.metadata,t),ww(e,t),t):["Policy pack must be an object"]}function Xe(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Bp(e){return typeof e=="string"?e:null}function hw(e,t){if(!Array.isArray(e)){t.push("pack.standing_orders must be an array");return}for(let[r,o]of e.entries()){let n=`pack.standing_orders[${r}]`;if(!Xe(o)){t.push(`${n} must be an object`);continue}yr(o,cw,n,t),oe(o,"id",n,t,/^[a-z0-9][a-z0-9-]{2,63}$/u),Vn(o,"action",n,["add","propose"],t),Vn(o,"authority",n,["operator-approved","proposal"],t),fr(o.allowed,`${n}.allowed`,t,!0),fr(o.approval_required,`${n}.approval_required`,t,!0),fr(o.scope_projects,`${n}.scope_projects`,t,!0),fr(o.scope_hosts,`${n}.scope_hosts`,t,!0),oe(o,"reason",n,t);let s=Array.isArray(o.allowed)?o.allowed:[],a=Array.isArray(o.approval_required)?o.approval_required:[];s.length===0&&a.length===0&&t.push(`${n} must declare at least one allowed or approval_required action`)}}function yw(e,t){if(!Array.isArray(e)){t.push("pack.policy_proposals must be an array");return}for(let[r,o]of e.entries()){let n=`pack.policy_proposals[${r}]`;if(!Xe(o)){t.push(`${n} must be an object`);continue}yr(o,dw,n,t),Vn(o,"target",n,["SOUL.md","POLICY.md"],t),oe(o,"summary",n,t),oe(o,"rationale",n,t),oe(o,"rollback_note",n,t)}}function _w(e,t){if(!Array.isArray(e)){t.push("pack.managed_blocks must be an array");return}for(let[r,o]of e.entries()){let n=`pack.managed_blocks[${r}]`;if(!Xe(o)){t.push(`${n} must be an object`);continue}yr(o,uw,n,t),oe(o,"target",n,t),oe(o,"marker",n,t),oe(o,"content",n,t),oe(o,"rollback_key",n,t),typeof o.target=="string"&&kw(o.target,n,t)}}function bw(e,t){if(!Xe(e)){t.push("pack.rollback must be an object");return}yr(e,pw,"pack.rollback",t),Vn(e,"strategy","pack.rollback",["proposal-only","managed-block","snapshot-required"],t),fr(e.restores,"pack.rollback.restores",t,!0),Array.isArray(e.restores)&&e.restores.length===0&&t.push("pack.rollback.restores must include at least one rollback item"),oe(e,"notes","pack.rollback",t)}function vw(e,t){if(e!==void 0){if(!Xe(e)){t.push("pack.metadata must be an object");return}yr(e,mw,"pack.metadata",t);for(let[r,o]of Object.entries(e))o!==null&&typeof o!="string"&&typeof o!="number"&&typeof o!="boolean"&&t.push(`pack.metadata.${r} must be a scalar value`)}}function kw(e,t,r){let o=e.replaceAll("\\","/"),n=Up.basename(o).toUpperCase();(Up.isAbsolute(e)||o.includes("../")||o.startsWith("../"))&&r.push(`${t}.target must be a relative managed host file path`),gw.has(n)&&r.push(`${t}.target must not target protected SOUL.md or POLICY.md`),fw.has(o)||r.push(`${t}.target is outside supported managed-block scope`)}function ww(e,t){let r=JSON.stringify(e);/(sk-[A-Za-z0-9_-]{8,}|api[_-]?key\s*[:=]|secret\s*[:=]|token\s*[:=]|password\s*[:=])/iu.test(r)&&t.push("pack must not contain credential-like material"),/https?:\/\//iu.test(r)&&t.push("pack must not require trust in external URLs")}function yr(e,t,r,o){for(let n of Object.keys(e))t.has(n)||o.push(`${r}.${n} is not allowed`)}function oe(e,t,r,o,n){let s=e[t];if(typeof s!="string"||s.trim()===""){o.push(`${r}.${t} must be a non-empty string`);return}n&&!n.test(s)&&o.push(`${r}.${t} has invalid format`)}function Vn(e,t,r,o,n){let s=e[t];(typeof s!="string"||!o.includes(s))&&n.push(`${r}.${t} must be one of ${o.join(", ")}`)}function fr(e,t,r,o){e===void 0&&!o||(!Array.isArray(e)||!e.every(n=>typeof n=="string"))&&r.push(`${t} must be an array of strings`)}async function Fi(){return(await Wp()).map(({pack:t,source:r})=>({id:t.id,version:t.version,title:t.title,description:t.description,intended_use:t.intended_use,source:r})).sort((t,r)=>t.id.localeCompare(r.id))}async function xo(e){let r=(await Wp()).find(o=>o.pack.id===e);if(!r)throw new Error(`Policy pack not found: ${e}`);return{...r.pack,source:r.source}}async function Ui(e){try{let{value:t,source:r}=e.file?{value:JSON.parse(await $i(e.file,"utf8")),source:mt.resolve(e.file)}:await Ew(e.id),o=hr(t),n=Xe(t)?Bp(t.id):null;return{valid:o.length===0,id:n,source:r,errors:o,warnings:[]}}catch(t){return{valid:!1,id:e.id??null,source:e.file?mt.resolve(e.file):null,errors:[t instanceof Error?t.message:"Unknown policy pack validation error"],warnings:[]}}}async function Wp(){let e=await Jp(),t=[];for(let r of e){let o=JSON.parse(await $i(r,"utf8")),n=hr(o);if(n.length>0)throw new Error(`Invalid built-in policy pack ${r}: ${n.join("; ")}`);t.push({pack:o,source:r})}return t}async function Ew(e){if(!e)throw new Error("policy packs validate requires <id> or --file <path>");let t=await Jp();for(let r of t){let o=JSON.parse(await $i(r,"utf8"));if(Xe(o)&&o.id===e)return{value:o,source:r}}throw new Error(`Policy pack not found: ${e}`)}async function Jp(){let e=Pw(),t=(await Sw(e)).filter(r=>r.endsWith(".json")).map(r=>mt.join(e,r)).sort();if(t.length===0)throw new Error(`No policy packs found in ${e}`);return t}function Pw(){let e=mt.dirname(Aw(import.meta.url)),r=[mt.resolve(process.cwd(),"policy-packs"),mt.resolve(e,"../../../policy-packs"),mt.resolve(e,"../../../../policy-packs"),mt.resolve(e,"../../../../../policy-packs")].find(o=>Rw(o));if(!r)throw new Error("Built-in policy pack catalog not found");return r}async function Ji(e){if(e.apply&&!e.reviewed)throw new Error("policy packs apply requires a prior dry-run review; pass --reviewed with --apply after reviewing the plan");let t=await v(e.home),r=await jw(e),o=_e.resolve(e.targetRoot??process.cwd()),n=new Date().toISOString(),s=await Iw({home:t.home,pack:r.pack,targetRoot:o,createdAt:n}),a=s.map(qp),i=s.filter(p=>p.changed),l=Jw(r.pack),c=e.apply&&i.length>0?await $w({home:t.home,pack:r.pack,source:r.source,targetRoot:o,files:i,approvalEvidence:e.approvalEvidence??null,createdAt:n}):null;if(e.apply){let p=[];try{for(let g of i)await Ki(g,"after"),p.push(g)}catch(g){throw await Mw(p),await h({home:t.home,type:"policy_pack_apply_failed",result:"error",details:{pack:{id:r.pack.id,version:r.pack.version,source:r.source},targetRoot:o,snapshotPath:c,rolledBackFiles:p.map(y=>qp(y)),error:g instanceof Error?g.message:String(g)}}),g}}let d={pack:{id:r.pack.id,version:r.pack.version,title:r.pack.title,source:r.source},dryRun:!e.apply,applied:e.apply,reviewed:e.reviewed,targetRoot:o,files:a,standingOrderChanges:r.pack.standing_orders.length,policyProposals:r.pack.policy_proposals.length,managedBlocks:r.pack.managed_blocks.length,warnings:l,snapshotRequired:i.length>0,snapshotPath:c};return await h({home:t.home,type:e.apply?"policy_pack_apply":"policy_pack_apply_dry_run",details:qw(d,e.approvalEvidence)}),d}async function qi(e){let t=await v(e.home),r=Lw(await Bn(e.snapshotPath,"utf8"),e.snapshotPath),o=r.files.map(s=>Ow(s));if(e.apply)for(let s of r.files)await Ki(s,"before");let n={snapshotPath:e.snapshotPath,pack:{id:r.pack.id,version:r.pack.version},dryRun:!e.apply,applied:e.apply,files:o};return await h({home:t.home,type:e.apply?"policy_pack_rollback":"policy_pack_rollback_dry_run",details:{snapshotPath:e.snapshotPath,pack:n.pack,dryRun:n.dryRun,applied:n.applied,files:n.files}}),n}async function jw(e){if(e.file){let r=_e.resolve(e.file),o=JSON.parse(await Bn(r,"utf8")),n=hr(o);if(n.length>0)throw new Error(`Invalid policy pack ${r}: ${n.join("; ")}`);return{pack:o,source:r}}if(!e.id)throw new Error("policy packs apply requires <id> or --file <path>");let t=await xo(e.id);return{pack:t,source:t.source}}async function Iw(e){let t=[];for(let r of e.pack.standing_orders)t.push(await Tw(e.home,e.pack,r));for(let r of e.pack.policy_proposals)t.push(await Cw(e.home,e.pack,r,e.createdAt));for(let r of e.pack.managed_blocks)t.push(await Nw(e.targetRoot,e.pack,r));return t}async function Tw(e,t,r){if(r.action==="add"&&r.authority==="operator-approved"){let n=_e.join(e,"standing-orders",`${r.id}.yaml`);return await Vi("standing_order",n,Fw(r,t))}let o=_e.join(e,"proposals",`standing-order-${t.id}-${r.id}.md`);return await Vi("standing_order",o,Uw(r,t))}async function Cw(e,t,r,o){let n=o.replaceAll(/[:.]/gu,"-"),s=_e.join(e,"proposals",`${n}-${t.id}-${r.target}.md`);return await Vi("policy_proposal",s,Vw(r,t,o))}async function Nw(e,t,r){let o=_e.resolve(e,r.target);if(!Gw(e,o))throw new Error(`Policy pack managed block target escapes target root: ${r.target}`);let n=Wi(o),s=n?await Bn(o,"utf8"):null,a=Bw(s,t,r);return Xp("managed_block",o,n,s,a)}async function Vi(e,t,r){let o=Wi(t),n=o?await Bn(t,"utf8"):null;return Xp(e,t,o,n,r)}function Xp(e,t,r,o,n){let s=o===null?null:A(o),a=n===null?null:A(n),i=o!==n;return{kind:e,targetPath:t,action:i?r?"replace":"create":"noop",changed:i,beforeHash:s,afterHash:a,diff:Kw(o,n),beforeExists:r,beforeContent:o,afterContent:n}}function qp(e){return{kind:e.kind,targetPath:e.targetPath,action:e.action,changed:e.changed,beforeHash:e.beforeHash,afterHash:e.afterHash,diff:e.diff}}function Ow(e){return{kind:e.kind,targetPath:e.targetPath,action:e.beforeExists?"replace":"remove",changed:!0,beforeHash:e.afterHash,afterHash:e.beforeHash,diff:Yp(e.afterHash,e.beforeHash)}}async function Ki(e,t){let r=t==="before"?e.beforeExists:e.afterHash!==null,o=t==="before"?e.beforeContent:e.afterContent;r&&o!==null?(await Kp(_e.dirname(e.targetPath),{recursive:!0,mode:448}),await Gp(e.targetPath,o,{encoding:"utf8",mode:384})):Wi(e.targetPath)&&await xw(e.targetPath)}async function Mw(e){for(let t of[...e].reverse())await Ki(t,"before")}function Lw(e,t){let r;try{r=JSON.parse(e)}catch(n){throw new Error(`Invalid policy pack snapshot ${t}: ${n instanceof Error?n.message:String(n)}`,{cause:n})}let o=Dw(r);if(o.length>0)throw new Error(`Invalid policy pack snapshot ${t}: ${o.join("; ")}`);return r}function Dw(e){let t=[];if(!Bi(e))return["snapshot must be an object"];(typeof e.id!="string"||!e.id)&&t.push("id must be a non-empty string");let r=e.pack;return Bi(r)?((typeof r.id!="string"||!r.id)&&t.push("pack.id must be a non-empty string"),(typeof r.version!="string"||!r.version)&&t.push("pack.version must be a non-empty string"),typeof r.source=="string"||r.source===null||t.push("pack.source must be a string or null")):t.push("pack must be an object"),(typeof e.targetRoot!="string"||!e.targetRoot)&&t.push("targetRoot must be a non-empty string"),(typeof e.createdAt!="string"||!e.createdAt)&&t.push("createdAt must be a non-empty string"),typeof e.approvalEvidence=="string"||e.approvalEvidence===null||t.push("approvalEvidence must be a string or null"),Array.isArray(e.files)?e.files.forEach((o,n)=>{t.push(...Hw(o,`files[${n}]`))}):t.push("files must be an array"),t}function Hw(e,t){let r=[];if(!Bi(e))return[`${t} must be an object`];["standing_order","policy_proposal","managed_block"].includes(typeof e.kind=="string"?e.kind:"")||r.push(`${t}.kind is invalid`),(typeof e.targetPath!="string"||!_e.isAbsolute(e.targetPath))&&r.push(`${t}.targetPath must be an absolute path`),["create","replace","noop","remove"].includes(typeof e.action=="string"?e.action:"")||r.push(`${t}.action is invalid`),typeof e.changed!="boolean"&&r.push(`${t}.changed must be boolean`),typeof e.beforeExists!="boolean"&&r.push(`${t}.beforeExists must be boolean`);for(let o of["beforeHash","afterHash","beforeContent","afterContent"])typeof e[o]=="string"||e[o]===null||r.push(`${t}.${o} must be a string or null`);return typeof e.diff!="string"&&r.push(`${t}.diff must be a string`),r}function Bi(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function $w(e){let t=_e.join(e.home,"backups","policy-packs");await Kp(t,{recursive:!0,mode:448});let r={id:T("policy_pack_snapshot"),pack:{id:e.pack.id,version:e.pack.version,source:e.source},targetRoot:e.targetRoot,createdAt:e.createdAt,files:e.files,approvalEvidence:e.approvalEvidence},o=`${e.createdAt.replaceAll(/[:.]/gu,"-")}-${e.pack.id}.json`,n=_e.join(t,o);return await Gp(n,JSON.stringify(r,null,2),{encoding:"utf8",mode:384,flag:"wx"}),n}function Fw(e,t){return[`id: ${e.id}`,`source: policy-pack:${t.id}@${t.version}`,`allowed: ${JSON.stringify(e.allowed)}`,`approval_required: ${JSON.stringify(e.approval_required)}`,`scope_projects: ${JSON.stringify(e.scope_projects)}`,`scope_hosts: ${JSON.stringify(e.scope_hosts)}`,`reason: ${JSON.stringify(e.reason)}`,""].join(`
1044
+ `)}function Uw(e,t){return["# Standing Order Proposal","",`Policy Pack: ${t.id}@${t.version}`,`Standing Order: ${e.id}`,`Action: ${e.action}`,`Authority: ${e.authority}`,"","## Allowed","",...e.allowed.map(r=>`- ${r}`),"","## Approval Required","",...e.approval_required.map(r=>`- ${r}`),"","## Reason","",e.reason,""].join(`
1045
+ `)}function Vw(e,t,r){return["# Policy Pack Proposal","",`Policy Pack: ${t.id}@${t.version}`,`Target: ${e.target}`,`Created At: ${r}`,"","## Summary","",e.summary,"","## Rationale","",e.rationale,"","## Rollback Note","",e.rollback_note,""].join(`
1046
+ `)}function Bw(e,t,r){let o=Ww(t,r);if(e===null||e.length===0)return o;let n=zp(t,r),s=e.indexOf(n.start),a=e.indexOf(n.end);if(s>=0&&a>s){let l=a+n.end.length,c=e.slice(l).replace(/^\n/u,"");return`${e.slice(0,s)}${o}${c}`}let i=e.endsWith(`
1041
1047
  `)?`
1042
1048
  `:`
1043
1049
 
1044
- `;return`${e}${i}${o}`}function jw(e,t){let r=Hp(e,t),o=t.content.endsWith(`
1050
+ `;return`${e}${i}${o}`}function Ww(e,t){let r=zp(e,t),o=t.content.endsWith(`
1045
1051
  `)?t.content:`${t.content}
1046
1052
  `;return`${r.start}
1047
1053
  ${o}${r.end}
1048
- `}function Hp(e,t){return{start:`<!-- nativesoul:policy-pack:${e.id}:${t.marker}:start v1 -->`,end:`<!-- nativesoul:policy-pack:${e.id}:${t.marker}:end -->`}}function Iw(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 Tw(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 Cw(e,t){return e===t?"No changes.":$p(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 $p(e,t,r=0,o=0){return[`before: ${e??"missing"}`,`after: ${t??"missing"}`,`lines_before: ${r}`,`lines_after: ${o}`].join(`
1049
- `)}function Nw(e,t){let r=he.relative(e,t);return r===""||!r.startsWith("..")&&!he.isAbsolute(r)}import Ow from"node:path";async function hr(e={}){let t=f(e.home),r=e.host??"all",[o,n,a,s]=await Promise.all([nt(t.home),R(gn(t.home)),R(zt(t.home)),Mt({home:t.home,host:r,surface:e.surface,targetRoot:e.targetRoot})]);return _s({home:t.home,targetRoot:e.targetRoot?Ow.resolve(e.targetRoot):null,host:r,profile:o,onboardingComplete:n,activationComplete:a,hosts:s.hosts})}async function Eo(e={}){let t=await hr(e);if(!e.profile||t.profile?.profile===e.profile)return t;let r={...t.profile??pn,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 Mw=["codex","claude","antigravity","gemini","grok"];async function Hn(e={}){let t=await v(e.home),r=await nt(t.home),o=e.leaderHost??Uw(r?.scheduler_host),n=o??e.host??"all",a=Lw({cadence:e.cadence??r?.heartbeat_cadence,projectScope:e.projectScope??L(process.cwd(),t.home),behavior:e.behavior,mode:e.mode}),s=await Dw({home:t.home,host:n,surface:e.surface,mode:a.mode,heartbeat:Up(a),targetRoot:e.targetRoot}),i=Hw(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 Fi(e={}){let t=await v(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,n=await Hn({...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 ct({home:t.home,host:n.recommended_leader.host,surface:n.recommended_leader.surface,mode:n.profile.mode,apply:!0,heartbeat:Up(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 Lw(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 Dw(e){let t=[];for(let r of Ue(e.host))for(let o of Be(r,e.surface)){let n=await ct({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:$w(n),native_schedule_supported:n.schedule.native_schedule_supported,native_id:n.schedule.native_id,reason:Fw(n),dry_run:n})}return t}function Hw(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)=>Fp(o)-Fp(n))[0]??null}function Fp(e){let t=Mw.indexOf(e.host),r=e.surface==="claude-desktop"?-.25:e.surface==="claude-code"?0:.25;return(t===-1?99:t)+r}function $w(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 Fw(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 Up(e){return{cadence:e.cadence,skipWhenBusy:e.skip_when_busy,projectScope:e.project_scope,behavior:e.behavior}}function Uw(e){return e==="codex"||e==="claude"||e==="grok"||e==="antigravity"||e==="gemini"?e:null}import{randomUUID as Vw}from"node:crypto";import Bw from"node:path";var Ww="NativeSoul activation verification marker";async function Po(e={}){let t=Gw(e),r=Z(t.projectCwd,e.home),o=await Mt({home:e.home,host:e.host??"all",surface:e.surface,targetRoot:e.targetRoot}),n=[];for(let c of o.hosts)n.push(await Jw({home:o.home,inputHost:c,testCwd:t.projectCwd}));let a=await Kw({home:e.home,testProject:`${r.id}-${Vw()}`,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=zw(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 Jw(e){let t=[],r=await qw({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=Xw(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 qw(e){let t=[...e.warnings],r=[],o="ready",n=!1,a="",s="ready";try{let i=await It({home:e.home,host:e.host,cwd:e.cwd,readOnly:!0});t.push(...i.warnings),i.warnings.some(l=>l.startsWith("HOST_ADAPTER_UNAVAILABLE")||l==="PROJECT_MEMORY_EMPTY")&&(s="degraded")}catch(i){t.push(`bootstrap_injection_failed:${Ui(i)}`),s="failed"}try{let i=await si({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 Kw(e){let t=[],r=null,o=!1,n=!1;try{let a=`verify-${e.testProject}`,s=`${Ww} ${e.testProject}`;r=await ne(e.home,{project:a,content:s,confidence:.91,source:{host:"activation-verification",session_id:`verification-${e.testProject}`}});let i=await Pt(e.home,s,a,8),l=await Et({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 Rt(e.home,r.id);r=d,n=r.id===d.id&&r.status==="active"}if(!e.retainTestData&&r)try{r.status==="candidate"?await St(e.home,r.id):await At(e.home,r.id),o=!0}catch(d){t.push(`memory_cleanup_failed:${Ui(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:${Ui(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 Gw(e){return{projectCwd:Bw.resolve(e.projectCwd??process.cwd())}}function Xw(e){return e==="native"?"native":e==="official-fallback"?"official_fallback":"unsupported"}function zw(e,t){return e.includes("blocked_by_host")?"blocked_by_host":e.includes("degraded")||t==="failed"?"degraded":e.length>0?"ready":"degraded"}function Ui(e){return e instanceof Error?e.message:String(e)}async function Vp(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 $n(e){let t=f(e);if(!Yw(t.database))return{home:t.home,initialized:!1,database:t.database,migrations:0,memories:0,events:0,capabilities:0,ledger:Qw()};let r=_(t.database,{readOnly:!0});try{return{home:t.home,initialized:!0,database:t.database,...r.counts()}}finally{r.close()}}function Qw(){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(Zw(e),null,2)}
1054
+ `}function zp(e,t){return{start:`<!-- nativesoul:policy-pack:${e.id}:${t.marker}:start v1 -->`,end:`<!-- nativesoul:policy-pack:${e.id}:${t.marker}:end -->`}}function Jw(e){let t=[];return e.policy_proposals.length>0&&t.push("Protected SOUL.md/POLICY.md changes are written as proposals only."),e.standing_orders.some(r=>r.authority==="proposal"||r.action==="propose")&&t.push("Proposal-only standing orders are written to proposals/ and do not change authority automatically."),t}function qw(e,t){return{pack:e.pack,dryRun:e.dryRun,applied:e.applied,reviewed:e.reviewed,targetRoot:e.targetRoot,snapshotPath:e.snapshotPath,approvalEvidence:t??null,files:e.files,warnings:e.warnings}}function Kw(e,t){return e===t?"No changes.":Yp(e===null?null:A(e),t===null?null:A(t),e===null?0:e.split(/\r?\n/u).length,t===null?0:t.split(/\r?\n/u).length)}function Yp(e,t,r=0,o=0){return[`before: ${e??"missing"}`,`after: ${t??"missing"}`,`lines_before: ${r}`,`lines_after: ${o}`].join(`
1055
+ `)}function Gw(e,t){let r=_e.relative(e,t);return r===""||!r.startsWith("..")&&!_e.isAbsolute(r)}import Xw from"node:path";async function _r(e={}){let t=f(e.home),r=e.host??"all",[o,n,s,a]=await Promise.all([nt(t.home),R(yn(t.home)),R(Zt(t.home)),Ht({home:t.home,host:r,surface:e.surface,targetRoot:e.targetRoot})]);return Sa({home:t.home,targetRoot:e.targetRoot?Xw.resolve(e.targetRoot):null,host:r,profile:o,onboardingComplete:n,activationComplete:s,hosts:a.hosts})}async function jo(e={}){let t=await _r(e);if(!e.profile||t.profile?.profile===e.profile)return t;let r={...t.profile??fn,profile:e.profile,updated_at:t.profile?.updated_at??"dry-run"};return{...t,profile:r,plan:[{id:"activation-profile-switch",component:"bootstrap",status:"approval_required",action:`Switch activation profile to ${e.profile}.`,target:`${t.home}/state/activation-profile.json`,dry_run:!0,requires_user_confirmed:!0,reason:"Activation profile replacement requires explicit reset/user confirmation."},...t.plan]}}var zw=["codex","claude","antigravity","gemini","grok"];async function Wn(e={}){let t=await v(e.home),r=await nt(t.home),o=e.leaderHost??rR(r?.scheduler_host),n=o??e.host??"all",s=Yw({cadence:e.cadence??r?.heartbeat_cadence,projectScope:e.projectScope??L(process.cwd(),t.home),behavior:e.behavior,mode:e.mode}),a=await Qw({home:t.home,host:n,surface:e.surface,mode:s.mode,heartbeat:Zp(s),targetRoot:e.targetRoot}),i=Zw(a,o),l=i?[]:a.length===0?["HEARTBEAT_NO_HOSTS_EVALUATED"]:["HEARTBEAT_NATIVE_SCHEDULER_BLOCKED_BY_HOST"];return{dry_run:!0,action:i?"recommend":"blocked_by_host",recommended_leader:i?{host:i.host,surface:i.surface,native_id:i.native_id??""}:null,profile:s,candidates:a,warnings:l}}async function Gi(e={}){let t=await v(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,n=await Wn({...e,home:t.home}),s=n.recommended_leader?n.candidates.find(i=>i.host===n.recommended_leader?.host&&i.surface===n.recommended_leader.surface)?.dry_run??null:null;if(!n.recommended_leader)return{dry_run:r,applied:!1,user_confirmed:o,action:"blocked_by_host",plan:n,dry_run_reconcile:s,applied_reconcile:null,warnings:n.warnings};if(r)return{dry_run:!0,applied:!1,user_confirmed:o,action:"planned",plan:n,dry_run_reconcile:s,applied_reconcile:null,warnings:[]};if(!o)return{dry_run:!1,applied:!1,user_confirmed:!1,action:"rejected",plan:n,dry_run_reconcile:s,applied_reconcile:null,warnings:["HEARTBEAT_ACTIVATION_REQUIRES_USER_CONFIRMED"]};let a=await ct({home:t.home,host:n.recommended_leader.host,surface:n.recommended_leader.surface,mode:n.profile.mode,apply:!0,heartbeat:Zp(n.profile),hostConfigRoot:Ke(n.recommended_leader.host,e.targetRoot),targetRoot:e.targetRoot});return await h({home:t.home,type:"activation.heartbeat.applied",details:{host:n.recommended_leader.host,surface:n.recommended_leader.surface,mode:n.profile.mode,cadence:n.profile.cadence,project_scope:n.profile.project_scope,native_schedule_supported:a.schedule.native_schedule_supported,native_id:a.schedule.native_id}}),{dry_run:!1,applied:!0,user_confirmed:!0,action:"applied",plan:n,dry_run_reconcile:s,applied_reconcile:a,warnings:a.warnings}}function Yw(e){return{cadence:e.cadence??"daily",skip_when_busy:!0,project_scope:e.projectScope??"current-project",behavior:e.behavior??"read_only",mode:e.mode??"leader",silent_ack:"HEARTBEAT_OK",hidden_fallback_scheduler:!1}}async function Qw(e){let t=[];for(let r of Ve(e.host))for(let o of We(r,e.surface)){let n=await ct({home:e.home,host:r,surface:o,mode:e.mode,apply:!1,heartbeat:e.heartbeat,hostConfigRoot:Ke(r,e.targetRoot),targetRoot:e.targetRoot});t.push({host:r,surface:o,status:eR(n),native_schedule_supported:n.schedule.native_schedule_supported,native_id:n.schedule.native_id,reason:tR(n),dry_run:n})}return t}function Zw(e,t){let r=e.filter(o=>o.status==="supported"&&o.native_id);return t?r.find(o=>o.host===t)??null:r.sort((o,n)=>Qp(o)-Qp(n))[0]??null}function Qp(e){let t=zw.indexOf(e.host),r=e.surface==="claude-desktop"?-.25:e.surface==="claude-code"?0:.25;return(t===-1?99:t)+r}function eR(e){return e.adapter_result.status==="ok"&&e.schedule.native_schedule_supported&&e.schedule.native_id?"supported":e.adapter_result.status==="degraded"?"degraded":"blocked_by_host"}function tR(e){switch(e.adapter_result.status){case"ok":return"native_scheduler_supported";case"degraded":return e.adapter_result.reason;case"unsupported":return e.adapter_result.reason;case"error":return e.adapter_result.message}}function Zp(e){return{cadence:e.cadence,skipWhenBusy:e.skip_when_busy,projectScope:e.project_scope,behavior:e.behavior}}function rR(e){return e==="codex"||e==="claude"||e==="grok"||e==="antigravity"||e==="gemini"?e:null}import{randomUUID as oR}from"node:crypto";import nR from"node:path";var sR="NativeSoul activation verification marker";async function Io(e={}){let t=cR(e),r=te(t.projectCwd,e.home),o=await Ht({home:e.home,host:e.host??"all",surface:e.surface,targetRoot:e.targetRoot}),n=[];for(let c of o.hosts)n.push(await aR({home:o.home,inputHost:c,testCwd:t.projectCwd}));let s=await lR({home:e.home,testProject:`${r.id}-${oR()}`,apply:e.apply===!0,userConfirmed:e.userConfirmed===!0,retainTestData:e.retainTestData===!0}),a=[...new Set([...n.flatMap(c=>c.recommendations),...s.status==="failed"?["Review memory persistence and rerun verification."]:[]])],i=n.map(c=>c.status),l=uR(i,s.status);return{schema_version:1,home:o.home,target_root:o.target_root,host:e.host??"all",surface:e.surface??null,project:{requested_cwd:t.projectCwd,normalized:r.id,source:r.source,git_root:r.git_root,remote:r.remote,alias_key:r.alias_key},overall_status:l,memory_recall:s,hosts:n,recommendations:a}}async function aR(e){let t=[],r=await iR({home:e.home,host:e.inputHost.host,cwd:e.testCwd,warnings:e.inputHost.handshake.last?.warnings??[]});e.inputHost.mcp_registration.configured||t.push(`Install MCP registration for ${e.inputHost.host}: nativesoul mcp install --host ${e.inputHost.host} --apply --json`),r.status!=="ready"&&t.push(`Regenerate bootstrap context for ${e.inputHost.host}: nativesoul bootstrap --host ${e.inputHost.host} --cwd ${e.testCwd} --format inject --json`);let o=dR(e.inputHost.provider_parity.heartbeat),n=[...e.inputHost.full_native_evidence.missing_requirements];o==="unsupported"&&(n.includes("native_scheduler")||n.push("native_scheduler"),t.push(`Choose a host with native scheduler support or configure external scheduler workflow for ${e.inputHost.host}.`));let a=e.inputHost.provider_parity.heartbeat==="unsupported-native"&&e.inputHost.host!=="codex"?"blocked_by_host":r.status==="failed"||r.status==="degraded"||r.cache.status==="degraded"||r.cache.status==="missing"||!e.inputHost.plugin.enabled?"degraded":"ready";return{host:e.inputHost.host,surface:e.inputHost.surface,status:a,mcp:{configured:e.inputHost.mcp_registration.configured,issues:e.inputHost.mcp_registration.issues.map(i=>i.message)},bootstrap:r,heartbeat:{status:o,requirements:n},recommendations:t}}async function iR(e){let t=[...e.warnings],r=[],o="ready",n=!1,s="",a="ready";try{let i=await It({home:e.home,host:e.host,cwd:e.cwd,readOnly:!0});t.push(...i.warnings),i.warnings.some(l=>l.startsWith("HOST_ADAPTER_UNAVAILABLE")||l==="PROJECT_MEMORY_EMPTY")&&(a="degraded")}catch(i){t.push(`bootstrap_injection_failed:${Xi(i)}`),a="failed"}try{let i=await gi({home:e.home,host:e.host,projectCwd:e.cwd,recordTelemetry:!1});s=i.targetPath,n=i.stale,r.push(...i.warnings),r.length>0&&(o=i.warnings.some(l=>l==="BOOTSTRAP_CACHE_MISSING")?"missing":"degraded",a==="ready"&&(a="degraded"))}catch{r.push("bootstrap_cache_check_failed"),o="missing",a==="ready"&&(a="degraded")}return{status:a,warnings:t,cache:{status:o,warnings:r,targetPath:s,stale:n}}}async function lR(e){let t=[],r=null,o=!1,n=!1;try{let s=`verify-${e.testProject}`,a=`${sR} ${e.testProject}`;r=await ae(e.home,{project:s,content:a,confidence:.91,source:{host:"activation-verification",session_id:`verification-${e.testProject}`}});let i=await Pt(e.home,a,s,8),l=await Et({home:e.home,project:s,status:"candidate",limit:8}),c=i.some(d=>d.id===r?.id)||l.some(d=>d.id===r?.id);if(e.apply&&e.userConfirmed&&r){let d=await Rt(e.home,r.id);r=d,n=r.id===d.id&&r.status==="active"}if(!e.retainTestData&&r)try{r.status==="candidate"?await St(e.home,r.id):await At(e.home,r.id),o=!0}catch(d){t.push(`memory_cleanup_failed:${Xi(d)}`)}return{test_project:e.testProject,candidate_id:r?.id??"",candidate_status:r?.status??"candidate",recalled:c,promoted:n,status:c?"passed":"failed",warnings:t,cleanup_performed:o}}catch(s){return t.push(`memory_recall_check_failed:${Xi(s)}`),{test_project:e.testProject,candidate_id:r?.id??"",candidate_status:r?.status??"candidate",recalled:!1,promoted:!1,status:"failed",warnings:t,cleanup_performed:!1}}}function cR(e){return{projectCwd:nR.resolve(e.projectCwd??process.cwd())}}function dR(e){return e==="native"?"native":e==="official-fallback"?"official_fallback":"unsupported"}function uR(e,t){return e.includes("blocked_by_host")?"blocked_by_host":e.includes("degraded")||t==="failed"?"degraded":e.length>0?"ready":"degraded"}function Xi(e){return e instanceof Error?e.message:String(e)}async function em(e){let t=await v(e),r=_(t.database);try{r.integrityCheck()}finally{r.close()}return await h({home:t.home,type:"workspace_initialized",details:{createdDirectories:t.createdDirectories.length,createdFiles:t.createdFiles.length,preservedFiles:t.preservedFiles.length}}),t}function Jn(e){let t=f(e);if(!pR(t.database))return{home:t.home,initialized:!1,database:t.database,migrations:0,memories:0,events:0,capabilities:0,ledger:mR()};let r=_(t.database,{readOnly:!0});try{return{home:t.home,initialized:!0,database:t.database,...r.counts()}}finally{r.close()}}function mR(){return{hosts:0,sessions:0,memory_edges:0,commitments:0,standing_orders:0,capability_sources:0,capability_experience:0,schedules:0,leases:0,runs:0,work_items:0,work_item_events:0}}function m(e,t,r){t?process.stdout.write(`${JSON.stringify(gR(e),null,2)}
1050
1056
  `):process.stdout.write(`${r}
1051
- `)}function Zw(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}async function xo(){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 jo(e){let t=e.trim();if(t.length!==0)try{return JSON.parse(t)}catch{return t}}function Bp(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 Vi(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 Bi(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 yr=new Set(["codex","claude","grok","antigravity","gemini"]);function Io(e){let t=u(e,"host")??"all";if(t==="all"||yr.has(t))return t;throw new Error(`Unsupported adapter host: ${t}`)}function Wp(e){let t=u(e,"host");if(t&&yr.has(t))return t;throw new Error("This command requires --host codex|claude|grok|antigravity|gemini")}function Xe(e){if(b(e,"all-hosts"))return"all";let t=u(e,"host")??"all";if(t==="all"||yr.has(t))return t;throw new Error(`Unsupported install host: ${t}`)}function Ee(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 To(e){let t=u(e,"host");if(t&&yr.has(t))return t;throw new Error("This command requires --host codex|claude|grok|antigravity|gemini")}function Co(e){let t=u(e,"host");if(t!==void 0){if(yr.has(t))return t;throw new Error("This command accepts --host codex|claude|grok|antigravity|gemini")}}function Jp(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 qp(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 Kp(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 Gp(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 Fn(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 Un(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 Wi(e,t){let r=u(e,t);if(r!==void 0)return r.split(",").map(o=>o.trim()).filter(Boolean)}function Xp(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 zp(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 Vn(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 Yp(e){let t=u(e,"host")??"generic";if(t==="generic"||yr.has(t))return t;throw new Error(`Unsupported MCP manifest host: ${t}`)}function Ji(e){return To(e)}function qi(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 Qp(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 Ki(e,t,r){let o=e.rest[0]??"status",n={home:t,host:Xe(e.flags),surface:Ee(e.flags),targetRoot:u(e.flags,"target-root")};if(o==="status"){let a=await hr(n);m(a,r,`Activation status: ${a.overall_status}`);return}if(o==="plan"){let a=await Eo({...n,profile:eR(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:Xe(e.flags),surface:Ee(e.flags),targetRoot:u(e.flags,"target-root"),leaderHost:tR(e),mode:Vn(e.flags),cadence:u(e.flags,"cadence"),projectScope:u(e.flags,"project")??u(e.flags,"project-scope"),behavior:rR(e),user_confirmed:b(e.flags,"user-confirmed")};if(a==="plan"){let i=await Hn(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 Fi({...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 eR(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 tR(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 rR(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 Gi(e,t){let r=e.rest[0],o=Io(e.flags);if(r==="hot-scan"){let n=await kt({home:u(e.flags,"home"),host:o,delta:b(e.flags,"delta"),ttlSeconds:E(e.flags,"ttl-seconds")}),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 xr(o);m(n,t,`Scanned ${n.length} adapter(s)`);return}if(r==="doctor"){let n=await jr(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=Wp(e.flags),a=await Ir(n);m(a,t,`Managed block preview for ${a.host}: ${a.targetPath}`);return}if(r==="install-managed-block"){let n=To(e.flags),a=await Tr({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 Wa({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 Xi(e,t,r){let o=e.rest[0];if(o==="list"){let n=Mn({home:t,status:qp(e.flags)});m(n,r,nR(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==="."?oR(t):On({home:t,id:n}).approval;m(a,r,a?aR(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=On({home:t,id:n}).approval;if(!a){m({approval:null,applied:!1,action:"approve",warning:"approval_not_found"},r,`Approval not found: ${n}`),process.exitCode=1;return}if(!b(e.flags,"confirm")){m({approval:a,applied:!1,action:"approve",warning:"requires --confirm"},r,`Approval approve dry-run: ${a.id} (${a.action}); rerun with --confirm to apply.`);return}let s=await pr({home:t,id:n,status:"approved",reviewer:"cli",reason:u(e.flags,"reason")??null});m(s.approval,r,s.approval?`Approval approved: ${s.approval.id}`:`Approval not found: ${n}`),s.approval||(process.exitCode=1);return}if(o==="reject"){let n=e.rest[1]??u(e.flags,"id"),a=u(e.flags,"reason");if(!n||!a)throw new Error("approvals reject requires <id> --reason <text>");let s=await pr({home:t,id:n,status:"rejected",reviewer:"cli",reason:a});m(s.approval,r,s.approval?`Approval rejected: ${s.approval.id}`:`Approval not found: ${n}`),s.approval||(process.exitCode=1);return}throw new Error("approvals requires list, show, approve, or reject")}function oR(e){return Mn({home:e,status:"pending"}).approvals[0]??null}function nR(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(`
1052
- `)}function aR(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(`
1053
- `)}async function zi(e,t,r){let o=e.rest[0],n={home:t,type:u(e.flags,"type"),result:Jp(e.flags),limit:E(e.flags,"limit")};if(o==="list"){let a=await Vo(n);m(a,r,`${a.length} audit event(s)`);return}if(o==="export"){let a=Kp(e.flags),s=await Sa({...n,format:a});if(a==="jsonl"){process.stdout.write(s.events.map(i=>JSON.stringify(i)).join(`
1054
- `)),s.events.length>0&&process.stdout.write(`
1055
- `);return}process.stdout.write(`${JSON.stringify(s.events,null,2)}
1056
- `);return}throw new Error("audit requires list or export")}async function Yi(e,t,r){let o=e.rest[0];if(o==="refresh"){let n=await kt({home:t,host:Io(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 Ga({home:t,host:Io(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 we({home:t,host:Co(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 Or({home:t,query:n,host:b(e.flags,"all-hosts")?void 0:Co(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 Mr({home:t,uid:n});if(!a)throw new Error(`Capability not found: ${n}`);m(a,r,`Capability ${a.uid}: ready=${a.ready}`);return}throw new Error("capabilities requires refresh, learn, list, search, or show")}async function Qi(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 Lr({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 Dr({home:t,project:u(e.flags,"project"),status:Gp(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 Hr(t,n):await Xa(t,n);m(a,r,`Commitment ${o}d: ${a.id}`);return}throw new Error("commitments requires create, list, complete, or dismiss")}async function tl(e,t,r){let o=u(e.flags,"project")??Z(process.cwd(),t).id,n=ko({home:t,project:o,host:u(e.flags,"host"),since:u(e.flags,"since"),until:u(e.flags,"until"),groupBy:sR(e.flags),limit:E(e.flags,"limit")});m(n,r,iR(n))}function sR(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 iR(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: ${Zi(e.totals)}`,`Coverage: ${el(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}: ${Zi(o)} (${el(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}: ${Zi(o)} (${el(o.reported_runs,o.total_runs)})`)}return t.join(`
1057
- `)}function Zi(e){return e.cost_reported_runs===0?"not reported by host":lR(e.total_usd)}function el(e,t){let r=t===0?0:Math.round(e/t*100);return`${e}/${t} reported (${r}%)`}function lR(e){return`$${e.toFixed(2)}`}async function rl(e,t,r){let o=e.rest[0];if(o==="data"){let n=cR(e.flags),a=await wo({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?dR(a,n):a,r,`Dashboard data ready: ${a.initialized?"initialized":"not initialized"}`);return}if(o==="viewer"){let n=await bi({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 cR(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 dR(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 ol(e,t,r){let o=e.rest[0];if(o==="m7"||o==="report"){let n=await dr({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 nl(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 Ro({home:t,slot:n,host:s,project:a,ttlSeconds:E(e.flags,"ttl-seconds")});m(i,r,i.claimed?`Heartbeat lease claimed: ${i.lease.id}`:"HEARTBEAT_OK");return}if(o==="complete"){let n=u(e.flags,"slot")??e.rest[1];if(!n)throw new Error("heartbeat complete requires --slot <id>");let a=u(e.flags,"project")??L(process.cwd(),t),s=u(e.flags,"host")??"codex",i=await So({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 ki({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 al(e,t,r){let o=e.rest[0];if(o==="reconcile"){let n=To(e.flags),a=u(e.flags,"target-root"),s=await ct({home:t,host:n,surface:Ee(e.flags),mode:Vn(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:Co(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 $s({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 sl(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 qs({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=uR(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 zs({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 uR(e){let t=e.rest[0],r=t==="native"?u(e.flags,"host"):t;return r==="nativesoul"||r==="codex"||r==="claude"||r==="gemini"||r==="grok"||r==="antigravity"?r:null}import{spawnSync as pR}from"node:child_process";async function il(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 Zs({home:t,key:n}),s=a.ok?{ok:!0,action:"activate",license:No(a.license),message:"License activated via Dodo"}:{ok:!1,action:"activate",reason:a.reason,license:No(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 Se(t),s=a?mR(a):le,i=await fR(e),l=await ai({home:t,currentVersion:Ht,latestKnownVersion:i}),c={ok:!0,action:"status",license:No(s),update_entitlement:l,message:hR(s,l,b(e.flags,"check-updates"))};m(c,r,c.message??`License status: ${s.state}`);return}if(o==="deactivate"){let a=await ti({home:t}),s=a.ok?{ok:!0,action:"deactivate",license:No(a.license),message:"License deactivated via Dodo; local NativeSoul data was not removed"}:{ok:!1,action:"deactivate",reason:a.reason,license:No(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 mR(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 No(e){return{...e,license_key:e.license_key?gR(e.license_key):null}}function gR(e){return e.length<=8?"[REDACTED_LICENSE_KEY]":`${e.slice(0,4)}\u2026${e.slice(-4)}`}async function fR(e){let t=u(e.flags,"latest-known-version");if(t)return t;if(!b(e.flags,"check-updates"))return;let r=process.platform==="win32"?"npm.cmd":"npm",o=pR(r,["view","nativesoul","version","--registry=https://registry.npmjs.org/"],{encoding:"utf8",timeout:15e3,shell:process.platform==="win32"});if(o.status===0)return o.stdout.trim()||void 0}function hR(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(`
1058
- `)}async function ll(e,t,r){let o=await ni({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 Zp={life_activation_status:async(e,t)=>await hr({home:t,host:cl(e.host),targetRoot:gt(e.target_root)??gt(e.targetRoot)}),life_activation_plan:async(e,t)=>await Eo({home:t,host:cl(e.host),targetRoot:gt(e.target_root)??gt(e.targetRoot),profile:yR(e.profile)}),life_activation_verify:async(e,t)=>await Po({home:t,host:cl(e.host),surface:_R(e.surface),targetRoot:gt(e.target_root)??gt(e.targetRoot),projectCwd:gt(e.project_cwd)??gt(e.projectCwd),apply:dl(e.apply),userConfirmed:dl(e["user-confirmed"]),retainTestData:dl(e["retain-test-data"])})},em=[{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 cl(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 yR(e){if(e!==void 0){if(e==="quickstart"||e==="advanced")return e;throw new Error("Invalid activation profile")}}function _R(e){if(e!==void 0){if(e==="desktop"||e==="claude-desktop")return"claude-desktop";if(e==="claude-code")return"claude-code";throw new Error("activation verify surface must be claude-code, desktop, or claude-desktop")}}function gt(e){return typeof e=="string"?e:void 0}function dl(e){return e===!0}var bR=["2025-11-25","2024-11-05","2024-10-07"],am={...Zp,life_status:(e,t)=>$n(t),life_bootstrap:async(e,t)=>await SR({home:t,host:C(e.host,"codex"),cwd:C(e.cwd,process.cwd()),query:X(e.query)}),life_recall:async(e,t)=>await Pt(t,C(e.query,""),C(e.project,"default"),Wn(e.limit,5)),life_remember_propose:async(e,t)=>await ne(t,{project:C(e.project,"default"),content:C(e.content,""),type:X(e.type),confidence:tm(e.confidence),source:{host:"mcp",session_id:"local"}}),life_memory_promote:async(e,t)=>await Rt(t,C(e.id,"")),life_memory_reject:async(e,t)=>await St(t,C(e.id,"")),life_memory_forget:async(e,t)=>await At(t,C(e.id,"")),life_memory_expire:async(e,t)=>await Br(t,C(e.id,"")),life_capability_search:async(e,t)=>await Or({home:t,query:C(e.query,""),host:PR(e)?void 0:X(e.host)??"codex",readyOnly:_r(e.readyOnly,!1),limit:Wn(e.limit,8)}),life_capability_status:async(e,t)=>{let r=C(e.uid,""),o=r?await Mr({home:t,uid:r}):null;if(!o)throw new Error(`Capability not found: ${r}`);return o},life_policy_evaluate:async(e,t)=>await pt({home:t,action:C(e.action,""),className:nm(e.class),target:X(e.target)}),life_approval_request:async(e,t)=>await TR({home:t,action:C(e.action,""),className:nm(e.class),target:X(e.target),project:X(e.project),host:X(e.host)}),life_approval_decide:async(e,t)=>{let r=C(e.id,""),o=await pr({home:t,id:r,status:IR(e.status),reviewer:C(e.host,"mcp"),reason:X(e.reason)??null});if(!o.approval)throw new Error(`Approval not found: ${r}`);return o},life_commitment_create:async(e,t)=>await Lr({home:t,project:C(e.project,"default"),summary:C(e.summary,""),dueAt:X(e.due_at),ttlSeconds:tm(e.ttl_seconds),source:{host:"mcp",session_id:"local"}}),life_commitment_complete:async(e,t)=>await Hr(t,C(e.id,"")),life_work_item_create:async(e,t)=>await ho({home:t,project:C(e.project,"default"),title:C(e.title,""),description:X(e.description),priority:ul(e.priority),source:"mcp",tags:rm(e.tags),host:X(e.host)}),life_work_item_list:async(e,t)=>await yo({home:t,project:X(e.project),status:om(e.status),priority:ul(e.priority),assignedHost:X(e.host),limit:Wn(e.limit,50)}),life_work_item_claim:async(e,t)=>await _o({home:t,id:C(e.id,""),host:C(e.host,"mcp")}),life_work_item_update:async(e,t)=>await bo({home:t,id:C(e.id,""),status:om(e.status),priority:ul(e.priority),assignedHost:X(e.host),description:X(e.description),tags:e.tags===void 0?void 0:rm(e.tags)}),life_work_item_complete:async(e,t)=>await vo({home:t,id:C(e.id,""),status:ER(e.status)}),life_heartbeat_claim:async(e,t)=>await Ro({home:t,slot:C(e.slot,""),host:C(e.host,"codex"),project:C(e.project,"default"),ttlSeconds:Wn(e.ttl_seconds,1500)}),life_heartbeat_complete:async(e,t)=>await So({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:X(e.work_item_id)}),life_onboarding_status:async(e,t)=>await Kr(t),life_onboard_apply:async(e,t)=>await Gr({home:t,dry_run:_r(e.dry_run,!0),user_confirmed:_r(e.user_confirmed,!1),files:xR(e.files),config_patch:jR(e.config_patch)}),life_onboard_complete:async(e,t)=>await Xr({home:t,archive:e.archive===void 0?!0:_r(e.archive,!0)})},vR=new Set(Object.keys(am));function kR(e){return e.method?.startsWith("notifications/")?!0:!Object.prototype.hasOwnProperty.call(e,"id")}async function Jn(e,t){if(kR(e))return null;let r=e.id??null;try{if(e.method==="initialize"){let o=Oo(e.params),n=X(o.protocolVersion),a=n&&bR.includes(n)?n:"2024-11-05";return ze(r,{protocolVersion:a,serverInfo:{name:"nativesoul",version:"0.1.0"},capabilities:{tools:{}}})}if(e.method==="ping")return ze(r,{});if(e.method==="resources/list")return ze(r,{resources:[]});if(e.method==="prompts/list")return ze(r,{prompts:[]});if(e.method==="tools/list")return ze(r,{tools:[{name:"life_status",description:"Return local NativeSoul health and counts.",inputSchema:{type:"object"}},{name:"life_bootstrap",description:"Return compact bootstrap context for a host and cwd.",inputSchema:{type:"object",required:["host","cwd"],properties:{host:{type:"string"},cwd:{type:"string"},query:{type:"string"}}}},{name:"life_recall",description:"Search project-scoped memory.",inputSchema:{type:"object",required:["query","project"],properties:{query:{type:"string"},project:{type:"string"},limit:{type:"number"}}}},{name:"life_remember_propose",description:"Create a redacted local candidate memory for a project.",inputSchema:{type:"object",required:["project","content"],properties:{project:{type:"string"},content:{type:"string"},type:{type:"string"},confidence:{type:"number"}}}},{name:"life_memory_promote",description:"Promote a candidate memory to active status.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_memory_reject",description:"Reject a candidate memory.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_memory_forget",description:"Forget an active memory.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_memory_expire",description:"Expire an active memory.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_capability_search",description:"Search persisted local capability records.",inputSchema:{type:"object",required:["query"],properties:{query:{type:"string"},host:{type:"string"},allHosts:{type:"boolean"},all_hosts:{type:"boolean"},readyOnly:{type:"boolean"},limit:{type:"number"}}}},{name:"life_capability_status",description:"Return one persisted capability record by uid.",inputSchema:{type:"object",required:["uid"],properties:{uid:{type:"string"}}}},{name:"life_policy_evaluate",description:"Evaluate a proposed action against local policy and standing orders.",inputSchema:{type:"object",required:["action","class"],properties:{action:{type:"string"},class:{type:"string"},target:{type:"string"}}}},{name:"life_approval_request",description:"Request approval for a sensitive action. If blocked, stop and return control to the human; there is no server or polling in this turn-based protocol.",inputSchema:{type:"object",required:["action","class"],properties:{action:{type:"string"},class:{type:"string"},target:{type:"string"},project:{type:"string"},host:{type:"string"}}}},{name:"life_approval_decide",description:"Record a human-driven approval decision. Acting agents must not self-approve; use this only from a human-operated host turn.",inputSchema:{type:"object",required:["id","status"],properties:{id:{type:"string"},status:{type:"string",enum:["approved","rejected"]},reason:{type:"string"},host:{type:"string"}}}},{name:"life_commitment_create",description:"Create a local project-scoped commitment with optional TTL.",inputSchema:{type:"object",required:["project","summary"],properties:{project:{type:"string"},summary:{type:"string"},due_at:{type:"string"},ttl_seconds:{type:"number"}}}},{name:"life_commitment_complete",description:"Complete a local commitment by id.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_work_item_create",description:"Create a local project-scoped work item.",inputSchema:{type:"object",required:["project","title"],properties:{project:{type:"string"},title:{type:"string"},description:{type:"string"},priority:{type:"string",enum:["low","normal","high","urgent"]},tags:{type:"array",items:{type:"string"}},host:{type:"string"}}}},{name:"life_work_item_list",description:"List local work items with optional filters.",inputSchema:{type:"object",properties:{project:{type:"string"},status:{type:"string",enum:["inbox","assigned","in_progress","review","blocked","done","failed"]},priority:{type:"string",enum:["low","normal","high","urgent"]},host:{type:"string"},limit:{type:"number"}}}},{name:"life_work_item_claim",description:"Claim one work item for a host.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},host:{type:"string"}}}},{name:"life_work_item_update",description:"Update one work item through the shared status machine.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},status:{type:"string",enum:["inbox","assigned","in_progress","review","blocked","done","failed"]},priority:{type:"string",enum:["low","normal","high","urgent"]},host:{type:"string"},description:{type:"string"},tags:{type:"array",items:{type:"string"}}}}},{name:"life_work_item_complete",description:"Complete one work item as done or failed.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},status:{type:"string",enum:["done","failed"]}}}},{name:"life_heartbeat_claim",description:"Claim a local heartbeat lease for a project and slot.",inputSchema:{type:"object",required:["slot","host","project"],properties:{slot:{type:"string"},host:{type:"string"},project:{type:"string"},ttl_seconds:{type:"number"}}}},{name:"life_heartbeat_complete",description:"Complete a local heartbeat lease and record a run.",inputSchema:{type:"object",required:["slot","host","project"],properties:{slot:{type:"string"},host:{type:"string"},project:{type:"string"},result:{type:"string"},evidence:{type:"object"},work_item_id:{type:"string"}}}},{name:"life_onboarding_status",description:"Return onboarding ritual status, interview themes, and file_generation_rules (IDENTITY/SOUL/USER/AGENTS formats). Call before drafting files.",inputSchema:{type:"object"}},...em,{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 ar(t);if(!o.ok)return ze(r,o);let n=AR(e.params);return ze(r,await RR(n.name??"",n.arguments??{},t))}if(vR.has(e.method)){let o=await ar(t);return o.ok?ze(r,await im(e.method,Oo(e.params),t)):ze(r,o)}return Bn(r,-32601,`Unknown method: ${e.method}`)}catch(o){return o instanceof wt?Bn(r,-32010,o.message,{code:o.code,id:o.id,from:o.from,to:o.to}):o instanceof Ie?Bn(r,-32011,o.message,{code:o.code,id:o.id,status:o.status}):Bn(r,-32603,o instanceof Error?o.message:"Unknown MCP error")}}async function sm(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&&wR(a,e).catch(s=>{process.stderr.write(`NativeSoul MCP response error: ${CR(s)}
1059
- `)})}})}async function wR(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"}})}
1060
- `);return}let o=await Jn(r,t);o&&process.stdout.write(`${JSON.stringify(o)}
1061
- `)}async function RR(e,t,r){let o=await im(e,t,r);return{content:[{type:"text",text:JSON.stringify(o)}]}}async function im(e,t,r){let o=am[e];if(!o)throw new Error(`Unknown tool: ${e}`);return await o(t,r)}async function SR(e){try{let t=await It({...e,readOnly:!0});try{await Ne({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 Ne({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 ze(e,t){return{jsonrpc:"2.0",id:e,result:t}}function Bn(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 AR(e){return Oo(e)}function Oo(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function C(e,t){return typeof e=="string"?e:t}function X(e){return typeof e=="string"?e:void 0}function Wn(e,t){return typeof e=="number"?e:t}function tm(e){return typeof e=="number"?e:void 0}function rm(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function om(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 ER(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 ul(e){if(e!==void 0){if(e==="low"||e==="normal"||e==="high"||e==="urgent")return e;throw new Error("Invalid work item priority")}}function _r(e,t){return typeof e=="boolean"?e:t}function PR(e){return _r(e.allHosts,!1)||_r(e.all_hosts,!1)}function xR(e){let t=Oo(e),r={};for(let[o,n]of Object.entries(t))typeof n=="string"&&(r[o]=n);return r}function jR(e){let r=Oo(e).hosts;if(!Array.isArray(r))return;let o=r.filter(n=>typeof n=="string");return o.length>0?{hosts:o}:void 0}function nm(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 IR(e){if(e==="approved"||e==="rejected")return e;throw new Error("life_approval_decide status must be approved or rejected")}async function TR(e){let t=await Ii(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 CR(e){return e instanceof Error?e.message:"Unknown MCP response error"}async function pl(e,t,r){let o=e.rest[0];if(!o){await sm(t);return}if(o==="manifest"){let n=Ot({host:Yp(e.flags),commandMode:qi(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 Jn({jsonrpc:"2.0",id:1,method:"initialize"},t),a=await Jn({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 oo({home:t,host:Ji(e.flags),targetPath:u(e.flags,"target"),apply:b(e.flags,"apply"),commandMode:qi(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 Hs({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 no({host:Ji(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 ml(e,t,r){let o=e.rest[0];if(o==="flush-hook"){let n=u(e.flags,"text")?"":await xo(),a=jo(n),s=u(e.flags,"text")??(typeof a=="string"?a:void 0),i=await ns({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 xo(),a=jo(n),s=u(e.flags,"prompt")??Bp(a),i=await as({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 rs({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 Bs({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 os(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 ne(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 Rt(t,n):o==="reject"?await St(t,n):o==="forget"?await At(t,n):await Br(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 Et({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 Pt(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 gl(e,t,r){let o=e.rest[0];if(o==="list"){let n=await is({home:t,status:Xp(e.flags),limit:E(e.flags,"limit")});m(n,r,NR(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,OR(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 cs({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 ps({home:t});m(a,r,Object.keys(a.aliases).length===0?"No project aliases":LR(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 ms({home:t,id:a,alias:s,apply:b(e.flags,"apply")});m(i,r,lm(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 gs({home:t,alias:a,apply:b(e.flags,"apply")});m(s,r,lm(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 ds({home:t,id:n,includeMemories:b(e.flags,"include-memories"),apply:b(e.flags,"apply"),confirm:u(e.flags,"confirm")});m(a,r,DR(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 us({home:t,id:n});m(a,r,HR(a)),a.found||(process.exitCode=1);return}if(o==="pin"){let n=u(e.flags,"cwd")??process.cwd(),a=await Ya({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 NR(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(`
1062
- `)}function OR(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??MR();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(`
1063
- `)}function MR(){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 LR(e){return Object.entries(e).map(([t,r])=>`${t} -> ${r}`).join(`
1064
- `)}function lm(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 DR(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(`
1065
- `):e.mode==="forget_memories"?`Project forgotten: ${e.id}; memories affected: ${e.memories_affected}`:`Project archived: ${e.id}`:`Project not found: ${e.id}`}function HR(e){return e.found?`Project reactivated: ${e.id}`:`Project not found: ${e.id}`}import{readFile as $R}from"node:fs/promises";async function hl(e,t,r){let o=e.rest[0];if(o==="status"){let n=await Kr(t);m(n,r,n.ritual_pending?"Onboarding ritual pending":"Onboarding complete");return}if(o==="activation"){let n=FR(e),a=await ys({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:UR(e.flags),recall_auto_trigger_keywords:fl(e.flags,"recall-keywords"),recall_auto_trigger_denylist:fl(e.flags,"recall-denylist"),candidate_auto_promotion_threshold:VR(e.flags),standing_order_templates:fl(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 Po({home:t,host:Xe(e.flags),surface:Ee(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 $R(n,"utf8")),s=await Gr({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 Xr({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 FR(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 UR(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 VR(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 fl(e,t){let r=u(e,t);if(r)return r.split(",").map(o=>o.trim()).filter(Boolean)}async function yl(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 pt({home:t,action:n,className:zp(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 ut(t);m(n,r,`${n.length} standing order(s)`);return}if(o==="packs"){await BR(e,t,r);return}if(o==="pretooluse-hook"){let n=await xo(),a=jo(n)??{},s=await mi({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 gi({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 BR(e,t,r){let o=e.rest[1];if(o==="list"){let n=await Ci();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 Ao(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 Ni({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"),a=await Di({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 Hi({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 bl(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 ho({home:t,project:u(e.flags,"project")??L(process.cwd(),t),title:n,description:u(e.flags,"description")??null,priority:Un(e.flags),source:"cli",tags:Wi(e.flags,"tags"),host:u(e.flags,"host")??null});m(a,r,`Work item created: ${a.id}`);return}if(o==="list"){let n=await yo({home:t,project:u(e.flags,"project"),status:Fn(e.flags),priority:Un(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=_l(e,"claim"),a=u(e.flags,"host")??"cli",s=await _o({home:t,id:n,host:a});m(s,r,`Work item ${s.id} claimed by host ${a}`);return}if(o==="update"){let n=_l(e,"update"),a=Fn(e.flags),s=Un(e.flags),i=u(e.flags,"host"),l=u(e.flags,"description"),c=Wi(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 bo({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=_l(e,"complete"),a=Fn(e.flags);if(a!==void 0&&a!=="done"&&a!=="failed")throw new Error("work complete --status must be done or failed");let s=await vo({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 _l(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 vl(){process.stdout.write(`nativesoul
1057
+ `)}function gR(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}async function To(){if(process.stdin.isTTY)return"";let e=[];for await(let t of process.stdin)e.push(Buffer.isBuffer(t)?t:Buffer.from(String(t)));return Buffer.concat(e).toString("utf8")}function Co(e){let t=e.trim();if(t.length!==0)try{return JSON.parse(t)}catch{return t}}function tm(e){if(typeof e=="string")return e;if(!e||Array.isArray(e)||typeof e!="object")return"";for(let t of["prompt","user_prompt","message","text","content"]){let r=e[t];if(typeof r=="string")return r}return""}function zi(e){if(e[0]==="--help"||e[0]==="-h")return{command:"help",rest:[],flags:new Map([["help",!0]])};let[t,...r]=e,o=[],n=new Map;for(let s=0;s<r.length;s+=1){let a=r[s];if(a)if(a==="-h")n.set("help",!0);else if(a.startsWith("--")){let i=a.slice(2),l=r[s+1];l&&!l.startsWith("--")?(n.set(i,l),s+=1):n.set(i,!0)}else o.push(a)}return{command:t,rest:o,flags:n}}function Yi(e){return e.command==="help"||b(e.flags,"help")}function b(e,t){return e.get(t)===!0}function u(e,t){let r=e.get(t);return typeof r=="string"?r:void 0}function E(e,t){let r=u(e,t);if(!r)return;let o=Number(r);return Number.isFinite(o)?o:void 0}var br=new Set(["codex","claude","grok","antigravity","gemini"]);function No(e){let t=u(e,"host")??"all";if(t==="all"||br.has(t))return t;throw new Error(`Unsupported adapter host: ${t}`)}function rm(e){let t=u(e,"host");if(t&&br.has(t))return t;throw new Error("This command requires --host codex|claude|grok|antigravity|gemini")}function ze(e){if(b(e,"all-hosts"))return"all";let t=u(e,"host")??"all";if(t==="all"||br.has(t))return t;throw new Error(`Unsupported install host: ${t}`)}function xe(e){let t=u(e,"surface");if(t!==void 0){if(t==="desktop"||t==="claude-desktop")return"claude-desktop";if(t==="claude-code")return"claude-code";throw new Error("install surface must be claude-code, desktop, or claude-desktop")}}function Oo(e){let t=u(e,"host");if(t&&br.has(t))return t;throw new Error("This command requires --host codex|claude|grok|antigravity|gemini")}function Mo(e){let t=u(e,"host");if(t!==void 0){if(br.has(t))return t;throw new Error("This command accepts --host codex|claude|grok|antigravity|gemini")}}function om(e){let t=u(e,"result");if(t!==void 0){if(t==="ok"||t==="error"||t==="blocked")return t;throw new Error("audit --result must be ok, error, or blocked")}}function nm(e){let t=u(e,"status");if(t!==void 0){if(t==="pending"||t==="approved"||t==="rejected")return t;throw new Error("approvals --status must be pending, approved, or rejected")}}function sm(e){let t=u(e,"format")??"json";if(t==="json"||t==="jsonl")return t;throw new Error("audit export --format must be json or jsonl")}function am(e){let t=u(e,"status");if(t!==void 0){if(t==="open"||t==="completed"||t==="dismissed"||t==="expired")return t;throw new Error("commitments --status must be open, completed, dismissed, or expired")}}function qn(e){let t=u(e,"status");if(t!==void 0){if(t==="inbox"||t==="assigned"||t==="in_progress"||t==="review"||t==="blocked"||t==="done"||t==="failed")return t;throw new Error("work --status must be inbox, assigned, in_progress, review, blocked, done, or failed")}}function Kn(e){let t=u(e,"priority");if(t!==void 0){if(t==="low"||t==="normal"||t==="high"||t==="urgent")return t;throw new Error("work --priority must be low, normal, high, or urgent")}}function Qi(e,t){let r=u(e,t);if(r!==void 0)return r.split(",").map(o=>o.trim()).filter(Boolean)}function im(e){let t=u(e,"status");if(t!==void 0){if(t==="active"||t==="archived"||t==="forgotten"||t==="all")return t;throw new Error("project list --status must be active, archived, forgotten, or all")}}function lm(e){let t=u(e,"class");if(t==="read_local"||t==="probe_external"||t==="write_local"||t==="write_project"||t==="external_write"||t==="destructive"||t==="identity_policy_change")return t;throw new Error("policy evaluate requires --class read_local|probe_external|write_local|write_project|external_write|destructive|identity_policy_change")}function Gn(e){let t=u(e,"mode")??"leader";if(t==="leader"||t==="federated"||t==="per-project")return t;throw new Error("schedule --mode must be leader, federated, or per-project")}function cm(e){let t=u(e,"host")??"generic";if(t==="generic"||br.has(t))return t;throw new Error(`Unsupported MCP manifest host: ${t}`)}function Zi(e){return Oo(e)}function el(e){let t=u(e,"command-mode")??"package";if(t==="package"||t==="local"||t==="absolute")return t;throw new Error(`Unsupported MCP command mode: ${t}`)}function dm(e){let t=u(e,"format")??"json";if(t==="json"||t==="inject"||t==="cache")return t;throw new Error("bootstrap --format must be json, inject, or cache")}async function tl(e,t,r){let o=e.rest[0]??"status",n={home:t,host:ze(e.flags),surface:xe(e.flags),targetRoot:u(e.flags,"target-root")};if(o==="status"){let s=await _r(n);m(s,r,`Activation status: ${s.overall_status}`);return}if(o==="plan"){let s=await jo({...n,profile:fR(e)});m(s,r,`Activation plan: ${s.plan.length} dry-run action(s)`);return}if(o==="heartbeat"){let s=e.rest[1]??"plan",a={home:t,host:ze(e.flags),surface:xe(e.flags),targetRoot:u(e.flags,"target-root"),leaderHost:hR(e),mode:Gn(e.flags),cadence:u(e.flags,"cadence"),projectScope:u(e.flags,"project")??u(e.flags,"project-scope"),behavior:yR(e),user_confirmed:b(e.flags,"user-confirmed")};if(s==="plan"){let i=await Wn(a);m(i,r,i.recommended_leader?`Heartbeat leader recommended: ${i.recommended_leader.host}`:"Heartbeat native scheduler blocked by host");return}if(s==="apply"){let i=await Gi({...a,dry_run:!b(e.flags,"apply")});m(i,r,i.applied?"Heartbeat activation applied":`Heartbeat activation ${i.action}`);return}throw new Error("activate heartbeat requires plan or apply")}throw new Error("activate requires status, plan, or heartbeat")}function fR(e){let t=u(e.flags,"profile");if(t!==void 0){if(t==="quickstart"||t==="advanced")return t;throw new Error("activate plan requires --profile quickstart|advanced")}}function hR(e){let t=u(e.flags,"leader-host");if(t!==void 0){if(t==="codex"||t==="claude"||t==="grok"||t==="antigravity"||t==="gemini")return t;throw new Error("activate heartbeat requires --leader-host codex|claude|grok|antigravity|gemini")}}function yR(e){let t=u(e.flags,"behavior");if(t!==void 0){if(t==="read_only"||t==="approval_required")return t;throw new Error("activate heartbeat requires --behavior read_only|approval_required")}}async function rl(e,t){let r=e.rest[0],o=No(e.flags);if(r==="hot-scan"){let n=await kt({home:u(e.flags,"home"),host:o,delta:b(e.flags,"delta"),ttlSeconds:E(e.flags,"ttl-seconds")}),s=n.reduce((a,i)=>a+i.count,0);m(n,t,`Hot-scanned ${s} capability record(s)`);return}if(r==="scan"){let n=await Ir(o);m(n,t,`Scanned ${n.length} adapter(s)`);return}if(r==="doctor"){let n=await Tr(o),s=n.reduce((a,i)=>a+i.diagnostics.length,0);m(n,t,`Adapter doctor found ${s} diagnostic(s)`);return}if(r==="managed-block"){let n=rm(e.flags),s=await Cr(n);m(s,t,`Managed block preview for ${s.host}: ${s.targetPath}`);return}if(r==="install-managed-block"){let n=Oo(e.flags),s=await Nr({home:u(e.flags,"home"),host:n,apply:b(e.flags,"apply"),targetPath:u(e.flags,"target")});m(s,t,`${s.dryRun?"Planned":"Applied"} managed block for ${s.host}: ${s.action}`);return}if(r==="rollback-managed-block"){let n=u(e.flags,"snapshot");if(!n)throw new Error("adapters rollback-managed-block requires --snapshot <path>");let s=await zs({home:u(e.flags,"home"),snapshotPath:n,apply:b(e.flags,"apply")});m(s,t,`${s.dryRun?"Planned rollback":"Rolled back"} managed block target ${s.targetPath}`);return}throw new Error("adapters requires scan, hot-scan, doctor, or managed-block")}async function ol(e,t,r){let o=e.rest[0];if(o==="list"){let n=Un({home:t,status:nm(e.flags)});m(n,r,bR(n.approvals,n.warning));return}if(o==="show"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error("approvals show requires <id|.>");let s=n==="."?_R(t):Fn({home:t,id:n}).approval;m(s,r,s?vR(s):`Approval not found: ${n}`),s||(process.exitCode=1);return}if(o==="approve"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error("approvals approve requires <id>");let s=Fn({home:t,id:n}).approval;if(!s){m({approval:null,applied:!1,action:"approve",warning:"approval_not_found"},r,`Approval not found: ${n}`),process.exitCode=1;return}if(!b(e.flags,"confirm")){m({approval:s,applied:!1,action:"approve",warning:"requires --confirm"},r,`Approval approve dry-run: ${s.id} (${s.action}); rerun with --confirm to apply.`);return}let a=await gr({home:t,id:n,status:"approved",reviewer:"cli",reason:u(e.flags,"reason")??null});m(a.approval,r,a.approval?`Approval approved: ${a.approval.id}`:`Approval not found: ${n}`),a.approval||(process.exitCode=1);return}if(o==="reject"){let n=e.rest[1]??u(e.flags,"id"),s=u(e.flags,"reason");if(!n||!s)throw new Error("approvals reject requires <id> --reason <text>");let a=await gr({home:t,id:n,status:"rejected",reviewer:"cli",reason:s});m(a.approval,r,a.approval?`Approval rejected: ${a.approval.id}`:`Approval not found: ${n}`),a.approval||(process.exitCode=1);return}throw new Error("approvals requires list, show, approve, or reject")}function _R(e){return Un({home:e,status:"pending"}).approvals[0]??null}function bR(e,t){return t?`Approvals unavailable: ${t}`:e.length===0?"No approvals found":[`${e.length} approval(s)`,...e.map(r=>`${r.id} ${r.action} ${r.class} ${r.target??"-"} ${r.status} ${r.reviewer??"-"} ${r.created_at}`)].join(`
1058
+ `)}function vR(e){return[`Approval ${e.id}`,`Action: ${e.action}`,`Class: ${e.class}`,`Target: ${e.target??"-"}`,`Project: ${e.project??"-"}`,`Host: ${e.host??"-"}`,`Status: ${e.status}`,`Reviewer: ${e.reviewer??"-"}`,`Reason: ${e.reason??"-"}`,`Created: ${e.created_at}`,`Decided: ${e.decided_at??"-"}`].join(`
1059
+ `)}async function nl(e,t,r){let o=e.rest[0],n={home:t,type:u(e.flags,"type"),result:om(e.flags),limit:E(e.flags,"limit")};if(o==="list"){let s=await Jo(n);m(s,r,`${s.length} audit event(s)`);return}if(o==="export"){let s=sm(e.flags),a=await Is({...n,format:s});if(s==="jsonl"){process.stdout.write(a.events.map(i=>JSON.stringify(i)).join(`
1060
+ `)),a.events.length>0&&process.stdout.write(`
1061
+ `);return}process.stdout.write(`${JSON.stringify(a.events,null,2)}
1062
+ `);return}throw new Error("audit requires list or export")}async function sl(e,t,r){let o=e.rest[0];if(o==="refresh"){let n=await kt({home:t,host:No(e.flags),delta:b(e.flags,"delta"),ttlSeconds:E(e.flags,"ttl-seconds")}),s=n.reduce((a,i)=>a+i.count,0);m(n,r,`Refreshed ${s} capability record(s)`);return}if(o==="learn"){let n=await ea({home:t,host:No(e.flags),limit:E(e.flags,"limit")});m(n,r,`Learned ${n.generated} capability card(s), changed ${n.changed}`);return}if(o==="list"){let n=await Se({home:t,host:Mo(e.flags),readyOnly:b(e.flags,"ready-only"),limit:E(e.flags,"limit")});m(n,r,`${n.length} capability record(s)`);return}if(o==="search"){let n=e.rest.slice(1).join(" ")||(u(e.flags,"query")??""),s=await Lr({home:t,query:n,host:b(e.flags,"all-hosts")?void 0:Mo(e.flags)??"codex",readyOnly:b(e.flags,"ready-only"),limit:E(e.flags,"limit")});m(s,r,`${s.length} capability record(s) found`);return}if(o==="show"){let n=e.rest[1]??u(e.flags,"uid");if(!n)throw new Error("capabilities show requires <uid> or --uid <uid>");let s=await Dr({home:t,uid:n});if(!s)throw new Error(`Capability not found: ${n}`);m(s,r,`Capability ${s.uid}: ready=${s.ready}`);return}throw new Error("capabilities requires refresh, learn, list, search, or show")}async function al(e,t,r){let o=e.rest[0];if(o==="create"){let n=u(e.flags,"summary")??u(e.flags,"text");if(!n)throw new Error("commitments create requires --summary <text>");let s=u(e.flags,"project")??L(process.cwd(),t),a=await Hr({home:t,project:s,summary:n,dueAt:u(e.flags,"due-at")??null,ttlSeconds:E(e.flags,"ttl-seconds")});m(a,r,a.created?`Commitment created: ${a.commitment.id}`:`Commitment deduped: ${a.commitment.id}`);return}if(o==="list"){let n=await $r({home:t,project:u(e.flags,"project"),status:am(e.flags),includeExpired:b(e.flags,"include-expired"),limit:E(e.flags,"limit")});m(n,r,`${n.length} commitment(s)`);return}if(o==="complete"||o==="dismiss"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error(`commitments ${o} requires <id> or --id <id>`);let s=o==="complete"?await Fr(t,n):await ta(t,n);m(s,r,`Commitment ${o}d: ${s.id}`);return}throw new Error("commitments requires create, list, complete, or dismiss")}async function cl(e,t,r){let o=u(e.flags,"project")??te(process.cwd(),t).id,n=So({home:t,project:o,host:u(e.flags,"host"),since:u(e.flags,"since"),until:u(e.flags,"until"),groupBy:kR(e.flags),limit:E(e.flags,"limit")});m(n,r,wR(n))}function kR(e){let t=u(e,"group-by");if(t===void 0)return"total";if(t==="project"||t==="host"||t==="day")return t;throw new Error("cost --group-by must be project, host, or day")}function wR(e){let t=[`NativeSoul cost report (${e.filters.group_by})`,`Project: ${e.filters.project??"all"}`,`Host: ${e.filters.host??"all"}`,`Window: ${e.filters.since??"beginning"} -> ${e.filters.until??"now"}`,`Total reported: ${il(e.totals)}`,`Coverage: ${ll(e.totals.reported_runs,e.totals.total_runs)}`],r=e.groups.length>0?e.groups:e.by_host;if(r.length>0){t.push("Groups:");for(let o of r)t.push(`- ${o.label}: ${il(o)} (${ll(o.reported_runs,o.total_runs)})`)}if(e.by_session.length>0){t.push("Sessions:");for(let o of e.by_session)t.push(`- ${o.label}: ${il(o)} (${ll(o.reported_runs,o.total_runs)})`)}return t.join(`
1063
+ `)}function il(e){return e.cost_reported_runs===0?"not reported by host":RR(e.total_usd)}function ll(e,t){let r=t===0?0:Math.round(e/t*100);return`${e}/${t} reported (${r}%)`}function RR(e){return`$${e.toFixed(2)}`}async function dl(e,t,r){let o=e.rest[0];if(o==="data"){let n=SR(e.flags),s=await Ao({home:t,project:u(e.flags,"project"),host:u(e.flags,"host"),limit:E(e.flags,"limit"),since:u(e.flags,"since"),until:u(e.flags,"until")});m(n?AR(s,n):s,r,`Dashboard data ready: ${s.initialized?"initialized":"not initialized"}`);return}if(o==="viewer"){let n=await Pi({home:t,project:u(e.flags,"project"),host:u(e.flags,"host"),limit:E(e.flags,"limit"),since:u(e.flags,"since"),until:u(e.flags,"until"),output:u(e.flags,"output")});m(n,r,`Dashboard viewer written: ${n.outputPath}`);return}throw new Error("dashboard requires data or viewer")}function SR(e){let t=u(e,"section");if(t!==void 0){if(t==="work"||t==="approvals"||t==="cost")return t;throw new Error("dashboard --section must be work, approvals, or cost")}}function AR(e,t){return{schema_version:e.schema_version,generated_at:e.generated_at,filters:e.filters,read_only:e.read_only,[t]:e[t]}}async function ul(e,t,r){let o=e.rest[0];if(o==="m7"||o==="report"){let n=await pr({home:t,project:u(e.flags,"project"),host:u(e.flags,"host"),limit:E(e.flags,"limit")});m(n,r,n.m7_gate.feedback_validated?"M7 feedback report ready":"M7 feedback report has gaps");return}throw new Error("feedback requires m7 or report")}async function pl(e,t,r){let o=e.rest[0];if(o==="claim"){let n=u(e.flags,"slot")??e.rest[1];if(!n)throw new Error("heartbeat claim requires --slot <id>");let s=u(e.flags,"project")??L(process.cwd(),t),a=u(e.flags,"host")??"codex",i=await Eo({home:t,slot:n,host:a,project:s,ttlSeconds:E(e.flags,"ttl-seconds")});m(i,r,i.claimed?`Heartbeat lease claimed: ${i.lease.id}`:"HEARTBEAT_OK");return}if(o==="complete"){let n=u(e.flags,"slot")??e.rest[1];if(!n)throw new Error("heartbeat complete requires --slot <id>");let s=u(e.flags,"project")??L(process.cwd(),t),a=u(e.flags,"host")??"codex",i=await Po({home:t,slot:n,host:a,project:s,result:u(e.flags,"result")??"HEARTBEAT_OK",evidence:u(e.flags,"evidence")?{note:u(e.flags,"evidence")??""}:{},workItemId:u(e.flags,"work-item")});m(i,r,`Heartbeat completed: ${i.lease.id}`);return}if(o==="status"){let n=await ji({home:t,project:u(e.flags,"project"),limit:E(e.flags,"limit")});m(n,r,`${n.length} heartbeat lease(s)`);return}throw new Error("heartbeat requires claim, complete, or status")}async function ml(e,t,r){let o=e.rest[0];if(o==="reconcile"){let n=Oo(e.flags),s=u(e.flags,"target-root"),a=await ct({home:t,host:n,surface:xe(e.flags),mode:Gn(e.flags),apply:b(e.flags,"apply"),hostConfigRoot:s?Ke(n,s):void 0,targetRoot:s});m(a,r,a.applied?`Schedule reconciled: ${a.schedule.id}`:`Schedule reconcile planned: ${a.schedule.id}`);return}if(o==="list"){let n=await lo({home:t,host:Mo(e.flags),limit:E(e.flags,"limit")});m(n,r,`${n.length} schedule record(s)`);return}if(o==="disable"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error("schedule disable requires <id> or --id <id>");let s=await Ka({home:t,id:n,apply:b(e.flags,"apply")});m(s,r,s.applied?`Schedule disabled: ${n}`:`Schedule disable planned: ${n}`);return}throw new Error("schedule requires reconcile, list, or disable")}async function gl(e,t,r){if(e.rest[0]==="openclaw"){let s=u(e.flags,"source")??e.rest[1];if(!s)throw new Error("import openclaw requires --source <path>");let a=await ei({home:t,sourcePath:s,cwd:u(e.flags,"cwd")??process.cwd(),project:u(e.flags,"project"),apply:b(e.flags,"apply"),limit:E(e.flags,"limit")});m(a,r,a.applied?`OpenClaw import applied: ${a.persisted_memories.length} candidate(s), ${a.warnings.length} warning(s)`:`OpenClaw import dry-run: ${a.mapped_records.length} mapped, ${a.skipped_records.length} skipped, ${a.warnings.length} warning(s)`);return}let n=ER(e);if(n){let s=u(e.flags,"source")??e.rest[1];if(!s)throw new Error("import native requires --source <path>");let a=await ni({home:t,host:n,sourcePath:s,cwd:u(e.flags,"cwd")??process.cwd(),project:u(e.flags,"project"),apply:b(e.flags,"apply"),limit:E(e.flags,"limit")});m(a,r,a.applied?`${n} import applied: ${a.persisted_memories.length} candidate(s), ${a.warnings.length} warning(s), ${a.conflicts.length} conflict(s)`:`${n} import dry-run: ${a.mapped_records.length} mapped, ${a.skipped_records.length} skipped, ${a.conflicts.length} conflict(s), ${a.warnings.length} warning(s)`);return}throw new Error("import requires openclaw, native --host <host>, or a supported host alias")}function ER(e){let t=e.rest[0],r=t==="native"?u(e.flags,"host"):t;return r==="nativesoul"||r==="codex"||r==="claude"||r==="gemini"||r==="grok"||r==="antigravity"?r:null}import{spawnSync as PR}from"node:child_process";async function fl(e,t,r){let[o,n]=e.rest;if(o==="activate"){if(!n)throw new Error("license activate requires a license key");let s=await ii({home:t,key:n}),a=s.ok?{ok:!0,action:"activate",license:Lo(s.license),message:"License activated via Dodo"}:{ok:!1,action:"activate",reason:s.reason,license:Lo(s.license),message:`License activation failed: ${s.reason}`};m(a,r,a.message??"License activated via Dodo"),a.ok||(process.exitCode=1);return}if(o==="status"){let s=await Ee(t),a=s?xR(s):de,i=await IR(e),l=await mi({home:t,currentVersion:Ut,latestKnownVersion:i}),c={ok:!0,action:"status",license:Lo(a),update_entitlement:l,message:TR(a,l,b(e.flags,"check-updates"))};m(c,r,c.message??`License status: ${a.state}`);return}if(o==="deactivate"){let s=await ci({home:t}),a=s.ok?{ok:!0,action:"deactivate",license:Lo(s.license),message:"License deactivated via Dodo; local NativeSoul data was not removed"}:{ok:!1,action:"deactivate",reason:s.reason,license:Lo(s.license),message:`License deactivation failed: ${s.reason}`};m(a,r,a.message??"License deactivated via Dodo; local NativeSoul data was not removed"),a.ok||(process.exitCode=1);return}throw new Error("license requires activate, status, or deactivate")}function xR(e){return{state:e.state,license_key:e.license_key,instance_id:e.instance_id,purchased_at:e.purchased_at??null,version_at_activation:e.version_at_activation??null,updates_until:e.updates_until,last_checked_at:e.last_checked_at,source:e.source}}function Lo(e){return{...e,license_key:e.license_key?jR(e.license_key):null}}function jR(e){return e.length<=8?"[REDACTED_LICENSE_KEY]":`${e.slice(0,4)}\u2026${e.slice(-4)}`}async function IR(e){let t=u(e.flags,"latest-known-version");if(t)return t;if(!b(e.flags,"check-updates"))return;let r=process.platform==="win32"?"npm.cmd":"npm",o=PR(r,["view","nativesoul","version","--registry=https://registry.npmjs.org/"],{encoding:"utf8",timeout:15e3,shell:process.platform==="win32"});if(o.status===0)return o.stdout.trim()||void 0}function TR(e,t,r){let o=t.updates_status==="unknown"?"unknown":t.updates_until??"unknown",n=t.newer_major_available==="unknown"?r?"unknown":"unknown \u2014 run with `--check-updates`":t.newer_major_available?"available":"not detected",s=[`License status: ${e.state}`,e.state==="licensed"?"Perpetual build: active \u2014 your licence keeps working.":"Perpetual build: unavailable until activated.",`Updates window: ${o}`,`Newer major: ${n}`];return t.soft_nudge.visible&&t.soft_nudge.message&&s.push(t.soft_nudge.message),s.join(`
1064
+ `)}async function hl(e,t,r){let o=await pi({page:u(e.flags,"page")});m(o,r,o.ok?`Marketing audit PASS: ${o.summary.claims_checked} claim(s), ${o.summary.pages_scanned} page(s)`:`Marketing audit FAIL: ${o.issues.length} issue(s)`),o.ok||(process.exitCode=1)}var um={life_activation_status:async(e,t)=>await _r({home:t,host:yl(e.host),targetRoot:gt(e.target_root)??gt(e.targetRoot)}),life_activation_plan:async(e,t)=>await jo({home:t,host:yl(e.host),targetRoot:gt(e.target_root)??gt(e.targetRoot),profile:CR(e.profile)}),life_activation_verify:async(e,t)=>await Io({home:t,host:yl(e.host),surface:NR(e.surface),targetRoot:gt(e.target_root)??gt(e.targetRoot),projectCwd:gt(e.project_cwd)??gt(e.projectCwd),apply:_l(e.apply),userConfirmed:_l(e["user-confirmed"]),retainTestData:_l(e["retain-test-data"])})},pm=[{name:"life_activation_status",description:"Return activation status by component, including bootstrap, MCP, plugins/hooks, heartbeat, recall, memory, and cross-host verification.",inputSchema:{type:"object",properties:{host:{type:"string"},target_root:{type:"string"},targetRoot:{type:"string"}}}},{name:"life_activation_plan",description:"Return a read-only dry-run activation plan with exact files, settings, scheduler actions, and approvals.",inputSchema:{type:"object",properties:{host:{type:"string"},profile:{type:"string"},target_root:{type:"string"},targetRoot:{type:"string"}}}},{name:"life_activation_verify",description:"Run cross-host activation verification for bootstrap cache, MCP, scheduler evidence, and memory recall.",inputSchema:{type:"object",properties:{host:{type:"string"},surface:{type:"string"},project_cwd:{type:"string"},projectCwd:{type:"string"},target_root:{type:"string"},targetRoot:{type:"string"},apply:{type:"boolean"},"user-confirmed":{type:"boolean"},"retain-test-data":{type:"boolean"}}}}];function yl(e){if(e===void 0)return"all";if(e==="all"||e==="codex"||e==="claude"||e==="grok"||e==="antigravity"||e==="gemini")return e;throw new Error("Invalid activation host")}function CR(e){if(e!==void 0){if(e==="quickstart"||e==="advanced")return e;throw new Error("Invalid activation profile")}}function NR(e){if(e!==void 0){if(e==="desktop"||e==="claude-desktop")return"claude-desktop";if(e==="claude-code")return"claude-code";throw new Error("activation verify surface must be claude-code, desktop, or claude-desktop")}}function gt(e){return typeof e=="string"?e:void 0}function _l(e){return e===!0}var OR=["2025-11-25","2024-11-05","2024-10-07"],ym={...um,life_status:(e,t)=>Jn(t),life_bootstrap:async(e,t)=>await $R({home:t,host:C(e.host,"codex"),cwd:C(e.cwd,process.cwd()),query:z(e.query)}),life_recall:async(e,t)=>await Pt(t,C(e.query,""),C(e.project,"default"),zn(e.limit,5)),life_remember_propose:async(e,t)=>await ae(t,{project:C(e.project,"default"),content:C(e.content,""),type:z(e.type),confidence:mm(e.confidence),source:{host:"mcp",session_id:"local"}}),life_memory_promote:async(e,t)=>await Rt(t,C(e.id,"")),life_memory_reject:async(e,t)=>await St(t,C(e.id,"")),life_memory_forget:async(e,t)=>await At(t,C(e.id,"")),life_memory_expire:async(e,t)=>await Jr(t,C(e.id,"")),life_capability_search:async(e,t)=>await Lr({home:t,query:C(e.query,""),host:VR(e)?void 0:z(e.host)??"codex",readyOnly:vr(e.readyOnly,!1),limit:zn(e.limit,8)}),life_capability_status:async(e,t)=>{let r=C(e.uid,""),o=r?await Dr({home:t,uid:r}):null;if(!o)throw new Error(`Capability not found: ${r}`);return o},life_policy_evaluate:async(e,t)=>await pt({home:t,action:C(e.action,""),className:hm(e.class),target:z(e.target)}),life_approval_request:async(e,t)=>await qR({home:t,action:C(e.action,""),className:hm(e.class),target:z(e.target),project:z(e.project),host:z(e.host)}),life_approval_decide:async(e,t)=>{let r=C(e.id,""),o=await gr({home:t,id:r,status:JR(e.status),reviewer:C(e.host,"mcp"),reason:z(e.reason)??null});if(!o.approval)throw new Error(`Approval not found: ${r}`);return o},life_commitment_create:async(e,t)=>await Hr({home:t,project:C(e.project,"default"),summary:C(e.summary,""),dueAt:z(e.due_at),ttlSeconds:mm(e.ttl_seconds),source:{host:"mcp",session_id:"local"}}),life_commitment_complete:async(e,t)=>await Fr(t,C(e.id,"")),life_work_item_create:async(e,t)=>await bo({home:t,project:C(e.project,"default"),title:C(e.title,""),description:z(e.description),priority:bl(e.priority),source:"mcp",tags:gm(e.tags),host:z(e.host)}),life_work_item_list:async(e,t)=>await vo({home:t,project:z(e.project),status:fm(e.status),priority:bl(e.priority),assignedHost:z(e.host),limit:zn(e.limit,50)}),life_work_item_claim:async(e,t)=>await ko({home:t,id:C(e.id,""),host:C(e.host,"mcp")}),life_work_item_update:async(e,t)=>await wo({home:t,id:C(e.id,""),status:fm(e.status),priority:bl(e.priority),assignedHost:z(e.host),description:z(e.description),tags:e.tags===void 0?void 0:gm(e.tags)}),life_work_item_complete:async(e,t)=>await Ro({home:t,id:C(e.id,""),status:UR(e.status)}),life_heartbeat_claim:async(e,t)=>await Eo({home:t,slot:C(e.slot,""),host:C(e.host,"codex"),project:C(e.project,"default"),ttlSeconds:zn(e.ttl_seconds,1500)}),life_heartbeat_complete:async(e,t)=>await Po({home:t,slot:C(e.slot,""),host:C(e.host,"codex"),project:C(e.project,"default"),result:e.result??"HEARTBEAT_OK",evidence:e.evidence??{},workItemId:z(e.work_item_id)}),life_onboarding_status:async(e,t)=>await Xr(t),life_onboard_apply:async(e,t)=>await zr({home:t,dry_run:vr(e.dry_run,!0),user_confirmed:vr(e.user_confirmed,!1),files:BR(e.files),config_patch:WR(e.config_patch)}),life_onboard_complete:async(e,t)=>await Yr({home:t,archive:e.archive===void 0?!0:vr(e.archive,!0)})},MR=new Set(Object.keys(ym));function LR(e){return e.method?.startsWith("notifications/")?!0:!Object.prototype.hasOwnProperty.call(e,"id")}async function Yn(e,t){if(LR(e))return null;let r=e.id??null;try{if(e.method==="initialize"){let o=Do(e.params),n=z(o.protocolVersion),s=n&&OR.includes(n)?n:"2024-11-05";return Ye(r,{protocolVersion:s,serverInfo:{name:"nativesoul",version:"0.1.0"},capabilities:{tools:{}}})}if(e.method==="ping")return Ye(r,{});if(e.method==="resources/list")return Ye(r,{resources:[]});if(e.method==="prompts/list")return Ye(r,{prompts:[]});if(e.method==="tools/list")return Ye(r,{tools:[{name:"life_status",description:"Return local NativeSoul health and counts.",inputSchema:{type:"object"}},{name:"life_bootstrap",description:"Return compact bootstrap context for a host and cwd.",inputSchema:{type:"object",required:["host","cwd"],properties:{host:{type:"string"},cwd:{type:"string"},query:{type:"string"}}}},{name:"life_recall",description:"Search project-scoped memory.",inputSchema:{type:"object",required:["query","project"],properties:{query:{type:"string"},project:{type:"string"},limit:{type:"number"}}}},{name:"life_remember_propose",description:"Create a redacted local candidate memory for a project.",inputSchema:{type:"object",required:["project","content"],properties:{project:{type:"string"},content:{type:"string"},type:{type:"string"},confidence:{type:"number"}}}},{name:"life_memory_promote",description:"Promote a candidate memory to active status.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_memory_reject",description:"Reject a candidate memory.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_memory_forget",description:"Forget an active memory.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_memory_expire",description:"Expire an active memory.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_capability_search",description:"Search persisted local capability records.",inputSchema:{type:"object",required:["query"],properties:{query:{type:"string"},host:{type:"string"},allHosts:{type:"boolean"},all_hosts:{type:"boolean"},readyOnly:{type:"boolean"},limit:{type:"number"}}}},{name:"life_capability_status",description:"Return one persisted capability record by uid.",inputSchema:{type:"object",required:["uid"],properties:{uid:{type:"string"}}}},{name:"life_policy_evaluate",description:"Evaluate a proposed action against local policy and standing orders.",inputSchema:{type:"object",required:["action","class"],properties:{action:{type:"string"},class:{type:"string"},target:{type:"string"}}}},{name:"life_approval_request",description:"Request approval for a sensitive action. If blocked, stop and return control to the human; there is no server or polling in this turn-based protocol.",inputSchema:{type:"object",required:["action","class"],properties:{action:{type:"string"},class:{type:"string"},target:{type:"string"},project:{type:"string"},host:{type:"string"}}}},{name:"life_approval_decide",description:"Record a human-driven approval decision. Acting agents must not self-approve; use this only from a human-operated host turn.",inputSchema:{type:"object",required:["id","status"],properties:{id:{type:"string"},status:{type:"string",enum:["approved","rejected"]},reason:{type:"string"},host:{type:"string"}}}},{name:"life_commitment_create",description:"Create a local project-scoped commitment with optional TTL.",inputSchema:{type:"object",required:["project","summary"],properties:{project:{type:"string"},summary:{type:"string"},due_at:{type:"string"},ttl_seconds:{type:"number"}}}},{name:"life_commitment_complete",description:"Complete a local commitment by id.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_work_item_create",description:"Create a local project-scoped work item.",inputSchema:{type:"object",required:["project","title"],properties:{project:{type:"string"},title:{type:"string"},description:{type:"string"},priority:{type:"string",enum:["low","normal","high","urgent"]},tags:{type:"array",items:{type:"string"}},host:{type:"string"}}}},{name:"life_work_item_list",description:"List local work items with optional filters.",inputSchema:{type:"object",properties:{project:{type:"string"},status:{type:"string",enum:["inbox","assigned","in_progress","review","blocked","done","failed"]},priority:{type:"string",enum:["low","normal","high","urgent"]},host:{type:"string"},limit:{type:"number"}}}},{name:"life_work_item_claim",description:"Claim one work item for a host.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},host:{type:"string"}}}},{name:"life_work_item_update",description:"Update one work item through the shared status machine.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},status:{type:"string",enum:["inbox","assigned","in_progress","review","blocked","done","failed"]},priority:{type:"string",enum:["low","normal","high","urgent"]},host:{type:"string"},description:{type:"string"},tags:{type:"array",items:{type:"string"}}}}},{name:"life_work_item_complete",description:"Complete one work item as done or failed.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},status:{type:"string",enum:["done","failed"]}}}},{name:"life_heartbeat_claim",description:"Claim a local heartbeat lease for a project and slot.",inputSchema:{type:"object",required:["slot","host","project"],properties:{slot:{type:"string"},host:{type:"string"},project:{type:"string"},ttl_seconds:{type:"number"}}}},{name:"life_heartbeat_complete",description:"Complete a local heartbeat lease and record a run.",inputSchema:{type:"object",required:["slot","host","project"],properties:{slot:{type:"string"},host:{type:"string"},project:{type:"string"},result:{type:"string"},evidence:{type:"object"},work_item_id:{type:"string"}}}},{name:"life_onboarding_status",description:"Return onboarding ritual status, interview themes, and file_generation_rules (IDENTITY/SOUL/USER/AGENTS formats). Call before drafting files.",inputSchema:{type:"object"}},...pm,{name:"life_onboard_apply",description:"Dry-run or apply AI-generated onboarding human files.",inputSchema:{type:"object",required:["files"],properties:{dry_run:{type:"boolean"},user_confirmed:{type:"boolean"},files:{type:"object"},config_patch:{type:"object"}}}},{name:"life_onboard_complete",description:"Archive BOOTSTRAP.md and mark onboarding ritual complete.",inputSchema:{type:"object",properties:{archive:{type:"boolean"}}}}]});if(e.method==="tools/call"){let o=await ir(t);if(!o.ok)return Ye(r,o);let n=FR(e.params);return Ye(r,await HR(n.name??"",n.arguments??{},t))}if(MR.has(e.method)){let o=await ir(t);return o.ok?Ye(r,await bm(e.method,Do(e.params),t)):Ye(r,o)}return Xn(r,-32601,`Unknown method: ${e.method}`)}catch(o){return o instanceof wt?Xn(r,-32010,o.message,{code:o.code,id:o.id,from:o.from,to:o.to}):o instanceof Ce?Xn(r,-32011,o.message,{code:o.code,id:o.id,status:o.status}):Xn(r,-32603,o instanceof Error?o.message:"Unknown MCP error")}}async function _m(e){let t="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>{t+=r;let o=t.split(/\r?\n/u);t=o.pop()??"";for(let n of o){let s=n.trim();s&&DR(s,e).catch(a=>{process.stderr.write(`NativeSoul MCP response error: ${KR(a)}
1065
+ `)})}})}async function DR(e,t){let r;try{r=JSON.parse(e)}catch{process.stdout.write(`${JSON.stringify({jsonrpc:"2.0",id:null,error:{code:-32700,message:"Parse error"}})}
1066
+ `);return}let o=await Yn(r,t);o&&process.stdout.write(`${JSON.stringify(o)}
1067
+ `)}async function HR(e,t,r){let o=await bm(e,t,r);return{content:[{type:"text",text:JSON.stringify(o)}]}}async function bm(e,t,r){let o=ym[e];if(!o)throw new Error(`Unknown tool: ${e}`);return await o(t,r)}async function $R(e){try{let t=await It({...e,readOnly:!0});try{await Me({home:e.home,host:e.host,outcome:"succeeded",tier:"B",cwd:t.project.cwd,project:t.project.id,tokensUsed:t.context_budget.tokens_used,tokensMax:t.context_budget.tokens_max,source:"mcp-life-bootstrap",warnings:t.warnings})}catch{}return t}catch(t){try{await Me({home:e.home,host:e.host,outcome:"failed",tier:"B",cwd:e.cwd,project:null,source:"mcp-life-bootstrap",error:t})}catch{}throw t}}function Ye(e,t){return{jsonrpc:"2.0",id:e,result:t}}function Xn(e,t,r,o){return{jsonrpc:"2.0",id:e,error:o===void 0?{code:t,message:r}:{code:t,message:r,data:o}}}function FR(e){return Do(e)}function Do(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function C(e,t){return typeof e=="string"?e:t}function z(e){return typeof e=="string"?e:void 0}function zn(e,t){return typeof e=="number"?e:t}function mm(e){return typeof e=="number"?e:void 0}function gm(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function fm(e){if(e!==void 0){if(e==="inbox"||e==="assigned"||e==="in_progress"||e==="review"||e==="blocked"||e==="done"||e==="failed")return e;throw new Error("Invalid work item status")}}function UR(e){if(e!==void 0){if(e==="done"||e==="failed")return e;throw new Error("Work item terminal status must be done or failed")}}function bl(e){if(e!==void 0){if(e==="low"||e==="normal"||e==="high"||e==="urgent")return e;throw new Error("Invalid work item priority")}}function vr(e,t){return typeof e=="boolean"?e:t}function VR(e){return vr(e.allHosts,!1)||vr(e.all_hosts,!1)}function BR(e){let t=Do(e),r={};for(let[o,n]of Object.entries(t))typeof n=="string"&&(r[o]=n);return r}function WR(e){let r=Do(e).hosts;if(!Array.isArray(r))return;let o=r.filter(n=>typeof n=="string");return o.length>0?{hosts:o}:void 0}function hm(e){if(e==="read_local"||e==="probe_external"||e==="write_local"||e==="write_project"||e==="external_write"||e==="destructive"||e==="identity_policy_change")return e;throw new Error("Invalid policy action class")}function JR(e){if(e==="approved"||e==="rejected")return e;throw new Error("life_approval_decide status must be approved or rejected")}async function qR(e){let t=await Hi(e),r=t.approval?.id??null;return t.evaluation.decision==="approval_required"?{blocked:!0,allowed:!1,decision:"approval_required",approval_id:r,approval_created:t.approval_created,wait:"human",instruction:r?`approval ${r} pending - run: nativesoul approvals approve ${r} --confirm`:"approval pending but unavailable - inspect NativeSoul approval storage",warning:t.warning}:t.evaluation.decision==="allowed"?{blocked:!1,allowed:!0,decision:"allowed",approval_id:t.approval?.id??null,approval_status:t.approval?.status??null,warning:t.warning}:t.evaluation.decision==="proposal_required"?{blocked:!1,allowed:!1,decision:"proposal_required",approval_id:null,instruction:"use the existing SOUL.md/POLICY.md proposal flow; approvals do not cover protected human files",warning:t.warning}:{blocked:!1,allowed:!1,decision:"denied",approval_id:null,instruction:"stop; denied actions are not approvable through Approval Gate",warning:t.warning}}function KR(e){return e instanceof Error?e.message:"Unknown MCP response error"}async function vl(e,t,r){let o=e.rest[0];if(!o){await _m(t);return}if(o==="manifest"){let n=Dt({host:cm(e.flags),commandMode:el(e.flags),home:t,projectRoot:u(e.flags,"project-root")});m(n,r,`MCP manifest generated for ${n.host}`);return}if(o==="smoke"){let n=await Yn({jsonrpc:"2.0",id:1,method:"initialize"},t),s=await Yn({jsonrpc:"2.0",id:2,method:"life_status"},t),a={ok:n!==null&&s!==null&&"result"in n&&"result"in s,initialize:n,status:s};m(a,r,a.ok?"MCP smoke passed":"MCP smoke failed");return}if(o==="install"){let n=await ao({home:t,host:Zi(e.flags),targetPath:u(e.flags,"target"),apply:b(e.flags,"apply"),commandMode:el(e.flags),projectRoot:u(e.flags,"project-root")});m(n,r,`${n.dryRun?"Planned":"Applied"} MCP registration for ${n.host}: ${n.action}`);return}if(o==="rollback"){let n=u(e.flags,"snapshot");if(!n)throw new Error("mcp rollback requires --snapshot <path>");let s=await qa({home:t,snapshotPath:n,apply:b(e.flags,"apply")});m(s,r,`${s.dryRun?"Planned rollback":"Rolled back"} MCP target ${s.targetPath}`);return}if(o==="doctor"){let n=await io({host:Zi(e.flags),targetPath:u(e.flags,"target")});m(n,r,n.configured?`MCP configured for ${n.host}`:`MCP not configured for ${n.host}`);return}throw new Error("mcp requires manifest, smoke, install, rollback, doctor, or stdio mode with no subcommand")}async function kl(e,t,r){let o=e.rest[0];if(o==="flush-hook"){let n=u(e.flags,"text")?"":await To(),s=Co(n),a=u(e.flags,"text")??(typeof s=="string"?s:void 0),i=await da({home:t,host:u(e.flags,"host")??"codex",cwd:u(e.flags,"cwd")??process.cwd(),event:u(e.flags,"event")??e.rest[1],text:a,payload:typeof s=="string"?void 0:s});m(i,r,`Memory candidate proposed from ${i.host} ${i.event}: ${i.memory.id}`);return}if(o==="recall-hook"){let n=u(e.flags,"prompt")?"":await To(),s=Co(n),a=u(e.flags,"prompt")??tm(s),i=await ua({home:t,host:u(e.flags,"host")??"codex",cwd:u(e.flags,"cwd")??process.cwd(),prompt:a,limit:E(e.flags,"limit")});m(i,r,i.context||`Memory recall skipped: ${i.decision.reason}`);return}if(o==="index"){let n=await la({home:t,limit:E(e.flags,"limit")});m(n,r,`Semantic index updated: ${n.indexed_count} indexed, ${n.skipped_unchanged} unchanged`);return}if(o==="reflect"){let n=await Ya({home:t,cwd:u(e.flags,"cwd")??process.cwd(),project:u(e.flags,"project"),limit:E(e.flags,"limit"),apply:b(e.flags,"apply")});m(n,r,n.applied?`Reflection report applied: ${n.proposals.length} proposal(s), ${n.report_path}`:n.report);return}if(o==="add"){let n=u(e.flags,"text");if(!n)throw new Error("memory add requires --text");let s=u(e.flags,"project")??u(e.flags,"scope")??L(process.cwd(),t),a=await ca(t,{content:n,project:s});m(a,r,`Memory added: ${a.id}`);return}if(o==="propose"){let n=u(e.flags,"text");if(!n)throw new Error("memory propose requires --text");let s=u(e.flags,"project")??u(e.flags,"scope")??L(process.cwd(),t),a=await ae(t,{content:n,project:s});m(a,r,`Memory proposed: ${a.id}`);return}if(o==="promote"||o==="reject"||o==="forget"||o==="expire"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error(`memory ${o} requires <id> or --id <id>`);let s=o==="promote"?await Rt(t,n):o==="reject"?await St(t,n):o==="forget"?await At(t,n):await Jr(t,n);m(s,r,`Memory ${o}d: ${s.id}`);return}if(o==="export"){let n=u(e.flags,"project")??u(e.flags,"scope"),s=await Et({home:t,project:n,includeForgotten:b(e.flags,"include-forgotten"),limit:E(e.flags,"limit")});m(s,r,`${s.length} memor${s.length===1?"y":"ies"} exported`);return}if(o==="search"){let n=e.rest.slice(1).join(" ")||(u(e.flags,"query")??""),s=u(e.flags,"project")??L(process.cwd(),t),a=E(e.flags,"limit")??5,i=await Pt(t,n,s,a);m(i,r,`${i.length} memor${i.length===1?"y":"ies"} found`);return}throw new Error("memory requires add, propose, flush-hook, recall-hook, index, reflect, promote, reject, forget, expire, export, or search")}async function wl(e,t,r){let o=e.rest[0];if(o==="list"){let n=await ma({home:t,status:im(e.flags),limit:E(e.flags,"limit")});m(n,r,GR(n.projects,n.warning));return}if(o==="show"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error("project show requires <id|.>");let s=await ga({home:t,id:n,cwd:u(e.flags,"cwd")??process.cwd()});m(s,r,XR(s)),s.registry_available&&!s.registry&&(process.exitCode=1);return}if(o==="rename"){let n=e.rest[1]??u(e.flags,"id"),s=u(e.flags,"name");if(!n||!s)throw new Error("project rename requires <id|.> --name <display>");let a=await fa({home:t,id:n,name:s,cwd:u(e.flags,"cwd")??process.cwd()});m(a,r,a.found?`Project renamed: ${a.id} -> ${a.new_name}`:`Project not found: ${a.id}`),a.found||(process.exitCode=1);return}if(o==="alias"){let n=e.rest[1];if(n==="list"){let s=await _a({home:t});m(s,r,Object.keys(s.aliases).length===0?"No project aliases":YR(s.aliases));return}if(n==="add"){let s=e.rest[2],a=u(e.flags,"as");if(!s||!a)throw new Error("project alias add requires <id> --as <custom-id>");let i=await ba({home:t,id:s,alias:a,apply:b(e.flags,"apply")});m(i,r,vm(i));return}if(n==="remove"){let s=e.rest[2]??u(e.flags,"as");if(!s)throw new Error("project alias remove requires <custom-id>");let a=await va({home:t,alias:s,apply:b(e.flags,"apply")});m(a,r,vm(a));return}throw new Error("project alias requires add, remove, or list")}if(o==="forget"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error("project forget requires <id>");let s=await ha({home:t,id:n,includeMemories:b(e.flags,"include-memories"),apply:b(e.flags,"apply"),confirm:u(e.flags,"confirm")});m(s,r,QR(s)),(!s.found||s.mode==="forget_memories"&&!s.guard_ok)&&(process.exitCode=1);return}if(o==="reactivate"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error("project reactivate requires <id>");let s=await ya({home:t,id:n});m(s,r,ZR(s)),s.found||(process.exitCode=1);return}if(o==="pin"){let n=u(e.flags,"cwd")??process.cwd(),s=await oa({cwd:n,home:t,apply:b(e.flags,"apply")});m(s,r,s.applied?`Project marker pinned at ${s.marker_path} (${s.base_id})`:`Project pin dry-run: would write ${s.marker_path} (${s.base_id})`);return}throw new Error("project requires list, show, rename, alias, forget, reactivate, or pin")}function GR(e,t){if(t)return`Project registry unavailable: ${t}`;if(e.length===0)return"No projects found";let r=e.map(o=>{let n=o.counts;return`${o.id} ${o.display_name} ${o.status} memories:${n.memories.active}/${n.memories.total} commitments:${n.commitments.open}/${n.commitments.total} semantic:${n.semantic_memory_index.total} runs:${n.runs.total} sessions:${n.sessions.total}`});return[`${e.length} project(s)`,...r].join(`
1068
+ `)}function XR(e){if(!e.registry_available)return`Project registry unavailable: ${e.warning??"unknown"}`;if(!e.registry)return`Project not found: ${e.effective_id}`;let t=e.counts??zR();return[`Project ${e.registry.id}`,`Name: ${e.registry.display_name}`,`Status: ${e.registry.status}`,`Effective id: ${e.effective_id}`,`Base id: ${e.registry.base_id}`,`Source: ${e.registry.source}; live source: ${e.live_resolution.source}`,`Alias active: ${e.live_resolution.alias_key??"no"}`,`Marker active: ${e.live_resolution.marker_path??"no"}`,`Counts: memories ${t.memories.active}/${t.memories.total}, semantic ${t.semantic_memory_index.total}, commitments ${t.commitments.open}/${t.commitments.total}, runs ${t.runs.total}, sessions ${t.sessions.total}`,`Continuity gap: ${e.continuity_gap?"yes":"no"}`].join(`
1069
+ `)}function zR(){return{memories:{total:0,active:0,last_activity_at:null},semantic_memory_index:{total:0,last_activity_at:null},commitments:{total:0,open:0,last_activity_at:null},runs:{total:0,last_activity_at:null},sessions:{total:0,last_activity_at:null}}}function YR(e){return Object.entries(e).map(([t,r])=>`${t} -> ${r}`).join(`
1070
+ `)}function vm(e){let t=e.applied?"applied":"dry-run";if(e.action==="add"){let r=e.previous_id&&e.previous_id!==e.project_id?` replacing ${e.previous_id}`:"";return`Project alias ${t}: ${e.alias_key} -> ${e.project_id}${r}`}return`Project alias removal ${t}: ${e.alias_key}`}function QR(e){return e.found?e.mode==="forget_memories"&&!e.guard_ok?[`Project forget dry-run refused: ${e.id}`,`Would transition ${e.memories_affected} memory record(s) to forgotten.`,`Run with --include-memories --apply --confirm ${e.id} to apply.`].join(`
1071
+ `):e.mode==="forget_memories"?`Project forgotten: ${e.id}; memories affected: ${e.memories_affected}`:`Project archived: ${e.id}`:`Project not found: ${e.id}`}function ZR(e){return e.found?`Project reactivated: ${e.id}`:`Project not found: ${e.id}`}import{readFile as eS}from"node:fs/promises";async function Sl(e,t,r){let o=e.rest[0];if(o==="status"){let n=await Xr(t);m(n,r,n.ritual_pending?"Onboarding ritual pending":"Onboarding complete");return}if(o==="activation"){let n=tS(e),s=await Ra({home:t,profile:n,dry_run:!b(e.flags,"apply"),user_confirmed:b(e.flags,"user-confirmed"),reset:b(e.flags,"reset"),options:{scheduler_host:u(e.flags,"scheduler-host"),heartbeat_cadence:u(e.flags,"heartbeat-cadence"),recall_auto_trigger:b(e.flags,"recall-auto-trigger")||void 0,memory_candidates:b(e.flags,"memory-candidates")||void 0,auto_promotion:b(e.flags,"auto-promotion")||void 0,promotion_policy:rS(e.flags),recall_auto_trigger_keywords:Rl(e.flags,"recall-keywords"),recall_auto_trigger_denylist:Rl(e.flags,"recall-denylist"),candidate_auto_promotion_threshold:oS(e.flags),standing_order_templates:Rl(e.flags,"standing-order-templates")}});m(s,r,s.applied?"Activation profile applied":"Activation profile dry-run planned");return}if(o==="verify"){let n=await Io({home:t,host:ze(e.flags),surface:xe(e.flags),targetRoot:u(e.flags,"target-root"),projectCwd:u(e.flags,"project-cwd"),apply:b(e.flags,"apply"),userConfirmed:b(e.flags,"user-confirmed"),retainTestData:b(e.flags,"retain-test-data")});m(n,r,n.overall_status==="ready"?"Cross-host verification passed":`Cross-host verification ${n.overall_status}`);return}if(o==="apply"){let n=u(e.flags,"payload-file")??e.rest[1];if(!n)throw new Error("onboard apply requires --payload-file <path>");let s=JSON.parse(await eS(n,"utf8")),a=await zr({home:t,dry_run:b(e.flags,"apply")?!1:s.dry_run!==!1,user_confirmed:b(e.flags,"user-confirmed")||s.user_confirmed===!0,files:s.files,config_patch:s.config_patch});m(a,r,a.applied?"Onboarding files applied":"Onboarding dry-run planned");return}if(o==="complete"){let n=await Yr({home:t,archive:!b(e.flags,"no-archive")});m(n,r,n.already_complete?"Onboarding already complete":"Onboarding ritual completed");return}throw new Error("onboard requires status, activation, verify, apply, or complete")}function tS(e){let t=u(e.flags,"profile")??e.rest[1]??"quickstart";if(t==="quickstart"||t==="advanced")return t;throw new Error("onboard activation requires --profile quickstart|advanced")}function rS(e){let t=u(e,"promotion-policy");if(t!==void 0){if(t==="manual"||t==="explicit_approval")return t;throw new Error("onboard activation --promotion-policy requires manual|explicit_approval")}}function oS(e){let t=u(e,"candidate-confidence-threshold");if(t===void 0)return;let r=E(new Map([["candidate-confidence-threshold",t]]),"candidate-confidence-threshold");if(r===void 0)throw new Error("onboard activation --candidate-confidence-threshold must be a number");if(r>=0&&r<=1)return r;throw new Error("onboard activation --candidate-confidence-threshold must be between 0 and 1")}function Rl(e,t){let r=u(e,t);if(r)return r.split(",").map(o=>o.trim()).filter(Boolean)}async function Al(e,t,r){let o=e.rest[0];if(o==="evaluate"){let n=u(e.flags,"action")??e.rest[1];if(!n)throw new Error("policy evaluate requires --action <id>");let s=await pt({home:t,action:n,className:lm(e.flags),target:u(e.flags,"target")});m(s,r,`Policy decision for ${s.action}: ${s.decision}`);return}if(o==="standing-orders"&&e.rest[1]==="list"){let n=await ut(t);m(n,r,`${n.length} standing order(s)`);return}if(o==="packs"){await nS(e,t,r);return}if(o==="pretooluse-hook"){let n=await To(),s=Co(n)??{},a=await ki({home:t,host:u(e.flags,"host")??"codex",cwd:u(e.flags,"cwd"),payload:s});m(a,r,a.message);return}if(o==="propose-change"){let n=u(e.flags,"target")??e.rest[1],s=u(e.flags,"summary");if(!n||!s)throw new Error("policy propose-change requires --target SOUL.md|POLICY.md and --summary <text>");let a=await wi({home:t,target:n,summary:s});m(a,r,`Policy change proposal created: ${a.proposalPath}`);return}throw new Error("policy requires evaluate, standing-orders list, packs list|show|validate|apply|rollback, pretooluse-hook, or propose-change")}async function nS(e,t,r){let o=e.rest[1];if(o==="list"){let n=await Fi();m(n,r,`${n.length} policy pack(s)`);return}if(o==="show"){let n=e.rest[2]??u(e.flags,"id");if(!n)throw new Error("policy packs show requires <id> or --id <id>");let s=await xo(n);m(s,r,`Policy pack ${s.id} ${s.version}`);return}if(o==="validate"){let n=e.rest[2]??u(e.flags,"id"),s=await Ui({id:n,file:u(e.flags,"file")});m(s,r,s.valid?`Policy pack valid: ${s.id}`:`Policy pack invalid: ${s.errors.join("; ")}`);return}if(o==="apply"){let n=e.rest[2]??u(e.flags,"id"),s=await Ji({home:t,id:n,file:u(e.flags,"file"),targetRoot:u(e.flags,"target-root"),apply:b(e.flags,"apply"),reviewed:b(e.flags,"reviewed"),approvalEvidence:u(e.flags,"approval")});m(s,r,`${s.dryRun?"Planned":"Applied"} policy pack ${s.pack.id}: ${s.files.filter(a=>a.changed).length} file change(s)`);return}if(o==="rollback"){let n=u(e.flags,"snapshot")??e.rest[2];if(!n)throw new Error("policy packs rollback requires --snapshot <path>");let s=await qi({home:t,snapshotPath:n,apply:b(e.flags,"apply")});m(s,r,`${s.dryRun?"Planned rollback":"Rolled back"} policy pack ${s.pack.id}: ${s.files.length} file change(s)`);return}throw new Error("policy packs requires list, show, validate, apply, or rollback")}async function Pl(e,t,r){let o=e.rest[0];if(o==="create"){let n=u(e.flags,"title");if(!n)throw new Error("work create requires --title <text>");let s=await bo({home:t,project:u(e.flags,"project")??L(process.cwd(),t),title:n,description:u(e.flags,"description")??null,priority:Kn(e.flags),source:"cli",tags:Qi(e.flags,"tags"),host:u(e.flags,"host")??null});m(s,r,`Work item created: ${s.id}`);return}if(o==="list"){let n=await vo({home:t,project:u(e.flags,"project"),status:qn(e.flags),priority:Kn(e.flags),assignedHost:u(e.flags,"host"),limit:E(e.flags,"limit")});m(n,r,`${n.length} work item(s)`);return}if(o==="claim"){let n=El(e,"claim"),s=u(e.flags,"host")??"cli",a=await ko({home:t,id:n,host:s});m(a,r,`Work item ${a.id} claimed by host ${s}`);return}if(o==="update"){let n=El(e,"update"),s=qn(e.flags),a=Kn(e.flags),i=u(e.flags,"host"),l=u(e.flags,"description"),c=Qi(e.flags,"tags"),d=u(e.flags,"run");if(s===void 0&&a===void 0&&i===void 0&&l===void 0&&c===void 0&&d===void 0)throw new Error("work update requires at least one of --status, --priority, --host, --description, --tags, or --run");let p=await wo({home:t,id:n,status:s,priority:a,assignedHost:i,description:l,tags:c,metadata:d===void 0?void 0:{run_id:d}});m(p,r,`Work item updated: ${p.id}`);return}if(o==="complete"){let n=El(e,"complete"),s=qn(e.flags);if(s!==void 0&&s!=="done"&&s!=="failed")throw new Error("work complete --status must be done or failed");let a=await Ro({home:t,id:n,status:s});m(a,r,`Work item completed: ${a.id} (${a.status})`);return}throw new Error("work requires create, list, claim, update, or complete")}function El(e,t){let r=e.rest[1]??u(e.flags,"id");if(!r)throw new Error(`work ${t} requires <id> or --id <id>`);return r}function xl(){process.stdout.write(`nativesoul
1066
1072
 
1067
1073
  Commands:
1068
1074
  init [--home <path>] [--json]
@@ -1159,6 +1165,6 @@ Commands:
1159
1165
  onboard apply --payload-file <path> [--apply] [--user-confirmed] [--home <path>] [--json]
1160
1166
  onboard complete [--no-archive] [--home <path>] [--json]
1161
1167
  mcp [--home <path>]
1162
- `)}async function qR(e){let t=Vi(e);if(XR(t)){process.stdout.write(`${Ht}
1163
- `);return}if(Bi(t)){vl();return}let r=u(t.flags,"home"),o=b(t.flags,"json");if(!zR(t)){let n=await ar(r);if(!n.ok){m(n,o,mo(n)),process.exitCode=1;return}}switch(t.command){case"init":{let n=await Vp(r);m(n,o,`NativeSoul initialized at ${n.home}`);return}case"status":{let n=$n(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 Mt({home:r,host:Xe(t.flags),surface:Ee(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 Jr(r);m(n,o,n.healthy?`NativeSoul healthy at ${n.home}`:`NativeSoul has ${n.issues.length} issue(s)`);return}case"install":{let n=await Ri({home:r,host:Xe(t.flags),surface:Ee(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 Ai({home:r,host:Xe(t.flags),surface:Ee(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 ml(t,r,o);return}case"project":{await gl(t,r,o);return}case"import":{await sl(t,r,o);return}case"license":{await il(t,r,o);return}case"marketing-audit":{await ll(t,r,o);return}case"commitments":{await Qi(t,r,o);return}case"work":{await bl(t,r,o);return}case"dashboard":{await rl(t,r,o);return}case"cost":{await tl(t,r,o);return}case"feedback":{await ol(t,r,o);return}case"adapters":{await Gi(t,o);return}case"activate":{await Ki(t,r,o);return}case"capabilities":{await Yi(t,r,o);return}case"audit":{await zi(t,r,o);return}case"approvals":{await Xi(t,r,o);return}case"policy":{await yl(t,r,o);return}case"heartbeat":{await nl(t,r,o);return}case"schedule":{await al(t,r,o);return}case"bootstrap":{let n=u(t.flags,"cwd")??process.cwd(),a=u(t.flags,"host")??"codex",s=Qp(t.flags);if(s==="cache"){try{let l=await ir({home:r,host:a,recordTelemetry:!1});m(l,o,l.content)}catch(l){try{let c=await ir({home:fo(n),host:a,recordTelemetry:!1});m(c,o,c.content);return}catch{}throw await KR({home:r,host:a,cwd:n,source:"bootstrap-cache",error:l}),l}return}let i=await It({home:r,host:a,cwd:n,query:u(t.flags,"query"),readOnly:s==="inject"});if(s==="inject"){try{let l=await xn({home:r,host:a,payload:i});m(l,o,l.content)}catch(l){try{let d=await xn({home:fo(n),host:a,payload:i,recordTelemetry:!1});m(d,o,d.content);return}catch{}let c=Pn({host:a,payload:i,degraded:!0,warnings:[`BOOTSTRAP_CACHE_WRITE_SKIPPED:${GR(l)}`]});m(c,o,c.content)}return}m(i,o,`Bootstrap ready for ${a} in project ${i.project.id}`);return}case"onboard":{await hl(t,r,o);return}case"mcp":{await pl(t,r,o);return}case"help":case void 0:vl();return;default:throw new Error(`Unknown command: ${t.command}`)}}async function KR(e){try{await Ne({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 GR(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"?e.code:"unavailable"}function XR(e){return e.command==="--version"||e.command==="-v"||e.command==="version"}function zR(e){if(e.command==="license"){let t=e.rest[0];return t==="activate"||t==="status"}return!1}function YR(){if(process.argv[1]===void 0)return!1;let e=JR(import.meta.url);try{return cm(process.argv[1])===cm(e)}catch{return WR.resolve(process.argv[1])===e}}YR()&&qR(process.argv.slice(2)).catch(e=>{let t=e instanceof Error?e.message:"Unknown error";process.stderr.write(`nativesoul error: ${t}
1164
- `),process.exitCode=1});export{qR as main,Vi as parseArgs,Bi as shouldPrintHelp};
1168
+ `)}async function iS(e){let t=zi(e);if(dS(t)){process.stdout.write(`${Ut}
1169
+ `);return}if(Yi(t)){xl();return}let r=u(t.flags,"home"),o=b(t.flags,"json");if(!uS(t)){let n=await ir(r);if(!n.ok){m(n,o,ho(n)),process.exitCode=1;return}}switch(t.command){case"init":{let n=await em(r);m(n,o,`NativeSoul initialized at ${n.home}`);return}case"status":{let n=Jn(r);m(n,o,`NativeSoul ${n.initialized?"initialized":"not initialized"} at ${n.home}`);return}case"doctor":{if(b(t.flags,"deep")){let s=b(t.flags,"require-full-native"),a=await Ht({home:r,host:ze(t.flags),surface:xe(t.flags),targetRoot:u(t.flags,"target-root")}),i=`full-native ${a.full_native_matrix.full_native_count}/${a.full_native_matrix.host_count}`;m(a,o,a.healthy?`NativeSoul deep doctor healthy: ${a.status}; ${i}`:`NativeSoul deep doctor found ${a.issues.length} issue(s); ${i}`),s&&!a.full_native_matrix.require_full_native_ready&&(process.exitCode=1);return}let n=await Kr(r);m(n,o,n.healthy?`NativeSoul healthy at ${n.home}`:`NativeSoul has ${n.issues.length} issue(s)`);return}case"install":{let n=await Ti({home:r,host:ze(t.flags),surface:xe(t.flags),apply:b(t.flags,"apply"),targetRoot:u(t.flags,"target-root")});m(n,o,n.applied?`NativeSoul install applied: ${n.status}`:`NativeSoul install planned: ${n.status}`);return}case"uninstall":{let n=await Ni({home:r,host:ze(t.flags),surface:xe(t.flags),apply:b(t.flags,"apply"),targetRoot:u(t.flags,"target-root"),purgeData:b(t.flags,"purge-data"),confirmPurge:u(t.flags,"confirm-purge-nativesoul-data")});m(n,o,n.applied?`NativeSoul uninstall applied: ${n.status}`:`NativeSoul uninstall planned: ${n.status}`);return}case"memory":{await kl(t,r,o);return}case"project":{await wl(t,r,o);return}case"import":{await gl(t,r,o);return}case"license":{await fl(t,r,o);return}case"marketing-audit":{await hl(t,r,o);return}case"commitments":{await al(t,r,o);return}case"work":{await Pl(t,r,o);return}case"dashboard":{await dl(t,r,o);return}case"cost":{await cl(t,r,o);return}case"feedback":{await ul(t,r,o);return}case"adapters":{await rl(t,o);return}case"activate":{await tl(t,r,o);return}case"capabilities":{await sl(t,r,o);return}case"audit":{await nl(t,r,o);return}case"approvals":{await ol(t,r,o);return}case"policy":{await Al(t,r,o);return}case"heartbeat":{await pl(t,r,o);return}case"schedule":{await ml(t,r,o);return}case"bootstrap":{let n=u(t.flags,"cwd")??process.cwd(),s=u(t.flags,"host")??"codex",a=dm(t.flags);if(a==="cache"){try{let l=await cr({home:r,host:s,recordTelemetry:!1});m(l,o,l.content)}catch(l){try{let c=await cr({home:_o(n),host:s,recordTelemetry:!1});m(c,o,c.content);return}catch{}throw await lS({home:r,host:s,cwd:n,source:"bootstrap-cache",error:l}),l}return}let i=await It({home:r,host:s,cwd:n,query:u(t.flags,"query"),readOnly:a==="inject"});if(a==="inject"){try{let l=await On({home:r,host:s,payload:i});m(l,o,l.content)}catch(l){try{let d=await On({home:_o(n),host:s,payload:i,recordTelemetry:!1});m(d,o,d.content);return}catch{}let c=Nn({host:s,payload:i,degraded:!0,warnings:[`BOOTSTRAP_CACHE_WRITE_SKIPPED:${cS(l)}`]});m(c,o,c.content)}return}m(i,o,`Bootstrap ready for ${s} in project ${i.project.id}`);return}case"onboard":{await Sl(t,r,o);return}case"mcp":{await vl(t,r,o);return}case"help":case void 0:xl();return;default:throw new Error(`Unknown command: ${t.command}`)}}async function lS(e){try{await Me({home:e.home,host:e.host,outcome:"failed",tier:"D",cwd:e.cwd,project:L(e.cwd,e.home),source:e.source,error:e.error})}catch{}}function cS(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"?e.code:"unavailable"}function dS(e){return e.command==="--version"||e.command==="-v"||e.command==="version"}function uS(e){if(e.command==="license"){let t=e.rest[0];return t==="activate"||t==="status"}return!1}function pS(){if(process.argv[1]===void 0)return!1;let e=aS(import.meta.url);try{return km(process.argv[1])===km(e)}catch{return sS.resolve(process.argv[1])===e}}pS()&&iS(process.argv.slice(2)).catch(e=>{let t=e instanceof Error?e.message:"Unknown error";process.stderr.write(`nativesoul error: ${t}
1170
+ `),process.exitCode=1});export{iS as main,zi as parseArgs,Yi as shouldPrintHelp};