nativesoul 1.1.2 → 1.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -0
- package/README.md +5 -5
- package/dist/package.json +1 -1
- package/dist/packages/cli/src/index.js +66 -66
- package/dist/packages/mcp-server/src/index.js +1 -1
- package/docs/adr/ADR-043-versioning-and-release-policy.md +1 -1
- package/docs/adr/ADR-045-paid-only-closed-distribution.md +11 -1
- package/package.json +1 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
var Ag=Object.defineProperty;var At=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(o){throw r=[o],o}};var nc=(e,t)=>{for(var r in t)Ag(e,r,{get:t[r],enumerable:!0})};import{spawn as uf}from"node:child_process";import{access as pf}from"node:fs/promises";import{constants as mf}from"node:fs";import{existsSync as gf}from"node:fs";import Uc from"node:path";async function Be(e){let t=(process.env.PATH??"").split(Uc.delimiter).filter(Boolean),r=process.platform==="win32"?(process.env.PATHEXT??".EXE;.CMD;.BAT").split(";"):[""];for(let o of t)for(let n of r){let a=Uc.join(o,`${e}${n}`);if(process.platform==="win32"&&gf(a))return a;try{return await pf(a,mf.X_OK),a}catch{}}return null}async function pn(e,t){return new Promise(r=>{Bc(e,t,["ignore","pipe","pipe"]).then(o=>{let n=setTimeout(()=>{o.kill(),r(null)},750),a="";o.stdout.on("data",s=>{a+=String(s)}),o.stderr.on("data",s=>{a+=String(s)}),o.on("error",()=>{clearTimeout(n),r(null)}),o.on("close",s=>{clearTimeout(n);let i=a.trim().split(/\r?\n/u).map(l=>l.trim()).find(l=>/\d+\.\d+/u.test(l)&&!l.toLowerCase().startsWith("warning"));if(s===0||i){r(i??null);return}r(null)})})})}async function Ka(e,t,r=1e3){return new Promise(o=>{Bc(e,t,["ignore","pipe","pipe"]).then(n=>{let a=setTimeout(()=>{n.kill(),o({status:"timeout",code:null,stdout:"",stderr:"command timed out"})},r),s="",i="";n.stdout.on("data",l=>{s+=String(l)}),n.stderr.on("data",l=>{i+=String(l)}),n.on("error",()=>{clearTimeout(a),o({status:"missing",code:null,stdout:s,stderr:i})}),n.on("close",l=>{clearTimeout(a),o({status:l===0?"ok":"error",code:l,stdout:s,stderr:i})})})})}async function Bc(e,t,r){let n=await Be(e)??e,a=process.platform==="win32"&&/\.(?:cmd|bat)$/iu.test(n);return uf(n,t,{stdio:r,shell:a})}var jt=At(()=>{"use strict"});import{constants as ff}from"node:fs";import{access as hf,readFile as yf,stat as _f}from"node:fs/promises";import Vc from"node:os";import bf from"node:path";function j(e){return e==="~"?Vc.homedir():e.startsWith("~/")?bf.join(Vc.homedir(),e.slice(2)):e}async function x(e){try{return await hf(e,ff.F_OK),!0}catch{return!1}}async function W(e){try{return(await _f(e)).isDirectory()}catch{return!1}}async function G(e){return await x(e)?yf(e,"utf8"):null}function Ne(e){let t=Wc(e);return[t.start,"# NativeSoul bridge","At the start of every new session, before answering the first user message, load NativeSoul context.","Do not wait for the user to ask for identity, memory, or continuity; bootstrap is mandatory first-turn setup.","After bootstrap, answer from the NativeSoul identity and continuity context, not the host vendor identity.",`Preferred handshake: call the local MCP tool life_bootstrap with host="${e}" and cwd set to the current working directory.`,`Fallback handshake: run nativesoul bootstrap --host ${e} --cwd <current-working-directory> --format inject.`,`If bootstrap or MCP is unavailable, run nativesoul bootstrap --host ${e} --cwd <current-working-directory> --format cache and treat the context as degraded.`,"Use relevant_memories for durable facts, capability_cards as advisory guidance, and capabilities only as the ready-only list.","Never copy credentials or auto-edit SOUL.md/POLICY.md; propose those changes for approval.",`Host adapter: ${e}.`,t.end,""].join(`
|
|
3
|
-
`)}function Wc(e){return{start:`<!-- nativesoul:${e}:start v1 -->`,end:`<!-- nativesoul:${e}:end -->`}}function te(e,t){if(!t)return!1;let r=Wc(t);return e.includes(r.start)&&e.includes(r.end)}var de=At(()=>{"use strict"});function O(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ve(e){try{return JSON.parse(e)}catch{return null}}async function Z(e){let t=await G(e);if(t===null)return null;let r=Ve(t);return O(r)?r:null}function at(e){return O(e)?Object.keys(e).filter(t=>t.trim().length>0):[]}function mn(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function st(e,t){if(Array.isArray(e))return e;if(!O(e))return[];for(let r of t){let o=e[r];if(Array.isArray(o))return o}return[]}function I(e,t){if(!O(e))return null;for(let r of t){let o=e[r];if(typeof o=="string"&&o.trim().length>0)return o.trim()}return null}function se(e,t){if(!O(e))return null;for(let r of t){let o=e[r];if(typeof o=="boolean")return o}return null}function M(e,t){let r=t?.allowSlash===!0?/[^a-z0-9._/-]+/gu:/[^a-z0-9._-]+/gu;return e.trim().toLowerCase().replace(r,"-").replace(/^-+|-+$/gu,"")||"unknown"}var We=At(()=>{"use strict";de()});import{readdir as Tf,readFile as Cf}from"node:fs/promises";import ed from"node:path";function rd(e){let t=e??j("~/.claude");return ed.join(t,"scheduled-tasks")}async function od(e){if(!await W(e))return null;let t=await Zc(e,td);if(t!==null)return t;let r=await Nf(e);for(let o of r){let n=await Zc(e,o);if(n!==null)return n}return null}async function Zc(e,t){let r=ed.join(e,t,"SKILL.md");if(!await x(r))return null;let n=(await Cf(r,"utf8")).toLowerCase();return t===td||t.includes(Of)||n.includes(`name: ${Qc}`)||n.includes(`# ${Qc}`)?`claude:scheduled-task:${t}`:null}async function Nf(e){try{return(await Tf(e,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>r.name)}catch{return[]}}var td,Of,Qc,nd=At(()=>{"use strict";de();td="nativesoul-heartbeat",Of="nativesoul-heartbeat",Qc="life:heartbeat"});import{mkdir as Mf,readFile as Lf,writeFile as Df}from"node:fs/promises";import Br from"node:path";import{fileURLToPath as Hf}from"node:url";async function sd(e){try{let t=Br.join(e,ad);await Mf(t,{recursive:!0,mode:448});let r=Br.join(t,"SKILL.md"),o=await Ff();return await Df(r,o??$f,"utf8"),!0}catch{return!1}}async function Ff(){let e=Br.dirname(Hf(import.meta.url)),t=[Br.resolve(process.cwd(),"plugins","claude-nativesoul","skills","life-heartbeat","SKILL.md"),Br.resolve(e,"../../../../plugins/claude-nativesoul/skills/life-heartbeat/SKILL.md")];for(let r of t)if(await x(r))return Lf(r,"utf8");return null}var ad,zP,$f,id=At(()=>{"use strict";de();ad="nativesoul-heartbeat",zP=`claude:scheduled-task:${ad}`,$f='---\nname: life:heartbeat\ndescription: Run NativeSoul heartbeat from a Claude Scheduled Task.\n---\n\n# life:heartbeat\n\nUse this skill only when invoked by a Claude Scheduled Task for NativeSoul heartbeat checks.\n\nDefault policy: read-only. Do not edit workspace files, memories, `SOUL.md`, `POLICY.md`, scheduler state, or host configuration unless explicitly allowed.\n\n1. Determine the project from the Scheduled Task context. If it is missing, use the current working directory.\n2. Claim a local heartbeat lease through MCP `life_heartbeat_claim` with `host="claude"`, project id or directory, and the Scheduled Task slot/time as `slot`.\n3. If the claim response says another host owns the lease, the lease is already completed, or no work is needed, stop and return only `HEARTBEAT_OK`.\n4. Read NativeSoul context through MCP and inspect heartbeat guidance such as `HEARTBEAT.md`.\n5. If no operator-visible action is required, complete the lease with MCP `life_heartbeat_complete` and `result="HEARTBEAT_OK"`, then return only `HEARTBEAT_OK`.\n6. If action is required, complete the lease with concise evidence, then report the action request without secrets or raw credentials.\n\n`HEARTBEAT_OK` is a silent acknowledgement token. Do not notify the user for it.\n'});var ld={};nc(ld,{discoverClaudeScheduledTasksManifest:()=>Uf});async function Uf(e={}){let t=rd(e.hostConfigRoot);if(!e.apply&&!await W(t)||(e.surface==="claude-code"?"claude-code":"claude-desktop")==="claude-code")return null;let o=await od(t);return o!==null?Za({nativeId:o,evidenceSource:"filesystem"}):e.apply&&await sd(t)?Za({nativeId:"claude:scheduled-task:nativesoul-heartbeat",evidenceSource:"filesystem-provisioned"}):await W(t)?Za({nativeId:void 0,evidenceSource:"filesystem"}):null}function Za(e){return{supported:!0,native_id:e.nativeId,surface:"claude-desktop",scheduler_kind:"local_scheduled_task",creation_surface:"official_machine_readable",evidence_source:e.evidenceSource}}var cd=At(()=>{"use strict";nd();id();de()});var xd={};nc(xd,{discoverCodexAutomationsManifest:()=>rh});import{readFile as ts}from"node:fs/promises";import hn from"node:path";import{spawnSync as Xf}from"node:child_process";async function rh(e={}){let t=await oh();if(t)return t;let r=await nh(e.hostConfigRoot);return r||(e.apply?(await sh(),await ah()):null)}async function oh(){let e=process.env.NATIVESOUL_CODEX_AUTOMATIONS_FIXTURES;if(e)try{return rs(await ts(hn.join(e,"automations.json"),"utf8"))}catch{return null}let t=process.env.NATIVESOUL_CODEX_AUTOMATIONS_MANIFEST;if(t)try{return rs(await ts(t,"utf8"))}catch{return null}return null}async function nh(e){let t=e??j("~/.codex"),r=[hn.join(t,"automations.json"),hn.join(t,"automations","nativesoul-heartbeat.json"),hn.join(t,"automations","manifest.json")];for(let o of r){if(!await x(o))continue;let n=await ts(o,"utf8"),a=rs(n);if(a?.supported)return a;let s=Ve(n);if(!s)continue;let i=Pd(s);if(i)return i}return null}async function ah(){let e=ih();for(let t of e)for(let r of Qf){let o=await lh(()=>dh(t,r),eh),n=Pd(o);if(n)return n}return null}async function sh(){let e=await Be("codex");e&&Xf(e,["app-server","daemon","start"],{encoding:"utf8",stdio:"ignore",timeout:1e4})}function ih(){let e=new Set;for(let t of[process.env.NATIVESOUL_CODEX_APP_SERVER_URL,process.env.CODEX_APP_SERVER_URL])typeof t=="string"&&t.trim().length>0&&e.add(t.trim());return e.add("http://127.0.0.1:8787"),e.add("http://127.0.0.1:4096"),[...e]}async function lh(e,t){for(let r=0;r<=t;r+=1){let o=await e();if(o!==null)return o;r<t&&await ch(th)}return null}function ch(e){return new Promise(t=>{setTimeout(t,e)})}async function dh(e,t){let r=new AbortController,o=setTimeout(()=>r.abort(),Zf);try{let n=await fetch(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:t,method:t,params:{}}),signal:r.signal});if(!n.ok)return null;let a=await n.json();return!O(a)||"error"in a?null:"result"in a?a.result:a}catch{return null}finally{clearTimeout(o)}}function Pd(e){let t=uh(e);for(let r of t){let o=ph(r),n=JSON.stringify(r).toLowerCase();if(o&&Yf.some(a=>n.includes(a)))return{supported:!0,native_id:o.startsWith("codex:")?o:`codex:automation:${o}`}}return O(e)&&e.supported===!0?{supported:!0,native_id:typeof e.native_id=="string"?e.native_id:void 0}:null}function uh(e){if(Array.isArray(e))return e;if(!O(e))return[];for(let t of["automations","items","results","data"]){let r=e[t];if(Array.isArray(r))return r}return[]}function ph(e){if(!O(e))return null;for(let t of["id","native_id","automation_id","name"]){let r=e[t];if(typeof r=="string"&&r.trim().length>0)return r.trim()}return null}function rs(e){let t=Ve(e);return O(t)?{supported:t.supported===!0,native_id:typeof t.native_id=="string"&&t.native_id.length>0?t.native_id:void 0}:null}var Yf,Qf,Zf,eh,th,jd=At(()=>{"use strict";de();jt();We();Yf=["life:heartbeat","nativesoul-heartbeat","life-heartbeat"],Qf=["automation/list","automations/list","scheduledAutomation/list"],Zf=1e3,eh=2,th=150});import{realpathSync as Sg}from"node:fs";import lE from"node:path";import{fileURLToPath as cE}from"node:url";import{existsSync as dA}from"node:fs";import{mkdirSync as Hg}from"node:fs";import $g from"node:path";import{pathToFileURL as Fg}from"node:url";function or(e){if(!e||typeof e!="object"||Array.isArray(e))return{};let t=e;if(t.source!=="host-reported")return{};let r={schema:sc(t.schema)??1,source:"host-reported"},o=ha(t.model);o&&(r.model=o);let n=ac(t.tokens_in);n!==null&&(r.tokens_in=n);let a=ac(t.tokens_out);a!==null&&(r.tokens_out=a);let s=sc(t.cost_usd);s!==null&&(r.cost_usd=s);let i=ha(t.currency);i?r.currency=i:s!==null&&(r.currency="USD");let l=ha(t.reported_at);return l&&(r.reported_at=l),r}function Dr(e){try{return or(JSON.parse(e))}catch{return{}}}function ha(e){return typeof e=="string"&&e.length>0?e:null}function ac(e){return typeof e!="number"||!Number.isFinite(e)||e<0?null:Math.trunc(e)}function sc(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:null}function Et(e){return{id:e.id,type:e.type,scope:{user:e.scope_user,project:e.scope_project},content:e.content,summary:e.summary,source:JSON.parse(e.source_json),confidence:e.confidence,authority:e.authority,sensitivity:e.sensitivity,status:e.status,created_at:e.created_at,expires_at:e.expires_at,hash:e.hash}}function ya(e){return{memory_id:e.memory_id,scope_project:e.scope_project,source:JSON.parse(e.source_json),schema_version:e.schema_version,provider_id:e.provider_id,model_id:e.model_id,content_hash:e.content_hash,embedding:JSON.parse(e.embedding_json),indexed_text:e.indexed_text,indexed_at:e.indexed_at}}function ic(e){return{id:e.id,type:e.type,actor:e.actor,origin:e.origin,result:e.result,details:JSON.parse(e.details_json),created_at:e.created_at,hash:e.hash}}function on(e){return{uid:e.uid,host:e.host,native_kind:e.native_kind,normalized_kind:e.normalized_kind,source:e.source,schema_hash:e.schema_hash,installed:!!e.installed,enabled:!!e.enabled,active:!!e.active,authenticated:!!e.authenticated,healthy:!!e.healthy,allowed:!!e.allowed,ready:!!e.ready,last_seen_at:e.last_seen_at}}function Hr(e){return{id:e.id,display_name:e.display_name,base_id:e.base_id,source:e.source,first_basis:e.first_basis,status:e.status,created_at:e.created_at,updated_at:e.updated_at,last_seen_at:e.last_seen_at}}function nn(e){return{id:e.id,action:e.action,class:e.class,target:e.target,project:e.project,host:e.host,status:e.status,reviewer:e.reviewer,reason:e.reason,created_at:e.created_at,decided_at:e.decided_at}}function _a(e){return{id:e.id,project_id:e.project_id,title:e.title,description:e.description,status:e.status,priority:e.priority,assigned_host:e.assigned_host,source:e.source,tags:JSON.parse(e.tags_json),metadata:JSON.parse(e.metadata_json),created_at:e.created_at,updated_at:e.updated_at,claimed_at:e.claimed_at,completed_at:e.completed_at}}function ba(e){return{id:e.id,work_item_id:e.work_item_id,project_id:e.project_id,type:e.type,from_status:e.from_status,to_status:e.to_status,actor:e.actor,details:JSON.parse(e.details_json),created_at:e.created_at}}function $r(e){return{id:e.id,slot:e.slot,holder:e.holder,idempotency_key:e.idempotency_key,expires_at:e.expires_at,status:e.status,created_at:e.created_at,completed_at:e.completed_at}}function Fr(e){if(e.kind!=="heartbeat"||e.status!=="completed"||!e.completed_at)throw new Error(`Invalid heartbeat run row: ${e.id}`);return{id:e.id,kind:"heartbeat",host:e.host,project_id:e.project_id,status:"completed",cost:Dr(e.cost_json),result:JSON.parse(e.result_json),evidence:JSON.parse(e.evidence_json),started_at:e.started_at,completed_at:e.completed_at}}function va(e){return{id:e.id,host:e.host,mode:e.mode,enabled:!!e.enabled,native_schedule_supported:!!e.native_schedule_supported,native_id:e.native_id,desired:JSON.parse(e.desired_json),updated_at:e.updated_at}}function an(e){return{id:e.id,project_id:e.project_id,summary:e.summary,status:e.status,due_at:e.due_at,ttl_expires_at:e.ttl_expires_at,source:JSON.parse(e.source_json),created_at:e.created_at,updated_at:e.updated_at}}function lc(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{value:e}}function cc(e){return e.replaceAll("\\","\\\\").replaceAll("%","\\%").replaceAll("_","\\_")}function Te(e){return e?1:0}function sn(e){return e.split(/[^\p{L}\p{N}_-]+/u).map(t=>t.trim()).filter(Boolean).slice(0,8).map(t=>`"${t.replaceAll('"','""')}"`).join(" OR ")}var Ce=class extends Error{code="APPROVAL_ALREADY_DECIDED";id;status;constructor(t){super(`Approval ${t.id} is already ${t.status}`),this.name="ApprovalDecisionError",this.id=t.id,this.status=t.status}};function ka(e,t){if(!nr(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=t.created_at??new Date().toISOString();return e.prepare(`INSERT INTO approvals (
|
|
3
|
+
`)}function Wc(e){return{start:`<!-- nativesoul:${e}:start v1 -->`,end:`<!-- nativesoul:${e}:end -->`}}function te(e,t){if(!t)return!1;let r=Wc(t);return e.includes(r.start)&&e.includes(r.end)}var de=At(()=>{"use strict"});function O(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ve(e){try{return JSON.parse(e)}catch{return null}}async function Z(e){let t=await G(e);if(t===null)return null;let r=Ve(t);return O(r)?r:null}function at(e){return O(e)?Object.keys(e).filter(t=>t.trim().length>0):[]}function mn(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function st(e,t){if(Array.isArray(e))return e;if(!O(e))return[];for(let r of t){let o=e[r];if(Array.isArray(o))return o}return[]}function I(e,t){if(!O(e))return null;for(let r of t){let o=e[r];if(typeof o=="string"&&o.trim().length>0)return o.trim()}return null}function se(e,t){if(!O(e))return null;for(let r of t){let o=e[r];if(typeof o=="boolean")return o}return null}function M(e,t){let r=t?.allowSlash===!0?/[^a-z0-9._/-]+/gu:/[^a-z0-9._-]+/gu;return e.trim().toLowerCase().replace(r,"-").replace(/^-+|-+$/gu,"")||"unknown"}var We=At(()=>{"use strict";de()});import{readdir as Tf,readFile as Cf}from"node:fs/promises";import ed from"node:path";function rd(e){let t=e??j("~/.claude");return ed.join(t,"scheduled-tasks")}async function od(e){if(!await W(e))return null;let t=await Zc(e,td);if(t!==null)return t;let r=await Nf(e);for(let o of r){let n=await Zc(e,o);if(n!==null)return n}return null}async function Zc(e,t){let r=ed.join(e,t,"SKILL.md");if(!await x(r))return null;let n=(await Cf(r,"utf8")).toLowerCase();return t===td||t.includes(Of)||n.includes(`name: ${Qc}`)||n.includes(`# ${Qc}`)?`claude:scheduled-task:${t}`:null}async function Nf(e){try{return(await Tf(e,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>r.name)}catch{return[]}}var td,Of,Qc,nd=At(()=>{"use strict";de();td="nativesoul-heartbeat",Of="nativesoul-heartbeat",Qc="life:heartbeat"});import{mkdir as Mf,readFile as Lf,writeFile as Df}from"node:fs/promises";import Br from"node:path";import{fileURLToPath as Hf}from"node:url";async function sd(e){try{let t=Br.join(e,ad);await Mf(t,{recursive:!0,mode:448});let r=Br.join(t,"SKILL.md"),o=await Ff();return await Df(r,o??$f,"utf8"),!0}catch{return!1}}async function Ff(){let e=Br.dirname(Hf(import.meta.url)),t=[Br.resolve(process.cwd(),"plugins","claude-nativesoul","skills","life-heartbeat","SKILL.md"),Br.resolve(e,"../../../../plugins/claude-nativesoul/skills/life-heartbeat/SKILL.md")];for(let r of t)if(await x(r))return Lf(r,"utf8");return null}var ad,zP,$f,id=At(()=>{"use strict";de();ad="nativesoul-heartbeat",zP=`claude:scheduled-task:${ad}`,$f='---\nname: life:heartbeat\ndescription: Run NativeSoul heartbeat from a Claude Scheduled Task.\n---\n\n# life:heartbeat\n\nUse this skill only when invoked by a Claude Scheduled Task for NativeSoul heartbeat checks.\n\nDefault policy: read-only. Do not edit workspace files, memories, `SOUL.md`, `POLICY.md`, scheduler state, or host configuration unless explicitly allowed.\n\n1. Determine the project from the Scheduled Task context. If it is missing, use the current working directory.\n2. Claim a local heartbeat lease through MCP `life_heartbeat_claim` with `host="claude"`, project id or directory, and the Scheduled Task slot/time as `slot`.\n3. If the claim response says another host owns the lease, the lease is already completed, or no work is needed, stop and return only `HEARTBEAT_OK`.\n4. Read NativeSoul context through MCP and inspect heartbeat guidance such as `HEARTBEAT.md`.\n5. If no operator-visible action is required, complete the lease with MCP `life_heartbeat_complete` and `result="HEARTBEAT_OK"`, then return only `HEARTBEAT_OK`.\n6. If action is required, complete the lease with concise evidence, then report the action request without secrets or raw credentials.\n\n`HEARTBEAT_OK` is a silent acknowledgement token. Do not notify the user for it.\n'});var ld={};nc(ld,{discoverClaudeScheduledTasksManifest:()=>Uf});async function Uf(e={}){let t=rd(e.hostConfigRoot);if(!e.apply&&!await W(t)||(e.surface==="claude-code"?"claude-code":"claude-desktop")==="claude-code")return null;let o=await od(t);return o!==null?Za({nativeId:o,evidenceSource:"filesystem"}):e.apply&&await sd(t)?Za({nativeId:"claude:scheduled-task:nativesoul-heartbeat",evidenceSource:"filesystem-provisioned"}):await W(t)?Za({nativeId:void 0,evidenceSource:"filesystem"}):null}function Za(e){return{supported:!0,native_id:e.nativeId,surface:"claude-desktop",scheduler_kind:"local_scheduled_task",creation_surface:"official_machine_readable",evidence_source:e.evidenceSource}}var cd=At(()=>{"use strict";nd();id();de()});var xd={};nc(xd,{discoverCodexAutomationsManifest:()=>rh});import{readFile as ts}from"node:fs/promises";import hn from"node:path";import{spawnSync as Xf}from"node:child_process";async function rh(e={}){let t=await oh();if(t)return t;let r=await nh(e.hostConfigRoot);return r||(e.apply?(await sh(),await ah()):null)}async function oh(){let e=process.env.NATIVESOUL_CODEX_AUTOMATIONS_FIXTURES;if(e)try{return rs(await ts(hn.join(e,"automations.json"),"utf8"))}catch{return null}let t=process.env.NATIVESOUL_CODEX_AUTOMATIONS_MANIFEST;if(t)try{return rs(await ts(t,"utf8"))}catch{return null}return null}async function nh(e){let t=e??j("~/.codex"),r=[hn.join(t,"automations.json"),hn.join(t,"automations","nativesoul-heartbeat.json"),hn.join(t,"automations","manifest.json")];for(let o of r){if(!await x(o))continue;let n=await ts(o,"utf8"),a=rs(n);if(a?.supported)return a;let s=Ve(n);if(!s)continue;let i=Pd(s);if(i)return i}return null}async function ah(){let e=ih();for(let t of e)for(let r of Qf){let o=await lh(()=>dh(t,r),eh),n=Pd(o);if(n)return n}return null}async function sh(){let e=await Be("codex");e&&Xf(e,["app-server","daemon","start"],{encoding:"utf8",stdio:"ignore",timeout:1e4})}function ih(){let e=new Set;for(let t of[process.env.NATIVESOUL_CODEX_APP_SERVER_URL,process.env.CODEX_APP_SERVER_URL])typeof t=="string"&&t.trim().length>0&&e.add(t.trim());return e.add("http://127.0.0.1:8787"),e.add("http://127.0.0.1:4096"),[...e]}async function lh(e,t){for(let r=0;r<=t;r+=1){let o=await e();if(o!==null)return o;r<t&&await ch(th)}return null}function ch(e){return new Promise(t=>{setTimeout(t,e)})}async function dh(e,t){let r=new AbortController,o=setTimeout(()=>r.abort(),Zf);try{let n=await fetch(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:t,method:t,params:{}}),signal:r.signal});if(!n.ok)return null;let a=await n.json();return!O(a)||"error"in a?null:"result"in a?a.result:a}catch{return null}finally{clearTimeout(o)}}function Pd(e){let t=uh(e);for(let r of t){let o=ph(r),n=JSON.stringify(r).toLowerCase();if(o&&Yf.some(a=>n.includes(a)))return{supported:!0,native_id:o.startsWith("codex:")?o:`codex:automation:${o}`}}return O(e)&&e.supported===!0?{supported:!0,native_id:typeof e.native_id=="string"?e.native_id:void 0}:null}function uh(e){if(Array.isArray(e))return e;if(!O(e))return[];for(let t of["automations","items","results","data"]){let r=e[t];if(Array.isArray(r))return r}return[]}function ph(e){if(!O(e))return null;for(let t of["id","native_id","automation_id","name"]){let r=e[t];if(typeof r=="string"&&r.trim().length>0)return r.trim()}return null}function rs(e){let t=Ve(e);return O(t)?{supported:t.supported===!0,native_id:typeof t.native_id=="string"&&t.native_id.length>0?t.native_id:void 0}:null}var Yf,Qf,Zf,eh,th,jd=At(()=>{"use strict";de();jt();We();Yf=["life:heartbeat","nativesoul-heartbeat","life-heartbeat"],Qf=["automation/list","automations/list","scheduledAutomation/list"],Zf=1e3,eh=2,th=150});import{realpathSync as Rg}from"node:fs";import lE from"node:path";import{fileURLToPath as cE}from"node:url";import{existsSync as dA}from"node:fs";import{mkdirSync as Hg}from"node:fs";import $g from"node:path";import{pathToFileURL as Fg}from"node:url";function or(e){if(!e||typeof e!="object"||Array.isArray(e))return{};let t=e;if(t.source!=="host-reported")return{};let r={schema:sc(t.schema)??1,source:"host-reported"},o=ha(t.model);o&&(r.model=o);let n=ac(t.tokens_in);n!==null&&(r.tokens_in=n);let a=ac(t.tokens_out);a!==null&&(r.tokens_out=a);let s=sc(t.cost_usd);s!==null&&(r.cost_usd=s);let i=ha(t.currency);i?r.currency=i:s!==null&&(r.currency="USD");let l=ha(t.reported_at);return l&&(r.reported_at=l),r}function Dr(e){try{return or(JSON.parse(e))}catch{return{}}}function ha(e){return typeof e=="string"&&e.length>0?e:null}function ac(e){return typeof e!="number"||!Number.isFinite(e)||e<0?null:Math.trunc(e)}function sc(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:null}function Et(e){return{id:e.id,type:e.type,scope:{user:e.scope_user,project:e.scope_project},content:e.content,summary:e.summary,source:JSON.parse(e.source_json),confidence:e.confidence,authority:e.authority,sensitivity:e.sensitivity,status:e.status,created_at:e.created_at,expires_at:e.expires_at,hash:e.hash}}function ya(e){return{memory_id:e.memory_id,scope_project:e.scope_project,source:JSON.parse(e.source_json),schema_version:e.schema_version,provider_id:e.provider_id,model_id:e.model_id,content_hash:e.content_hash,embedding:JSON.parse(e.embedding_json),indexed_text:e.indexed_text,indexed_at:e.indexed_at}}function ic(e){return{id:e.id,type:e.type,actor:e.actor,origin:e.origin,result:e.result,details:JSON.parse(e.details_json),created_at:e.created_at,hash:e.hash}}function on(e){return{uid:e.uid,host:e.host,native_kind:e.native_kind,normalized_kind:e.normalized_kind,source:e.source,schema_hash:e.schema_hash,installed:!!e.installed,enabled:!!e.enabled,active:!!e.active,authenticated:!!e.authenticated,healthy:!!e.healthy,allowed:!!e.allowed,ready:!!e.ready,last_seen_at:e.last_seen_at}}function Hr(e){return{id:e.id,display_name:e.display_name,base_id:e.base_id,source:e.source,first_basis:e.first_basis,status:e.status,created_at:e.created_at,updated_at:e.updated_at,last_seen_at:e.last_seen_at}}function nn(e){return{id:e.id,action:e.action,class:e.class,target:e.target,project:e.project,host:e.host,status:e.status,reviewer:e.reviewer,reason:e.reason,created_at:e.created_at,decided_at:e.decided_at}}function _a(e){return{id:e.id,project_id:e.project_id,title:e.title,description:e.description,status:e.status,priority:e.priority,assigned_host:e.assigned_host,source:e.source,tags:JSON.parse(e.tags_json),metadata:JSON.parse(e.metadata_json),created_at:e.created_at,updated_at:e.updated_at,claimed_at:e.claimed_at,completed_at:e.completed_at}}function ba(e){return{id:e.id,work_item_id:e.work_item_id,project_id:e.project_id,type:e.type,from_status:e.from_status,to_status:e.to_status,actor:e.actor,details:JSON.parse(e.details_json),created_at:e.created_at}}function $r(e){return{id:e.id,slot:e.slot,holder:e.holder,idempotency_key:e.idempotency_key,expires_at:e.expires_at,status:e.status,created_at:e.created_at,completed_at:e.completed_at}}function Fr(e){if(e.kind!=="heartbeat"||e.status!=="completed"||!e.completed_at)throw new Error(`Invalid heartbeat run row: ${e.id}`);return{id:e.id,kind:"heartbeat",host:e.host,project_id:e.project_id,status:"completed",cost:Dr(e.cost_json),result:JSON.parse(e.result_json),evidence:JSON.parse(e.evidence_json),started_at:e.started_at,completed_at:e.completed_at}}function va(e){return{id:e.id,host:e.host,mode:e.mode,enabled:!!e.enabled,native_schedule_supported:!!e.native_schedule_supported,native_id:e.native_id,desired:JSON.parse(e.desired_json),updated_at:e.updated_at}}function an(e){return{id:e.id,project_id:e.project_id,summary:e.summary,status:e.status,due_at:e.due_at,ttl_expires_at:e.ttl_expires_at,source:JSON.parse(e.source_json),created_at:e.created_at,updated_at:e.updated_at}}function lc(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{value:e}}function cc(e){return e.replaceAll("\\","\\\\").replaceAll("%","\\%").replaceAll("_","\\_")}function Te(e){return e?1:0}function sn(e){return e.split(/[^\p{L}\p{N}_-]+/u).map(t=>t.trim()).filter(Boolean).slice(0,8).map(t=>`"${t.replaceAll('"','""')}"`).join(" OR ")}var Ce=class extends Error{code="APPROVAL_ALREADY_DECIDED";id;status;constructor(t){super(`Approval ${t.id} is already ${t.status}`),this.name="ApprovalDecisionError",this.id=t.id,this.status=t.status}};function ka(e,t){if(!nr(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=t.created_at??new Date().toISOString();return e.prepare(`INSERT INTO approvals (
|
|
4
4
|
id, action, class, target, project, host, status, reviewer, reason, created_at, decided_at
|
|
5
5
|
) VALUES (?, ?, ?, ?, ?, ?, 'pending', NULL, NULL, ?, NULL)`).run(t.id,t.action,t.class,t.target??null,t.project??null,t.host??null,r),Pt(e,t.id)}function wa(e,t){if(!nr(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=t.created_at??new Date().toISOString(),o=t.decided_at??r;return e.prepare(`INSERT INTO approvals (
|
|
6
6
|
id, action, class, target, project, host, status, reviewer, reason, created_at, decided_at
|
|
7
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.action,t.class,t.target??null,t.project??null,t.host??null,t.status,t.reviewer,t.reason??null,r,o),Pt(e,t.id)}function Pt(e,t){if(!nr(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=e.prepare("SELECT * FROM approvals WHERE id = ?").get(t);return{available:!0,approval:r?nn(r):null,warning:null}}function
|
|
7
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.action,t.class,t.target??null,t.project??null,t.host??null,t.status,t.reviewer,t.reason??null,r,o),Pt(e,t.id)}function Pt(e,t){if(!nr(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=e.prepare("SELECT * FROM approvals WHERE id = ?").get(t);return{available:!0,approval:r?nn(r):null,warning:null}}function Ra(e,t){if(!nr(e))return{available:!1,approvals:[],warning:"approvals_not_available"};let r=t?e.prepare("SELECT * FROM approvals WHERE status = ? ORDER BY created_at DESC, id DESC"):e.prepare("SELECT * FROM approvals ORDER BY created_at DESC, id DESC");return{available:!0,approvals:(t?r.all(t):r.all()).map(nn),warning:null}}function Sa(e,t){if(!nr(e))return{available:!1,approval:null,warning:"approvals_not_available"};let r=e.prepare(`SELECT * FROM approvals
|
|
8
8
|
WHERE status = 'pending'
|
|
9
9
|
AND action = ?
|
|
10
10
|
AND class = ?
|
|
@@ -155,7 +155,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function xg(e){return{...Hr(e),coun
|
|
|
155
155
|
FROM memories m
|
|
156
156
|
LEFT JOIN semantic_memory_index s ON s.memory_id = m.id
|
|
157
157
|
WHERE m.status = 'active'
|
|
158
|
-
AND m.scope_project = ?`).get(t.providerId,t.modelId,t.schemaVersion,t.project);return
|
|
158
|
+
AND m.scope_project = ?`).get(t.providerId,t.modelId,t.schemaVersion,t.project);return Sc(r)}function Rc(e,t){let r=e.prepare(`SELECT
|
|
159
159
|
COUNT(m.id) AS indexable_count,
|
|
160
160
|
COUNT(s.memory_id) AS indexed_count,
|
|
161
161
|
SUM(CASE
|
|
@@ -168,7 +168,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function xg(e){return{...Hr(e),coun
|
|
|
168
168
|
END) AS stale_count
|
|
169
169
|
FROM memories m
|
|
170
170
|
LEFT JOIN semantic_memory_index s ON s.memory_id = m.id
|
|
171
|
-
WHERE m.status IN ('active', 'candidate')`).get(t.providerId,t.modelId,t.schemaVersion);return
|
|
171
|
+
WHERE m.status IN ('active', 'candidate')`).get(t.providerId,t.modelId,t.schemaVersion);return Sc(r)}function Sc(e){return{indexable_count:e?.indexable_count??0,indexed_count:e?.indexed_count??0,stale_count:e?.stale_count??0}}function Da(e,t){e.prepare(`INSERT INTO work_items (
|
|
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
174
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.project_id,t.title,t.description,t.status,t.priority,t.assigned_host,t.source,JSON.stringify(t.tags),JSON.stringify(t.metadata),t.created_at,t.updated_at,t.claimed_at,t.completed_at);let r=sr(e,t.id);if(!r)throw new Error(`Work item not found after insert: ${t.id}`);return r}function sr(e,t){if(!Ba(e))return null;let r=e.prepare("SELECT * FROM work_items WHERE id = ?").get(t);return r?_a(r):null}function Ha(e,t){if(!Ba(e))return[];let r=[],o=[];t.project&&(r.push("project_id = ?"),o.push(t.project)),t.status&&(r.push("status = ?"),o.push(t.status)),t.priority&&(r.push("priority = ?"),o.push(t.priority)),t.assignedHost&&(r.push("assigned_host = ?"),o.push(t.assignedHost));let n=r.length?`WHERE ${r.join(" AND ")}`:"";return e.prepare(`SELECT * FROM work_items ${n} ORDER BY updated_at DESC, id DESC LIMIT ?`).all(...o,xc(t.limit)).map(_a)}function $a(e,t){if(!Ba(e))return null;e.exec("BEGIN IMMEDIATE");try{let r=sr(e,t.id);if(!r)return e.exec("COMMIT"),null;let o=t.status??r.status,n=t.priority??r.priority,a=t.assignedHost!==void 0?t.assignedHost:r.assigned_host,s=t.description!==void 0?t.description:r.description,i=t.tags!==void 0?t.tags:r.tags,l=t.metadata!==void 0?t.metadata:r.metadata,c=t.claimedAt!==void 0?t.claimedAt:r.claimed_at,d=t.completedAt!==void 0?t.completedAt:r.completed_at;e.prepare(`UPDATE work_items
|
|
@@ -455,7 +455,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function xg(e){return{...Hr(e),coun
|
|
|
455
455
|
|
|
456
456
|
CREATE INDEX IF NOT EXISTS idx_approvals_status ON approvals(status);
|
|
457
457
|
`),xt(e,7,"approvals","sha256:approvals")}function xt(e,t,r,o){e.prepare("SELECT version FROM migrations WHERE version = ?").get(t)||e.prepare("INSERT INTO migrations (version, name, checksum, applied_at) VALUES (?, ?, ?, ?)").run(t,r,o,new Date().toISOString())}var Cc=["hosts","sessions","memory_edges","commitments","standing_orders","capability_sources","capability_experience","schedules","leases","runs","work_items","work_item_events"];var cn=class{path;db;constructor(t,r={}){this.path=t,r.readOnly||Hg($g.dirname(t),{recursive:!0,mode:448});let{DatabaseSync:o}=jc(),n=r.readOnly?Ug(t):t;this.db=new o(n,r.readOnly?{readOnly:!0}:{}),Ic(this.db,{readOnly:r.readOnly}),r.readOnly||Tc(this.db)}close(){this.db.close()}integrityCheck(){return this.db.prepare("PRAGMA integrity_check").get()?.integrity_check??"unknown"}counts(){return{migrations:this.countTable("migrations"),memories:this.countTable("memories"),events:this.countTable("events"),capabilities:this.countTable("capabilities"),ledger:this.domainLedgerCounts()}}domainLedgerCounts(){return Object.fromEntries(Cc.map(r=>[r,this.countDomainTable(r)]))}insertEvent(t){this.db.prepare(`INSERT INTO events (id, type, actor, origin, result, details_json, created_at, hash)
|
|
458
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.type,t.actor,t.origin,t.result,JSON.stringify(t.details),t.created_at,t.hash)}listEvents(t){let r=[],o=[];t.type&&(r.push("type = ?"),o.push(t.type)),t.result&&(r.push("result = ?"),o.push(t.result));let n=r.length?`WHERE ${r.join(" AND ")}`:"";return this.db.prepare(`SELECT * FROM events ${n} ORDER BY created_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(ic)}createApproval(t){return ka(this.db,t)}createDecidedApproval(t){return wa(this.db,t)}getApproval(t){return Pt(this.db,t)}listApprovals(t){return
|
|
458
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.type,t.actor,t.origin,t.result,JSON.stringify(t.details),t.created_at,t.hash)}listEvents(t){let r=[],o=[];t.type&&(r.push("type = ?"),o.push(t.type)),t.result&&(r.push("result = ?"),o.push(t.result));let n=r.length?`WHERE ${r.join(" AND ")}`:"";return this.db.prepare(`SELECT * FROM events ${n} ORDER BY created_at DESC, id DESC LIMIT ?`).all(...o,t.limit).map(ic)}createApproval(t){return ka(this.db,t)}createDecidedApproval(t){return wa(this.db,t)}getApproval(t){return Pt(this.db,t)}listApprovals(t){return Ra(this.db,t)}findPendingApprovalMatch(t){return Sa(this.db,t)}decideApproval(t,r){return Aa(this.db,t,r)}insertWorkItem(t){return Da(this.db,t)}getWorkItem(t){return sr(this.db,t)}listWorkItems(t){return Ha(this.db,t)}updateWorkItem(t){return $a(this.db,t)}insertWorkItemEvent(t){return Fa(this.db,t)}listWorkItemEvents(t,r){return Ua(this.db,t,r)}insertMemory(t){dc(this.db,t)}getMemory(t){return Ea(this.db,t)}updateMemoryStatus(t,r){return uc(this.db,t,r)}listMemories(t){return pc(this.db,t)}upsertProject(t){return xa(this.db,t)}getProject(t){return we(this.db,t)}listProjects(t){return ja(this.db,t)}listProjectsWithCounts(t={}){return Ma(this.db,t)}getProjectDetail(t){return La(this.db,t)}renameProject(t,r,o){return Ia(this.db,t,r,o)}archiveProject(t,r){return Ta(this.db,t,r)}reactivateProject(t,r){return Ca(this.db,t,r)}countProjectMemories(t){return Oa(this.db,t)}forgetProjectMemories(t,r,o){return Na(this.db,t,r,o)}searchMemories(t,r,o){return mc(this.db,t,r,o)}listActiveMemoriesForProject(t,r){return gc(this.db,t,r)}recentMemories(t,r){return Pa(this.db,t,r)}listSemanticIndexableMemories(t){return fc(this.db,t)}upsertSemanticIndex(t){bc(this.db,t)}getSemanticIndex(t){return vc(this.db,t)}listCurrentSemanticIndexesForProject(t){return kc(this.db,t)}semanticIndexStatsForProject(t){return wc(this.db,t)}semanticIndexStats(t){return Rc(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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
@@ -519,7 +519,7 @@ LEFT JOIN activity a ON a.project_id = p.id`;function xg(e){return{...Hr(e),coun
|
|
|
519
519
|
AND project_id = ?
|
|
520
520
|
AND json_extract(evidence_json, '$.slot') = ?
|
|
521
521
|
ORDER BY completed_at DESC, id DESC
|
|
522
|
-
LIMIT 1`).get(t,r);return o?Fr(o):null}getSchedule(t){let r=this.db.prepare("SELECT * FROM schedules WHERE id = ?").get(t);return r?va(r):null}getCommitment(t){let r=this.db.prepare("SELECT * FROM commitments WHERE id = ?").get(t);return r?an(r):null}expireCommitments(t){this.db.prepare("UPDATE commitments SET status = 'expired', updated_at = ? WHERE status = 'open' AND ttl_expires_at IS NOT NULL AND ttl_expires_at <= ?").run(t,t)}countTable(t){return this.db.prepare(`SELECT COUNT(*) as count FROM ${t}`).get()?.count??0}countDomainTable(t){return Bg(this.db,t)?this.db.prepare(`SELECT COUNT(*) as count FROM ${t}`).get()?.count??0:0}};function _(e,t={}){return new cn(e,t)}function Ug(e){return`${Fg(e).href}?mode=ro&immutable=1`}function Oc(e){return e.trim().replace(/\s+/gu," ").toLocaleLowerCase()}function Bg(e,t){return e.prepare("SELECT EXISTS(SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?) AS exists_count").get(t)?.exists_count===1}import{appendFile as nf,mkdir as af}from"node:fs/promises";import sf from"node:os";import lf from"node:path";import{createHash as Vg,randomUUID as Wg}from"node:crypto";function T(e){return`${e}_${Wg()}`}function E(e){return`sha256:${Vg("sha256").update(e).digest("hex")}`}function Va(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(r=>Va(r)).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${Va(e[r]??null)}`).join(",")}}`}function
|
|
522
|
+
LIMIT 1`).get(t,r);return o?Fr(o):null}getSchedule(t){let r=this.db.prepare("SELECT * FROM schedules WHERE id = ?").get(t);return r?va(r):null}getCommitment(t){let r=this.db.prepare("SELECT * FROM commitments WHERE id = ?").get(t);return r?an(r):null}expireCommitments(t){this.db.prepare("UPDATE commitments SET status = 'expired', updated_at = ? WHERE status = 'open' AND ttl_expires_at IS NOT NULL AND ttl_expires_at <= ?").run(t,t)}countTable(t){return this.db.prepare(`SELECT COUNT(*) as count FROM ${t}`).get()?.count??0}countDomainTable(t){return Bg(this.db,t)?this.db.prepare(`SELECT COUNT(*) as count FROM ${t}`).get()?.count??0:0}};function _(e,t={}){return new cn(e,t)}function Ug(e){return`${Fg(e).href}?mode=ro&immutable=1`}function Oc(e){return e.trim().replace(/\s+/gu," ").toLocaleLowerCase()}function Bg(e,t){return e.prepare("SELECT EXISTS(SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?) AS exists_count").get(t)?.exists_count===1}import{appendFile as nf,mkdir as af}from"node:fs/promises";import sf from"node:os";import lf from"node:path";import{createHash as Vg,randomUUID as Wg}from"node:crypto";function T(e){return`${e}_${Wg()}`}function E(e){return`sha256:${Vg("sha256").update(e).digest("hex")}`}function Va(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(r=>Va(r)).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${Va(e[r]??null)}`).join(",")}}`}function Re(e){return E(Va(e))}import{existsSync as qg}from"node:fs";import Mc from"node:os";var Nc=[{code:"NPM_TOKEN_ASSIGNMENT",source:`(?:^|[\\s"'])NPM_TOKEN\\s*[:=]\\s*["']?[A-Za-z0-9._-]{8,}`,flags:"gimu"},{code:"NPM_AUTH_TOKEN",source:"\\/\\/registry\\.npmjs\\.org\\/:_authToken\\s*=\\s*[A-Za-z0-9._-]+",flags:"gimu"},{code:"NPM_AUTH_ASSIGNMENT",source:`(?:^|[\\s"'])_auth\\s*=\\s*[A-Za-z0-9+/=_-]{12,}`,flags:"gimu"},{code:"NPM_TOKEN_VALUE",source:"npm_[A-Za-z0-9]{30,}",flags:"gu"},{code:"GITHUB_TOKEN",source:"(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{30,}",flags:"gu"},{code:"GITHUB_FINE_GRAINED_TOKEN",source:"github_pat_[A-Za-z0-9_]{40,}",flags:"gu"},{code:"OPENAI_PROJECT_KEY",source:"sk-(?:proj|svcacct|admin)-[A-Za-z0-9_-]{20,}",flags:"gu"},{code:"OPENAI_LEGACY_KEY",source:"sk-[A-Za-z0-9_-]{10,}",flags:"gu"},{code:"ANTHROPIC_KEY",source:"sk-ant-[A-Za-z0-9_-]{20,}",flags:"gu"},{code:"GOOGLE_API_KEY",source:"AIza[0-9A-Za-z_-]{30,}",flags:"gu"},{code:"SLACK_TOKEN",source:"xox[abopr]-[0-9A-Za-z-]{20,}",flags:"gu"},{code:"SLACK_WEBHOOK",source:"https:\\/\\/hooks\\.slack\\.com\\/services\\/[A-Za-z0-9/_-]{20,}",flags:"gu"},{code:"STRIPE_LIVE_KEY",source:"sk_live_[0-9A-Za-z]{20,}",flags:"gu"},{code:"AWS_ACCESS_KEY",source:"AKIA[0-9A-Z]{16}",flags:"gu"},{code:"AWS_SESSION_KEY",source:"ASIA[0-9A-Z]{16}",flags:"gu"},{code:"PRIVATE_KEY_BLOCK",source:"-----BEGIN [A-Z ]*PRIVATE KEY-----[\\s\\S]*?-----END [A-Z ]*PRIVATE KEY-----",flags:"gu"},{code:"PRIVATE_KEY_HEADER",source:"-----BEGIN [A-Z ]*PRIVATE KEY-----",flags:"gu"},{code:"AUTHORIZATION_BEARER",source:"Authorization:\\s*Bearer\\s+[A-Za-z0-9._~+/=-]{16,}",flags:"gimu"},{code:"JWT_VALUE",source:"eyJ[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}",flags:"gu"},{code:"SIGNING_SECRET_ASSIGNMENT",source:`(?:GPG_PRIVATE_KEY|COSIGN_PASSWORD|SIGSTORE_ID_TOKEN)\\s*[:=]\\s*["']?[^"'\\s]{8,}`,flags:"gimu"},{code:"GENERIC_SECRET_ASSIGNMENT",source:`(?:secret|password|api[_-]?key|auth[_-]?token|client_secret|webhook_secret)\\s*[:=]\\s*["']?[^"'\\s]{12,}["']?`,flags:"gimu"},{code:"GENERIC_ENV_SECRET_ASSIGNMENT",source:`[A-Z0-9_]*(?:TOKEN|SECRET|PASSWORD|API_KEY)\\s*=\\s*(?!sk-test-secret-value\\b)[^\\s"']{12,}`,flags:"gu"},{code:"ENV_DUMP",source:'"env"\\s*:\\s*\\{[^}]+(?:TOKEN|SECRET|PASSWORD|API_KEY)[^}]+\\}',flags:"gimu"}];var Gg=Nc.map(e=>new RegExp(e.source,e.flags.includes("g")?e.flags:`${e.flags}g`));function N(e){let t=!1,r=e;for(let o of Gg)r=r.replace(o,n=>{t=!0;let a=n.match(/^(Authorization:\s*Bearer\s+)/iu);if(a?.[1])return`${a[1]}[REDACTED_SECRET]`;let s=n.match(/^([^:=]+[:=]\s*)/u);return s?.[1]?`${s[1]}[REDACTED_SECRET]`:"[REDACTED_SECRET]"});return{value:r,redacted:t}}function H(e){if(typeof e=="string")return N(e).value;if(Array.isArray(e))return e.map(t=>H(t));if(e&&typeof e=="object"){let t={};for(let[r,o]of Object.entries(e))t[r]=H(o);return t}return e}function ir(e,t=[process.cwd(),Mc.homedir()]){if(typeof e=="string")return t.filter(r=>r&&qg(r)).reduce((r,o)=>r.replaceAll(o,o===Mc.homedir()?"[REDACTED_USER_HOME]":"[REDACTED_WORKSPACE]"),e);if(Array.isArray(e))return e.map(r=>ir(r,t));if(e&&typeof e=="object"){let r={};for(let[o,n]of Object.entries(e))r[o]=ir(n,t);return r}return e}import{mkdir as Hc,readFile as Kg,writeFile as Wa}from"node:fs/promises";import{constants as zg,existsSync as $c}from"node:fs";import{access as Xg}from"node:fs/promises";import Yg from"node:os";import Oe from"node:path";var dn={"AGENTS.md":`# NativeSoul \u2014 Operating Instructions
|
|
523
523
|
|
|
524
524
|
_Injected into every supported host via managed blocks. Keep operational rules here._
|
|
525
525
|
|
|
@@ -848,8 +848,8 @@ _Running context for today. Promote durable facts to curated memory later._
|
|
|
848
848
|
## Follow-ups
|
|
849
849
|
|
|
850
850
|
-
|
|
851
|
-
`}var Qg=["memory/daily","memory/projects","memory/archive","commitments","standing-orders","capabilities/cards","generated","state","logs","backups","proposals"],Zg=dn;function Fc(e){return Oe.resolve(e??process.env.NATIVESOUL_HOME??Oe.join(Yg.homedir(),".nativesoul"))}function f(e){let t=Fc(e);return{home:t,database:Oe.join(t,"state","nativesoul.sqlite"),auditLog:Oe.join(t,"logs","audit.jsonl")}}async function A(e){try{return await Xg(e,zg.F_OK),!0}catch{return!1}}async function v(e){let t=f(e),r=[],o=[],n=[];$c(t.home)||(await Hc(t.home,{recursive:!0,mode:448}),r.push(t.home));for(let i of Qg){let l=Oe.join(t.home,i);$c(l)||(await Hc(l,{recursive:!0,mode:448}),r.push(l))}let a=await A(Oe.join(t.home,"state","onboarding.complete"));for(let[i,l]of Object.entries(Zg)){if(i==="BOOTSTRAP.md"&&a)continue;let c=Oe.join(t.home,i);if(await A(c)){n.push(c);continue}try{await Wa(c,tf(i,l),{encoding:"utf8",mode:384,flag:"wx"}),o.push(c)}catch(d){if(rf(d)){n.push(c);continue}throw d}}let s=await of(t.home);return o.push(...s.createdFiles),n.push(...s.preservedFiles),{home:t.home,database:t.database,createdDirectories:r,createdFiles:o,preservedFiles:n}}function ef(e=Intl.DateTimeFormat){return e().resolvedOptions().timeZone??"UTC"}function tf(e,t){return e!=="config.yaml"?t:t.replace(/^timezone: .+$/m,`timezone: ${ef()}`)}function rf(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST"}async function of(e){let t=[],r=[],o=new Date().toISOString().slice(0,10),n=Oe.join(e,"memory","daily",`${o}.md`);await A(n)?r.push(n):(await Wa(n,Dc(o),{encoding:"utf8",mode:384,flag:"wx"}),t.push(n));let a=Oe.join(e,"standing-orders","example.yaml");return await A(a)?r.push(a):(await Wa(a,Lc,{encoding:"utf8",mode:384,flag:"wx"}),t.push(a)),{createdFiles:t,preservedFiles:r}}async function ce(e,t){let r=Oe.join(e,t);return await A(r)?Kg(r,"utf8"):""}async function h(e){let t=f(e.home),r=new Date().toISOString(),o=qa(H(e.details??{}),t.home),n={id:T("evt"),type:e.type,actor:e.actor??"cli",origin:e.origin??"nativesoul",result:e.result??"ok",details:o,created_at:r,hash:
|
|
852
|
-
`,{encoding:"utf8",mode:384}),n}function qa(e,t){if(typeof e=="string")return cf(e,t);if(Array.isArray(e))return e.map(r=>qa(r,t));if(e&&typeof e=="object"){let r={};for(let[o,n]of Object.entries(e))r[o]=qa(n,t);return r}return e}function cf(e,t){return[[new RegExp(Ja(t),"gu"),"[REDACTED_NATIVESOUL_HOME]"],[new RegExp(Ja(process.cwd()),"gu"),"[REDACTED_WORKSPACE]"],[new RegExp(Ja(sf.homedir()),"gu"),"[REDACTED_USER_HOME]"],[/\/Users\/[A-Za-z0-9._-]+/gu,"[REDACTED_USER_HOME]"],[/\/home\/[A-Za-z0-9._-]+/gu,"[REDACTED_USER_HOME]"],[/[A-Z]:[\\/]+Users[\\/]+[A-Za-z0-9._-]+/gu,"[REDACTED_USER_HOME]"]].reduce((o,[n,a])=>o.replace(n,a),e)}function Ja(e){return e.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}async function un(e){let t=f(e.home),r=_(t.database);try{return r.listEvents({type:e.type,result:e.result,limit:df(e.limit)})}finally{r.close()}}async function Ga(e){let t=f(e.home),r=await un(e);return await h({home:t.home,type:"audit_exported",details:{format:e.format,count:r.length,type:e.type??null,result:e.result??null}}),{format:e.format,events:r}}function df(e){return Math.min(Math.max(e??50,1),500)}import Le from"node:path";import{existsSync as P_}from"node:fs";import{mkdir as Kh,readdir as zh,readFile as fs,writeFile as Xh}from"node:fs/promises";import{existsSync as Yh}from"node:fs";import Xr from"node:path";jt();de();We();de();import{readdir as vf}from"node:fs/promises";import fe from"node:path";var Re="antigravity",kf="~/.gemini/GEMINI.md",wf="~/.antigravity",za="official:antigravity-plugin-config:v1",Jc="official:antigravity-hooks-config:v1",qc="official:antigravity-mcp-config:v1",Gc="official:antigravity-command-config:v1",Sf="official:antigravity-context-config:v1",Rf="official:antigravity-features:v1",Af=[{uid:"antigravity:plugins",nativeKind:"plugins",normalizedKind:"package",relativePath:"plugins"}];function Xa(){let e=process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim();return e?fe.resolve(e):j(wf)}function Ef(){let e=Xa();return{root:e,globalInstruction:process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim()?fe.join(e,"GEMINI.md"):j(kf)}}async function Kc(){let e=[],t=Ef();await x(t.globalInstruction)&&e.push({uid:"antigravity:global-gemini-md",host:Re,nativeKind:"global_context",normalizedKind:"instruction",source:t.globalInstruction,schemaHash:Sf}),await Pf(t.root,e),await xf(t.root,e);for(let r of Af){let o=fe.join(t.root,r.relativePath);await W(o)&&e.push({uid:r.uid,host:Re,nativeKind:r.nativeKind,normalizedKind:r.normalizedKind,source:o,schemaHash:za})}return e}async function Pf(e,t){let r=fe.join(e,"plugin.json"),o=fe.join(e,"nativesoul-package.json"),n=fe.join(e,"hooks.json"),a=fe.join(e,"mcp_config.json"),[s,i,l,c]=await Promise.all([Z(r),Z(o),Z(n),Z(a)]);if(s){let d=I(s,["name","id"])??"unknown";t.push({uid:`antigravity:plugin:${M(d)}`,host:Re,nativeKind:"plugin",normalizedKind:"extension",source:r,schemaHash:za})}if(i){let d=I(i,["name","id"])??"unknown";t.push({uid:`antigravity:package:${M(d)}`,host:Re,nativeKind:"native_plugin_package",normalizedKind:"package",source:o,schemaHash:za});let p=O(i.nativeSoul)?i.nativeSoul:{};for(let k of mn(p.commands))t.push({uid:`antigravity:command:${M(k)}`,host:Re,nativeKind:"command",normalizedKind:"command",source:`${o}:nativeSoul.commands.${k}`,schemaHash:Gc});let g=O(p.mcpServer)?p.mcpServer:null,y=I(g,["name"]);y&&t.push({uid:`antigravity:mcp:${M(y)}`,host:Re,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:nativeSoul.mcpServer.${y}`,schemaHash:qc})}if(l){t.push({uid:"antigravity:hooks:manifest",host:Re,nativeKind:"hooks",normalizedKind:"lifecycle_hooks",source:n,schemaHash:Jc});let d=O(l.hooks)?l.hooks:{};for(let p of Object.keys(d))t.push({uid:`antigravity:hook:${M(p)}`,host:Re,nativeKind:"hook",normalizedKind:"lifecycle_hook",source:`${n}:hooks.${p}`,schemaHash:Jc})}if(c)for(let d of at(c.mcpServers))t.push({uid:`antigravity:mcp:${M(d)}`,host:Re,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${a}:mcpServers.${d}`,schemaHash:qc});await jf(fe.join(e,"commands"),t)}async function xf(e,t){let r=fe.join(e,"features-evidence.json"),o=await Z(r);if(!o)return;let n=["scheduled_tasks","cron_schedules","background_agents","subagents","skills","mcps","json_hooks"];for(let a of n)o[a]===!0&&t.push({uid:`antigravity:feature:${a.replace(/_/gu,"-")}`,host:Re,nativeKind:"product_feature",normalizedKind:"feature_evidence",source:`${r}:${a}`,schemaHash:Rf})}async function jf(e,t){if(!await W(e))return;let r=await vf(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||fe.extname(o.name)!==".md")continue;let n=fe.basename(o.name,".md");t.push({uid:`antigravity:command:${M(n,{allowSlash:!0})}`,host:Re,nativeKind:"command",normalizedKind:"command",source:fe.join(e,o.name),schemaHash:Gc})}}de();We();import gn from"node:path";async function zc(e){let t=await If(e);if(!t)return null;let r=await Z(t);return r?{product_features_verified:r.product_features_verified===!0,write_contract_verified:r.write_contract_verified===!0,native_id:typeof r.native_id=="string"&&r.native_id.trim().length>0?r.native_id.trim():void 0,enabled:typeof r.enabled=="boolean"?r.enabled:void 0,updated_at:typeof r.updated_at=="string"?r.updated_at:void 0,contract:O(r.contract)?{schedule:I(r.contract,["schedule"])??void 0,status:I(r.contract,["status"])??void 0,cancel:I(r.contract,["cancel"])??void 0,list:I(r.contract,["list"])??void 0,project_binding:I(r.contract,["project_binding"])??void 0}:void 0}:null}async function If(e){let t=process.env.NATIVESOUL_ANTIGRAVITY_SCHEDULER_MANIFEST?.trim();if(t)return t;let r=process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim();if(r)return gn.join(gn.resolve(r),"scheduler-proof.json");let o=e??j("~/.antigravity"),n=[gn.join(o,"scheduler-proof.json"),gn.join(o,"native-scheduler-proof.json")];for(let a of n)if(await x(a))return a;return null}function Xc(e){if(!e)return!1;let t=Date.parse(e);return Number.isFinite(t)?Date.now()-t>10080*60*1e3:!0}var lr="antigravity",Ya="~/.gemini/GEMINI.md",Qa=class{async detect(){let t=j(Ya),r=Xa(),[o,n,a]=await Promise.all([x(t),W(r),Be("agy")]);return{host:lr,detected:n||a!==null,path:n?r:a??(o?t:void 0),capabilities:{installed:n||a!==null,enabled:n,active:!1,authenticated:!1,healthy:a!==null||n,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Antigravity direct adapter writes are disabled; use the install orchestrator to install the NativeSoul native hook plugin, MCP registration, and managed block."}}async uninstall(t){return{status:"unsupported",reason:"Antigravity direct adapter uninstall is disabled; use the uninstall orchestrator for reversible package removal."}}async coldScan(){return Kc()}async hotProbe(){let t=await this.coldScan();return{host:lr,checkedAt:new Date().toISOString(),capabilities:t.map(r=>({...r,installed:!0,enabled:!0,active:r.nativeKind==="global_context",authenticated:!1,healthy:!0,allowed:!0,ready:r.schemaHash?.startsWith("official:")===!0}))}}async bootstrap(){return{tier:"A",mechanism:"hook",supported:!0}}async reload(t){return{status:"unsupported",reason:"Antigravity reload is host-driven; use the installed NativeSoul command package or restart the host if needed."}}async update(t){return{status:"unsupported",reason:"Antigravity package updates are handled by the NativeSoul install orchestrator."}}async scheduleReconcile(t){let r=await zc(t.hostConfigRoot);if(!r?.product_features_verified)return{status:"unsupported",reason:"Antigravity Scheduled Tasks product-level evidence was not detected; no hidden cron fallback installed."};if(!r.write_contract_verified)return{status:"unsupported",reason:"Antigravity product-level Scheduled Tasks are documented, but scheduler write/list/cancel/status contract proof is missing; keep full-native blocked_by_host:scheduler_write_contract_missing."};if(!r.contract?.schedule||!r.contract.status||!r.contract.cancel||!r.contract.list)return{status:"unsupported",reason:"Antigravity scheduler proof is missing one or more required commands: schedule, status, cancel, list."};if(r.enabled===!1)return{status:"degraded",reason:"Antigravity scheduler contract was detected, but the NativeSoul scheduled task is disabled."};if(!r.native_id)return{status:"degraded",reason:"Antigravity scheduler contract was detected, but no native task id mapping was returned."};if(Xc(r.updated_at))return{status:"degraded",reason:"Antigravity scheduler proof is stale; re-run scheduler status/list before claiming full-native."};let o=t.apply?"reconciled":"reconcile planned";return{status:"ok",nativeId:r.native_id,message:`Antigravity Scheduled Task ${o}: ${r.native_id}`}}async doctor(){let t=await this.detect(),r=j(Ya),o=await G(r),n=[];return t.detected||n.push({code:"ANTIGRAVITY_NOT_DETECTED",severity:"warn",message:"No Antigravity CLI or ~/.antigravity directory was detected. A shared ~/.gemini/GEMINI.md alone is not treated as Antigravity readiness.",remediation:"Install Antigravity CLI or review `nativesoul adapters managed-block --host antigravity --json`."}),o&&!te(o,lr)&&n.push({code:"ANTIGRAVITY_MANAGED_BLOCK_MISSING",severity:"info",message:"GEMINI.md exists but has no NativeSoul managed block for Antigravity.",remediation:"Review `nativesoul adapters managed-block --host antigravity --json`."}),n}async managedBlockPreview(){let t=j(Ya),r=await G(t);return{host:lr,targetPath:t,startMarker:"<!-- nativesoul:antigravity:start v1 -->",endMarker:"<!-- nativesoul:antigravity:end -->",content:Ne(lr),wouldCreate:r===null,wouldUpdate:r!==null&&!te(r,lr)}}};function Yc(){return new Qa}jt();We();de();import cr from"node:path";import{readFile as yd}from"node:fs/promises";We();import{readFile as dd}from"node:fs/promises";import Bf from"node:path";var md="life:heartbeat";function gd(e){if(!e||typeof e!="object"||Array.isArray(e))return{kind:"unknown",mode:"leader",apply:!1,skill:md};let t=e;return{kind:typeof t.kind=="string"?t.kind:"unknown",mode:typeof t.mode=="string"?t.mode:"leader",apply:t.apply===!0,skill:qf(t),surface:pd(t.surface)??pd(O(t.desired)?t.desired.surface:void 0)}}async function fd(e={}){let t=process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_FIXTURES;if(t)try{return ud(await dd(Bf.join(t,"scheduled-tasks.json"),"utf8"))}catch{return null}let r=process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_MANIFEST;if(r)try{return ud(await dd(r,"utf8"))}catch{return null}if(process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_SUPPORTED==="1")return{supported:!0,native_id:process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_NATIVE_ID,surface:"claude-desktop",scheduler_kind:"unknown",creation_surface:"unknown",evidence_source:"env"};let{discoverClaudeScheduledTasksManifest:o}=await Promise.resolve().then(()=>(cd(),ld));return o({apply:e.apply,surface:e.surface,hostConfigRoot:e.hostConfigRoot})}function hd(e,t){return!e||e==="default"||!t?!0:e===t}function ud(e){let t=Ve(e);if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t,o=Vf(r.surface),n=Wf(r.scheduler_kind??r.kind);return{supported:r.supported===!0,native_id:typeof r.native_id=="string"&&r.native_id.length>0?r.native_id:void 0,surface:o??(n==="cloud_routine"?"cloud":"claude-desktop"),scheduler_kind:n,creation_surface:Jf(r.creation_surface),evidence_source:typeof r.evidence_source=="string"&&r.evidence_source.trim().length>0?r.evidence_source.trim():void 0,enabled:typeof r.enabled=="boolean"?r.enabled:void 0}}function pd(e){return e==="default"||e==="claude-code"||e==="claude-desktop"?e:void 0}function Vf(e){return e==="claude-code"||e==="claude-desktop"||e==="cloud"?e:void 0}function Wf(e){return e==="local_scheduled_task"||e==="cloud_routine"||e==="ui_only"?e:"unknown"}function Jf(e){return e==="official_machine_readable"||e==="ui_only"||e==="unknown"?e:void 0}function qf(e){return O(e.desired)&&typeof e.desired.skill=="string"&&e.desired.skill.trim().length>0?e.desired.skill.trim():md}var ue="claude",fn="~/.claude/CLAUDE.md",_d="CLAUDE.md",bd=".claude/CLAUDE.md",vd="life:heartbeat",wd="official:claude-cli-hot-scan:v1",es=class{async detect(){let t=j(fn),r=cr.resolve(_d),o=cr.resolve(bd),[n,a,s,i]=await Promise.all([x(t),x(r),x(o),pn("claude",["--version"])]);return{host:ue,detected:n||a||s||i!==null,version:i??void 0,path:n?t:a?r:s?o:void 0,capabilities:{installed:n||a||s||i!==null,enabled:n||a||s,active:a||s,authenticated:!1,healthy:i!==null||n||a||s,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Claude install writes are not implemented in M2.1; use managed-block preview first."}}async uninstall(t){return{status:"unsupported",reason:"Claude uninstall writes are not implemented in M2.1."}}async coldScan(){let t=j(fn),r=cr.resolve(_d),o=cr.resolve(bd),n=[];return await x(t)&&n.push({uid:"claude:global-claude-md",host:ue,nativeKind:"global_context",normalizedKind:"instruction",source:t}),await x(r)&&n.push({uid:"claude:project-claude-md",host:ue,nativeKind:"project_context",normalizedKind:"instruction",source:r}),await x(o)&&n.push({uid:"claude:project-dot-claude-md",host:ue,nativeKind:"project_context",normalizedKind:"instruction",source:o}),n}async hotProbe(t){let r=new Date().toISOString(),o=process.env.NATIVESOUL_CLAUDE_HOT_SCAN_FIXTURES?.trim();if(o){let l=await Gf(o,r);if(l.status==="ready")return l}let[n,a]=await Promise.all([Ka("claude",["mcp","list","--json"],5e3),Ka("claude",["plugin","list","--json"],5e3)]),s=[],i=[];return n.status==="ok"?i.push(...Sd(n.stdout)):s.push(kd("CLAUDE_HOT_SCAN_JSON_UNSUPPORTED","claude mcp list --json",n.stderr)),a.status==="ok"?i.push(...Rd(a.stdout)):s.push(kd("CLAUDE_HOT_SCAN_JSON_UNSUPPORTED","claude plugin list --json",a.stderr)),{host:ue,checkedAt:r,status:s.length===0?"ready":"degraded",warnings:s.map(l=>l.code),remediation:s.length===0?void 0:"Upgrade Claude Code CLI if JSON hot-scan commands are unavailable.",capabilities:i.map(l=>({...l,installed:l.installed??!0,enabled:l.enabled??!0,active:l.active??!0,authenticated:l.authenticated??!1,healthy:l.healthy??!0,allowed:!0,ready:l.ready??!1})),diagnostics:s}}async bootstrap(){return{tier:"B",mechanism:"global-instruction",supported:!0}}async reload(t){return{status:"unsupported",reason:"Claude reload is deferred until plugin lifecycle integration story."}}async update(t){return{status:"unsupported",reason:"Claude update is deferred until plugin lifecycle integration story."}}async scheduleReconcile(t){let r=gd(t),o=await fd({apply:r.apply,surface:r.surface,hostConfigRoot:t.hostConfigRoot});return o?.supported?r.kind!=="heartbeat"?{status:"unsupported",reason:"Claude adapter only supports NativeSoul heartbeat scheduled tasks."}:r.skill!==vd?{status:"error",code:"CLAUDE_HEARTBEAT_SKILL_MISMATCH",message:`Claude heartbeat Scheduled Task must invoke ${vd}.`}:o.scheduler_kind==="cloud_routine"||o.surface==="cloud"?{status:"unsupported",reason:"Claude cloud routines were detected, but they are out-of-scope for local native Scheduled Tasks evidence."}:o.scheduler_kind==="ui_only"||o.creation_surface==="ui_only"?{status:"unsupported",reason:"Claude task creation is UI-only for this surface; keep status blocked_by_host until a documented machine-readable surface returns a local task id."}:hd(r.surface,o.surface)?o.enabled===!1?{status:"degraded",reason:"Claude Scheduled Tasks support was detected, but the NativeSoul task is disabled."}:o.native_id?{status:"ok",nativeId:o.native_id,message:r.apply?`Claude Scheduled Task reconciled: ${o.native_id}`:`Claude Scheduled Task reconcile planned: ${o.native_id}`}:{status:"degraded",reason:"Claude Scheduled Tasks support was detected, but no native task id mapping was returned."}:{status:"unsupported",reason:`Claude Scheduled Tasks evidence is for ${o.surface??"unknown"} and does not satisfy ${r.surface}.`}:{status:"unsupported",reason:"Claude Scheduled Tasks native interface was not detected; no cron fallback installed."}}async doctor(){let t=await this.detect(),r=j(fn),o=await G(r),n=[];return t.detected||n.push({code:"CLAUDE_NOT_DETECTED",severity:"warn",message:"No Claude CLI or CLAUDE.md instruction file was detected.",remediation:"Install Claude Code or create a managed block preview before enabling writes."}),o&&!te(o,ue)&&n.push({code:"CLAUDE_MANAGED_BLOCK_MISSING",severity:"info",message:"Claude global CLAUDE.md exists but has no NativeSoul managed block.",remediation:"Review `nativesoul adapters managed-block --host claude --json`."}),n}async managedBlockPreview(){let t=j(fn),r=await G(t);return{host:ue,targetPath:t,startMarker:"<!-- nativesoul:claude:start v1 -->",endMarker:"<!-- nativesoul:claude:end -->",content:Ne(ue),wouldCreate:r===null,wouldUpdate:r!==null&&!te(r,ue)}}};async function Gf(e,t){try{let[r,o]=await Promise.all([yd(cr.join(e,"mcp-list.json"),"utf8"),yd(cr.join(e,"plugin-list.json"),"utf8")]),n=[...Sd(r),...Rd(o)];return{host:ue,checkedAt:t,status:"ready",warnings:[],capabilities:n.map(a=>({...a,installed:a.installed??!0,enabled:a.enabled??!0,active:a.active??!0,authenticated:a.authenticated??!1,healthy:a.healthy??!0,allowed:!0,ready:a.ready??!1}))}}catch{return{host:ue,checkedAt:t,status:"degraded",warnings:["CLAUDE_HOT_SCAN_FIXTURES_UNAVAILABLE"],remediation:"Set NATIVESOUL_CLAUDE_HOT_SCAN_FIXTURES to a directory containing mcp-list.json and plugin-list.json.",capabilities:[],diagnostics:[{code:"CLAUDE_HOT_SCAN_FIXTURES_UNAVAILABLE",severity:"warn",message:"Claude hot-scan fixtures were configured but could not be read.",remediation:"Verify NATIVESOUL_CLAUDE_HOT_SCAN_FIXTURES points at mcp-list.json and plugin-list.json."}]}}}function Sd(e){let t=Ve(e);return st(t,["servers","mcps","items"]).flatMap(r=>{let o=I(r,["name","id","server","server_name"]);if(!o)return[];let n=I(r,["status","state"]),a=n!=="disabled",s=n==="connected"||n==="ready"||n==="active"||n==="ok"||n==="authenticated";return[{uid:`claude:mcp:${M(o)}`,host:ue,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`claude mcp list:${o}`,schemaHash:wd,enabled:a,active:a,authenticated:se(r,["authenticated"])??s,healthy:a,ready:Ad(n)}]})}function Rd(e){let t=Ve(e);return st(t,["plugins","items"]).flatMap(r=>{let o=I(r,["id","plugin","package"])??I(r,["name"]);if(!o)return[];let n=I(r,["status","state"]),a=se(r,["enabled"])??n!=="disabled",s=se(r,["installed"])??!0;return[{uid:`claude:plugin:${Kf(o)}`,host:ue,nativeKind:"plugin",normalizedKind:"extension",source:`claude plugin list --json:${o}`,schemaHash:wd,installed:s,enabled:a,active:a,authenticated:se(r,["authenticated"])??a,healthy:s,ready:a&&(n===null||Ad(n)||se(r,["enabled"])===!0)}]})}function kd(e,t,r){let o=zf(r.trim()||"command unavailable or unsupported by installed Claude CLI");return{code:e,severity:"warn",message:`${t} did not return supported JSON output: ${o}`,remediation:"Upgrade Claude Code CLI or run `claude mcp list --json` / `claude plugin list --json` manually to confirm support."}}function Ad(e){return e==="ready"||e==="enabled"||e==="active"||e==="ok"||e==="authenticated"||e==="connected"}function Kf(e){return M(e,{allowSlash:!0})}function zf(e){return e.replace(/\b[A-Z0-9_]*(?:TOKEN|SECRET|PASSWORD|API[_-]?KEY)[A-Z0-9_]*\s*=\s*\S+/giu,"[REDACTED_SECRET]").replace(/\bsk-[A-Za-z0-9_-]{8,}\b/gu,"[REDACTED_SECRET]")}function Ed(){return new es}jt();We();de();import ns from"node:path";var ie="codex",yn="~/.codex/AGENTS.md",Id="AGENTS.md",mh=1e3,Td="life:heartbeat",bn="official:codex-app-server:v1",as=class{async detect(){let t=j(yn),r=ns.resolve(Id),[o,n,a]=await Promise.all([x(t),x(r),Be("codex")]);return{host:ie,detected:o||n||a!==null,path:o?t:n?r:a??void 0,capabilities:{installed:o||n||a!==null,enabled:o||n,active:n,authenticated:!1,healthy:a!==null||o||n,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Codex install writes are not implemented in M2.1; use managed-block preview first."}}async uninstall(t){return{status:"unsupported",reason:"Codex uninstall writes are not implemented in M2.1."}}async coldScan(){let t=j(yn),r=ns.resolve(Id),o=[];return await x(t)&&o.push({uid:"codex:global-agents-md",host:ie,nativeKind:"global_context",normalizedKind:"instruction",source:t}),await x(r)&&o.push({uid:"codex:project-agents-md",host:ie,nativeKind:"project_context",normalizedKind:"instruction",source:r}),o}async hotProbe(t){let r=new Date().toISOString(),o=bh(t);if(o){let i=await os(o,r);if(i.status==="ready")return i}let n=process.env.NATIVESOUL_CODEX_APP_SERVER_FIXTURES?.trim();if(n){let i=await os(kh(n),r);if(i.status==="ready")return i}let a=vh(t);if(a){let i=await os(wh(a),r);if(i.status==="ready")return i}let s=await this.coldScan();return{host:ie,checkedAt:r,status:"degraded",warnings:["CODEX_APP_SERVER_UNAVAILABLE"],remediation:"Start Codex App Server and set NATIVESOUL_CODEX_APP_SERVER_URL before running `nativesoul adapters hot-scan --host codex`.",capabilities:s.map(i=>({...i,source:`codex app server fallback config scan:${i.source}`,installed:!0,enabled:!0,active:i.uid.includes("project"),authenticated:!1,healthy:!0,allowed:!0,ready:!1})),diagnostics:[{code:"CODEX_APP_SERVER_UNAVAILABLE",severity:"warn",message:"Codex App Server inventory endpoint is not configured or did not respond with supported JSON.",remediation:"Set NATIVESOUL_CODEX_APP_SERVER_URL to a reachable Codex App Server endpoint."}]}}async bootstrap(){return{tier:"B",mechanism:"global-instruction",supported:!0}}async reload(t){return{status:"unsupported",reason:"Codex reload is deferred until App Server integration story."}}async update(t){return{status:"unsupported",reason:"Codex update is deferred until marketplace/App Server integration story."}}async scheduleReconcile(t){let{discoverCodexAutomationsManifest:r}=await Promise.resolve().then(()=>(jd(),xd)),o=await r({apply:t.apply,hostConfigRoot:t.hostConfigRoot});return o?.supported?t.kind!=="heartbeat"?{status:"unsupported",reason:"Codex adapter only supports NativeSoul heartbeat automations."}:t.desired.skill!==Td?{status:"error",code:"CODEX_HEARTBEAT_SKILL_MISMATCH",message:`Codex heartbeat Automation must invoke ${Td}.`}:o.native_id?{status:"ok",nativeId:o.native_id,message:t.apply?`Codex Automation reconciled: ${o.native_id}`:`Codex Automation reconcile planned: ${o.native_id}`}:{status:"degraded",reason:"Codex Automations support was detected, but no native automation id mapping was returned."}:{status:"unsupported",reason:"Codex Automations native interface was not detected; no cron fallback installed."}}async doctor(){let t=await this.detect(),r=j(yn),o=await G(r),n=[];return t.detected||n.push({code:"CODEX_NOT_DETECTED",severity:"warn",message:"No Codex CLI or AGENTS.md instruction file was detected.",remediation:"Install Codex or create a managed block preview before enabling writes."}),o&&!te(o,ie)&&n.push({code:"CODEX_MANAGED_BLOCK_MISSING",severity:"info",message:"Codex global AGENTS.md exists but has no NativeSoul managed block.",remediation:"Review `nativesoul adapters managed-block --host codex --json`."}),n}async managedBlockPreview(){let t=j(yn),r=await G(t);return{host:ie,targetPath:t,startMarker:"<!-- nativesoul:codex:start v1 -->",endMarker:"<!-- nativesoul:codex:end -->",content:Ne(ie),wouldCreate:r===null,wouldUpdate:r!==null&&!te(r,ie)}}};async function os(e,t){let[r,o,n,a]=await Promise.all([_n(e,"mcpServerStatus/list"),_n(e,"plugin/list"),_n(e,"skills/list"),_n(e,"app/list")]);if([r,o,n,a].some(l=>l===null))return{host:ie,checkedAt:t,status:"degraded",warnings:["CODEX_APP_SERVER_UNAVAILABLE"],remediation:"Ensure Codex App Server is running and supports mcpServerStatus/list, plugin/list, skills/list, and app/list.",capabilities:[],diagnostics:[{code:"CODEX_APP_SERVER_UNAVAILABLE",severity:"warn",message:"Codex App Server did not return supported JSON inventory for all required methods.",remediation:"Check NATIVESOUL_CODEX_APP_SERVER_URL and Codex App Server version."}]};let i=[...fh(r),...hh(o),...yh(n),..._h(a)];return{host:ie,checkedAt:t,status:"ready",warnings:[],capabilities:i.map(l=>({...l,installed:l.installed??!0,enabled:l.enabled??!0,active:l.active??!0,authenticated:l.authenticated??!1,healthy:l.healthy??!0,allowed:!0,ready:l.ready??!1}))}}async function _n(e,t){try{return await e.call(t)}catch{return null}}async function gh(e,t){let r=new AbortController,o=setTimeout(()=>r.abort(),mh);try{let n=await fetch(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:t,method:t,params:{}}),signal:r.signal});if(!n.ok)return null;let a=await n.json();return O(a)&&"error"in a?null:O(a)&&"result"in a?a.result:a}catch{return null}finally{clearTimeout(o)}}function fh(e){return st(e,["servers","mcpServers","items"]).flatMap(t=>{let r=I(t,["id","name","server","server_name"]);if(!r)return[];let o=I(t,["status","state"]),n=vn(t,o);return[{uid:`codex:mcp:${M(r)}`,host:ie,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`codex app server mcpServerStatus/list:${r}`,schemaHash:bn,...n}]})}function hh(e){return st(e,["plugins","items"]).flatMap(t=>{let r=I(t,["id","plugin","package"])??I(t,["name"]);if(!r)return[];let o=I(t,["status","state"]),n=vn(t,o);return[{uid:`codex:plugin:${ss(r)}`,host:ie,nativeKind:"plugin",normalizedKind:"extension",source:`codex app server plugin/list:${r}`,schemaHash:bn,...n}]})}function yh(e){return st(e,["skills","items"]).flatMap(t=>{let r=I(t,["id","name","path"]);if(!r)return[];let o=I(t,["status","state"]),n=vn(t,o);return[{uid:`codex:skill:${ss(r)}`,host:ie,nativeKind:"skill",normalizedKind:"skill",source:`codex app server skills/list:${r}`,schemaHash:bn,...n}]})}function _h(e){return st(e,["apps","items"]).flatMap(t=>{let r=I(t,["id","name","app"]);if(!r)return[];let o=I(t,["status","state"]),n=vn(t,o);return[{uid:`codex:app:${ss(r)}`,host:ie,nativeKind:"app_server_app",normalizedKind:"app",source:`codex app server app/list:${r}`,schemaHash:bn,...n}]})}function vn(e,t){let r=se(e,["installed"])??!0,o=t==="disabled"||t==="unavailable",n=t==="error"||t==="unhealthy",a=se(e,["enabled"])??!o,s=se(e,["active"])??a,i=se(e,["healthy"])??(!o&&!n),l=se(e,["authenticated"])??se(e,["auth"])??!1,c=se(e,["ready"])??(r&&a&&s&&i);return{installed:r,enabled:a,active:s,authenticated:l,healthy:i,ready:c}}function bh(e){if(O(e)){let t=e.appServer;if(O(t)&&typeof t.call=="function")return{call:r=>Promise.resolve(t.call(r))}}return null}function vh(e){if(O(e)){let t=e.appServerUrl;if(typeof t=="string"&&t.trim().length>0)return t.trim()}return process.env.NATIVESOUL_CODEX_APP_SERVER_URL?.trim()||process.env.CODEX_APP_SERVER_URL?.trim()||null}function kh(e){return{async call(t){try{let{readFile:r}=await import("node:fs/promises"),o=t.replace(/\//gu,"-");return JSON.parse(await r(ns.join(e,`${o}.json`),"utf8"))}catch(r){let o=r instanceof Error?r.message:"unknown error";throw new Error(`Codex App Server fixture unavailable for ${t}: ${o}`,{cause:r})}}}}function wh(e){return{call:t=>gh(e,t)}}function ss(e){return M(e,{allowSlash:!0})}function Cd(){return new as}jt();We();de();import{readdir as Nd}from"node:fs/promises";import Ae from"node:path";var re="gemini",ls="~/.gemini/GEMINI.md",Sh="~/.gemini/extensions",Rh="~/.gemini/settings.json",Vr="official:gemini-extension-config:v1",is="official:gemini-settings-config:v1",Ah="official:gemini-memory-config:v1",cs=class{async detect(){let t=Od(),r=t.globalInstruction,o=t.extensionsDirectory,[n,a,s]=await Promise.all([x(r),W(o),pn("gemini",["--version"])]);return{host:re,detected:n||a||s!==null,version:s??void 0,path:n?r:a?o:void 0,capabilities:{installed:n||a||s!==null,enabled:n||a,active:n,authenticated:!1,healthy:s!==null||n||a,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Gemini direct adapter writes are disabled; use the install orchestrator to install the NativeSoul Gemini extension, MCP registration, and managed block."}}async uninstall(t){return{status:"unsupported",reason:"Gemini direct adapter uninstall is disabled; use the uninstall orchestrator for reversible package removal."}}async coldScan(){let t=[],r=Od(),o=r.globalInstruction;await x(o)&&t.push({uid:"gemini:global-gemini-md",host:re,nativeKind:"global_context",normalizedKind:"memory",source:o,schemaHash:Ah}),await Eh(r.settingsFile,t);let n=r.extensionsDirectory;if(await W(n)){t.push({uid:"gemini:extensions",host:re,nativeKind:"extensions",normalizedKind:"package",source:n,schemaHash:Vr});let a=await Nd(n,{withFileTypes:!0});for(let s of a)s.isDirectory()&&await Ph(Ae.join(n,s.name),s.name,t)}return t}async hotProbe(){let t=await this.coldScan();return{host:re,checkedAt:new Date().toISOString(),capabilities:t.map(r=>({...r,installed:!0,enabled:!0,active:r.nativeKind==="global_context"||r.schemaHash?.startsWith("official:")===!0,authenticated:!1,healthy:!0,allowed:!0,ready:r.schemaHash?.startsWith("official:")===!0}))}}async bootstrap(){return{tier:"A",mechanism:"hook",supported:!0}}async reload(t){return{status:"unsupported",reason:"Gemini extension reload is host-driven; run /memory refresh or restart Gemini after installing NativeSoul."}}async update(t){return{status:"unsupported",reason:"Gemini package updates are handled by the NativeSoul install orchestrator."}}async scheduleReconcile(t){return{status:"unsupported",reason:"Gemini does not expose a documented native scheduler for NativeSoul; use the packaged heartbeat command manually or host-supported commands, with no hidden cron."}}async doctor(){let t=await this.detect(),r=j(ls),o=await G(r),n=[];return t.detected||n.push({code:"GEMINI_NOT_DETECTED",severity:"warn",message:"No Gemini CLI, GEMINI.md, or extensions directory was detected.",remediation:"Install Gemini CLI or review `nativesoul adapters managed-block --host gemini --json`."}),o&&!te(o,re)&&n.push({code:"GEMINI_MANAGED_BLOCK_MISSING",severity:"info",message:"GEMINI.md exists but has no NativeSoul managed block.",remediation:"Review `nativesoul adapters managed-block --host gemini --json`."}),n}async managedBlockPreview(){let t=j(ls),r=await G(t);return{host:re,targetPath:t,startMarker:"<!-- nativesoul:gemini:start v1 -->",endMarker:"<!-- nativesoul:gemini:end -->",content:Ne(re),wouldCreate:r===null,wouldUpdate:r!==null&&!te(r,re)}}};function Od(){let e=process.env.NATIVESOUL_GEMINI_INVENTORY_ROOT?.trim();if(e){let t=Ae.resolve(e);return{globalInstruction:Ae.join(t,"GEMINI.md"),settingsFile:Ae.join(t,"settings.json"),extensionsDirectory:Ae.join(t,"extensions")}}return{globalInstruction:j(ls),settingsFile:j(Rh),extensionsDirectory:j(Sh)}}async function Eh(e,t){let r=await Z(e);if(r){t.push({uid:"gemini:settings",host:re,nativeKind:"settings",normalizedKind:"config",source:e,schemaHash:is});for(let o of at(r.mcpServers))t.push({uid:`gemini:mcp:${M(o)}`,host:re,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${e}:mcpServers.${o}`,schemaHash:is});for(let o of Md(r.tools))t.push({uid:`gemini:tool:${M(o)}`,host:re,nativeKind:"tool",normalizedKind:"tool",source:`${e}:tools.${o}`,schemaHash:is})}}async function Ph(e,t,r){let o=Ae.join(e,"gemini-extension.json"),n=await Z(o),a=I(n,["name","id"])??t;if(r.push({uid:`gemini:extension:${M(a)}`,host:re,nativeKind:"extension",normalizedKind:"package",source:n?o:e,schemaHash:n?Vr:void 0}),n){for(let s of at(n.mcpServers))r.push({uid:`gemini:mcp:${M(s)}`,host:re,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:mcpServers.${s}`,schemaHash:Vr});for(let s of Md(n.tools))r.push({uid:`gemini:tool:${M(s)}`,host:re,nativeKind:"tool",normalizedKind:"tool",source:`${o}:tools.${s}`,schemaHash:Vr})}await xh(Ae.join(e,"commands"),r)}async function xh(e,t){if(!await W(e))return;let r=await Nd(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||![".toml",".md"].includes(Ae.extname(o.name)))continue;let n=Ae.basename(o.name,Ae.extname(o.name));t.push({uid:`gemini:command:${M(n,{allowSlash:!0})}`,host:re,nativeKind:"command",normalizedKind:"command",source:Ae.join(e,o.name),schemaHash:Vr})}}function Md(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):at(e)}function Ld(){return new cs}jt();We();de();import{readdir as Ud}from"node:fs/promises";import q from"node:path";var J="grok",kn="~/.grok/Agents.md",Dd="AGENTS.md",Hd="Agents.md",$d="CLAUDE.md",jh="~/.grok",ds="official:grok-plugin-config:v1",Fd="official:grok-hooks-config:v1",us="official:grok-mcp-config:v1",Bd="official:grok-command-config:v1",Ih="official:grok-context-config:v1",Th=[{uid:"grok:plugins",nativeKind:"plugins",normalizedKind:"package",relativePath:"plugins"},{uid:"grok:skills",nativeKind:"skills",normalizedKind:"capability",relativePath:"skills"},{uid:"grok:hooks",nativeKind:"hooks",normalizedKind:"capability",relativePath:"hooks"},{uid:"grok:mcps",nativeKind:"mcp",normalizedKind:"capability",relativePath:"mcps"}],ps=class{async detect(){let t=j(kn),r=q.resolve(Dd),o=q.resolve(Hd),n=q.resolve($d),a=Vd(),[s,i,l,c,d,p]=await Promise.all([x(t),x(r),x(o),x(n),W(a),Be("grok")]),g=i||l;return{host:J,detected:s||g||c||d||p!==null,path:s?t:l?o:i?r:c?n:p??void 0,capabilities:{installed:s||g||c||d||p!==null,enabled:s||g||c||d,active:g||c,authenticated:!1,healthy:p!==null||s||d,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Grok direct adapter writes are disabled; use the install orchestrator to install the NativeSoul native hook plugin, MCP registration, and managed block."}}async uninstall(t){return{status:"unsupported",reason:"Grok direct adapter uninstall is disabled; use the uninstall orchestrator for reversible package removal."}}async coldScan(){let t=[],r=Ch(),o=r.globalInstruction;await x(o)&&t.push({uid:"grok:global-agents-md",host:J,nativeKind:"global_context",normalizedKind:"instruction",source:o,schemaHash:Ih});let n=q.resolve(Dd);await x(n)&&t.push({uid:"grok:project-agents-md",host:J,nativeKind:"project_context",normalizedKind:"instruction",source:n});let a=q.resolve(Hd);await x(a)&&t.push({uid:"grok:project-agents-titlecase-md",host:J,nativeKind:"project_context",normalizedKind:"instruction",source:a});let s=q.resolve($d);await x(s)&&t.push({uid:"grok:project-claude-md",host:J,nativeKind:"project_context",normalizedKind:"instruction",source:s});let i=r.root;await Wd(r.root,t),await Oh(i,t);for(let l of Th){let c=q.join(i,l.relativePath);await W(c)&&t.push({uid:l.uid,host:J,nativeKind:l.nativeKind,normalizedKind:l.normalizedKind,source:c,schemaHash:l.relativePath==="mcps"?us:ds})}return Mh(t)}async hotProbe(){let t=await this.coldScan();return{host:J,checkedAt:new Date().toISOString(),capabilities:t.map(r=>({...r,installed:!0,enabled:!0,active:r.uid.includes("project"),authenticated:!1,healthy:!0,allowed:!0,ready:r.schemaHash?.startsWith("official:")===!0}))}}async bootstrap(){return{tier:"A",mechanism:"hook",supported:!0}}async reload(t){return{status:"unsupported",reason:"Grok reload is host-driven; use the installed NativeSoul command package or restart the host if needed."}}async update(t){return{status:"unsupported",reason:"Grok package updates are handled by the NativeSoul install orchestrator."}}async scheduleReconcile(t){return{status:"unsupported",reason:"Grok has no documented native scheduler or recurring task surface for NativeSoul; headless grok -p, cron, GitHub Actions, systemd, and Windows Task Scheduler are external schedulers and do not satisfy full-native capability."}}async doctor(){let t=await this.detect(),r=j(kn),o=await G(r),n=[];return t.detected||n.push({code:"GROK_NOT_DETECTED",severity:"warn",message:"No Grok CLI, ~/.grok directory, or project instruction file was detected.",remediation:"Install Grok Build or review `nativesoul adapters managed-block --host grok --json`."}),o&&!te(o,J)&&n.push({code:"GROK_MANAGED_BLOCK_MISSING",severity:"info",message:"Grok global Agents.md exists but has no NativeSoul managed block.",remediation:"Review `nativesoul adapters managed-block --host grok --json`."}),n}async managedBlockPreview(){let t=j(kn),r=await G(t);return{host:J,targetPath:t,startMarker:"<!-- nativesoul:grok:start v1 -->",endMarker:"<!-- nativesoul:grok:end -->",content:Ne(J),wouldCreate:r===null,wouldUpdate:r!==null&&!te(r,J)}}};function Vd(){let e=process.env.NATIVESOUL_GROK_INVENTORY_ROOT?.trim();return e?q.resolve(e):j(jh)}function Ch(){let e=Vd();return{root:e,globalInstruction:process.env.NATIVESOUL_GROK_INVENTORY_ROOT?.trim()?q.join(e,"Agents.md"):j(kn)}}async function Wd(e,t){let r=q.join(e,"plugin.json"),o=q.join(e,"nativesoul-package.json"),n=q.join(e,"hooks","hooks.json"),a=q.join(e,".mcp.json"),[s,i,l,c]=await Promise.all([Z(r),Z(o),Z(n),Z(a)]);if(s){let d=I(s,["name","id"])??"unknown";t.push({uid:`grok:plugin:${M(d)}`,host:J,nativeKind:"plugin",normalizedKind:"extension",source:r,schemaHash:ds})}if(i){let d=I(i,["name","id"])??"unknown";t.push({uid:`grok:package:${M(d)}`,host:J,nativeKind:"native_plugin_package",normalizedKind:"package",source:o,schemaHash:ds});let p=O(i.nativeSoul)?i.nativeSoul:{};for(let k of mn(p.commands))t.push({uid:`grok:command:${M(k)}`,host:J,nativeKind:"command",normalizedKind:"command",source:`${o}:nativeSoul.commands.${k}`,schemaHash:Bd});let g=O(p.mcpServer)?p.mcpServer:null,y=I(g,["name"]);y&&t.push({uid:`grok:mcp:${M(y)}`,host:J,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:nativeSoul.mcpServer.${y}`,schemaHash:us})}if(l){t.push({uid:"grok:hooks:manifest",host:J,nativeKind:"hooks",normalizedKind:"lifecycle_hooks",source:n,schemaHash:Fd});let d=O(l.hooks)?l.hooks:{};for(let p of Object.keys(d))t.push({uid:`grok:hook:${M(p)}`,host:J,nativeKind:"hook",normalizedKind:"lifecycle_hook",source:`${n}:hooks.${p}`,schemaHash:Fd})}if(c)for(let d of at(c.mcpServers))t.push({uid:`grok:mcp:${M(d)}`,host:J,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${a}:mcpServers.${d}`,schemaHash:us});await Nh(q.join(e,"commands"),t)}async function Oh(e,t){let r=q.join(e,"plugins");if(!await W(r))return;let o=await Ud(r,{withFileTypes:!0});for(let n of o)n.isDirectory()&&await Wd(q.join(r,n.name),t)}async function Nh(e,t){if(!await W(e))return;let r=await Ud(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||q.extname(o.name)!==".md")continue;let n=q.basename(o.name,".md");t.push({uid:`grok:command:${M(n,{allowSlash:!0})}`,host:J,nativeKind:"command",normalizedKind:"command",source:q.join(e,o.name),schemaHash:Bd})}}function Mh(e){let t=new Set,r=[];for(let o of e)t.has(o.uid)||(t.add(o.uid),r.push(o));return r}function Jd(){return new ps}import{mkdir as wn,readFile as Sn,rm as Bh,writeFile as Rn}from"node:fs/promises";import{existsSync as An}from"node:fs";import Wr from"node:path";import{lstatSync as Lh,realpathSync as Dh,statSync as Hh}from"node:fs";import Je from"node:path";var $h=process.platform!=="win32";function Fh(){let e=process.getuid;return typeof e=="function"?e.call(process):void 0}function qd(e){let t=e,r=[];for(;;)try{let o=Dh(t);return r.length?Je.join(o,...r):o}catch{let o=Je.dirname(t);if(o===t)return e;r.unshift(Je.basename(t)),t=o}}function Uh(e,t){let r=Je.relative(e,t);return r===""||!r.startsWith("..")&&!Je.isAbsolute(r)}function Gd(e,t={}){if(!e||typeof e!="string")return{ok:!1,code:"PATH_ESCAPES_ROOT",detail:"empty or non-string target path"};let r=Je.resolve(e);if(t.protectedFiles?.length&&new Set(t.protectedFiles.map(a=>Je.resolve(a))).has(r))return{ok:!1,code:"PROTECTED_FILE_DIRECT_WRITE",detail:`${r} is protected; write via a proposal`};try{if(Lh(r).isSymbolicLink()&&!t.allowSymlinkTarget)return{ok:!1,code:"SYMLINK_TARGET_UNSAFE",detail:`${r} is a symlink`}}catch{}let o=Je.dirname(r);try{let n=Hh(o);if($h){let a=(n.mode&2)!==0,s=(n.mode&512)!==0;if(a&&!s)return{ok:!1,code:"WORLD_WRITABLE_PATH",detail:`${o} is world-writable`};let i=t.uid??Fh();if(i!==void 0&&n.uid!==i)return{ok:!1,code:"SUSPICIOUS_OWNER",detail:`${o} owned by uid ${n.uid}, expected ${i}`}}}catch{}if(t.root){let n=qd(Je.resolve(t.root)),a=qd(r);if(!Uh(n,a))return{ok:!1,code:"PATH_ESCAPES_ROOT",detail:`${a} escapes ${n}`}}return{ok:!0,normalizedPath:r}}function pe(e,t={}){let r=Gd(e,t);if(!r.ok)throw new Error(`unsafe write path (${r.code}): ${r.detail}`);return r.normalizedPath}function En(e){return{start:`<!-- nativesoul:${e}:start v1 -->`,end:`<!-- nativesoul:${e}:end -->`}}async function Kd(e){let t=f(e.home),r=An(e.targetPath),o=r?await Sn(e.targetPath,"utf8"):null,n=Wh(o,e.host,e.block),a=o===null?null:E(o),s=E(n),i=Jh(o,n,e.host),l=i!=="noop",c=!e.apply,d=l&&e.apply?await Qd(t.home,e.host,e.targetPath,r,o,s):null;l&&e.apply&&(pe(e.targetPath,{allowSymlinkTarget:!0}),await wn(Wr.dirname(e.targetPath),{recursive:!0,mode:448}),await Rn(e.targetPath,n,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:e.targetPath,action:i,dryRun:c,changed:l,beforeHash:a,afterHash:s,diff:Zd(o,n),backupPath:d,applied:l&&e.apply};return await h({home:t.home,type:e.apply?"managed_block_apply":"managed_block_dry_run",details:p}),p}async function zd(e){let t=f(e.home),r=An(e.targetPath),o=r?await Sn(e.targetPath,"utf8"):null,n=Vh(o,e.host),a=o===null?null:E(o),s=n===null?E(""):E(n),i=o!==n?"remove":"noop",l=i!=="noop",c=!e.apply,d=l&&e.apply?await Qd(t.home,e.host,e.targetPath,r,o,s):null;l&&e.apply&&n!==null&&(await wn(Wr.dirname(e.targetPath),{recursive:!0,mode:448}),await Rn(e.targetPath,n,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:e.targetPath,action:i,dryRun:c,changed:l,beforeHash:a,afterHash:s,diff:Zd(o,n),backupPath:d,applied:l&&e.apply};return await h({home:t.home,type:e.apply?"managed_block_uninstall":"managed_block_uninstall_dry_run",details:p}),p}async function Xd(e){let t=An(e.targetPath),r=[];if(!t)return r.push({code:"MANAGED_BLOCK_TARGET_MISSING",severity:"warn",message:`Managed block target is missing: ${e.targetPath}`,remediation:"Run nativesoul install --host <host> --apply"}),{host:e.host,targetPath:e.targetPath,target_exists:!1,configured:!1,markers_valid:!1,issues:r};let o=await Sn(e.targetPath,"utf8"),n=En(e.host),a=o.indexOf(n.start),s=o.indexOf(n.end),i=a>=0,l=s>=0,c=i&&l&&s>a;return!i&&!l?r.push({code:"MANAGED_BLOCK_MISSING",severity:"warn",message:"NativeSoul managed block is not configured.",remediation:"Run nativesoul install --host <host> --apply"}):c||r.push({code:"MANAGED_BLOCK_MARKERS_INVALID",severity:"error",message:"NativeSoul managed block markers are incomplete or out of order.",remediation:"Fix the managed block markers or restore from a backup snapshot"}),{host:e.host,targetPath:e.targetPath,target_exists:!0,configured:c,markers_valid:c,issues:r}}async function Yd(e){let t=f(e.home),r=JSON.parse(await Sn(e.snapshotPath,"utf8")),o=!e.apply;e.apply&&(r.beforeExists&&r.beforeContent!==null?(await wn(Wr.dirname(r.targetPath),{recursive:!0,mode:448}),await Rn(r.targetPath,r.beforeContent,{encoding:"utf8",mode:384})):An(r.targetPath)&&await Bh(r.targetPath));let n={snapshotPath:e.snapshotPath,targetPath:r.targetPath,dryRun:o,applied:e.apply,restoredExists:r.beforeExists,restoredHash:r.beforeHash};return await h({home:t.home,type:e.apply?"managed_block_rollback":"managed_block_rollback_dry_run",details:n}),n}function Vh(e,t){if(e===null)return null;let{start:r,end:o}=En(t),n=e.indexOf(r),a=e.indexOf(o);if(n<0||a<=n)return e;let s=a+o.length,i=e.slice(0,n),l=e.slice(s);return i.endsWith(`
|
|
851
|
+
`}var Qg=["memory/daily","memory/projects","memory/archive","commitments","standing-orders","capabilities/cards","generated","state","logs","backups","proposals"],Zg=dn;function Fc(e){return Oe.resolve(e??process.env.NATIVESOUL_HOME??Oe.join(Yg.homedir(),".nativesoul"))}function f(e){let t=Fc(e);return{home:t,database:Oe.join(t,"state","nativesoul.sqlite"),auditLog:Oe.join(t,"logs","audit.jsonl")}}async function A(e){try{return await Xg(e,zg.F_OK),!0}catch{return!1}}async function v(e){let t=f(e),r=[],o=[],n=[];$c(t.home)||(await Hc(t.home,{recursive:!0,mode:448}),r.push(t.home));for(let i of Qg){let l=Oe.join(t.home,i);$c(l)||(await Hc(l,{recursive:!0,mode:448}),r.push(l))}let a=await A(Oe.join(t.home,"state","onboarding.complete"));for(let[i,l]of Object.entries(Zg)){if(i==="BOOTSTRAP.md"&&a)continue;let c=Oe.join(t.home,i);if(await A(c)){n.push(c);continue}try{await Wa(c,tf(i,l),{encoding:"utf8",mode:384,flag:"wx"}),o.push(c)}catch(d){if(rf(d)){n.push(c);continue}throw d}}let s=await of(t.home);return o.push(...s.createdFiles),n.push(...s.preservedFiles),{home:t.home,database:t.database,createdDirectories:r,createdFiles:o,preservedFiles:n}}function ef(e=Intl.DateTimeFormat){return e().resolvedOptions().timeZone??"UTC"}function tf(e,t){return e!=="config.yaml"?t:t.replace(/^timezone: .+$/m,`timezone: ${ef()}`)}function rf(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST"}async function of(e){let t=[],r=[],o=new Date().toISOString().slice(0,10),n=Oe.join(e,"memory","daily",`${o}.md`);await A(n)?r.push(n):(await Wa(n,Dc(o),{encoding:"utf8",mode:384,flag:"wx"}),t.push(n));let a=Oe.join(e,"standing-orders","example.yaml");return await A(a)?r.push(a):(await Wa(a,Lc,{encoding:"utf8",mode:384,flag:"wx"}),t.push(a)),{createdFiles:t,preservedFiles:r}}async function ce(e,t){let r=Oe.join(e,t);return await A(r)?Kg(r,"utf8"):""}async function h(e){let t=f(e.home),r=new Date().toISOString(),o=qa(H(e.details??{}),t.home),n={id:T("evt"),type:e.type,actor:e.actor??"cli",origin:e.origin??"nativesoul",result:e.result??"ok",details:o,created_at:r,hash:Re({type:e.type,actor:e.actor??"cli",origin:e.origin??"nativesoul",result:e.result??"ok",details:o,created_at:r})},a=_(t.database);try{a.insertEvent(n)}finally{a.close()}return await af(lf.dirname(t.auditLog),{recursive:!0,mode:448}),await nf(t.auditLog,`${JSON.stringify(n)}
|
|
852
|
+
`,{encoding:"utf8",mode:384}),n}function qa(e,t){if(typeof e=="string")return cf(e,t);if(Array.isArray(e))return e.map(r=>qa(r,t));if(e&&typeof e=="object"){let r={};for(let[o,n]of Object.entries(e))r[o]=qa(n,t);return r}return e}function cf(e,t){return[[new RegExp(Ja(t),"gu"),"[REDACTED_NATIVESOUL_HOME]"],[new RegExp(Ja(process.cwd()),"gu"),"[REDACTED_WORKSPACE]"],[new RegExp(Ja(sf.homedir()),"gu"),"[REDACTED_USER_HOME]"],[/\/Users\/[A-Za-z0-9._-]+/gu,"[REDACTED_USER_HOME]"],[/\/home\/[A-Za-z0-9._-]+/gu,"[REDACTED_USER_HOME]"],[/[A-Z]:[\\/]+Users[\\/]+[A-Za-z0-9._-]+/gu,"[REDACTED_USER_HOME]"]].reduce((o,[n,a])=>o.replace(n,a),e)}function Ja(e){return e.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}async function un(e){let t=f(e.home),r=_(t.database);try{return r.listEvents({type:e.type,result:e.result,limit:df(e.limit)})}finally{r.close()}}async function Ga(e){let t=f(e.home),r=await un(e);return await h({home:t.home,type:"audit_exported",details:{format:e.format,count:r.length,type:e.type??null,result:e.result??null}}),{format:e.format,events:r}}function df(e){return Math.min(Math.max(e??50,1),500)}import Le from"node:path";import{existsSync as P_}from"node:fs";import{mkdir as Kh,readdir as zh,readFile as fs,writeFile as Xh}from"node:fs/promises";import{existsSync as Yh}from"node:fs";import Xr from"node:path";jt();de();We();de();import{readdir as vf}from"node:fs/promises";import fe from"node:path";var Se="antigravity",kf="~/.gemini/GEMINI.md",wf="~/.antigravity",za="official:antigravity-plugin-config:v1",Jc="official:antigravity-hooks-config:v1",qc="official:antigravity-mcp-config:v1",Gc="official:antigravity-command-config:v1",Rf="official:antigravity-context-config:v1",Sf="official:antigravity-features:v1",Af=[{uid:"antigravity:plugins",nativeKind:"plugins",normalizedKind:"package",relativePath:"plugins"}];function Xa(){let e=process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim();return e?fe.resolve(e):j(wf)}function Ef(){let e=Xa();return{root:e,globalInstruction:process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim()?fe.join(e,"GEMINI.md"):j(kf)}}async function Kc(){let e=[],t=Ef();await x(t.globalInstruction)&&e.push({uid:"antigravity:global-gemini-md",host:Se,nativeKind:"global_context",normalizedKind:"instruction",source:t.globalInstruction,schemaHash:Rf}),await Pf(t.root,e),await xf(t.root,e);for(let r of Af){let o=fe.join(t.root,r.relativePath);await W(o)&&e.push({uid:r.uid,host:Se,nativeKind:r.nativeKind,normalizedKind:r.normalizedKind,source:o,schemaHash:za})}return e}async function Pf(e,t){let r=fe.join(e,"plugin.json"),o=fe.join(e,"nativesoul-package.json"),n=fe.join(e,"hooks.json"),a=fe.join(e,"mcp_config.json"),[s,i,l,c]=await Promise.all([Z(r),Z(o),Z(n),Z(a)]);if(s){let d=I(s,["name","id"])??"unknown";t.push({uid:`antigravity:plugin:${M(d)}`,host:Se,nativeKind:"plugin",normalizedKind:"extension",source:r,schemaHash:za})}if(i){let d=I(i,["name","id"])??"unknown";t.push({uid:`antigravity:package:${M(d)}`,host:Se,nativeKind:"native_plugin_package",normalizedKind:"package",source:o,schemaHash:za});let p=O(i.nativeSoul)?i.nativeSoul:{};for(let k of mn(p.commands))t.push({uid:`antigravity:command:${M(k)}`,host:Se,nativeKind:"command",normalizedKind:"command",source:`${o}:nativeSoul.commands.${k}`,schemaHash:Gc});let g=O(p.mcpServer)?p.mcpServer:null,y=I(g,["name"]);y&&t.push({uid:`antigravity:mcp:${M(y)}`,host:Se,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:nativeSoul.mcpServer.${y}`,schemaHash:qc})}if(l){t.push({uid:"antigravity:hooks:manifest",host:Se,nativeKind:"hooks",normalizedKind:"lifecycle_hooks",source:n,schemaHash:Jc});let d=O(l.hooks)?l.hooks:{};for(let p of Object.keys(d))t.push({uid:`antigravity:hook:${M(p)}`,host:Se,nativeKind:"hook",normalizedKind:"lifecycle_hook",source:`${n}:hooks.${p}`,schemaHash:Jc})}if(c)for(let d of at(c.mcpServers))t.push({uid:`antigravity:mcp:${M(d)}`,host:Se,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${a}:mcpServers.${d}`,schemaHash:qc});await jf(fe.join(e,"commands"),t)}async function xf(e,t){let r=fe.join(e,"features-evidence.json"),o=await Z(r);if(!o)return;let n=["scheduled_tasks","cron_schedules","background_agents","subagents","skills","mcps","json_hooks"];for(let a of n)o[a]===!0&&t.push({uid:`antigravity:feature:${a.replace(/_/gu,"-")}`,host:Se,nativeKind:"product_feature",normalizedKind:"feature_evidence",source:`${r}:${a}`,schemaHash:Sf})}async function jf(e,t){if(!await W(e))return;let r=await vf(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||fe.extname(o.name)!==".md")continue;let n=fe.basename(o.name,".md");t.push({uid:`antigravity:command:${M(n,{allowSlash:!0})}`,host:Se,nativeKind:"command",normalizedKind:"command",source:fe.join(e,o.name),schemaHash:Gc})}}de();We();import gn from"node:path";async function zc(e){let t=await If(e);if(!t)return null;let r=await Z(t);return r?{product_features_verified:r.product_features_verified===!0,write_contract_verified:r.write_contract_verified===!0,native_id:typeof r.native_id=="string"&&r.native_id.trim().length>0?r.native_id.trim():void 0,enabled:typeof r.enabled=="boolean"?r.enabled:void 0,updated_at:typeof r.updated_at=="string"?r.updated_at:void 0,contract:O(r.contract)?{schedule:I(r.contract,["schedule"])??void 0,status:I(r.contract,["status"])??void 0,cancel:I(r.contract,["cancel"])??void 0,list:I(r.contract,["list"])??void 0,project_binding:I(r.contract,["project_binding"])??void 0}:void 0}:null}async function If(e){let t=process.env.NATIVESOUL_ANTIGRAVITY_SCHEDULER_MANIFEST?.trim();if(t)return t;let r=process.env.NATIVESOUL_ANTIGRAVITY_INVENTORY_ROOT?.trim();if(r)return gn.join(gn.resolve(r),"scheduler-proof.json");let o=e??j("~/.antigravity"),n=[gn.join(o,"scheduler-proof.json"),gn.join(o,"native-scheduler-proof.json")];for(let a of n)if(await x(a))return a;return null}function Xc(e){if(!e)return!1;let t=Date.parse(e);return Number.isFinite(t)?Date.now()-t>10080*60*1e3:!0}var lr="antigravity",Ya="~/.gemini/GEMINI.md",Qa=class{async detect(){let t=j(Ya),r=Xa(),[o,n,a]=await Promise.all([x(t),W(r),Be("agy")]);return{host:lr,detected:n||a!==null,path:n?r:a??(o?t:void 0),capabilities:{installed:n||a!==null,enabled:n,active:!1,authenticated:!1,healthy:a!==null||n,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Antigravity direct adapter writes are disabled; use the install orchestrator to install the NativeSoul native hook plugin, MCP registration, and managed block."}}async uninstall(t){return{status:"unsupported",reason:"Antigravity direct adapter uninstall is disabled; use the uninstall orchestrator for reversible package removal."}}async coldScan(){return Kc()}async hotProbe(){let t=await this.coldScan();return{host:lr,checkedAt:new Date().toISOString(),capabilities:t.map(r=>({...r,installed:!0,enabled:!0,active:r.nativeKind==="global_context",authenticated:!1,healthy:!0,allowed:!0,ready:r.schemaHash?.startsWith("official:")===!0}))}}async bootstrap(){return{tier:"A",mechanism:"hook",supported:!0}}async reload(t){return{status:"unsupported",reason:"Antigravity reload is host-driven; use the installed NativeSoul command package or restart the host if needed."}}async update(t){return{status:"unsupported",reason:"Antigravity package updates are handled by the NativeSoul install orchestrator."}}async scheduleReconcile(t){let r=await zc(t.hostConfigRoot);if(!r?.product_features_verified)return{status:"unsupported",reason:"Antigravity Scheduled Tasks product-level evidence was not detected; no hidden cron fallback installed."};if(!r.write_contract_verified)return{status:"unsupported",reason:"Antigravity product-level Scheduled Tasks are documented, but scheduler write/list/cancel/status contract proof is missing; keep full-native blocked_by_host:scheduler_write_contract_missing."};if(!r.contract?.schedule||!r.contract.status||!r.contract.cancel||!r.contract.list)return{status:"unsupported",reason:"Antigravity scheduler proof is missing one or more required commands: schedule, status, cancel, list."};if(r.enabled===!1)return{status:"degraded",reason:"Antigravity scheduler contract was detected, but the NativeSoul scheduled task is disabled."};if(!r.native_id)return{status:"degraded",reason:"Antigravity scheduler contract was detected, but no native task id mapping was returned."};if(Xc(r.updated_at))return{status:"degraded",reason:"Antigravity scheduler proof is stale; re-run scheduler status/list before claiming full-native."};let o=t.apply?"reconciled":"reconcile planned";return{status:"ok",nativeId:r.native_id,message:`Antigravity Scheduled Task ${o}: ${r.native_id}`}}async doctor(){let t=await this.detect(),r=j(Ya),o=await G(r),n=[];return t.detected||n.push({code:"ANTIGRAVITY_NOT_DETECTED",severity:"warn",message:"No Antigravity CLI or ~/.antigravity directory was detected. A shared ~/.gemini/GEMINI.md alone is not treated as Antigravity readiness.",remediation:"Install Antigravity CLI or review `nativesoul adapters managed-block --host antigravity --json`."}),o&&!te(o,lr)&&n.push({code:"ANTIGRAVITY_MANAGED_BLOCK_MISSING",severity:"info",message:"GEMINI.md exists but has no NativeSoul managed block for Antigravity.",remediation:"Review `nativesoul adapters managed-block --host antigravity --json`."}),n}async managedBlockPreview(){let t=j(Ya),r=await G(t);return{host:lr,targetPath:t,startMarker:"<!-- nativesoul:antigravity:start v1 -->",endMarker:"<!-- nativesoul:antigravity:end -->",content:Ne(lr),wouldCreate:r===null,wouldUpdate:r!==null&&!te(r,lr)}}};function Yc(){return new Qa}jt();We();de();import cr from"node:path";import{readFile as yd}from"node:fs/promises";We();import{readFile as dd}from"node:fs/promises";import Bf from"node:path";var md="life:heartbeat";function gd(e){if(!e||typeof e!="object"||Array.isArray(e))return{kind:"unknown",mode:"leader",apply:!1,skill:md};let t=e;return{kind:typeof t.kind=="string"?t.kind:"unknown",mode:typeof t.mode=="string"?t.mode:"leader",apply:t.apply===!0,skill:qf(t),surface:pd(t.surface)??pd(O(t.desired)?t.desired.surface:void 0)}}async function fd(e={}){let t=process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_FIXTURES;if(t)try{return ud(await dd(Bf.join(t,"scheduled-tasks.json"),"utf8"))}catch{return null}let r=process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_MANIFEST;if(r)try{return ud(await dd(r,"utf8"))}catch{return null}if(process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_SUPPORTED==="1")return{supported:!0,native_id:process.env.NATIVESOUL_CLAUDE_SCHEDULED_TASKS_NATIVE_ID,surface:"claude-desktop",scheduler_kind:"unknown",creation_surface:"unknown",evidence_source:"env"};let{discoverClaudeScheduledTasksManifest:o}=await Promise.resolve().then(()=>(cd(),ld));return o({apply:e.apply,surface:e.surface,hostConfigRoot:e.hostConfigRoot})}function hd(e,t){return!e||e==="default"||!t?!0:e===t}function ud(e){let t=Ve(e);if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t,o=Vf(r.surface),n=Wf(r.scheduler_kind??r.kind);return{supported:r.supported===!0,native_id:typeof r.native_id=="string"&&r.native_id.length>0?r.native_id:void 0,surface:o??(n==="cloud_routine"?"cloud":"claude-desktop"),scheduler_kind:n,creation_surface:Jf(r.creation_surface),evidence_source:typeof r.evidence_source=="string"&&r.evidence_source.trim().length>0?r.evidence_source.trim():void 0,enabled:typeof r.enabled=="boolean"?r.enabled:void 0}}function pd(e){return e==="default"||e==="claude-code"||e==="claude-desktop"?e:void 0}function Vf(e){return e==="claude-code"||e==="claude-desktop"||e==="cloud"?e:void 0}function Wf(e){return e==="local_scheduled_task"||e==="cloud_routine"||e==="ui_only"?e:"unknown"}function Jf(e){return e==="official_machine_readable"||e==="ui_only"||e==="unknown"?e:void 0}function qf(e){return O(e.desired)&&typeof e.desired.skill=="string"&&e.desired.skill.trim().length>0?e.desired.skill.trim():md}var ue="claude",fn="~/.claude/CLAUDE.md",_d="CLAUDE.md",bd=".claude/CLAUDE.md",vd="life:heartbeat",wd="official:claude-cli-hot-scan:v1",es=class{async detect(){let t=j(fn),r=cr.resolve(_d),o=cr.resolve(bd),[n,a,s,i]=await Promise.all([x(t),x(r),x(o),pn("claude",["--version"])]);return{host:ue,detected:n||a||s||i!==null,version:i??void 0,path:n?t:a?r:s?o:void 0,capabilities:{installed:n||a||s||i!==null,enabled:n||a||s,active:a||s,authenticated:!1,healthy:i!==null||n||a||s,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Claude install writes are not implemented in M2.1; use managed-block preview first."}}async uninstall(t){return{status:"unsupported",reason:"Claude uninstall writes are not implemented in M2.1."}}async coldScan(){let t=j(fn),r=cr.resolve(_d),o=cr.resolve(bd),n=[];return await x(t)&&n.push({uid:"claude:global-claude-md",host:ue,nativeKind:"global_context",normalizedKind:"instruction",source:t}),await x(r)&&n.push({uid:"claude:project-claude-md",host:ue,nativeKind:"project_context",normalizedKind:"instruction",source:r}),await x(o)&&n.push({uid:"claude:project-dot-claude-md",host:ue,nativeKind:"project_context",normalizedKind:"instruction",source:o}),n}async hotProbe(t){let r=new Date().toISOString(),o=process.env.NATIVESOUL_CLAUDE_HOT_SCAN_FIXTURES?.trim();if(o){let l=await Gf(o,r);if(l.status==="ready")return l}let[n,a]=await Promise.all([Ka("claude",["mcp","list","--json"],5e3),Ka("claude",["plugin","list","--json"],5e3)]),s=[],i=[];return n.status==="ok"?i.push(...Rd(n.stdout)):s.push(kd("CLAUDE_HOT_SCAN_JSON_UNSUPPORTED","claude mcp list --json",n.stderr)),a.status==="ok"?i.push(...Sd(a.stdout)):s.push(kd("CLAUDE_HOT_SCAN_JSON_UNSUPPORTED","claude plugin list --json",a.stderr)),{host:ue,checkedAt:r,status:s.length===0?"ready":"degraded",warnings:s.map(l=>l.code),remediation:s.length===0?void 0:"Upgrade Claude Code CLI if JSON hot-scan commands are unavailable.",capabilities:i.map(l=>({...l,installed:l.installed??!0,enabled:l.enabled??!0,active:l.active??!0,authenticated:l.authenticated??!1,healthy:l.healthy??!0,allowed:!0,ready:l.ready??!1})),diagnostics:s}}async bootstrap(){return{tier:"B",mechanism:"global-instruction",supported:!0}}async reload(t){return{status:"unsupported",reason:"Claude reload is deferred until plugin lifecycle integration story."}}async update(t){return{status:"unsupported",reason:"Claude update is deferred until plugin lifecycle integration story."}}async scheduleReconcile(t){let r=gd(t),o=await fd({apply:r.apply,surface:r.surface,hostConfigRoot:t.hostConfigRoot});return o?.supported?r.kind!=="heartbeat"?{status:"unsupported",reason:"Claude adapter only supports NativeSoul heartbeat scheduled tasks."}:r.skill!==vd?{status:"error",code:"CLAUDE_HEARTBEAT_SKILL_MISMATCH",message:`Claude heartbeat Scheduled Task must invoke ${vd}.`}:o.scheduler_kind==="cloud_routine"||o.surface==="cloud"?{status:"unsupported",reason:"Claude cloud routines were detected, but they are out-of-scope for local native Scheduled Tasks evidence."}:o.scheduler_kind==="ui_only"||o.creation_surface==="ui_only"?{status:"unsupported",reason:"Claude task creation is UI-only for this surface; keep status blocked_by_host until a documented machine-readable surface returns a local task id."}:hd(r.surface,o.surface)?o.enabled===!1?{status:"degraded",reason:"Claude Scheduled Tasks support was detected, but the NativeSoul task is disabled."}:o.native_id?{status:"ok",nativeId:o.native_id,message:r.apply?`Claude Scheduled Task reconciled: ${o.native_id}`:`Claude Scheduled Task reconcile planned: ${o.native_id}`}:{status:"degraded",reason:"Claude Scheduled Tasks support was detected, but no native task id mapping was returned."}:{status:"unsupported",reason:`Claude Scheduled Tasks evidence is for ${o.surface??"unknown"} and does not satisfy ${r.surface}.`}:{status:"unsupported",reason:"Claude Scheduled Tasks native interface was not detected; no cron fallback installed."}}async doctor(){let t=await this.detect(),r=j(fn),o=await G(r),n=[];return t.detected||n.push({code:"CLAUDE_NOT_DETECTED",severity:"warn",message:"No Claude CLI or CLAUDE.md instruction file was detected.",remediation:"Install Claude Code or create a managed block preview before enabling writes."}),o&&!te(o,ue)&&n.push({code:"CLAUDE_MANAGED_BLOCK_MISSING",severity:"info",message:"Claude global CLAUDE.md exists but has no NativeSoul managed block.",remediation:"Review `nativesoul adapters managed-block --host claude --json`."}),n}async managedBlockPreview(){let t=j(fn),r=await G(t);return{host:ue,targetPath:t,startMarker:"<!-- nativesoul:claude:start v1 -->",endMarker:"<!-- nativesoul:claude:end -->",content:Ne(ue),wouldCreate:r===null,wouldUpdate:r!==null&&!te(r,ue)}}};async function Gf(e,t){try{let[r,o]=await Promise.all([yd(cr.join(e,"mcp-list.json"),"utf8"),yd(cr.join(e,"plugin-list.json"),"utf8")]),n=[...Rd(r),...Sd(o)];return{host:ue,checkedAt:t,status:"ready",warnings:[],capabilities:n.map(a=>({...a,installed:a.installed??!0,enabled:a.enabled??!0,active:a.active??!0,authenticated:a.authenticated??!1,healthy:a.healthy??!0,allowed:!0,ready:a.ready??!1}))}}catch{return{host:ue,checkedAt:t,status:"degraded",warnings:["CLAUDE_HOT_SCAN_FIXTURES_UNAVAILABLE"],remediation:"Set NATIVESOUL_CLAUDE_HOT_SCAN_FIXTURES to a directory containing mcp-list.json and plugin-list.json.",capabilities:[],diagnostics:[{code:"CLAUDE_HOT_SCAN_FIXTURES_UNAVAILABLE",severity:"warn",message:"Claude hot-scan fixtures were configured but could not be read.",remediation:"Verify NATIVESOUL_CLAUDE_HOT_SCAN_FIXTURES points at mcp-list.json and plugin-list.json."}]}}}function Rd(e){let t=Ve(e);return st(t,["servers","mcps","items"]).flatMap(r=>{let o=I(r,["name","id","server","server_name"]);if(!o)return[];let n=I(r,["status","state"]),a=n!=="disabled",s=n==="connected"||n==="ready"||n==="active"||n==="ok"||n==="authenticated";return[{uid:`claude:mcp:${M(o)}`,host:ue,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`claude mcp list:${o}`,schemaHash:wd,enabled:a,active:a,authenticated:se(r,["authenticated"])??s,healthy:a,ready:Ad(n)}]})}function Sd(e){let t=Ve(e);return st(t,["plugins","items"]).flatMap(r=>{let o=I(r,["id","plugin","package"])??I(r,["name"]);if(!o)return[];let n=I(r,["status","state"]),a=se(r,["enabled"])??n!=="disabled",s=se(r,["installed"])??!0;return[{uid:`claude:plugin:${Kf(o)}`,host:ue,nativeKind:"plugin",normalizedKind:"extension",source:`claude plugin list --json:${o}`,schemaHash:wd,installed:s,enabled:a,active:a,authenticated:se(r,["authenticated"])??a,healthy:s,ready:a&&(n===null||Ad(n)||se(r,["enabled"])===!0)}]})}function kd(e,t,r){let o=zf(r.trim()||"command unavailable or unsupported by installed Claude CLI");return{code:e,severity:"warn",message:`${t} did not return supported JSON output: ${o}`,remediation:"Upgrade Claude Code CLI or run `claude mcp list --json` / `claude plugin list --json` manually to confirm support."}}function Ad(e){return e==="ready"||e==="enabled"||e==="active"||e==="ok"||e==="authenticated"||e==="connected"}function Kf(e){return M(e,{allowSlash:!0})}function zf(e){return e.replace(/\b[A-Z0-9_]*(?:TOKEN|SECRET|PASSWORD|API[_-]?KEY)[A-Z0-9_]*\s*=\s*\S+/giu,"[REDACTED_SECRET]").replace(/\bsk-[A-Za-z0-9_-]{8,}\b/gu,"[REDACTED_SECRET]")}function Ed(){return new es}jt();We();de();import ns from"node:path";var ie="codex",yn="~/.codex/AGENTS.md",Id="AGENTS.md",mh=1e3,Td="life:heartbeat",bn="official:codex-app-server:v1",as=class{async detect(){let t=j(yn),r=ns.resolve(Id),[o,n,a]=await Promise.all([x(t),x(r),Be("codex")]);return{host:ie,detected:o||n||a!==null,path:o?t:n?r:a??void 0,capabilities:{installed:o||n||a!==null,enabled:o||n,active:n,authenticated:!1,healthy:a!==null||o||n,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Codex install writes are not implemented in M2.1; use managed-block preview first."}}async uninstall(t){return{status:"unsupported",reason:"Codex uninstall writes are not implemented in M2.1."}}async coldScan(){let t=j(yn),r=ns.resolve(Id),o=[];return await x(t)&&o.push({uid:"codex:global-agents-md",host:ie,nativeKind:"global_context",normalizedKind:"instruction",source:t}),await x(r)&&o.push({uid:"codex:project-agents-md",host:ie,nativeKind:"project_context",normalizedKind:"instruction",source:r}),o}async hotProbe(t){let r=new Date().toISOString(),o=bh(t);if(o){let i=await os(o,r);if(i.status==="ready")return i}let n=process.env.NATIVESOUL_CODEX_APP_SERVER_FIXTURES?.trim();if(n){let i=await os(kh(n),r);if(i.status==="ready")return i}let a=vh(t);if(a){let i=await os(wh(a),r);if(i.status==="ready")return i}let s=await this.coldScan();return{host:ie,checkedAt:r,status:"degraded",warnings:["CODEX_APP_SERVER_UNAVAILABLE"],remediation:"Start Codex App Server and set NATIVESOUL_CODEX_APP_SERVER_URL before running `nativesoul adapters hot-scan --host codex`.",capabilities:s.map(i=>({...i,source:`codex app server fallback config scan:${i.source}`,installed:!0,enabled:!0,active:i.uid.includes("project"),authenticated:!1,healthy:!0,allowed:!0,ready:!1})),diagnostics:[{code:"CODEX_APP_SERVER_UNAVAILABLE",severity:"warn",message:"Codex App Server inventory endpoint is not configured or did not respond with supported JSON.",remediation:"Set NATIVESOUL_CODEX_APP_SERVER_URL to a reachable Codex App Server endpoint."}]}}async bootstrap(){return{tier:"B",mechanism:"global-instruction",supported:!0}}async reload(t){return{status:"unsupported",reason:"Codex reload is deferred until App Server integration story."}}async update(t){return{status:"unsupported",reason:"Codex update is deferred until marketplace/App Server integration story."}}async scheduleReconcile(t){let{discoverCodexAutomationsManifest:r}=await Promise.resolve().then(()=>(jd(),xd)),o=await r({apply:t.apply,hostConfigRoot:t.hostConfigRoot});return o?.supported?t.kind!=="heartbeat"?{status:"unsupported",reason:"Codex adapter only supports NativeSoul heartbeat automations."}:t.desired.skill!==Td?{status:"error",code:"CODEX_HEARTBEAT_SKILL_MISMATCH",message:`Codex heartbeat Automation must invoke ${Td}.`}:o.native_id?{status:"ok",nativeId:o.native_id,message:t.apply?`Codex Automation reconciled: ${o.native_id}`:`Codex Automation reconcile planned: ${o.native_id}`}:{status:"degraded",reason:"Codex Automations support was detected, but no native automation id mapping was returned."}:{status:"unsupported",reason:"Codex Automations native interface was not detected; no cron fallback installed."}}async doctor(){let t=await this.detect(),r=j(yn),o=await G(r),n=[];return t.detected||n.push({code:"CODEX_NOT_DETECTED",severity:"warn",message:"No Codex CLI or AGENTS.md instruction file was detected.",remediation:"Install Codex or create a managed block preview before enabling writes."}),o&&!te(o,ie)&&n.push({code:"CODEX_MANAGED_BLOCK_MISSING",severity:"info",message:"Codex global AGENTS.md exists but has no NativeSoul managed block.",remediation:"Review `nativesoul adapters managed-block --host codex --json`."}),n}async managedBlockPreview(){let t=j(yn),r=await G(t);return{host:ie,targetPath:t,startMarker:"<!-- nativesoul:codex:start v1 -->",endMarker:"<!-- nativesoul:codex:end -->",content:Ne(ie),wouldCreate:r===null,wouldUpdate:r!==null&&!te(r,ie)}}};async function os(e,t){let[r,o,n,a]=await Promise.all([_n(e,"mcpServerStatus/list"),_n(e,"plugin/list"),_n(e,"skills/list"),_n(e,"app/list")]);if([r,o,n,a].some(l=>l===null))return{host:ie,checkedAt:t,status:"degraded",warnings:["CODEX_APP_SERVER_UNAVAILABLE"],remediation:"Ensure Codex App Server is running and supports mcpServerStatus/list, plugin/list, skills/list, and app/list.",capabilities:[],diagnostics:[{code:"CODEX_APP_SERVER_UNAVAILABLE",severity:"warn",message:"Codex App Server did not return supported JSON inventory for all required methods.",remediation:"Check NATIVESOUL_CODEX_APP_SERVER_URL and Codex App Server version."}]};let i=[...fh(r),...hh(o),...yh(n),..._h(a)];return{host:ie,checkedAt:t,status:"ready",warnings:[],capabilities:i.map(l=>({...l,installed:l.installed??!0,enabled:l.enabled??!0,active:l.active??!0,authenticated:l.authenticated??!1,healthy:l.healthy??!0,allowed:!0,ready:l.ready??!1}))}}async function _n(e,t){try{return await e.call(t)}catch{return null}}async function gh(e,t){let r=new AbortController,o=setTimeout(()=>r.abort(),mh);try{let n=await fetch(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:t,method:t,params:{}}),signal:r.signal});if(!n.ok)return null;let a=await n.json();return O(a)&&"error"in a?null:O(a)&&"result"in a?a.result:a}catch{return null}finally{clearTimeout(o)}}function fh(e){return st(e,["servers","mcpServers","items"]).flatMap(t=>{let r=I(t,["id","name","server","server_name"]);if(!r)return[];let o=I(t,["status","state"]),n=vn(t,o);return[{uid:`codex:mcp:${M(r)}`,host:ie,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`codex app server mcpServerStatus/list:${r}`,schemaHash:bn,...n}]})}function hh(e){return st(e,["plugins","items"]).flatMap(t=>{let r=I(t,["id","plugin","package"])??I(t,["name"]);if(!r)return[];let o=I(t,["status","state"]),n=vn(t,o);return[{uid:`codex:plugin:${ss(r)}`,host:ie,nativeKind:"plugin",normalizedKind:"extension",source:`codex app server plugin/list:${r}`,schemaHash:bn,...n}]})}function yh(e){return st(e,["skills","items"]).flatMap(t=>{let r=I(t,["id","name","path"]);if(!r)return[];let o=I(t,["status","state"]),n=vn(t,o);return[{uid:`codex:skill:${ss(r)}`,host:ie,nativeKind:"skill",normalizedKind:"skill",source:`codex app server skills/list:${r}`,schemaHash:bn,...n}]})}function _h(e){return st(e,["apps","items"]).flatMap(t=>{let r=I(t,["id","name","app"]);if(!r)return[];let o=I(t,["status","state"]),n=vn(t,o);return[{uid:`codex:app:${ss(r)}`,host:ie,nativeKind:"app_server_app",normalizedKind:"app",source:`codex app server app/list:${r}`,schemaHash:bn,...n}]})}function vn(e,t){let r=se(e,["installed"])??!0,o=t==="disabled"||t==="unavailable",n=t==="error"||t==="unhealthy",a=se(e,["enabled"])??!o,s=se(e,["active"])??a,i=se(e,["healthy"])??(!o&&!n),l=se(e,["authenticated"])??se(e,["auth"])??!1,c=se(e,["ready"])??(r&&a&&s&&i);return{installed:r,enabled:a,active:s,authenticated:l,healthy:i,ready:c}}function bh(e){if(O(e)){let t=e.appServer;if(O(t)&&typeof t.call=="function")return{call:r=>Promise.resolve(t.call(r))}}return null}function vh(e){if(O(e)){let t=e.appServerUrl;if(typeof t=="string"&&t.trim().length>0)return t.trim()}return process.env.NATIVESOUL_CODEX_APP_SERVER_URL?.trim()||process.env.CODEX_APP_SERVER_URL?.trim()||null}function kh(e){return{async call(t){try{let{readFile:r}=await import("node:fs/promises"),o=t.replace(/\//gu,"-");return JSON.parse(await r(ns.join(e,`${o}.json`),"utf8"))}catch(r){let o=r instanceof Error?r.message:"unknown error";throw new Error(`Codex App Server fixture unavailable for ${t}: ${o}`,{cause:r})}}}}function wh(e){return{call:t=>gh(e,t)}}function ss(e){return M(e,{allowSlash:!0})}function Cd(){return new as}jt();We();de();import{readdir as Nd}from"node:fs/promises";import Ae from"node:path";var re="gemini",ls="~/.gemini/GEMINI.md",Rh="~/.gemini/extensions",Sh="~/.gemini/settings.json",Vr="official:gemini-extension-config:v1",is="official:gemini-settings-config:v1",Ah="official:gemini-memory-config:v1",cs=class{async detect(){let t=Od(),r=t.globalInstruction,o=t.extensionsDirectory,[n,a,s]=await Promise.all([x(r),W(o),pn("gemini",["--version"])]);return{host:re,detected:n||a||s!==null,version:s??void 0,path:n?r:a?o:void 0,capabilities:{installed:n||a||s!==null,enabled:n||a,active:n,authenticated:!1,healthy:s!==null||n||a,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Gemini direct adapter writes are disabled; use the install orchestrator to install the NativeSoul Gemini extension, MCP registration, and managed block."}}async uninstall(t){return{status:"unsupported",reason:"Gemini direct adapter uninstall is disabled; use the uninstall orchestrator for reversible package removal."}}async coldScan(){let t=[],r=Od(),o=r.globalInstruction;await x(o)&&t.push({uid:"gemini:global-gemini-md",host:re,nativeKind:"global_context",normalizedKind:"memory",source:o,schemaHash:Ah}),await Eh(r.settingsFile,t);let n=r.extensionsDirectory;if(await W(n)){t.push({uid:"gemini:extensions",host:re,nativeKind:"extensions",normalizedKind:"package",source:n,schemaHash:Vr});let a=await Nd(n,{withFileTypes:!0});for(let s of a)s.isDirectory()&&await Ph(Ae.join(n,s.name),s.name,t)}return t}async hotProbe(){let t=await this.coldScan();return{host:re,checkedAt:new Date().toISOString(),capabilities:t.map(r=>({...r,installed:!0,enabled:!0,active:r.nativeKind==="global_context"||r.schemaHash?.startsWith("official:")===!0,authenticated:!1,healthy:!0,allowed:!0,ready:r.schemaHash?.startsWith("official:")===!0}))}}async bootstrap(){return{tier:"A",mechanism:"hook",supported:!0}}async reload(t){return{status:"unsupported",reason:"Gemini extension reload is host-driven; run /memory refresh or restart Gemini after installing NativeSoul."}}async update(t){return{status:"unsupported",reason:"Gemini package updates are handled by the NativeSoul install orchestrator."}}async scheduleReconcile(t){return{status:"unsupported",reason:"Gemini does not expose a documented native scheduler for NativeSoul; use the packaged heartbeat command manually or host-supported commands, with no hidden cron."}}async doctor(){let t=await this.detect(),r=j(ls),o=await G(r),n=[];return t.detected||n.push({code:"GEMINI_NOT_DETECTED",severity:"warn",message:"No Gemini CLI, GEMINI.md, or extensions directory was detected.",remediation:"Install Gemini CLI or review `nativesoul adapters managed-block --host gemini --json`."}),o&&!te(o,re)&&n.push({code:"GEMINI_MANAGED_BLOCK_MISSING",severity:"info",message:"GEMINI.md exists but has no NativeSoul managed block.",remediation:"Review `nativesoul adapters managed-block --host gemini --json`."}),n}async managedBlockPreview(){let t=j(ls),r=await G(t);return{host:re,targetPath:t,startMarker:"<!-- nativesoul:gemini:start v1 -->",endMarker:"<!-- nativesoul:gemini:end -->",content:Ne(re),wouldCreate:r===null,wouldUpdate:r!==null&&!te(r,re)}}};function Od(){let e=process.env.NATIVESOUL_GEMINI_INVENTORY_ROOT?.trim();if(e){let t=Ae.resolve(e);return{globalInstruction:Ae.join(t,"GEMINI.md"),settingsFile:Ae.join(t,"settings.json"),extensionsDirectory:Ae.join(t,"extensions")}}return{globalInstruction:j(ls),settingsFile:j(Sh),extensionsDirectory:j(Rh)}}async function Eh(e,t){let r=await Z(e);if(r){t.push({uid:"gemini:settings",host:re,nativeKind:"settings",normalizedKind:"config",source:e,schemaHash:is});for(let o of at(r.mcpServers))t.push({uid:`gemini:mcp:${M(o)}`,host:re,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${e}:mcpServers.${o}`,schemaHash:is});for(let o of Md(r.tools))t.push({uid:`gemini:tool:${M(o)}`,host:re,nativeKind:"tool",normalizedKind:"tool",source:`${e}:tools.${o}`,schemaHash:is})}}async function Ph(e,t,r){let o=Ae.join(e,"gemini-extension.json"),n=await Z(o),a=I(n,["name","id"])??t;if(r.push({uid:`gemini:extension:${M(a)}`,host:re,nativeKind:"extension",normalizedKind:"package",source:n?o:e,schemaHash:n?Vr:void 0}),n){for(let s of at(n.mcpServers))r.push({uid:`gemini:mcp:${M(s)}`,host:re,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:mcpServers.${s}`,schemaHash:Vr});for(let s of Md(n.tools))r.push({uid:`gemini:tool:${M(s)}`,host:re,nativeKind:"tool",normalizedKind:"tool",source:`${o}:tools.${s}`,schemaHash:Vr})}await xh(Ae.join(e,"commands"),r)}async function xh(e,t){if(!await W(e))return;let r=await Nd(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||![".toml",".md"].includes(Ae.extname(o.name)))continue;let n=Ae.basename(o.name,Ae.extname(o.name));t.push({uid:`gemini:command:${M(n,{allowSlash:!0})}`,host:re,nativeKind:"command",normalizedKind:"command",source:Ae.join(e,o.name),schemaHash:Vr})}}function Md(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):at(e)}function Ld(){return new cs}jt();We();de();import{readdir as Ud}from"node:fs/promises";import q from"node:path";var J="grok",kn="~/.grok/Agents.md",Dd="AGENTS.md",Hd="Agents.md",$d="CLAUDE.md",jh="~/.grok",ds="official:grok-plugin-config:v1",Fd="official:grok-hooks-config:v1",us="official:grok-mcp-config:v1",Bd="official:grok-command-config:v1",Ih="official:grok-context-config:v1",Th=[{uid:"grok:plugins",nativeKind:"plugins",normalizedKind:"package",relativePath:"plugins"},{uid:"grok:skills",nativeKind:"skills",normalizedKind:"capability",relativePath:"skills"},{uid:"grok:hooks",nativeKind:"hooks",normalizedKind:"capability",relativePath:"hooks"},{uid:"grok:mcps",nativeKind:"mcp",normalizedKind:"capability",relativePath:"mcps"}],ps=class{async detect(){let t=j(kn),r=q.resolve(Dd),o=q.resolve(Hd),n=q.resolve($d),a=Vd(),[s,i,l,c,d,p]=await Promise.all([x(t),x(r),x(o),x(n),W(a),Be("grok")]),g=i||l;return{host:J,detected:s||g||c||d||p!==null,path:s?t:l?o:i?r:c?n:p??void 0,capabilities:{installed:s||g||c||d||p!==null,enabled:s||g||c||d,active:g||c,authenticated:!1,healthy:p!==null||s||d,allowed:!0,ready:!1}}}async install(t){return{status:"unsupported",reason:"Grok direct adapter writes are disabled; use the install orchestrator to install the NativeSoul native hook plugin, MCP registration, and managed block."}}async uninstall(t){return{status:"unsupported",reason:"Grok direct adapter uninstall is disabled; use the uninstall orchestrator for reversible package removal."}}async coldScan(){let t=[],r=Ch(),o=r.globalInstruction;await x(o)&&t.push({uid:"grok:global-agents-md",host:J,nativeKind:"global_context",normalizedKind:"instruction",source:o,schemaHash:Ih});let n=q.resolve(Dd);await x(n)&&t.push({uid:"grok:project-agents-md",host:J,nativeKind:"project_context",normalizedKind:"instruction",source:n});let a=q.resolve(Hd);await x(a)&&t.push({uid:"grok:project-agents-titlecase-md",host:J,nativeKind:"project_context",normalizedKind:"instruction",source:a});let s=q.resolve($d);await x(s)&&t.push({uid:"grok:project-claude-md",host:J,nativeKind:"project_context",normalizedKind:"instruction",source:s});let i=r.root;await Wd(r.root,t),await Oh(i,t);for(let l of Th){let c=q.join(i,l.relativePath);await W(c)&&t.push({uid:l.uid,host:J,nativeKind:l.nativeKind,normalizedKind:l.normalizedKind,source:c,schemaHash:l.relativePath==="mcps"?us:ds})}return Mh(t)}async hotProbe(){let t=await this.coldScan();return{host:J,checkedAt:new Date().toISOString(),capabilities:t.map(r=>({...r,installed:!0,enabled:!0,active:r.uid.includes("project"),authenticated:!1,healthy:!0,allowed:!0,ready:r.schemaHash?.startsWith("official:")===!0}))}}async bootstrap(){return{tier:"A",mechanism:"hook",supported:!0}}async reload(t){return{status:"unsupported",reason:"Grok reload is host-driven; use the installed NativeSoul command package or restart the host if needed."}}async update(t){return{status:"unsupported",reason:"Grok package updates are handled by the NativeSoul install orchestrator."}}async scheduleReconcile(t){return{status:"unsupported",reason:"Grok has no documented native scheduler or recurring task surface for NativeSoul; headless grok -p, cron, GitHub Actions, systemd, and Windows Task Scheduler are external schedulers and do not satisfy full-native capability."}}async doctor(){let t=await this.detect(),r=j(kn),o=await G(r),n=[];return t.detected||n.push({code:"GROK_NOT_DETECTED",severity:"warn",message:"No Grok CLI, ~/.grok directory, or project instruction file was detected.",remediation:"Install Grok Build or review `nativesoul adapters managed-block --host grok --json`."}),o&&!te(o,J)&&n.push({code:"GROK_MANAGED_BLOCK_MISSING",severity:"info",message:"Grok global Agents.md exists but has no NativeSoul managed block.",remediation:"Review `nativesoul adapters managed-block --host grok --json`."}),n}async managedBlockPreview(){let t=j(kn),r=await G(t);return{host:J,targetPath:t,startMarker:"<!-- nativesoul:grok:start v1 -->",endMarker:"<!-- nativesoul:grok:end -->",content:Ne(J),wouldCreate:r===null,wouldUpdate:r!==null&&!te(r,J)}}};function Vd(){let e=process.env.NATIVESOUL_GROK_INVENTORY_ROOT?.trim();return e?q.resolve(e):j(jh)}function Ch(){let e=Vd();return{root:e,globalInstruction:process.env.NATIVESOUL_GROK_INVENTORY_ROOT?.trim()?q.join(e,"Agents.md"):j(kn)}}async function Wd(e,t){let r=q.join(e,"plugin.json"),o=q.join(e,"nativesoul-package.json"),n=q.join(e,"hooks","hooks.json"),a=q.join(e,".mcp.json"),[s,i,l,c]=await Promise.all([Z(r),Z(o),Z(n),Z(a)]);if(s){let d=I(s,["name","id"])??"unknown";t.push({uid:`grok:plugin:${M(d)}`,host:J,nativeKind:"plugin",normalizedKind:"extension",source:r,schemaHash:ds})}if(i){let d=I(i,["name","id"])??"unknown";t.push({uid:`grok:package:${M(d)}`,host:J,nativeKind:"native_plugin_package",normalizedKind:"package",source:o,schemaHash:ds});let p=O(i.nativeSoul)?i.nativeSoul:{};for(let k of mn(p.commands))t.push({uid:`grok:command:${M(k)}`,host:J,nativeKind:"command",normalizedKind:"command",source:`${o}:nativeSoul.commands.${k}`,schemaHash:Bd});let g=O(p.mcpServer)?p.mcpServer:null,y=I(g,["name"]);y&&t.push({uid:`grok:mcp:${M(y)}`,host:J,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${o}:nativeSoul.mcpServer.${y}`,schemaHash:us})}if(l){t.push({uid:"grok:hooks:manifest",host:J,nativeKind:"hooks",normalizedKind:"lifecycle_hooks",source:n,schemaHash:Fd});let d=O(l.hooks)?l.hooks:{};for(let p of Object.keys(d))t.push({uid:`grok:hook:${M(p)}`,host:J,nativeKind:"hook",normalizedKind:"lifecycle_hook",source:`${n}:hooks.${p}`,schemaHash:Fd})}if(c)for(let d of at(c.mcpServers))t.push({uid:`grok:mcp:${M(d)}`,host:J,nativeKind:"mcp_server",normalizedKind:"tool_server",source:`${a}:mcpServers.${d}`,schemaHash:us});await Nh(q.join(e,"commands"),t)}async function Oh(e,t){let r=q.join(e,"plugins");if(!await W(r))return;let o=await Ud(r,{withFileTypes:!0});for(let n of o)n.isDirectory()&&await Wd(q.join(r,n.name),t)}async function Nh(e,t){if(!await W(e))return;let r=await Ud(e,{withFileTypes:!0});for(let o of r){if(!o.isFile()||q.extname(o.name)!==".md")continue;let n=q.basename(o.name,".md");t.push({uid:`grok:command:${M(n,{allowSlash:!0})}`,host:J,nativeKind:"command",normalizedKind:"command",source:q.join(e,o.name),schemaHash:Bd})}}function Mh(e){let t=new Set,r=[];for(let o of e)t.has(o.uid)||(t.add(o.uid),r.push(o));return r}function Jd(){return new ps}import{mkdir as wn,readFile as Rn,rm as Bh,writeFile as Sn}from"node:fs/promises";import{existsSync as An}from"node:fs";import Wr from"node:path";import{lstatSync as Lh,realpathSync as Dh,statSync as Hh}from"node:fs";import Je from"node:path";var $h=process.platform!=="win32";function Fh(){let e=process.getuid;return typeof e=="function"?e.call(process):void 0}function qd(e){let t=e,r=[];for(;;)try{let o=Dh(t);return r.length?Je.join(o,...r):o}catch{let o=Je.dirname(t);if(o===t)return e;r.unshift(Je.basename(t)),t=o}}function Uh(e,t){let r=Je.relative(e,t);return r===""||!r.startsWith("..")&&!Je.isAbsolute(r)}function Gd(e,t={}){if(!e||typeof e!="string")return{ok:!1,code:"PATH_ESCAPES_ROOT",detail:"empty or non-string target path"};let r=Je.resolve(e);if(t.protectedFiles?.length&&new Set(t.protectedFiles.map(a=>Je.resolve(a))).has(r))return{ok:!1,code:"PROTECTED_FILE_DIRECT_WRITE",detail:`${r} is protected; write via a proposal`};try{if(Lh(r).isSymbolicLink()&&!t.allowSymlinkTarget)return{ok:!1,code:"SYMLINK_TARGET_UNSAFE",detail:`${r} is a symlink`}}catch{}let o=Je.dirname(r);try{let n=Hh(o);if($h){let a=(n.mode&2)!==0,s=(n.mode&512)!==0;if(a&&!s)return{ok:!1,code:"WORLD_WRITABLE_PATH",detail:`${o} is world-writable`};let i=t.uid??Fh();if(i!==void 0&&n.uid!==i)return{ok:!1,code:"SUSPICIOUS_OWNER",detail:`${o} owned by uid ${n.uid}, expected ${i}`}}}catch{}if(t.root){let n=qd(Je.resolve(t.root)),a=qd(r);if(!Uh(n,a))return{ok:!1,code:"PATH_ESCAPES_ROOT",detail:`${a} escapes ${n}`}}return{ok:!0,normalizedPath:r}}function pe(e,t={}){let r=Gd(e,t);if(!r.ok)throw new Error(`unsafe write path (${r.code}): ${r.detail}`);return r.normalizedPath}function En(e){return{start:`<!-- nativesoul:${e}:start v1 -->`,end:`<!-- nativesoul:${e}:end -->`}}async function Kd(e){let t=f(e.home),r=An(e.targetPath),o=r?await Rn(e.targetPath,"utf8"):null,n=Wh(o,e.host,e.block),a=o===null?null:E(o),s=E(n),i=Jh(o,n,e.host),l=i!=="noop",c=!e.apply,d=l&&e.apply?await Qd(t.home,e.host,e.targetPath,r,o,s):null;l&&e.apply&&(pe(e.targetPath,{allowSymlinkTarget:!0}),await wn(Wr.dirname(e.targetPath),{recursive:!0,mode:448}),await Sn(e.targetPath,n,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:e.targetPath,action:i,dryRun:c,changed:l,beforeHash:a,afterHash:s,diff:Zd(o,n),backupPath:d,applied:l&&e.apply};return await h({home:t.home,type:e.apply?"managed_block_apply":"managed_block_dry_run",details:p}),p}async function zd(e){let t=f(e.home),r=An(e.targetPath),o=r?await Rn(e.targetPath,"utf8"):null,n=Vh(o,e.host),a=o===null?null:E(o),s=n===null?E(""):E(n),i=o!==n?"remove":"noop",l=i!=="noop",c=!e.apply,d=l&&e.apply?await Qd(t.home,e.host,e.targetPath,r,o,s):null;l&&e.apply&&n!==null&&(await wn(Wr.dirname(e.targetPath),{recursive:!0,mode:448}),await Sn(e.targetPath,n,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:e.targetPath,action:i,dryRun:c,changed:l,beforeHash:a,afterHash:s,diff:Zd(o,n),backupPath:d,applied:l&&e.apply};return await h({home:t.home,type:e.apply?"managed_block_uninstall":"managed_block_uninstall_dry_run",details:p}),p}async function Xd(e){let t=An(e.targetPath),r=[];if(!t)return r.push({code:"MANAGED_BLOCK_TARGET_MISSING",severity:"warn",message:`Managed block target is missing: ${e.targetPath}`,remediation:"Run nativesoul install --host <host> --apply"}),{host:e.host,targetPath:e.targetPath,target_exists:!1,configured:!1,markers_valid:!1,issues:r};let o=await Rn(e.targetPath,"utf8"),n=En(e.host),a=o.indexOf(n.start),s=o.indexOf(n.end),i=a>=0,l=s>=0,c=i&&l&&s>a;return!i&&!l?r.push({code:"MANAGED_BLOCK_MISSING",severity:"warn",message:"NativeSoul managed block is not configured.",remediation:"Run nativesoul install --host <host> --apply"}):c||r.push({code:"MANAGED_BLOCK_MARKERS_INVALID",severity:"error",message:"NativeSoul managed block markers are incomplete or out of order.",remediation:"Fix the managed block markers or restore from a backup snapshot"}),{host:e.host,targetPath:e.targetPath,target_exists:!0,configured:c,markers_valid:c,issues:r}}async function Yd(e){let t=f(e.home),r=JSON.parse(await Rn(e.snapshotPath,"utf8")),o=!e.apply;e.apply&&(r.beforeExists&&r.beforeContent!==null?(await wn(Wr.dirname(r.targetPath),{recursive:!0,mode:448}),await Sn(r.targetPath,r.beforeContent,{encoding:"utf8",mode:384})):An(r.targetPath)&&await Bh(r.targetPath));let n={snapshotPath:e.snapshotPath,targetPath:r.targetPath,dryRun:o,applied:e.apply,restoredExists:r.beforeExists,restoredHash:r.beforeHash};return await h({home:t.home,type:e.apply?"managed_block_rollback":"managed_block_rollback_dry_run",details:n}),n}function Vh(e,t){if(e===null)return null;let{start:r,end:o}=En(t),n=e.indexOf(r),a=e.indexOf(o);if(n<0||a<=n)return e;let s=a+o.length,i=e.slice(0,n),l=e.slice(s);return i.endsWith(`
|
|
853
853
|
|
|
854
854
|
`)&&l.startsWith(`
|
|
855
855
|
`)?l=l.replace(/^\n/u,""):!i.endsWith(`
|
|
@@ -863,21 +863,21 @@ _Running context for today. Promote durable facts to curated memory later._
|
|
|
863
863
|
`)?`
|
|
864
864
|
`:`
|
|
865
865
|
|
|
866
|
-
`;return`${e}${l}${o}`}function Jh(e,t,r){if(e===t)return"noop";if(e===null||e.length===0)return"create";let{start:o,end:n}=En(r);return e.includes(o)&&e.includes(n)?"replace":"append"}async function Qd(e,t,r,o,n,a){let s=Wr.join(e,"backups","managed-block");await wn(s,{recursive:!0,mode:448});let i=new Date().toISOString(),l={id:T("snapshot"),host:t,targetPath:r,beforeExists:o,beforeContent:n,beforeHash:n===null?null:E(n),afterHash:a,createdAt:i},c=`${i.replace(/[:.]/g,"-")}-${t}.json`,d=Wr.join(s,c);return await
|
|
866
|
+
`;return`${e}${l}${o}`}function Jh(e,t,r){if(e===t)return"noop";if(e===null||e.length===0)return"create";let{start:o,end:n}=En(r);return e.includes(o)&&e.includes(n)?"replace":"append"}async function Qd(e,t,r,o,n,a){let s=Wr.join(e,"backups","managed-block");await wn(s,{recursive:!0,mode:448});let i=new Date().toISOString(),l={id:T("snapshot"),host:t,targetPath:r,beforeExists:o,beforeContent:n,beforeHash:n===null?null:E(n),afterHash:a,createdAt:i},c=`${i.replace(/[:.]/g,"-")}-${t}.json`,d=Wr.join(s,c);return await Sn(d,JSON.stringify(l,null,2),{encoding:"utf8",mode:384}),d}function Zd(e,t){return e===t?"No changes.":[`before: ${e===null?"missing":E(e)}`,`after: ${t===null?"missing":E(t)}`,`lines_before: ${e===null?0:e.split(/\r?\n/u).length}`,`lines_after: ${t===null?0:t.split(/\r?\n/u).length}`].join(`
|
|
867
867
|
`)}var qh=["codex","claude","grok","antigravity","gemini"],Gh={codex:Cd,claude:Ed,grok:Jd,antigravity:Yc,gemini:Ld};function qe(e){return e==="all"?qh:[e]}function Pn(e){return qe(e)}function It(e){return Gh[e]()}async function Jr(e){let t=[];for(let r of Pn(e)){let o=It(r),[n,a]=await Promise.all([o.detect(),o.coldScan({})]);t.push({host:r,detected:n.detected,version:n.version,sources:a})}return t}async function qr(e){let t=[];for(let r of Pn(e)){let o=It(r);t.push({host:r,diagnostics:await o.doctor({})})}return t}async function Gr(e){return It(e).managedBlockPreview()}async function Kr(e){let t=await Gr(e.host);return Kd({home:e.home,host:e.host,targetPath:e.targetPath??t.targetPath,block:t.content,apply:e.apply})}async function ms(e){return Yd(e)}async function gs(e){let t=await Gr(e.host);return zd({home:e.home,host:e.host,targetPath:e.targetPath??t.targetPath,apply:e.apply})}async function Tt(e){let t=await v(e.home),r=new Date().toISOString(),o=[],n=e.ttlSeconds??await Qh(t.home);for(let a of Pn(e.host)){if(e.delta){let p=(await Ee({home:t.home,host:a,includeShared:!1,limit:1}))[0]?.last_seen_at;if(p&&Date.now()-Date.parse(p)<=n*1e3){let g={host:a,status:"ready",count:0,records:[],skipped:!0,warnings:[],diagnostics:[]};await h({home:t.home,type:"capabilities_refreshed",details:{host:a,count:0,status:"ready",warnings:[],delta:!0,skipped:!0}}),o.push(g);continue}}let i=await It(a).hotProbe({}),l=i.capabilities.map(d=>ey({uid:d.uid,host:d.host,native_kind:d.nativeKind,normalized_kind:d.normalizedKind,source:d.source,schema_hash:d.schemaHash??null,installed:d.installed,enabled:d.enabled,active:d.active,authenticated:d.authenticated,healthy:d.healthy,allowed:d.allowed,ready:d.ready,last_seen_at:r})),c=_(t.database);try{c.upsertCapabilities(l)}finally{c.close()}await h({home:t.home,type:"capabilities_refreshed",details:{host:a,count:l.length,status:i.status??((i.diagnostics?.length??0)>0?"degraded":"ready"),warnings:i.warnings??[],delta:e.delta===!0,skipped:!1}}),o.push({host:a,status:i.status??((i.diagnostics?.length??0)>0?"degraded":"ready"),count:l.length,records:l,skipped:!1,warnings:i.warnings??[],remediation:i.remediation,diagnostics:i.diagnostics??[]})}return o}async function Qh(e){let t;try{t=await fs(Xr.join(e,"config.yaml"),"utf8")}catch{return 3600}let r=t.match(/^\s*(?:capability_refresh_ttl_seconds|refresh_ttl_seconds):\s*(\d+)\s*$/mu),o=r?.[1]?Number(r[1]):3600;return Number.isFinite(o)?Math.min(Math.max(o,0),86400):3600}async function Ee(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await A(t.database))return[];let r=_(t.database,{readOnly:e.readOnly}),o=ou(e.limit);try{return r.listCapabilities({host:e.host,readyOnly:e.readyOnly,limit:o,includeShared:e.includeShared})}finally{r.close()}}async function Yr(e){let t=await v(e.home),r=_(t.database),o=ou(e.limit);try{return r.searchCapabilities({query:e.query,host:e.host,readyOnly:e.readyOnly,limit:o,includeShared:e.includeShared})}finally{r.close()}}async function Ct(e){let t=await v(e.home),r=_(t.database);try{return r.getCapability(e.uid)}finally{r.close()}}async function hs(e){let t=e.readOnly?f(e.home):await v(e.home),r=Xr.join(t.home,"capabilities","cards"),o=[];if(!await A(r))return{cards:[],warnings:o};let n=(await zh(r)).filter(c=>c.endsWith(".json")).sort(),a=iy(e.query??""),s=[];for(let c of n){let d=Xr.join(r,c),p;try{p=await fs(d,"utf8")}catch{o.push(`CAPABILITY_CARD_UNREADABLE:${c}`);continue}let g=oy(p);if(!g){o.push(`CAPABILITY_CARD_MALFORMED:${c}`);continue}let y=ny(g,e.host);s.push({card:y,score:ay(g,e.host,a)})}let i=uy(e.limit),l=s.sort((c,d)=>d.score-c.score||c.card.uid.localeCompare(d.card.uid));return{cards:Zh(l,i).map(c=>c.card),warnings:o}}function Zh(e,t){let r=e.slice(0,t);if(t<=1||r.some(n=>n.card.alternative_host))return r;let o=e.find(n=>n.card.alternative_host);return o?[...r.slice(0,t-1),o].sort((n,a)=>a.score-n.score||n.card.uid.localeCompare(a.card.uid)):r}async function ys(e){let t=await v(e.home),r=await ty({home:t.home,host:e.host,limit:e.limit}),o=Xr.join(t.home,"capabilities","cards");await Kh(o,{recursive:!0,mode:448});let n=[];for(let s of r){let i=ry(s),l=`${JSON.stringify(i,null,2)}
|
|
868
|
-
`,c=Xr.join(o,`${dy(s.uid)}.json`),d=Yh(c)?await fs(c,"utf8"):null,p=d===l?"unchanged":d===null?"created":"updated";p!=="unchanged"&&await Xh(c,l,{encoding:"utf8",mode:384}),n.push({uid:s.uid,host:s.host,path:c,action:p,hash:E(l),card:i})}let a={home:t.home,host:e.host,generated:n.length,changed:n.filter(s=>s.action!=="unchanged").length,cards:n,warnings:n.length===0?["NO_CAPABILITY_RECORDS_TO_LEARN"]:[]};return await h({home:t.home,type:"capability_cards_learned",details:{host:e.host,generated:a.generated,changed:a.changed,warnings:a.warnings}}),a}function ey(e){return{...e,uid:N(e.uid).value,host:N(e.host).value,native_kind:N(e.native_kind).value,normalized_kind:N(e.normalized_kind).value,source:N(e.source).value,schema_hash:e.schema_hash?N(e.schema_hash).value:null}}async function ty(e){return e.host==="all"?Ee({home:e.home,limit:e.limit}):Ee({home:e.home,host:e.host,limit:e.limit})}function ry(e){let t=e.schema_hash??
|
|
869
|
-
`,{encoding:"utf8",mode:384}),r}async function to(e){let t=K(e.cwd,e.home);if(t.source!=="git-root"&&t.source!=="path")return{written:!1,marker_path:t.marker_path,base_id:t.base_id};let r=t.git_root??t.cwd,o=he.join(r,".nativesoul","project");return xn(o)?{written:!1,marker_path:o,base_id:t.base_id}:(bs(r,t.base_id),{written:!0,marker_path:o,base_id:t.base_id})}async function vs(e){let t=he.resolve(e.cwd),r=K(t,e.home),o=r.git_root??r.cwd,n=he.join(o,".nativesoul","project");return e.apply&&(bs(o,r.base_id),await h({home:f(e.home).home,type:"project_pinned",details:{id:r.base_id,basis_source:r.source,marker_path:n}})),{cwd:t,base_id:r.base_id,marker_path:n,applied:e.apply===!0,resolution:r}}function yy(e){let t=ks(e);for(;;){let r=he.join(t,".nativesoul","project");if(xn(r))return r;let o=he.dirname(t);if(o===t)return null;t=o}}function _y(e,t){let r=my("sha256").update(t).digest("hex").slice(0,10);return`${
|
|
868
|
+
`,c=Xr.join(o,`${dy(s.uid)}.json`),d=Yh(c)?await fs(c,"utf8"):null,p=d===l?"unchanged":d===null?"created":"updated";p!=="unchanged"&&await Xh(c,l,{encoding:"utf8",mode:384}),n.push({uid:s.uid,host:s.host,path:c,action:p,hash:E(l),card:i})}let a={home:t.home,host:e.host,generated:n.length,changed:n.filter(s=>s.action!=="unchanged").length,cards:n,warnings:n.length===0?["NO_CAPABILITY_RECORDS_TO_LEARN"]:[]};return await h({home:t.home,type:"capability_cards_learned",details:{host:e.host,generated:a.generated,changed:a.changed,warnings:a.warnings}}),a}function ey(e){return{...e,uid:N(e.uid).value,host:N(e.host).value,native_kind:N(e.native_kind).value,normalized_kind:N(e.normalized_kind).value,source:N(e.source).value,schema_hash:e.schema_hash?N(e.schema_hash).value:null}}async function ty(e){return e.host==="all"?Ee({home:e.home,limit:e.limit}):Ee({home:e.home,host:e.host,limit:e.limit})}function ry(e){let t=e.schema_hash??Re({uid:e.uid,host:e.host,native_kind:e.native_kind,normalized_kind:e.normalized_kind,source:e.source,readiness:eu(e)}),r={card_version:1,id:`capcard:${e.uid}`,uid:e.uid,host:e.host,native_kind:e.native_kind,normalized_kind:e.normalized_kind,readiness:eu(e),source:e.source,schema_hash:t,use_when:[`Use when a task needs ${e.normalized_kind} capability metadata on ${e.host}.`,`Check this card before claiming ${e.uid} is available or ready.`],requires:ly(e),side_effects:["Reading this card has no side effects.","Executing the native capability may have host-specific side effects and must follow policy."],approval:cy(e),examples:[`Inspect ${e.uid} readiness before using it.`,`Prefer a ready capability on ${e.host}; otherwise report degraded status.`]};return H(r)}function oy(e){let t;try{t=JSON.parse(e)}catch{return null}if(!tu(t))return null;let r=t.readiness;return t.card_version!==1||typeof t.id!="string"||typeof t.uid!="string"||typeof t.host!="string"||typeof t.native_kind!="string"||typeof t.normalized_kind!="string"||typeof t.source!="string"||typeof t.schema_hash!="string"||!Array.isArray(t.use_when)||!Array.isArray(t.requires)||!Array.isArray(t.side_effects)||typeof t.approval!="string"||!Array.isArray(t.examples)||!sy(r)?null:t}function ny(e,t){let r=e.host!==t,o=e.host!==t&&e.host!=="all";return{id:e.id,uid:e.uid,host:e.host,ready:e.readiness.ready,source:e.source,schema_hash:e.schema_hash,use_when:zr(e.use_when).slice(0,2),requires:zr(e.requires).slice(0,4),approval:e.approval,alternative_host:r,available_on_other_host:o}}function ay(e,t,r){let o=ru([e.uid,e.host,e.native_kind,e.normalized_kind,e.source,e.schema_hash,...zr(e.use_when),...zr(e.requires),e.approval,...zr(e.examples)].join(" ")),n=r.reduce((a,s)=>a+(o.includes(s)?10:0),0);return(e.host===t?100:0)+(e.readiness.ready?5:0)+n}function zr(e){return e.filter(t=>typeof t=="string")}function tu(e){return typeof e=="object"&&e!==null}function sy(e){return tu(e)?["installed","enabled","active","authenticated","healthy","allowed","ready"].every(t=>typeof e[t]=="boolean"):!1}function iy(e){return ru(e).split(/\s+/u).map(t=>t.trim()).filter(t=>t.length>=2)}function ru(e){return e.toLowerCase().normalize("NFKD").replace(/[\u0300-\u036f]/gu,"")}function eu(e){return{installed:e.installed,enabled:e.enabled,active:e.active,authenticated:e.authenticated,healthy:e.healthy,allowed:e.allowed,ready:e.ready}}function ly(e){let t=[["installed",e.installed],["enabled",e.enabled],["active",e.active],["authenticated",e.authenticated],["healthy",e.healthy],["allowed",e.allowed],["ready",e.ready]].filter(([,r])=>r===!1).map(([r])=>`${r} must be true`);return t.length>0?t:["No missing readiness prerequisites are known."]}function cy(e){return e.allowed?e.normalized_kind.includes("connector")||e.normalized_kind.includes("mcp")?"approval_required_for_external_write":"allowed_for_read_or_local_use_when_ready":"denied_by_policy"}function dy(e){return`${e.replace(/[^A-Za-z0-9._-]+/gu,"_").replace(/^_+|_+$/gu,"")||"capability"}-${E(e).slice(7,19)}`}function ou(e){return Math.min(Math.max(e??50,1),100)}function uy(e){return Math.min(Math.max(e??5,1),8)}async function Qr(e){let t=await v(e.home),r=N(e.summary).value,o=new Date,n=e.ttlSeconds?new Date(o.getTime()+py(e.ttlSeconds)*1e3).toISOString():null,a=H(e.source??{host:"cli",session_id:"local"}),s=_(t.database),i;try{i=s.createOpenCommitmentIfMissing({id:T("commitment"),project_id:e.project,summary:r,status:"open",due_at:e.dueAt??null,ttl_expires_at:n,source:a,created_at:o.toISOString(),updated_at:o.toISOString()},o.toISOString())}finally{s.close()}return await h({home:t.home,type:i.created?"commitment_created":"commitment_deduped",details:{id:i.commitment.id,project:i.commitment.project_id,redacted:r!==e.summary,created:i.created}}),i}async function Zr(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await A(t.database))return[];let r=_(t.database,{readOnly:e.readOnly}),o;try{o=r.listCommitments({project:e.project,status:e.status??(e.includeExpired?void 0:"open"),includeExpired:e.includeExpired,limit:Math.min(Math.max(e.limit??50,1),200),now:new Date().toISOString(),skipExpire:e.readOnly})}finally{r.close()}return e.readOnly||await h({home:t.home,type:"commitments_listed",details:{project:e.project??null,status:e.status??null,includeExpired:e.includeExpired===!0,count:o.length}}),o}async function eo(e,t){return nu(e,t,"completed","commitment_completed")}async function _s(e,t){return nu(e,t,"dismissed","commitment_dismissed")}async function nu(e,t,r,o){let n=await v(e),a=_(n.database),s;try{s=a.updateCommitmentStatus(t,r,new Date().toISOString())}finally{a.close()}if(!s)throw new Error(`Commitment not found: ${t}`);return await h({home:n.home,type:o,details:{id:s.id,project:s.project_id,status:s.status}}),s}function py(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e),1),365*24*60*60):1440*60}import{createHash as my}from"node:crypto";import{existsSync as xn,mkdirSync as gy,realpathSync as fy,readFileSync as su,writeFileSync as hy}from"node:fs";import{spawnSync as iu}from"node:child_process";import he from"node:path";function L(e,t){return K(e,t).id}function K(e,t){let r=ks(e),o=vy(r),n=o?ky(o):null,a=n?au(n):o??r,s=wy(a),i=n?"git-remote":o?"git-root":"path",l=_y(s,a),c=yy(r),d=c?lu(c):null,p=ws(t),g=[d,l,n?au(n):null,o,r].find(y=>y&&p[y]);if(g){let y=d??l;return{id:p[g]??y,source:"alias",cwd:r,git_root:o,remote:n,base_id:y,alias_key:g,marker_path:c}}return d?{id:d,source:"marker",cwd:r,git_root:o,remote:n,base_id:d,alias_key:null,marker_path:c}:{id:l,source:i,cwd:r,git_root:o,remote:n,base_id:l,alias_key:null,marker_path:null}}function lu(e){if(!xn(e))return null;let t=su(e,"utf8").trim();if(t.length===0)return null;let r=t.match(/^(?:project_id|id):\s*([a-z0-9._-]+)\s*$/imu);if(r?.[1])return r[1];let o=t.split(/\r?\n/u).map(n=>n.trim()).find(n=>n.length>0&&!n.startsWith("#"));return o?by(o):null}function bs(e,t){let r=he.join(e,".nativesoul","project");return gy(he.dirname(r),{recursive:!0,mode:448}),hy(r,`${t}
|
|
869
|
+
`,{encoding:"utf8",mode:384}),r}async function to(e){let t=K(e.cwd,e.home);if(t.source!=="git-root"&&t.source!=="path")return{written:!1,marker_path:t.marker_path,base_id:t.base_id};let r=t.git_root??t.cwd,o=he.join(r,".nativesoul","project");return xn(o)?{written:!1,marker_path:o,base_id:t.base_id}:(bs(r,t.base_id),{written:!0,marker_path:o,base_id:t.base_id})}async function vs(e){let t=he.resolve(e.cwd),r=K(t,e.home),o=r.git_root??r.cwd,n=he.join(o,".nativesoul","project");return e.apply&&(bs(o,r.base_id),await h({home:f(e.home).home,type:"project_pinned",details:{id:r.base_id,basis_source:r.source,marker_path:n}})),{cwd:t,base_id:r.base_id,marker_path:n,applied:e.apply===!0,resolution:r}}function yy(e){let t=ks(e);for(;;){let r=he.join(t,".nativesoul","project");if(xn(r))return r;let o=he.dirname(t);if(o===t)return null;t=o}}function _y(e,t){let r=my("sha256").update(t).digest("hex").slice(0,10);return`${Ry(e)}-${r}`}function by(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"")||"workspace"}function ks(e){try{return fy(he.resolve(e))}catch{return he.resolve(e)}}function vy(e){let t=iu("git",["-C",e,"rev-parse","--show-toplevel"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(t.status!==0)return null;let r=t.stdout.trim();return r.length>0?ks(r):null}function ky(e){let t=iu("git",["-C",e,"remote","get-url","origin"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(t.status!==0)return null;let r=t.stdout.trim();return r.length>0?r:null}function au(e){return e.trim().replace(/^git@([^:]+):/,"https://$1/").replace(/^ssh:\/\/git@([^/]+)\//,"https://$1/").replace(/^https?:\/\/([^/]+)\//,"https://$1/").replace(/\.git$/u,"").toLowerCase()}function wy(e){let t=e.replace(/\/+$/u,"");return he.basename(t)||"workspace"}function Ry(e){return e.toLowerCase().replace(/[^a-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"")||"workspace"}function ws(e){if(!e)return{};let t=he.join(he.resolve(e),"config.yaml");if(!xn(t))return{};let r=su(t,"utf8"),o={},n=!1,a=!1,s="";for(let i of r.split(/\r?\n/u)){if(/^\S/u.test(i)){n=/^project:\s*$/u.test(i),a=!1;continue}let l=i.match(/^([ \t]+)aliases:\s*(?:\{\}\s*)?$/u);if(n&&l?.[1]){a=!0,s=l[1];continue}if(a){if(i.trim().length===0||i.trim().startsWith("#"))continue;let c=i.match(/^([ \t]+)(?:"([^"]+)"|'([^']+)'|([^:]+)):\s*(?:"([^"]+)"|'([^']+)'|(.+))\s*$/u);(c?.[1]??"").length<=s.length&&(a=!1);let p=c?.[2]??c?.[3]??c?.[4],g=c?.[5]??c?.[6]??c?.[7];a&&p&&g?o[p.trim()]=g.trim():/^[ \t]+\S/u.test(i)&&i.trim().length>0&&(a=!1)}}return o}import{readFile as Sy,writeFile as Ay}from"node:fs/promises";import Ey from"node:path";async function Rs(e){let t=f(e.home),r=Ey.join(t.home,"config.yaml"),o=await A(r)?await Sy(r,"utf8"):`version: 1
|
|
870
870
|
`,n=o.includes(`\r
|
|
871
871
|
`)?`\r
|
|
872
872
|
`:`
|
|
873
|
-
`,s={...uu(o).aliases},i=s[e.aliasKey]??null;if(e.action==="add"){if(!e.projectId)throw new Error("project alias add requires <id>");s[e.aliasKey]=e.projectId}else delete s[e.aliasKey];let l=Py(o,s,n),c=l!==o;return e.apply&&c&&(pe(r,{root:t.home}),await Ay(r,l,{encoding:"utf8",mode:384})),{action:e.action,applied:e.apply===!0,config_path:r,alias_key:e.aliasKey,project_id:e.action==="add"?e.projectId??null:null,previous_id:i,aliases:s,changed:c,preview:l}}function uu(e){let t=pu(e),r={},o=[],n=-1,a=-1,s=-1,i=" ",l=" ";for(let c=0;c<t.length;c+=1)if(/^project:\s*$/u.test(t[c]??"")){n=c;break}if(n>=0)for(let c=n+1;c<t.length;c+=1){let d=t[c]??"";if(/^\S/u.test(d)&&d.trim().length>0)break;let p=d.match(/^([ \t]+)aliases:\s*(?:\{\}\s*)?$/u);if(p?.[1]){a=c,i=p[1],l=`${i}${i.includes(" ")?" ":" "}`;break}}if(a>=0){s=a+1;for(let c=a+1;c<t.length;c+=1){let d=t[c]??"";if(d.trim().length===0||d.trim().startsWith("#")){s=c+1;continue}let p=d.match(/^([ \t]+)(?:"([^"]+)"|'([^']+)'|([^:]+)):\s*(?:"([^"]+)"|'([^']+)'|(.+))\s*$/u),g=p?.[1]??"";if(!p||g.length<=i.length)break;let y=p[2]??p[3]??p[4],k=p[5]??p[6]??p[7];if(y&&k){let
|
|
873
|
+
`,s={...uu(o).aliases},i=s[e.aliasKey]??null;if(e.action==="add"){if(!e.projectId)throw new Error("project alias add requires <id>");s[e.aliasKey]=e.projectId}else delete s[e.aliasKey];let l=Py(o,s,n),c=l!==o;return e.apply&&c&&(pe(r,{root:t.home}),await Ay(r,l,{encoding:"utf8",mode:384})),{action:e.action,applied:e.apply===!0,config_path:r,alias_key:e.aliasKey,project_id:e.action==="add"?e.projectId??null:null,previous_id:i,aliases:s,changed:c,preview:l}}function uu(e){let t=pu(e),r={},o=[],n=-1,a=-1,s=-1,i=" ",l=" ";for(let c=0;c<t.length;c+=1)if(/^project:\s*$/u.test(t[c]??"")){n=c;break}if(n>=0)for(let c=n+1;c<t.length;c+=1){let d=t[c]??"";if(/^\S/u.test(d)&&d.trim().length>0)break;let p=d.match(/^([ \t]+)aliases:\s*(?:\{\}\s*)?$/u);if(p?.[1]){a=c,i=p[1],l=`${i}${i.includes(" ")?" ":" "}`;break}}if(a>=0){s=a+1;for(let c=a+1;c<t.length;c+=1){let d=t[c]??"";if(d.trim().length===0||d.trim().startsWith("#")){s=c+1;continue}let p=d.match(/^([ \t]+)(?:"([^"]+)"|'([^']+)'|([^:]+)):\s*(?:"([^"]+)"|'([^']+)'|(.+))\s*$/u),g=p?.[1]??"";if(!p||g.length<=i.length)break;let y=p[2]??p[3]??p[4],k=p[5]??p[6]??p[7];if(y&&k){let R=y.trim();r[R]=k.trim(),o.includes(R)||o.push(R)}s=c+1}}return{aliases:r,aliasOrder:o,projectStart:n,aliasesStart:a,aliasesEnd:s,projectIndent:i,aliasIndent:l}}function Py(e,t,r){let o=pu(e),n=uu(e),s=[...n.aliasOrder.filter(l=>Object.prototype.hasOwnProperty.call(t,l)),...Object.keys(t).filter(l=>!n.aliasOrder.includes(l))].map(l=>`${n.aliasIndent}${du(l)}: ${du(t[l]??"")}`);if(n.aliasesStart>=0){let l=o.slice(0,n.aliasesStart+1),c=o.slice(n.aliasesStart+1,n.aliasesEnd).filter(p=>{let g=p.trim();return g.length===0||g.startsWith("#")}),d=o.slice(n.aliasesEnd);return cu([...l,...c,...s,...d],r,e.endsWith(`
|
|
874
874
|
`))}if(n.projectStart>=0){let l=n.projectStart+1,c=o.slice(0,l),d=o.slice(l);return cu([...c,`${n.projectIndent}aliases:`,...s,...d],r,e.endsWith(`
|
|
875
875
|
`))}return`${e.length>0&&!e.endsWith(`
|
|
876
876
|
`)?`${e}${r}`:e}project:${r}${n.projectIndent}aliases:${r}${s.join(r)}${s.length?r:""}`}function pu(e){return e.replace(/\r\n/gu,`
|
|
877
877
|
`).split(`
|
|
878
|
-
`).filter((t,r,o)=>r<o.length-1||t.length>0)}function cu(e,t,r){let o=e.join(t);return r||e.length>0?`${o}${t}`:o}function du(e){return/^[A-Za-z0-9._/-]+$/u.test(e)?e:JSON.stringify(e)}import{writeFile as qy}from"node:fs/promises";import Is from"node:path";import{mkdir as _u,rename as Ny,writeFile as bu}from"node:fs/promises";import ye from"node:path";var
|
|
878
|
+
`).filter((t,r,o)=>r<o.length-1||t.length>0)}function cu(e,t,r){let o=e.join(t);return r||e.length>0?`${o}${t}`:o}function du(e){return/^[A-Za-z0-9._/-]+$/u.test(e)?e:JSON.stringify(e)}import{writeFile as qy}from"node:fs/promises";import Is from"node:path";import{mkdir as _u,rename as Ny,writeFile as bu}from"node:fs/promises";import ye from"node:path";var Ss={codex:{nativeSchedule:"supported",scheduleSurfaceScoped:!1,pluginApply:"none"},claude:{nativeSchedule:"supported",scheduleSurfaceScoped:!0,pluginApply:"claude-settings-hooks"},grok:{nativeSchedule:"none",scheduleSurfaceScoped:!1,pluginApply:"grok-host-wiring"},antigravity:{nativeSchedule:"supported",scheduleSurfaceScoped:!1,pluginApply:"none"},gemini:{nativeSchedule:"none",scheduleSurfaceScoped:!1,pluginApply:"none"}};function ro(e){return Ss[e].nativeSchedule==="supported"}function mu(e){return Ss[e].scheduleSurfaceScoped}function gu(e){return Ss[e].pluginApply}import{mkdir as xy,readFile as jy,writeFile as fu}from"node:fs/promises";import As from"node:path";var jn={heartbeat_enabled:!0,scheduler_host:"auto-native-supported",heartbeat_cadence:"daily",memory_candidates:!0,memory_candidate_policy:"candidate",auto_promotion:!1,promotion_policy:"explicit_approval",recall_auto_trigger_keywords:["como combinamos","como decidimos","o que combinamos","decisao anterior","decis\xE3o anterior","prior decision","previous decision","remember","lembr","memoria","mem\xF3ria","contexto anterior","last time"],recall_auto_trigger_denylist:["lint","format","typecheck","test","build"],candidate_auto_promotion_threshold:.6,recall_auto_trigger:!1,standing_order_templates:[]};async function hu(e,t){let r=await it(e),o=await A(dr(e));return{phase:t?"identity_pending":r&&o?"active":"pending",configured:r!==null,complete_marker_present:o,existing_profile:r,available_profiles:["quickstart","advanced"],quickstart_defaults:jn,apply_defaults:{dry_run:!0,user_confirmed:!1,reset:!1}}}async function Es(e){let t=await v(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,n=e.reset===!0,a=await it(t.home);if(a&&!n)return{dry_run:r,applied:!1,user_confirmed:o,reset:n,action:"preserved",before:a,after:a,diff:[],warnings:["ACTIVATION_PROFILE_PRESERVED: use reset=true to replace existing activation choices"]};let s=Iy(e.profile,e.options),i=Cy(a,s);if(!r&&!o)return{dry_run:r,applied:!1,user_confirmed:o,reset:n,action:"rejected",before:a,after:s,diff:i,warnings:["ACTIVATION_REQUIRES_USER_CONFIRMED"]};let l=a?i.length===0?"noop":"update":"create";return r||(await xy(As.join(t.home,"state"),{recursive:!0,mode:448}),await fu(yu(t.home),`${JSON.stringify(s,null,2)}
|
|
879
879
|
`,{encoding:"utf8",mode:384}),await fu(dr(t.home),`${new Date().toISOString()}
|
|
880
|
-
`,{encoding:"utf8",mode:384}),await h({home:t.home,type:"activation.profile.applied",details:{profile:s.profile,reset:n,diff:i.map(c=>c.field)}})),{dry_run:r,applied:!r,user_confirmed:o,reset:n,action:l,before:a,after:s,diff:i,warnings:[]}}function yu(e){return As.join(e,"state","activation-profile.json")}function dr(e){return As.join(e,"state","activation.complete")}async function it(e){try{let t=JSON.parse(await jy(yu(e),"utf8"));return Oy(t)?t:null}catch{return null}}function Iy(e,t){return{...jn,...Ty(t),profile:e,updated_at:new Date().toISOString()}}function Ty(e){if(!e)return{};if(e.candidate_auto_promotion_threshold!==void 0){let t=e.candidate_auto_promotion_threshold;if(!Number.isFinite(t)||t<0||t>1)throw new Error("Invalid candidate_auto_promotion_threshold: expected a number between 0 and 1")}if(e.promotion_policy!==void 0&&e.promotion_policy!=="manual"&&e.promotion_policy!=="explicit_approval")throw new Error("Invalid promotion_policy: expected manual or explicit_approval");if(e.memory_candidate_policy!==void 0&&e.memory_candidate_policy!=="candidate"&&e.memory_candidate_policy!=="off")throw new Error("Invalid memory_candidate_policy: expected candidate or off");if(e.recall_auto_trigger_keywords!==void 0&&(!Array.isArray(e.recall_auto_trigger_keywords)||e.recall_auto_trigger_keywords.some(t=>typeof t!="string")))throw new Error("Invalid recall_auto_trigger_keywords: expected string array");if(e.recall_auto_trigger_denylist!==void 0&&(!Array.isArray(e.recall_auto_trigger_denylist)||e.recall_auto_trigger_denylist.some(t=>typeof t!="string")))throw new Error("Invalid recall_auto_trigger_denylist: expected string array");if(e.standing_order_templates!==void 0&&!Array.isArray(e.standing_order_templates))throw new Error("Invalid standing_order_templates: expected string array");if(e.standing_order_templates!==void 0&&e.standing_order_templates.some(t=>typeof t!="string"))throw new Error("Invalid standing_order_templates: expected string array");return{...e,recall_auto_trigger_keywords:Array.isArray(e.recall_auto_trigger_keywords)?e.recall_auto_trigger_keywords:void 0,recall_auto_trigger_denylist:Array.isArray(e.recall_auto_trigger_denylist)?e.recall_auto_trigger_denylist:void 0,standing_order_templates:Array.isArray(e.standing_order_templates)?e.standing_order_templates:void 0}}function Cy(e,t){return["profile","heartbeat_enabled","scheduler_host","heartbeat_cadence","memory_candidates","memory_candidate_policy","auto_promotion","promotion_policy","recall_auto_trigger_keywords","recall_auto_trigger_denylist","candidate_auto_promotion_threshold","recall_auto_trigger","standing_order_templates"].flatMap(o=>{let n=e?.[o]??null,a=t[o];return JSON.stringify(n)===JSON.stringify(a)?[]:[{field:o,before:n,after:a}]})}function Oy(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;let t=e;return(t.profile==="quickstart"||t.profile==="advanced")&&typeof t.heartbeat_enabled=="boolean"&&(typeof t.scheduler_host=="string"||t.scheduler_host===null)&&typeof t.heartbeat_cadence=="string"&&typeof t.memory_candidates=="boolean"&&(t.memory_candidate_policy==="candidate"||t.memory_candidate_policy==="off")&&typeof t.auto_promotion=="boolean"&&(t.promotion_policy==="manual"||t.promotion_policy==="explicit_approval")&&Array.isArray(t.recall_auto_trigger_keywords)&&t.recall_auto_trigger_keywords.every(r=>typeof r=="string")&&Array.isArray(t.recall_auto_trigger_denylist)&&t.recall_auto_trigger_denylist.every(r=>typeof r=="string")&&typeof t.candidate_auto_promotion_threshold=="number"&&Number.isFinite(t.candidate_auto_promotion_threshold)&&t.candidate_auto_promotion_threshold>=0&&t.candidate_auto_promotion_threshold<=1&&typeof t.recall_auto_trigger=="boolean"&&Array.isArray(t.standing_order_templates)&&t.standing_order_templates.every(r=>typeof r=="string")&&typeof t.updated_at=="string"}var My=["entity","soul","human","collaboration","continuity"],Ly=["codex","claude","grok","antigravity","gemini"],Dy=["SOUL.md","POLICY.md"],vu=new Set(["IDENTITY.md","SOUL.md","USER.md","AGENTS.md"]),ur=64*1024,ku="<!-- nativesoul:start v1 -->",Ps="<!-- nativesoul:end -->",Hy={entity:{purpose:"Name and shape the shared NativeSoul identity before it starts acting across hosts.",example_questions:["What should I be called when I show up in Codex, Claude, Grok, Antigravity, or Gemini?","What kind of entity am I for you: continuity layer, familiar, operator, or something else?","What mission should every host recognize as mine?"],feeds:[{file:"IDENTITY.md",fields:["Name","Creature","Role","Vibe","Emoji","Mission"]}]},soul:{purpose:"Capture voice, stance, boundaries, and continuity rules that should feel consistent across hosts.",example_questions:["What truths should guide how I help you when no one is looking?","What boundaries should I never cross without explicit confirmation?","What vibe should I carry when the work gets ambiguous or high-stakes?"],feeds:[{file:"SOUL.md",sections:["Core truths","Boundaries","Vibe","Continuity"]}]},human:{purpose:"Learn the user's basic identity, working context, and engineering preferences without turning it into a dossier.",example_questions:["What should I call you, and what timezone and languages should I assume by default?","What engineering habits should I respect: tests, commits, docs, architecture, or review style?","What annoyances or collaboration preferences should I remember early?"],feeds:[{file:"USER.md",fields:["Name","What to call them","Timezone","Languages","Notes","Engineering preferences"]}]},collaboration:{purpose:"Define how the host AI should work with the user during sessions, especially around autonomy and safety.",example_questions:["When should I act autonomously, and when should I pause for your approval?","How should I report progress when a task takes more than a few minutes?","Which local tools or project conventions should every host consult before acting?"],feeds:[{file:"AGENTS.md",sections:["Session start","Execute -> verify -> report","Safety"]}]},continuity:{purpose:"Set the memory and handoff habits that keep different host sessions aligned over time.",example_questions:["What should become durable memory, and what should stay as temporary working notes?","How should I handle cross-host handoffs between Codex, Claude, Grok, Antigravity, and Gemini?","What recurring checks or follow-ups would be useful after onboarding?"],feeds:[{file:"AGENTS.md",sections:["Memory layers","Host continuity"]}]}},$y={"IDENTITY.md":{writable:!0,requires_user_confirmed:!1,required_fields:["Name","Creature","Role","Vibe","Emoji","Mission"],field_format:"- **Field:** value (Markdown list)",merge_strategy:"replace",max_bytes:ur},"SOUL.md":{writable:!0,requires_user_confirmed:!0,required_sections:["Core truths","Boundaries","Vibe","Continuity"],field_format:"Prose Markdown sections \u2014 not template slot-fill",merge_strategy:"replace",max_bytes:ur},"USER.md":{writable:!0,requires_user_confirmed:!1,required_fields:["Name","What to call them","Timezone","Languages"],field_format:"- **Field:** value (Markdown list)",merge_strategy:"replace",max_bytes:ur},"AGENTS.md":{writable:!0,requires_user_confirmed:!1,required_sections:["Session start","Safety"],field_format:"Operating instructions in Markdown",merge_strategy:"merge_managed_block",max_bytes:ur},"POLICY.md":{writable:!1,requires_user_confirmed:!1,field_format:"Use policy propose-change after onboarding",merge_strategy:"replace",max_bytes:0}};async function oo(e){let t=await v(e),o=(await ce(t.home,"BOOTSTRAP.md")).trim().length>0,n=await hu(t.home,o);return{ritual_pending:o,files_present:{soul:await A(ye.join(t.home,"SOUL.md")),identity:await A(ye.join(t.home,"IDENTITY.md")),user:await A(ye.join(t.home,"USER.md")),agents:await A(ye.join(t.home,"AGENTS.md")),bootstrap:await A(ye.join(t.home,"BOOTSTRAP.md"))},protected_targets:[...Dy],writable_files:[...vu],interview_themes:[...My],interview_guidance:Hy,instruction_doc:"llm-install.txt",apply_defaults:{dry_run:!0,user_confirmed:!1},file_generation_rules:$y,activation:n,offers:Fy(n)}}function Fy(e){return{heartbeat:{purpose:"Offer a native-host scheduled heartbeat for lightweight recurring continuity checks after identity is confirmed.",command:"nativesoul activate heartbeat plan --all-hosts --json",apply_command:"nativesoul activate heartbeat apply --apply --user-confirmed --json",approval_gate:"Plan first, explain the selected native scheduler, then apply only after explicit user consent.",reason:e.quickstart_defaults.heartbeat_enabled?"QuickStart defaults include heartbeat, but scheduler setup remains approval-gated.":"Heartbeat is optional and disabled by the selected activation defaults.",activation_phase:e.phase,default_cadence:e.quickstart_defaults.heartbeat_cadence,hosts:Ly.map(t=>({host:t,status:ro(t)?"available":"blocked_by_host",reason:ro(t)?"Native scheduler support can be planned and verified before applying.":`${t} has no native scheduler; do not install hidden cron or claim automatic heartbeat support.`}))},scan:{purpose:"Offer a local development-environment scan after onboarding so the user can opt into setup diagnostics.",command:"nativesoul scan",status:"available",reason:"The scan command is available as an opt-in, local, read-only dry-run by default."}}}async function no(e){let t=await v(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,n=[],a=[];for(let[s,i]of Object.entries(e.files)){let l=s.trim(),c=l.toUpperCase();if(c==="POLICY.MD"){n.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:"POLICY_VIOLATION: POLICY.md requires proposal flow"});continue}if(!vu.has(l)){n.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:`UNSUPPORTED_FILE: ${l}`});continue}if(c==="SOUL.MD"&&!o){n.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:"POLICY_VIOLATION: SOUL.md requires user_confirmed: true"});continue}let d=typeof i=="string"?i:"";if(Buffer.byteLength(d,"utf8")>ur){n.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:`FILE_TOO_LARGE: ${l} exceeds ${ur} bytes`});continue}let p=ye.join(t.home,l),g=await ce(t.home,l),y=l==="AGENTS.md"?Uy(g,d):d,k=g.length>0?E(g):null,S=E(y);if(k===S){n.push({file:l,action:"noop",before_hash:k,after_hash:S});continue}let U=g.length===0?"create":"update";n.push({file:l,action:U,before_hash:k,after_hash:S}),r||await bu(p,y,{encoding:"utf8",mode:384})}return!r&&e.config_patch?.hosts?.length&&a.push(`CONFIG_PATCH_NOT_APPLIED_V1: hosts=${e.config_patch.hosts.join(",")}`),r||await h({home:t.home,type:"onboarding.applied",details:{user_confirmed:o,files:n.map(s=>({file:s.file,action:s.action}))}}),{dry_run:r,applied:!r,user_confirmed:o,files:n,warnings:a}}async function ao(e){let t=f(e?.home),r=ye.join(t.home,"BOOTSTRAP.md");if(!await A(r))return{already_complete:!0,archived_bootstrap:!1,archive_path:null};let o=e?.archive!==!1,n=null;if(o){let s=ye.join(t.home,"memory","archive");await _u(s,{recursive:!0,mode:448});let i=new Date().toISOString().replace(/[:.]/gu,"-");n=ye.join(s,`bootstrap-${i}.md`),await Ny(r,n)}else{let{rm:s}=await import("node:fs/promises");await s(r,{force:!0})}let a=ye.join(t.home,"state","onboarding.complete");return await _u(ye.join(t.home,"state"),{recursive:!0,mode:448}),await bu(a,`${new Date().toISOString()}
|
|
880
|
+
`,{encoding:"utf8",mode:384}),await h({home:t.home,type:"activation.profile.applied",details:{profile:s.profile,reset:n,diff:i.map(c=>c.field)}})),{dry_run:r,applied:!r,user_confirmed:o,reset:n,action:l,before:a,after:s,diff:i,warnings:[]}}function yu(e){return As.join(e,"state","activation-profile.json")}function dr(e){return As.join(e,"state","activation.complete")}async function it(e){try{let t=JSON.parse(await jy(yu(e),"utf8"));return Oy(t)?t:null}catch{return null}}function Iy(e,t){return{...jn,...Ty(t),profile:e,updated_at:new Date().toISOString()}}function Ty(e){if(!e)return{};if(e.candidate_auto_promotion_threshold!==void 0){let t=e.candidate_auto_promotion_threshold;if(!Number.isFinite(t)||t<0||t>1)throw new Error("Invalid candidate_auto_promotion_threshold: expected a number between 0 and 1")}if(e.promotion_policy!==void 0&&e.promotion_policy!=="manual"&&e.promotion_policy!=="explicit_approval")throw new Error("Invalid promotion_policy: expected manual or explicit_approval");if(e.memory_candidate_policy!==void 0&&e.memory_candidate_policy!=="candidate"&&e.memory_candidate_policy!=="off")throw new Error("Invalid memory_candidate_policy: expected candidate or off");if(e.recall_auto_trigger_keywords!==void 0&&(!Array.isArray(e.recall_auto_trigger_keywords)||e.recall_auto_trigger_keywords.some(t=>typeof t!="string")))throw new Error("Invalid recall_auto_trigger_keywords: expected string array");if(e.recall_auto_trigger_denylist!==void 0&&(!Array.isArray(e.recall_auto_trigger_denylist)||e.recall_auto_trigger_denylist.some(t=>typeof t!="string")))throw new Error("Invalid recall_auto_trigger_denylist: expected string array");if(e.standing_order_templates!==void 0&&!Array.isArray(e.standing_order_templates))throw new Error("Invalid standing_order_templates: expected string array");if(e.standing_order_templates!==void 0&&e.standing_order_templates.some(t=>typeof t!="string"))throw new Error("Invalid standing_order_templates: expected string array");return{...e,recall_auto_trigger_keywords:Array.isArray(e.recall_auto_trigger_keywords)?e.recall_auto_trigger_keywords:void 0,recall_auto_trigger_denylist:Array.isArray(e.recall_auto_trigger_denylist)?e.recall_auto_trigger_denylist:void 0,standing_order_templates:Array.isArray(e.standing_order_templates)?e.standing_order_templates:void 0}}function Cy(e,t){return["profile","heartbeat_enabled","scheduler_host","heartbeat_cadence","memory_candidates","memory_candidate_policy","auto_promotion","promotion_policy","recall_auto_trigger_keywords","recall_auto_trigger_denylist","candidate_auto_promotion_threshold","recall_auto_trigger","standing_order_templates"].flatMap(o=>{let n=e?.[o]??null,a=t[o];return JSON.stringify(n)===JSON.stringify(a)?[]:[{field:o,before:n,after:a}]})}function Oy(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;let t=e;return(t.profile==="quickstart"||t.profile==="advanced")&&typeof t.heartbeat_enabled=="boolean"&&(typeof t.scheduler_host=="string"||t.scheduler_host===null)&&typeof t.heartbeat_cadence=="string"&&typeof t.memory_candidates=="boolean"&&(t.memory_candidate_policy==="candidate"||t.memory_candidate_policy==="off")&&typeof t.auto_promotion=="boolean"&&(t.promotion_policy==="manual"||t.promotion_policy==="explicit_approval")&&Array.isArray(t.recall_auto_trigger_keywords)&&t.recall_auto_trigger_keywords.every(r=>typeof r=="string")&&Array.isArray(t.recall_auto_trigger_denylist)&&t.recall_auto_trigger_denylist.every(r=>typeof r=="string")&&typeof t.candidate_auto_promotion_threshold=="number"&&Number.isFinite(t.candidate_auto_promotion_threshold)&&t.candidate_auto_promotion_threshold>=0&&t.candidate_auto_promotion_threshold<=1&&typeof t.recall_auto_trigger=="boolean"&&Array.isArray(t.standing_order_templates)&&t.standing_order_templates.every(r=>typeof r=="string")&&typeof t.updated_at=="string"}var My=["entity","soul","human","collaboration","continuity"],Ly=["codex","claude","grok","antigravity","gemini"],Dy=["SOUL.md","POLICY.md"],vu=new Set(["IDENTITY.md","SOUL.md","USER.md","AGENTS.md"]),ur=64*1024,ku="<!-- nativesoul:start v1 -->",Ps="<!-- nativesoul:end -->",Hy={entity:{purpose:"Name and shape the shared NativeSoul identity before it starts acting across hosts.",example_questions:["What should I be called when I show up in Codex, Claude, Grok, Antigravity, or Gemini?","What kind of entity am I for you: continuity layer, familiar, operator, or something else?","What mission should every host recognize as mine?"],feeds:[{file:"IDENTITY.md",fields:["Name","Creature","Role","Vibe","Emoji","Mission"]}]},soul:{purpose:"Capture voice, stance, boundaries, and continuity rules that should feel consistent across hosts.",example_questions:["What truths should guide how I help you when no one is looking?","What boundaries should I never cross without explicit confirmation?","What vibe should I carry when the work gets ambiguous or high-stakes?"],feeds:[{file:"SOUL.md",sections:["Core truths","Boundaries","Vibe","Continuity"]}]},human:{purpose:"Learn the user's basic identity, working context, and engineering preferences without turning it into a dossier.",example_questions:["What should I call you, and what timezone and languages should I assume by default?","What engineering habits should I respect: tests, commits, docs, architecture, or review style?","What annoyances or collaboration preferences should I remember early?"],feeds:[{file:"USER.md",fields:["Name","What to call them","Timezone","Languages","Notes","Engineering preferences"]}]},collaboration:{purpose:"Define how the host AI should work with the user during sessions, especially around autonomy and safety.",example_questions:["When should I act autonomously, and when should I pause for your approval?","How should I report progress when a task takes more than a few minutes?","Which local tools or project conventions should every host consult before acting?"],feeds:[{file:"AGENTS.md",sections:["Session start","Execute -> verify -> report","Safety"]}]},continuity:{purpose:"Set the memory and handoff habits that keep different host sessions aligned over time.",example_questions:["What should become durable memory, and what should stay as temporary working notes?","How should I handle cross-host handoffs between Codex, Claude, Grok, Antigravity, and Gemini?","What recurring checks or follow-ups would be useful after onboarding?"],feeds:[{file:"AGENTS.md",sections:["Memory layers","Host continuity"]}]}},$y={"IDENTITY.md":{writable:!0,requires_user_confirmed:!1,required_fields:["Name","Creature","Role","Vibe","Emoji","Mission"],field_format:"- **Field:** value (Markdown list)",merge_strategy:"replace",max_bytes:ur},"SOUL.md":{writable:!0,requires_user_confirmed:!0,required_sections:["Core truths","Boundaries","Vibe","Continuity"],field_format:"Prose Markdown sections \u2014 not template slot-fill",merge_strategy:"replace",max_bytes:ur},"USER.md":{writable:!0,requires_user_confirmed:!1,required_fields:["Name","What to call them","Timezone","Languages"],field_format:"- **Field:** value (Markdown list)",merge_strategy:"replace",max_bytes:ur},"AGENTS.md":{writable:!0,requires_user_confirmed:!1,required_sections:["Session start","Safety"],field_format:"Operating instructions in Markdown",merge_strategy:"merge_managed_block",max_bytes:ur},"POLICY.md":{writable:!1,requires_user_confirmed:!1,field_format:"Use policy propose-change after onboarding",merge_strategy:"replace",max_bytes:0}};async function oo(e){let t=await v(e),o=(await ce(t.home,"BOOTSTRAP.md")).trim().length>0,n=await hu(t.home,o);return{ritual_pending:o,files_present:{soul:await A(ye.join(t.home,"SOUL.md")),identity:await A(ye.join(t.home,"IDENTITY.md")),user:await A(ye.join(t.home,"USER.md")),agents:await A(ye.join(t.home,"AGENTS.md")),bootstrap:await A(ye.join(t.home,"BOOTSTRAP.md"))},protected_targets:[...Dy],writable_files:[...vu],interview_themes:[...My],interview_guidance:Hy,instruction_doc:"llm-install.txt",apply_defaults:{dry_run:!0,user_confirmed:!1},file_generation_rules:$y,activation:n,offers:Fy(n)}}function Fy(e){return{heartbeat:{purpose:"Offer a native-host scheduled heartbeat for lightweight recurring continuity checks after identity is confirmed.",command:"nativesoul activate heartbeat plan --all-hosts --json",apply_command:"nativesoul activate heartbeat apply --apply --user-confirmed --json",approval_gate:"Plan first, explain the selected native scheduler, then apply only after explicit user consent.",reason:e.quickstart_defaults.heartbeat_enabled?"QuickStart defaults include heartbeat, but scheduler setup remains approval-gated.":"Heartbeat is optional and disabled by the selected activation defaults.",activation_phase:e.phase,default_cadence:e.quickstart_defaults.heartbeat_cadence,hosts:Ly.map(t=>({host:t,status:ro(t)?"available":"blocked_by_host",reason:ro(t)?"Native scheduler support can be planned and verified before applying.":`${t} has no native scheduler; do not install hidden cron or claim automatic heartbeat support.`}))},scan:{purpose:"Offer a local development-environment scan after onboarding so the user can opt into setup diagnostics.",command:"nativesoul scan",status:"available",reason:"The scan command is available as an opt-in, local, read-only dry-run by default."}}}async function no(e){let t=await v(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,n=[],a=[];for(let[s,i]of Object.entries(e.files)){let l=s.trim(),c=l.toUpperCase();if(c==="POLICY.MD"){n.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:"POLICY_VIOLATION: POLICY.md requires proposal flow"});continue}if(!vu.has(l)){n.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:`UNSUPPORTED_FILE: ${l}`});continue}if(c==="SOUL.MD"&&!o){n.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:"POLICY_VIOLATION: SOUL.md requires user_confirmed: true"});continue}let d=typeof i=="string"?i:"";if(Buffer.byteLength(d,"utf8")>ur){n.push({file:l,action:"rejected",before_hash:null,after_hash:null,warning:`FILE_TOO_LARGE: ${l} exceeds ${ur} bytes`});continue}let p=ye.join(t.home,l),g=await ce(t.home,l),y=l==="AGENTS.md"?Uy(g,d):d,k=g.length>0?E(g):null,R=E(y);if(k===R){n.push({file:l,action:"noop",before_hash:k,after_hash:R});continue}let U=g.length===0?"create":"update";n.push({file:l,action:U,before_hash:k,after_hash:R}),r||await bu(p,y,{encoding:"utf8",mode:384})}return!r&&e.config_patch?.hosts?.length&&a.push(`CONFIG_PATCH_NOT_APPLIED_V1: hosts=${e.config_patch.hosts.join(",")}`),r||await h({home:t.home,type:"onboarding.applied",details:{user_confirmed:o,files:n.map(s=>({file:s.file,action:s.action}))}}),{dry_run:r,applied:!r,user_confirmed:o,files:n,warnings:a}}async function ao(e){let t=f(e?.home),r=ye.join(t.home,"BOOTSTRAP.md");if(!await A(r))return{already_complete:!0,archived_bootstrap:!1,archive_path:null};let o=e?.archive!==!1,n=null;if(o){let s=ye.join(t.home,"memory","archive");await _u(s,{recursive:!0,mode:448});let i=new Date().toISOString().replace(/[:.]/gu,"-");n=ye.join(s,`bootstrap-${i}.md`),await Ny(r,n)}else{let{rm:s}=await import("node:fs/promises");await s(r,{force:!0})}let a=ye.join(t.home,"state","onboarding.complete");return await _u(ye.join(t.home,"state"),{recursive:!0,mode:448}),await bu(a,`${new Date().toISOString()}
|
|
881
881
|
`,{encoding:"utf8",mode:384}),await h({home:t.home,type:"onboarding.completed",details:{archived:o,archive_path:n}}),{already_complete:!1,archived_bootstrap:o,archive_path:n}}function In(e){return ye.join(e,"state","onboarding.complete")}function Uy(e,t){let r=t.trim();if(!e.trim())return`${r}
|
|
882
882
|
`;if(e.includes(r))return e;let o=wu(e);if(o){let a=o.after.trimEnd(),s=a.length>0?`${a}
|
|
883
883
|
|
|
@@ -895,19 +895,19 @@ ${Ps}`;if(!e.trim())return`${r}
|
|
|
895
895
|
`;let o=wu(e);return o?`${o.before}${r}${o.after}`:`${e.trimEnd()}
|
|
896
896
|
|
|
897
897
|
${r}
|
|
898
|
-
`}function wu(e){let t=e.indexOf(ku),r=e.indexOf(Ps);if(t<0||r<0||r<t)return null;let o=r+Ps.length;return{before:e.slice(0,t),block:e.slice(t,o),after:e.slice(o)}}var By={minLength:1,removeStopwords:!1,normalizeDiacritics:!1};function Tn(e,t={}){let r={...By,...t},o=r.normalizeDiacritics?e.normalize("NFKD").replace(new RegExp("\\p{Diacritic}","gu"),""):e;return Array.from(new Set(o.toLowerCase().match(/[\p{L}\p{N}_-]+/gu)?.filter(n=>n.length>=r.minLength).filter(n=>!r.removeStopwords||!Vy.has(n))??[]))}function so(e,t={}){return new Set(Tn(e,t))}function xs(e,t){let r=Tn(e);if(r.length===0)return 0;let o=so(t),n=r.filter(a=>o.has(a)).length;return Number((n/r.length).toFixed(6))}function
|
|
899
|
-
${p.content}`)])),c=Pu(e.query),d=a.map(p=>{let g=i.get(p.memory_id);if(!g)return null;let y=l.get(g.id)??0,k=
|
|
898
|
+
`}function wu(e){let t=e.indexOf(ku),r=e.indexOf(Ps);if(t<0||r<0||r<t)return null;let o=r+Ps.length;return{before:e.slice(0,t),block:e.slice(t,o),after:e.slice(o)}}var By={minLength:1,removeStopwords:!1,normalizeDiacritics:!1};function Tn(e,t={}){let r={...By,...t},o=r.normalizeDiacritics?e.normalize("NFKD").replace(new RegExp("\\p{Diacritic}","gu"),""):e;return Array.from(new Set(o.toLowerCase().match(/[\p{L}\p{N}_-]+/gu)?.filter(n=>n.length>=r.minLength).filter(n=>!r.removeStopwords||!Vy.has(n))??[]))}function so(e,t={}){return new Set(Tn(e,t))}function xs(e,t){let r=Tn(e);if(r.length===0)return 0;let o=so(t),n=r.filter(a=>o.has(a)).length;return Number((n/r.length).toFixed(6))}function Ru(e,t,r={}){let o=so(e,r),n=so(t,r);if(o.size===0||n.size===0)return 0;let a=[...o].filter(i=>n.has(i)).length,s=new Set([...o,...n]).size;return Number((a/s).toFixed(6))}function Su(e,t){let r=Math.min(e.length,t.length),o=0;for(let n=0;n<r;n+=1)o+=(e[n]??0)*(t[n]??0);return Number(Math.max(o,0).toFixed(6))}var Vy=new Set(["the","and","for","with","this","that","uma","com","para","por","que","deve","esta","este","essa","isso"]);var lt=1,ct="local-hash",dt="local-hash-bow-v1";async function js(e={}){let t=await v(e.home),r=Math.min(Math.max(e.limit??1e3,1),1e4),o=_(t.database),n,a=[],s=0,i=0;try{n=o.listSemanticIndexableMemories({limit:r});let l=new Date().toISOString();for(let c of n){let d=Wy(c),p=o.getSemanticIndex(c.id);if(p&&p.content_hash===d.contentHash&&p.provider_id===ct&&p.model_id===dt&&p.schema_version===lt){s+=1;continue}d.redacted&&(i+=1),a.push({memory_id:c.id,scope_project:c.scope.project,source:c.source,schema_version:lt,provider_id:ct,model_id:dt,content_hash:d.contentHash,embedding:Pu(d.text),indexed_text:d.text,indexed_at:l})}a.length>0&&o.upsertSemanticIndex(a)}finally{o.close()}return await h({home:t.home,type:"semantic_index_built",details:{provider_id:ct,model_id:dt,schema_version:lt,indexable_count:n.length,indexed_count:a.length,skipped_unchanged:s,redacted_count:i}}),{provider_id:ct,model_id:dt,schema_version:lt,indexable_count:n.length,indexed_count:a.length,skipped_unchanged:s,redacted_count:i}}function Eu(e){let t=_(e,{readOnly:!0});try{let r=t.semanticIndexStats({providerId:ct,modelId:dt,schemaVersion:lt});return{provider_id:ct,model_id:dt,schema_version:lt,available:!0,indexable_count:r.indexable_count,indexed_count:r.indexed_count,stale_count:r.stale_count,healthy:r.stale_count===0,remediation:r.stale_count===0?null:"Run nativesoul memory index"}}finally{t.close()}}function io(e){let t=_(e.database,{readOnly:e.readOnly}),r=Math.min(Math.max(e.limit,1),8);try{let o=t.searchMemories(e.query,e.project,r),n=t.semanticIndexStatsForProject({project:e.project,providerId:ct,modelId:dt,schemaVersion:lt});if(n.indexable_count===0||n.indexed_count===0||n.stale_count>0)return{mode:"fts",reason:n.stale_count>0?"semantic_index_stale":"semantic_index_unavailable",memories:Au(o.length>0?o:t.recentMemories(e.project,r),e.query)};let a=t.listCurrentSemanticIndexesForProject({project:e.project,providerId:ct,modelId:dt,schemaVersion:lt,limit:1e3}),s=t.listActiveMemoriesForProject(e.project,1e3),i=new Map(s.map(p=>[p.id,p])),l=new Map(o.map(p=>[p.id,xs(e.query,`${p.summary}
|
|
899
|
+
${p.content}`)])),c=Pu(e.query),d=a.map(p=>{let g=i.get(p.memory_id);if(!g)return null;let y=l.get(g.id)??0,k=Su(c,p.embedding);return{memory:g,ftsScore:y,semanticScore:k,score:Number((y*.55+k*.45).toFixed(6))}}).filter(p=>p!==null).filter(p=>p.ftsScore>0||p.semanticScore>0).sort((p,g)=>g.score-p.score||g.semanticScore-p.semanticScore||p.memory.id.localeCompare(g.memory.id)).slice(0,r).map((p,g)=>({...p.memory,recall:{mode:"hybrid",fts_score:p.ftsScore,semantic_score:p.semanticScore,final_rank:g+1,reason:p.ftsScore>0&&p.semanticScore>0?"fts_and_semantic":p.semanticScore>0?"semantic_neighbor":"fts_match"}}));return{mode:"hybrid",reason:"semantic_index_ready",memories:d.length>0?d:Au(o,e.query)}}finally{t.close()}}function Wy(e){let t=N(`${e.summary}
|
|
900
900
|
|
|
901
901
|
${e.content}`);return{text:t.value,contentHash:e.hash,redacted:t.redacted}}function Pu(e){let r=Array.from({length:32},()=>0);for(let n of Tn(e)){let a=Jy(n),s=a%32,i=a%2===0?1:-1;r[s]=(r[s]??0)+i}let o=Math.hypot(...r)||1;return r.map(n=>Number((n/o).toFixed(6)))}function Au(e,t){return e.map((r,o)=>({...r,recall:{mode:"fts",fts_score:xs(t,`${r.summary}
|
|
902
902
|
${r.content}`),semantic_score:0,final_rank:o+1,reason:"fts_fallback"}}))}function Jy(e){let t=2166136261;for(let r=0;r<e.length;r+=1)t^=e.charCodeAt(r),t=Math.imul(t,16777619);return t>>>0}function Ge(e,t=160){let r=e.replace(/\s+/g," ").trim();return r.length<=t?r:`${r.slice(0,t-3)}...`}function lo(e){return Math.ceil(e.length/4)}function Cn(e,t){return e.length<=t?e:`${e.slice(0,Math.max(t-3,0))}...`}var Ot=class extends Error{code="MEMORY_TRANSITION_BLOCKED";id;from;to;constructor(t){super(`Invalid memory transition for ${t.id}: ${t.from} -> ${t.to}`),this.name="MemoryTransitionError",this.id=t.id,this.from=t.from,this.to=t.to}},Gy=new Map([["candidate",new Set(["active","rejected"])],["active",new Set(["forgotten","expired"])],["superseded",new Set],["rejected",new Set],["forgotten",new Set],["expired",new Set]]),Ky=1e3;async function Ts(e,t){let r=await v(e),o=await Cu(r.database,t,"active");return await h({home:r.home,type:"memory_added",details:{id:o.id,project:o.scope.project,redacted:o.sensitivity==="restricted"}}),o}async function ee(e,t){let r=await v(e),o=await Cu(r.database,t,"candidate");return await h({home:r.home,type:"memory_proposed",details:{id:o.id,project:o.scope.project,redacted:o.sensitivity==="restricted"}}),o}async function Cs(e){let t=await v(e.home),r=Is.resolve(e.cwd);await to({cwd:r,home:t.home});let o=L(r,t.home),n=e.event?.trim()||"session-end",a=zy(e.text,e.payload),s=[`Session memory candidate from ${e.host} ${n} hook.`,"",`Project: ${o}`,`CWD: ${r}`,"","Summary:",a.text].join(`
|
|
903
903
|
`),i=await ee(t.home,{project:o,content:s,confidence:a.source==="stub"?.2:.45,authority:"hook_observed",source:{kind:"session_end_hook",host:e.host,event:n,cwd:r,summary_source:a.source}});return{proposed:!0,host:e.host,event:n,cwd:r,project:o,memory:i,summary_source:a.source}}function zy(e,t){let r=e?.trim();if(r)return{text:xu(r),source:"text"};let o=Xy(t);return o?{text:xu(o),source:"payload"}:{text:"No host session summary was supplied. Review this candidate against the recent session before promotion.",source:"stub"}}function Xy(e){if(typeof e=="string")return e.trim()||null;if(!e||Array.isArray(e)||typeof e!="object")return null;for(let t of["summary","session_summary","transcript_summary","conversation_summary","text","content"]){let r=e[t];if(typeof r=="string"&&r.trim().length>0)return r.trim()}return null}function xu(e){return e.length<=8e3?e:`${e.slice(0,7997)}...`}async function Os(e){let t=await v(e.home),r=Is.resolve(e.cwd),o=L(r,t.home),n=await Yy(t.home),a=Iu(e.prompt,n),s=Math.min(Math.max(e.limit??3,1),3),i=[];if(a.triggered){let l=io({database:t.database,query:a.query,project:o,limit:s});i=l.memories,await h({home:t.home,type:"memory_recalled",details:{host:e.host,project:o,reason:a.reason,query:a.query,count:i.length,recall_mode:l.mode,recall_reason:l.reason}})}return{host:e.host,cwd:r,project:o,prompt:e.prompt,decision:a,memories:i,context:Qy(i,a)}}function Iu(e,t=Tu()){let r=e.trim(),o=r.toLowerCase();if(!t.autoTrigger)return{triggered:!1,reason:"auto_trigger_disabled",denied:!1,auto_trigger:!1,query:r};if(r.length===0)return{triggered:!1,reason:"empty_prompt",denied:!0,auto_trigger:!0,query:r};let n=t.denylist.find(s=>o===s||o.startsWith(`${s} `));if(n)return{triggered:!1,reason:`denylist:${n}`,denied:!0,auto_trigger:!0,query:r};let a=t.keywords.find(s=>o.includes(s));return a?{triggered:!0,reason:`keyword:${a}`,denied:!1,auto_trigger:!0,query:r}:{triggered:!1,reason:"no_trigger",denied:!1,auto_trigger:!0,query:r}}function Tu(){return{autoTrigger:!1,keywords:["como combinamos","como decidimos","o que combinamos","decisao anterior","decis\xE3o anterior","prior decision","previous decision","remember","lembr","memoria","mem\xF3ria","contexto anterior","last time"],denylist:["lint","format","typecheck","test","build"]}}async function Yy(e){let t=Tu(),r=await ce(e,"config.yaml"),o=r.match(/^\s*auto_trigger:\s*(true|false)\s*$/imu);o?.[1]&&(t.autoTrigger=o[1].toLowerCase()==="true");let n=ju(r,"keywords");n.length>0&&(t.keywords=n.map(s=>s.toLowerCase()));let a=ju(r,"denylist");return a.length>0&&(t.denylist=a.map(s=>s.toLowerCase())),t}function ju(e,t){let r=e.split(/\r?\n/u),o=[],n=!1;for(let a of r){if(new RegExp(`^\\s*${t}:\\s*$`,"u").test(a)){n=!0;continue}if(!n)continue;let s=a.match(/^\s*-\s*["']?(.+?)["']?\s*$/u)?.[1];if(s){o.push(s.trim());continue}if(/^\s*\S/u.test(a))break}return o}function Qy(e,t){if(!t.triggered||e.length===0)return"";let r=["## NativeSoul Memory Recall",`Trigger: ${t.reason}`,""];for(let o of e)r.push(`- ${o.summary}`);return r.join(`
|
|
904
|
-
`).slice(0,1800)}async function Nt(e,t){return On(e,t,"active","memory_promoted")}async function Mt(e,t){return On(e,t,"rejected","memory_rejected")}async function Lt(e,t){return On(e,t,"forgotten","memory_forgotten")}async function co(e,t){return On(e,t,"expired","memory_expired")}async function Dt(e){let t=await v(e.home),r=_(t.database),o;try{o=r.listMemories({project:e.project,status:e.status,includeForgotten:e.includeForgotten,limit:Math.min(Math.max(e.limit??100,1),1e3)})}finally{r.close()}return await h({home:t.home,type:"memory_exported",details:{project:e.project??null,status:e.status??null,includeForgotten:e.includeForgotten===!0,count:o.length}}),await Ns(t.home),o}async function Ns(e){let t=await v(e),r=Zy(t.database),o=await ce(t.home,"MEMORY.md"),n=pr(o,e_(r));n!==o&&await qy(Is.join(t.home,"MEMORY.md"),n,{encoding:"utf8",mode:384})}async function Cu(e,t,r){let o=N(t.content),n=new Date().toISOString(),a=Ge(o.value),s={id:T("mem"),type:t.type??"note",scope:{user:"default",project:t.project},content:o.value,summary:a,source:t.source??{host:"cli",session_id:"local"},confidence:t.confidence??.9,authority:t.authority??"user_explicit",sensitivity:o.redacted?"restricted":t.sensitivity??"internal",status:r,created_at:n,expires_at:null,hash:
|
|
904
|
+
`).slice(0,1800)}async function Nt(e,t){return On(e,t,"active","memory_promoted")}async function Mt(e,t){return On(e,t,"rejected","memory_rejected")}async function Lt(e,t){return On(e,t,"forgotten","memory_forgotten")}async function co(e,t){return On(e,t,"expired","memory_expired")}async function Dt(e){let t=await v(e.home),r=_(t.database),o;try{o=r.listMemories({project:e.project,status:e.status,includeForgotten:e.includeForgotten,limit:Math.min(Math.max(e.limit??100,1),1e3)})}finally{r.close()}return await h({home:t.home,type:"memory_exported",details:{project:e.project??null,status:e.status??null,includeForgotten:e.includeForgotten===!0,count:o.length}}),await Ns(t.home),o}async function Ns(e){let t=await v(e),r=Zy(t.database),o=await ce(t.home,"MEMORY.md"),n=pr(o,e_(r));n!==o&&await qy(Is.join(t.home,"MEMORY.md"),n,{encoding:"utf8",mode:384})}async function Cu(e,t,r){let o=N(t.content),n=new Date().toISOString(),a=Ge(o.value),s={id:T("mem"),type:t.type??"note",scope:{user:"default",project:t.project},content:o.value,summary:a,source:t.source??{host:"cli",session_id:"local"},confidence:t.confidence??.9,authority:t.authority??"user_explicit",sensitivity:o.redacted?"restricted":t.sensitivity??"internal",status:r,created_at:n,expires_at:null,hash:Re({type:t.type??"note",project:t.project,content:o.value,status:r,created_at:n})},i=_(e);try{i.insertMemory(s)}finally{i.close()}return s}async function On(e,t,r,o){let n=await v(e),a=_(n.database),s,i;try{if(s=a.getMemory(t),s&&!Nn(s.status,r))throw new Ot({id:t,from:s.status,to:r});i=s?a.updateMemoryStatus(t,r):null}catch(l){throw l instanceof Ot&&await t_({home:n.home,id:l.id,from:l.from,to:l.to}),l}finally{a.close()}if(!i)throw new Error(`Memory not found: ${t}`);return await h({home:n.home,type:o,details:{id:i.id,project:i.scope.project,status:r}}),(r==="active"||s?.status==="active")&&await Ns(n.home),i}function Zy(e){let t=_(e);try{return t.listMemories({status:"active",limit:Ky})}finally{t.close()}}function e_(e){let t=["## Active curated memories","","_Managed by NativeSoul. Regenerated by `memory promote` and `memory export`; SQLite remains the source of truth._",""];if(e.length===0)return t.push("_No active memories._"),t.join(`
|
|
905
905
|
`);for(let r of e){t.push(`### ${r.scope.project}`),t.push(""),t.push(`- id: \`${r.id}\``),t.push(`- created: ${r.created_at}`),t.push(`- type: ${r.type}`),t.push(`- authority: ${r.authority}`),t.push(`- confidence: ${r.confidence}`),t.push("- content:");for(let o of r.content.split(/\r?\n/u))t.push(` > ${o}`);t.push("")}return t.join(`
|
|
906
|
-
`).trimEnd()}function Nn(e,t){return Gy.get(e)?.has(t)??!1}async function t_(e){await h({home:e.home,type:"memory_transition_blocked",result:"blocked",details:{id:e.id,from:e.from,to:e.to,code:"MEMORY_TRANSITION_BLOCKED"}})}async function Ht(e,t,r,o=5){let n=await v(e),a=io({database:n.database,query:t,project:r,limit:Math.min(Math.max(o,1),8)});return await h({home:n.home,type:"memory_searched",details:{query:t,project:r,count:a.memories.length,recall_mode:a.mode,recall_reason:a.reason}}),a.memories}async function uo(e){let t=f(e.home),r=null;try{r=_(t.database);let o=r.upsertProject({id:e.resolution.id,display_name:e.resolution.id,base_id:e.resolution.base_id,source:e.resolution.source,first_basis:Ou(e.resolution),status:"active",now:e.now});return r.close(),r=null,o.inserted&&await h({home:t.home,type:"project_seen",details:{id:e.resolution.id,base_id:e.resolution.base_id,source:e.resolution.source,first_basis:Ou(e.resolution)}}),{touched:!0,inserted:o.inserted,degraded:!1,warning:null}}catch(o){return{touched:!1,inserted:!1,degraded:!0,warning:`PROJECT_REGISTRY_UNAVAILABLE:${i_(o)}`}}finally{r?.close()}}async function Ms(e={}){let t=f(e.home),r=n_(e.limit),o=e.status??"active";if(!await A(t.database))return{registry_available:!1,status:o,limit:r,projects:[],warning:"database_not_available"};let n=_(t.database,{readOnly:e.readOnly??!0});try{let a=n.listProjectsWithCounts({status:o,limit:r});return{registry_available:a.available,status:o,limit:r,projects:a.projects,warning:a.warning}}finally{n.close()}}async function Ls(e){let t=f(e.home),r=e.id==="."?r_(e.cwd??process.cwd(),t.home):o_(e.id);if(!await A(t.database))return Nu(e.id,r,"database_not_available");let o=_(t.database,{readOnly:e.readOnly??!0});try{let n=o.getProjectDetail(r.id);if(!n.available)return Nu(e.id,r,n.warning);let a=n.detail;return{registry_available:!0,requested:e.id,effective_id:r.id,registry:a?.project??null,live_resolution:r,counts:a?.counts??null,derived_last_seen_at:a?.derived_last_seen_at??null,continuity_gap:!!(a?.project&&a.project.base_id!==r.id),warning:a?.project?null:"project_not_found"}}finally{o.close()}}async function Ds(e){let t=f(e.home),r=a_(e.name),o=e.id==="."?K(e.cwd??process.cwd(),t.home).id:e.id,n=_(t.database),a;try{a=n.renameProject(o,r)}finally{n.close()}return a.found&&a.previous&&a.project&&await h({home:t.home,type:"project_renamed",details:{id:o,old_name:a.previous.display_name,new_name:r}}),{found:a.found,id:o,old_name:a.previous?.display_name??null,new_name:r,project:a.project}}async function Hs(e){let t=f(e.home),r=e.includeMemories===!0,o=e.apply===!0,n=e.confirm??null,a=!r||o&&n===e.id,s=_(t.database);try{let i=s.getProject(e.id);if(!i)return Mn({found:!1,id:e.id,mode:r?"forget_memories":"archive",applied:!1,guardOk:a,confirm:n,previousStatus:null,statusAfter:null,memoriesAffected:0,project:null,warning:"project_not_found"});if(r&&!a)return Mn({found:!0,id:e.id,mode:"forget_memories",applied:!1,guardOk:a,confirm:n,previousStatus:i.status,statusAfter:i.status,memoriesAffected:s.countProjectMemories(e.id),project:i,warning:"requires --apply --confirm <id>"});if(r)try{let c=s.forgetProjectMemories(e.id,Nn);return c.found&&c.project&&await h({home:t.home,type:"project_forgotten",details:{id:e.id,memories_affected:c.memories_affected}}),Mn({found:c.found,id:e.id,mode:"forget_memories",applied:c.found,guardOk:a,confirm:n,previousStatus:c.previous?.status??null,statusAfter:c.project?.status??null,memoriesAffected:c.memories_affected,project:c.project,warning:c.found?null:"project_not_found"})}catch(c){throw c instanceof ar&&await h({home:t.home,type:"memory_transition_blocked",result:"blocked",details:{id:c.id,from:c.from,to:c.to,code:c.code,project:e.id}}),c}let l=s.archiveProject(e.id);return l.found&&l.project&&await h({home:t.home,type:"project_archived",details:{id:e.id}}),Mn({found:l.found,id:e.id,mode:"archive",applied:l.found,guardOk:a,confirm:n,previousStatus:l.previous?.status??null,statusAfter:l.project?.status??null,memoriesAffected:0,project:l.project,warning:l.found?null:"project_not_found"})}finally{s.close()}}async function $s(e){let t=f(e.home),r=_(t.database),o;try{o=r.reactivateProject(e.id)}finally{r.close()}return o.found&&o.project&&await h({home:t.home,type:"project_reactivated",details:{id:e.id}}),{found:o.found,id:e.id,previous_status:o.previous?.status??null,status_after:o.project?.status??null,project:o.project}}async function Fs(e={}){return{aliases:ws(f(e.home).home)}}async function Us(e){let t=f(e.home),r=await
|
|
906
|
+
`).trimEnd()}function Nn(e,t){return Gy.get(e)?.has(t)??!1}async function t_(e){await h({home:e.home,type:"memory_transition_blocked",result:"blocked",details:{id:e.id,from:e.from,to:e.to,code:"MEMORY_TRANSITION_BLOCKED"}})}async function Ht(e,t,r,o=5){let n=await v(e),a=io({database:n.database,query:t,project:r,limit:Math.min(Math.max(o,1),8)});return await h({home:n.home,type:"memory_searched",details:{query:t,project:r,count:a.memories.length,recall_mode:a.mode,recall_reason:a.reason}}),a.memories}async function uo(e){let t=f(e.home),r=null;try{r=_(t.database);let o=r.upsertProject({id:e.resolution.id,display_name:e.resolution.id,base_id:e.resolution.base_id,source:e.resolution.source,first_basis:Ou(e.resolution),status:"active",now:e.now});return r.close(),r=null,o.inserted&&await h({home:t.home,type:"project_seen",details:{id:e.resolution.id,base_id:e.resolution.base_id,source:e.resolution.source,first_basis:Ou(e.resolution)}}),{touched:!0,inserted:o.inserted,degraded:!1,warning:null}}catch(o){return{touched:!1,inserted:!1,degraded:!0,warning:`PROJECT_REGISTRY_UNAVAILABLE:${i_(o)}`}}finally{r?.close()}}async function Ms(e={}){let t=f(e.home),r=n_(e.limit),o=e.status??"active";if(!await A(t.database))return{registry_available:!1,status:o,limit:r,projects:[],warning:"database_not_available"};let n=_(t.database,{readOnly:e.readOnly??!0});try{let a=n.listProjectsWithCounts({status:o,limit:r});return{registry_available:a.available,status:o,limit:r,projects:a.projects,warning:a.warning}}finally{n.close()}}async function Ls(e){let t=f(e.home),r=e.id==="."?r_(e.cwd??process.cwd(),t.home):o_(e.id);if(!await A(t.database))return Nu(e.id,r,"database_not_available");let o=_(t.database,{readOnly:e.readOnly??!0});try{let n=o.getProjectDetail(r.id);if(!n.available)return Nu(e.id,r,n.warning);let a=n.detail;return{registry_available:!0,requested:e.id,effective_id:r.id,registry:a?.project??null,live_resolution:r,counts:a?.counts??null,derived_last_seen_at:a?.derived_last_seen_at??null,continuity_gap:!!(a?.project&&a.project.base_id!==r.id),warning:a?.project?null:"project_not_found"}}finally{o.close()}}async function Ds(e){let t=f(e.home),r=a_(e.name),o=e.id==="."?K(e.cwd??process.cwd(),t.home).id:e.id,n=_(t.database),a;try{a=n.renameProject(o,r)}finally{n.close()}return a.found&&a.previous&&a.project&&await h({home:t.home,type:"project_renamed",details:{id:o,old_name:a.previous.display_name,new_name:r}}),{found:a.found,id:o,old_name:a.previous?.display_name??null,new_name:r,project:a.project}}async function Hs(e){let t=f(e.home),r=e.includeMemories===!0,o=e.apply===!0,n=e.confirm??null,a=!r||o&&n===e.id,s=_(t.database);try{let i=s.getProject(e.id);if(!i)return Mn({found:!1,id:e.id,mode:r?"forget_memories":"archive",applied:!1,guardOk:a,confirm:n,previousStatus:null,statusAfter:null,memoriesAffected:0,project:null,warning:"project_not_found"});if(r&&!a)return Mn({found:!0,id:e.id,mode:"forget_memories",applied:!1,guardOk:a,confirm:n,previousStatus:i.status,statusAfter:i.status,memoriesAffected:s.countProjectMemories(e.id),project:i,warning:"requires --apply --confirm <id>"});if(r)try{let c=s.forgetProjectMemories(e.id,Nn);return c.found&&c.project&&await h({home:t.home,type:"project_forgotten",details:{id:e.id,memories_affected:c.memories_affected}}),Mn({found:c.found,id:e.id,mode:"forget_memories",applied:c.found,guardOk:a,confirm:n,previousStatus:c.previous?.status??null,statusAfter:c.project?.status??null,memoriesAffected:c.memories_affected,project:c.project,warning:c.found?null:"project_not_found"})}catch(c){throw c instanceof ar&&await h({home:t.home,type:"memory_transition_blocked",result:"blocked",details:{id:c.id,from:c.from,to:c.to,code:c.code,project:e.id}}),c}let l=s.archiveProject(e.id);return l.found&&l.project&&await h({home:t.home,type:"project_archived",details:{id:e.id}}),Mn({found:l.found,id:e.id,mode:"archive",applied:l.found,guardOk:a,confirm:n,previousStatus:l.previous?.status??null,statusAfter:l.project?.status??null,memoriesAffected:0,project:l.project,warning:l.found?null:"project_not_found"})}finally{s.close()}}async function $s(e){let t=f(e.home),r=_(t.database),o;try{o=r.reactivateProject(e.id)}finally{r.close()}return o.found&&o.project&&await h({home:t.home,type:"project_reactivated",details:{id:e.id}}),{found:o.found,id:e.id,previous_status:o.previous?.status??null,status_after:o.project?.status??null,project:o.project}}async function Fs(e={}){return{aliases:ws(f(e.home).home)}}async function Us(e){let t=f(e.home),r=await Rs({home:t.home,action:"add",aliasKey:Mu(e.alias),projectId:s_(e.id),apply:e.apply});return r.applied&&r.changed&&await h({home:t.home,type:"project_alias_set",details:{alias_key:r.alias_key,project_id:r.project_id,previous_project_id:r.previous_id}}),r}async function Bs(e){let t=f(e.home),r=await Rs({home:t.home,action:"remove",aliasKey:Mu(e.alias),apply:e.apply});return r.applied&&r.changed&&await h({home:t.home,type:"project_alias_removed",details:{alias_key:r.alias_key,previous_project_id:r.previous_id}}),r}function Ou(e){return e.remote??e.git_root??e.cwd}function r_(e,t){let r=K(e,t);return{id:r.id,source:r.source,cwd:r.cwd,git_root:r.git_root,remote:r.remote,base_id:r.base_id,alias_key:r.alias_key,marker_path:r.marker_path}}function o_(e){return{id:e,source:"explicit",cwd:null,git_root:null,remote:null,base_id:null,alias_key:null,marker_path:null}}function Nu(e,t,r){return{registry_available:!1,requested:e,effective_id:t.id,registry:null,live_resolution:t,counts:null,derived_last_seen_at:null,continuity_gap:!1,warning:r}}function n_(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),500)}function a_(e){let t=e.trim();if(t.length===0)throw new Error("project rename requires a non-empty --name");return t.slice(0,160)}function Mu(e){let t=e.trim();if(t.length===0)throw new Error("project alias requires a non-empty alias");return t}function s_(e){let t=e.trim();if(t.length===0||t===".")throw new Error("project alias add requires an explicit project id");return t}function Mn(e){return{found:e.found,id:e.id,mode:e.mode,applied:e.applied,dry_run:!e.applied,guard_ok:e.guardOk,required_confirm:e.mode==="forget_memories"?e.id:null,confirm:e.confirm,previous_status:e.previousStatus,status_after:e.statusAfter,memories_affected:e.memoriesAffected,project:e.project,warning:e.warning}}function i_(e){return(e instanceof Error?e.message:String(e)).replace(/[^a-zA-Z0-9_.:-]+/g,"_").slice(0,120)}var l_=/^-\s*\*\*([^:*]+):\*\*\s*(.*)$/u;function $t(e,t){let r=c_(e,t);if(r)return r;let o=e.split(/\r?\n/u);for(let n=0;n<o.length;n+=1){let s=(o[n]?.trim()??"").match(l_);if(!s||s[1]?.trim()!==t)continue;let i=s[2]?.trim()??"";if(i.length>0&&!i.startsWith("_("))return i;for(let l=n+1;l<o.length;l+=1){let c=o[l]?.trim()??"";if(!c||c.startsWith("#")||c.startsWith("- **"))break;if(!c.startsWith("_("))return c}}return null}function Lu(e,t=200){let r=e.split(/\r?\n/u).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#")&&!o.startsWith("---")&&!o.startsWith("_")).join(" ").replace(/\s+/g," ").trim();return r.length<=t?r:`${r.slice(0,t-3)}...`}function Du(e,t=1600){let r=e.split(/\r?\n/u).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("---")&&!o.startsWith("_")).map(o=>o.replace(/^#+\s*/u,"").replace(/^-\s*/u,"")).join(" ").replace(/\s+/g," ").trim();return r.length<=t?r:`${r.slice(0,t-3)}...`}function c_(e,t){let r=`${t}:`,o=e.split(/\r?\n/u).map(n=>n.trim()).find(n=>n.startsWith(r));return o?o.slice(r.length).trim():null}import{copyFile as b_,mkdir as $u,readFile as v_,rename as k_,stat as w_,writeFile as R_}from"node:fs/promises";import{existsSync as Fu}from"node:fs";import Ft from"node:path";import{mkdir as d_,readFile as u_,rename as p_,writeFile as m_}from"node:fs/promises";import po from"node:path";var g_=1440*60*1e3;async function Me(e){let t=f(e.home),r=await Vs(t.home),o={host:e.host,outcome:e.outcome,tier:e.tier,cwd:e.cwd?po.resolve(e.cwd):null,project:e.project??null,tokens_used:e.tokensUsed??null,tokens_max:e.tokensMax??null,source:e.source??"nativesoul",warnings:(e.warnings??[]).map(n=>N(n).value),error:__(e.error),recorded_at:e.recordedAt??new Date().toISOString()};return r.hosts[e.host]=o,await h_(t.home,r),await h({home:t.home,type:y_(e.outcome),result:e.outcome==="failed"?"error":"ok",details:o}),o}async function Vs(e){let t=f(e),r=Js(t.home);if(!await A(r))return f_();let o=JSON.parse(await u_(r,"utf8"));return{schema:1,hosts:typeof o.hosts=="object"&&o.hosts!==null?o.hosts:{}}}async function Ws(e){let t=f(e.home),o=(await Vs(t.home)).hosts[e.host]??null,n=(e.now??new Date).getTime(),a=o?Date.parse(o.recorded_at):Number.NaN,s=Number.isFinite(a)?Math.max(n-a,0):null;return{state_path:Js(t.home),last:o,age_ms:s,age_hours:s===null?null:Math.round(s/(3600*1e3)*10)/10,stale:s!==null&&s>g_}}function f_(){return{schema:1,hosts:{}}}async function h_(e,t){let r=Js(e);await d_(po.dirname(r),{recursive:!0,mode:448});let o=po.join(po.dirname(r),`.last-handshake-${T("tmp")}.tmp`);await m_(o,`${JSON.stringify(t,null,2)}
|
|
907
907
|
`,{encoding:"utf8",mode:384}),await p_(o,r)}function Js(e){return po.join(e,"state","last-handshake.json")}function y_(e){return`handshake_${e}`}function __(e){if(e==null)return null;let t=e instanceof Error?e.message:String(e);return N(t).value.slice(0,500)}var Hu=8;function gr(e){let t=e.generatedAt??new Date().toISOString(),r=e.degraded===!0,o=[...e.payload.warnings,...e.warnings??[]],n=e.payload.capabilities.slice(0,Hu),a=e.payload.capability_cards.slice(0,Hu),s=["---","nativesoul: bootstrap-context",`bootstrap_schema: ${e.payload.bootstrap_schema}`,`host: ${e.host}`,`generated_at: ${t}`,`degraded: ${r?"true":"false"}`,`tokens_used: ${e.payload.context_budget.tokens_used}`,`tokens_max: ${e.payload.context_budget.tokens_max}`,o.length>0?`warnings: ${o.join(", ")}`:"warnings: none","---","",`You are ${e.payload.identity.name}; follow soul_summary and agents_operating_summary.`,`Global entity: ${e.payload.identity.name}. Project rules apply for code boundaries; persona remains ${e.payload.identity.name}.`,"","## Identity",`- Name: ${e.payload.identity.name}`,`- Mission: ${e.payload.identity.mission}`,e.payload.identity.role?`- Role: ${e.payload.identity.role}`:null,e.payload.identity.vibe?`- Vibe: ${e.payload.identity.vibe}`:null,"","## Soul Summary",e.payload.soul_summary,"","## Operating Summary",e.payload.agents_operating_summary,"","## User Preferences",e.payload.user.preferences_summary,"","## Project",`- ID: ${e.payload.project.id}`,`- CWD: ${e.payload.project.cwd}`,"","## Tool Hints",...e.payload.tool_hints.map(i=>`- ${i.tool}: ${i.use_when}`),"","## Relevant Memories",...e.payload.relevant_memories.length>0?e.payload.relevant_memories.map(i=>`- ${i.id}: ${i.summary}`):["- none"],"","## Commitments",...e.payload.commitments.length>0?e.payload.commitments.map(i=>`- ${JSON.stringify(i)}`):["- none"],"","## Capabilities",...n.length>0?n.map(i=>`- ${i.uid} (${i.host}, ready=${i.ready}): ${i.source}`):["- none"],"","## Capability Cards",...a.length>0?a.map(i=>`- ${i.uid} (${i.host}, ready=${i.ready}): ${i.use_when[0]??i.source}`):["- none"],""].filter(i=>i!==null).join(`
|
|
908
|
-
`);return{host:e.host,generated_at:t,degraded:r,warnings:o,tokens_used:Ks(s),tokens_max:e.payload.context_budget.tokens_max,content:s}}async function Ln(e){let t=f(e.home),r=gr({host:e.host,payload:e.payload}),o=Gs(t.home,e.host),n=Fu(o)&&e.apply!==!1?await A_(t.home,e.host,o):null;if(e.apply!==!1){await $u(Ft.dirname(o),{recursive:!0,mode:448});let s=Ft.join(Ft.dirname(o),`.last-context-${T("tmp")}.tmp`);await
|
|
909
|
-
`),d={host:e.host,generated_at:i,degraded:!0,warnings:l,tokens_used:Ks(c),tokens_max:1900,content:c,targetPath:r,stale:s};if(e.recordTelemetry!==!1){await h({home:t.home,type:"bootstrap_context_cache_read",details:{...d,content:"[omitted]"}});let p=E_(o);await Me({home:t.home,host:e.host,outcome:"degraded",tier:"D",cwd:p.cwd,project:p.project,tokensUsed:d.tokens_used,tokensMax:d.tokens_max,source:"bootstrap-cache",warnings:l})}return d}async function qs(e){let t=await mr({home:e.home,host:e.host,ttlDays:e.ttlDays,recordTelemetry:e.recordTelemetry});if(!t.warnings.includes("BOOTSTRAP_CACHE_MISSING")||!e.projectCwd)return t;let r=await mr({home:mo(e.projectCwd),host:e.host,ttlDays:e.ttlDays,recordTelemetry:!1});return r.warnings.includes("BOOTSTRAP_CACHE_MISSING")?t:r}function Gs(e,t){return Ft.join(e,"generated",t,"last-context.md")}function mo(e){return Ft.join(e,".nativesoul-cache")}async function
|
|
910
|
-
`),n={host:e.host,generated_at:t,degraded:!0,warnings:r,tokens_used:Ks(o),tokens_max:1900,content:o,targetPath:e.targetPath,stale:!1};return e.recordTelemetry!==!1&&(await h({home:e.home,type:"bootstrap_context_cache_missing",details:{...n,content:"[omitted]"}}),await Me({home:e.home,host:e.host,outcome:"degraded",tier:"D",cwd:null,project:null,tokensUsed:n.tokens_used,tokensMax:n.tokens_max,source:"bootstrap-cache",warnings:r})),n}async function A_(e,t,r){let o=Ft.join(e,"backups","bootstrap-context");await $u(o,{recursive:!0,mode:448});let n=Ft.join(o,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-${t}-last-context.md`);return await b_(r,n),n}function Ks(e){return Math.ceil(e.length/4)}function E_(e){let t=e.match(/^- CWD:\s*(.+)$/mu)?.[1]?.trim()??null,r=e.match(/^- ID:\s*(.+)$/mu)?.[1]?.trim()??null;return{cwd:t,project:r}}var Uu=3e3,Bu=new WeakMap;async function pt(e){let t=e.readOnly?f(e.home):await v(e.home),r=await T_(t.home),o=Math.min(Math.max(e.tokensMax??r.defaultTokens,1),Uu),n=[];e.readOnly!==!0&&await to({cwd:e.cwd,home:t.home});let a=K(e.cwd,t.home),s=a.id;if(e.readOnly!==!0){let V=await uo({home:t.home,resolution:a});V.warning&&n.push(V.warning)}let i=C_({explicitQuery:e.query,project:s,host:e.host,cwd:e.cwd,seed:r.memoryQuerySeed}),l=await x_({database:t.database,readOnly:e.readOnly===!0,memoryQuery:i,project:s,limit:r.recallLimit,warnings:n}),c=l.memories,d=await Ee({home:t.home,host:e.host,readyOnly:!0,limit:8,readOnly:e.readOnly}),p=await M_(t.home,e.host,e.readOnly===!0),g=await hs({home:t.home,host:e.host,query:e.query??`${Le.basename(e.cwd)} ${e.host}`,limit:8,readOnly:e.readOnly}),y=await Zr({home:t.home,project:s,status:"open",limit:8,readOnly:e.readOnly}),k=await ce(t.home,"IDENTITY.md"),
|
|
908
|
+
`);return{host:e.host,generated_at:t,degraded:r,warnings:o,tokens_used:Ks(s),tokens_max:e.payload.context_budget.tokens_max,content:s}}async function Ln(e){let t=f(e.home),r=gr({host:e.host,payload:e.payload}),o=Gs(t.home,e.host),n=Fu(o)&&e.apply!==!1?await A_(t.home,e.host,o):null;if(e.apply!==!1){await $u(Ft.dirname(o),{recursive:!0,mode:448});let s=Ft.join(Ft.dirname(o),`.last-context-${T("tmp")}.tmp`);await R_(s,r.content,{encoding:"utf8",mode:384}),await k_(s,o)}let a={...r,targetPath:o,backupPath:n,applied:e.apply!==!1};return e.recordTelemetry!==!1&&await h({home:t.home,type:e.apply===!1?"bootstrap_context_cache_dry_run":"bootstrap_context_cache_written",details:{...a,content:"[omitted]"}}),e.apply!==!1&&e.recordTelemetry!==!1&&await Me({home:t.home,host:e.host,outcome:"succeeded",tier:"A",cwd:e.payload.project.cwd,project:e.payload.project.id,tokensUsed:r.tokens_used,tokensMax:r.tokens_max,source:"bootstrap-inject",warnings:r.warnings}),a}async function mr(e){let t=f(e.home),r=Gs(t.home,e.host);if(!Fu(r))return S_({home:t.home,host:e.host,targetPath:r,recordTelemetry:e.recordTelemetry});let o=await v_(r,"utf8"),n=await w_(r),a=e.ttlDays??7,s=Date.now()-n.mtimeMs>a*24*60*60*1e3,i=new Date().toISOString(),l=s?["BOOTSTRAP_CACHE_STALE"]:[],c=["---","nativesoul: bootstrap-context-cache",`host: ${e.host}`,`generated_at: ${i}`,"degraded: true",l.length>0?`warnings: ${l.join(", ")}`:"warnings: none","---","",o].join(`
|
|
909
|
+
`),d={host:e.host,generated_at:i,degraded:!0,warnings:l,tokens_used:Ks(c),tokens_max:1900,content:c,targetPath:r,stale:s};if(e.recordTelemetry!==!1){await h({home:t.home,type:"bootstrap_context_cache_read",details:{...d,content:"[omitted]"}});let p=E_(o);await Me({home:t.home,host:e.host,outcome:"degraded",tier:"D",cwd:p.cwd,project:p.project,tokensUsed:d.tokens_used,tokensMax:d.tokens_max,source:"bootstrap-cache",warnings:l})}return d}async function qs(e){let t=await mr({home:e.home,host:e.host,ttlDays:e.ttlDays,recordTelemetry:e.recordTelemetry});if(!t.warnings.includes("BOOTSTRAP_CACHE_MISSING")||!e.projectCwd)return t;let r=await mr({home:mo(e.projectCwd),host:e.host,ttlDays:e.ttlDays,recordTelemetry:!1});return r.warnings.includes("BOOTSTRAP_CACHE_MISSING")?t:r}function Gs(e,t){return Ft.join(e,"generated",t,"last-context.md")}function mo(e){return Ft.join(e,".nativesoul-cache")}async function S_(e){let t=new Date().toISOString(),r=["BOOTSTRAP_CACHE_MISSING"],o=["---","nativesoul: bootstrap-context-cache",`host: ${e.host}`,`generated_at: ${t}`,"degraded: true",`warnings: ${r.join(", ")}`,"---","","Bootstrap context cache is not available. Run `nativesoul bootstrap --format inject` after install."].join(`
|
|
910
|
+
`),n={host:e.host,generated_at:t,degraded:!0,warnings:r,tokens_used:Ks(o),tokens_max:1900,content:o,targetPath:e.targetPath,stale:!1};return e.recordTelemetry!==!1&&(await h({home:e.home,type:"bootstrap_context_cache_missing",details:{...n,content:"[omitted]"}}),await Me({home:e.home,host:e.host,outcome:"degraded",tier:"D",cwd:null,project:null,tokensUsed:n.tokens_used,tokensMax:n.tokens_max,source:"bootstrap-cache",warnings:r})),n}async function A_(e,t,r){let o=Ft.join(e,"backups","bootstrap-context");await $u(o,{recursive:!0,mode:448});let n=Ft.join(o,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-${t}-last-context.md`);return await b_(r,n),n}function Ks(e){return Math.ceil(e.length/4)}function E_(e){let t=e.match(/^- CWD:\s*(.+)$/mu)?.[1]?.trim()??null,r=e.match(/^- ID:\s*(.+)$/mu)?.[1]?.trim()??null;return{cwd:t,project:r}}var Uu=3e3,Bu=new WeakMap;async function pt(e){let t=e.readOnly?f(e.home):await v(e.home),r=await T_(t.home),o=Math.min(Math.max(e.tokensMax??r.defaultTokens,1),Uu),n=[];e.readOnly!==!0&&await to({cwd:e.cwd,home:t.home});let a=K(e.cwd,t.home),s=a.id;if(e.readOnly!==!0){let V=await uo({home:t.home,resolution:a});V.warning&&n.push(V.warning)}let i=C_({explicitQuery:e.query,project:s,host:e.host,cwd:e.cwd,seed:r.memoryQuerySeed}),l=await x_({database:t.database,readOnly:e.readOnly===!0,memoryQuery:i,project:s,limit:r.recallLimit,warnings:n}),c=l.memories,d=await Ee({home:t.home,host:e.host,readyOnly:!0,limit:8,readOnly:e.readOnly}),p=await M_(t.home,e.host,e.readOnly===!0),g=await hs({home:t.home,host:e.host,query:e.query??`${Le.basename(e.cwd)} ${e.host}`,limit:8,readOnly:e.readOnly}),y=await Zr({home:t.home,project:s,status:"open",limit:8,readOnly:e.readOnly}),k=await ce(t.home,"IDENTITY.md"),R=await ce(t.home,"SOUL.md"),U=await ce(t.home,"AGENTS.md"),ae=await ce(t.home,"USER.md"),ve=await ce(t.home,"BOOTSTRAP.md"),ke=new Date().toISOString().slice(0,10),nt=Le.join(t.home,"memory","daily",`${ke}.md`);n.push(...p?[]:[`HOST_ADAPTER_UNAVAILABLE:${e.host}`,"CAPABILITY_REFRESH_STALE"],...g.warnings),!await A(Le.join(t.home,"state","onboarding.complete"))&&ve.trim().length>0&&n.push("BOOTSTRAP_RITUAL_PENDING"),await A(nt)&&n.push(`DAILY_MEMORY_AVAILABLE:${nt}`),r.warnEmptyMemories&&c.length===0&&n.push("PROJECT_MEMORY_EMPTY");let S={bootstrap_schema:2,identity:{name:$t(k,"Name")??"NativeSoul",mission:$t(k,"Mission")??"Provide local continuity across native coding-agent hosts.",creature:$t(k,"Creature"),role:$t(k,"Role"),vibe:$t(k,"Vibe"),emoji:$t(k,"Emoji")},soul_summary:Lu(R||"Continuity, clarity, and safe local-first operation.",500),agents_operating_summary:Du(U||"Load NativeSoul context before continuity-sensitive work. Use MCP when available and CLI fallback when needed."),tool_hints:O_(),user:{preferences_summary:N_(ae)},project:{id:s,cwd:Le.resolve(e.cwd),state:"local-bootstrap"},commitments:y.map(V=>({id:V.id,status:V.status,summary:V.summary,due_at:V.due_at,ttl_expires_at:V.ttl_expires_at})),relevant_memories:c.map(V=>({id:V.id,summary:V.summary,scope:V.scope})),capabilities:d.map(V=>({uid:V.uid,host:V.host,ready:V.ready,source:V.source})),capability_cards:g.cards,policy:{mode:"safe",approval_required:["external_write","destructive","identity_policy_change"]},warnings:n},St=L_(S,o),rn=lo(JSON.stringify(St)),Lr={...St,context_budget:{tokens_used:rn,tokens_max:o}};return Bu.set(Lr,{files:j_({home:t.home,identityText:k,soulText:R,agentsText:U,userText:ae,bootstrapText:ve,payload:Lr}),memoryRecall:{query:i,limit:r.recallLimit,returned:c.length,mode:l.mode},cache:Vu(t.home,e.host)}),e.readOnly||await h({home:t.home,type:"bootstrap_created",details:{host:e.host,cwd:Le.resolve(e.cwd),project:s,tokens:rn}}),Lr}async function x_(e){if(!await A(e.database))return e.warnings.push("BOOTSTRAP_DATABASE_MISSING"),{memories:[],mode:"disabled"};let t=null;try{t=_(e.database,{readOnly:e.readOnly});let r=io({database:e.database,query:e.memoryQuery,project:e.project,limit:e.limit,readOnly:e.readOnly});return{memories:r.memories.length===0?t.recentMemories(e.project,e.limit):r.memories,mode:r.mode}}catch(r){return e.warnings.push(`BOOTSTRAP_DATABASE_UNAVAILABLE:${I_(r)}`),{memories:[],mode:"disabled"}}finally{t?.close()}}async function Xs(e){let t=await pt({home:e.home,host:e.host,cwd:e.cwd,query:e.query,tokensMax:e.tokensMax,readOnly:!0}),r=gr({host:e.host,payload:t,generatedAt:e.generatedAt}),o=Bu.get(t)??{files:[],memoryRecall:{limit:0,returned:t.relevant_memories.length,mode:"disabled"},cache:Vu(e.home??"",e.host)};return{host:e.host,cwd:Le.resolve(e.cwd),project:t.project,files:o.files,memoryRecall:o.memoryRecall,budget:{unit:"tokens",softMax:t.context_budget.tokens_max,hardMax:Uu,used:r.tokens_used},warnings:r.warnings,cache:o.cache,degraded:r.degraded}}function j_(e){return[go({home:e.home,relativePath:"IDENTITY.md",role:"identity",rawText:e.identityText,injectedText:Object.values(e.payload.identity).filter(t=>typeof t=="string").join(`
|
|
911
911
|
`),fallbackReason:"missing; default identity fields injected"}),go({home:e.home,relativePath:"SOUL.md",role:"soul_summary",rawText:e.soulText,injectedText:e.payload.soul_summary,fallbackReason:"missing; default soul summary injected"}),go({home:e.home,relativePath:"AGENTS.md",role:"agents_operating_summary",rawText:e.agentsText,injectedText:e.payload.agents_operating_summary,fallbackReason:"missing; default agent operating summary injected"}),go({home:e.home,relativePath:"USER.md",role:"user_preferences",rawText:e.userText,injectedText:e.payload.user.preferences_summary,fallbackReason:"missing; empty user-preferences fallback injected"}),go({home:e.home,relativePath:"BOOTSTRAP.md",role:"onboarding_bootstrap",rawText:e.bootstrapText,injectedText:"",fallbackReason:"missing; no onboarding bootstrap warning",presentReason:"omitted; used only to emit BOOTSTRAP_RITUAL_PENDING"})]}function go(e){let t=e.rawText.length,r=e.injectedText.length,o=t>0,n=r>0,a=o?e.presentReason??(r<t?"included; summarized to fit budget":"included"):e.fallbackReason;return{path:Le.join(e.home,e.relativePath),role:e.role,included:n,reason:a,rawChars:t,injectedChars:r,truncated:o&&n&&r<t,hash:o?E(e.rawText):null}}function Vu(e,t){let r=Le.join(e,"generated",t,"last-context.md");return{hit:P_(r),key:r}}function I_(e){return(e instanceof Error?e.message:String(e)).replace(/[^a-zA-Z0-9_.:-]+/g,"_").slice(0,120)}async function T_(e){let t=await ce(e,"config.yaml"),r=t.match(/^\s*default_tokens:\s*(\d+)\s*$/mu),o=t.match(/^\s*(?:bootstrap_recall_limit|recall_limit):\s*(\d+)\s*$/mu),n=t.match(/^\s*memory_query_seed:\s*["']?(.+?)["']?\s*$/mu),a=t.match(/^\s*warn_empty_memories:\s*(true|false)\s*$/imu),s=r?.[1]?Number(r[1]):1900,i=o?.[1]?Number(o[1]):5;return{defaultTokens:Number.isFinite(s)?s:1900,recallLimit:Number.isFinite(i)?Math.min(Math.max(i,1),8):5,memoryQuerySeed:n?.[1]?.trim()||null,warnEmptyMemories:a?.[1]?.toLowerCase()==="true"}}function C_(e){return[e.explicitQuery,e.project,e.host,Le.basename(Le.resolve(e.cwd)),e.seed].filter(t=>typeof t=="string"&&t.trim().length>0).join(" ")}function O_(){return[{tool:"life_bootstrap",use_when:"Start a new session or refresh NativeSoul identity, project context, memories, and capability cards."},{tool:"life_recall",use_when:"Search local memories for project-specific continuity before making assumptions."},{tool:"life_remember_propose",use_when:"Propose durable memory from user-approved facts, outcomes, or preferences."},{tool:"life_onboarding_status",use_when:"Check whether onboarding is pending before drafting or applying identity files."}]}function N_(e){let t=e.trim();return t.length===0?"No curated user preferences yet.":t.length<=160?t:`${t.slice(0,157)}...`}async function M_(e,t,r=!1){let o=await Ee({home:e,host:t,includeShared:!1,limit:20,readOnly:r});if(t==="codex"&&!o.some(i=>i.source.startsWith("codex app server ")))return!1;let n=o[0]?.last_seen_at;if(!n)return!1;let a=Date.parse(n);if(!Number.isFinite(a))return!1;let s=1440*60*1e3;return Date.now()-a<=s}function L_(e,t){let r=[e,ut(e,1200,420,150),ut(e,900,320,130),ut(e,650,240,110),ut(e,420,180,90),ut(e,240,120,80),zs(ut(e,240,120,80),8,8),zs(ut(e,240,120,80),5,5),zs(ut(e,240,120,80),3,3)];return r.find(o=>lo(JSON.stringify(o))<=t)??r[r.length-1]??e}function zs(e,t,r){return{...e,capabilities:e.capabilities.slice(0,t),capability_cards:e.capability_cards.slice(0,r),relevant_memories:e.relevant_memories.slice(0,t),commitments:e.commitments.slice(0,t)}}function ut(e,t,r,o){return{...e,soul_summary:Cn(e.soul_summary,r),agents_operating_summary:Cn(e.agents_operating_summary,t),user:{...e.user,preferences_summary:Cn(e.user.preferences_summary,o)}}}import{existsSync as vi}from"node:fs";import Tp from"node:path";function Ys(e){let t={bootstrap:D_(e),mcp:H_(e),plugins_hooks:$_(e),heartbeat:F_(e),recall_auto_trigger:U_(e),memory_candidate_hooks:B_(e),memory_promotion_policy:V_(e),cross_host_verification:W_(e)},r=Object.values(t),o=J_(r),n=r.flatMap(s=>s.plan_actions),a=q_(e.profile,o,r);return{schema_version:1,home:e.home,target_root:e.targetRoot,host:e.host,profile:e.profile,overall_status:o,components:t,plan:n,summary:a}}function Wu(e){return Ys(e).summary}function D_(e){return e.onboardingComplete&&e.activationComplete&&e.profile?$("bootstrap","active","Identity onboarding and activation marker are present.",{onboarding_complete:!0,activation_complete:!0}):$("bootstrap",e.onboardingComplete?"approval_required":"not_configured",e.onboardingComplete?"Activation profile still needs explicit approval.":"Identity onboarding is not complete.",{onboarding_complete:e.onboardingComplete,activation_complete:e.activationComplete},[Ut("activation-profile","bootstrap","approval_required","Write activation profile and completion marker.",`${e.home}/state/activation-profile.json`,!0,"17.1 activation apply is explicit-approval only.")])}function H_(e){let t=e.hosts.filter(r=>r.mcp_registration.configured);if(t.length>0){let r=t.some(o=>o.mcp_registration.issues.length>0);return $("mcp",r?"degraded":"active",r?"MCP is configured but doctor reported warnings.":"MCP registration is configured.",{configured_hosts:t.map(_e),checked_hosts:e.hosts.map(_e)})}return $("mcp","not_configured","No MCP registration was detected for the selected host scope.",{checked_hosts:e.hosts.map(_e)},[Ut("mcp-registration","mcp","not_configured","Install MCP registration for selected hosts.",`nativesoul mcp install --host ${e.host} --apply`,!0,"MCP registration changes host config files.")])}function $_(e){let t=e.hosts.filter(o=>o.plugin.enabled||o.plugin.hook_registered);if(t.length>0){let o=t.some(n=>n.provider_parity.hooks==="official-fallback");return $("plugins_hooks",o?"degraded":"active",o?"Plugin/hooks are available through fallback support.":"Native plugin or hook support is active.",{enabled_hosts:t.map(_e),hook_modes:Object.fromEntries(e.hosts.map(n=>[_e(n),n.provider_parity.hooks]))})}let r=e.hosts.length>0&&e.hosts.every(o=>o.plugin.package_kind==="unsupported-native");return $("plugins_hooks",r?"blocked_by_host":"not_configured",r?"Selected hosts do not expose a native plugin path.":"No plugin or hook registration was detected.",{checked_hosts:e.hosts.map(_e)},[Ut("plugin-install","plugins_hooks",r?"blocked_by_host":"not_configured","Install NativeSoul plugin/hook package where the host supports it.",`nativesoul install --host ${e.host} --apply`,!0,"Host plugin/hook setup modifies host-specific config.")])}function F_(e){if(!e.profile||!e.profile.heartbeat_enabled)return $("heartbeat","not_configured","Heartbeat is not enabled in the activation profile.",{profile_present:e.profile!==null});let t=e.hosts.filter(r=>r.full_native_evidence.blocked_by_host);return t.length>0?$("heartbeat","blocked_by_host","At least one selected host lacks native scheduler support.",{blocked_hosts:t.map(_e),heartbeat_modes:Object.fromEntries(e.hosts.map(r=>[_e(r),r.provider_parity.heartbeat]))},[Ut("heartbeat-scheduler","heartbeat","blocked_by_host","Choose a native scheduler-capable host or keep external fallback explicit.",`nativesoul schedule reconcile --host ${e.host} --mode leader --apply`,!0,"Scheduler writes must remain explicit and host-aware.")]):e.hosts.some(r=>r.provider_parity.heartbeat==="native")?$("heartbeat","active","Heartbeat has native scheduler support in the selected scope.",{native_hosts:e.hosts.filter(r=>r.provider_parity.heartbeat==="native").map(_e)}):e.hosts.some(r=>r.provider_parity.heartbeat==="official-fallback")?$("heartbeat","degraded","Heartbeat is available only through fallback scheduling in the selected scope.",{fallback_hosts:e.hosts.filter(r=>r.provider_parity.heartbeat==="official-fallback").map(_e)}):$("heartbeat","approval_required","Heartbeat profile is enabled, but no scheduler desired state is active yet.",{checked_hosts:e.hosts.map(_e)},[Ut("heartbeat-enable","heartbeat","approval_required","Create/reconcile recurring heartbeat schedule.",`nativesoul schedule reconcile --host ${e.host} --mode leader --apply`,!0,"Recurring automation requires explicit approval.")])}function U_(e){return e.profile?e.profile.recall_auto_trigger?$("recall_auto_trigger","active","Automatic recall trigger is enabled in the activation profile.",{keywords:e.profile.recall_auto_trigger_keywords,denylist:e.profile.recall_auto_trigger_denylist,auto_promotion_threshold:e.profile.candidate_auto_promotion_threshold}):$("recall_auto_trigger","approval_required","Automatic recall trigger is intentionally disabled until explicit approval.",{recall_auto_trigger:!1},[Ut("recall-auto-trigger","recall_auto_trigger","approval_required","Set recall_auto_trigger=true in activation profile.","state/activation-profile.json:recall_auto_trigger",!0,"Prompt injection into host sessions must be explicitly approved.")]):$("recall_auto_trigger","not_configured","No activation profile is present.",{})}function B_(e){if(!e.profile||!e.profile.memory_candidates)return $("memory_candidate_hooks","not_configured","Memory candidate hooks are not enabled in the activation profile.",{});let t=e.hosts.every(r=>r.provider_parity.hooks==="unsupported-native");return $("memory_candidate_hooks",t?"degraded":"active",t?"Memory candidates are enabled, but hooks are not native on every selected host.":"Memory candidate capture is enabled with candidate-only policy.",{memory_candidate_policy:e.profile.memory_candidate_policy,hook_modes:Object.fromEntries(e.hosts.map(r=>[_e(r),r.provider_parity.hooks]))})}function V_(e){return e.profile?e.profile.auto_promotion?$("memory_promotion_policy","active","Automatic promotion is enabled by activation policy.",{promotion_policy:e.profile.promotion_policy,candidate_auto_promotion_threshold:e.profile.candidate_auto_promotion_threshold,sensitive_auto_promotion_allowed:!1}):$("memory_promotion_policy","approval_required","Memory promotion requires explicit approval.",{auto_promotion:!1,promotion_policy:e.profile.promotion_policy}):$("memory_promotion_policy","not_configured","No activation profile is present.",{})}function W_(e){let t=new Set(e.hosts.map(o=>o.host)).size,r=e.hosts.reduce((o,n)=>o+n.cross_host_inventory_summary.ready_other_hosts,0);return t>1&&e.hosts.every(o=>o.status==="ready")?$("cross_host_verification","active","Multiple selected hosts were verified by deep doctor.",{host_count:t,ready_other_hosts:r}):$("cross_host_verification",r>0?"degraded":"approval_required","Cross-host verification needs an all-host deep doctor pass before full activation claims.",{host_count:t,ready_other_hosts:r},[Ut("cross-host-verify","cross_host_verification","approval_required","Run all-host deep verification.","nativesoul doctor --deep --all-hosts --json",!1,"Verification is read-only but must be run against every host.")])}function $(e,t,r,o,n=[]){return{key:e,status:t,summary:r,evidence:o,plan_actions:n}}function Ut(e,t,r,o,n,a,s){return{id:e,component:t,status:r,action:o,target:n,dry_run:!0,requires_user_confirmed:a,reason:s}}function J_(e){let t=e.map(r=>r.status);return t.includes("blocked_by_host")?"blocked_by_host":t.includes("degraded")?"degraded":t.includes("approval_required")?"approval_required":t.includes("not_configured")?"not_configured":"active"}function q_(e,t,r){return{overall_status:t,profile:e?.profile??null,active:fo(r,"active"),not_configured:fo(r,"not_configured"),approval_required:fo(r,"approval_required"),blocked_by_host:fo(r,"blocked_by_host"),degraded:fo(r,"degraded"),full_native_claimed:!1}}function fo(e,t){return e.filter(r=>r.status===t).length}function _e(e){return e.surface==="default"?e.host:`${e.host}:${e.surface}`}import{existsSync as G_}from"node:fs";import K_ from"node:path";async function ho(e){let t=f(e),r=[],o=["AGENTS.md","SOUL.md","IDENTITY.md","USER.md","POLICY.md","MEMORY.md","HEARTBEAT.md","config.yaml"];for(let a of o)await A(K_.join(t.home,a))||r.push({code:"MISSING_HUMAN_FILE",severity:"warn",message:`${a} is missing`,remediation:"Run nativesoul init"});if(!G_(t.database))return r.push({code:"MISSING_DATABASE",severity:"error",message:"SQLite state database is missing",remediation:"Run nativesoul init"}),{home:t.home,healthy:!1,integrity:"missing",issues:r};let n=(()=>{let a=_(t.database,{readOnly:!0});try{return a.integrityCheck()}finally{a.close()}})();n!=="ok"&&r.push({code:"SQLITE_INTEGRITY",severity:"error",message:`SQLite integrity check returned ${n}`,remediation:"Restore from backup or rebuild the workspace"}),r.push(...z_(t.home,t.database));try{await h({home:t.home,type:"doctor_completed",details:{integrity:n,issueCount:r.length}})}catch{}return{home:t.home,healthy:r.every(a=>a.severity!=="error"),integrity:n,issues:r}}function z_(e,t){let r=K(process.cwd(),e),o=_(t,{readOnly:!0});try{let n=new Set(o.listMemories({limit:200,includeForgotten:!0}).map(a=>a.scope.project).filter(a=>a!==r.id));return n.size===0?[]:[{code:"PROJECT_ID_RECONCILE_AVAILABLE",severity:"info",message:`Found ${n.size} memory project id(s) different from normalized current project ${r.id}.`,remediation:"Review with nativesoul memory export --project <old-id>; a future reconcile command will migrate aliases after approval."}]}finally{o.close()}}import Pe from"node:os";import z from"node:path";function Ju(e){switch(e){case"grok":return"Agents.md";case"codex":return"AGENTS.md";case"claude":return"CLAUDE.md";case"antigravity":case"gemini":return"GEMINI.md"}}function qu(e){return e==="claude"?".claude.json":e==="gemini"?"settings.json":e==="antigravity"?"mcp_config.json":"mcp.json"}function yo(e,t){if(t==null||t==="default")return e==="claude"?"claude-code":"default";if(e!=="claude")throw new Error(`--surface ${t} is only supported for --host claude`);return t}function Ke(e,t){return t&&t!=="default"?[yo(e,t)]:e==="claude"?["claude-code","claude-desktop"]:["default"]}function Bt(e,t){return t==="default"?e:t}function Gu(e){switch(e){case"codex":return z.join(Pe.homedir(),".codex","AGENTS.md");case"claude":return z.join(Pe.homedir(),".claude","CLAUDE.md");case"grok":return z.join(Pe.homedir(),".grok","Agents.md");case"antigravity":case"gemini":return z.join(Pe.homedir(),".gemini","GEMINI.md")}}function Dn(e){switch(e){case"codex":return z.join(Pe.homedir(),".codex","mcp.json");case"claude":return z.join(Pe.homedir(),".claude.json");case"grok":return z.join(Pe.homedir(),".grok","mcp.json");case"antigravity":return z.join(Pe.homedir(),".gemini","antigravity-cli","mcp_config.json");case"gemini":return z.join(Pe.homedir(),".gemini","settings.json")}}function Ku(){return zu({platform:process.platform,home:Pe.homedir(),env:process.env})}function zu(e){let t=e.platform==="win32"?z.win32:z.posix;if(e.platform==="darwin")return t.join(e.home,"Library","Application Support","Claude","claude_desktop_config.json");if(e.platform==="win32"){let o=e.env?.APPDATA&&e.env.APPDATA.trim().length>0?e.env.APPDATA:t.join(e.home,"AppData","Roaming");return t.join(o,"Claude","claude_desktop_config.json")}let r=e.env?.XDG_CONFIG_HOME&&e.env.XDG_CONFIG_HOME.trim().length>0?e.env.XDG_CONFIG_HOME:t.join(e.home,".config");return t.join(r,"Claude","claude_desktop_config.json")}function Xu(e,t){if(e!=="claude")return null;if(!t)return z.join(Pe.homedir(),".claude","mcp.json");let r=z.resolve(t),o=z.dirname(r);return z.basename(o)==="claude"?z.join(o,"mcp.json"):z.join(o,".claude","mcp.json")}function Yu(e,t){return t?Eu(e):X_()}function X_(){return{provider_id:"local-hash",model_id:"local-hash-bow-v1",schema_version:1,available:!1,indexable_count:0,indexed_count:0,stale_count:0,healthy:!1,remediation:"Run nativesoul init, then nativesoul memory index"}}function Qu(e){return!e.available||e.stale_count===0?[]:[{code:"SEMANTIC_INDEX_STALE",severity:"warn",message:`${e.stale_count} memory record(s) need semantic indexing.`,remediation:e.remediation??"Run nativesoul memory index"}]}function Zu(e){let t=new Map;for(let o of e){let n=t.get(o.host)??{capability_count:0,ready_capability_count:0};t.set(o.host,{capability_count:n.capability_count+1,ready_capability_count:n.ready_capability_count+(o.ready?1:0)})}let r=Array.from(t.entries()).map(([o,n])=>({host:o,...n}));return{host_count:r.length,capability_count:r.reduce((o,n)=>o+n.capability_count,0),ready_capability_count:r.reduce((o,n)=>o+n.ready_capability_count,0),hosts:r}}function Hn(e){let t=_(e,{readOnly:!0});try{return t.listCapabilities({limit:1e4}).map(r=>({host:r.host,ready:r.ready}))}finally{t.close()}}import{existsSync as pv}from"node:fs";import{readFile as mv,stat as gv}from"node:fs/promises";import jp from"node:path";import yr from"node:path";import{existsSync as ui}from"node:fs";import{cp as Fb,mkdir as Ub,rm as kp}from"node:fs/promises";import Bb from"node:path";import{existsSync as gt}from"node:fs";import{readFile as Gn}from"node:fs/promises";import ze from"node:path";import Y_ from"node:path";function fr(e){return e.split(/[\\/]/u).join("/")}function mt(e,t){return fr(Y_.relative(e,t))}function Vt(e){return fr(e)}import{existsSync as ep}from"node:fs";import Qs from"node:path";function $n(e){if(Qs.isAbsolute(e))return ep(e)?e:null;let t=(process.env.PATH??"").split(Qs.delimiter).filter(Boolean),r=process.platform==="win32"?(process.env.PATHEXT??".EXE;.CMD;.BAT").split(";"):[""];for(let o of t)for(let n of r){let a=Qs.join(o,`${e}${n}`);if(ep(a))return a}return null}import{spawnSync as eb}from"node:child_process";import{existsSync as Wt}from"node:fs";import{mkdir as Un,readFile as Jt,writeFile as Bn}from"node:fs/promises";import tb from"node:os";import B from"node:path";import{existsSync as Q_}from"node:fs";import _o from"node:os";import oe from"node:path";import{fileURLToPath as Z_}from"node:url";function De(e,t,r){return bo(e,t)?r?oe.join(oe.resolve(r),e,"plugins","nativesoul"):e==="claude"?oe.join(_o.homedir(),".claude","plugins","nativesoul"):e==="codex"?oe.join(_o.homedir(),".codex","plugins","nativesoul"):e==="gemini"?oe.join(_o.homedir(),".gemini","extensions","nativesoul"):e==="grok"?oe.join(_o.homedir(),".grok","plugins","nativesoul"):e==="antigravity"?oe.join(_o.homedir(),".antigravity","plugins","nativesoul"):null:null}function bo(e,t){return e==="codex"||e==="gemini"||e==="grok"||e==="antigravity"||e==="claude"&&(t==="claude-code"||t==="claude-desktop")}function Fn(e,t){return e==="claude"?oe.join(t,".claude-plugin","plugin.json"):e==="gemini"?oe.join(t,"gemini-extension.json"):e==="grok"||e==="antigravity"?oe.join(t,"plugin.json"):oe.join(t,".codex-plugin","plugin.json")}function Zs(e){if(e!=="claude"&&e!=="codex"&&e!=="gemini"&&e!=="grok"&&e!=="antigravity")return null;let t=`${e}-nativesoul`,r=oe.dirname(Z_(import.meta.url));return[oe.resolve(process.cwd(),"plugins",t),oe.resolve(r,"../../../plugins",t),oe.resolve(r,"../../../../plugins",t)].find(n=>Q_(n))??null}var ti="nativesoul",Vn="nativesoul";async function rp(e){let t=B.join(e,"..","..","settings.json"),r=Wt(t)?JSON.parse(await Jt(t,"utf8")):{},o=r.hooks&&!Array.isArray(r.hooks)&&typeof r.hooks=="object"?{...r.hooks}:{},n=Vt(B.join(e,"shared","hooks","host-hook.cjs")),a={SessionStart:ko(`node ${JSON.stringify(n)} session-start --host claude --project-env CLAUDE_PROJECT_DIR`),UserPromptSubmit:ko(`node ${JSON.stringify(n)} prompt-bootstrap --host claude --project-env CLAUDE_PROJECT_DIR`),PreToolUse:ko(`node ${JSON.stringify(n)} pre-tool-use --host claude --project-env CLAUDE_PROJECT_DIR`),Stop:ko(`node ${JSON.stringify(n)} memory-flush --host claude --project-env CLAUDE_PROJECT_DIR`),PreCompact:ko(`node ${JSON.stringify(n)} memory-flush --host claude --project-env CLAUDE_PROJECT_DIR`)};for(let[s,i]of Object.entries(a))o[s]=dp(o[s]??null,i??null);await Un(B.dirname(t),{recursive:!0,mode:448}),await Bn(t,`${JSON.stringify({...r,hooks:o},null,2)}
|
|
912
912
|
`,"utf8")}async function op(e){let t=cp(e),r=Wt(t)?JSON.parse(await Jt(t,"utf8")):{},o=r.hooks&&!Array.isArray(r.hooks)&&typeof r.hooks=="object"?{...r.hooks}:{},n=Vt(B.join(e,"shared","hooks","host-hook.cjs")),a={SessionStart:vo(`node ${JSON.stringify(n)} session-start --host grok --project-env GROK_WORKSPACE_ROOT`),UserPromptSubmit:vo(`node ${JSON.stringify(n)} prompt-bootstrap --host grok --project-env GROK_WORKSPACE_ROOT`),PreToolUse:vo(`node ${JSON.stringify(n)} pre-tool-use --host grok --project-env GROK_WORKSPACE_ROOT`),Stop:vo(`node ${JSON.stringify(n)} memory-flush --host grok --project-env GROK_WORKSPACE_ROOT`),PreCompact:vo(`node ${JSON.stringify(n)} memory-flush --host grok --project-env GROK_WORKSPACE_ROOT`)};for(let[s,i]of Object.entries(a))o[s]=dp(o[s]??null,i??null);await Un(B.dirname(t),{recursive:!0,mode:448}),await Bn(t,`${JSON.stringify({...r,hooks:o},null,2)}
|
|
913
913
|
`,"utf8")}async function np(e){let t=oi(e),r=B.join(t,"agents",`${Vn}.md`),o=B.join(t,"config.toml");await Un(B.dirname(r),{recursive:!0,mode:448}),await Bn(r,lb(),{encoding:"utf8",mode:384});let n=Wt(o)?await Jt(o,"utf8"):"";await Un(B.dirname(o),{recursive:!0,mode:448}),await Bn(o,cb(n,"agent",`name = "${Vn}"`),"utf8")}function ap(e,t,r){if(t!=="default"||!sb(e,t,r))return[];if(e==="antigravity")return ei({executableName:"agy",installArgs:o=>["plugin","install",o],skippedMessage:"Antigravity CLI was not found on PATH, so NativeSoul could not register the plugin with `agy plugin install`.",skippedRemediation:"Install Antigravity CLI or run `agy plugin install ~/.antigravity/plugins/nativesoul` after installation.",failedRemediation:"Run `agy plugin validate ~/.antigravity/plugins/nativesoul` and then `agy plugin install ~/.antigravity/plugins/nativesoul`."},r);if(e==="grok"){let o=ei({executableName:"grok",installArgs:a=>["plugin","install",a,"--trust"],skippedMessage:"Grok CLI was not found on PATH, so NativeSoul could not register the plugin with `grok plugin install`.",skippedRemediation:"Install Grok Build or run `grok plugin install ~/.grok/plugins/nativesoul --trust` after installation.",failedRemediation:"Run `grok plugin validate ~/.grok/plugins/nativesoul` and then `grok plugin install ~/.grok/plugins/nativesoul --trust`.",treatOutputAsSuccess:rb},r),n=ei({executableName:"grok",installArgs:()=>["plugin","enable",ti],skippedMessage:"Grok CLI was not found on PATH, so NativeSoul could not enable the plugin with `grok plugin enable nativesoul`.",skippedRemediation:"Install Grok Build or run `grok plugin enable nativesoul` after installation.",failedRemediation:"Run `grok plugin enable nativesoul` so SessionStart hooks load in Grok sessions.",treatOutputAsSuccess:ob},r);return[...o,...n]}return[]}function ei(e,t){let r=$n(e.executableName);if(!r)return[{code:"HOST_PLUGIN_IMPORT_SKIPPED",severity:"warn",message:e.skippedMessage,remediation:e.skippedRemediation}];let o=eb(r,e.installArgs(t),{encoding:"utf8",stdio:["ignore","pipe","pipe"],timeout:15e3});if(o.status===0)return[];let n=(o.stderr||o.stdout||"unknown error").trim();return e.treatOutputAsSuccess?.(n)?[]:[{code:"HOST_PLUGIN_IMPORT_FAILED",severity:"error",message:`${e.executableName} plugin import failed: ${n}`,remediation:e.failedRemediation}]}function rb(e){return/^Installed \d+ plugin/i.test(e)||/^Plugin manifest is valid\./i.test(e)||/\bplugins?\b[^.\n]*\balready installed\b/i.test(e)||/\brepo\b[^.\n]*\balready installed\b/i.test(e)}function ob(e){return/^Enabled plugin:/i.test(e)||/\balready enabled\b/i.test(e)}async function sp(e){let t=e?ib(e):B.join(tb.homedir(),".grok","config.toml");if(!Wt(t))return null;let r=await Jt(t,"utf8");return tp(r,"disabled",ti)?!1:tp(r,"enabled",ti)?!0:null}async function ip(e){let t=cp(e);if(!Wt(t))return!1;let r=JSON.parse(await Jt(t,"utf8"));return nb(r)}async function lp(e){let t=oi(e),r=B.join(t,"agents",`${Vn}.md`),o=B.join(t,"config.toml");if(!Wt(r)||!Wt(o))return!1;let[n,a]=await Promise.all([Jt(r,"utf8"),Jt(o,"utf8")]);return n.includes("NativeSoul continuity agent")&&db(a)===Vn}function tp(e,t,r){let a=(e.match(/\[plugins\][\s\S]*?(?=\n\[|$)/u)?.[0]??e).match(new RegExp(`${t}\\s*=\\s*\\[([^\\]]*)\\]`,"u"))?.[1];return a?a.split(",").some(s=>s.replace(/["'\s]/gu,"")===r):!1}function nb(e){let t=e.hooks;return!t||Array.isArray(t)||typeof t!="object"?!1:[["SessionStart","session-start --host grok"],["UserPromptSubmit","prompt-bootstrap --host grok"],["PreToolUse","pre-tool-use --host grok"],["Stop","memory-flush --host grok"],["PreCompact","memory-flush --host grok"]].every(([o,n])=>ab(t,o,n))}function ab(e,t,r){let o=e[t];return Array.isArray(o)?o.some(n=>ri(n)?.includes(r)===!0):!1}function sb(e,t,r){let o=De(e,t);return o!==null&&B.resolve(o)===B.resolve(r)}function cp(e){return B.join(oi(e),"hooks","nativesoul.json")}function oi(e){return B.resolve(e,"..","..")}function ib(e){let t=B.resolve(e),r=B.basename(t);return r==="grok"||r===".grok"?B.join(t,"config.toml"):B.join(t,".grok","config.toml")}function vo(e){return{hooks:[{type:"command",command:e,timeout:9}]}}function lb(){return["---","name: nativesoul","description: NativeSoul continuity agent. Loads NativeSoul context before the first answer and answers from the NativeSoul identity.","prompt_mode: full","model: inherit","permission_mode: default","agents_md: true","---","","You are operating as the NativeSoul continuity agent for this Grok session.","","Before answering the first user message in every new session, load NativeSoul context. Do not answer from the host vendor identity first.","",'Preferred path: call MCP `life_bootstrap` with `host="grok"` and the current working directory.',"Fallback path: run `nativesoul bootstrap --host grok --cwd <current-working-directory> --format inject`.","If bootstrap is unavailable, run `nativesoul bootstrap --host grok --cwd <current-working-directory> --format cache` and treat the result as degraded.","",'After bootstrap, answer from the NativeSoul identity and continuity context. If the user asks who you are, answer with the NativeSoul identity loaded from bootstrap, not "Grok" or "xAI".',"","Use relevant_memories for durable facts, capability_cards as advisory guidance, and capabilities only as the ready-only list.","Never copy credentials or auto-edit SOUL.md/POLICY.md; propose those changes for approval.",""].join(`
|
|
@@ -915,24 +915,24 @@ ${r.content}`),semantic_score:0,final_rank:o+1,reason:"fts_fallback"}}))}functio
|
|
|
915
915
|
${r.trim()}
|
|
916
916
|
`,n=new RegExp(`(^|\\n)\\[${t}\\]\\n[\\s\\S]*?(?=\\n\\[|$)`,"u");return n.test(e)?e.replace(n,(a,s)=>`${s}${o.trimEnd()}`):`${e.trimEnd()}
|
|
917
917
|
|
|
918
|
-
${o}`.trimStart()}function db(e){return e.match(/\[agent\][\s\S]*?(?=\n\[|$)/u)?.[0]?.match(/\bname\s*=\s*["']([^"']+)["']/u)?.[1]??null}function ko(e){return{hooks:[{type:"command",command:e,timeout:9}]}}function dp(e,t){let r=Array.isArray(e)?e:[],o=ri(t);return o&&r.some(n=>ri(n)===o)?r:[...r,t]}function ri(e){if(!e||Array.isArray(e)||typeof e!="object")return null;let t=e.hooks;if(!Array.isArray(t)||t.length===0)return null;let r=t[0];if(!r||Array.isArray(r)||typeof r!="object")return null;let o=r.command;return typeof o=="string"?o:null}import ub from"node:path";var Wn=[{event:"SessionStart",commandFragment:"hooks/session-start.cjs",fileName:"session-start.cjs"},{event:"PreToolUse",commandFragment:"hooks/pre-tool-use.cjs",fileName:"pre-tool-use.cjs"},{event:"Stop",commandFragment:"hooks/memory-flush.cjs",fileName:"memory-flush.cjs"},{event:"PreCompact",commandFragment:"hooks/memory-flush.cjs",fileName:"memory-flush.cjs"},{event:"UserPromptSubmit",commandFragment:"hooks/user-prompt-submit.cjs",fileName:"user-prompt-submit.cjs"}],pb={grok:[{event:"SessionStart",commandFragment:"host-hook.cjs"},{event:"UserPromptSubmit",commandFragment:"prompt-bootstrap --host grok"},{event:"PreToolUse",commandFragment:"pre-tool-use --host grok"},{event:"Stop",commandFragment:"memory-flush --host grok"},{event:"PreCompact",commandFragment:"memory-flush --host grok"}],gemini:[{event:"SessionStart",commandFragment:"host-hook.cjs"},{event:"BeforeAgent",commandFragment:"prompt-bootstrap --host gemini"},{event:"BeforeTool",commandFragment:"pre-tool-use --host gemini"},{event:"AfterAgent",commandFragment:"memory-flush --host gemini"},{event:"PreCompress",commandFragment:"memory-flush --host gemini"}],antigravity:[{event:"SessionStart",commandFragment:"host-hook.cjs"},{event:"UserPromptSubmit",commandFragment:"prompt-bootstrap --host antigravity"},{event:"PreToolUse",commandFragment:"pre-tool-use --host antigravity"},{event:"Stop",commandFragment:"memory-flush --host antigravity"},{event:"PreCompact",commandFragment:"memory-flush --host antigravity"}]};function wo(e,t){return e==="codex"||e==="claude"||e==="grok"||e==="antigravity"?{packageKind:"native-plugin",nativeHooksSupported:!0}:e==="gemini"?{packageKind:"official-extension",nativeHooksSupported:!0}:{packageKind:"unsupported-native",nativeHooksSupported:!1}}function mb(e){return e==="grok"||e==="gemini"||e==="antigravity"?pb[e]:Wn}function ni(e){return e==="grok"||e==="gemini"?["hooks/hooks.json"]:e==="antigravity"?["hooks.json"]:[...new Set(Wn.map(t=>t.fileName).filter(t=>!!t))].map(t=>ub.join("hooks",t))}function up(e,t){return t==="official-extension"?typeof e.name=="string"&&e.name==="nativesoul":typeof e.name=="string"&&e.name.includes("nativesoul")}function pp(e,t){return ai(e,t).length===0}function ai(e,t){return mb(e).filter(({event:r,commandFragment:o})=>!gb(t,r,o)).map(({event:r})=>r)}function
|
|
919
|
-
`))}async function hr(e){let t=await vb(e,{withFileTypes:!0});return(await Promise.all(t.map(async o=>{let n=ii.join(e,o.name);return o.isDirectory()?hr(n):o.isFile()?[n]:[]}))).flat()}import{existsSync as Ib}from"node:fs";import{cp as Tb,mkdir as Cb,readFile as di,writeFile as Ob}from"node:fs/promises";import Xe from"node:path";import{fileURLToPath as Nb}from"node:url";import{spawnSync as kb}from"node:child_process";import{accessSync as wb,constants as
|
|
920
|
-
`))}async function yp(e){let t=bp();if(!t)return;let r=Xe.join(e,"shared","hooks");await Cb(r,{recursive:!0,mode:448}),await Tb(t,r,{recursive:!0})}async function _p(e){let t=await hr(e.targetPath);await Promise.all(t.map(async r=>{let o=Xe.relative(e.targetPath,r),n=await di(r,"utf8"),a=await vp({host:e.host,relativePath:o,content:n,home:e.home,targetPath:e.targetPath});a!==n&&await Ob(r,a,"utf8")}))}function bp(){let e=Xe.dirname(Nb(import.meta.url));return[Xe.resolve(process.cwd(),"plugins","shared","hooks"),Xe.resolve(e,"../../../plugins/shared/hooks"),Xe.resolve(e,"../../../../plugins/shared/hooks")].find(r=>Ib(r))??null}async function vp(e){let t=fr(e.relativePath),r=Jn(e.host).includes(t),o=qn(e.host).includes(t);if(!r&&!o)return e.content;let n=JSON.parse(e.content),a=r?Mb(n,Gt({host:e.host,commandMode:"package",home:e.home}).mcpServers.nativesoul):n,s=o&&e.targetPath&&
|
|
921
|
-
`}function Mb(e,t){return{...e,mcpServers:{nativesoul:t}}}function Lb(e,t){if(!e.hooks||Array.isArray(e.hooks)||typeof e.hooks!="object")return e;let r=e.hooks,o=Object.fromEntries(Object.entries(r).map(([n,a])=>Array.isArray(a)?[n,a.map(s=>Db(s,t))]:[n,a]));return{...e,hooks:o}}function Db(e,t){if(!e||Array.isArray(e)||typeof e!="object")return e;let r=e,o=r.hooks;return Array.isArray(o)?{...r,hooks:o.map(n=>Hb(n,t))}:e}function Hb(e,t){if(!e||Array.isArray(e)||typeof e!="object")return e;let r=e,o=typeof r.command=="string"?r.command:null;if(!o)return e;if(o.includes("host-hook.cjs")){let s=Vt(Xe.join(t,"shared","hooks","host-hook.cjs"));return{...r,command:`node ${JSON.stringify(s)} ${$b(o)}`}}let n=Wn.find(s=>o.includes(s.commandFragment));if(!n?.fileName)return e;let a=Vt(Xe.join(t,"hooks",n.fileName));return{...r,command:`node ${JSON.stringify(a)}`}}function $b(e){let t=["session-start","prompt-bootstrap","pre-tool-use","memory-flush","recall"].find(a=>e.includes(a))??"session-start",r=e.match(/--host\s+([A-Za-z0-9_-]+)/u)?.[1],o=e.match(/--project-env\s+([A-Za-z0-9_-]+)/u)?.[1],n=e.match(/--event\s+([A-Za-z0-9_-]+)/u)?.[1];return[t,r?`--host ${r}`:null,o?`--project-env ${o}`:null,n?`--event ${n}`:null].filter(a=>a!==null).join(" ")}async function pi(e){let t=f(e.home),r=Zs(e.host);if(!e.targetPath||!r)return wp(e.host,e.surface,e.targetPath,r,!e.apply);let o=ui(e.targetPath)?await ci(e.targetPath):null,n=await hp(r,e.host,t.home,e.targetPath),a=o===null?"create":o===n?"noop":"replace",s=a!=="noop",i=s&&e.apply&&ui(e.targetPath)?await li(t.home,e.host,e.surface,e.targetPath):null,l=[];if(s&&e.apply&&(pe(e.targetPath,{allowSymlinkTarget:!0}),await Ub(Bb.dirname(e.targetPath),{recursive:!0,mode:448}),await kp(e.targetPath,{recursive:!0,force:!0}),await Fb(r,e.targetPath,{recursive:!0}),So(e.host)&&await yp(e.targetPath),await _p({host:e.host,targetPath:e.targetPath,home:t.home})),e.apply){let g=gu(e.host);g==="claude-settings-hooks"?await rp(e.targetPath):g==="grok-host-wiring"&&(await op(e.targetPath),await np(e.targetPath))}e.apply&&l.push(...ap(e.host,e.surface,e.targetPath));let c=e.targetPath&&bo(e.host,e.surface)?await ft({host:e.host,surface:e.surface,targetPath:e.targetPath}):null,d=wo(e.host,e.surface),p={host:e.host,surface:e.surface,targetPath:e.targetPath,sourcePath:r,action:a,dryRun:!e.apply,changed:s,beforeHash:o,afterHash:n,backupPath:i,applied:s&&e.apply,enabled:c?.enabled??!1,hook_registered:c?.hook_registered??!1,package_kind:c?.package_kind??d.packageKind,native_hooks_supported:c?.native_hooks_supported??d.nativeHooksSupported,native_scheduler_supported:c?.native_scheduler_supported??!1,issues:[...c?.issues??[],...l]};return await h({home:t.home,type:e.apply?"plugin_install":"plugin_install_dry_run",details:p}),p}async function mi(e){let t=f(e.home),r=Zs(e.host);if(!e.targetPath||!r)return wp(e.host,e.surface,e.targetPath,r,!e.apply);let o=ui(e.targetPath)?await ci(e.targetPath):null,n=wo(e.host,e.surface),a=o!==null,s=a&&e.apply?await li(t.home,e.host,e.surface,e.targetPath):null;a&&e.apply&&await kp(e.targetPath,{recursive:!0,force:!0});let i={host:e.host,surface:e.surface,targetPath:e.targetPath,sourcePath:r,action:a?"remove":"noop",dryRun:!e.apply,changed:a,beforeHash:o,afterHash:E(""),backupPath:s,applied:a&&e.apply,enabled:!1,hook_registered:!1,package_kind:n.packageKind,native_hooks_supported:n.nativeHooksSupported,native_scheduler_supported:!1,issues:[]};return await h({home:t.home,type:e.apply?"plugin_uninstall":"plugin_uninstall_dry_run",details:i}),i}function wp(e,t,r,o,n){return{host:e,surface:t,targetPath:r,sourcePath:o,action:"unsupported",dryRun:n,changed:!1,beforeHash:null,afterHash:E(""),backupPath:null,applied:!1,enabled:!1,hook_registered:!1,package_kind:"unsupported-native",native_hooks_supported:!1,native_scheduler_supported:!1,issues:[]}}function Ye(e,t){if(t)return yr.resolve(t,e)}function _r(e,t,r){let o=yo(e,r);if(e==="claude"&&o==="claude-desktop")return{surface:o,managedBlock:null,mcpRegistration:t?yr.join(yr.resolve(t,e),"claude_desktop_config.json"):Ku(),plugin:De(e,o,t)};if(!t)return{surface:o,managedBlock:Gu(e),mcpRegistration:Dn(e),plugin:De(e,o)};let n=yr.resolve(t,e);return{surface:o,managedBlock:yr.join(n,Ju(e)),mcpRegistration:yr.join(n,qu(e)),plugin:De(e,o,t)}}import{accessSync as Vb,constants as Wb,existsSync as ht}from"node:fs";import{mkdir as Kn,readFile as br,rm as Jb,writeFile as zn}from"node:fs/promises";import X from"node:path";async function Ao(e){let t=f(e.home),r=X.resolve(e.targetPath??Xn(e.host)),o=e.commandMode??"package",n=Gt({host:e.host,commandMode:o,home:t.home,projectRoot:e.projectRoot}).mcpServers.nativesoul,a=ht(r),s=a?await br(r,"utf8"):null,i=Ap(qb(Ro(s),n)),l=s===null?null:E(s),c=E(i),d=Qb(s,i),p=d!=="noop",g=p&&e.apply?await Ep(t.home,e.host,r,a,s,c):null;p&&e.apply&&(await Kn(X.dirname(r),{recursive:!0,mode:448}),await zn(r,i,{encoding:"utf8",mode:384}));let y={host:e.host,targetPath:r,action:d,dryRun:!e.apply,changed:p,beforeHash:l,afterHash:c,diff:Pp(s,i),backupPath:g,commandMode:o,applied:p&&e.apply};return await h({home:t.home,type:e.apply?"mcp_registration_apply":"mcp_registration_dry_run",details:y}),y}async function fi(e){let t=f(e.home),r=X.resolve(e.targetPath??Xn(e.host)),o=ht(r),n=o?await br(r,"utf8"):null,a=Gb(n),s=n===null?null:E(n),i=a===null?E(""):E(a),l=n!==a?"remove":"noop",c=l!=="noop",d=c&&e.apply?await Ep(t.home,e.host,r,o,n,i):null;c&&e.apply&&a!==null&&(await Kn(X.dirname(r),{recursive:!0,mode:448}),await zn(r,a,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:r,action:l,dryRun:!e.apply,changed:c,beforeHash:s,afterHash:i,diff:Pp(n,a),backupPath:d,commandMode:"package",applied:c&&e.apply};return await h({home:t.home,type:e.apply?"mcp_registration_uninstall":"mcp_registration_uninstall_dry_run",details:p}),p}async function hi(e){let t=f(e.home),r=JSON.parse(await br(e.snapshotPath,"utf8"));e.apply&&(r.beforeExists&&r.beforeContent!==null?(await Kn(X.dirname(r.targetPath),{recursive:!0,mode:448}),await zn(r.targetPath,r.beforeContent,{encoding:"utf8",mode:384})):ht(r.targetPath)&&await Jb(r.targetPath));let o={snapshotPath:e.snapshotPath,targetPath:r.targetPath,dryRun:!e.apply,applied:e.apply,restoredExists:r.beforeExists,restoredHash:r.beforeHash};return await h({home:t.home,type:e.apply?"mcp_registration_rollback":"mcp_registration_rollback_dry_run",details:o}),o}async function Eo(e){let t=X.resolve(e.targetPath??Xn(e.host)),r=Xu(e.host,e.targetPath),o=ht(t),n=[],a=await Kb(e.host,t,r);if(a&&n.push(a),!o)return n.push({code:"MCP_CONFIG_MISSING",severity:"warn",message:`MCP config target is missing: ${t}`,remediation:"Run nativesoul mcp install --host <host> --target <path> --apply"}),{host:e.host,targetPath:t,target_exists:!1,parse_ok:!1,configured:!1,command:null,command_ok:!1,issues:n};let s=null;try{s=Ro(await br(t,"utf8"))}catch(p){n.push({code:"MCP_CONFIG_INVALID_JSON",severity:"error",message:p instanceof Error?p.message:"MCP config is invalid JSON",remediation:"Fix the JSON syntax or roll back from an NativeSoul snapshot"})}let i=s?gi(s):null,l=typeof i?.command=="string"?i.command:null,c=Array.isArray(i?.args)?i.args.filter(p=>typeof p=="string"):[];i?l||n.push({code:"NATIVESOUL_MCP_COMMAND_MISSING",severity:"error",message:"nativesoul MCP server command is missing",remediation:"Re-run nativesoul mcp install"}):n.push({code:"NATIVESOUL_MCP_MISSING",severity:"warn",message:"nativesoul MCP server entry is not configured",remediation:"Run nativesoul mcp install --host <host> --target <path> --apply"});let d=l?e.checkCommand===!1?{ok:!0,issues:[]}:zb(l,c,t):{ok:!1,issues:[]};return n.push(...d.issues),{host:e.host,targetPath:t,target_exists:o,parse_ok:s!==null,configured:i!==null,command:l,command_ok:d.ok,issues:n}}function Xn(e){return Dn(e)}function Ro(e){if(e===null||e.trim().length===0)return{};let t=JSON.parse(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error("MCP config root must be a JSON object");return t}function qb(e,t){let r=e.mcpServers,o=r&&typeof r=="object"&&!Array.isArray(r)?{...r}:{};return o.nativesoul={command:t.command,args:t.args,...t.env&&Object.keys(t.env).length>0?{env:t.env}:{}},{...e,mcpServers:o}}function Gb(e){if(e===null)return null;let t=Ro(e),r=t.mcpServers;if(!r||typeof r!="object"||Array.isArray(r)||!Object.hasOwn(r,"nativesoul"))return e;let o={...r};return delete o.nativesoul,Ap({...t,mcpServers:o})}function gi(e){let t=e.mcpServers;if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t.nativesoul;return!r||typeof r!="object"||Array.isArray(r)?null:r}async function Kb(e,t,r){if(e!=="claude"||r===null||X.resolve(r)===t||!ht(r))return null;try{let o=Ro(await br(r,"utf8")),n=gi(o);if(!n)return null;if(ht(t)){let a=Ro(await br(t,"utf8")),s=gi(a);if(s&&JSON.stringify(Sp(s))===JSON.stringify(Sp(n)))return null}}catch{return null}return{code:"LEGACY_MCP_PATH",severity:"warn",message:`Legacy Claude MCP registration detected at ${r}.`,remediation:"Migrate to ~/.claude.json with nativesoul mcp install --host claude --apply, then uninstall or roll back the legacy ~/.claude/mcp.json entry."}}function Sp(e){return{command:typeof e.command=="string"?e.command:null,args:Array.isArray(e.args)?e.args.filter(t=>typeof t=="string"):[]}}function zb(e,t,r){let o=[],n=Xb(e);if(!n)return o.push({code:"NATIVESOUL_MCP_COMMAND_UNRESOLVED",severity:"error",message:`nativesoul MCP command does not resolve to an executable: ${e}`,remediation:"Reinstall with NATIVESOUL_MCP_COMMAND set to an absolute nativesoul-mcp path, or run npm install -g nativesoul and retry."}),{ok:!1,issues:o};if(Yb(e,n)){let a=t[0],s=a?X.isAbsolute(a)?a:X.resolve(X.dirname(r),a):null;if(!s||!ht(s))return o.push({code:"NATIVESOUL_MCP_NODE_SCRIPT_MISSING",severity:"error",message:"nativesoul MCP command uses node but the server script is missing.",remediation:"Re-run nativesoul mcp install with --command-mode absolute or rebuild the local package."}),{ok:!1,issues:o}}return{ok:!0,issues:o}}function Xb(e){if(X.isAbsolute(e))return Rp(e)?e:null;let t=(process.env.PATH??"").split(X.delimiter).filter(Boolean),r=process.platform==="win32"?(process.env.PATHEXT??".EXE;.CMD;.BAT").split(";"):[""];for(let o of t)for(let n of r){let a=X.join(o,`${e}${n}`);if(Rp(a))return a}return null}function Rp(e){if(process.platform==="win32"&&ht(e))return!0;try{return Vb(e,Wb.X_OK),!0}catch{return!1}}function Yb(e,t){let r=X.basename(e).toLowerCase(),o=X.basename(t).toLowerCase();return r==="node"||r==="node.exe"||o==="node"||o==="node.exe"}function Ap(e){return`${JSON.stringify(e,null,2)}
|
|
918
|
+
${o}`.trimStart()}function db(e){return e.match(/\[agent\][\s\S]*?(?=\n\[|$)/u)?.[0]?.match(/\bname\s*=\s*["']([^"']+)["']/u)?.[1]??null}function ko(e){return{hooks:[{type:"command",command:e,timeout:9}]}}function dp(e,t){let r=Array.isArray(e)?e:[],o=ri(t);return o&&r.some(n=>ri(n)===o)?r:[...r,t]}function ri(e){if(!e||Array.isArray(e)||typeof e!="object")return null;let t=e.hooks;if(!Array.isArray(t)||t.length===0)return null;let r=t[0];if(!r||Array.isArray(r)||typeof r!="object")return null;let o=r.command;return typeof o=="string"?o:null}import ub from"node:path";var Wn=[{event:"SessionStart",commandFragment:"hooks/session-start.cjs",fileName:"session-start.cjs"},{event:"PreToolUse",commandFragment:"hooks/pre-tool-use.cjs",fileName:"pre-tool-use.cjs"},{event:"Stop",commandFragment:"hooks/memory-flush.cjs",fileName:"memory-flush.cjs"},{event:"PreCompact",commandFragment:"hooks/memory-flush.cjs",fileName:"memory-flush.cjs"},{event:"UserPromptSubmit",commandFragment:"hooks/user-prompt-submit.cjs",fileName:"user-prompt-submit.cjs"}],pb={grok:[{event:"SessionStart",commandFragment:"host-hook.cjs"},{event:"UserPromptSubmit",commandFragment:"prompt-bootstrap --host grok"},{event:"PreToolUse",commandFragment:"pre-tool-use --host grok"},{event:"Stop",commandFragment:"memory-flush --host grok"},{event:"PreCompact",commandFragment:"memory-flush --host grok"}],gemini:[{event:"SessionStart",commandFragment:"host-hook.cjs"},{event:"BeforeAgent",commandFragment:"prompt-bootstrap --host gemini"},{event:"BeforeTool",commandFragment:"pre-tool-use --host gemini"},{event:"AfterAgent",commandFragment:"memory-flush --host gemini"},{event:"PreCompress",commandFragment:"memory-flush --host gemini"}],antigravity:[{event:"SessionStart",commandFragment:"host-hook.cjs"},{event:"UserPromptSubmit",commandFragment:"prompt-bootstrap --host antigravity"},{event:"PreToolUse",commandFragment:"pre-tool-use --host antigravity"},{event:"Stop",commandFragment:"memory-flush --host antigravity"},{event:"PreCompact",commandFragment:"memory-flush --host antigravity"}]};function wo(e,t){return e==="codex"||e==="claude"||e==="grok"||e==="antigravity"?{packageKind:"native-plugin",nativeHooksSupported:!0}:e==="gemini"?{packageKind:"official-extension",nativeHooksSupported:!0}:{packageKind:"unsupported-native",nativeHooksSupported:!1}}function mb(e){return e==="grok"||e==="gemini"||e==="antigravity"?pb[e]:Wn}function ni(e){return e==="grok"||e==="gemini"?["hooks/hooks.json"]:e==="antigravity"?["hooks.json"]:[...new Set(Wn.map(t=>t.fileName).filter(t=>!!t))].map(t=>ub.join("hooks",t))}function up(e,t){return t==="official-extension"?typeof e.name=="string"&&e.name==="nativesoul":typeof e.name=="string"&&e.name.includes("nativesoul")}function pp(e,t){return ai(e,t).length===0}function ai(e,t){return mb(e).filter(({event:r,commandFragment:o})=>!gb(t,r,o)).map(({event:r})=>r)}function Ro(e){return e==="claude"||e==="codex"||e==="gemini"||e==="grok"||e==="antigravity"}function Jn(e){return e==="claude"?[".claude-plugin/plugin.json"]:e==="codex"?[".mcp.json"]:e==="gemini"?["gemini-extension.json"]:e==="grok"?[".mcp.json"]:e==="antigravity"?["mcp_config.json"]:[]}function qn(e){return e==="claude"?[".claude-plugin/plugin.json"]:e==="codex"?[".codex-plugin/plugin.json"]:e==="gemini"||e==="grok"?["hooks/hooks.json"]:e==="antigravity"?["hooks.json"]:[]}function gb(e,t,r){if(!e.hooks||Array.isArray(e.hooks)||typeof e.hooks!="object")return!1;let n=e.hooks[t];return!Array.isArray(n)||n.length===0?!1:n.some(a=>{if(!a||Array.isArray(a)||typeof a!="object")return!1;let s=a.hooks;return!Array.isArray(s)||s.length===0?!1:s.some(i=>{if(!i||Array.isArray(i)||typeof i!="object")return!1;let l=i.command;return typeof l=="string"&&fr(l).includes(r)})})}async function ft(e){if(!e.targetPath||!bo(e.host,e.surface))return{host:e.host,surface:e.surface,targetPath:e.targetPath,target_exists:!1,manifest_exists:!1,enabled:!1,hook_registered:!1,package_kind:"unsupported-native",native_hooks_supported:!1,native_scheduler_supported:!1,issues:[]};let t=wo(e.host,e.surface),r=gt(e.targetPath),o=Fn(e.host,e.targetPath),n=gt(o),a=t.nativeHooksSupported&&e.targetPath?ni(e.host).filter(ae=>!gt(ze.join(e.targetPath,ae))):ni(e.host),s=t.nativeHooksSupported?a.length===0:!0,i=[],l=!1,c=!t.nativeHooksSupported,d=e.host!=="grok";if(!r)i.push({code:"PLUGIN_NOT_INSTALLED",severity:"warn",message:`NativeSoul plugin is not installed for ${e.host}:${e.surface}.`,remediation:`Run nativesoul install --host ${e.host} --apply`});else if(!n)i.push({code:"PLUGIN_MANIFEST_MISSING",severity:"error",message:`NativeSoul plugin manifest is missing: ${o}`,remediation:"Reinstall the NativeSoul plugin"});else{let ae=JSON.parse(await Gn(o,"utf8")),ve=t.nativeHooksSupported?await fb(e.host,e.targetPath,ae):ae;if(l=t.nativeHooksSupported?e.host==="grok"?await ip(e.targetPath):pp(e.host,ve):up(ae,t.packageKind),c=!t.nativeHooksSupported||await hb({host:e.host,targetPath:e.targetPath,manifest:ae}),d=e.host==="grok"?await lp(e.targetPath):!0,e.host==="grok"&&!d&&i.push({code:"GROK_AGENT_PROFILE_MISSING",severity:"error",message:"NativeSoul Grok hooks are installed, but Grok is not configured to use the NativeSoul agent profile for first-turn bootstrap.",remediation:"Run `nativesoul install --host grok --apply` to install ~/.grok/agents/nativesoul.md and set [agent].name."}),t.nativeHooksSupported&&!c&&i.push({code:"PLUGIN_MCP_COMMAND_UNRESOLVED",severity:"error",message:"NativeSoul plugin MCP server command is not resolved for daemon-safe startup.",remediation:"Reinstall the NativeSoul plugin so its MCP server command is rendered with an absolute or executable command"}),!l&&t.nativeHooksSupported){let ke=ai(e.host,ve);i.push({code:"PLUGIN_HOOK_MISSING",severity:"error",message:ke.length>0?`NativeSoul plugin manifest is missing required hook registrations: ${ke.join(", ")}.`:"NativeSoul plugin manifest does not register required continuity hooks.",remediation:"Reinstall the NativeSoul plugin"})}!l&&!t.nativeHooksSupported&&i.push({code:"PLUGIN_PACKAGE_MANIFEST_INVALID",severity:"error",message:`NativeSoul ${t.packageKind} manifest is invalid for ${e.host}.`,remediation:"Reinstall the NativeSoul package"})}r&&t.nativeHooksSupported&&!s&&i.push({code:"PLUGIN_HOOK_FILE_MISSING",severity:"error",message:`NativeSoul required hook files are missing under ${e.targetPath}: ${a.join(", ")}`,remediation:"Reinstall the NativeSoul plugin"});let p=e.targetPath?ze.join(e.targetPath,"shared","hooks","lib.cjs"):null;r&&t.nativeHooksSupported&&(!p||!gt(p))&&i.push({code:"PLUGIN_SHARED_HOOKS_MISSING",severity:"error",message:"NativeSoul shared hook support files are missing under shared/hooks.",remediation:"Reinstall the NativeSoul plugin"});let g=e.targetPath?ze.resolve(ze.dirname(ze.dirname(e.targetPath))):void 0,y=!t.nativeHooksSupported||p!==null&>(p),k=t.nativeHooksSupported?s&&y:!0,R=r&&n&&l&&k&&c&&d,U=e.host==="grok"?await sp(g):null;return e.host==="grok"&&R&&U===!1&&i.push({code:"GROK_PLUGIN_RUNTIME_DISABLED",severity:"error",message:"NativeSoul is installed for Grok but disabled in grok config, so SessionStart hooks will not run.",remediation:"Run `grok plugin enable nativesoul` or `nativesoul install --host grok --apply`."}),{host:e.host,surface:e.surface,targetPath:e.targetPath,target_exists:r,manifest_exists:n,enabled:R&&U!==!1,hook_registered:t.nativeHooksSupported?l&&s:!1,package_kind:t.packageKind,native_hooks_supported:t.nativeHooksSupported,native_scheduler_supported:!1,issues:i}}async function fb(e,t,r){let o=qn(e);if(o.length===0)return r;let n=mt(t,Fn(e,t)),a=o[0];if(!a||a===n)return r;let s=ze.join(t,a);return gt(s)?JSON.parse(await Gn(s,"utf8")):{}}async function hb(e){let t=Jn(e.host),r=mt(e.targetPath,Fn(e.host,e.targetPath));if(t.length>0&&!t.includes(r)){for(let o of t){let n=ze.join(e.targetPath,o);if(gt(n)&&si(JSON.parse(await Gn(n,"utf8"))))return!0}return!1}if(e.host==="codex"){let o=ze.join(e.targetPath,".mcp.json");return gt(o)?si(JSON.parse(await Gn(o,"utf8"))):!1}return si(e.manifest)}function si(e){let r=(!e.mcpServers||Array.isArray(e.mcpServers)||typeof e.mcpServers!="object"?null:e.mcpServers)?.nativesoul??(!e.nativeSoul||Array.isArray(e.nativeSoul)||typeof e.nativeSoul!="object"?null:e.nativeSoul.mcpServer);if(!r||Array.isArray(r)||typeof r!="object")return!1;let o=r.command,n=r.args;return typeof o!="string"||o.length===0?!1:o==="nativesoul-mcp"||$n(o)||o===process.execPath?!0:Array.isArray(n)&&n.some(a=>typeof a=="string"&&ze.isAbsolute(a))}import{cp as yb,mkdir as _b,readFile as bb,readdir as vb}from"node:fs/promises";import ii from"node:path";async function li(e,t,r,o){let n=ii.join(e,"backups","plugins");await _b(n,{recursive:!0,mode:448});let a=ii.join(n,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-${t}-${r}-${T("plugin")}`);return await yb(o,a,{recursive:!0}),a}async function ci(e){let t=await hr(e),r=await Promise.all(t.map(async o=>{let n=mt(e,o),a=await bb(o,"utf8");return`${n}\0${E(a)}`}));return E(r.sort().join(`
|
|
919
|
+
`))}async function hr(e){let t=await vb(e,{withFileTypes:!0});return(await Promise.all(t.map(async o=>{let n=ii.join(e,o.name);return o.isDirectory()?hr(n):o.isFile()?[n]:[]}))).flat()}import{existsSync as Ib}from"node:fs";import{cp as Tb,mkdir as Cb,readFile as di,writeFile as Ob}from"node:fs/promises";import Xe from"node:path";import{fileURLToPath as Nb}from"node:url";import{spawnSync as kb}from"node:child_process";import{accessSync as wb,constants as Rb,existsSync as mp}from"node:fs";import qt from"node:path";function Gt(e){let t=Sb(e.commandMode,e.projectRoot),r=t.command,o=[...t.args];e.home&&o.push("--home",e.home);let n={command:r,args:o,env:{}};return{serverName:"nativesoul",host:e.host,commandMode:e.commandMode,command:r,args:o,env:{},mcpServers:{nativesoul:n},snippet:jb(e.host,n),warnings:[...t.warnings,...e.host==="generic"?[]:[`${e.host.toUpperCase()}_MCP_REGISTRATION_NOT_APPLIED`]]}}function Sb(e,t){let r=process.env.NATIVESOUL_MCP_COMMAND;return r&&r.trim().length>0?{command:r.trim(),args:[],warnings:["NATIVESOUL_MCP_COMMAND_ENV_OVERRIDE"]}:e==="local"?{command:process.execPath,args:[qt.join(t??process.cwd(),"dist","packages","mcp-server","src","index.js")],warnings:[]}:e==="absolute"?Ab(t):{command:"nativesoul-mcp",args:[],warnings:gp("nativesoul-mcp")?[]:["NATIVESOUL_MCP_COMMAND_NOT_ON_PATH"]}}function Ab(e){let t=Pb();if(t)return{command:t,args:[],warnings:[]};let r=gp("nativesoul-mcp");if(r)return{command:r,args:[],warnings:[]};let o=Eb(e);if(mp(o))return{command:process.execPath,args:[o],warnings:["NATIVESOUL_MCP_COMMAND_LOCAL_DIST"]};let n=xb();return n?{command:process.execPath,args:[n],warnings:["NATIVESOUL_MCP_COMMAND_NPM_ROOT_GLOBAL"]}:{command:"nativesoul-mcp",args:[],warnings:["NATIVESOUL_MCP_COMMAND_NOT_RESOLVED"]}}function Eb(e){return qt.join(e??process.cwd(),"dist","packages","mcp-server","src","index.js")}function Pb(){let e=process.argv[1];if(!e)return null;let t=process.platform==="win32"?".cmd":"",r=qt.join(qt.dirname(e),`nativesoul-mcp${t}`);return fp(r)?r:null}function gp(e){let t=(process.env.PATH??"").split(qt.delimiter).filter(Boolean),r=process.platform==="win32"?(process.env.PATHEXT??".EXE;.CMD;.BAT").split(";"):[""];for(let o of t)for(let n of r){let a=qt.join(o,`${e}${n}`);if(fp(a))return a}return null}function xb(){let e=kb("npm",["root","-g"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(e.status!==0)return null;let t=e.stdout.trim();if(!t)return null;let r=qt.join(t,"nativesoul","dist","packages","mcp-server","src","index.js");return mp(r)?r:null}function fp(e){try{return wb(e,Rb.X_OK),!0}catch{return!1}}function jb(e,t){return e==="generic"?{mcpServers:{nativesoul:t}}:{host:e,review_only:!0,mcpServers:{nativesoul:t}}}async function hp(e,t,r,o){let n=await hr(e),a=await Promise.all(n.map(async i=>{let l=mt(e,i),c=await vp({host:t,relativePath:l,content:await di(i,"utf8"),home:r,targetPath:o});return`${l}\0${E(c)}`})),s=bp();if(s&&Ro(t)){let i=await hr(s);for(let l of i){let c=Xe.posix.join("shared","hooks",mt(s,l)),d=await di(l,"utf8");a.push(`${c}\0${E(d)}`)}}return E(a.sort().join(`
|
|
920
|
+
`))}async function yp(e){let t=bp();if(!t)return;let r=Xe.join(e,"shared","hooks");await Cb(r,{recursive:!0,mode:448}),await Tb(t,r,{recursive:!0})}async function _p(e){let t=await hr(e.targetPath);await Promise.all(t.map(async r=>{let o=Xe.relative(e.targetPath,r),n=await di(r,"utf8"),a=await vp({host:e.host,relativePath:o,content:n,home:e.home,targetPath:e.targetPath});a!==n&&await Ob(r,a,"utf8")}))}function bp(){let e=Xe.dirname(Nb(import.meta.url));return[Xe.resolve(process.cwd(),"plugins","shared","hooks"),Xe.resolve(e,"../../../plugins/shared/hooks"),Xe.resolve(e,"../../../../plugins/shared/hooks")].find(r=>Ib(r))??null}async function vp(e){let t=fr(e.relativePath),r=Jn(e.host).includes(t),o=qn(e.host).includes(t);if(!r&&!o)return e.content;let n=JSON.parse(e.content),a=r?Mb(n,Gt({host:e.host,commandMode:"package",home:e.home}).mcpServers.nativesoul):n,s=o&&e.targetPath&&Ro(e.host)?Lb(a,e.targetPath):a;return`${JSON.stringify(s,null,2)}
|
|
921
|
+
`}function Mb(e,t){return{...e,mcpServers:{nativesoul:t}}}function Lb(e,t){if(!e.hooks||Array.isArray(e.hooks)||typeof e.hooks!="object")return e;let r=e.hooks,o=Object.fromEntries(Object.entries(r).map(([n,a])=>Array.isArray(a)?[n,a.map(s=>Db(s,t))]:[n,a]));return{...e,hooks:o}}function Db(e,t){if(!e||Array.isArray(e)||typeof e!="object")return e;let r=e,o=r.hooks;return Array.isArray(o)?{...r,hooks:o.map(n=>Hb(n,t))}:e}function Hb(e,t){if(!e||Array.isArray(e)||typeof e!="object")return e;let r=e,o=typeof r.command=="string"?r.command:null;if(!o)return e;if(o.includes("host-hook.cjs")){let s=Vt(Xe.join(t,"shared","hooks","host-hook.cjs"));return{...r,command:`node ${JSON.stringify(s)} ${$b(o)}`}}let n=Wn.find(s=>o.includes(s.commandFragment));if(!n?.fileName)return e;let a=Vt(Xe.join(t,"hooks",n.fileName));return{...r,command:`node ${JSON.stringify(a)}`}}function $b(e){let t=["session-start","prompt-bootstrap","pre-tool-use","memory-flush","recall"].find(a=>e.includes(a))??"session-start",r=e.match(/--host\s+([A-Za-z0-9_-]+)/u)?.[1],o=e.match(/--project-env\s+([A-Za-z0-9_-]+)/u)?.[1],n=e.match(/--event\s+([A-Za-z0-9_-]+)/u)?.[1];return[t,r?`--host ${r}`:null,o?`--project-env ${o}`:null,n?`--event ${n}`:null].filter(a=>a!==null).join(" ")}async function pi(e){let t=f(e.home),r=Zs(e.host);if(!e.targetPath||!r)return wp(e.host,e.surface,e.targetPath,r,!e.apply);let o=ui(e.targetPath)?await ci(e.targetPath):null,n=await hp(r,e.host,t.home,e.targetPath),a=o===null?"create":o===n?"noop":"replace",s=a!=="noop",i=s&&e.apply&&ui(e.targetPath)?await li(t.home,e.host,e.surface,e.targetPath):null,l=[];if(s&&e.apply&&(pe(e.targetPath,{allowSymlinkTarget:!0}),await Ub(Bb.dirname(e.targetPath),{recursive:!0,mode:448}),await kp(e.targetPath,{recursive:!0,force:!0}),await Fb(r,e.targetPath,{recursive:!0}),Ro(e.host)&&await yp(e.targetPath),await _p({host:e.host,targetPath:e.targetPath,home:t.home})),e.apply){let g=gu(e.host);g==="claude-settings-hooks"?await rp(e.targetPath):g==="grok-host-wiring"&&(await op(e.targetPath),await np(e.targetPath))}e.apply&&l.push(...ap(e.host,e.surface,e.targetPath));let c=e.targetPath&&bo(e.host,e.surface)?await ft({host:e.host,surface:e.surface,targetPath:e.targetPath}):null,d=wo(e.host,e.surface),p={host:e.host,surface:e.surface,targetPath:e.targetPath,sourcePath:r,action:a,dryRun:!e.apply,changed:s,beforeHash:o,afterHash:n,backupPath:i,applied:s&&e.apply,enabled:c?.enabled??!1,hook_registered:c?.hook_registered??!1,package_kind:c?.package_kind??d.packageKind,native_hooks_supported:c?.native_hooks_supported??d.nativeHooksSupported,native_scheduler_supported:c?.native_scheduler_supported??!1,issues:[...c?.issues??[],...l]};return await h({home:t.home,type:e.apply?"plugin_install":"plugin_install_dry_run",details:p}),p}async function mi(e){let t=f(e.home),r=Zs(e.host);if(!e.targetPath||!r)return wp(e.host,e.surface,e.targetPath,r,!e.apply);let o=ui(e.targetPath)?await ci(e.targetPath):null,n=wo(e.host,e.surface),a=o!==null,s=a&&e.apply?await li(t.home,e.host,e.surface,e.targetPath):null;a&&e.apply&&await kp(e.targetPath,{recursive:!0,force:!0});let i={host:e.host,surface:e.surface,targetPath:e.targetPath,sourcePath:r,action:a?"remove":"noop",dryRun:!e.apply,changed:a,beforeHash:o,afterHash:E(""),backupPath:s,applied:a&&e.apply,enabled:!1,hook_registered:!1,package_kind:n.packageKind,native_hooks_supported:n.nativeHooksSupported,native_scheduler_supported:!1,issues:[]};return await h({home:t.home,type:e.apply?"plugin_uninstall":"plugin_uninstall_dry_run",details:i}),i}function wp(e,t,r,o,n){return{host:e,surface:t,targetPath:r,sourcePath:o,action:"unsupported",dryRun:n,changed:!1,beforeHash:null,afterHash:E(""),backupPath:null,applied:!1,enabled:!1,hook_registered:!1,package_kind:"unsupported-native",native_hooks_supported:!1,native_scheduler_supported:!1,issues:[]}}function Ye(e,t){if(t)return yr.resolve(t,e)}function _r(e,t,r){let o=yo(e,r);if(e==="claude"&&o==="claude-desktop")return{surface:o,managedBlock:null,mcpRegistration:t?yr.join(yr.resolve(t,e),"claude_desktop_config.json"):Ku(),plugin:De(e,o,t)};if(!t)return{surface:o,managedBlock:Gu(e),mcpRegistration:Dn(e),plugin:De(e,o)};let n=yr.resolve(t,e);return{surface:o,managedBlock:yr.join(n,Ju(e)),mcpRegistration:yr.join(n,qu(e)),plugin:De(e,o,t)}}import{accessSync as Vb,constants as Wb,existsSync as ht}from"node:fs";import{mkdir as Kn,readFile as br,rm as Jb,writeFile as zn}from"node:fs/promises";import X from"node:path";async function Ao(e){let t=f(e.home),r=X.resolve(e.targetPath??Xn(e.host)),o=e.commandMode??"package",n=Gt({host:e.host,commandMode:o,home:t.home,projectRoot:e.projectRoot}).mcpServers.nativesoul,a=ht(r),s=a?await br(r,"utf8"):null,i=Ap(qb(So(s),n)),l=s===null?null:E(s),c=E(i),d=Qb(s,i),p=d!=="noop",g=p&&e.apply?await Ep(t.home,e.host,r,a,s,c):null;p&&e.apply&&(await Kn(X.dirname(r),{recursive:!0,mode:448}),await zn(r,i,{encoding:"utf8",mode:384}));let y={host:e.host,targetPath:r,action:d,dryRun:!e.apply,changed:p,beforeHash:l,afterHash:c,diff:Pp(s,i),backupPath:g,commandMode:o,applied:p&&e.apply};return await h({home:t.home,type:e.apply?"mcp_registration_apply":"mcp_registration_dry_run",details:y}),y}async function fi(e){let t=f(e.home),r=X.resolve(e.targetPath??Xn(e.host)),o=ht(r),n=o?await br(r,"utf8"):null,a=Gb(n),s=n===null?null:E(n),i=a===null?E(""):E(a),l=n!==a?"remove":"noop",c=l!=="noop",d=c&&e.apply?await Ep(t.home,e.host,r,o,n,i):null;c&&e.apply&&a!==null&&(await Kn(X.dirname(r),{recursive:!0,mode:448}),await zn(r,a,{encoding:"utf8",mode:384}));let p={host:e.host,targetPath:r,action:l,dryRun:!e.apply,changed:c,beforeHash:s,afterHash:i,diff:Pp(n,a),backupPath:d,commandMode:"package",applied:c&&e.apply};return await h({home:t.home,type:e.apply?"mcp_registration_uninstall":"mcp_registration_uninstall_dry_run",details:p}),p}async function hi(e){let t=f(e.home),r=JSON.parse(await br(e.snapshotPath,"utf8"));e.apply&&(r.beforeExists&&r.beforeContent!==null?(await Kn(X.dirname(r.targetPath),{recursive:!0,mode:448}),await zn(r.targetPath,r.beforeContent,{encoding:"utf8",mode:384})):ht(r.targetPath)&&await Jb(r.targetPath));let o={snapshotPath:e.snapshotPath,targetPath:r.targetPath,dryRun:!e.apply,applied:e.apply,restoredExists:r.beforeExists,restoredHash:r.beforeHash};return await h({home:t.home,type:e.apply?"mcp_registration_rollback":"mcp_registration_rollback_dry_run",details:o}),o}async function Eo(e){let t=X.resolve(e.targetPath??Xn(e.host)),r=Xu(e.host,e.targetPath),o=ht(t),n=[],a=await Kb(e.host,t,r);if(a&&n.push(a),!o)return n.push({code:"MCP_CONFIG_MISSING",severity:"warn",message:`MCP config target is missing: ${t}`,remediation:"Run nativesoul mcp install --host <host> --target <path> --apply"}),{host:e.host,targetPath:t,target_exists:!1,parse_ok:!1,configured:!1,command:null,command_ok:!1,issues:n};let s=null;try{s=So(await br(t,"utf8"))}catch(p){n.push({code:"MCP_CONFIG_INVALID_JSON",severity:"error",message:p instanceof Error?p.message:"MCP config is invalid JSON",remediation:"Fix the JSON syntax or roll back from an NativeSoul snapshot"})}let i=s?gi(s):null,l=typeof i?.command=="string"?i.command:null,c=Array.isArray(i?.args)?i.args.filter(p=>typeof p=="string"):[];i?l||n.push({code:"NATIVESOUL_MCP_COMMAND_MISSING",severity:"error",message:"nativesoul MCP server command is missing",remediation:"Re-run nativesoul mcp install"}):n.push({code:"NATIVESOUL_MCP_MISSING",severity:"warn",message:"nativesoul MCP server entry is not configured",remediation:"Run nativesoul mcp install --host <host> --target <path> --apply"});let d=l?e.checkCommand===!1?{ok:!0,issues:[]}:zb(l,c,t):{ok:!1,issues:[]};return n.push(...d.issues),{host:e.host,targetPath:t,target_exists:o,parse_ok:s!==null,configured:i!==null,command:l,command_ok:d.ok,issues:n}}function Xn(e){return Dn(e)}function So(e){if(e===null||e.trim().length===0)return{};let t=JSON.parse(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error("MCP config root must be a JSON object");return t}function qb(e,t){let r=e.mcpServers,o=r&&typeof r=="object"&&!Array.isArray(r)?{...r}:{};return o.nativesoul={command:t.command,args:t.args,...t.env&&Object.keys(t.env).length>0?{env:t.env}:{}},{...e,mcpServers:o}}function Gb(e){if(e===null)return null;let t=So(e),r=t.mcpServers;if(!r||typeof r!="object"||Array.isArray(r)||!Object.hasOwn(r,"nativesoul"))return e;let o={...r};return delete o.nativesoul,Ap({...t,mcpServers:o})}function gi(e){let t=e.mcpServers;if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t.nativesoul;return!r||typeof r!="object"||Array.isArray(r)?null:r}async function Kb(e,t,r){if(e!=="claude"||r===null||X.resolve(r)===t||!ht(r))return null;try{let o=So(await br(r,"utf8")),n=gi(o);if(!n)return null;if(ht(t)){let a=So(await br(t,"utf8")),s=gi(a);if(s&&JSON.stringify(Rp(s))===JSON.stringify(Rp(n)))return null}}catch{return null}return{code:"LEGACY_MCP_PATH",severity:"warn",message:`Legacy Claude MCP registration detected at ${r}.`,remediation:"Migrate to ~/.claude.json with nativesoul mcp install --host claude --apply, then uninstall or roll back the legacy ~/.claude/mcp.json entry."}}function Rp(e){return{command:typeof e.command=="string"?e.command:null,args:Array.isArray(e.args)?e.args.filter(t=>typeof t=="string"):[]}}function zb(e,t,r){let o=[],n=Xb(e);if(!n)return o.push({code:"NATIVESOUL_MCP_COMMAND_UNRESOLVED",severity:"error",message:`nativesoul MCP command does not resolve to an executable: ${e}`,remediation:"Reinstall with NATIVESOUL_MCP_COMMAND set to an absolute nativesoul-mcp path, or run npm install -g nativesoul and retry."}),{ok:!1,issues:o};if(Yb(e,n)){let a=t[0],s=a?X.isAbsolute(a)?a:X.resolve(X.dirname(r),a):null;if(!s||!ht(s))return o.push({code:"NATIVESOUL_MCP_NODE_SCRIPT_MISSING",severity:"error",message:"nativesoul MCP command uses node but the server script is missing.",remediation:"Re-run nativesoul mcp install with --command-mode absolute or rebuild the local package."}),{ok:!1,issues:o}}return{ok:!0,issues:o}}function Xb(e){if(X.isAbsolute(e))return Sp(e)?e:null;let t=(process.env.PATH??"").split(X.delimiter).filter(Boolean),r=process.platform==="win32"?(process.env.PATHEXT??".EXE;.CMD;.BAT").split(";"):[""];for(let o of t)for(let n of r){let a=X.join(o,`${e}${n}`);if(Sp(a))return a}return null}function Sp(e){if(process.platform==="win32"&&ht(e))return!0;try{return Vb(e,Wb.X_OK),!0}catch{return!1}}function Yb(e,t){let r=X.basename(e).toLowerCase(),o=X.basename(t).toLowerCase();return r==="node"||r==="node.exe"||o==="node"||o==="node.exe"}function Ap(e){return`${JSON.stringify(e,null,2)}
|
|
922
922
|
`}function Qb(e,t){return e===t?"noop":e===null||e.trim().length===0?"create":"update"}async function Ep(e,t,r,o,n,a){let s=X.join(e,"backups","mcp-registration");await Kn(s,{recursive:!0,mode:448});let i=new Date().toISOString(),l={id:T("snapshot"),host:t,targetPath:r,beforeExists:o,beforeContent:n,beforeHash:n===null?null:E(n),afterHash:a,createdAt:i},c=X.join(s,`${i.replaceAll(/[:.]/gu,"-")}-${t}.json`);return await zn(c,JSON.stringify(l,null,2),{encoding:"utf8",mode:384}),c}function Pp(e,t){return e===t?"No changes.":[`before: ${e===null?"missing":E(e)}`,`after: ${t===null?"missing":E(t)}`,`lines_before: ${e===null?0:e.split(/\r?\n/u).length}`,`lines_after: ${t===null?0:t.split(/\r?\n/u).length}`].join(`
|
|
923
|
-
`)}async function yt(e){let t=await v(e.home),r=e.surface??null,o=yo(e.host,r),n=e.hostConfigRoot??(e.targetRoot?Ye(e.host,e.targetRoot):void 0),a=await rv({host:e.host,surface:o,targetRoot:e.targetRoot,explicit:e.pluginEnabled}),s=new Date().toISOString(),i=ev(e.mode,r,e.heartbeat),l=await It(e.host).scheduleReconcile({kind:"heartbeat",mode:e.mode,enabled:!0,surface:e.surface??void 0,apply:e.apply,hostConfigRoot:n,desired:i}),c={id:ov(e.host,e.surface),host:e.host,mode:e.mode,enabled:!0,native_schedule_supported:l.status==="ok",native_id:l.status==="ok"?l.nativeId??null:null,desired:i,updated_at:s},d=e.apply?Zb(t.database,c):c,p={dryRun:!e.apply,applied:e.apply,schedule:d,adapter_result:l,warnings:tv(e.host,l.status,a)};return await h({home:t.home,type:e.apply?"schedule_reconciled":"schedule_reconcile_dry_run",details:{host:e.host,surface:e.surface??null,mode:e.mode,schedule_id:c.id,adapter_status:l.status,native_schedule_supported:c.native_schedule_supported}}),p}async function Po(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await A(t.database))return[];let r=_(t.database,{readOnly:e.readOnly});try{return r.listSchedules({host:e.host,limit:Math.min(Math.max(e.limit??50,1),200)})}finally{r.close()}}async function yi(e){let t=await v(e.home),r=_(t.database),o,n;try{if(o=r.listSchedules({limit:200}).find(a=>a.id===e.id),!o)throw new Error(`Schedule not found: ${e.id}`);n=e.apply?r.disableSchedule(e.id,new Date().toISOString()):o}finally{r.close()}if(!n)throw new Error(`Schedule not found after disable: ${e.id}`);return await h({home:t.home,type:e.apply?"schedule_disabled":"schedule_disable_dry_run",details:{schedule_id:e.id,host:n.host,mode:n.mode}}),{dryRun:!e.apply,applied:e.apply,schedule:e.apply?n:{...n,enabled:!1}}}function Zb(e,t){let r=_(e);try{return r.upsertSchedule(t)}finally{r.close()}}function ev(e,t,r){return{kind:"heartbeat",mode:e,policy:"read_only",silent_ack:"HEARTBEAT_OK",skill:"life:heartbeat",cadence:r?.cadence??"daily",skip_when_busy:r?.skipWhenBusy??!0,project_scope:r?.projectScope??"current-project",behavior:r?.behavior??"read_only",...t&&t!=="default"?{surface:t}:{}}}function tv(e,t,r){return t!=="unsupported"?[]:ro(e)?r===!1?["NATIVE_SCHEDULE_UNSUPPORTED_NO_FALLBACK_INSTALLED"]:["NATIVE_SCHEDULE_UNSUPPORTED"]:[]}async function rv(e){if(e.explicit!==void 0)return e.explicit;try{let t=De(e.host,e.surface,e.targetRoot);return(await ft({host:e.host,surface:e.surface,targetPath:t})).enabled}catch{return!1}}function ov(e,t){return mu(e)&&t&&t!=="default"?`schedule:${e}:heartbeat:${t}`:`schedule:${e}:heartbeat`}function _i(e){let t=e.observedAt??new Date().toISOString(),r=e.plugin.enabled&&["native-plugin","official-extension"].includes(e.plugin.package_kind),o=e.plugin.native_hooks_supported&&e.plugin.hook_registered,n=e.mcpRegistration.configured,a=e.schedules.some(y=>av(y,t)),s=cv(e.capabilities,e.adapterDiagnostics),i=[xo("native_package",r,t,e.plugin.targetPath??e.plugin.package_kind,"Native package/extension is not installed or enabled."),xo("native_hooks",o,t,e.plugin.targetPath??e.plugin.package_kind,"Native lifecycle hook registration is missing."),xo("mcp",n,t,e.mcpRegistration.targetPath,"MCP registration is missing or invalid."),xo("native_scheduler",a,t,iv(e.schedules),dv(e.host,e.schedules)),xo("official_inventory",s,t,lv(e.capabilities),"Official non-degraded capability inventory evidence is missing.")],l=i.filter(y=>!y.satisfied).map(y=>y.requirement),c=r&&o&&n,d=!s,p=l.includes("native_scheduler")&&xp(e.host),g=l.length===0;return{schema_version:1,host:e.host,surface:e.surface,status:uv({fullNative:g,blockedByHost:p,degradedScan:d,ready:c}),ready:c,full_native:g,blocked_by_host:p,degraded_scan:d,generated_at:t,requirements:i,missing_requirements:l}}function bi(e){return e.ready&&e.native_kind.includes("native")&&(e.schema_hash?.startsWith("full-native:")===!0||e.source.includes("full-native-evidence:"))}function xo(e,t,r,o,n){return{requirement:e,satisfied:t,evidence:t?[{source_kind:"doctor",reference:o,observed_at:r,confidence:nv(o)}]:[],missing_reason:t?null:n}}function nv(e){return e.startsWith("not-applicable:")||e==="missing"?"low":"medium"}function av(e,t){return e.enabled&&e.native_schedule_supported&&e.native_id!==null&&!sv(e.updated_at,t)}function sv(e,t){if(!e)return!1;let r=Date.parse(e),o=Date.parse(t);return!Number.isFinite(r)||!Number.isFinite(o)?!0:o-r>10080*60*1e3}function iv(e){let t=e.find(r=>r.native_id!==null);return t?.native_id?t.updated_at?`${t.native_id}@${t.updated_at}`:t.native_id:"missing"}function lv(e){return e.find(t=>t.ready)?.source??"missing"}function cv(e,t){return t.some(r=>r.severity==="error"||r.severity==="warn")?!1:e.some(r=>r.ready&&r.schema_hash?.startsWith("official:")===!0)}function dv(e,t){return xp(e)?e==="claude"?"Claude local Scheduled Tasks proof is missing, UI-only, or cloud-routine-only for this surface.":e==="antigravity"?"Antigravity scheduler write/list/status/cancel contract proof is missing or stale.":`Host ${e} has no proven native scheduler support.`:t.some(r=>r.enabled)?"Enabled schedule uses fallback or has no native_id mapping.":"No enabled native schedule evidence is available."}function xp(e){return e==="codex"||e==="claude"||e==="grok"||e==="gemini"||e==="antigravity"}function uv(e){return e.fullNative?"full_native":e.blockedByHost?"blocked_by_host":e.degradedScan?"degraded_scan":e.ready?"ready_fallback":"ready"}async function Ip(e){let t=_r(e.host,e.targetRoot,e.surface),r=t.managedBlock??`not-applicable:${Bt(e.host,e.surface)}`,o=t.managedBlock?await Xd({host:e.host,targetPath:r}):wv(e.host,e.surface),n=await Eo({host:e.host,targetPath:t.mcpRegistration,checkCommand:e.targetRoot===void 0}),a=await ft({host:e.host,surface:e.surface,targetPath:t.plugin}),s=await Ws({home:e.home,host:e.host}),l=(e.databaseExists?await Po({home:e.home,host:e.host,limit:200,readOnly:!0}):[]).filter(R=>fv(e.host,e.surface,R)),c=e.databaseExists?await Ee({home:e.home,host:e.host,limit:100,readOnly:!0}):[],d=e.databaseExists?Hn(f(e.home).database):[],p=e.targetRoot!==void 0,g=p?[]:(await qr(e.host))[0]?.diagnostics??[],y=l.length===0&&e.databaseExists?[{code:"SCHEDULE_DESIRED_STATE_MISSING",severity:"warn",message:`No persisted schedule desired state found for ${e.host}.`,remediation:e.targetRoot?`Run nativesoul install --host ${e.host} --apply --target-root ${e.targetRoot}`:"Run nativesoul install --host <host> --apply"}]:[],k=s.stale?[{code:"HANDSHAKE_STALE",severity:"warn",message:`Last ${e.host} handshake is ${s.age_hours??"unknown"} hour(s) old.`,remediation:`Run nativesoul bootstrap --host ${e.host} --cwd <current-working-directory> --format inject`}]:[],S=await _v({host:e.host,managedBlock:o,handshake:s}),U=await bv(e.host),ae=l.filter(R=>R.enabled&&R.native_schedule_supported&&R.native_id===null).map(R=>({code:"NATIVE_SCHEDULE_MAPPING_MISSING",severity:"warn",message:`Schedule ${R.id} reports native support but has no native_id mapping.`,remediation:e.targetRoot?`Run nativesoul schedule reconcile --host ${e.host} --apply --target-root ${e.targetRoot}`:`Run nativesoul schedule reconcile --host ${e.host} --apply`})),ve=l.filter(R=>R.enabled&&!R.native_schedule_supported&&!a.enabled&&a.package_kind!=="unsupported-native").map(R=>({code:"NATIVE_SCHEDULE_UNSUPPORTED_NO_FALLBACK_INSTALLED",severity:"warn",message:`Schedule ${R.id} has no native scheduler support and no NativeSoul package fallback is installed.`,remediation:`Run nativesoul install --host ${e.host} --apply`})),ke=yv({managedBlock:o,mcpRegistration:n,plugin:a,schedules:l,capabilities:c}),nt=_i({host:e.host,surface:e.surface,mcpRegistration:n,plugin:a,schedules:l,capabilities:c,adapterDiagnostics:g}),Ue=[...o.issues,...n.issues,...a.issues,...g,...y,...k,...S,...U,...ae,...ve];return{host:e.host,surface:e.surface,status:Ue.some(R=>R.severity==="error"||R.severity==="warn")?"degraded":"ready",targets:{managed_block:r,mcp_registration:n.targetPath},native_adapter_diagnostics_skipped:p,adapter_diagnostics:g,managed_block:o,mcp_registration:n,plugin:a,provider_parity:ke,full_native_evidence:nt,handshake:s,schedule_count:l.length,enabled_schedule_count:l.filter(R=>R.enabled).length,native_schedule_mappings:l.map(R=>({id:R.id,native_schedule_supported:R.native_schedule_supported,native_id:R.native_id})),capability_count:c.length,ready_capability_count:c.filter(R=>R.ready).length,cross_host_inventory_summary:{current_host:c.length,other_hosts:d.filter(R=>R.host!==e.host&&R.host!=="all").length,ready_other_hosts:d.filter(R=>R.host!==e.host&&R.host!=="all"&&R.ready).length},issues:Ue}}function fv(e,t,r){return e!=="claude"?!0:hv(r.desired)===t}function hv(e){if(e&&typeof e=="object"&&!Array.isArray(e)&&"surface"in e){let t=e.surface;if(t==="claude-desktop"||t==="claude-code")return t}return"claude-code"}function yv(e){let t=e.plugin.enabled,r=e.mcpRegistration.configured,o=e.managedBlock.configured||t,n=e.schedules.some(p=>p.enabled),s=e.schedules.some(p=>p.enabled&&p.native_schedule_supported)?"native":n&&t?"official-fallback":"unsupported-native",i=e.plugin.native_hooks_supported?e.plugin.hook_registered?"native":"unsupported-native":t?"official-fallback":"unsupported-native",l=e.plugin.package_kind==="unsupported-native"?"unsupported-native":t?"ready":"degraded",c=e.capabilities.length===0||e.capabilities.some(p=>p.ready);return{level:o&&r&&l==="ready"&&i!=="unsupported-native"&&s!=="unsupported-native"?"ready":e.plugin.package_kind==="native-plugin"?"native":e.plugin.package_kind==="unsupported-native"?"unsupported-native":"official-fallback",bootstrap:o?"ready":"degraded",mcp:r?"ready":"degraded",package:l,hooks:i,memory_recall:r?"ready":"degraded",policy_guard:o?"ready":"degraded",capability_scan:c?"ready":"degraded",heartbeat:s}}async function _v(e){if(!e.managedBlock.configured||e.managedBlock.targetPath.startsWith("not-applicable:"))return[];let t=10080*60*1e3,r=await kv(e.managedBlock.targetPath),o=e.handshake.age_ms;return r!==null&&r<=t?[]:o!==null&&o<=t?[]:[{code:"HANDSHAKE_NOT_OBSERVED",severity:"warn",message:`NativeSoul managed block is present for ${e.host}, but no handshake was observed in the last 7 days.`,remediation:`Start a host session or run nativesoul bootstrap --host ${e.host} --cwd <current-working-directory> --format inject`}]}async function bv(e){let t=vv(e).map(r=>jp.resolve(process.cwd(),r));for(let r of t){if(!pv(r))continue;let o=await mv(r,"utf8"),n=lo(o);if(n>2e3)return[{code:"PROJECT_CONTEXT_HEAVY",severity:"info",message:`Project instruction file is heavy (${n} estimated tokens): ${r}`,remediation:"Keep project rules authoritative for code boundaries; NativeSoul persona remains advisory continuity."}]}return[]}function vv(e){switch(e){case"claude":return["CLAUDE.md",jp.join(".claude","CLAUDE.md")];case"codex":return["AGENTS.md"];case"grok":return["Agents.md","AGENTS.md"];case"antigravity":case"gemini":return["GEMINI.md"]}}async function kv(e){try{let t=await gv(e);return Math.max(Date.now()-t.mtimeMs,0)}catch{return null}}function wv(e,t){return{host:e,targetPath:`not-applicable:${Bt(e,t)}`,target_exists:!1,configured:!0,markers_valid:!0,issues:[]}}async function Kt(e){let t=f(e.home),r=await ho(e.home),o=vi(t.database),n=qe(e.host),a=[],s=o?Hn(t.database):[],i=Yu(t.database,o),l=await it(t.home),c=vi(In(t.home)),d=vi(dr(t.home));for(let y of n)for(let k of Ke(y,e.surface))a.push(await Ip({home:t.home,host:y,surface:k,targetRoot:e.targetRoot,databaseExists:o}));let p=[...r.issues,...Qu(i),...a.flatMap(y=>y.issues)],g=r.healthy&&!p.some(y=>y.severity==="error");return{home:t.home,healthy:g,status:p.some(y=>y.severity==="error"||y.severity==="warn")?"degraded":"ready",workspace:r,target_root:e.targetRoot?Tp.resolve(e.targetRoot):null,cross_host_inventory:Zu(s),activation_summary:Wu({home:t.home,targetRoot:e.targetRoot?Tp.resolve(e.targetRoot):null,host:e.host,profile:l,onboardingComplete:c,activationComplete:d,hosts:a}),full_native_matrix:Sv(a),semantic_index:i,hosts:a,issues:p}}function Sv(e){let t=e.map(r=>({host:r.host,surface:r.surface,status:r.full_native_evidence.status,full_native:r.full_native_evidence.full_native,blocked_by_host:r.full_native_evidence.blocked_by_host,degraded_scan:r.full_native_evidence.degraded_scan,missing_requirements:r.full_native_evidence.missing_requirements}));return{require_full_native_ready:t.length>0&&t.every(r=>r.full_native),host_count:t.length,full_native_count:t.filter(r=>r.full_native).length,blocked_count:t.filter(r=>r.blocked_by_host).length,degraded_scan_count:t.filter(r=>r.degraded_scan).length,ready_fallback_count:t.filter(r=>r.status==="ready_fallback").length,hosts:t}}import{existsSync as Rv}from"node:fs";import{mkdir as Av,readdir as Ev,readFile as Pv,writeFile as xv}from"node:fs/promises";import jo from"node:path";async function ki(e){let t=e.apply===!0,r=t?f((await v(e.home)).home):f(e.home),o=e.project??L(e.cwd??process.cwd(),r.home),n=Math.min(Math.max(e.limit??10,1),50),a=await jv(r.home,r.database,o,n),s=Tv(o,a,n),i=Nv({applied:t,project:o,proposals:s,dailyNotes:a.dailyNotes,candidates:a.candidates,activeMemories:a.activeMemories,auditEvents:a.auditEvents}),l=null;return t&&(l=await Cv(r.home,i),await Ov(r.home,s),await h({home:r.home,type:"memory_reflection_run",details:{project:o,proposal_count:s.length,report_path:l,daily_notes:a.dailyNotes.length,candidates:a.candidates.length,active_memories:a.activeMemories.length,audit_events:a.auditEvents.length}})),{applied:t,home:r.home,project:o,report:i,report_path:l,proposals:s,sources:{daily_notes:a.dailyNotes.length,candidates:a.candidates.length,active_memories:a.activeMemories.length,audit_events:a.auditEvents.length},protected_files:["SOUL.md","POLICY.md","standing-orders"].map(c=>({path:jo.join(r.home,c),modified:!1}))}}async function jv(e,t,r,o){let n=await Iv(e,o);if(!Rv(t))return{dailyNotes:n,candidates:[],activeMemories:[],auditEvents:[]};let a=_(t,{readOnly:!0});try{return{dailyNotes:n,candidates:a.listMemories({project:r,status:"candidate",includeForgotten:!1,limit:o}),activeMemories:a.listMemories({project:r,status:"active",includeForgotten:!1,limit:Math.max(o,20)}),auditEvents:a.listEvents({limit:Math.max(o,20)})}}finally{a.close()}}async function Iv(e,t){let r=jo.join(e,"memory","daily");if(!await A(r))return[];let n=(await Ev(r,{withFileTypes:!0})).filter(s=>s.isFile()&&s.name.endsWith(".md")).map(s=>s.name).sort().reverse().slice(0,t),a=[];for(let s of n){let i=jo.join(r,s),l=N(await Pv(i,"utf8")).value.trim();l.length>0&&a.push({id:`daily:${s}`,path:i,text:l})}return a}function Tv(e,t,r){let o=[];for(let n of t.candidates){let a=Cp(n.content,t.activeMemories),s=Lv(n.content,t.activeMemories);if(s){o.push(vr({action:"flag_conflict",project:e,summary:`Review conflict between ${n.id} and ${s.id}`,before:s.summary,after:n.summary,evidence:[n.id,s.id],risk:"high"}));continue}if(a&&a.score>=.7){o.push(vr({action:"deduplicate",project:e,summary:`Reject or merge duplicate candidate ${n.id}`,before:a.memory.summary,after:n.summary,evidence:[n.id,a.memory.id],risk:"medium"}));continue}o.push(vr({action:"promote_candidate",project:e,summary:`Promote candidate ${n.id} after human review`,before:"Candidate memory is not durable yet.",after:n.summary,evidence:[n.id],risk:"low"}))}for(let n of t.dailyNotes){let a=Mv(n.text);for(let s of a){if(o.length>=r)return o;let i=Cp(s,[...t.activeMemories,...t.candidates]);i&&i.score>=.7?o.push(vr({action:"deduplicate",project:e,summary:`Daily note repeats existing memory ${i.memory.id}`,before:i.memory.summary,after:Ge(s),evidence:[n.id,i.memory.id],risk:"medium"})):o.push(vr({action:"create_candidate",project:e,summary:Ge(s),before:"No durable memory exists for this daily note.",after:s,evidence:[n.id],risk:"low"}))}}for(let n of t.activeMemories)if(n.expires_at&&Date.parse(n.expires_at)<=Date.now()&&o.push(vr({action:"expire_active",project:e,summary:`Expire active memory ${n.id}`,before:n.summary,after:"Memory should move to expired after human review.",evidence:[n.id],risk:"medium"})),o.length>=r)return o;return o.slice(0,r)}function vr(e){return{id:T("reflection"),persisted_memory_id:null,...e}}async function Cv(e,t){let r=jo.join(e,"proposals");await Av(r,{recursive:!0,mode:448});let o=jo.join(r,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-reflection.md`);return await xv(o,t,{encoding:"utf8",mode:384,flag:"wx"}),o}async function Ov(e,t){for(let r of t.filter(o=>o.action==="create_candidate")){let o=await ee(e,{project:r.project,content:["Reflection consolidation candidate.","",r.after,"",`Evidence: ${r.evidence.join(", ")}`].join(`
|
|
923
|
+
`)}async function yt(e){let t=await v(e.home),r=e.surface??null,o=yo(e.host,r),n=e.hostConfigRoot??(e.targetRoot?Ye(e.host,e.targetRoot):void 0),a=await rv({host:e.host,surface:o,targetRoot:e.targetRoot,explicit:e.pluginEnabled}),s=new Date().toISOString(),i=ev(e.mode,r,e.heartbeat),l=await It(e.host).scheduleReconcile({kind:"heartbeat",mode:e.mode,enabled:!0,surface:e.surface??void 0,apply:e.apply,hostConfigRoot:n,desired:i}),c={id:ov(e.host,e.surface),host:e.host,mode:e.mode,enabled:!0,native_schedule_supported:l.status==="ok",native_id:l.status==="ok"?l.nativeId??null:null,desired:i,updated_at:s},d=e.apply?Zb(t.database,c):c,p={dryRun:!e.apply,applied:e.apply,schedule:d,adapter_result:l,warnings:tv(e.host,l.status,a)};return await h({home:t.home,type:e.apply?"schedule_reconciled":"schedule_reconcile_dry_run",details:{host:e.host,surface:e.surface??null,mode:e.mode,schedule_id:c.id,adapter_status:l.status,native_schedule_supported:c.native_schedule_supported}}),p}async function Po(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await A(t.database))return[];let r=_(t.database,{readOnly:e.readOnly});try{return r.listSchedules({host:e.host,limit:Math.min(Math.max(e.limit??50,1),200)})}finally{r.close()}}async function yi(e){let t=await v(e.home),r=_(t.database),o,n;try{if(o=r.listSchedules({limit:200}).find(a=>a.id===e.id),!o)throw new Error(`Schedule not found: ${e.id}`);n=e.apply?r.disableSchedule(e.id,new Date().toISOString()):o}finally{r.close()}if(!n)throw new Error(`Schedule not found after disable: ${e.id}`);return await h({home:t.home,type:e.apply?"schedule_disabled":"schedule_disable_dry_run",details:{schedule_id:e.id,host:n.host,mode:n.mode}}),{dryRun:!e.apply,applied:e.apply,schedule:e.apply?n:{...n,enabled:!1}}}function Zb(e,t){let r=_(e);try{return r.upsertSchedule(t)}finally{r.close()}}function ev(e,t,r){return{kind:"heartbeat",mode:e,policy:"read_only",silent_ack:"HEARTBEAT_OK",skill:"life:heartbeat",cadence:r?.cadence??"daily",skip_when_busy:r?.skipWhenBusy??!0,project_scope:r?.projectScope??"current-project",behavior:r?.behavior??"read_only",...t&&t!=="default"?{surface:t}:{}}}function tv(e,t,r){return t!=="unsupported"?[]:ro(e)?r===!1?["NATIVE_SCHEDULE_UNSUPPORTED_NO_FALLBACK_INSTALLED"]:["NATIVE_SCHEDULE_UNSUPPORTED"]:[]}async function rv(e){if(e.explicit!==void 0)return e.explicit;try{let t=De(e.host,e.surface,e.targetRoot);return(await ft({host:e.host,surface:e.surface,targetPath:t})).enabled}catch{return!1}}function ov(e,t){return mu(e)&&t&&t!=="default"?`schedule:${e}:heartbeat:${t}`:`schedule:${e}:heartbeat`}function _i(e){let t=e.observedAt??new Date().toISOString(),r=e.plugin.enabled&&["native-plugin","official-extension"].includes(e.plugin.package_kind),o=e.plugin.native_hooks_supported&&e.plugin.hook_registered,n=e.mcpRegistration.configured,a=e.schedules.some(y=>av(y,t)),s=cv(e.capabilities,e.adapterDiagnostics),i=[xo("native_package",r,t,e.plugin.targetPath??e.plugin.package_kind,"Native package/extension is not installed or enabled."),xo("native_hooks",o,t,e.plugin.targetPath??e.plugin.package_kind,"Native lifecycle hook registration is missing."),xo("mcp",n,t,e.mcpRegistration.targetPath,"MCP registration is missing or invalid."),xo("native_scheduler",a,t,iv(e.schedules),dv(e.host,e.schedules)),xo("official_inventory",s,t,lv(e.capabilities),"Official non-degraded capability inventory evidence is missing.")],l=i.filter(y=>!y.satisfied).map(y=>y.requirement),c=r&&o&&n,d=!s,p=l.includes("native_scheduler")&&xp(e.host),g=l.length===0;return{schema_version:1,host:e.host,surface:e.surface,status:uv({fullNative:g,blockedByHost:p,degradedScan:d,ready:c}),ready:c,full_native:g,blocked_by_host:p,degraded_scan:d,generated_at:t,requirements:i,missing_requirements:l}}function bi(e){return e.ready&&e.native_kind.includes("native")&&(e.schema_hash?.startsWith("full-native:")===!0||e.source.includes("full-native-evidence:"))}function xo(e,t,r,o,n){return{requirement:e,satisfied:t,evidence:t?[{source_kind:"doctor",reference:o,observed_at:r,confidence:nv(o)}]:[],missing_reason:t?null:n}}function nv(e){return e.startsWith("not-applicable:")||e==="missing"?"low":"medium"}function av(e,t){return e.enabled&&e.native_schedule_supported&&e.native_id!==null&&!sv(e.updated_at,t)}function sv(e,t){if(!e)return!1;let r=Date.parse(e),o=Date.parse(t);return!Number.isFinite(r)||!Number.isFinite(o)?!0:o-r>10080*60*1e3}function iv(e){let t=e.find(r=>r.native_id!==null);return t?.native_id?t.updated_at?`${t.native_id}@${t.updated_at}`:t.native_id:"missing"}function lv(e){return e.find(t=>t.ready)?.source??"missing"}function cv(e,t){return t.some(r=>r.severity==="error"||r.severity==="warn")?!1:e.some(r=>r.ready&&r.schema_hash?.startsWith("official:")===!0)}function dv(e,t){return xp(e)?e==="claude"?"Claude local Scheduled Tasks proof is missing, UI-only, or cloud-routine-only for this surface.":e==="antigravity"?"Antigravity scheduler write/list/status/cancel contract proof is missing or stale.":`Host ${e} has no proven native scheduler support.`:t.some(r=>r.enabled)?"Enabled schedule uses fallback or has no native_id mapping.":"No enabled native schedule evidence is available."}function xp(e){return e==="codex"||e==="claude"||e==="grok"||e==="gemini"||e==="antigravity"}function uv(e){return e.fullNative?"full_native":e.blockedByHost?"blocked_by_host":e.degradedScan?"degraded_scan":e.ready?"ready_fallback":"ready"}async function Ip(e){let t=_r(e.host,e.targetRoot,e.surface),r=t.managedBlock??`not-applicable:${Bt(e.host,e.surface)}`,o=t.managedBlock?await Xd({host:e.host,targetPath:r}):wv(e.host,e.surface),n=await Eo({host:e.host,targetPath:t.mcpRegistration,checkCommand:e.targetRoot===void 0}),a=await ft({host:e.host,surface:e.surface,targetPath:t.plugin}),s=await Ws({home:e.home,host:e.host}),l=(e.databaseExists?await Po({home:e.home,host:e.host,limit:200,readOnly:!0}):[]).filter(S=>fv(e.host,e.surface,S)),c=e.databaseExists?await Ee({home:e.home,host:e.host,limit:100,readOnly:!0}):[],d=e.databaseExists?Hn(f(e.home).database):[],p=e.targetRoot!==void 0,g=p?[]:(await qr(e.host))[0]?.diagnostics??[],y=l.length===0&&e.databaseExists?[{code:"SCHEDULE_DESIRED_STATE_MISSING",severity:"warn",message:`No persisted schedule desired state found for ${e.host}.`,remediation:e.targetRoot?`Run nativesoul install --host ${e.host} --apply --target-root ${e.targetRoot}`:"Run nativesoul install --host <host> --apply"}]:[],k=s.stale?[{code:"HANDSHAKE_STALE",severity:"warn",message:`Last ${e.host} handshake is ${s.age_hours??"unknown"} hour(s) old.`,remediation:`Run nativesoul bootstrap --host ${e.host} --cwd <current-working-directory> --format inject`}]:[],R=await _v({host:e.host,managedBlock:o,handshake:s}),U=await bv(e.host),ae=l.filter(S=>S.enabled&&S.native_schedule_supported&&S.native_id===null).map(S=>({code:"NATIVE_SCHEDULE_MAPPING_MISSING",severity:"warn",message:`Schedule ${S.id} reports native support but has no native_id mapping.`,remediation:e.targetRoot?`Run nativesoul schedule reconcile --host ${e.host} --apply --target-root ${e.targetRoot}`:`Run nativesoul schedule reconcile --host ${e.host} --apply`})),ve=l.filter(S=>S.enabled&&!S.native_schedule_supported&&!a.enabled&&a.package_kind!=="unsupported-native").map(S=>({code:"NATIVE_SCHEDULE_UNSUPPORTED_NO_FALLBACK_INSTALLED",severity:"warn",message:`Schedule ${S.id} has no native scheduler support and no NativeSoul package fallback is installed.`,remediation:`Run nativesoul install --host ${e.host} --apply`})),ke=yv({managedBlock:o,mcpRegistration:n,plugin:a,schedules:l,capabilities:c}),nt=_i({host:e.host,surface:e.surface,mcpRegistration:n,plugin:a,schedules:l,capabilities:c,adapterDiagnostics:g}),Ue=[...o.issues,...n.issues,...a.issues,...g,...y,...k,...R,...U,...ae,...ve];return{host:e.host,surface:e.surface,status:Ue.some(S=>S.severity==="error"||S.severity==="warn")?"degraded":"ready",targets:{managed_block:r,mcp_registration:n.targetPath},native_adapter_diagnostics_skipped:p,adapter_diagnostics:g,managed_block:o,mcp_registration:n,plugin:a,provider_parity:ke,full_native_evidence:nt,handshake:s,schedule_count:l.length,enabled_schedule_count:l.filter(S=>S.enabled).length,native_schedule_mappings:l.map(S=>({id:S.id,native_schedule_supported:S.native_schedule_supported,native_id:S.native_id})),capability_count:c.length,ready_capability_count:c.filter(S=>S.ready).length,cross_host_inventory_summary:{current_host:c.length,other_hosts:d.filter(S=>S.host!==e.host&&S.host!=="all").length,ready_other_hosts:d.filter(S=>S.host!==e.host&&S.host!=="all"&&S.ready).length},issues:Ue}}function fv(e,t,r){return e!=="claude"?!0:hv(r.desired)===t}function hv(e){if(e&&typeof e=="object"&&!Array.isArray(e)&&"surface"in e){let t=e.surface;if(t==="claude-desktop"||t==="claude-code")return t}return"claude-code"}function yv(e){let t=e.plugin.enabled,r=e.mcpRegistration.configured,o=e.managedBlock.configured||t,n=e.schedules.some(p=>p.enabled),s=e.schedules.some(p=>p.enabled&&p.native_schedule_supported)?"native":n&&t?"official-fallback":"unsupported-native",i=e.plugin.native_hooks_supported?e.plugin.hook_registered?"native":"unsupported-native":t?"official-fallback":"unsupported-native",l=e.plugin.package_kind==="unsupported-native"?"unsupported-native":t?"ready":"degraded",c=e.capabilities.length===0||e.capabilities.some(p=>p.ready);return{level:o&&r&&l==="ready"&&i!=="unsupported-native"&&s!=="unsupported-native"?"ready":e.plugin.package_kind==="native-plugin"?"native":e.plugin.package_kind==="unsupported-native"?"unsupported-native":"official-fallback",bootstrap:o?"ready":"degraded",mcp:r?"ready":"degraded",package:l,hooks:i,memory_recall:r?"ready":"degraded",policy_guard:o?"ready":"degraded",capability_scan:c?"ready":"degraded",heartbeat:s}}async function _v(e){if(!e.managedBlock.configured||e.managedBlock.targetPath.startsWith("not-applicable:"))return[];let t=10080*60*1e3,r=await kv(e.managedBlock.targetPath),o=e.handshake.age_ms;return r!==null&&r<=t?[]:o!==null&&o<=t?[]:[{code:"HANDSHAKE_NOT_OBSERVED",severity:"warn",message:`NativeSoul managed block is present for ${e.host}, but no handshake was observed in the last 7 days.`,remediation:`Start a host session or run nativesoul bootstrap --host ${e.host} --cwd <current-working-directory> --format inject`}]}async function bv(e){let t=vv(e).map(r=>jp.resolve(process.cwd(),r));for(let r of t){if(!pv(r))continue;let o=await mv(r,"utf8"),n=lo(o);if(n>2e3)return[{code:"PROJECT_CONTEXT_HEAVY",severity:"info",message:`Project instruction file is heavy (${n} estimated tokens): ${r}`,remediation:"Keep project rules authoritative for code boundaries; NativeSoul persona remains advisory continuity."}]}return[]}function vv(e){switch(e){case"claude":return["CLAUDE.md",jp.join(".claude","CLAUDE.md")];case"codex":return["AGENTS.md"];case"grok":return["Agents.md","AGENTS.md"];case"antigravity":case"gemini":return["GEMINI.md"]}}async function kv(e){try{let t=await gv(e);return Math.max(Date.now()-t.mtimeMs,0)}catch{return null}}function wv(e,t){return{host:e,targetPath:`not-applicable:${Bt(e,t)}`,target_exists:!1,configured:!0,markers_valid:!0,issues:[]}}async function Kt(e){let t=f(e.home),r=await ho(e.home),o=vi(t.database),n=qe(e.host),a=[],s=o?Hn(t.database):[],i=Yu(t.database,o),l=await it(t.home),c=vi(In(t.home)),d=vi(dr(t.home));for(let y of n)for(let k of Ke(y,e.surface))a.push(await Ip({home:t.home,host:y,surface:k,targetRoot:e.targetRoot,databaseExists:o}));let p=[...r.issues,...Qu(i),...a.flatMap(y=>y.issues)],g=r.healthy&&!p.some(y=>y.severity==="error");return{home:t.home,healthy:g,status:p.some(y=>y.severity==="error"||y.severity==="warn")?"degraded":"ready",workspace:r,target_root:e.targetRoot?Tp.resolve(e.targetRoot):null,cross_host_inventory:Zu(s),activation_summary:Wu({home:t.home,targetRoot:e.targetRoot?Tp.resolve(e.targetRoot):null,host:e.host,profile:l,onboardingComplete:c,activationComplete:d,hosts:a}),full_native_matrix:Rv(a),semantic_index:i,hosts:a,issues:p}}function Rv(e){let t=e.map(r=>({host:r.host,surface:r.surface,status:r.full_native_evidence.status,full_native:r.full_native_evidence.full_native,blocked_by_host:r.full_native_evidence.blocked_by_host,degraded_scan:r.full_native_evidence.degraded_scan,missing_requirements:r.full_native_evidence.missing_requirements}));return{require_full_native_ready:t.length>0&&t.every(r=>r.full_native),host_count:t.length,full_native_count:t.filter(r=>r.full_native).length,blocked_count:t.filter(r=>r.blocked_by_host).length,degraded_scan_count:t.filter(r=>r.degraded_scan).length,ready_fallback_count:t.filter(r=>r.status==="ready_fallback").length,hosts:t}}import{existsSync as Sv}from"node:fs";import{mkdir as Av,readdir as Ev,readFile as Pv,writeFile as xv}from"node:fs/promises";import jo from"node:path";async function ki(e){let t=e.apply===!0,r=t?f((await v(e.home)).home):f(e.home),o=e.project??L(e.cwd??process.cwd(),r.home),n=Math.min(Math.max(e.limit??10,1),50),a=await jv(r.home,r.database,o,n),s=Tv(o,a,n),i=Nv({applied:t,project:o,proposals:s,dailyNotes:a.dailyNotes,candidates:a.candidates,activeMemories:a.activeMemories,auditEvents:a.auditEvents}),l=null;return t&&(l=await Cv(r.home,i),await Ov(r.home,s),await h({home:r.home,type:"memory_reflection_run",details:{project:o,proposal_count:s.length,report_path:l,daily_notes:a.dailyNotes.length,candidates:a.candidates.length,active_memories:a.activeMemories.length,audit_events:a.auditEvents.length}})),{applied:t,home:r.home,project:o,report:i,report_path:l,proposals:s,sources:{daily_notes:a.dailyNotes.length,candidates:a.candidates.length,active_memories:a.activeMemories.length,audit_events:a.auditEvents.length},protected_files:["SOUL.md","POLICY.md","standing-orders"].map(c=>({path:jo.join(r.home,c),modified:!1}))}}async function jv(e,t,r,o){let n=await Iv(e,o);if(!Sv(t))return{dailyNotes:n,candidates:[],activeMemories:[],auditEvents:[]};let a=_(t,{readOnly:!0});try{return{dailyNotes:n,candidates:a.listMemories({project:r,status:"candidate",includeForgotten:!1,limit:o}),activeMemories:a.listMemories({project:r,status:"active",includeForgotten:!1,limit:Math.max(o,20)}),auditEvents:a.listEvents({limit:Math.max(o,20)})}}finally{a.close()}}async function Iv(e,t){let r=jo.join(e,"memory","daily");if(!await A(r))return[];let n=(await Ev(r,{withFileTypes:!0})).filter(s=>s.isFile()&&s.name.endsWith(".md")).map(s=>s.name).sort().reverse().slice(0,t),a=[];for(let s of n){let i=jo.join(r,s),l=N(await Pv(i,"utf8")).value.trim();l.length>0&&a.push({id:`daily:${s}`,path:i,text:l})}return a}function Tv(e,t,r){let o=[];for(let n of t.candidates){let a=Cp(n.content,t.activeMemories),s=Lv(n.content,t.activeMemories);if(s){o.push(vr({action:"flag_conflict",project:e,summary:`Review conflict between ${n.id} and ${s.id}`,before:s.summary,after:n.summary,evidence:[n.id,s.id],risk:"high"}));continue}if(a&&a.score>=.7){o.push(vr({action:"deduplicate",project:e,summary:`Reject or merge duplicate candidate ${n.id}`,before:a.memory.summary,after:n.summary,evidence:[n.id,a.memory.id],risk:"medium"}));continue}o.push(vr({action:"promote_candidate",project:e,summary:`Promote candidate ${n.id} after human review`,before:"Candidate memory is not durable yet.",after:n.summary,evidence:[n.id],risk:"low"}))}for(let n of t.dailyNotes){let a=Mv(n.text);for(let s of a){if(o.length>=r)return o;let i=Cp(s,[...t.activeMemories,...t.candidates]);i&&i.score>=.7?o.push(vr({action:"deduplicate",project:e,summary:`Daily note repeats existing memory ${i.memory.id}`,before:i.memory.summary,after:Ge(s),evidence:[n.id,i.memory.id],risk:"medium"})):o.push(vr({action:"create_candidate",project:e,summary:Ge(s),before:"No durable memory exists for this daily note.",after:s,evidence:[n.id],risk:"low"}))}}for(let n of t.activeMemories)if(n.expires_at&&Date.parse(n.expires_at)<=Date.now()&&o.push(vr({action:"expire_active",project:e,summary:`Expire active memory ${n.id}`,before:n.summary,after:"Memory should move to expired after human review.",evidence:[n.id],risk:"medium"})),o.length>=r)return o;return o.slice(0,r)}function vr(e){return{id:T("reflection"),persisted_memory_id:null,...e}}async function Cv(e,t){let r=jo.join(e,"proposals");await Av(r,{recursive:!0,mode:448});let o=jo.join(r,`${new Date().toISOString().replaceAll(/[:.]/gu,"-")}-reflection.md`);return await xv(o,t,{encoding:"utf8",mode:384,flag:"wx"}),o}async function Ov(e,t){for(let r of t.filter(o=>o.action==="create_candidate")){let o=await ee(e,{project:r.project,content:["Reflection consolidation candidate.","",r.after,"",`Evidence: ${r.evidence.join(", ")}`].join(`
|
|
924
924
|
`),confidence:.5,authority:"reflection_proposal",source:{kind:"reflection",proposal_id:r.id,evidence:r.evidence}});r.persisted_memory_id=o.id}}function Nv(e){let t=["# NativeSoul Reflection Report","",`Mode: ${e.applied?"apply":"dry-run"}`,`Project: ${e.project}`,`Generated at: ${new Date().toISOString()}`,"","## Sources","",`- Daily notes: ${e.dailyNotes.length}`,`- Candidate memories: ${e.candidates.length}`,`- Active memories: ${e.activeMemories.length}`,`- Audit events: ${e.auditEvents.length}`,"","## Before","",...e.candidates.map(r=>`- Candidate ${r.id}: ${r.summary}`),...e.activeMemories.slice(0,10).map(r=>`- Active ${r.id}: ${r.summary}`),"","## Proposed After",""];e.proposals.length===0&&t.push("- No consolidation proposal found.");for(let r of e.proposals)t.push(`- ${r.id} [${r.action}] ${r.summary}`),t.push(` - Before: ${r.before}`),t.push(` - After: ${r.after}`),t.push(` - Evidence: ${r.evidence.join(", ")}`),t.push(` - Risk: ${r.risk}`);return t.push("","## Safety","","- SOUL.md, POLICY.md, and standing-orders are not edited by reflection."),t.join(`
|
|
925
925
|
`)}function Mv(e){return e.split(/\r?\n/u).map(t=>t.replace(/^\s*[-*]\s+/u,"").trim()).filter(t=>t.length>=20).filter(t=>!t.startsWith("#")).filter(t=>!/^(date|notes|observations|tasks):?$/iu.test(t)).slice(0,10)}function Cp(e,t){let r=null;for(let o of t){let n=Mp(e,`${o.summary}
|
|
926
926
|
${o.content}`);(!r||n>r.score)&&(r={memory:o,score:n})}return r}function Lv(e,t){let r=Np(e),o=Op(e);for(let n of t)if(Mp(e,`${n.summary}
|
|
927
|
-
${n.content}`)>=.35&&o!==Op(n.content)){let s=Np(n.content);if([...r].some(l=>l.length>4&&s.has(l)))return n}return null}function Op(e){return/\b(nao|não|never|do not|dont|don't|no longer|avoid|evitar|proibir|forbid)\b/iu.test(e)}function Mp(e,t){return Su(e,t,{minLength:3,normalizeDiacritics:!0,removeStopwords:!0})}function Np(e){return so(e,{minLength:3,normalizeDiacritics:!0,removeStopwords:!0})}import{lstat as Dv,readdir as Hv,readFile as $v}from"node:fs/promises";import zt from"node:path";var Lp=new Set([".json",".jsonl",".md",".markdown",".txt"]);async function Ri(e){let t=e.apply===!0,r=f((await v(e.home)).home),o=zt.resolve(e.sourcePath),n=e.project??L(e.cwd??process.cwd(),r.home),a=Math.min(Math.max(e.limit??200,1),1e3),s=[],i=await Dp(o,s),l=[],c=[];for(let k of i){if(l.length>=a){c.push({source_path:k,reason:"limit_reached"});continue}let S=await Fv(k,s);if(S.length===0){c.push({source_path:k,reason:"no_supported_records"});continue}l.push(...S.slice(0,a-l.length))}let d=Jv(l,n),p=qv(d).map(k=>({source_id:k,reason:"duplicate_source_id"})),g=[];if(t)for(let k of d){let S=await ee(r.home,{project:k.target_project,content:k.content,confidence:k.confidence,authority:"openclaw_import",source:{kind:"import",source_system:k.source_system,source_path:k.source_path,source_id:k.source_id,source_hash:k.source_hash,imported_at:new Date().toISOString(),redacted:k.redacted}});k.proposed_memory_id=S.id,g.push(S)}let y={applied:t,source_path:o,files:i,mapped_records:d,skipped_records:c,conflicts:p,redactions:d.filter(k=>k.redacted).length,proposed_scopes:Array.from(new Set(d.map(k=>k.target_project))).sort(),warnings:s,persisted_memories:g};return await h({home:r.home,type:t?"openclaw_import_applied":"openclaw_import_dry_run",details:Kv(y)}),y}async function Dp(e,t){let r;try{r=await Dv(e)}catch{return t.push({code:"OPENCLAW_SOURCE_UNREADABLE",source_path:e,message:"Source path is not readable."}),[]}if(r.isFile())return Lp.has(zt.extname(e).toLowerCase())?[e]:[];if(!r.isDirectory())return t.push({code:"OPENCLAW_SOURCE_UNSUPPORTED",source_path:e,message:"Source path is neither a file nor a directory."}),[];let o=await Hv(e,{withFileTypes:!0});return(await Promise.all(o.map(a=>{let s=zt.join(e,a.name);return a.isDirectory()?Dp(s,t):Promise.resolve(Lp.has(zt.extname(a.name).toLowerCase())?[s]:[])}))).flat().sort()}async function Fv(e,t){let r;try{r=await $v(e,"utf8")}catch{return t.push({code:"OPENCLAW_FILE_UNREADABLE",source_path:e,message:"File could not be read."}),[]}let o=zt.extname(e).toLowerCase();return o===".json"?Uv(e,r,t):o===".jsonl"?Bv(e,r,t):Vv(e,r)}function Uv(e,t,r){let o;try{o=JSON.parse(t)}catch{return r.push({code:"OPENCLAW_JSON_MALFORMED",source_path:e,message:"JSON file is malformed."}),[]}return(Array.isArray(o)?o:Wv(o)??[o]).flatMap((a,s)=>Hp(a,e,s))}function Bv(e,t,r){return t.split(/\r?\n/u).flatMap((o,n)=>{let a=o.trim();if(!a)return[];try{return Hp(JSON.parse(a),e,n)}catch{return r.push({code:"OPENCLAW_JSONL_LINE_MALFORMED",source_path:e,message:`Line ${n+1} is malformed.`}),[]}})}function Vv(e,t){return t.split(/\n(?=#{1,3}\s+)/u).map(r=>r.trim()).filter(r=>r.length>0).map((r,o)=>({id:null,content:r,project:null,confidence:null,sourcePath:e,raw:{kind:"text_section",index:o,source_path:e}}))}function Wv(e){if(!Ai(e))return null;for(let t of["memories","memory","records","items","notes"]){let r=e[t];if(Array.isArray(r))return r}return null}function Hp(e,t,r){if(typeof e=="string"&&e.trim().length>0)return[{id:null,content:e,project:null,confidence:null,sourcePath:t,raw:e}];if(!Ai(e))return[];let o=wi(e,["content","text","summary","memory","note","body","value"]);return o?[{id:wi(e,["id","uid","uuid","key"])??`${zt.basename(t)}:${r+1}`,content:o,project:wi(e,["project","project_id","scope_project","workspace","repo"]),confidence:Gv(e,["confidence","score"]),sourcePath:t,raw:Si(e)}]:[]}function Jv(e,t){return e.map((r,o)=>{let n=N(r.content),a=r.id??`${zt.basename(r.sourcePath)}:${o+1}`;return{source_system:"openclaw",source_path:r.sourcePath,source_id:a,source_hash:zv(r.raw),target_project:r.project?.trim()||t,content:n.value,summary:Ge(n.value),redacted:n.redacted,confidence:Math.min(Math.max(r.confidence??.55,0),1),status:"candidate",proposed_memory_id:null}})}function qv(e){let t=new Map;for(let r of e)t.set(r.source_id,(t.get(r.source_id)??0)+1);return Array.from(t.entries()).filter(([,r])=>r>1).map(([r])=>r).sort()}function wi(e,t){for(let r of t){let o=e[r];if(typeof o=="string"&&o.trim().length>0)return o.trim()}return null}function Gv(e,t){for(let r of t){let o=e[r];if(typeof o=="number"&&Number.isFinite(o))return o}return null}function Kv(e){return{source_path:e.source_path,files:e.files.length,mapped_records:e.mapped_records.length,skipped_records:e.skipped_records.length,conflicts:e.conflicts.length,redactions:e.redactions,persisted_memories:e.persisted_memories.length,proposed_scopes:e.proposed_scopes}}function Si(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?e:Array.isArray(e)?e.map(t=>Si(t)):Ai(e)?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,Si(r)])):String(e)}function Ai(e){return typeof e=="object"&&e!==null}function zv(e){return Se(e)}import{lstat as Xv,readFile as Yv}from"node:fs/promises";import Io from"node:path";var Xt=[".json",".jsonl",".md",".markdown",".txt"];var Qv={nativesoul:{host:"nativesoul",supported_extensions:Xt,documented_inputs:["nativesoul memory export JSON/JSONL","operator-authored Markdown/text memory notes"],unsupported_boundaries:["NativeSoul private SQLite databases","undocumented internal cache files"],limitations:[]},codex:{host:"codex",supported_extensions:Xt,documented_inputs:["operator-provided Codex memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Codex private app stores","Codex cache or thread databases","undocumented internal state"],limitations:["Codex does not expose a NativeSoul-owned private store reader; import requires an explicit user-selected file."]},claude:{host:"claude",supported_extensions:Xt,documented_inputs:["operator-provided Claude memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Claude private settings databases","Claude internal conversation stores","undocumented internal state"],limitations:["Claude import is limited to explicit export or notes files selected by the operator."]},gemini:{host:"gemini",supported_extensions:Xt,documented_inputs:["operator-provided Gemini memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Gemini private app storage","Gemini internal cache files","undocumented internal state"],limitations:["No private Gemini memory database is read; use documented exports or operator-authored files."]},grok:{host:"grok",supported_extensions:Xt,documented_inputs:["operator-provided Grok memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Grok private app storage","Grok internal session stores","undocumented internal state"],limitations:["Grok import is file-only because no native memory store reader is supported."]},antigravity:{host:"antigravity",supported_extensions:Xt,documented_inputs:["operator-provided Antigravity memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Antigravity private workspace state","Antigravity scheduled-task stores","undocumented internal state"],limitations:["Antigravity import is constrained to explicit files; scheduler state is not memory import input."]}};function Zv(e){return Se(e)}async function xi(e){let t=Qv[e.host];if(!t)throw new Error(`Unsupported native host importer: ${String(e.host)}`);let r=e.apply===!0,o=f((await v(e.home)).home),n=Io.resolve(e.sourcePath),a=e.project??L(e.cwd??process.cwd(),o.home),s=Math.min(Math.max(e.limit??200,1),1e3),i=[],l=await ek(e.host,n,i),c=[],d=[];for(let S of l){if(c.length>=s){d.push({source_path:S,reason:"limit_reached"});continue}let U=await tk(e.host,S,i);if(U.length===0){d.push({source_path:S,reason:"no_supported_records"});continue}c.push(...U.slice(0,s-c.length))}let p=ak(e.host,c,a),g=await sk(o.home,p),y=[];if(r)for(let S of p){let U=await ee(o.home,{project:S.target_project,content:S.content,confidence:S.confidence,authority:`${S.source_system}_import`,source:{kind:"import",source_system:S.source_system,source_path:S.source_path,source_id:S.source_id,source_hash:S.source_hash,normalized_content_hash:S.normalized_content_hash,imported_at:new Date().toISOString(),redacted:S.redacted}});S.proposed_memory_id=U.id,y.push(U)}let k={applied:r,host:e.host,source_path:n,registry:t,files:l,mapped_records:p,skipped_records:d,conflicts:g,redactions:p.filter(S=>S.redacted).length,proposed_scopes:Array.from(new Set(p.map(S=>S.target_project))).sort(),approvals_required:["Human review is required before imported candidate memories are promoted."],host_limitations:t.limitations,warnings:i,persisted_memories:y};return await h({home:o.home,type:r?"native_host_import_applied":"native_host_import_dry_run",details:ik(k)}),k}async function ek(e,t,r){let o;try{o=await Xv(t)}catch{return r.push({code:"NATIVE_IMPORT_SOURCE_UNREADABLE",host:e,source_path:t,message:"Source path is not readable."}),[]}return o.isFile()?dk(t)?[t]:(r.push({code:"NATIVE_IMPORT_FILE_UNSUPPORTED",host:e,source_path:t,message:"File extension is not supported by the native host importer registry."}),[]):o.isDirectory()?(r.push({code:"NATIVE_IMPORT_DIRECTORY_UNSUPPORTED",host:e,source_path:t,message:"Native host importers require an explicit file path and do not scan directories."}),[]):o.isDirectory()?[]:(r.push({code:"NATIVE_IMPORT_SOURCE_UNSUPPORTED",host:e,source_path:t,message:"Source path is neither a file nor a directory."}),[])}async function tk(e,t,r){let o;try{o=await Yv(t,"utf8")}catch{return r.push({code:"NATIVE_IMPORT_FILE_UNREADABLE",host:e,source_path:t,message:"File could not be read."}),[]}let n=Io.extname(t).toLowerCase();return n===".json"?rk(e,t,o,r):n===".jsonl"?ok(e,t,o,r):nk(t,o)}function rk(e,t,r,o){let n;try{n=JSON.parse(r)}catch{return o.push({code:"NATIVE_IMPORT_JSON_MALFORMED",host:e,source_path:t,message:"JSON file is malformed."}),[]}return(Array.isArray(n)?n:lk(n)??[n]).flatMap((s,i)=>Fp(s,t,i))}function ok(e,t,r,o){return r.split(/\r?\n/u).flatMap((n,a)=>{let s=n.trim();if(!s)return[];try{return Fp(JSON.parse(s),t,a)}catch{return o.push({code:"NATIVE_IMPORT_JSONL_LINE_MALFORMED",host:e,source_path:t,message:`Line ${a+1} is malformed.`}),[]}})}function nk(e,t){return t.split(/\n(?=#{1,3}\s+)/u).map(r=>r.trim()).filter(r=>r.length>0).map((r,o)=>({id:null,content:r,project:null,confidence:null,sourcePath:e,raw:{kind:"text_section",index:o,source_path:e}}))}function Fp(e,t,r){if(typeof e=="string"&&e.trim().length>0)return[{id:null,content:e,project:null,confidence:null,sourcePath:t,raw:e}];if(!ji(e))return[];let o=Ei(e,["content","text","summary","memory","note","body","value"]);return o?[{id:Ei(e,["id","uid","uuid","key"])??`${Io.basename(t)}:${r+1}`,content:o,project:Ei(e,["project","project_id","scope_project","workspace","repo"]),confidence:ck(e,["confidence","score"]),sourcePath:t,raw:Pi(e)}]:[]}function ak(e,t,r){return t.map((o,n)=>{let a=N(o.content),s=o.id??`${Io.basename(o.sourcePath)}:${n+1}`,i=Up(a.value);return{source_system:e,source_path:o.sourcePath,source_id:s,source_hash:Zv(o.raw),normalized_content_hash:i,target_project:o.project?.trim()||r,content:a.value,summary:Ge(a.value),redacted:a.redacted,confidence:Math.min(Math.max(o.confidence??.55,0),1),status:"candidate",proposed_memory_id:null}})}async function sk(e,t){let r=[];r.push(...$p(t,o=>o.source_hash,"duplicate_source_hash")),r.push(...$p(t,o=>o.normalized_content_hash,"duplicate_normalized_content"));for(let o of new Set(t.map(n=>n.target_project))){let n=await Dt({home:e,project:o,includeForgotten:!1,limit:1e3}),a=new Set(n.map(s=>Up(s.content)));for(let s of t.filter(i=>i.target_project===o))a.has(s.normalized_content_hash)&&r.push({source_id:s.source_id,reason:"existing_normalized_content"})}return r.sort((o,n)=>`${o.reason}:${o.source_id}`.localeCompare(`${n.reason}:${n.source_id}`))}function $p(e,t,r){let o=new Map;for(let n of e){let a=t(n);o.set(a,[...o.get(a)??[],n])}return Array.from(o.values()).filter(n=>n.length>1).flatMap(n=>n.map(a=>({source_id:a.source_id,reason:r})))}function Up(e){return Se(e.toLowerCase().replace(/\s+/gu," ").trim())}function ik(e){return{host:e.host,source_path:e.source_path,files:e.files.length,mapped_records:e.mapped_records.length,skipped_records:e.skipped_records.length,conflicts:e.conflicts.length,redactions:e.redactions,persisted_memories:e.persisted_memories.length,proposed_scopes:e.proposed_scopes,approvals_required:e.approvals_required.length,host_limitations:e.host_limitations}}function lk(e){if(!ji(e))return null;for(let t of["memories","memory","records","items","notes"]){let r=e[t];if(Array.isArray(r))return r}return null}function Ei(e,t){for(let r of t){let o=e[r];if(typeof o=="string"&&o.trim().length>0)return o.trim()}return null}function ck(e,t){for(let r of t){let o=e[r];if(typeof o=="number"&&Number.isFinite(o))return o}return null}function Pi(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?e:Array.isArray(e)?e.map(t=>Pi(t)):ji(e)?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,Pi(r)])):String(e)}function dk(e){return Xt.includes(Io.extname(e).toLowerCase())}function ji(e){return typeof e=="object"&&e!==null}var me={state:"unlicensed",license_key:null,instance_id:null,purchased_at:null,version_at_activation:null,updates_until:null,last_checked_at:null,source:"none"};import{chmod as uk,mkdir as pk,readFile as mk,rm as gk,writeFile as fk}from"node:fs/promises";import{randomUUID as hk}from"node:crypto";import Bp from"node:path";function Yn(e){return Bp.join(f(e).home,"license.json")}async function xe(e){let t=Yn(e);if(!await A(t))return null;try{let r=JSON.parse(await mk(t,"utf8"));return yk(r)?r:null}catch{return null}}async function To(e,t){let r=Yn(e);return await pk(Bp.dirname(r),{recursive:!0,mode:448}),await fk(r,`${JSON.stringify(t,null,2)}
|
|
928
|
-
`,{encoding:"utf8",mode:384}),await uk(r,384),t}async function Ii(e){await gk(Yn(e),{force:!0})}async function Qn(e){let t=await xe(e);if(t?.instance_id)return t.instance_id;let r=hk();return await To(e,{...me,instance_id:r,purchased_at:t?.purchased_at??null,version_at_activation:t?.version_at_activation??null,updates_until:t?.updates_until??null,license_key_instance_id:t?.license_key_instance_id??null}),r}function yk(e){return(e.state==="licensed"||e.state==="unlicensed")&&(typeof e.license_key=="string"||e.license_key===null)&&(typeof e.instance_id=="string"||e.instance_id===null)&&(typeof e.purchased_at=="string"||e.purchased_at===null||e.purchased_at===void 0)&&(typeof e.version_at_activation=="string"||e.version_at_activation===null||e.version_at_activation===void 0)&&(typeof e.updates_until=="string"||e.updates_until===null)&&(typeof e.last_checked_at=="string"||e.last_checked_at===null)&&(e.source==="dodo"||e.source==="none")&&(typeof e.license_key_instance_id=="string"||e.license_key_instance_id===null)}var Vp={name:"nativesoul",version:"1.1.2",description:"Local-first continuity layer for coding agents.",type:"module",license:"UNLICENSED",main:"dist/packages/cli/src/index.js",repository:{type:"git",url:"git+https://github.com/fillipeweb/nativesoul.git"},bugs:{url:"https://github.com/fillipeweb/nativesoul/issues"},homepage:"https://github.com/fillipeweb/nativesoul#readme",files:["dist/","plugins/","policy-packs/","schemas/","docs/adr/","docs/legal/","llm-install.txt","README.md","CHANGELOG.md"],bin:{nativesoul:"dist/packages/cli/src/index.js","nativesoul-mcp":"dist/packages/mcp-server/src/index.js"},scripts:{lint:"eslint .",typecheck:"tsc -p tsconfig.json --noEmit",test:"npm run build && npm run test:non-e2e","test:non-e2e":"node scripts/run-non-e2e-tests.mjs",build:"npm run build:ts && npm run build:minify","build:ts":"tsc -p tsconfig.build.json","build:minify":"node scripts/build-min.mjs","policy:generate":"node scripts/generate-policy-fail-closed.mjs","policy:check":"node scripts/generate-policy-fail-closed.mjs --check","release:security:audit":"node scripts/release-security-audit.mjs","release:provenance:dry-run":"node scripts/release-provenance-dry-run.mjs","package:local":"node scripts/package-local.mjs","package:dry-run":"node scripts/package-dry-run.mjs","package:smoke":"node scripts/package-smoke.mjs","test:e2e":"npm run build && vitest run tests/e2e"},engines:{node:">=22.17.0"},dependencies:{},devDependencies:{"@eslint/js":"^10.0.1","@types/node":"^26.0.0",esbuild:"^0.28.1",eslint:"^10.5.0",typescript:"^6.0.3","typescript-eslint":"^8.62.0",vitest:"^4.1.9"}};var Yt=Vp.version;var bk="https://api.dodopayments.com",vk=1440*60*1e3,kk=14;async function Ti(e){let t=f(e.home).home,r=e.now??new Date,o=await Qn(t),n=await Ni(e,"/licenses/activate",{license_key:e.key,name:o});if(!n.ok)return await He(t,"license_activate_failed",e.key,n.reason,"error"),{ok:!1,reason:n.reason,license:{...me,instance_id:o}};let a=await To(t,{state:"licensed",license_key:e.key,instance_id:o,license_key_instance_id:n.license_key_instance_id,purchased_at:n.purchased_at??r.toISOString(),version_at_activation:Yt,updates_until:xk(n.purchased_at??r.toISOString(),365),last_checked_at:r.toISOString(),source:"dodo"});return await He(t,"license_activated",e.key,null,"ok"),{ok:!0,license:Qt(a)}}async function Ci(e){let t=f(e.home).home,r=e.now??new Date,o=await xe(t),n=e.key??o?.license_key,a=o?.instance_id??null;if(!n)return await He(t,"license_validate_missing",null,"INVALID_KEY","blocked"),{ok:!1,reason:"INVALID_KEY",license:o?Qt(o):me};if(o?.state==="licensed"&&wk(o.last_checked_at,r))return await He(t,"license_validate_cache_hit",n,null,"ok"),{ok:!0,license:Qt(o)};let s=await Ni(e,"/licenses/validate",{license_key:n});if(s.ok){let i=await To(t,{state:"licensed",license_key:n,instance_id:a??await Qn(t),license_key_instance_id:o?.license_key_instance_id??null,purchased_at:o?.purchased_at??null,version_at_activation:o?.version_at_activation??null,updates_until:o?.updates_until??null,last_checked_at:r.toISOString(),source:"dodo"});return await He(t,"license_validated",n,null,"ok"),{ok:!0,license:Qt(i)}}return s.reason==="NETWORK"&&o?.state==="licensed"&&Sk(o.last_checked_at,r,e.graceDays)?(await He(t,"license_validate_grace_served",n,"NETWORK","ok"),{ok:!0,license:Qt(o)}):(await He(t,"license_validate_failed",n,s.reason,"blocked"),{ok:!1,reason:s.reason,license:{...me,instance_id:a}})}async function Oi(e){let t=f(e.home).home,r=await xe(t),o=e.key??r?.license_key,n=e.licenseKeyInstanceId??r?.license_key_instance_id;if(!o||!n)return await He(t,"license_deactivate_missing",o??null,"INVALID_KEY","blocked"),{ok:!1,reason:"INVALID_KEY",license:r?Qt(r):me};let a=await Ni(e,"/licenses/deactivate",{license_key:o,license_key_instance_id:n});return a.ok?(await Ii(t),await He(t,"license_deactivated",o,null,"ok"),{ok:!0,license:me}):(await He(t,"license_deactivate_failed",o,a.reason,"error"),{ok:!1,reason:a.reason,license:r?Qt(r):me})}function Qt(e){return{state:e.state,license_key:e.license_key,instance_id:e.instance_id,purchased_at:e.purchased_at??null,version_at_activation:e.version_at_activation??null,updates_until:e.updates_until,last_checked_at:e.last_checked_at,source:e.source}}function wk(e,t){return e?t.getTime()-new Date(e).getTime()<vk:!1}function Sk(e,t,r=kk){return e?t.getTime()-new Date(e).getTime()<=r*24*60*60*1e3:!1}async function Ni(e,t,r){let o=e.fetch??globalThis.fetch;try{let n=await o(new URL(t,Rk(e.endpointBaseUrl)).toString(),{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify(r)}),a=await Ak(n);return n.ok?t==="/licenses/validate"&&a.valid!==!0?{ok:!1,reason:Wp(a)}:{ok:!0,license_key_instance_id:Ek(a),purchased_at:Pk(a)}:{ok:!1,reason:Wp(a)}}catch{return{ok:!1,reason:"NETWORK"}}}function Rk(e=process.env.NATIVESOUL_DODO_LICENSE_API_BASE_URL??bk){return e.endsWith("/")?e:`${e}/`}async function Ak(e){try{let t=await e.json();return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}}function Ek(e){let r=[e.license_key_instance_id,e.licenseKeyInstanceId,e.id,Co(e.data)?e.data.license_key_instance_id:null,Co(e.data)?e.data.id:null].find(o=>typeof o=="string"&&o.length>0);return typeof r=="string"?r:null}function Pk(e){let t=Co(e.data)?e.data:{},r=Co(e.license_key)?e.license_key:Co(t.license_key)?t.license_key:{},n=[e.purchased_at,e.purchase_date,e.created_at,t.purchased_at,t.purchase_date,t.created_at,r.purchased_at,r.purchase_date,r.created_at].find(a=>typeof a=="string"&&!Number.isNaN(Date.parse(a)));return typeof n=="string"?new Date(n).toISOString():null}function xk(e,t){let r=Date.parse(e);return Number.isNaN(r)?null:new Date(r+t*24*60*60*1e3).toISOString()}function Wp(e){let t=String(e.reason??e.code??e.error??"").toUpperCase();return t.includes("LIMIT")?"ACTIVATION_LIMIT":t.includes("ACTIVE")?"NOT_ACTIVE":"INVALID_KEY"}function Co(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}async function He(e,t,r,o,n){await h({home:e,type:t,result:n,details:{provider:"dodo",license_key_ref:r?jk(r):null,reason:o}})}function jk(e){return e.length<=8?"[REDACTED_LICENSE_KEY]":`${e.slice(0,4)}\u2026${e.slice(-4)}`}var Oo="https://docs.nativesoul.dev/account/licensing";async function kr(e){let t=Ik(e),r=f(t.home).home;try{let o=await xe(r),n=await Ci(t);if(n.ok)return{ok:!0,license:n.license};let a=n.reason==="NETWORK"&&o?.state==="licensed"?"GRACE_EXPIRED":"UNLICENSED",s=t.activateUrl??Oo;return{ok:!1,reason:a,activate_url:s,message:No({reason:a,activate_url:s}),license:n.license}}catch{let o=t.activateUrl??Oo;return{ok:!1,reason:"UNLICENSED",activate_url:o,message:No({reason:"UNLICENSED",activate_url:o}),license:me}}}function No(e){return`${e.reason==="GRACE_EXPIRED"?"License offline grace expired.":"NativeSoul is not activated."} NativeSoul is paid-only. Run \`nativesoul license activate <key>\` after purchase: ${e.activate_url}`}function Ik(e){return typeof e=="string"?{home:e}:e??{}}import{readdir as Tk,readFile as Jp,stat as Ck}from"node:fs/promises";import Mi from"node:path";var Ok=["open source","open-source","source-available","read the source","free to install","never phones home","zero network","uncrackable","piracy-proof"];async function Li(e={}){let t=e.registryPath??Mi.join(process.cwd(),"docs","architecture","feature-registry.yaml"),r=e.marketingDir??Mi.join(process.cwd(),"docs","marketing"),o=Nk(await Jp(t,"utf8")),n=e.page?[e.page]:await Gp(r),a=[],s=[];for(let i of n){let l=await Jp(i,"utf8"),c=Mo(l);for(let d of Ok)c.includes(Mo(d))&&a.push({code:"GLOBAL_FORBIDDEN_PHRASE",page:i,phrase:d,message:`Global forbidden phrase found: ${d}`});for(let d of o.values())for(let p of d.claim_forbidden)p&&c.includes(Mo(p))&&a.push({code:"FEATURE_FORBIDDEN_PHRASE",page:i,feature_id:d.id,phrase:p,message:`Forbidden phrase for ${d.id}: ${p}`});for(let d of Mk(l)){let p=o.get(d.id);if(!p){a.push({code:"UNKNOWN_CLAIM_ID",page:i,feature_id:d.id,message:`Tagged claim references unknown feature id: ${d.id}`}),s.push({id:d.id,status:"unknown",page:i,text:d.text,result:"fail",reason:"unknown feature id"});continue}let g=Lk(p,i,d.text);s.push(g),g.result==="fail"&&a.push(Dk(g))}}return{ok:a.length===0,status:a.length===0?"pass":"fail",registry_path:t,pages:n,claims:s,issues:a,summary:{pages_scanned:n.length,claims_checked:s.length,issues:a.length}}}function Nk(e){let t=new Map,r=null;for(let o of e.split(/\r?\n/u)){let n=o.match(/^\s*-\s+id:\s*(.+)\s*$/u);if(n){r?.id&&t.set(r.id,qp(r)),r={id:wr(n[1]??""),name:"",claim_forbidden:[],evidence:null,claim_allowed:null};continue}if(!r)continue;let a=o.match(/^\s+([a-z_]+):\s*(.*)\s*$/u);if(!a)continue;let s=a[1]??"",i=a[2]??"";s==="status"?r.status=wr(i).split(/\s+/u)[0]:s==="name"?r.name=wr(i):s==="evidence"?r.evidence=wr(i):s==="claim_allowed"?r.claim_allowed=i.trim()==="null"?null:wr(i):s==="claim_forbidden"&&(r.claim_forbidden=Hk(i))}return r?.id&&t.set(r.id,qp(r)),t}function qp(e){return{id:e.id??"",name:e.name??e.id??"",status:e.status??"absent",evidence:e.evidence??null,claim_allowed:e.claim_allowed??null,claim_forbidden:e.claim_forbidden??[]}}async function Gp(e){try{if(!(await Ck(e)).isDirectory())return[]}catch{return[]}let t=await Tk(e,{withFileTypes:!0});return(await Promise.all(t.map(async o=>{let n=Mi.join(e,o.name);return o.isDirectory()?await Gp(n):o.isFile()&&/\.(md|mdx|txt)$/iu.test(o.name)?[n]:[]}))).flat().sort()}function Mk(e){let t=[],r=/<!--\s*claim:([a-z0-9_-]+)\s*-->([\s\S]*?)<!--\s*\/claim\s*-->/giu,o=/\[claim:([a-z0-9_+-]+)\]([\s\S]*?)\[\/claim\]/giu;for(let n of e.matchAll(r))t.push({id:n[1]??"",text:(n[2]??"").trim()});for(let n of e.matchAll(o))t.push({id:n[1]??"",text:(n[2]??"").trim()});return t}function Lk(e,t,r){return e.status==="absent"||e.status==="roadmap"||e.status==="roadmap-teams"?{id:e.id,status:e.status,page:t,text:r,result:"fail",reason:`${e.status} feature cannot be claimed as live`}:e.status==="partial"&&e.claim_allowed&&!Mo(r).includes(Mo(e.claim_allowed))?{id:e.id,status:e.status,page:t,text:r,result:"fail",reason:"partial feature claim exceeds allowed wording"}:{id:e.id,status:e.status,page:t,text:r,result:"pass",reason:"claim within registry bounds"}}function Dk(e){return{code:e.status==="partial"?"PARTIAL_CLAIM_OUT_OF_BOUNDS":"UNBUILT_FEATURE_CLAIM",page:e.page,feature_id:e.id,message:e.reason}}function Hk(e){let t=e.trim().replace(/\s+#.*$/u,"");if(t==="[]")return[];if(!t.startsWith("[")||!t.endsWith("]"))return[];let r=t.slice(1,-1).trim();return r?r.split(/,\s*/u).map(wr).filter(Boolean):[]}function wr(e){let t=e.trim().replace(/\s+#.*$/u,"");return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function Mo(e){return e.toLowerCase().replace(/[’']/gu,"'").replace(/\s+/gu," ").trim()}async function Di(e){let t=await xe(e.home),r=t?.state==="licensed",o=r?$k(t.updates_until,e.now??new Date):"unknown",n=r?Fk(e.latestKnownVersion,t.version_at_activation??null):"unknown",a=e.upgradeUrl??Oo,s=o==="lapsed"&&n===!0,i=s?`You're on v${t?.version_at_activation??e.currentVersion}. v${e.latestKnownVersion} is available. Your licence keeps working \u2014 upgrade for the new major: ${a}.`:null;return{licensed:r,updates_status:o,newer_major_available:n,upgrade_url:a,purchased_at:t?.purchased_at??null,updates_until:t?.updates_until??null,version_at_activation:t?.version_at_activation??null,current_version:e.currentVersion,latest_known_version:e.latestKnownVersion??null,soft_nudge:{visible:s,dismissible:!0,message:i}}}function $k(e,t){if(!e)return"unknown";let r=Date.parse(e);return Number.isNaN(r)?"unknown":t.getTime()<=r?"active":"lapsed"}function Fk(e,t){if(!e||!t)return"unknown";let r=Kp(e),o=Kp(t);return r===null||o===null?"unknown":r>o}function Kp(e){let t=e.trim().match(/^v?(\d+)(?:\.|$)/u);return t?.[1]?Number.parseInt(t[1],10):null}function _t(e){return bi(e)?"full native capability":e.ready?"ready":e.healthy&&e.allowed?"official-fallback":"degraded"}function Hi(e){let t=_t(e);return t==="full native capability"?"cyan":t==="ready"?"green":t==="official-fallback"?"amber":"red"}var Uk=["installed","enabled","active","authenticated","healthy","allowed","ready"];async function $i(e){let t=await Ct(e);if(!t)return null;let r=Bk(t);return{schema_version:1,uid:t.uid,capability:t,readiness:r,readiness_label:_t(t),readiness_signals:Uk.map(o=>({signal:o,satisfied:r[o],reason:r[o]?null:`${o} is false on the persisted capability record.`})),source:t.source,schema_hash:t.schema_hash}}function Bk(e){return{installed:e.installed,enabled:e.enabled,active:e.active,authenticated:e.authenticated,healthy:e.healthy,allowed:e.allowed,ready:e.ready}}var Xp={inbox:["assigned","in_progress"],assigned:["in_progress"],in_progress:["review","blocked","done","failed"],review:["in_progress","done","failed"],blocked:["in_progress","failed"],done:[],failed:[]};async function Lo(e){let t=await v(e.home),r=new Date().toISOString(),o=N(e.title).value,n=e.description===void 0||e.description===null?null:N(e.description).value,a={id:T("work"),project_id:e.project,title:o,description:n,status:"inbox",priority:e.priority??"normal",assigned_host:e.host??null,source:e.source??"cli",tags:H(e.tags??[]),metadata:H(e.metadata??{}),created_at:r,updated_at:r,claimed_at:null,completed_at:null},s=Yp({workItem:a,type:"created",fromStatus:null,toStatus:"inbox",actor:e.host??"cli",details:{priority:a.priority,source:a.source},now:r}),i=_(t.database),l;try{l=i.insertWorkItem(a),i.insertWorkItemEvent(s)}finally{i.close()}return await Qp(t.home,"work_item_created",l,{redacted:o!==e.title||e.description!==void 0&&e.description!==null&&n!==e.description,event_id:s.id}),l}async function Do(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await A(t.database))return[];let r=_(t.database,{readOnly:e.readOnly}),o;try{o=r.listWorkItems({project:e.project,status:e.status,priority:e.priority,assignedHost:e.assignedHost,limit:Wk(e.limit)})}finally{r.close()}return e.readOnly||await h({home:t.home,type:"work_items_listed",details:{project:e.project??null,status:e.status??null,priority:e.priority??null,assigned_host:e.assignedHost??null,count:o.length}}),o}async function Ho(e){return Fi({home:e.home,id:e.id,actor:e.host,eventType:"claimed",auditType:"work_item_claimed",mutate:(t,r)=>{if(Ui(t.status))throw new Error(`Work item already terminal: ${t.id} (${t.status})`);return Zn(t.status,"in_progress"),{status:"in_progress",assignedHost:e.host,claimedAt:t.claimed_at??r,updatedAt:r,details:{assigned_host:e.host}}}})}async function $o(e){return Fi({home:e.home,id:e.id,actor:e.assignedHost??"cli",eventType:e.status?"status_changed":"updated",auditType:"work_item_updated",mutate:(t,r)=>{let o=e.status??t.status;e.status&&Zn(t.status,e.status);let n=e.description===void 0||e.description===null?e.description:N(e.description).value;return{status:o,priority:e.priority,assignedHost:e.assignedHost,description:n,tags:e.tags===void 0?void 0:H(e.tags),metadata:e.metadata===void 0?void 0:qk(t.metadata,H(e.metadata)),completedAt:Ui(o)?r:void 0,updatedAt:r,details:{priority:e.priority??null,assigned_host:e.assignedHost??null,fields:Vk(e),redacted:e.description!==void 0&&e.description!==null&&n!==e.description}}}})}async function Fo(e){let t=e.status??"done";return Fi({home:e.home,id:e.id,actor:"cli",eventType:"completed",auditType:"work_item_completed",mutate:(r,o)=>{if(Ui(r.status))throw new Error(`Work item already terminal: ${r.id} (${r.status})`);return Zn(r.status,t),{status:t,completedAt:o,updatedAt:o,details:{terminal_status:t}}}})}function Zn(e,t){if(e!==t&&!Xp[e].includes(t))throw new Error(`Illegal work item transition: ${e} -> ${t}`)}async function Fi(e){let t=await v(e.home),r=_(t.database),o,n;try{let a=r.getWorkItem(e.id);if(!a)throw new Error(`Work item not found: ${e.id}`);let s=new Date().toISOString(),i=e.mutate(a,s);n=Yp({workItem:a,type:e.eventType,fromStatus:a.status,toStatus:i.status??a.status,actor:e.actor,details:i.details,now:s}),o=r.updateWorkItem({id:a.id,status:i.status,priority:i.priority,assignedHost:i.assignedHost,description:i.description,tags:i.tags,metadata:i.metadata,claimedAt:i.claimedAt,completedAt:i.completedAt,updatedAt:i.updatedAt,event:n})}finally{r.close()}if(!o)throw new Error(`Work item not found: ${e.id}`);return await Qp(t.home,e.auditType,o,{event_id:n.id,event_type:n.type,from_status:n.from_status,to_status:n.to_status,details:n.details}),o}function Yp(e){return{id:T("work_evt"),work_item_id:e.workItem.id,project_id:e.workItem.project_id,type:e.type,from_status:e.fromStatus,to_status:e.toStatus,actor:e.actor,details:e.details,created_at:e.now}}async function Qp(e,t,r,o){await h({home:e,type:t,details:{id:r.id,project:r.project_id,status:r.status,...Jk(o)}})}function Vk(e){return[e.status===void 0?null:"status",e.priority===void 0?null:"priority",e.assignedHost===void 0?null:"assigned_host",e.description===void 0?null:"description",e.tags===void 0?null:"tags",e.metadata===void 0?null:"metadata"].filter(t=>t!==null)}function Ui(e){return e==="done"||e==="failed"}function Wk(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),200)}function Jk(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{value:e}}function qk(e,t){return zp(e)&&zp(t)?{...e,...t}:t}function zp(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}import{readdir as jw,readFile as Iw}from"node:fs/promises";import mm from"node:path";import{existsSync as Gk}from"node:fs";var Kk=50;function Uo(e={}){let t=ow(e.limit),r=Zk(e),o=e.groupBy??"host",n=new Date().toISOString();if(e.db)return Zp(e.db,e,r,o,t,n);let a=f(e.home);if(!Gk(a.database))return rw(e,r,o,t,n);let s=_(a.database,{readOnly:!0});try{return Zp(s,e,r,o,t,n)}finally{s.close()}}function Zp(e,t,r,o,n,a){let s=e.listRunCostRows({project:t.project,host:t.host,since:r.since??void 0,until:r.until??void 0}),i=ea(s,g=>({key:g.project_id,label:g.project_id})),l=ea(s,g=>({key:g.host,label:g.host})),c=ea(s,g=>{let y=Yk(g);return{key:y,label:y==="unattributed"?"unattributed":y}}),d=ea(s,g=>{let y=g.completed_at?.slice(0,10)??"unknown";return{key:y,label:y}}),p=s.map(g=>rm(g.id,g.id,[g]));return{schema_version:1,generated_at:a,filters:{project:t.project??null,host:t.host??null,since:r.since,until:r.until,group_by:o,limit:n},totals:om(s),groups:Xk(o,{byProject:i,byHost:l,bySession:c,byDay:d,byRun:p}).slice(0,n),by_project:i.slice(0,n),by_host:l.slice(0,n),by_session:c.slice(0,n),by_day:d.slice(0,n),by_run:p.slice(0,n)}}function ea(e,t){let r=new Map;for(let o of e){let n=t(o),a=r.get(n.key)??{label:n.label,rows:[]};a.rows.push(o),r.set(n.key,a)}return Array.from(r.entries()).map(([o,n])=>rm(o,n.label,n.rows))}function rm(e,t,r){return{key:e,label:t,...om(r)}}function om(e){let t=0,r=0,o=0,n=0,a=0;for(let s of e){let i=Dr(s.cost_json);zk(i)&&(t+=1),"tokens_in"in i&&typeof i.tokens_in=="number"&&(o+=i.tokens_in),"tokens_out"in i&&typeof i.tokens_out=="number"&&(n+=i.tokens_out),"cost_usd"in i&&typeof i.cost_usd=="number"&&(r+=1,a+=i.cost_usd)}return{total_runs:e.length,reported_runs:t,cost_reported_runs:r,not_reported_runs:e.length-t,tokens_in:o,tokens_out:n,total_usd:nw(a),coverage:e.length===0?0:t/e.length}}function zk(e){return"source"in e&&e.source==="host-reported"}function Xk(e,t){switch(e){case"project":return t.byProject;case"host":return t.byHost;case"day":return t.byDay;case"session":return t.bySession;case"total":return[]}}function Yk(e){return Qk(e.evidence_json)??e.session_id??"unattributed"}function Qk(e){let t;try{t=JSON.parse(e)}catch{return null}return em(t,"session_id")??em(t,"session")}function em(e,t){if(!e||typeof e!="object"||Array.isArray(e))return null;let r=e[t];return typeof r=="string"&&r.length>0?r:null}function Zk(e){return{since:e.since?ew(e.since):null,until:e.until?nm(e.until,"until"):null}}function ew(e){let t=tw(e);return t!==null?new Date(Date.now()-t).toISOString():nm(e,"since")}function nm(e,t){let r=Date.parse(e);if(!Number.isFinite(r))throw new Error(`cost --${t} must be an ISO timestamp or duration`);return new Date(r).toISOString()}function tw(e){let t=e.match(/^(\d+)(s|m|h|d|w)$/u);if(t?.[1]&&t[2])return tm(Number(t[1]),t[2]);let r=e.match(/^(\d+)\s+(second|seconds|minute|minutes|hour|hours|day|days|week|weeks)$/u);return r?.[1]&&r[2]?tm(Number(r[1]),r[2]):null}function tm(e,t){return e*({s:1e3,second:1e3,seconds:1e3,m:6e4,minute:6e4,minutes:6e4,h:36e5,hour:36e5,hours:36e5,d:864e5,day:864e5,days:864e5,w:6048e5,week:6048e5,weeks:6048e5}[t]??0)}function rw(e,t,r,o,n){let a={total_runs:0,reported_runs:0,cost_reported_runs:0,not_reported_runs:0,tokens_in:0,tokens_out:0,total_usd:0,coverage:0};return{schema_version:1,generated_at:n,filters:{project:e.project??null,host:e.host??null,since:t.since,until:t.until,group_by:r,limit:o},totals:a,groups:[],by_project:[],by_host:[],by_session:[],by_day:[],by_run:[]}}function ow(e){return e===void 0||!Number.isFinite(e)?Kk:Math.max(1,Math.min(Math.trunc(e),500))}function nw(e){return Math.round(e*1e8)/1e8}import{mkdir as lw,readdir as cw,readFile as dw,writeFile as uw}from"node:fs/promises";import Zt from"node:path";function am(e){let t=Bi(e)?e:{},r=Bi(t.tool_input)?t.tool_input:Bi(t.input)?t.input:{},o=Y(t.tool_name)??Y(t.tool)??Y(t.name)??"unknown_tool",n=Y(t.action)??Y(r.action)??o,a=Y(t.target)??Y(r.target)??Y(r.file_path)??Y(r.path)??Y(r.url)??Y(r.command),s=Y(r.command)??Y(t.command);return{action:n,className:aw(o,[a,s].filter(Boolean).join(" ")),target:a,project:Y(t.project)??Y(t.project_id)??Y(r.project)??Y(r.project_id)}}function aw(e,t){let r=`${e} ${t??""}`.toLowerCase();return/\b(bash|shell|sh|zsh|exec_command)\b/u.test(e.toLowerCase())?sw(t??""):/\b(rm\s+-[^\s]*[rf][^\s]*|delete|reset\s+--hard|destroy|purge|drop)\b/u.test(r)?"destructive":/(slack|gmail|outlook|github|gh\s+pr|gh\s+issue|git\s+push|vercel\s+deploy|deploy|publish|send|post|comment|merge|api|curl\s+.*(-x|--request|-d|--data|--data-raw|--form)\s*(post|put|patch|delete)?)/u.test(r)?"external_write":/(write|edit|patch|apply|create|move|rename|git\s+commit)/u.test(r)?"write_project":/(curl|fetch|browser|http|web)/u.test(r)?"probe_external":"read_local"}function sw(e){let t=e.toLowerCase();return/\b(rm\s+-[^\s]*[rf][^\s]*|delete|reset\s+--hard|destroy|purge|drop)\b/u.test(t)?"destructive":/(curl\s+.*(-x|--request|-d|--data|--data-raw|--form)\s*(post|put|patch|delete)?|gh\s+(pr|issue|release)|git\s+push|vercel\s+deploy|npm\s+publish|pnpm\s+publish|deploy|publish)/u.test(t)?"external_write":/(^|\s)(touch|mkdir|mv|cp|tee|chmod|chown|git\s+commit)\b|(^|[^>])>[^>]|>>/u.test(t)?"write_project":/^(pwd|ls|cat|head|tail|rg|grep|sed\s+-n|find\s+.*-print|git\s+(status|diff|log|show))(\s|$)/u.test(t.trim())?"read_local":/(curl|fetch|http|https?:\/\/)/u.test(t)?"probe_external":"write_project"}function Bi(e){return!!e&&!Array.isArray(e)&&typeof e=="object"}function Y(e){return typeof e=="string"&&e.trim().length>0?e.trim():void 0}var pw=new Set(["SOUL.MD","POLICY.MD"]),mw=5e3,sm=new Map;async function vt(e){let t=f(e),r=sm.get(t.home);if(r&&r.expiresAt>Date.now())return r.orders;let o=Zt.join(t.home,"standing-orders"),n;try{n=await cw(o)}catch{return[]}let a=[];for(let s of n.filter(i=>i.endsWith(".yaml")||i.endsWith(".yml")).sort()){let i=Zt.join(o,s),l=await dw(i,"utf8");a.push(gw(l,i))}return sm.set(t.home,{expiresAt:Date.now()+mw,orders:a}),a}async function kt(e){let t=await vt(e.home),r=e.target??null,o=r?im(r):null,n=t.filter(i=>Ji(i,e)),a=n.find(i=>i.allowed.includes(e.action)),s=n.find(i=>i.approval_required.includes(e.action));if(o&&pw.has(o))return bt(e,"proposal_required",["PROTECTED_HUMAN_FILE"],null);if(e.className==="identity_policy_change")return bt(e,"proposal_required",["IDENTITY_POLICY_CHANGE"],null);if(e.className==="destructive")return bt(e,"denied",["DESTRUCTIVE_DENIED_BY_DEFAULT"],a?.id??s?.id??null);if(s)return bt(e,"approval_required",["STANDING_ORDER_REQUIRES_APPROVAL"],s.id);if(a)return bt(e,"allowed",["STANDING_ORDER_ALLOWED"],a.id);switch(e.className){case"read_local":case"probe_external":case"write_local":return bt(e,"allowed",["DEFAULT_ALLOWED"],null);case"write_project":return bt(e,"approval_required",["PROJECT_WRITE_REQUIRES_APPROVAL"],null);case"external_write":return bt(e,"approval_required",["EXTERNAL_WRITE_REQUIRES_APPROVAL"],null)}}async function Vi(e){let t=am(e.payload),r=await kt({home:e.home,action:t.action,className:t.className,target:t.target,project:t.project,host:e.host}),o=r.decision==="allowed",n={hook_event_name:"PreToolUse",host:e.host,allowed:o,blocked:!o,message:o?"NativeSoul policy allowed this tool use.":`NativeSoul policy blocked ${r.action}: ${r.decision} (${r.reasons.join(", ")}).`,evaluation:r};if(!o){let a=await v(e.home);await h({home:a.home,type:"policy_blocked",result:"blocked",details:{host:e.host,cwd:e.cwd??null,action:r.action,class:r.class,target:r.target,decision:r.decision,reasons:r.reasons,matched_standing_order:r.matched_standing_order}})}return n}async function Wi(e){let t=await v(e.home),r=fw(e.target);if(!r)throw new Error("policy propose-change target must be SOUL.md or POLICY.md");let o=N(e.summary).value,n=new Date().toISOString(),a=T("proposal"),s=Zt.join(t.home,"proposals",`${n.replaceAll(/[:.]/gu,"-")}-${r}.md`),i=["# Policy Change Proposal","",`ID: ${a}`,`Target: ${r}`,`Created At: ${n}`,"","## Summary","",o,""].join(`
|
|
929
|
-
`);return await lw(Zt.dirname(s),{recursive:!0,mode:448}),pe(s,{root:t.home}),await uw(s,i,{encoding:"utf8",mode:384,flag:"wx"}),await h({home:t.home,type:"policy_change_proposed",details:{id:a,target:r,proposalPath:s,redacted:o!==e.summary}}),{id:a,target:r,summary:o,proposalPath:s,created_at:n}}function bt(e,t,r,o){return{action:e.action,class:e.className,target:e.target??null,decision:t,reasons:r,matched_standing_order:o}}function gw(e,t){return{id:hw(e,"id")??Zt.basename(t,Zt.extname(t)),allowed:Sr(e,"allowed"),approval_required:Sr(e,"approval_required"),scope_projects:Sr(e,"projects").concat(Sr(e,"scope_projects")),scope_hosts:Sr(e,"hosts").concat(Sr(e,"scope_hosts")),source:t}}function Ji(e,t){return!(e.scope_projects.length>0&&(!t.project||!e.scope_projects.includes(t.project))||e.scope_hosts.length>0&&(!t.host||!e.scope_hosts.includes(t.host)))}function im(e){return Zt.basename(e.replaceAll("\\","/")).toUpperCase()}function fw(e){let t=im(e);return t==="SOUL.MD"?"SOUL.md":t==="POLICY.MD"?"POLICY.md":null}function hw(e,t){let r=new RegExp(`^\\s*${t}:\\s*([^\\n#]+)`,"mu");return e.match(r)?.[1]?.trim().replace(/^["']|["']$/gu,"")??null}function Sr(e,t){let r=e.match(new RegExp(`^\\s*${t}:\\s*\\[([^\\]]*)\\]`,"mu"));if(r?.[1])return r[1].split(",").map(i=>i.trim().replace(/^["']|["']$/gu,"")).filter(Boolean);let o=e.split(/\r?\n/u),n=[],a=!1,s=0;for(let i of o){let l=i.trim();if(!a){let d=i.match(new RegExp(`^(\\s*)${t}:\\s*$`,"u"));d&&(a=!0,s=d[1]?.length??0);continue}let c=i.length-i.trimStart().length;if(l&&c<=s&&!l.startsWith("-"))break;l.startsWith("-")&&n.push(l.slice(1).trim().replace(/^["']|["']$/gu,""))}return n.filter(Boolean)}function le(e,t,r){if(e==null)return!1;if(Array.isArray(e))return e.some(o=>le(o,t,r));if(typeof e!="object")return!1;for(let[o,n]of Object.entries(e)){if(o===t){if(r===void 0)return!0;if(n===null)return r==="null";if(typeof n=="string"||typeof n=="number"||typeof n=="boolean")return String(n)===r;if(Array.isArray(n))return n.some(a=>String(a)===r)}if(le(n,t,r))return!0}return!1}var yw=/(?:sk-[A-Za-z0-9_-]{8,}|(?:api[_-]?key|token|secret|password)\s*[:=]\s*(?!\[REDACTED_SECRET\])[^"'\s]+)/iu;async function Rr(e={}){let t=f(e.home),r=xw(e.limit);if(!await A(t.database))return _w(e,r,!1);let n=_(t.database,{readOnly:!0});try{let a=n.listEvents({limit:r}),s=n.listCapabilities({host:e.host,includeShared:!0,limit:r}),i=n.listSchedules({host:e.host,limit:r}),l=n.listHeartbeatLeases({project:e.project,limit:r}),c=n.listHeartbeatRuns({project:e.project,host:e.host,limit:r}),d=a.filter(y=>Pw(y,e)),p=s.filter(y=>lm(y.host,e.host)),g=i.filter(y=>lm(y.host,e.host));return pm({schema_version:1,generated_at:new Date().toISOString(),read_only:!0,external_telemetry_enabled:!1,initialized:!0,filters:um(e,r),retention:dm(r),metrics:{activation:bw(d),bootstrap:vw(d),recall:kw(d),capability_readiness:ww(p),heartbeat:Sw(l,c),no_op_suppression:Rw(d),rollback:Aw(d),secret_leakage_checks:cm(d)},m7_gate:Ew(d,p,g,c)})}finally{n.close()}}function _w(e,t,r){return pm({schema_version:1,generated_at:new Date().toISOString(),read_only:!0,external_telemetry_enabled:!1,initialized:r,filters:um(e,t),retention:dm(t),metrics:{activation:{workspace_initialized:0,onboarding_completed:0,install_applied:0},bootstrap:{succeeded:0,degraded:0,failed:0,cache_fallbacks:0},recall:{recalled:0,proposed:0,promoted:0},capability_readiness:{total:0,ready:0,full_native:0,official_fallback:0,degraded:0},heartbeat:{leases:0,completed_runs:0,silent_ok:0},no_op_suppression:{total:0,heartbeat_skipped:0,deduped:0,noop_actions:0},rollback:{total:0,policy_pack:0,mcp:0,managed_block:0},secret_leakage_checks:{checked:!0,leak_indicators:0,redaction_markers:0}},m7_gate:{recurring_use_validated:!1,feedback_validated:!1,privacy_validated:!0,notes:["NativeSoul database is not initialized; no local feedback evidence is available yet."]}})}function bw(e){return{workspace_initialized:ge(e,["workspace_initialized"]),onboarding_completed:ge(e,["onboarding_completed"]),install_applied:ge(e,["plugin_install","managed_block_applied","mcp_registration_installed"])}}function vw(e){return{succeeded:ge(e,["handshake_succeeded"]),degraded:ge(e,["handshake_degraded"]),failed:ge(e,["handshake_failed"]),cache_fallbacks:e.filter(t=>t.type.includes("bootstrap_context_cache")).length}}function kw(e){return{recalled:ge(e,["memory_recalled"]),proposed:ge(e,["memory_proposed"]),promoted:ge(e,["memory_promoted"])}}function ww(e){let t=e.map(_t);return{total:e.length,ready:t.filter(r=>r==="ready"||r==="full native capability").length,full_native:t.filter(r=>r==="full native capability").length,official_fallback:t.filter(r=>r==="official-fallback").length,degraded:t.filter(r=>r==="degraded").length}}function Sw(e,t){return{leases:e.length,completed_runs:t.length,silent_ok:t.filter(r=>r.result==="HEARTBEAT_OK"||le(r.result,"silent_ack","HEARTBEAT_OK")).length}}function Rw(e){let t=ge(e,["heartbeat_skipped"]),r=e.filter(n=>n.type.includes("deduped")).length,o=e.filter(n=>le(n.details,"action","noop")).length;return{total:t+r+o,heartbeat_skipped:t,deduped:r,noop_actions:o}}function Aw(e){let t=ge(e,["policy_pack_rollback"]),r=ge(e,["mcp_registration_rollback"]),o=ge(e,["managed_block_rollback"]);return{total:e.filter(n=>n.type.includes("rollback")).length,policy_pack:t,mcp:r,managed_block:o}}function cm(e){let t=JSON.stringify(e.map(r=>({type:r.type,result:r.result,details:r.details})));return{checked:!0,leak_indicators:yw.test(t)?1:0,redaction_markers:(t.match(/\[REDACTED_/gu)??[]).length}}function Ew(e,t,r,o){let n=o.length>0||r.some(l=>l.enabled),a=e.length>0&&t.length>0,s=cm(e).leak_indicators===0;return{recurring_use_validated:n,feedback_validated:a,privacy_validated:s,notes:[n?"Recurring heartbeat/schedule evidence exists locally.":"No recurring heartbeat/schedule evidence yet.",a?"Feedback report has local audit and capability evidence.":"Feedback report needs audit and capability evidence.",s?"Report excludes raw prompts, memory bodies, and unredacted secret indicators.":"Potential secret indicators found in local audit details."]}}function ge(e,t){return e.filter(r=>t.includes(r.type)).length}function Pw(e,t){let r=!t.host||!le(e.details,"host")||le(e.details,"host",t.host),o=!t.project||!le(e.details,"project")||le(e.details,"project",t.project);return r&&o}function lm(e,t){return!t||e===t||e==="all"}function dm(e){return{source_event_limit:e,stores_raw_prompts:!1,stores_memory_content:!1,stores_raw_paths:!1}}function um(e,t){return{project:e.project??null,host:e.host??null,limit:t}}function xw(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e??200),1),500):200}function pm(e){return ir(H(e))}var Tw=["candidate","active","superseded","rejected","forgotten","expired"],qi=["inbox","assigned","in_progress","review","blocked","done","failed"];async function Bo(e={}){let t=f(e.home),r=Xw(e.limit),o=Gw(e);if(!await A(t.database))return fm(await Cw(t.home,t.database,e,r));let a=_(t.database,{readOnly:!0});try{let s=a.listMemories({project:e.project,includeForgotten:!0,limit:Math.max(r*4,50)}),i=a.listCapabilities({host:e.host,includeShared:!0,limit:r}),l=a.listCommitments({project:e.project,includeExpired:!0,limit:Math.max(r*2,50),now:new Date().toISOString(),skipExpire:!0}),c=a.listSchedules({host:e.host,limit:r}),d=a.listHeartbeatLeases({project:e.project,limit:r}),p=a.listHeartbeatRuns({project:e.project,host:e.host,limit:r}),g=a.listEvents({limit:Math.max(r*4,50)}),y=Jw(await vt(t.home),e),k=await Bw(t.home),S=Qe(s,o,D=>D.created_at),U=Qe(l,o,D=>D.updated_at).slice(0,r),ae=Qe(i,o,D=>D.last_seen_at).slice(0,r),ve=Qe(c,o,D=>D.updated_at).slice(0,r),ke=Qe(d,o,D=>D.created_at).slice(0,r),nt=Qe(p,o,D=>D.completed_at).slice(0,r),Ue=Qe(g,o,D=>D.created_at).filter(D=>!e.host||Kw(D,{key:"host",value:e.host})).slice(0,r),R=Ue.filter(D=>D.type==="policy_blocked"),Rt=Ue.filter(D=>zw(D)).length,rn=Ow(a,e,o,r),Lr=Mw(a,e,o,r,k,Rt),V=Hw(a,e,r),Rg={schema_version:2,generated_at:new Date().toISOString(),filters:_m(e,r),read_only:!0,home:t.home,database:t.database,initialized:!0,memories:{summary:qw(S),recent:S.filter(D=>D.status!=="candidate").slice(0,r),candidates:S.filter(D=>D.status==="candidate").slice(0,r)},commitments:U,capabilities:ae,schedules:ve,heartbeat:{leases:ke,runs:nt},audit:{events:Ue,policy_blocks:R},policy:{standing_orders:y,proposals:k,counts:{standing_orders:y.length,proposals:k.length,policy_blocks:R.length,approvals_required:Rt}},work:rn,approvals:Lr,cost:V,feedback:await Rr({home:t.home,project:e.project,host:e.host,limit:r})};return fm(Rg)}finally{a.close()}}async function Cw(e,t,r,o){return{schema_version:2,generated_at:new Date().toISOString(),filters:_m(r,o),read_only:!0,home:e,database:t,initialized:!1,memories:{summary:ym(),recent:[],candidates:[]},commitments:[],capabilities:[],schedules:[],heartbeat:{leases:[],runs:[]},audit:{events:[],policy_blocks:[]},policy:{standing_orders:[],proposals:[],counts:{standing_orders:0,proposals:0,policy_blocks:0,approvals_required:0}},work:hm(),approvals:Fw(),cost:Uw(),feedback:await Rr({home:e,project:r.project,host:r.host,limit:o})}}function Ow(e,t,r,o){let n=Qe(e.listWorkItems({project:t.project,assignedHost:t.host,limit:Math.max(o*qi.length,50)}),r,s=>s.updated_at).slice(0,Math.max(o*qi.length,50));if(n.length===0)return hm();let a=[];for(let s of qi){let i=n.filter(l=>l.status===s).slice(0,o).map(l=>Nw(e,l));i.length>0&&a.push({status:s,count:i.length,items:i})}return{columns:a}}function Nw(e,t){let r=e.listHeartbeatRunsByWorkItem({workItemId:t.id,project:t.project_id,limit:1})[0];return{id:t.id,title:t.title,summary:t.description??t.title,status:t.status,project:t.project_id,host:t.assigned_host,linked_run_id:$w(t.metadata,"run_id")??r?.id??null,priority:t.priority,updated_at:t.updated_at}}function Mw(e,t,r,o,n,a){let s=e.listApprovals("pending").approvals.filter(l=>Dw(l,t)).filter(l=>Qe([l],r,c=>c.created_at).length>0).slice(0,o).map(Lw);if(s.length>0)return{pending:s,counts:{pending:s.length}};let i=n.slice(0,o).map(l=>({id:l.filename,action:l.summary??"Policy proposal pending review",class:"identity_policy_change",target:l.target,project:t.project??null,host:t.host??null,source:"policy_proposal",created_at:null}));return i.length===0&&a>0&&i.push({id:"policy-approval-required",action:"Policy event requires approval",class:"approval_required",target:null,project:t.project??null,host:t.host??null,source:"policy_event",created_at:null}),{pending:i,counts:{pending:i.length}}}function Lw(e){return{id:e.id,action:e.action,class:e.class,target:e.target,project:e.project,host:e.host,source:"approvals",created_at:e.created_at}}function Dw(e,t){return(!t.project||e.project===t.project)&&(!t.host||e.host===t.host)}function Hw(e,t,r){let o=Uo({db:e,project:t.project,host:t.host,since:t.since,until:t.until,groupBy:"host",limit:r});return{totals:{runs:o.totals.total_runs,reported_runs:o.totals.reported_runs,cost_reported_runs:o.totals.cost_reported_runs,not_reported_runs:o.totals.not_reported_runs,tokens_in:o.totals.tokens_in,tokens_out:o.totals.tokens_out,total_usd:o.totals.total_usd,coverage:o.totals.coverage},by_project:o.by_project.map(ta),by_host:o.by_host.map(ta),by_session:o.by_session.map(ta),by_run:o.by_run.map(ta)}}function ta(e){return{key:e.key,label:e.label,runs:e.total_runs,reported_runs:e.reported_runs,cost_reported_runs:e.cost_reported_runs,not_reported_runs:e.not_reported_runs,tokens_in:e.tokens_in,tokens_out:e.tokens_out,total_usd:e.total_usd,coverage:e.coverage}}function $w(e,t){if(!e||typeof e!="object"||Array.isArray(e))return null;let r=e[t];return typeof r=="string"&&r.length>0?r:null}function hm(){return{columns:[]}}function Fw(){return{pending:[],counts:{pending:0}}}function Uw(){return{totals:{runs:0,reported_runs:0,cost_reported_runs:0,not_reported_runs:0,tokens_in:0,tokens_out:0,total_usd:0,coverage:0},by_project:[],by_host:[],by_session:[],by_run:[]}}async function Bw(e){let t=mm.join(e,"proposals"),r;try{r=await jw(t)}catch{return[]}let o=[];for(let n of r.filter(a=>a.endsWith(".md")).sort()){let a=await Iw(mm.join(t,n),"utf8");o.push({filename:n,target:Vw(a,"Target"),summary:Ww(a,"Summary")})}return o}function Vw(e,t){return e.match(new RegExp(`^${t}:\\s*(.+)$`,"mu"))?.[1]?.trim()??null}function Ww(e,t){return e.match(new RegExp(`^## ${t}\\s*$\\n+([\\s\\S]*?)(?:\\n+## |$)`,"mu"))?.[1]?.trim()??null}function Jw(e,t){return e.filter(r=>{let o=!t.project||r.scope_projects.length===0||r.scope_projects.includes(t.project),n=!t.host||r.scope_hosts.length===0||r.scope_hosts.includes(t.host);return o&&n})}function qw(e){let t=ym();for(let r of e)t[r.status]+=1;return t}function ym(){return Object.fromEntries(Tw.map(e=>[e,0]))}function Qe(e,t,r){return e.filter(o=>{let n=Date.parse(r(o));return!(!Number.isFinite(n)||t.since!==null&&n<t.since||t.until!==null&&n>t.until)})}function Gw(e){return{since:gm(e.since,"since"),until:gm(e.until,"until")}}function gm(e,t){if(!e)return null;let r=Date.parse(e);if(!Number.isFinite(r))throw new Error(`dashboard data --${t} must be an ISO date/time`);return r}function Kw(e,t){return le(e.details,t.key,t.value)}function zw(e){return le(e.details,"decision","approval_required")||le(e.details,"approval_required")||le(e.details,"action","approval_required")}function _m(e,t){return{project:e.project??null,host:e.host??null,limit:t,since:e.since??null,until:e.until??null}}function Xw(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e??50),1),200):50}function fm(e){return ir(H(e))}import{mkdir as Yw,writeFile as Qw}from"node:fs/promises";import Gi from"node:path";async function zi(e={}){let t=await Bo(e),r=Gi.resolve(e.output??Gi.join(f(e.home).home,"generated","dashboard","index.html"));return await Yw(Gi.dirname(r),{recursive:!0,mode:448}),await Qw(r,bm(t),{encoding:"utf8",mode:384}),{outputPath:r,generated_at:t.generated_at,read_only:!0,data:t}}function bm(e){let t=lS(e.capabilities),r=e.audit.policy_blocks.length,o=e.policy.counts.approvals_required,n=Zw(e),a=n?n.work.columns.reduce((s,i)=>s+i.items.length,0):0;return`<!doctype html>
|
|
927
|
+
${n.content}`)>=.35&&o!==Op(n.content)){let s=Np(n.content);if([...r].some(l=>l.length>4&&s.has(l)))return n}return null}function Op(e){return/\b(nao|não|never|do not|dont|don't|no longer|avoid|evitar|proibir|forbid)\b/iu.test(e)}function Mp(e,t){return Ru(e,t,{minLength:3,normalizeDiacritics:!0,removeStopwords:!0})}function Np(e){return so(e,{minLength:3,normalizeDiacritics:!0,removeStopwords:!0})}import{lstat as Dv,readdir as Hv,readFile as $v}from"node:fs/promises";import zt from"node:path";var Lp=new Set([".json",".jsonl",".md",".markdown",".txt"]);async function Si(e){let t=e.apply===!0,r=f((await v(e.home)).home),o=zt.resolve(e.sourcePath),n=e.project??L(e.cwd??process.cwd(),r.home),a=Math.min(Math.max(e.limit??200,1),1e3),s=[],i=await Dp(o,s),l=[],c=[];for(let k of i){if(l.length>=a){c.push({source_path:k,reason:"limit_reached"});continue}let R=await Fv(k,s);if(R.length===0){c.push({source_path:k,reason:"no_supported_records"});continue}l.push(...R.slice(0,a-l.length))}let d=Jv(l,n),p=qv(d).map(k=>({source_id:k,reason:"duplicate_source_id"})),g=[];if(t)for(let k of d){let R=await ee(r.home,{project:k.target_project,content:k.content,confidence:k.confidence,authority:"openclaw_import",source:{kind:"import",source_system:k.source_system,source_path:k.source_path,source_id:k.source_id,source_hash:k.source_hash,imported_at:new Date().toISOString(),redacted:k.redacted}});k.proposed_memory_id=R.id,g.push(R)}let y={applied:t,source_path:o,files:i,mapped_records:d,skipped_records:c,conflicts:p,redactions:d.filter(k=>k.redacted).length,proposed_scopes:Array.from(new Set(d.map(k=>k.target_project))).sort(),warnings:s,persisted_memories:g};return await h({home:r.home,type:t?"openclaw_import_applied":"openclaw_import_dry_run",details:Kv(y)}),y}async function Dp(e,t){let r;try{r=await Dv(e)}catch{return t.push({code:"OPENCLAW_SOURCE_UNREADABLE",source_path:e,message:"Source path is not readable."}),[]}if(r.isFile())return Lp.has(zt.extname(e).toLowerCase())?[e]:[];if(!r.isDirectory())return t.push({code:"OPENCLAW_SOURCE_UNSUPPORTED",source_path:e,message:"Source path is neither a file nor a directory."}),[];let o=await Hv(e,{withFileTypes:!0});return(await Promise.all(o.map(a=>{let s=zt.join(e,a.name);return a.isDirectory()?Dp(s,t):Promise.resolve(Lp.has(zt.extname(a.name).toLowerCase())?[s]:[])}))).flat().sort()}async function Fv(e,t){let r;try{r=await $v(e,"utf8")}catch{return t.push({code:"OPENCLAW_FILE_UNREADABLE",source_path:e,message:"File could not be read."}),[]}let o=zt.extname(e).toLowerCase();return o===".json"?Uv(e,r,t):o===".jsonl"?Bv(e,r,t):Vv(e,r)}function Uv(e,t,r){let o;try{o=JSON.parse(t)}catch{return r.push({code:"OPENCLAW_JSON_MALFORMED",source_path:e,message:"JSON file is malformed."}),[]}return(Array.isArray(o)?o:Wv(o)??[o]).flatMap((a,s)=>Hp(a,e,s))}function Bv(e,t,r){return t.split(/\r?\n/u).flatMap((o,n)=>{let a=o.trim();if(!a)return[];try{return Hp(JSON.parse(a),e,n)}catch{return r.push({code:"OPENCLAW_JSONL_LINE_MALFORMED",source_path:e,message:`Line ${n+1} is malformed.`}),[]}})}function Vv(e,t){return t.split(/\n(?=#{1,3}\s+)/u).map(r=>r.trim()).filter(r=>r.length>0).map((r,o)=>({id:null,content:r,project:null,confidence:null,sourcePath:e,raw:{kind:"text_section",index:o,source_path:e}}))}function Wv(e){if(!Ai(e))return null;for(let t of["memories","memory","records","items","notes"]){let r=e[t];if(Array.isArray(r))return r}return null}function Hp(e,t,r){if(typeof e=="string"&&e.trim().length>0)return[{id:null,content:e,project:null,confidence:null,sourcePath:t,raw:e}];if(!Ai(e))return[];let o=wi(e,["content","text","summary","memory","note","body","value"]);return o?[{id:wi(e,["id","uid","uuid","key"])??`${zt.basename(t)}:${r+1}`,content:o,project:wi(e,["project","project_id","scope_project","workspace","repo"]),confidence:Gv(e,["confidence","score"]),sourcePath:t,raw:Ri(e)}]:[]}function Jv(e,t){return e.map((r,o)=>{let n=N(r.content),a=r.id??`${zt.basename(r.sourcePath)}:${o+1}`;return{source_system:"openclaw",source_path:r.sourcePath,source_id:a,source_hash:zv(r.raw),target_project:r.project?.trim()||t,content:n.value,summary:Ge(n.value),redacted:n.redacted,confidence:Math.min(Math.max(r.confidence??.55,0),1),status:"candidate",proposed_memory_id:null}})}function qv(e){let t=new Map;for(let r of e)t.set(r.source_id,(t.get(r.source_id)??0)+1);return Array.from(t.entries()).filter(([,r])=>r>1).map(([r])=>r).sort()}function wi(e,t){for(let r of t){let o=e[r];if(typeof o=="string"&&o.trim().length>0)return o.trim()}return null}function Gv(e,t){for(let r of t){let o=e[r];if(typeof o=="number"&&Number.isFinite(o))return o}return null}function Kv(e){return{source_path:e.source_path,files:e.files.length,mapped_records:e.mapped_records.length,skipped_records:e.skipped_records.length,conflicts:e.conflicts.length,redactions:e.redactions,persisted_memories:e.persisted_memories.length,proposed_scopes:e.proposed_scopes}}function Ri(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?e:Array.isArray(e)?e.map(t=>Ri(t)):Ai(e)?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,Ri(r)])):String(e)}function Ai(e){return typeof e=="object"&&e!==null}function zv(e){return Re(e)}import{lstat as Xv,readFile as Yv}from"node:fs/promises";import Io from"node:path";var Xt=[".json",".jsonl",".md",".markdown",".txt"];var Qv={nativesoul:{host:"nativesoul",supported_extensions:Xt,documented_inputs:["nativesoul memory export JSON/JSONL","operator-authored Markdown/text memory notes"],unsupported_boundaries:["NativeSoul private SQLite databases","undocumented internal cache files"],limitations:[]},codex:{host:"codex",supported_extensions:Xt,documented_inputs:["operator-provided Codex memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Codex private app stores","Codex cache or thread databases","undocumented internal state"],limitations:["Codex does not expose a NativeSoul-owned private store reader; import requires an explicit user-selected file."]},claude:{host:"claude",supported_extensions:Xt,documented_inputs:["operator-provided Claude memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Claude private settings databases","Claude internal conversation stores","undocumented internal state"],limitations:["Claude import is limited to explicit export or notes files selected by the operator."]},gemini:{host:"gemini",supported_extensions:Xt,documented_inputs:["operator-provided Gemini memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Gemini private app storage","Gemini internal cache files","undocumented internal state"],limitations:["No private Gemini memory database is read; use documented exports or operator-authored files."]},grok:{host:"grok",supported_extensions:Xt,documented_inputs:["operator-provided Grok memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Grok private app storage","Grok internal session stores","undocumented internal state"],limitations:["Grok import is file-only because no native memory store reader is supported."]},antigravity:{host:"antigravity",supported_extensions:Xt,documented_inputs:["operator-provided Antigravity memory export files","operator-authored Markdown/text memory notes"],unsupported_boundaries:["Antigravity private workspace state","Antigravity scheduled-task stores","undocumented internal state"],limitations:["Antigravity import is constrained to explicit files; scheduler state is not memory import input."]}};function Zv(e){return Re(e)}async function xi(e){let t=Qv[e.host];if(!t)throw new Error(`Unsupported native host importer: ${String(e.host)}`);let r=e.apply===!0,o=f((await v(e.home)).home),n=Io.resolve(e.sourcePath),a=e.project??L(e.cwd??process.cwd(),o.home),s=Math.min(Math.max(e.limit??200,1),1e3),i=[],l=await ek(e.host,n,i),c=[],d=[];for(let R of l){if(c.length>=s){d.push({source_path:R,reason:"limit_reached"});continue}let U=await tk(e.host,R,i);if(U.length===0){d.push({source_path:R,reason:"no_supported_records"});continue}c.push(...U.slice(0,s-c.length))}let p=ak(e.host,c,a),g=await sk(o.home,p),y=[];if(r)for(let R of p){let U=await ee(o.home,{project:R.target_project,content:R.content,confidence:R.confidence,authority:`${R.source_system}_import`,source:{kind:"import",source_system:R.source_system,source_path:R.source_path,source_id:R.source_id,source_hash:R.source_hash,normalized_content_hash:R.normalized_content_hash,imported_at:new Date().toISOString(),redacted:R.redacted}});R.proposed_memory_id=U.id,y.push(U)}let k={applied:r,host:e.host,source_path:n,registry:t,files:l,mapped_records:p,skipped_records:d,conflicts:g,redactions:p.filter(R=>R.redacted).length,proposed_scopes:Array.from(new Set(p.map(R=>R.target_project))).sort(),approvals_required:["Human review is required before imported candidate memories are promoted."],host_limitations:t.limitations,warnings:i,persisted_memories:y};return await h({home:o.home,type:r?"native_host_import_applied":"native_host_import_dry_run",details:ik(k)}),k}async function ek(e,t,r){let o;try{o=await Xv(t)}catch{return r.push({code:"NATIVE_IMPORT_SOURCE_UNREADABLE",host:e,source_path:t,message:"Source path is not readable."}),[]}return o.isFile()?dk(t)?[t]:(r.push({code:"NATIVE_IMPORT_FILE_UNSUPPORTED",host:e,source_path:t,message:"File extension is not supported by the native host importer registry."}),[]):o.isDirectory()?(r.push({code:"NATIVE_IMPORT_DIRECTORY_UNSUPPORTED",host:e,source_path:t,message:"Native host importers require an explicit file path and do not scan directories."}),[]):o.isDirectory()?[]:(r.push({code:"NATIVE_IMPORT_SOURCE_UNSUPPORTED",host:e,source_path:t,message:"Source path is neither a file nor a directory."}),[])}async function tk(e,t,r){let o;try{o=await Yv(t,"utf8")}catch{return r.push({code:"NATIVE_IMPORT_FILE_UNREADABLE",host:e,source_path:t,message:"File could not be read."}),[]}let n=Io.extname(t).toLowerCase();return n===".json"?rk(e,t,o,r):n===".jsonl"?ok(e,t,o,r):nk(t,o)}function rk(e,t,r,o){let n;try{n=JSON.parse(r)}catch{return o.push({code:"NATIVE_IMPORT_JSON_MALFORMED",host:e,source_path:t,message:"JSON file is malformed."}),[]}return(Array.isArray(n)?n:lk(n)??[n]).flatMap((s,i)=>Fp(s,t,i))}function ok(e,t,r,o){return r.split(/\r?\n/u).flatMap((n,a)=>{let s=n.trim();if(!s)return[];try{return Fp(JSON.parse(s),t,a)}catch{return o.push({code:"NATIVE_IMPORT_JSONL_LINE_MALFORMED",host:e,source_path:t,message:`Line ${a+1} is malformed.`}),[]}})}function nk(e,t){return t.split(/\n(?=#{1,3}\s+)/u).map(r=>r.trim()).filter(r=>r.length>0).map((r,o)=>({id:null,content:r,project:null,confidence:null,sourcePath:e,raw:{kind:"text_section",index:o,source_path:e}}))}function Fp(e,t,r){if(typeof e=="string"&&e.trim().length>0)return[{id:null,content:e,project:null,confidence:null,sourcePath:t,raw:e}];if(!ji(e))return[];let o=Ei(e,["content","text","summary","memory","note","body","value"]);return o?[{id:Ei(e,["id","uid","uuid","key"])??`${Io.basename(t)}:${r+1}`,content:o,project:Ei(e,["project","project_id","scope_project","workspace","repo"]),confidence:ck(e,["confidence","score"]),sourcePath:t,raw:Pi(e)}]:[]}function ak(e,t,r){return t.map((o,n)=>{let a=N(o.content),s=o.id??`${Io.basename(o.sourcePath)}:${n+1}`,i=Up(a.value);return{source_system:e,source_path:o.sourcePath,source_id:s,source_hash:Zv(o.raw),normalized_content_hash:i,target_project:o.project?.trim()||r,content:a.value,summary:Ge(a.value),redacted:a.redacted,confidence:Math.min(Math.max(o.confidence??.55,0),1),status:"candidate",proposed_memory_id:null}})}async function sk(e,t){let r=[];r.push(...$p(t,o=>o.source_hash,"duplicate_source_hash")),r.push(...$p(t,o=>o.normalized_content_hash,"duplicate_normalized_content"));for(let o of new Set(t.map(n=>n.target_project))){let n=await Dt({home:e,project:o,includeForgotten:!1,limit:1e3}),a=new Set(n.map(s=>Up(s.content)));for(let s of t.filter(i=>i.target_project===o))a.has(s.normalized_content_hash)&&r.push({source_id:s.source_id,reason:"existing_normalized_content"})}return r.sort((o,n)=>`${o.reason}:${o.source_id}`.localeCompare(`${n.reason}:${n.source_id}`))}function $p(e,t,r){let o=new Map;for(let n of e){let a=t(n);o.set(a,[...o.get(a)??[],n])}return Array.from(o.values()).filter(n=>n.length>1).flatMap(n=>n.map(a=>({source_id:a.source_id,reason:r})))}function Up(e){return Re(e.toLowerCase().replace(/\s+/gu," ").trim())}function ik(e){return{host:e.host,source_path:e.source_path,files:e.files.length,mapped_records:e.mapped_records.length,skipped_records:e.skipped_records.length,conflicts:e.conflicts.length,redactions:e.redactions,persisted_memories:e.persisted_memories.length,proposed_scopes:e.proposed_scopes,approvals_required:e.approvals_required.length,host_limitations:e.host_limitations}}function lk(e){if(!ji(e))return null;for(let t of["memories","memory","records","items","notes"]){let r=e[t];if(Array.isArray(r))return r}return null}function Ei(e,t){for(let r of t){let o=e[r];if(typeof o=="string"&&o.trim().length>0)return o.trim()}return null}function ck(e,t){for(let r of t){let o=e[r];if(typeof o=="number"&&Number.isFinite(o))return o}return null}function Pi(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?e:Array.isArray(e)?e.map(t=>Pi(t)):ji(e)?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,Pi(r)])):String(e)}function dk(e){return Xt.includes(Io.extname(e).toLowerCase())}function ji(e){return typeof e=="object"&&e!==null}var me={state:"unlicensed",license_key:null,instance_id:null,purchased_at:null,version_at_activation:null,updates_until:null,last_checked_at:null,source:"none"};import{chmod as uk,mkdir as pk,readFile as mk,rm as gk,writeFile as fk}from"node:fs/promises";import{randomUUID as hk}from"node:crypto";import Bp from"node:path";function Yn(e){return Bp.join(f(e).home,"license.json")}async function xe(e){let t=Yn(e);if(!await A(t))return null;try{let r=JSON.parse(await mk(t,"utf8"));return yk(r)?r:null}catch{return null}}async function To(e,t){let r=Yn(e);return await pk(Bp.dirname(r),{recursive:!0,mode:448}),await fk(r,`${JSON.stringify(t,null,2)}
|
|
928
|
+
`,{encoding:"utf8",mode:384}),await uk(r,384),t}async function Ii(e){await gk(Yn(e),{force:!0})}async function Qn(e){let t=await xe(e);if(t?.instance_id)return t.instance_id;let r=hk();return await To(e,{...me,instance_id:r,purchased_at:t?.purchased_at??null,version_at_activation:t?.version_at_activation??null,updates_until:t?.updates_until??null,license_key_instance_id:t?.license_key_instance_id??null}),r}function yk(e){return(e.state==="licensed"||e.state==="unlicensed")&&(typeof e.license_key=="string"||e.license_key===null)&&(typeof e.instance_id=="string"||e.instance_id===null)&&(typeof e.purchased_at=="string"||e.purchased_at===null||e.purchased_at===void 0)&&(typeof e.version_at_activation=="string"||e.version_at_activation===null||e.version_at_activation===void 0)&&(typeof e.updates_until=="string"||e.updates_until===null)&&(typeof e.last_checked_at=="string"||e.last_checked_at===null)&&(e.source==="dodo"||e.source==="none")&&(typeof e.license_key_instance_id=="string"||e.license_key_instance_id===null)}var Vp={name:"nativesoul",version:"1.1.4",description:"Local-first continuity layer for coding agents.",type:"module",license:"UNLICENSED",main:"dist/packages/cli/src/index.js",repository:{type:"git",url:"git+https://github.com/fillipeweb/nativesoul.git"},bugs:{url:"https://github.com/fillipeweb/nativesoul/issues"},homepage:"https://github.com/fillipeweb/nativesoul#readme",files:["dist/","plugins/","policy-packs/","schemas/","docs/adr/","docs/legal/","llm-install.txt","README.md","CHANGELOG.md"],bin:{nativesoul:"dist/packages/cli/src/index.js","nativesoul-mcp":"dist/packages/mcp-server/src/index.js"},scripts:{lint:"eslint .",typecheck:"tsc -p tsconfig.json --noEmit",test:"npm run build && npm run test:non-e2e","test:non-e2e":"node scripts/run-non-e2e-tests.mjs",build:"npm run build:ts && npm run build:minify","build:ts":"tsc -p tsconfig.build.json","build:minify":"node scripts/build-min.mjs","policy:generate":"node scripts/generate-policy-fail-closed.mjs","policy:check":"node scripts/generate-policy-fail-closed.mjs --check","release:security:audit":"node scripts/release-security-audit.mjs","release:provenance:dry-run":"node scripts/release-provenance-dry-run.mjs","package:local":"node scripts/package-local.mjs","package:dry-run":"node scripts/package-dry-run.mjs","package:smoke":"node scripts/package-smoke.mjs","test:e2e":"npm run build && vitest run tests/e2e"},engines:{node:">=22.17.0"},dependencies:{},devDependencies:{"@eslint/js":"^10.0.1","@types/node":"^26.0.0",esbuild:"^0.28.1",eslint:"^10.5.0",typescript:"^6.0.3","typescript-eslint":"^8.62.0",vitest:"^4.1.9"}};var Yt=Vp.version;var bk="https://live.dodopayments.com",vk=1440*60*1e3,kk=14;async function Ti(e){let t=f(e.home).home,r=e.now??new Date,o=await Qn(t),n=await Ni(e,"/licenses/activate",{license_key:e.key,name:o});if(!n.ok)return await He(t,"license_activate_failed",e.key,n.reason,"error"),{ok:!1,reason:n.reason,license:{...me,instance_id:o}};let a=await To(t,{state:"licensed",license_key:e.key,instance_id:o,license_key_instance_id:n.license_key_instance_id,purchased_at:n.purchased_at??r.toISOString(),version_at_activation:Yt,updates_until:xk(n.purchased_at??r.toISOString(),365),last_checked_at:r.toISOString(),source:"dodo"});return await He(t,"license_activated",e.key,null,"ok"),{ok:!0,license:Qt(a)}}async function Ci(e){let t=f(e.home).home,r=e.now??new Date,o=await xe(t),n=e.key??o?.license_key,a=o?.instance_id??null;if(!n)return await He(t,"license_validate_missing",null,"INVALID_KEY","blocked"),{ok:!1,reason:"INVALID_KEY",license:o?Qt(o):me};if(o?.state==="licensed"&&wk(o.last_checked_at,r))return await He(t,"license_validate_cache_hit",n,null,"ok"),{ok:!0,license:Qt(o)};let s=await Ni(e,"/licenses/validate",{license_key:n});if(s.ok){let i=await To(t,{state:"licensed",license_key:n,instance_id:a??await Qn(t),license_key_instance_id:o?.license_key_instance_id??null,purchased_at:o?.purchased_at??null,version_at_activation:o?.version_at_activation??null,updates_until:o?.updates_until??null,last_checked_at:r.toISOString(),source:"dodo"});return await He(t,"license_validated",n,null,"ok"),{ok:!0,license:Qt(i)}}return s.reason==="NETWORK"&&o?.state==="licensed"&&Rk(o.last_checked_at,r,e.graceDays)?(await He(t,"license_validate_grace_served",n,"NETWORK","ok"),{ok:!0,license:Qt(o)}):(await He(t,"license_validate_failed",n,s.reason,"blocked"),{ok:!1,reason:s.reason,license:{...me,instance_id:a}})}async function Oi(e){let t=f(e.home).home,r=await xe(t),o=e.key??r?.license_key,n=e.licenseKeyInstanceId??r?.license_key_instance_id;if(!o||!n)return await He(t,"license_deactivate_missing",o??null,"INVALID_KEY","blocked"),{ok:!1,reason:"INVALID_KEY",license:r?Qt(r):me};let a=await Ni(e,"/licenses/deactivate",{license_key:o,license_key_instance_id:n});return a.ok?(await Ii(t),await He(t,"license_deactivated",o,null,"ok"),{ok:!0,license:me}):(await He(t,"license_deactivate_failed",o,a.reason,"error"),{ok:!1,reason:a.reason,license:r?Qt(r):me})}function Qt(e){return{state:e.state,license_key:e.license_key,instance_id:e.instance_id,purchased_at:e.purchased_at??null,version_at_activation:e.version_at_activation??null,updates_until:e.updates_until,last_checked_at:e.last_checked_at,source:e.source}}function wk(e,t){return e?t.getTime()-new Date(e).getTime()<vk:!1}function Rk(e,t,r=kk){return e?t.getTime()-new Date(e).getTime()<=r*24*60*60*1e3:!1}async function Ni(e,t,r){let o=e.fetch??globalThis.fetch;try{let n=await o(new URL(t,Sk(e.endpointBaseUrl)).toString(),{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify(r)}),a=await Ak(n);return n.ok?t==="/licenses/validate"&&a.valid!==!0?{ok:!1,reason:Wp(a)}:{ok:!0,license_key_instance_id:Ek(a),purchased_at:Pk(a)}:n.status>=500||n.status===429||n.status===408?{ok:!1,reason:"NETWORK"}:{ok:!1,reason:Wp(a)}}catch{return{ok:!1,reason:"NETWORK"}}}function Sk(e=process.env.NATIVESOUL_DODO_LICENSE_API_BASE_URL??bk){return e.endsWith("/")?e:`${e}/`}async function Ak(e){try{let t=await e.json();return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}}function Ek(e){let r=[e.license_key_instance_id,e.licenseKeyInstanceId,e.id,Co(e.data)?e.data.license_key_instance_id:null,Co(e.data)?e.data.id:null].find(o=>typeof o=="string"&&o.length>0);return typeof r=="string"?r:null}function Pk(e){let t=Co(e.data)?e.data:{},r=Co(e.license_key)?e.license_key:Co(t.license_key)?t.license_key:{},n=[e.purchased_at,e.purchase_date,e.created_at,t.purchased_at,t.purchase_date,t.created_at,r.purchased_at,r.purchase_date,r.created_at].find(a=>typeof a=="string"&&!Number.isNaN(Date.parse(a)));return typeof n=="string"?new Date(n).toISOString():null}function xk(e,t){let r=Date.parse(e);return Number.isNaN(r)?null:new Date(r+t*24*60*60*1e3).toISOString()}function Wp(e){let t=String(e.reason??e.code??e.error??"").toUpperCase();return t.includes("LIMIT")?"ACTIVATION_LIMIT":t.includes("ACTIVE")?"NOT_ACTIVE":"INVALID_KEY"}function Co(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}async function He(e,t,r,o,n){try{await h({home:e,type:t,result:n,details:{provider:"dodo",license_key_ref:r?jk(r):null,reason:o}})}catch{}}function jk(e){return e.length<=8?"[REDACTED_LICENSE_KEY]":`${e.slice(0,4)}\u2026${e.slice(-4)}`}var Oo="https://docs.nativesoul.dev/account/licensing";async function kr(e){let t=Ik(e),r=f(t.home).home;try{let o=await xe(r),n=await Ci(t);if(n.ok)return{ok:!0,license:n.license};let a=n.reason==="NETWORK"&&o?.state==="licensed"?"GRACE_EXPIRED":"UNLICENSED",s=t.activateUrl??Oo;return{ok:!1,reason:a,activate_url:s,message:No({reason:a,activate_url:s}),license:n.license}}catch{let o=t.activateUrl??Oo;return{ok:!1,reason:"UNLICENSED",activate_url:o,message:No({reason:"UNLICENSED",activate_url:o}),license:me}}}function No(e){return`${e.reason==="GRACE_EXPIRED"?"License offline grace expired.":"NativeSoul is not activated."} NativeSoul is paid-only. Run \`nativesoul license activate <key>\` after purchase: ${e.activate_url}`}function Ik(e){return typeof e=="string"?{home:e}:e??{}}import{readdir as Tk,readFile as Jp,stat as Ck}from"node:fs/promises";import Mi from"node:path";var Ok=["open source","open-source","source-available","read the source","free to install","never phones home","zero network","uncrackable","piracy-proof"];async function Li(e={}){let t=e.registryPath??Mi.join(process.cwd(),"docs","architecture","feature-registry.yaml"),r=e.marketingDir??Mi.join(process.cwd(),"docs","marketing"),o=Nk(await Jp(t,"utf8")),n=e.page?[e.page]:await Gp(r),a=[],s=[];for(let i of n){let l=await Jp(i,"utf8"),c=Mo(l);for(let d of Ok)c.includes(Mo(d))&&a.push({code:"GLOBAL_FORBIDDEN_PHRASE",page:i,phrase:d,message:`Global forbidden phrase found: ${d}`});for(let d of o.values())for(let p of d.claim_forbidden)p&&c.includes(Mo(p))&&a.push({code:"FEATURE_FORBIDDEN_PHRASE",page:i,feature_id:d.id,phrase:p,message:`Forbidden phrase for ${d.id}: ${p}`});for(let d of Mk(l)){let p=o.get(d.id);if(!p){a.push({code:"UNKNOWN_CLAIM_ID",page:i,feature_id:d.id,message:`Tagged claim references unknown feature id: ${d.id}`}),s.push({id:d.id,status:"unknown",page:i,text:d.text,result:"fail",reason:"unknown feature id"});continue}let g=Lk(p,i,d.text);s.push(g),g.result==="fail"&&a.push(Dk(g))}}return{ok:a.length===0,status:a.length===0?"pass":"fail",registry_path:t,pages:n,claims:s,issues:a,summary:{pages_scanned:n.length,claims_checked:s.length,issues:a.length}}}function Nk(e){let t=new Map,r=null;for(let o of e.split(/\r?\n/u)){let n=o.match(/^\s*-\s+id:\s*(.+)\s*$/u);if(n){r?.id&&t.set(r.id,qp(r)),r={id:wr(n[1]??""),name:"",claim_forbidden:[],evidence:null,claim_allowed:null};continue}if(!r)continue;let a=o.match(/^\s+([a-z_]+):\s*(.*)\s*$/u);if(!a)continue;let s=a[1]??"",i=a[2]??"";s==="status"?r.status=wr(i).split(/\s+/u)[0]:s==="name"?r.name=wr(i):s==="evidence"?r.evidence=wr(i):s==="claim_allowed"?r.claim_allowed=i.trim()==="null"?null:wr(i):s==="claim_forbidden"&&(r.claim_forbidden=Hk(i))}return r?.id&&t.set(r.id,qp(r)),t}function qp(e){return{id:e.id??"",name:e.name??e.id??"",status:e.status??"absent",evidence:e.evidence??null,claim_allowed:e.claim_allowed??null,claim_forbidden:e.claim_forbidden??[]}}async function Gp(e){try{if(!(await Ck(e)).isDirectory())return[]}catch{return[]}let t=await Tk(e,{withFileTypes:!0});return(await Promise.all(t.map(async o=>{let n=Mi.join(e,o.name);return o.isDirectory()?await Gp(n):o.isFile()&&/\.(md|mdx|txt)$/iu.test(o.name)?[n]:[]}))).flat().sort()}function Mk(e){let t=[],r=/<!--\s*claim:([a-z0-9_-]+)\s*-->([\s\S]*?)<!--\s*\/claim\s*-->/giu,o=/\[claim:([a-z0-9_+-]+)\]([\s\S]*?)\[\/claim\]/giu;for(let n of e.matchAll(r))t.push({id:n[1]??"",text:(n[2]??"").trim()});for(let n of e.matchAll(o))t.push({id:n[1]??"",text:(n[2]??"").trim()});return t}function Lk(e,t,r){return e.status==="absent"||e.status==="roadmap"||e.status==="roadmap-teams"?{id:e.id,status:e.status,page:t,text:r,result:"fail",reason:`${e.status} feature cannot be claimed as live`}:e.status==="partial"&&e.claim_allowed&&!Mo(r).includes(Mo(e.claim_allowed))?{id:e.id,status:e.status,page:t,text:r,result:"fail",reason:"partial feature claim exceeds allowed wording"}:{id:e.id,status:e.status,page:t,text:r,result:"pass",reason:"claim within registry bounds"}}function Dk(e){return{code:e.status==="partial"?"PARTIAL_CLAIM_OUT_OF_BOUNDS":"UNBUILT_FEATURE_CLAIM",page:e.page,feature_id:e.id,message:e.reason}}function Hk(e){let t=e.trim().replace(/\s+#.*$/u,"");if(t==="[]")return[];if(!t.startsWith("[")||!t.endsWith("]"))return[];let r=t.slice(1,-1).trim();return r?r.split(/,\s*/u).map(wr).filter(Boolean):[]}function wr(e){let t=e.trim().replace(/\s+#.*$/u,"");return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function Mo(e){return e.toLowerCase().replace(/[’']/gu,"'").replace(/\s+/gu," ").trim()}async function Di(e){let t=await xe(e.home),r=t?.state==="licensed",o=r?$k(t.updates_until,e.now??new Date):"unknown",n=r?Fk(e.latestKnownVersion,t.version_at_activation??null):"unknown",a=e.upgradeUrl??Oo,s=o==="lapsed"&&n===!0,i=s?`You're on v${t?.version_at_activation??e.currentVersion}. v${e.latestKnownVersion} is available. Your licence keeps working \u2014 upgrade for the new major: ${a}.`:null;return{licensed:r,updates_status:o,newer_major_available:n,upgrade_url:a,purchased_at:t?.purchased_at??null,updates_until:t?.updates_until??null,version_at_activation:t?.version_at_activation??null,current_version:e.currentVersion,latest_known_version:e.latestKnownVersion??null,soft_nudge:{visible:s,dismissible:!0,message:i}}}function $k(e,t){if(!e)return"unknown";let r=Date.parse(e);return Number.isNaN(r)?"unknown":t.getTime()<=r?"active":"lapsed"}function Fk(e,t){if(!e||!t)return"unknown";let r=Kp(e),o=Kp(t);return r===null||o===null?"unknown":r>o}function Kp(e){let t=e.trim().match(/^v?(\d+)(?:\.|$)/u);return t?.[1]?Number.parseInt(t[1],10):null}function _t(e){return bi(e)?"full native capability":e.ready?"ready":e.healthy&&e.allowed?"official-fallback":"degraded"}function Hi(e){let t=_t(e);return t==="full native capability"?"cyan":t==="ready"?"green":t==="official-fallback"?"amber":"red"}var Uk=["installed","enabled","active","authenticated","healthy","allowed","ready"];async function $i(e){let t=await Ct(e);if(!t)return null;let r=Bk(t);return{schema_version:1,uid:t.uid,capability:t,readiness:r,readiness_label:_t(t),readiness_signals:Uk.map(o=>({signal:o,satisfied:r[o],reason:r[o]?null:`${o} is false on the persisted capability record.`})),source:t.source,schema_hash:t.schema_hash}}function Bk(e){return{installed:e.installed,enabled:e.enabled,active:e.active,authenticated:e.authenticated,healthy:e.healthy,allowed:e.allowed,ready:e.ready}}var Xp={inbox:["assigned","in_progress"],assigned:["in_progress"],in_progress:["review","blocked","done","failed"],review:["in_progress","done","failed"],blocked:["in_progress","failed"],done:[],failed:[]};async function Lo(e){let t=await v(e.home),r=new Date().toISOString(),o=N(e.title).value,n=e.description===void 0||e.description===null?null:N(e.description).value,a={id:T("work"),project_id:e.project,title:o,description:n,status:"inbox",priority:e.priority??"normal",assigned_host:e.host??null,source:e.source??"cli",tags:H(e.tags??[]),metadata:H(e.metadata??{}),created_at:r,updated_at:r,claimed_at:null,completed_at:null},s=Yp({workItem:a,type:"created",fromStatus:null,toStatus:"inbox",actor:e.host??"cli",details:{priority:a.priority,source:a.source},now:r}),i=_(t.database),l;try{l=i.insertWorkItem(a),i.insertWorkItemEvent(s)}finally{i.close()}return await Qp(t.home,"work_item_created",l,{redacted:o!==e.title||e.description!==void 0&&e.description!==null&&n!==e.description,event_id:s.id}),l}async function Do(e){let t=e.readOnly?f(e.home):await v(e.home);if(e.readOnly&&!await A(t.database))return[];let r=_(t.database,{readOnly:e.readOnly}),o;try{o=r.listWorkItems({project:e.project,status:e.status,priority:e.priority,assignedHost:e.assignedHost,limit:Wk(e.limit)})}finally{r.close()}return e.readOnly||await h({home:t.home,type:"work_items_listed",details:{project:e.project??null,status:e.status??null,priority:e.priority??null,assigned_host:e.assignedHost??null,count:o.length}}),o}async function Ho(e){return Fi({home:e.home,id:e.id,actor:e.host,eventType:"claimed",auditType:"work_item_claimed",mutate:(t,r)=>{if(Ui(t.status))throw new Error(`Work item already terminal: ${t.id} (${t.status})`);return Zn(t.status,"in_progress"),{status:"in_progress",assignedHost:e.host,claimedAt:t.claimed_at??r,updatedAt:r,details:{assigned_host:e.host}}}})}async function $o(e){return Fi({home:e.home,id:e.id,actor:e.assignedHost??"cli",eventType:e.status?"status_changed":"updated",auditType:"work_item_updated",mutate:(t,r)=>{let o=e.status??t.status;e.status&&Zn(t.status,e.status);let n=e.description===void 0||e.description===null?e.description:N(e.description).value;return{status:o,priority:e.priority,assignedHost:e.assignedHost,description:n,tags:e.tags===void 0?void 0:H(e.tags),metadata:e.metadata===void 0?void 0:qk(t.metadata,H(e.metadata)),completedAt:Ui(o)?r:void 0,updatedAt:r,details:{priority:e.priority??null,assigned_host:e.assignedHost??null,fields:Vk(e),redacted:e.description!==void 0&&e.description!==null&&n!==e.description}}}})}async function Fo(e){let t=e.status??"done";return Fi({home:e.home,id:e.id,actor:"cli",eventType:"completed",auditType:"work_item_completed",mutate:(r,o)=>{if(Ui(r.status))throw new Error(`Work item already terminal: ${r.id} (${r.status})`);return Zn(r.status,t),{status:t,completedAt:o,updatedAt:o,details:{terminal_status:t}}}})}function Zn(e,t){if(e!==t&&!Xp[e].includes(t))throw new Error(`Illegal work item transition: ${e} -> ${t}`)}async function Fi(e){let t=await v(e.home),r=_(t.database),o,n;try{let a=r.getWorkItem(e.id);if(!a)throw new Error(`Work item not found: ${e.id}`);let s=new Date().toISOString(),i=e.mutate(a,s);n=Yp({workItem:a,type:e.eventType,fromStatus:a.status,toStatus:i.status??a.status,actor:e.actor,details:i.details,now:s}),o=r.updateWorkItem({id:a.id,status:i.status,priority:i.priority,assignedHost:i.assignedHost,description:i.description,tags:i.tags,metadata:i.metadata,claimedAt:i.claimedAt,completedAt:i.completedAt,updatedAt:i.updatedAt,event:n})}finally{r.close()}if(!o)throw new Error(`Work item not found: ${e.id}`);return await Qp(t.home,e.auditType,o,{event_id:n.id,event_type:n.type,from_status:n.from_status,to_status:n.to_status,details:n.details}),o}function Yp(e){return{id:T("work_evt"),work_item_id:e.workItem.id,project_id:e.workItem.project_id,type:e.type,from_status:e.fromStatus,to_status:e.toStatus,actor:e.actor,details:e.details,created_at:e.now}}async function Qp(e,t,r,o){await h({home:e,type:t,details:{id:r.id,project:r.project_id,status:r.status,...Jk(o)}})}function Vk(e){return[e.status===void 0?null:"status",e.priority===void 0?null:"priority",e.assignedHost===void 0?null:"assigned_host",e.description===void 0?null:"description",e.tags===void 0?null:"tags",e.metadata===void 0?null:"metadata"].filter(t=>t!==null)}function Ui(e){return e==="done"||e==="failed"}function Wk(e){return!e||!Number.isFinite(e)?50:Math.min(Math.max(Math.trunc(e),1),200)}function Jk(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{value:e}}function qk(e,t){return zp(e)&&zp(t)?{...e,...t}:t}function zp(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}import{readdir as jw,readFile as Iw}from"node:fs/promises";import mm from"node:path";import{existsSync as Gk}from"node:fs";var Kk=50;function Uo(e={}){let t=ow(e.limit),r=Zk(e),o=e.groupBy??"host",n=new Date().toISOString();if(e.db)return Zp(e.db,e,r,o,t,n);let a=f(e.home);if(!Gk(a.database))return rw(e,r,o,t,n);let s=_(a.database,{readOnly:!0});try{return Zp(s,e,r,o,t,n)}finally{s.close()}}function Zp(e,t,r,o,n,a){let s=e.listRunCostRows({project:t.project,host:t.host,since:r.since??void 0,until:r.until??void 0}),i=ea(s,g=>({key:g.project_id,label:g.project_id})),l=ea(s,g=>({key:g.host,label:g.host})),c=ea(s,g=>{let y=Yk(g);return{key:y,label:y==="unattributed"?"unattributed":y}}),d=ea(s,g=>{let y=g.completed_at?.slice(0,10)??"unknown";return{key:y,label:y}}),p=s.map(g=>rm(g.id,g.id,[g]));return{schema_version:1,generated_at:a,filters:{project:t.project??null,host:t.host??null,since:r.since,until:r.until,group_by:o,limit:n},totals:om(s),groups:Xk(o,{byProject:i,byHost:l,bySession:c,byDay:d,byRun:p}).slice(0,n),by_project:i.slice(0,n),by_host:l.slice(0,n),by_session:c.slice(0,n),by_day:d.slice(0,n),by_run:p.slice(0,n)}}function ea(e,t){let r=new Map;for(let o of e){let n=t(o),a=r.get(n.key)??{label:n.label,rows:[]};a.rows.push(o),r.set(n.key,a)}return Array.from(r.entries()).map(([o,n])=>rm(o,n.label,n.rows))}function rm(e,t,r){return{key:e,label:t,...om(r)}}function om(e){let t=0,r=0,o=0,n=0,a=0;for(let s of e){let i=Dr(s.cost_json);zk(i)&&(t+=1),"tokens_in"in i&&typeof i.tokens_in=="number"&&(o+=i.tokens_in),"tokens_out"in i&&typeof i.tokens_out=="number"&&(n+=i.tokens_out),"cost_usd"in i&&typeof i.cost_usd=="number"&&(r+=1,a+=i.cost_usd)}return{total_runs:e.length,reported_runs:t,cost_reported_runs:r,not_reported_runs:e.length-t,tokens_in:o,tokens_out:n,total_usd:nw(a),coverage:e.length===0?0:t/e.length}}function zk(e){return"source"in e&&e.source==="host-reported"}function Xk(e,t){switch(e){case"project":return t.byProject;case"host":return t.byHost;case"day":return t.byDay;case"session":return t.bySession;case"total":return[]}}function Yk(e){return Qk(e.evidence_json)??e.session_id??"unattributed"}function Qk(e){let t;try{t=JSON.parse(e)}catch{return null}return em(t,"session_id")??em(t,"session")}function em(e,t){if(!e||typeof e!="object"||Array.isArray(e))return null;let r=e[t];return typeof r=="string"&&r.length>0?r:null}function Zk(e){return{since:e.since?ew(e.since):null,until:e.until?nm(e.until,"until"):null}}function ew(e){let t=tw(e);return t!==null?new Date(Date.now()-t).toISOString():nm(e,"since")}function nm(e,t){let r=Date.parse(e);if(!Number.isFinite(r))throw new Error(`cost --${t} must be an ISO timestamp or duration`);return new Date(r).toISOString()}function tw(e){let t=e.match(/^(\d+)(s|m|h|d|w)$/u);if(t?.[1]&&t[2])return tm(Number(t[1]),t[2]);let r=e.match(/^(\d+)\s+(second|seconds|minute|minutes|hour|hours|day|days|week|weeks)$/u);return r?.[1]&&r[2]?tm(Number(r[1]),r[2]):null}function tm(e,t){return e*({s:1e3,second:1e3,seconds:1e3,m:6e4,minute:6e4,minutes:6e4,h:36e5,hour:36e5,hours:36e5,d:864e5,day:864e5,days:864e5,w:6048e5,week:6048e5,weeks:6048e5}[t]??0)}function rw(e,t,r,o,n){let a={total_runs:0,reported_runs:0,cost_reported_runs:0,not_reported_runs:0,tokens_in:0,tokens_out:0,total_usd:0,coverage:0};return{schema_version:1,generated_at:n,filters:{project:e.project??null,host:e.host??null,since:t.since,until:t.until,group_by:r,limit:o},totals:a,groups:[],by_project:[],by_host:[],by_session:[],by_day:[],by_run:[]}}function ow(e){return e===void 0||!Number.isFinite(e)?Kk:Math.max(1,Math.min(Math.trunc(e),500))}function nw(e){return Math.round(e*1e8)/1e8}import{mkdir as lw,readdir as cw,readFile as dw,writeFile as uw}from"node:fs/promises";import Zt from"node:path";function am(e){let t=Bi(e)?e:{},r=Bi(t.tool_input)?t.tool_input:Bi(t.input)?t.input:{},o=Y(t.tool_name)??Y(t.tool)??Y(t.name)??"unknown_tool",n=Y(t.action)??Y(r.action)??o,a=Y(t.target)??Y(r.target)??Y(r.file_path)??Y(r.path)??Y(r.url)??Y(r.command),s=Y(r.command)??Y(t.command);return{action:n,className:aw(o,[a,s].filter(Boolean).join(" ")),target:a,project:Y(t.project)??Y(t.project_id)??Y(r.project)??Y(r.project_id)}}function aw(e,t){let r=`${e} ${t??""}`.toLowerCase();return/\b(bash|shell|sh|zsh|exec_command)\b/u.test(e.toLowerCase())?sw(t??""):/\b(rm\s+-[^\s]*[rf][^\s]*|delete|reset\s+--hard|destroy|purge|drop)\b/u.test(r)?"destructive":/(slack|gmail|outlook|github|gh\s+pr|gh\s+issue|git\s+push|vercel\s+deploy|deploy|publish|send|post|comment|merge|api|curl\s+.*(-x|--request|-d|--data|--data-raw|--form)\s*(post|put|patch|delete)?)/u.test(r)?"external_write":/(write|edit|patch|apply|create|move|rename|git\s+commit)/u.test(r)?"write_project":/(curl|fetch|browser|http|web)/u.test(r)?"probe_external":"read_local"}function sw(e){let t=e.toLowerCase();return/\b(rm\s+-[^\s]*[rf][^\s]*|delete|reset\s+--hard|destroy|purge|drop)\b/u.test(t)?"destructive":/(curl\s+.*(-x|--request|-d|--data|--data-raw|--form)\s*(post|put|patch|delete)?|gh\s+(pr|issue|release)|git\s+push|vercel\s+deploy|npm\s+publish|pnpm\s+publish|deploy|publish)/u.test(t)?"external_write":/(^|\s)(touch|mkdir|mv|cp|tee|chmod|chown|git\s+commit)\b|(^|[^>])>[^>]|>>/u.test(t)?"write_project":/^(pwd|ls|cat|head|tail|rg|grep|sed\s+-n|find\s+.*-print|git\s+(status|diff|log|show))(\s|$)/u.test(t.trim())?"read_local":/(curl|fetch|http|https?:\/\/)/u.test(t)?"probe_external":"write_project"}function Bi(e){return!!e&&!Array.isArray(e)&&typeof e=="object"}function Y(e){return typeof e=="string"&&e.trim().length>0?e.trim():void 0}var pw=new Set(["SOUL.MD","POLICY.MD"]),mw=5e3,sm=new Map;async function vt(e){let t=f(e),r=sm.get(t.home);if(r&&r.expiresAt>Date.now())return r.orders;let o=Zt.join(t.home,"standing-orders"),n;try{n=await cw(o)}catch{return[]}let a=[];for(let s of n.filter(i=>i.endsWith(".yaml")||i.endsWith(".yml")).sort()){let i=Zt.join(o,s),l=await dw(i,"utf8");a.push(gw(l,i))}return sm.set(t.home,{expiresAt:Date.now()+mw,orders:a}),a}async function kt(e){let t=await vt(e.home),r=e.target??null,o=r?im(r):null,n=t.filter(i=>Ji(i,e)),a=n.find(i=>i.allowed.includes(e.action)),s=n.find(i=>i.approval_required.includes(e.action));if(o&&pw.has(o))return bt(e,"proposal_required",["PROTECTED_HUMAN_FILE"],null);if(e.className==="identity_policy_change")return bt(e,"proposal_required",["IDENTITY_POLICY_CHANGE"],null);if(e.className==="destructive")return bt(e,"denied",["DESTRUCTIVE_DENIED_BY_DEFAULT"],a?.id??s?.id??null);if(s)return bt(e,"approval_required",["STANDING_ORDER_REQUIRES_APPROVAL"],s.id);if(a)return bt(e,"allowed",["STANDING_ORDER_ALLOWED"],a.id);switch(e.className){case"read_local":case"probe_external":case"write_local":return bt(e,"allowed",["DEFAULT_ALLOWED"],null);case"write_project":return bt(e,"approval_required",["PROJECT_WRITE_REQUIRES_APPROVAL"],null);case"external_write":return bt(e,"approval_required",["EXTERNAL_WRITE_REQUIRES_APPROVAL"],null)}}async function Vi(e){let t=am(e.payload),r=await kt({home:e.home,action:t.action,className:t.className,target:t.target,project:t.project,host:e.host}),o=r.decision==="allowed",n={hook_event_name:"PreToolUse",host:e.host,allowed:o,blocked:!o,message:o?"NativeSoul policy allowed this tool use.":`NativeSoul policy blocked ${r.action}: ${r.decision} (${r.reasons.join(", ")}).`,evaluation:r};if(!o){let a=await v(e.home);await h({home:a.home,type:"policy_blocked",result:"blocked",details:{host:e.host,cwd:e.cwd??null,action:r.action,class:r.class,target:r.target,decision:r.decision,reasons:r.reasons,matched_standing_order:r.matched_standing_order}})}return n}async function Wi(e){let t=await v(e.home),r=fw(e.target);if(!r)throw new Error("policy propose-change target must be SOUL.md or POLICY.md");let o=N(e.summary).value,n=new Date().toISOString(),a=T("proposal"),s=Zt.join(t.home,"proposals",`${n.replaceAll(/[:.]/gu,"-")}-${r}.md`),i=["# Policy Change Proposal","",`ID: ${a}`,`Target: ${r}`,`Created At: ${n}`,"","## Summary","",o,""].join(`
|
|
929
|
+
`);return await lw(Zt.dirname(s),{recursive:!0,mode:448}),pe(s,{root:t.home}),await uw(s,i,{encoding:"utf8",mode:384,flag:"wx"}),await h({home:t.home,type:"policy_change_proposed",details:{id:a,target:r,proposalPath:s,redacted:o!==e.summary}}),{id:a,target:r,summary:o,proposalPath:s,created_at:n}}function bt(e,t,r,o){return{action:e.action,class:e.className,target:e.target??null,decision:t,reasons:r,matched_standing_order:o}}function gw(e,t){return{id:hw(e,"id")??Zt.basename(t,Zt.extname(t)),allowed:Rr(e,"allowed"),approval_required:Rr(e,"approval_required"),scope_projects:Rr(e,"projects").concat(Rr(e,"scope_projects")),scope_hosts:Rr(e,"hosts").concat(Rr(e,"scope_hosts")),source:t}}function Ji(e,t){return!(e.scope_projects.length>0&&(!t.project||!e.scope_projects.includes(t.project))||e.scope_hosts.length>0&&(!t.host||!e.scope_hosts.includes(t.host)))}function im(e){return Zt.basename(e.replaceAll("\\","/")).toUpperCase()}function fw(e){let t=im(e);return t==="SOUL.MD"?"SOUL.md":t==="POLICY.MD"?"POLICY.md":null}function hw(e,t){let r=new RegExp(`^\\s*${t}:\\s*([^\\n#]+)`,"mu");return e.match(r)?.[1]?.trim().replace(/^["']|["']$/gu,"")??null}function Rr(e,t){let r=e.match(new RegExp(`^\\s*${t}:\\s*\\[([^\\]]*)\\]`,"mu"));if(r?.[1])return r[1].split(",").map(i=>i.trim().replace(/^["']|["']$/gu,"")).filter(Boolean);let o=e.split(/\r?\n/u),n=[],a=!1,s=0;for(let i of o){let l=i.trim();if(!a){let d=i.match(new RegExp(`^(\\s*)${t}:\\s*$`,"u"));d&&(a=!0,s=d[1]?.length??0);continue}let c=i.length-i.trimStart().length;if(l&&c<=s&&!l.startsWith("-"))break;l.startsWith("-")&&n.push(l.slice(1).trim().replace(/^["']|["']$/gu,""))}return n.filter(Boolean)}function le(e,t,r){if(e==null)return!1;if(Array.isArray(e))return e.some(o=>le(o,t,r));if(typeof e!="object")return!1;for(let[o,n]of Object.entries(e)){if(o===t){if(r===void 0)return!0;if(n===null)return r==="null";if(typeof n=="string"||typeof n=="number"||typeof n=="boolean")return String(n)===r;if(Array.isArray(n))return n.some(a=>String(a)===r)}if(le(n,t,r))return!0}return!1}var yw=/(?:sk-[A-Za-z0-9_-]{8,}|(?:api[_-]?key|token|secret|password)\s*[:=]\s*(?!\[REDACTED_SECRET\])[^"'\s]+)/iu;async function Sr(e={}){let t=f(e.home),r=xw(e.limit);if(!await A(t.database))return _w(e,r,!1);let n=_(t.database,{readOnly:!0});try{let a=n.listEvents({limit:r}),s=n.listCapabilities({host:e.host,includeShared:!0,limit:r}),i=n.listSchedules({host:e.host,limit:r}),l=n.listHeartbeatLeases({project:e.project,limit:r}),c=n.listHeartbeatRuns({project:e.project,host:e.host,limit:r}),d=a.filter(y=>Pw(y,e)),p=s.filter(y=>lm(y.host,e.host)),g=i.filter(y=>lm(y.host,e.host));return pm({schema_version:1,generated_at:new Date().toISOString(),read_only:!0,external_telemetry_enabled:!1,initialized:!0,filters:um(e,r),retention:dm(r),metrics:{activation:bw(d),bootstrap:vw(d),recall:kw(d),capability_readiness:ww(p),heartbeat:Rw(l,c),no_op_suppression:Sw(d),rollback:Aw(d),secret_leakage_checks:cm(d)},m7_gate:Ew(d,p,g,c)})}finally{n.close()}}function _w(e,t,r){return pm({schema_version:1,generated_at:new Date().toISOString(),read_only:!0,external_telemetry_enabled:!1,initialized:r,filters:um(e,t),retention:dm(t),metrics:{activation:{workspace_initialized:0,onboarding_completed:0,install_applied:0},bootstrap:{succeeded:0,degraded:0,failed:0,cache_fallbacks:0},recall:{recalled:0,proposed:0,promoted:0},capability_readiness:{total:0,ready:0,full_native:0,official_fallback:0,degraded:0},heartbeat:{leases:0,completed_runs:0,silent_ok:0},no_op_suppression:{total:0,heartbeat_skipped:0,deduped:0,noop_actions:0},rollback:{total:0,policy_pack:0,mcp:0,managed_block:0},secret_leakage_checks:{checked:!0,leak_indicators:0,redaction_markers:0}},m7_gate:{recurring_use_validated:!1,feedback_validated:!1,privacy_validated:!0,notes:["NativeSoul database is not initialized; no local feedback evidence is available yet."]}})}function bw(e){return{workspace_initialized:ge(e,["workspace_initialized"]),onboarding_completed:ge(e,["onboarding_completed"]),install_applied:ge(e,["plugin_install","managed_block_applied","mcp_registration_installed"])}}function vw(e){return{succeeded:ge(e,["handshake_succeeded"]),degraded:ge(e,["handshake_degraded"]),failed:ge(e,["handshake_failed"]),cache_fallbacks:e.filter(t=>t.type.includes("bootstrap_context_cache")).length}}function kw(e){return{recalled:ge(e,["memory_recalled"]),proposed:ge(e,["memory_proposed"]),promoted:ge(e,["memory_promoted"])}}function ww(e){let t=e.map(_t);return{total:e.length,ready:t.filter(r=>r==="ready"||r==="full native capability").length,full_native:t.filter(r=>r==="full native capability").length,official_fallback:t.filter(r=>r==="official-fallback").length,degraded:t.filter(r=>r==="degraded").length}}function Rw(e,t){return{leases:e.length,completed_runs:t.length,silent_ok:t.filter(r=>r.result==="HEARTBEAT_OK"||le(r.result,"silent_ack","HEARTBEAT_OK")).length}}function Sw(e){let t=ge(e,["heartbeat_skipped"]),r=e.filter(n=>n.type.includes("deduped")).length,o=e.filter(n=>le(n.details,"action","noop")).length;return{total:t+r+o,heartbeat_skipped:t,deduped:r,noop_actions:o}}function Aw(e){let t=ge(e,["policy_pack_rollback"]),r=ge(e,["mcp_registration_rollback"]),o=ge(e,["managed_block_rollback"]);return{total:e.filter(n=>n.type.includes("rollback")).length,policy_pack:t,mcp:r,managed_block:o}}function cm(e){let t=JSON.stringify(e.map(r=>({type:r.type,result:r.result,details:r.details})));return{checked:!0,leak_indicators:yw.test(t)?1:0,redaction_markers:(t.match(/\[REDACTED_/gu)??[]).length}}function Ew(e,t,r,o){let n=o.length>0||r.some(l=>l.enabled),a=e.length>0&&t.length>0,s=cm(e).leak_indicators===0;return{recurring_use_validated:n,feedback_validated:a,privacy_validated:s,notes:[n?"Recurring heartbeat/schedule evidence exists locally.":"No recurring heartbeat/schedule evidence yet.",a?"Feedback report has local audit and capability evidence.":"Feedback report needs audit and capability evidence.",s?"Report excludes raw prompts, memory bodies, and unredacted secret indicators.":"Potential secret indicators found in local audit details."]}}function ge(e,t){return e.filter(r=>t.includes(r.type)).length}function Pw(e,t){let r=!t.host||!le(e.details,"host")||le(e.details,"host",t.host),o=!t.project||!le(e.details,"project")||le(e.details,"project",t.project);return r&&o}function lm(e,t){return!t||e===t||e==="all"}function dm(e){return{source_event_limit:e,stores_raw_prompts:!1,stores_memory_content:!1,stores_raw_paths:!1}}function um(e,t){return{project:e.project??null,host:e.host??null,limit:t}}function xw(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e??200),1),500):200}function pm(e){return ir(H(e))}var Tw=["candidate","active","superseded","rejected","forgotten","expired"],qi=["inbox","assigned","in_progress","review","blocked","done","failed"];async function Bo(e={}){let t=f(e.home),r=Xw(e.limit),o=Gw(e);if(!await A(t.database))return fm(await Cw(t.home,t.database,e,r));let a=_(t.database,{readOnly:!0});try{let s=a.listMemories({project:e.project,includeForgotten:!0,limit:Math.max(r*4,50)}),i=a.listCapabilities({host:e.host,includeShared:!0,limit:r}),l=a.listCommitments({project:e.project,includeExpired:!0,limit:Math.max(r*2,50),now:new Date().toISOString(),skipExpire:!0}),c=a.listSchedules({host:e.host,limit:r}),d=a.listHeartbeatLeases({project:e.project,limit:r}),p=a.listHeartbeatRuns({project:e.project,host:e.host,limit:r}),g=a.listEvents({limit:Math.max(r*4,50)}),y=Jw(await vt(t.home),e),k=await Bw(t.home),R=Qe(s,o,D=>D.created_at),U=Qe(l,o,D=>D.updated_at).slice(0,r),ae=Qe(i,o,D=>D.last_seen_at).slice(0,r),ve=Qe(c,o,D=>D.updated_at).slice(0,r),ke=Qe(d,o,D=>D.created_at).slice(0,r),nt=Qe(p,o,D=>D.completed_at).slice(0,r),Ue=Qe(g,o,D=>D.created_at).filter(D=>!e.host||Kw(D,{key:"host",value:e.host})).slice(0,r),S=Ue.filter(D=>D.type==="policy_blocked"),St=Ue.filter(D=>zw(D)).length,rn=Ow(a,e,o,r),Lr=Mw(a,e,o,r,k,St),V=Hw(a,e,r),Sg={schema_version:2,generated_at:new Date().toISOString(),filters:_m(e,r),read_only:!0,home:t.home,database:t.database,initialized:!0,memories:{summary:qw(R),recent:R.filter(D=>D.status!=="candidate").slice(0,r),candidates:R.filter(D=>D.status==="candidate").slice(0,r)},commitments:U,capabilities:ae,schedules:ve,heartbeat:{leases:ke,runs:nt},audit:{events:Ue,policy_blocks:S},policy:{standing_orders:y,proposals:k,counts:{standing_orders:y.length,proposals:k.length,policy_blocks:S.length,approvals_required:St}},work:rn,approvals:Lr,cost:V,feedback:await Sr({home:t.home,project:e.project,host:e.host,limit:r})};return fm(Sg)}finally{a.close()}}async function Cw(e,t,r,o){return{schema_version:2,generated_at:new Date().toISOString(),filters:_m(r,o),read_only:!0,home:e,database:t,initialized:!1,memories:{summary:ym(),recent:[],candidates:[]},commitments:[],capabilities:[],schedules:[],heartbeat:{leases:[],runs:[]},audit:{events:[],policy_blocks:[]},policy:{standing_orders:[],proposals:[],counts:{standing_orders:0,proposals:0,policy_blocks:0,approvals_required:0}},work:hm(),approvals:Fw(),cost:Uw(),feedback:await Sr({home:e,project:r.project,host:r.host,limit:o})}}function Ow(e,t,r,o){let n=Qe(e.listWorkItems({project:t.project,assignedHost:t.host,limit:Math.max(o*qi.length,50)}),r,s=>s.updated_at).slice(0,Math.max(o*qi.length,50));if(n.length===0)return hm();let a=[];for(let s of qi){let i=n.filter(l=>l.status===s).slice(0,o).map(l=>Nw(e,l));i.length>0&&a.push({status:s,count:i.length,items:i})}return{columns:a}}function Nw(e,t){let r=e.listHeartbeatRunsByWorkItem({workItemId:t.id,project:t.project_id,limit:1})[0];return{id:t.id,title:t.title,summary:t.description??t.title,status:t.status,project:t.project_id,host:t.assigned_host,linked_run_id:$w(t.metadata,"run_id")??r?.id??null,priority:t.priority,updated_at:t.updated_at}}function Mw(e,t,r,o,n,a){let s=e.listApprovals("pending").approvals.filter(l=>Dw(l,t)).filter(l=>Qe([l],r,c=>c.created_at).length>0).slice(0,o).map(Lw);if(s.length>0)return{pending:s,counts:{pending:s.length}};let i=n.slice(0,o).map(l=>({id:l.filename,action:l.summary??"Policy proposal pending review",class:"identity_policy_change",target:l.target,project:t.project??null,host:t.host??null,source:"policy_proposal",created_at:null}));return i.length===0&&a>0&&i.push({id:"policy-approval-required",action:"Policy event requires approval",class:"approval_required",target:null,project:t.project??null,host:t.host??null,source:"policy_event",created_at:null}),{pending:i,counts:{pending:i.length}}}function Lw(e){return{id:e.id,action:e.action,class:e.class,target:e.target,project:e.project,host:e.host,source:"approvals",created_at:e.created_at}}function Dw(e,t){return(!t.project||e.project===t.project)&&(!t.host||e.host===t.host)}function Hw(e,t,r){let o=Uo({db:e,project:t.project,host:t.host,since:t.since,until:t.until,groupBy:"host",limit:r});return{totals:{runs:o.totals.total_runs,reported_runs:o.totals.reported_runs,cost_reported_runs:o.totals.cost_reported_runs,not_reported_runs:o.totals.not_reported_runs,tokens_in:o.totals.tokens_in,tokens_out:o.totals.tokens_out,total_usd:o.totals.total_usd,coverage:o.totals.coverage},by_project:o.by_project.map(ta),by_host:o.by_host.map(ta),by_session:o.by_session.map(ta),by_run:o.by_run.map(ta)}}function ta(e){return{key:e.key,label:e.label,runs:e.total_runs,reported_runs:e.reported_runs,cost_reported_runs:e.cost_reported_runs,not_reported_runs:e.not_reported_runs,tokens_in:e.tokens_in,tokens_out:e.tokens_out,total_usd:e.total_usd,coverage:e.coverage}}function $w(e,t){if(!e||typeof e!="object"||Array.isArray(e))return null;let r=e[t];return typeof r=="string"&&r.length>0?r:null}function hm(){return{columns:[]}}function Fw(){return{pending:[],counts:{pending:0}}}function Uw(){return{totals:{runs:0,reported_runs:0,cost_reported_runs:0,not_reported_runs:0,tokens_in:0,tokens_out:0,total_usd:0,coverage:0},by_project:[],by_host:[],by_session:[],by_run:[]}}async function Bw(e){let t=mm.join(e,"proposals"),r;try{r=await jw(t)}catch{return[]}let o=[];for(let n of r.filter(a=>a.endsWith(".md")).sort()){let a=await Iw(mm.join(t,n),"utf8");o.push({filename:n,target:Vw(a,"Target"),summary:Ww(a,"Summary")})}return o}function Vw(e,t){return e.match(new RegExp(`^${t}:\\s*(.+)$`,"mu"))?.[1]?.trim()??null}function Ww(e,t){return e.match(new RegExp(`^## ${t}\\s*$\\n+([\\s\\S]*?)(?:\\n+## |$)`,"mu"))?.[1]?.trim()??null}function Jw(e,t){return e.filter(r=>{let o=!t.project||r.scope_projects.length===0||r.scope_projects.includes(t.project),n=!t.host||r.scope_hosts.length===0||r.scope_hosts.includes(t.host);return o&&n})}function qw(e){let t=ym();for(let r of e)t[r.status]+=1;return t}function ym(){return Object.fromEntries(Tw.map(e=>[e,0]))}function Qe(e,t,r){return e.filter(o=>{let n=Date.parse(r(o));return!(!Number.isFinite(n)||t.since!==null&&n<t.since||t.until!==null&&n>t.until)})}function Gw(e){return{since:gm(e.since,"since"),until:gm(e.until,"until")}}function gm(e,t){if(!e)return null;let r=Date.parse(e);if(!Number.isFinite(r))throw new Error(`dashboard data --${t} must be an ISO date/time`);return r}function Kw(e,t){return le(e.details,t.key,t.value)}function zw(e){return le(e.details,"decision","approval_required")||le(e.details,"approval_required")||le(e.details,"action","approval_required")}function _m(e,t){return{project:e.project??null,host:e.host??null,limit:t,since:e.since??null,until:e.until??null}}function Xw(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e??50),1),200):50}function fm(e){return ir(H(e))}import{mkdir as Yw,writeFile as Qw}from"node:fs/promises";import Gi from"node:path";async function zi(e={}){let t=await Bo(e),r=Gi.resolve(e.output??Gi.join(f(e.home).home,"generated","dashboard","index.html"));return await Yw(Gi.dirname(r),{recursive:!0,mode:448}),await Qw(r,bm(t),{encoding:"utf8",mode:384}),{outputPath:r,generated_at:t.generated_at,read_only:!0,data:t}}function bm(e){let t=lR(e.capabilities),r=e.audit.policy_blocks.length,o=e.policy.counts.approvals_required,n=Zw(e),a=n?n.work.columns.reduce((s,i)=>s+i.items.length,0):0;return`<!doctype html>
|
|
930
930
|
<html lang="en">
|
|
931
931
|
<head>
|
|
932
932
|
<meta charset="utf-8">
|
|
933
933
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
934
934
|
<title>NativeSoul Local Dashboard</title>
|
|
935
|
-
<style>${
|
|
935
|
+
<style>${uR()}</style>
|
|
936
936
|
</head>
|
|
937
937
|
<body>
|
|
938
938
|
<main class="shell">
|
|
@@ -958,17 +958,17 @@ ${n.content}`)>=.35&&o!==Op(n.content)){let s=Np(n.content);if([...r].some(l=>l.
|
|
|
958
958
|
</section>
|
|
959
959
|
|
|
960
960
|
<section class="layout">
|
|
961
|
-
${n?
|
|
962
|
-
${n?
|
|
963
|
-
${n?
|
|
961
|
+
${n?eR(n):""}
|
|
962
|
+
${n?tR(n):""}
|
|
963
|
+
${n?rR(n):""}
|
|
964
964
|
|
|
965
|
-
${je("Memory Lifecycle",[
|
|
965
|
+
${je("Memory Lifecycle",[sR(e.memories.summary),$e(e.memories.recent,s=>`
|
|
966
966
|
<li>
|
|
967
967
|
<div><strong>${w(s.summary)}</strong><small>${w(s.scope.project)} · ${w(s.status)}</small></div>
|
|
968
|
-
<span class="chip ${
|
|
968
|
+
<span class="chip ${cR(s.status)}">${w(s.authority)}</span>
|
|
969
969
|
</li>`),er(e.memories.recent,"No active/recent memories in this scope.")].join(""))}
|
|
970
970
|
|
|
971
|
-
${je("Capability Readiness",[
|
|
971
|
+
${je("Capability Readiness",[iR(),$e(e.capabilities,s=>`
|
|
972
972
|
<li>
|
|
973
973
|
<div><strong>${w(s.uid)}</strong><small>${w(s.host)} · ${w(s.normalized_kind)} · ${w(s.source)}</small></div>
|
|
974
974
|
<span class="chip ${Hi(s)}">${_t(s)}</span>
|
|
@@ -977,7 +977,7 @@ ${n.content}`)>=.35&&o!==Op(n.content)){let s=Np(n.content);if([...r].some(l=>l.
|
|
|
977
977
|
${je("Commitments",[$e(e.commitments,s=>`
|
|
978
978
|
<li>
|
|
979
979
|
<div><strong>${w(s.summary)}</strong><small>${w(s.project_id)} · ${w(s.status)}${s.due_at?` · due ${w(s.due_at)}`:""}</small></div>
|
|
980
|
-
<span class="chip ${
|
|
980
|
+
<span class="chip ${dR(s.status)}">${w(s.status)}</span>
|
|
981
981
|
</li>`),er(e.commitments,"No commitments match these filters.")].join(""))}
|
|
982
982
|
|
|
983
983
|
${je("Heartbeat And Runs",[ra([["Leases",e.heartbeat.leases.length],["Runs",e.heartbeat.runs.length],["Schedules",e.schedules.length]]),$e(e.heartbeat.runs,s=>`
|
|
@@ -1021,37 +1021,37 @@ ${n.content}`)>=.35&&o!==Op(n.content)){let s=Np(n.content);if([...r].some(l=>l.
|
|
|
1021
1021
|
<span>${w(e)}</span>
|
|
1022
1022
|
<strong>${t}</strong>
|
|
1023
1023
|
<small>${w(o)}</small>
|
|
1024
|
-
</article>`}function Zw(e){return e.schema_version>=2&&"work"in e&&"approvals"in e&&"cost"in e?e:null}function
|
|
1024
|
+
</article>`}function Zw(e){return e.schema_version>=2&&"work"in e&&"approvals"in e&&"cost"in e?e:null}function eR(e){if(e.work.columns.length===0)return"";let t=`<div class="board-grid">${e.work.columns.map(r=>`
|
|
1025
1025
|
<section class="board-column">
|
|
1026
1026
|
<div class="board-column-head">
|
|
1027
|
-
<strong>${w(
|
|
1027
|
+
<strong>${w(nR(r.status))}</strong>
|
|
1028
1028
|
<span class="chip neutral">${r.count}</span>
|
|
1029
1029
|
</div>
|
|
1030
1030
|
${$e(r.items,o=>`
|
|
1031
1031
|
<li>
|
|
1032
1032
|
<div><strong>${w(o.title)}</strong><small>${w(o.project)}${o.host?` · ${w(o.host)}`:""}${o.linked_run_id?` · run ${w(o.linked_run_id)}`:""}</small></div>
|
|
1033
|
-
<span class="chip ${
|
|
1033
|
+
<span class="chip ${aR(o.status)}">${w(o.priority)}</span>
|
|
1034
1034
|
</li>`)}
|
|
1035
|
-
</section>`).join("")}</div>`;return je("Work Board",t)}function
|
|
1035
|
+
</section>`).join("")}</div>`;return je("Work Board",t)}function tR(e){return e.approvals.pending.length===0?"":je("Pending Approvals",[$e(e.approvals.pending,t=>`
|
|
1036
1036
|
<li>
|
|
1037
1037
|
<div><strong>${w(t.action)}</strong><small>${w(t.class)}${t.project?` · ${w(t.project)}`:""}${t.host?` · ${w(t.host)}`:""}${t.target?` · ${w(t.target)}`:""}</small></div>
|
|
1038
1038
|
<span class="chip amber">${w(t.source)}</span>
|
|
1039
|
-
</li>`),'<p class="helper">approve via: nativesoul approvals approve <id> --confirm</p>'].join(""))}function
|
|
1039
|
+
</li>`),'<p class="helper">approve via: nativesoul approvals approve <id> --confirm</p>'].join(""))}function rR(e){if(e.cost.totals.cost_reported_runs===0)return"";let t=[ra([["Reported",e.cost.totals.reported_runs],["Not reported",e.cost.totals.not_reported_runs],["Coverage %",Math.round(e.cost.totals.coverage*100)]]),`<div class="cost-total"><span>Total reported</span><strong>${w(vm(e.cost.totals.total_usd))}</strong></div>`,Ki("By Host",e.cost.by_host),Ki("By Session",e.cost.by_session),Ki("By Run",e.cost.by_run)].filter(Boolean);return je("Cost",t.join(""))}function Ki(e,t){let r=t.filter(o=>o.reported_runs>0||o.not_reported_runs>0);return r.length===0?"":`<div class="cost-group">
|
|
1040
1040
|
<h2>${w(e)}</h2>
|
|
1041
1041
|
${$e(r,o=>`
|
|
1042
1042
|
<li>
|
|
1043
|
-
<div><strong>${w(o.label)}</strong><small>${w(
|
|
1043
|
+
<div><strong>${w(o.label)}</strong><small>${w(oR(o))}${o.not_reported_runs>0?" · not reported by host":""}</small></div>
|
|
1044
1044
|
<span class="chip ${o.cost_reported_runs>0?"green":"neutral"}">${w(o.cost_reported_runs>0?vm(o.total_usd):"not reported")}</span>
|
|
1045
1045
|
</li>`)}
|
|
1046
|
-
</div>`}function vm(e){return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:4}).format(e)}function
|
|
1046
|
+
</div>`}function vm(e){return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:4}).format(e)}function oR(e){return`${e.reported_runs}/${e.runs} reported (${Math.round(e.coverage*100)}%)`}function nR(e){return e.replaceAll("_"," ").replace(/\b\w/g,t=>t.toUpperCase())}function aR(e){return e==="done"?"green":e==="blocked"||e==="failed"?"red":e==="in_progress"||e==="review"?"cyan":"amber"}function je(e,t){return`<section class="panel">
|
|
1047
1047
|
<div class="panel-head"><p class="eyebrow"><span>›</span> ${w(e)}</p></div>
|
|
1048
1048
|
${t}
|
|
1049
|
-
</section>`}function $e(e,t){return e.length===0?"":`<ul class="records">${e.map(t).join("")}</ul>`}function er(e,t){return e.length===0?`<p class="empty">${w(t)}</p>`:""}function ra(e){return`<div class="split-stats">${e.map(([t,r])=>`<div><strong>${r}</strong><span>${w(t)}</span></div>`).join("")}</div>`}function
|
|
1049
|
+
</section>`}function $e(e,t){return e.length===0?"":`<ul class="records">${e.map(t).join("")}</ul>`}function er(e,t){return e.length===0?`<p class="empty">${w(t)}</p>`:""}function ra(e){return`<div class="split-stats">${e.map(([t,r])=>`<div><strong>${r}</strong><span>${w(t)}</span></div>`).join("")}</div>`}function sR(e){let t=Object.values(e).reduce((o,n)=>o+n,0);return`<div class="lifecycle" aria-label="memory lifecycle">${[["active","green"],["candidate","amber"],["rejected","red"],["expired","neutral"],["forgotten","neutral"],["superseded","neutral"]].map(([o,n])=>{let a=e[o],s=t===0?0:Math.max(6,Math.round(a/t*100));return`<span class="${n}" style="width:${s}%" title="${o}: ${a}"></span>`}).join("")}</div>`}function iR(){return`<div class="legend">
|
|
1050
1050
|
<span><i class="green"></i>ready</span>
|
|
1051
1051
|
<span><i class="cyan"></i>full native capability</span>
|
|
1052
1052
|
<span><i class="amber"></i>official-fallback</span>
|
|
1053
1053
|
<span><i class="red"></i>degraded</span>
|
|
1054
|
-
</div>`}function
|
|
1054
|
+
</div>`}function lR(e){return{total:e.length,ready:e.filter(t=>t.ready).length}}function cR(e){return e==="active"?"green":e==="candidate"?"amber":e==="rejected"||e==="forgotten"?"red":"neutral"}function dR(e){return e==="open"?"amber":e==="completed"?"green":"neutral"}function w(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function uR(){return`
|
|
1055
1055
|
:root {
|
|
1056
1056
|
--red-400:#ff6b6b; --red-500:#ff4444; --red-600:#f02d3a; --red-glow:rgba(255,68,68,.45); --red-glow-soft:rgba(255,68,68,.16);
|
|
1057
1057
|
--ink-950:#06070d; --ink-900:#0a0c14; --ink-850:#0e1019; --ink-800:#12151f; --ink-700:#1c202d; --ink-600:#262b3a;
|
|
@@ -1078,36 +1078,36 @@ h1{margin:0;color:var(--text-100);font:700 44px/1.05 var(--font-display);letter-
|
|
|
1078
1078
|
.empty{margin:0;color:var(--text-500);font:500 13px/1.5 var(--font-mono);border:1px dashed var(--ink-600);border-radius:10px;padding:14px}footer{display:flex;justify-content:space-between;gap:16px;margin-top:18px;padding-top:18px;border-top:1px solid rgba(255,255,255,.06);color:var(--text-500);font:600 11px/1.4 var(--font-mono);text-transform:uppercase}
|
|
1079
1079
|
@media (max-width: 900px){.topbar,.layout{grid-template-columns:1fr}.summary-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.terminal code{white-space:normal}.records small{max-width:260px}}
|
|
1080
1080
|
@media (max-width: 560px){.summary-grid{grid-template-columns:1fr}.shell{padding:22px 12px}h1{font-size:34px}.records li{align-items:flex-start;flex-direction:column}.records small{max-width:100%}footer{flex-direction:column}.split-stats{grid-template-columns:1fr}}
|
|
1081
|
-
`}import{readdir as
|
|
1082
|
-
`);return r.length>t?`${r.slice(0,t-3)}...`:r}function Yi(e,t){e.truncated=!0,e.reasons.includes(t)||e.reasons.push(t)}function
|
|
1081
|
+
`}import{readdir as pR,readFile as mR,realpath as gR}from"node:fs/promises";import Er from"node:path";var fR=4,hR=500,yR=12e3,Vo={exactSegments:[".aws",".docker",".gnupg",".kube",".netrc",".next",".npmrc",".pypirc",".ssh","build","coverage","dist","node_modules","out","vendor"],segmentPrefixes:[".env","id_rsa"],segmentSuffixes:[".key",".pem"],segmentContains:["credential"],deniedNestedSegments:[[".git","objects"]]},wm=[{filename:"package-lock.json",packageManager:"npm"},{filename:"npm-shrinkwrap.json",packageManager:"npm"},{filename:"pnpm-lock.yaml",packageManager:"pnpm"},{filename:"yarn.lock",packageManager:"yarn"},{filename:"bun.lock",packageManager:"bun"},{filename:"bun.lockb",packageManager:"bun"},{filename:"deno.lock",packageManager:"deno"},{filename:"poetry.lock",packageManager:"poetry"},{filename:"uv.lock",packageManager:"uv"},{filename:"Pipfile.lock",packageManager:"pipenv"},{filename:"go.sum",packageManager:"go modules"},{filename:"Cargo.lock",packageManager:"cargo"},{filename:"composer.lock",packageManager:"composer"},{filename:"Gemfile.lock",packageManager:"bundler"}],Rm=[{filename:"package.json",language:"JavaScript/TypeScript",parser:AR},{filename:"pyproject.toml",language:"Python",parser:ER},{filename:"requirements.txt",language:"Python",parser:PR},{filename:"go.mod",language:"Go",packageManager:"go modules",parser:CR},{filename:"Cargo.toml",language:"Rust",packageManager:"cargo",parser:xR},{filename:"pom.xml",language:"Java",packageManager:"maven",parser:jR},{filename:"build.gradle",language:"Java/Kotlin",packageManager:"gradle",parser:km},{filename:"settings.gradle",language:"Java/Kotlin",packageManager:"gradle",parser:km},{filename:"composer.json",language:"PHP",packageManager:"composer",parser:IR},{filename:"Gemfile",language:"Ruby",packageManager:"bundler",parser:TR}],_R=["README.md","README.markdown","README.txt","README"],bR={readdir:pR,readFile:mR,realpath:gR};async function Qi(e={}){let t=e.fileSystem??bR,r=await kR(e.root??process.cwd(),t),o=e.maxDepth??fR,n=e.maxEntries??hR,a=e.readmeMaxBytes??yR,s=Ze(),i=new Set,l=[],c={truncated:!1,max_depth:o,max_entries:n,entries_seen:0,reasons:[]},d=null,p={get value(){return d},set value(k){d=k}};await vR({fs:t,root:r,readmeMaxBytes:a,facts:s,manifests:i,readmeRef:p});let g=await wR(r,t),y=await Sm({fs:t,root:r,current:r,relativeSegments:[],depth:0,maxDepth:o,maxEntries:n,readmeMaxBytes:a,facts:s,manifests:i,truncation:c,readmeRef:p});return c.truncated&&l.push(`scan truncated: ${c.reasons.join(", ")}`),{schema_version:1,root:r,generated_at:new Date().toISOString(),languages:Xi(s.languages),frameworks:Xi(s.frameworks),tooling:{package_managers:Xi(s.packageManagers),test_runners:[...s.testRunners].sort(),linters:[...s.linters].sort()},manifests:[...i].sort(),git_remotes:NR(g),structure:y,readme:d??{file:null,summary:"",bytes_read:0,truncated:!1,fenced_code_blocks_stripped:!1},truncation:c,warnings:l}}function Pr(e){let t=e.map(r=>r.toLowerCase());for(let r of t)if(Vo.exactSegments.includes(r)||Vo.segmentPrefixes.some(o=>r.startsWith(o))||Vo.segmentSuffixes.some(o=>r.endsWith(o))||Vo.segmentContains.some(o=>r.includes(o)))return!0;return Vo.deniedNestedSegments.some(r=>DR(t,r))}async function vR(e){let t;try{t=await e.fs.readdir(e.root,{withFileTypes:!0})}catch{return}for(let r of t.sort((o,n)=>o.name.localeCompare(n.name))){if(!r.isFile())continue;let o=r.name,n=[r.name];if(Pr(n))continue;let a=Er.join(e.root,r.name);if(Im(r.name)){await Am(a,o,e);continue}if(Tm(r.name)){jm(r.name,o,e.facts);continue}!e.readmeRef.value&&Cm(r.name)&&(e.readmeRef.value=await Em(a,o,e.fs,e.readmeMaxBytes))}}async function kR(e,t){let r=Er.resolve(e);try{return await t.realpath(r)}catch{return r}}async function Sm(e){let r={name:e.relativeSegments.at(-1)??(Er.basename(e.root)||e.root),type:"directory",children:[]};if(e.depth>=e.maxDepth)return Yi(e.truncation,`max_depth:${e.maxDepth}`),r;if(e.truncation.entries_seen>=e.maxEntries)return Yi(e.truncation,`max_entries:${e.maxEntries}`),r;let o;try{o=await e.fs.readdir(e.current,{withFileTypes:!0})}catch{return r}for(let n of o.sort((a,s)=>a.name.localeCompare(s.name))){let a=[...e.relativeSegments,n.name];if(Pr(a))continue;if(e.truncation.entries_seen>=e.maxEntries){Yi(e.truncation,`max_entries:${e.maxEntries}`);break}e.truncation.entries_seen+=1;let s=Er.join(e.current,n.name),i=a.join("/");if(n.isDirectory()){r.children?.push(await Sm({...e,current:s,relativeSegments:a,depth:e.depth+1}));continue}if(n.isFile()){if(Im(n.name)){r.children?.push({name:n.name,type:"metadata_file"}),e.manifests.has(i)||await Am(s,i,e);continue}if(Tm(n.name)){r.children?.push({name:n.name,type:"metadata_file"}),jm(n.name,i,e.facts);continue}Cm(n.name)&&((!e.readmeRef.value||e.readmeRef.value.file===i)&&r.children?.push({name:n.name,type:"metadata_file"}),e.readmeRef.value||(e.readmeRef.value=await Em(s,i,e.fs,e.readmeMaxBytes)))}}return r.children?.length===0&&delete r.children,r}async function Am(e,t,r){let o=Er.basename(t),n=Rm.find(a=>a.filename===o);if(n&&!Pr(t.split("/"))&&!r.manifests.has(t)){r.manifests.add(t),Q(r.facts.languages,n.language,t),"packageManager"in n&&n.packageManager&&Q(r.facts.packageManagers,n.packageManager,t);try{let a=await r.fs.readFile(e,{encoding:"utf8"});OR(r.facts,n.parser(a,t))}catch{}}}async function Em(e,t,r,o){if(Pr(t.split("/")))return{file:null,summary:"",bytes_read:0,truncated:!1,fenced_code_blocks_stripped:!1};let n=await r.readFile(e,{encoding:"utf8"}),a=Buffer.byteLength(n,"utf8"),s=a>o?n.slice(0,o):n,i=MR(s);return{file:t,summary:LR(i,2e3),bytes_read:Math.min(a,o),truncated:a>o,fenced_code_blocks_stripped:i!==s}}async function wR(e,t){if(Pr([".git","config"]))return[];try{let o=await t.readFile(Er.join(e,".git","config"),{encoding:"utf8"});return RR(o)}catch{return[]}}function RR(e){let t=[],r=!1;for(let o of e.split(/\r?\n/u)){if(o.match(/^\s*\[remote\s+"[^"]+"\]\s*$/u)){r=!0;continue}if(/^\s*\[/u.test(o)){r=!1;continue}if(!r)continue;let a=o.match(/^\s*url\s*=\s*(.+?)\s*$/u)?.[1];if(!a)continue;let s=SR(a);s&&t.push(s)}return t}function SR(e){let t=e.trim().replace(/\.git$/u,""),r=t.match(/^git@([^:]+):(.+)$/u),o=t.match(/^(?:https?|ssh):\/\/(?:[^@/\s]+@)?([^/]+)\/(.+)$/u),n=r??o;if(!n?.[1]||!n[2])return null;let a=n[1],s=(a.includes("@")?a.slice(a.lastIndexOf("@")+1):a).toLowerCase().replace(/:\d+$/u,"");if(!s)return null;let l=n[2].split("/").filter(Boolean).at(-1);return l?{host:s,name:l.toLowerCase()}:null}function AR(e,t){try{let r=JSON.parse(e),o=new Set([...Object.keys(r.dependencies??{}),...Object.keys(r.devDependencies??{})]),n=Ze();o.has("typescript")&&Q(n.languages,"TypeScript",t);for(let[a,s]of[["react","React"],["next","Next.js"],["vue","Vue"],["nuxt","Nuxt"],["svelte","Svelte"],["astro","Astro"],["express","Express"],["fastify","Fastify"],["vite","Vite"]])o.has(a)&&Q(n.frameworks,s,t);for(let[a,s]of Object.entries(r.scripts??{})){let i=`${a} ${s}`.toLowerCase();(a==="test"||/\b(vitest|jest|node --test|mocha)\b/u.test(i))&&n.testRunners.add(s.includes("vitest")?"vitest":s.includes("jest")?"jest":"npm test"),(a==="lint"||/\beslint\b/u.test(i))&&n.linters.add("eslint")}return n}catch{return{}}}function ER(e,t){let r=Ze(),o=e.toLowerCase();return o.includes("[tool.poetry")&&Q(r.packageManagers,"poetry",t),o.includes("[tool.uv")&&Q(r.packageManagers,"uv",t),Pm(o,t,r),xm(o,r),r}function PR(e,t){let r=Ze();return Q(r.packageManagers,"pip",t),Pm(e.toLowerCase(),t,r),xm(e.toLowerCase(),r),r}function xR(e,t){let r=Ze();return(e.toLowerCase().includes("actix")||e.toLowerCase().includes("axum"))&&Q(r.frameworks,e.toLowerCase().includes("axum")?"Axum":"Actix",t),r}function jR(e,t){let r=Ze();return e.toLowerCase().includes("spring-boot")&&Q(r.frameworks,"Spring Boot",t),r}function km(e,t){let r=Ze();return e.toLowerCase().includes("springframework.boot")&&Q(r.frameworks,"Spring Boot",t),r}function IR(e,t){let r=Ze();return e.toLowerCase().includes("laravel/framework")&&Q(r.frameworks,"Laravel",t),r}function TR(e,t){let r=Ze();return/gem\s+["']rails["']/u.test(e)&&Q(r.frameworks,"Rails",t),r}function CR(){return{}}function Pm(e,t,r){for(let[o,n]of[["django","Django"],["fastapi","FastAPI"],["flask","Flask"]])e.includes(o)&&Q(r.frameworks,n,t)}function xm(e,t){e.includes("pytest")&&t.testRunners.add("pytest"),e.includes("ruff")&&t.linters.add("ruff")}function jm(e,t,r){let o=wm.find(n=>n.filename===e);o&&Q(r.packageManagers,o.packageManager,t)}function Im(e){return Rm.some(t=>t.filename===e)}function Tm(e){return wm.some(t=>t.filename===e)}function Cm(e){return _R.some(t=>t.toLowerCase()===e.toLowerCase())}function Ze(){return{languages:new Map,frameworks:new Map,packageManagers:new Map,testRunners:new Set,linters:new Set}}function Q(e,t,r){let o=e.get(t)??new Set;o.add(r),e.set(t,o)}function OR(e,t){for(let[r,o]of t.languages??[])for(let n of o)Q(e.languages,r,n);for(let[r,o]of t.frameworks??[])for(let n of o)Q(e.frameworks,r,n);for(let[r,o]of t.packageManagers??[])for(let n of o)Q(e.packageManagers,r,n);for(let r of t.testRunners??[])e.testRunners.add(r);for(let r of t.linters??[])e.linters.add(r)}function Xi(e){return[...e.entries()].map(([t,r])=>({name:t,evidence:[...r].sort()})).sort((t,r)=>t.name.localeCompare(r.name))}function NR(e){let t=new Set;return e.filter(r=>{let o=`${r.host}/${r.name}`;return t.has(o)?!1:(t.add(o),!0)}).sort((r,o)=>`${r.host}/${r.name}`.localeCompare(`${o.host}/${o.name}`))}function MR(e){return e.replace(/```[\s\S]*?```/gu,"").replace(/~~~[\s\S]*?~~~/gu,"")}function LR(e,t){let r=e.split(/\r?\n/u).map(o=>o.trim()).filter(Boolean).join(`
|
|
1082
|
+
`);return r.length>t?`${r.slice(0,t-3)}...`:r}function Yi(e,t){e.truncated=!0,e.reasons.includes(t)||e.reasons.push(t)}function DR(e,t){for(let r=0;r<=e.length-t.length;r+=1)if(t.every((o,n)=>e[r+n]===o))return!0;return!1}import{mkdir as FR,readFile as UR,writeFile as BR}from"node:fs/promises";import tr from"node:path";async function el(e){let t=f(e.home),r=_(t.database),o;try{let n=r.findPendingApprovalMatch(Zi(e));if(!n.available)return{approval:null,created:!1,available:!1,warning:n.warning};if(n.approval)return{approval:n.approval,created:!1,available:!0,warning:null};let a=r.createApproval({id:T("approval"),...Zi(e)});o={approval:a.approval,created:!!a.approval,available:a.available,warning:a.warning}}finally{r.close()}return o.created&&o.approval&&await h({home:t.home,type:"approval_requested",details:rl(o.approval)}),o}async function xr(e){let t=f(e.home),r=_(t.database),o;try{let n=r.decideApproval(e.id,{status:e.status,reviewer:e.reviewer??"local-operator",reason:e.reason??null});o={approval:n.approval,available:n.available,warning:n.warning}}catch(n){throw n instanceof Ce,n}finally{r.close()}return o.approval&&await h({home:t.home,type:o.approval.status==="approved"?"approval_approved":"approval_rejected",details:rl(o.approval)}),o}async function tl(e){let t=f(e.home),r=_(t.database),o;try{let n=r.createDecidedApproval({id:T("approval"),...Zi(e),status:"approved",reviewer:`standing-order:${e.standingOrderId}`,reason:e.reason});o={approval:n.approval,available:n.available,warning:n.warning,created:!!n.approval}}finally{r.close()}return o.approval&&await h({home:t.home,type:"approval_auto_approved",details:{...rl(o.approval),standing_order:e.standingOrderId}}),o}function oa(e){let t=_(f(e.home).database);try{let r=t.getApproval(e.id);return{approval:r.approval,available:r.available,warning:r.warning}}finally{t.close()}}function na(e={}){let t=_(f(e.home).database);try{return t.listApprovals(e.status)}finally{t.close()}}function Zi(e){return{action:e.action,class:e.class,target:e.target??null,project:e.project??null,host:e.host??null}}function rl(e){return{id:e.id,action:e.action,class:e.class,target:e.target,project:e.project,host:e.host,status:e.status,reviewer:e.reviewer,reason:e.reason}}async function et(e){let t=await kt(e),r=await HR(e,t);if(r){let n=await tl({home:e.home,action:t.action,class:t.class,target:t.target,project:e.project??null,host:e.host??null,standingOrderId:r.id,reason:`standing-order allowed:${t.action}`});return{evaluation:t,approval:n.approval,approval_created:n.created,approval_available:n.available,warning:n.warning}}if(t.decision!=="approval_required")return{evaluation:t,approval:null,approval_created:!1,approval_available:!0,warning:null};let o=await el({home:e.home,action:t.action,class:t.class,target:t.target,project:e.project??null,host:e.host??null});return{evaluation:t,approval:o.approval,approval_created:o.created,approval_available:o.available,warning:o.warning}}async function HR(e,t){return t.decision!=="allowed"||!t.matched_standing_order||!$R(e.className)?null:(await vt(e.home)).find(o=>o.id===t.matched_standing_order&&o.allowed.includes(e.action)&&Ji(o,e))??null}function $R(e){return e==="write_project"||e==="external_write"}async function nl(e){let t=f(e.home),r=K(e.scan.root,t.home),o={id:r.id,root:e.scan.root},n=VR(e.scan,o.id),a=WR(e.scan),s=JR(e.scan),i=await ol(t.home,"USER.md"),l=await ol(t.home,"TOOLS.md");return{schema_version:1,dry_run_default:!0,generated_at:e.generatedAt??new Date().toISOString(),scan:e.scan,project:o,sinks:{candidate_memories:n,user_md:{sink:"managed_markdown",target:"USER.md",managed_content:a,merged_preview:pr(i,a)},tools_md:{sink:"managed_markdown",target:"TOOLS.md",managed_content:s,merged_preview:pr(l,s)},project_registry:{sink:"project_registry",root:e.scan.root,project_id:r.id,resolution:r}},warnings:[...e.scan.warnings,...e.scan.truncation.truncated?["Proposal is based on a truncated scan; review before applying."]:[]]}}async function al(e){let t=await v(e.home),r=e.host??"codex",o=[],n=e.proposal.project.id;return o.push(await qR({home:t.home,proposal:e.proposal,host:r,project:n})),o.push(await Om({home:t.home,proposal:e.proposal,host:r,project:n,sink:"user_md"})),o.push(await Om({home:t.home,proposal:e.proposal,host:r,project:n,sink:"tools_md"})),o.push(await GR({home:t.home,proposal:e.proposal,host:r,project:n})),{applied:o.some(a=>a.applied),dry_run:!1,home:t.home,proposal:e.proposal,sinks:o,warnings:o.flatMap(a=>a.warning?[a.warning]:[])}}function VR(e,t){let r=[],o=[Fe("Languages",e.languages.map(n=>n.name)),Fe("Frameworks",e.frameworks.map(n=>n.name)),Fe("Package managers",e.tooling.package_managers.map(n=>n.name)),Fe("Test runners",e.tooling.test_runners),Fe("Linters",e.tooling.linters)].filter(Boolean);return o.length>0&&r.push({sink:"candidate_memory",project:t,content:[`Dev-environment scan stack facts for ${tr.basename(e.root)}.`,"",...o].join(`
|
|
1083
1083
|
`),confidence:.6,authority:"observed",sensitivity:"normal",source:{kind:"dev_environment_scan",root:e.root,schema_version:e.schema_version}}),(e.manifests.length>0||e.readme.summary.length>0)&&r.push({sink:"candidate_memory",project:t,content:[`Dev-environment scan conventions for ${tr.basename(e.root)}.`,"",e.manifests.length>0?`Manifests: ${e.manifests.join(", ")}`:null,e.readme.summary.length>0?`README summary: ${e.readme.summary}`:null,e.truncation.truncated?`Scan was truncated: ${e.truncation.reasons.join(", ")}`:null].filter(n=>!!n).join(`
|
|
1084
|
-
`),confidence:e.truncation.truncated?.45:.55,authority:"observed",sensitivity:"normal",source:{kind:"dev_environment_scan",root:e.root,schema_version:e.schema_version}}),r}function
|
|
1085
|
-
`)}function
|
|
1086
|
-
`)}async function
|
|
1087
|
-
`).trim()}function ZS(e){let t=il(e,"ttl_seconds"),r=il(e,"lease_ttl"),o=tR(e,"heartbeat_ttl_seconds"),n=rR(t??r??o);return Number.isFinite(n)?n:aa}function eR(e,t,r){let o=il(e,t);return o?/^(true|yes|1)$/i.test(o)?!0:/^(false|no|0)$/i.test(o)?!1:r:r}function il(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`^\\s*heartbeat:\\s*$[\\s\\S]*?^\\s{2}${r}:\\s*([^#\\n]+)`,"mu"))?.[1]?.trim().replace(/^["']|["']$/g,"")??null}function tR(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`^\\s*${r}:\\s*([^#\\n]+)`,"mu"))?.[1]?.trim().replace(/^["']|["']$/g,"")??null}function rR(e){if(!e)return aa;let t=e.match(/^(\d+)$/);if(t)return Number(t[1]);let r=e.match(/^(\d+)\s*([smh])$/i);if(!r)return Number.NaN;let o=Number(r[1]),n=r[2]?.toLowerCase();return n==="s"?o:n==="m"?o*60:o*60*60}async function dl(e){let t=await v(e.home);_(t.database).close();let o=qe(e.host),n=(await Promise.all(o.map(s=>Jr(s)))).flat(),a=[];for(let s of o){let i=Ke(s,e.surface);for(let l of i){let c=n.find(R=>R.host===s),d=_r(s,e.targetRoot,l),p=d.managedBlock?await Kr({home:t.home,host:s,apply:e.apply,targetPath:d.managedBlock}):oR(s,l,!e.apply),g=await Ao({home:t.home,host:s,apply:e.apply,targetPath:d.mcpRegistration,commandMode:"package"}),y=await pi({home:t.home,host:s,surface:l,apply:e.apply,targetPath:d.plugin}),k=await yt({home:t.home,host:s,surface:l,mode:"leader",apply:e.apply,pluginEnabled:y.enabled,hostConfigRoot:Ye(s,e.targetRoot),targetRoot:e.targetRoot}),S=e.apply?await Tt({home:t.home,host:s}):[],U=e.apply?S.reduce((R,Rt)=>R+Rt.count,0):c?.sources.length??0,ve=k.warnings.filter(R=>R==="NATIVE_SCHEDULE_UNSUPPORTED").map(()=>"NATIVE_SCHEDULE_AVAILABLE_NOT_ENABLED"),ke=[...k.warnings.filter(R=>R!=="NATIVE_SCHEDULE_UNSUPPORTED"),...y.issues.map(R=>R.code),...c?.detected?[]:[`${s.toUpperCase()}_NOT_DETECTED`]],nt=[p.backupPath,g.backupPath,y.backupPath].filter(R=>R!==null),Ue=ke.length===0&&U>0?"ready":"degraded";a.push({host:s,surface:l,detected:c?.detected??!1,status:Ue,managed_block:p,mcp_registration:g,plugin:y,schedule:k,capability_count:U,snapshots:nt,warnings:ke,notices:ve})}}return{dryRun:!e.apply,applied:e.apply,home:t.home,hosts:a,status:a.every(s=>s.status==="ready")?"ready":"degraded"}}function oR(e,t,r){let o=E("");return{host:e,targetPath:`not-applicable:${Bt(e,t)}`,action:"noop",dryRun:r,changed:!1,beforeHash:null,afterHash:o,diff:"No managed instruction block for this host surface.",backupPath:null,applied:!1}}import nR from"node:path";import{rm as Dm}from"node:fs/promises";var ul="DELETE_NATIVESOUL_HOME";async function pl(e){if(e.purgeData===!0&&e.confirmPurge!==ul)throw new Error(`--purge-data requires --confirm-purge-nativesoul-data ${ul}`);let t=await v(e.home);_(t.database).close();let o=qe(e.host);if(e.apply)for(let l of o)for(let c of Ke(l,e.surface))await Hm({home:t.home,host:l,surface:c,apply:!1,targetRoot:e.targetRoot});let n=[];for(let l of o)for(let c of Ke(l,e.surface))n.push(await Hm({home:t.home,host:l,surface:c,apply:e.apply,targetRoot:e.targetRoot}));let a={requested:e.purgeData===!0,confirmed:e.confirmPurge===ul,applied:e.apply&&e.purgeData===!0,preserved:!(e.apply&&e.purgeData===!0)},s=nR.join(t.home,"backups"),i={path:s,applied:e.apply,preserved:!e.apply};return i.applied&&await Dm(s,{recursive:!0,force:!0}),a.applied&&await Dm(t.home,{recursive:!0,force:!0}),{dryRun:!e.apply,applied:e.apply,home:t.home,hosts:n,backups_purge:i,data_purge:a,status:n.every(l=>l.status==="ready")?"ready":"degraded"}}async function Hm(e){let t=_r(e.host,e.targetRoot,e.surface),r=t.managedBlock?await gs({home:e.home,host:e.host,apply:e.apply,targetPath:t.managedBlock}):aR(e.host,e.surface,!e.apply),o=await fi({home:e.home,host:e.host,apply:e.apply,targetPath:t.mcpRegistration}),n=await mi({home:e.home,host:e.host,surface:e.surface,apply:e.apply,targetPath:t.plugin}),a=[r.backupPath,o.backupPath,n.backupPath].filter(s=>s!==null);return{host:e.host,surface:e.surface,status:"ready",managed_block:r,mcp_registration:o,plugin:n,snapshots:a,warnings:["SCHEDULE_TEARDOWN_NOT_PERFORMED"]}}function aR(e,t,r){let o=E("");return{host:e,targetPath:`not-applicable:${Bt(e,t)}`,action:"noop",dryRun:r,changed:!1,beforeHash:null,afterHash:o,diff:"No managed instruction block for this host surface.",backupPath:null,applied:!1}}var Fm={"memory.promote":{action:"memory.promote",className:"write_local"},"memory.forget":{action:"memory.forget",className:"write_local"},"memory.reject":{action:"memory.reject",className:"write_local"},"work_item.create":{action:"work_item.create",className:"write_local"},"work_item.claim":{action:"work_item.claim",className:"write_local"},"work_item.complete":{action:"work_item.complete",className:"write_local"},"install.apply":{action:"install.apply",className:"write_local"},"policy_pack.apply":{action:"policy_pack.apply",className:"write_local"}};async function rr(e,t={}){let r=Fm[e],o={home:t.home,action:r.action,className:r.className,target:t.target??void 0,project:t.project??void 0,host:t.host??void 0},n,a,s,i;try{let l=await et(o);n=l.evaluation,a=l.approval?.id??null,s=l.approval_created,i=l.warning}catch(l){return await $m(r,t,["POLICY_GATE_UNAVAILABLE"],"error"),{status:"deny",decision:"denied",reason:`policy gate unavailable (fail-closed): ${l.message}`,evaluation:null}}return n.decision==="allowed"?{status:"allow",decision:"allowed",evaluation:n}:n.decision==="approval_required"?{status:"approval_required",decision:"approval_required",approvalId:a,approvalCreated:s,warning:i,evaluation:n}:(await $m(r,t,n.reasons,"blocked"),{status:"deny",decision:n.decision,reason:`${r.action} ${n.decision}: ${n.reasons.join(", ")}`,evaluation:n})}async function $m(e,t,r,o){try{let n=await v(t.home);await h({home:n.home,type:"policy_blocked",result:"blocked",details:{boundary:"sensitive_operation",action:e.action,class:e.className,target:t.target??null,project:t.project??null,host:t.host??null,outcome:o,reasons:r}})}catch{}}import{existsSync as _l}from"node:fs";import{mkdir as Gm,readFile as ia,rm as ER,writeFile as Km}from"node:fs/promises";import be from"node:path";import{existsSync as kR}from"node:fs";import{readdir as wR,readFile as ml}from"node:fs/promises";import wt from"node:path";import{fileURLToPath as SR}from"node:url";import Um from"node:path";var sR=new Set(["id","version","title","description","intended_use","approvals","standing_orders","policy_proposals","managed_blocks","rollback","metadata"]),iR=new Set(["id","action","authority","allowed","approval_required","scope_projects","scope_hosts","reason"]),lR=new Set(["target","summary","rationale","rollback_note"]),cR=new Set(["target","marker","content","rollback_key"]),dR=new Set(["strategy","restores","notes"]),uR=new Set(["maturity","owner","source"]),pR=new Set(["SOUL.MD","POLICY.MD"]),Bm=["AGENTS.md","CLAUDE.md","GEMINI.md","Agents.md",".claude/CLAUDE.md"],mR=new Set(Bm);function Tr(e){let t=[];return tt(e)?(Cr(e,sR,"pack",t),ne(e,"id","pack",t,/^[a-z0-9][a-z0-9-]{2,63}$/u),ne(e,"version","pack",t,/^[0-9]+\.[0-9]+\.[0-9]+$/u),ne(e,"title","pack",t),ne(e,"description","pack",t),ne(e,"intended_use","pack",t),Ir(e.approvals,"pack.approvals",t,!1),gR(e.standing_orders,t),fR(e.policy_proposals,t),hR(e.managed_blocks,t),yR(e.rollback,t),_R(e.metadata,t),vR(e,t),t):["Policy pack must be an object"]}function tt(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Vm(e){return typeof e=="string"?e:null}function gR(e,t){if(!Array.isArray(e)){t.push("pack.standing_orders must be an array");return}for(let[r,o]of e.entries()){let n=`pack.standing_orders[${r}]`;if(!tt(o)){t.push(`${n} must be an object`);continue}Cr(o,iR,n,t),ne(o,"id",n,t,/^[a-z0-9][a-z0-9-]{2,63}$/u),sa(o,"action",n,["add","propose"],t),sa(o,"authority",n,["operator-approved","proposal"],t),Ir(o.allowed,`${n}.allowed`,t,!0),Ir(o.approval_required,`${n}.approval_required`,t,!0),Ir(o.scope_projects,`${n}.scope_projects`,t,!0),Ir(o.scope_hosts,`${n}.scope_hosts`,t,!0),ne(o,"reason",n,t);let a=Array.isArray(o.allowed)?o.allowed:[],s=Array.isArray(o.approval_required)?o.approval_required:[];a.length===0&&s.length===0&&t.push(`${n} must declare at least one allowed or approval_required action`)}}function fR(e,t){if(!Array.isArray(e)){t.push("pack.policy_proposals must be an array");return}for(let[r,o]of e.entries()){let n=`pack.policy_proposals[${r}]`;if(!tt(o)){t.push(`${n} must be an object`);continue}Cr(o,lR,n,t),sa(o,"target",n,["SOUL.md","POLICY.md"],t),ne(o,"summary",n,t),ne(o,"rationale",n,t),ne(o,"rollback_note",n,t)}}function hR(e,t){if(!Array.isArray(e)){t.push("pack.managed_blocks must be an array");return}for(let[r,o]of e.entries()){let n=`pack.managed_blocks[${r}]`;if(!tt(o)){t.push(`${n} must be an object`);continue}Cr(o,cR,n,t),ne(o,"target",n,t),ne(o,"marker",n,t),ne(o,"content",n,t),ne(o,"rollback_key",n,t),typeof o.target=="string"&&bR(o.target,n,t)}}function yR(e,t){if(!tt(e)){t.push("pack.rollback must be an object");return}Cr(e,dR,"pack.rollback",t),sa(e,"strategy","pack.rollback",["proposal-only","managed-block","snapshot-required"],t),Ir(e.restores,"pack.rollback.restores",t,!0),Array.isArray(e.restores)&&e.restores.length===0&&t.push("pack.rollback.restores must include at least one rollback item"),ne(e,"notes","pack.rollback",t)}function _R(e,t){if(e!==void 0){if(!tt(e)){t.push("pack.metadata must be an object");return}Cr(e,uR,"pack.metadata",t);for(let[r,o]of Object.entries(e))o!==null&&typeof o!="string"&&typeof o!="number"&&typeof o!="boolean"&&t.push(`pack.metadata.${r} must be a scalar value`)}}function bR(e,t,r){let o=e.replaceAll("\\","/"),n=Um.basename(o).toUpperCase();(Um.isAbsolute(e)||o.includes("../")||o.startsWith("../"))&&r.push(`${t}.target must be a relative managed host file path`),pR.has(n)&&r.push(`${t}.target must not target protected SOUL.md or POLICY.md`),mR.has(o)||r.push(`${t}.target is outside supported managed-block scope`)}function vR(e,t){let r=JSON.stringify(e);/(sk-[A-Za-z0-9_-]{8,}|api[_-]?key\s*[:=]|secret\s*[:=]|token\s*[:=]|password\s*[:=])/iu.test(r)&&t.push("pack must not contain credential-like material"),/https?:\/\//iu.test(r)&&t.push("pack must not require trust in external URLs")}function Cr(e,t,r,o){for(let n of Object.keys(e))t.has(n)||o.push(`${r}.${n} is not allowed`)}function ne(e,t,r,o,n){let a=e[t];if(typeof a!="string"||a.trim()===""){o.push(`${r}.${t} must be a non-empty string`);return}n&&!n.test(a)&&o.push(`${r}.${t} has invalid format`)}function sa(e,t,r,o,n){let a=e[t];(typeof a!="string"||!o.includes(a))&&n.push(`${r}.${t} must be one of ${o.join(", ")}`)}function Ir(e,t,r,o){e===void 0&&!o||(!Array.isArray(e)||!e.every(n=>typeof n=="string"))&&r.push(`${t} must be an array of strings`)}async function gl(){return(await Wm()).map(({pack:t,source:r})=>({id:t.id,version:t.version,title:t.title,description:t.description,intended_use:t.intended_use,source:r})).sort((t,r)=>t.id.localeCompare(r.id))}async function qo(e){let r=(await Wm()).find(o=>o.pack.id===e);if(!r)throw new Error(`Policy pack not found: ${e}`);return{...r.pack,source:r.source}}async function fl(e){try{let{value:t,source:r}=e.file?{value:JSON.parse(await ml(e.file,"utf8")),source:wt.resolve(e.file)}:await RR(e.id),o=Tr(t),n=tt(t)?Vm(t.id):null;return{valid:o.length===0,id:n,source:r,errors:o,warnings:[]}}catch(t){return{valid:!1,id:e.id??null,source:e.file?wt.resolve(e.file):null,errors:[t instanceof Error?t.message:"Unknown policy pack validation error"],warnings:[]}}}async function Wm(){let e=await Jm(),t=[];for(let r of e){let o=JSON.parse(await ml(r,"utf8")),n=Tr(o);if(n.length>0)throw new Error(`Invalid built-in policy pack ${r}: ${n.join("; ")}`);t.push({pack:o,source:r})}return t}async function RR(e){if(!e)throw new Error("policy packs validate requires <id> or --file <path>");let t=await Jm();for(let r of t){let o=JSON.parse(await ml(r,"utf8"));if(tt(o)&&o.id===e)return{value:o,source:r}}throw new Error(`Policy pack not found: ${e}`)}async function Jm(){let e=AR(),t=(await wR(e)).filter(r=>r.endsWith(".json")).map(r=>wt.join(e,r)).sort();if(t.length===0)throw new Error(`No policy packs found in ${e}`);return t}function AR(){let e=wt.dirname(SR(import.meta.url)),r=[wt.resolve(process.cwd(),"policy-packs"),wt.resolve(e,"../../../policy-packs"),wt.resolve(e,"../../../../policy-packs"),wt.resolve(e,"../../../../../policy-packs")].find(o=>kR(o));if(!r)throw new Error("Built-in policy pack catalog not found");return r}async function bl(e){if(e.apply&&!e.reviewed)throw new Error("policy packs apply requires a prior dry-run review; pass --reviewed with --apply after reviewing the plan");let t=await v(e.home),r=await PR(e),o=be.resolve(e.targetRoot??process.cwd()),n=new Date().toISOString(),a=await xR({home:t.home,pack:r.pack,targetRoot:o,createdAt:n}),s=a.map(qm),i=a.filter(p=>p.changed),l=VR(r.pack),c=e.apply&&i.length>0?await DR({home:t.home,pack:r.pack,source:r.source,targetRoot:o,files:i,approvalEvidence:e.approvalEvidence??null,createdAt:n}):null;if(e.apply){let p=[];try{for(let g of i)await kl(g,"after"),p.push(g)}catch(g){throw await OR(p),await h({home:t.home,type:"policy_pack_apply_failed",result:"error",details:{pack:{id:r.pack.id,version:r.pack.version,source:r.source},targetRoot:o,snapshotPath:c,rolledBackFiles:p.map(y=>qm(y)),error:g instanceof Error?g.message:String(g)}}),g}}let d={pack:{id:r.pack.id,version:r.pack.version,title:r.pack.title,source:r.source},dryRun:!e.apply,applied:e.apply,reviewed:e.reviewed,targetRoot:o,files:s,standingOrderChanges:r.pack.standing_orders.length,policyProposals:r.pack.policy_proposals.length,managedBlocks:r.pack.managed_blocks.length,warnings:l,snapshotRequired:i.length>0,snapshotPath:c};return await h({home:t.home,type:e.apply?"policy_pack_apply":"policy_pack_apply_dry_run",details:WR(d,e.approvalEvidence)}),d}async function vl(e){let t=await v(e.home),r=NR(await ia(e.snapshotPath,"utf8"),e.snapshotPath),o=r.files.map(a=>CR(a));if(e.apply)for(let a of r.files)await kl(a,"before");let n={snapshotPath:e.snapshotPath,pack:{id:r.pack.id,version:r.pack.version},dryRun:!e.apply,applied:e.apply,files:o};return await h({home:t.home,type:e.apply?"policy_pack_rollback":"policy_pack_rollback_dry_run",details:{snapshotPath:e.snapshotPath,pack:n.pack,dryRun:n.dryRun,applied:n.applied,files:n.files}}),n}async function PR(e){if(e.file){let r=be.resolve(e.file),o=JSON.parse(await ia(r,"utf8")),n=Tr(o);if(n.length>0)throw new Error(`Invalid policy pack ${r}: ${n.join("; ")}`);return{pack:o,source:r}}if(!e.id)throw new Error("policy packs apply requires <id> or --file <path>");let t=await qo(e.id);return{pack:t,source:t.source}}async function xR(e){let t=[];for(let r of e.pack.standing_orders)t.push(await jR(e.home,e.pack,r));for(let r of e.pack.policy_proposals)t.push(await IR(e.home,e.pack,r,e.createdAt));for(let r of e.pack.managed_blocks)t.push(await TR(e.targetRoot,e.pack,r));return t}async function jR(e,t,r){if(r.action==="add"&&r.authority==="operator-approved"){let n=be.join(e,"standing-orders",`${r.id}.yaml`);return await hl("standing_order",n,HR(r,t))}let o=be.join(e,"proposals",`standing-order-${t.id}-${r.id}.md`);return await hl("standing_order",o,$R(r,t))}async function IR(e,t,r,o){let n=o.replaceAll(/[:.]/gu,"-"),a=be.join(e,"proposals",`${n}-${t.id}-${r.target}.md`);return await hl("policy_proposal",a,FR(r,t,o))}async function TR(e,t,r){let o=be.resolve(e,r.target);if(!qR(e,o))throw new Error(`Policy pack managed block target escapes target root: ${r.target}`);let n=_l(o),a=n?await ia(o,"utf8"):null,s=UR(a,t,r);return zm("managed_block",o,n,a,s)}async function hl(e,t,r){let o=_l(t),n=o?await ia(t,"utf8"):null;return zm(e,t,o,n,r)}function zm(e,t,r,o,n){let a=o===null?null:E(o),s=n===null?null:E(n),i=o!==n;return{kind:e,targetPath:t,action:i?r?"replace":"create":"noop",changed:i,beforeHash:a,afterHash:s,diff:JR(o,n),beforeExists:r,beforeContent:o,afterContent:n}}function qm(e){return{kind:e.kind,targetPath:e.targetPath,action:e.action,changed:e.changed,beforeHash:e.beforeHash,afterHash:e.afterHash,diff:e.diff}}function CR(e){return{kind:e.kind,targetPath:e.targetPath,action:e.beforeExists?"replace":"remove",changed:!0,beforeHash:e.afterHash,afterHash:e.beforeHash,diff:Ym(e.afterHash,e.beforeHash)}}async function kl(e,t){let r=t==="before"?e.beforeExists:e.afterHash!==null,o=t==="before"?e.beforeContent:e.afterContent;r&&o!==null?(await Gm(be.dirname(e.targetPath),{recursive:!0,mode:448}),pe(e.targetPath,{allowSymlinkTarget:!0}),await Km(e.targetPath,o,{encoding:"utf8",mode:384})):_l(e.targetPath)&&await ER(e.targetPath)}async function OR(e){for(let t of[...e].reverse())await kl(t,"before")}function NR(e,t){let r;try{r=JSON.parse(e)}catch(n){throw new Error(`Invalid policy pack snapshot ${t}: ${n instanceof Error?n.message:String(n)}`,{cause:n})}let o=MR(r);if(o.length>0)throw new Error(`Invalid policy pack snapshot ${t}: ${o.join("; ")}`);return r}function MR(e){let t=[];if(!yl(e))return["snapshot must be an object"];(typeof e.id!="string"||!e.id)&&t.push("id must be a non-empty string");let r=e.pack;return yl(r)?((typeof r.id!="string"||!r.id)&&t.push("pack.id must be a non-empty string"),(typeof r.version!="string"||!r.version)&&t.push("pack.version must be a non-empty string"),typeof r.source=="string"||r.source===null||t.push("pack.source must be a string or null")):t.push("pack must be an object"),(typeof e.targetRoot!="string"||!e.targetRoot)&&t.push("targetRoot must be a non-empty string"),(typeof e.createdAt!="string"||!e.createdAt)&&t.push("createdAt must be a non-empty string"),typeof e.approvalEvidence=="string"||e.approvalEvidence===null||t.push("approvalEvidence must be a string or null"),Array.isArray(e.files)?e.files.forEach((o,n)=>{t.push(...LR(o,`files[${n}]`))}):t.push("files must be an array"),t}function LR(e,t){let r=[];if(!yl(e))return[`${t} must be an object`];["standing_order","policy_proposal","managed_block"].includes(typeof e.kind=="string"?e.kind:"")||r.push(`${t}.kind is invalid`),(typeof e.targetPath!="string"||!be.isAbsolute(e.targetPath))&&r.push(`${t}.targetPath must be an absolute path`),["create","replace","noop","remove"].includes(typeof e.action=="string"?e.action:"")||r.push(`${t}.action is invalid`),typeof e.changed!="boolean"&&r.push(`${t}.changed must be boolean`),typeof e.beforeExists!="boolean"&&r.push(`${t}.beforeExists must be boolean`);for(let o of["beforeHash","afterHash","beforeContent","afterContent"])typeof e[o]=="string"||e[o]===null||r.push(`${t}.${o} must be a string or null`);return typeof e.diff!="string"&&r.push(`${t}.diff must be a string`),r}function yl(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function DR(e){let t=be.join(e.home,"backups","policy-packs");await Gm(t,{recursive:!0,mode:448});let r={id:T("policy_pack_snapshot"),pack:{id:e.pack.id,version:e.pack.version,source:e.source},targetRoot:e.targetRoot,createdAt:e.createdAt,files:e.files,approvalEvidence:e.approvalEvidence},o=`${e.createdAt.replaceAll(/[:.]/gu,"-")}-${e.pack.id}.json`,n=be.join(t,o);return await Km(n,JSON.stringify(r,null,2),{encoding:"utf8",mode:384,flag:"wx"}),n}function HR(e,t){return[`id: ${e.id}`,`source: policy-pack:${t.id}@${t.version}`,`allowed: ${JSON.stringify(e.allowed)}`,`approval_required: ${JSON.stringify(e.approval_required)}`,`scope_projects: ${JSON.stringify(e.scope_projects)}`,`scope_hosts: ${JSON.stringify(e.scope_hosts)}`,`reason: ${JSON.stringify(e.reason)}`,""].join(`
|
|
1088
|
-
`)}function $
|
|
1089
|
-
`)}function
|
|
1090
|
-
`)}function
|
|
1084
|
+
`),confidence:e.truncation.truncated?.45:.55,authority:"observed",sensitivity:"normal",source:{kind:"dev_environment_scan",root:e.root,schema_version:e.schema_version}}),r}function WR(e){return["## Engineering Preferences","","Detected local project context from `nativesoul scan`.","",...Nm([Fe("Languages",e.languages.map(r=>r.name)),Fe("Frameworks",e.frameworks.map(r=>r.name)),e.truncation.truncated?`Scan truncated: ${e.truncation.reasons.join(", ")}`:null])].join(`
|
|
1085
|
+
`)}function JR(e){return["## Local Tool Conventions","","Detected by `nativesoul scan`; verify before treating as policy.","",...Nm([Fe("Package managers",e.tooling.package_managers.map(r=>r.name)),Fe("Test runners",e.tooling.test_runners),Fe("Linters",e.tooling.linters),e.manifests.length>0?`Manifests: ${e.manifests.join(", ")}`:null])].join(`
|
|
1086
|
+
`)}async function qR(e){let t=await et({home:e.home,action:"scan.apply.candidate_memories",className:"write_local",target:"memory:candidate",project:e.project,host:e.host});if(t.evaluation.decision!=="allowed")return await jr(e.home,"scan.apply.candidate_memories","blocked",e.project,{decision:t.evaluation.decision}),sl("candidate_memories","memory:candidate",t,"scan.apply.candidate_memories");let r=[];for(let o of e.proposal.sinks.candidate_memories)r.push(await ee(e.home,o));return await jr(e.home,"scan.apply.candidate_memories","ok",e.project,{count:r.length}),{sink:"candidate_memories",target:"memory:candidate",applied:!0,skipped:!1,policy_gate:t,audit_event_type:"scan.apply.candidate_memories",warning:null,memory_ids:r.map(o=>o.id)}}async function Om(e){let t=e.proposal.sinks[e.sink],r=await et({home:e.home,action:`scan.apply.${e.sink}`,className:"write_local",target:t.target,project:e.project,host:e.host});if(r.evaluation.decision!=="allowed")return await jr(e.home,`scan.apply.${e.sink}`,"blocked",e.project,{decision:r.evaluation.decision}),sl(e.sink,t.target,r,`scan.apply.${e.sink}`);let o=KR(e.home,t.target);await FR(tr.dirname(o),{recursive:!0,mode:448});let n=await ol(e.home,t.target),a=pr(n,t.managed_content);return await BR(o,a,{encoding:"utf8",mode:384}),await jr(e.home,`scan.apply.${e.sink}`,"ok",e.project,{target:t.target}),{sink:e.sink,target:t.target,applied:!0,skipped:!1,policy_gate:r,audit_event_type:`scan.apply.${e.sink}`,warning:null}}async function GR(e){let t=await et({home:e.home,action:"scan.apply.project_registry",className:"write_local",target:"project_registry",project:e.project,host:e.host});if(t.evaluation.decision!=="allowed")return await jr(e.home,"scan.apply.project_registry","blocked",e.project,{decision:t.evaluation.decision}),sl("project_registry","project_registry",t,"scan.apply.project_registry");let r=await uo({home:e.home,resolution:e.proposal.sinks.project_registry.resolution});return await jr(e.home,"scan.apply.project_registry",r.touched?"ok":"error",e.project,{inserted:r.inserted,degraded:r.degraded,warning:r.warning}),{sink:"project_registry",target:"project_registry",applied:r.touched,skipped:!1,policy_gate:t,audit_event_type:"scan.apply.project_registry",warning:r.warning,project_result:r}}function sl(e,t,r,o){return{sink:e,target:t,applied:!1,skipped:!0,policy_gate:r,audit_event_type:o,warning:`POLICY_GATE_BLOCKED:${r.evaluation.decision}`}}async function jr(e,t,r,o,n){await h({home:e,type:t,result:r,details:{project:o,...n}})}function KR(e,t){return pe(tr.join(e,t),{root:e,protectedFiles:[tr.join(e,"SOUL.md"),tr.join(e,"POLICY.md")]})}async function ol(e,t){try{return await UR(tr.join(e,t),"utf8")}catch{return""}}function Fe(e,t){return t.length>0?`${e}: ${t.join(", ")}`:null}function Nm(e){let t=e.filter(r=>!!r).map(r=>`- ${r}`);return t.length>0?t:["- No local conventions detected from metadata files."]}import{readFile as Mm}from"node:fs/promises";import Lm from"node:path";var aa=1500;async function Wo(e){let t=await v(e.home),r=await YR(t.home),o=await QR(t.home),n=new Date,a=zR(e.ttlSeconds??r.ttlSeconds),s=new Date(n.getTime()+a*1e3).toISOString(),i=cl(e.project,e.slot),l=_(t.database),c;try{c=l.claimHeartbeatLease({id:T("lease"),slot:e.slot,holder:e.host,idempotencyKey:i,now:n.toISOString(),expiresAt:s})}finally{l.close()}return await h({home:t.home,type:c.claimed?"heartbeat_claimed":"heartbeat_skipped",details:{slot:e.slot,host:e.host,project:e.project,lease_id:c.lease.id,reason:c.reason}}),{slot:e.slot,host:e.host,project:e.project,claimed:c.claimed,reason:c.reason,silent_ack:c.claimed||c.reason==="LEASE_OCCUPIED"&&!r.skipWhenBusy?null:"HEARTBEAT_OK",lease:c.lease,...c.claimed&&o?{heartbeat_checklist:o}:{}}}async function Jo(e){let t=await v(e.home),r=new Date().toISOString(),o=cl(e.project,e.slot),n=H(e.result??"HEARTBEAT_OK"),a=H(XR(e.evidence??{},e.workItemId)),s=H(e.cost??{}),i=or(s),l=_(t.database),c;try{c=l.completeHeartbeatLease({idempotencyKey:o,host:e.host,project:e.project,result:n,evidence:a,cost:i,completedAt:r,runId:T("run")})}finally{l.close()}return await h({home:t.home,type:c.completed?"heartbeat_completed":"heartbeat_completion_replayed",details:{slot:e.slot,host:e.host,project:e.project,lease_id:c.lease.id,run_id:c.run?.id??null}}),{slot:e.slot,project:e.project,completed:c.completed,silent_ack:"HEARTBEAT_OK",lease:c.lease,run:c.run}}async function ll(e){let t=await v(e.home),r=_(t.database);try{return r.listHeartbeatLeases({project:e.project,limit:Math.min(Math.max(e.limit??20,1),100)})}finally{r.close()}}function cl(e,t){return`heartbeat:${e}:${t}`}function zR(e){return Number.isFinite(e)?Math.min(Math.max(Math.trunc(e),1),1440*60):aa}function XR(e,t){return t?{...e&&typeof e=="object"&&!Array.isArray(e)?e:{},work_item_id:t}:e}async function YR(e){let t;try{t=await Mm(Lm.join(e,"config.yaml"),"utf8")}catch{return{ttlSeconds:aa,skipWhenBusy:!0}}return{ttlSeconds:ZR(t),skipWhenBusy:eS(t,"skip_when_busy",!0)}}async function QR(e){let t;try{t=await Mm(Lm.join(e,"HEARTBEAT.md"),"utf8")}catch{return""}return t.split(/\r?\n/u).filter(r=>{let o=r.trim();return o.length>0&&!o.startsWith("#")}).join(`
|
|
1087
|
+
`).trim()}function ZR(e){let t=il(e,"ttl_seconds"),r=il(e,"lease_ttl"),o=tS(e,"heartbeat_ttl_seconds"),n=rS(t??r??o);return Number.isFinite(n)?n:aa}function eS(e,t,r){let o=il(e,t);return o?/^(true|yes|1)$/i.test(o)?!0:/^(false|no|0)$/i.test(o)?!1:r:r}function il(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`^\\s*heartbeat:\\s*$[\\s\\S]*?^\\s{2}${r}:\\s*([^#\\n]+)`,"mu"))?.[1]?.trim().replace(/^["']|["']$/g,"")??null}function tS(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`^\\s*${r}:\\s*([^#\\n]+)`,"mu"))?.[1]?.trim().replace(/^["']|["']$/g,"")??null}function rS(e){if(!e)return aa;let t=e.match(/^(\d+)$/);if(t)return Number(t[1]);let r=e.match(/^(\d+)\s*([smh])$/i);if(!r)return Number.NaN;let o=Number(r[1]),n=r[2]?.toLowerCase();return n==="s"?o:n==="m"?o*60:o*60*60}async function dl(e){let t=await v(e.home);_(t.database).close();let o=qe(e.host),n=(await Promise.all(o.map(s=>Jr(s)))).flat(),a=[];for(let s of o){let i=Ke(s,e.surface);for(let l of i){let c=n.find(S=>S.host===s),d=_r(s,e.targetRoot,l),p=d.managedBlock?await Kr({home:t.home,host:s,apply:e.apply,targetPath:d.managedBlock}):oS(s,l,!e.apply),g=await Ao({home:t.home,host:s,apply:e.apply,targetPath:d.mcpRegistration,commandMode:"package"}),y=await pi({home:t.home,host:s,surface:l,apply:e.apply,targetPath:d.plugin}),k=await yt({home:t.home,host:s,surface:l,mode:"leader",apply:e.apply,pluginEnabled:y.enabled,hostConfigRoot:Ye(s,e.targetRoot),targetRoot:e.targetRoot}),R=e.apply?await Tt({home:t.home,host:s}):[],U=e.apply?R.reduce((S,St)=>S+St.count,0):c?.sources.length??0,ve=k.warnings.filter(S=>S==="NATIVE_SCHEDULE_UNSUPPORTED").map(()=>"NATIVE_SCHEDULE_AVAILABLE_NOT_ENABLED"),ke=[...k.warnings.filter(S=>S!=="NATIVE_SCHEDULE_UNSUPPORTED"),...y.issues.map(S=>S.code),...c?.detected?[]:[`${s.toUpperCase()}_NOT_DETECTED`]],nt=[p.backupPath,g.backupPath,y.backupPath].filter(S=>S!==null),Ue=ke.length===0&&U>0?"ready":"degraded";a.push({host:s,surface:l,detected:c?.detected??!1,status:Ue,managed_block:p,mcp_registration:g,plugin:y,schedule:k,capability_count:U,snapshots:nt,warnings:ke,notices:ve})}}return{dryRun:!e.apply,applied:e.apply,home:t.home,hosts:a,status:a.every(s=>s.status==="ready")?"ready":"degraded"}}function oS(e,t,r){let o=E("");return{host:e,targetPath:`not-applicable:${Bt(e,t)}`,action:"noop",dryRun:r,changed:!1,beforeHash:null,afterHash:o,diff:"No managed instruction block for this host surface.",backupPath:null,applied:!1}}import nS from"node:path";import{rm as Dm}from"node:fs/promises";var ul="DELETE_NATIVESOUL_HOME";async function pl(e){if(e.purgeData===!0&&e.confirmPurge!==ul)throw new Error(`--purge-data requires --confirm-purge-nativesoul-data ${ul}`);let t=await v(e.home);_(t.database).close();let o=qe(e.host);if(e.apply)for(let l of o)for(let c of Ke(l,e.surface))await Hm({home:t.home,host:l,surface:c,apply:!1,targetRoot:e.targetRoot});let n=[];for(let l of o)for(let c of Ke(l,e.surface))n.push(await Hm({home:t.home,host:l,surface:c,apply:e.apply,targetRoot:e.targetRoot}));let a={requested:e.purgeData===!0,confirmed:e.confirmPurge===ul,applied:e.apply&&e.purgeData===!0,preserved:!(e.apply&&e.purgeData===!0)},s=nS.join(t.home,"backups"),i={path:s,applied:e.apply,preserved:!e.apply};return i.applied&&await Dm(s,{recursive:!0,force:!0}),a.applied&&await Dm(t.home,{recursive:!0,force:!0}),{dryRun:!e.apply,applied:e.apply,home:t.home,hosts:n,backups_purge:i,data_purge:a,status:n.every(l=>l.status==="ready")?"ready":"degraded"}}async function Hm(e){let t=_r(e.host,e.targetRoot,e.surface),r=t.managedBlock?await gs({home:e.home,host:e.host,apply:e.apply,targetPath:t.managedBlock}):aS(e.host,e.surface,!e.apply),o=await fi({home:e.home,host:e.host,apply:e.apply,targetPath:t.mcpRegistration}),n=await mi({home:e.home,host:e.host,surface:e.surface,apply:e.apply,targetPath:t.plugin}),a=[r.backupPath,o.backupPath,n.backupPath].filter(s=>s!==null);return{host:e.host,surface:e.surface,status:"ready",managed_block:r,mcp_registration:o,plugin:n,snapshots:a,warnings:["SCHEDULE_TEARDOWN_NOT_PERFORMED"]}}function aS(e,t,r){let o=E("");return{host:e,targetPath:`not-applicable:${Bt(e,t)}`,action:"noop",dryRun:r,changed:!1,beforeHash:null,afterHash:o,diff:"No managed instruction block for this host surface.",backupPath:null,applied:!1}}var Fm={"memory.promote":{action:"memory.promote",className:"write_local"},"memory.forget":{action:"memory.forget",className:"write_local"},"memory.reject":{action:"memory.reject",className:"write_local"},"work_item.create":{action:"work_item.create",className:"write_local"},"work_item.claim":{action:"work_item.claim",className:"write_local"},"work_item.complete":{action:"work_item.complete",className:"write_local"},"install.apply":{action:"install.apply",className:"write_local"},"policy_pack.apply":{action:"policy_pack.apply",className:"write_local"}};async function rr(e,t={}){let r=Fm[e],o={home:t.home,action:r.action,className:r.className,target:t.target??void 0,project:t.project??void 0,host:t.host??void 0},n,a,s,i;try{let l=await et(o);n=l.evaluation,a=l.approval?.id??null,s=l.approval_created,i=l.warning}catch(l){return await $m(r,t,["POLICY_GATE_UNAVAILABLE"],"error"),{status:"deny",decision:"denied",reason:`policy gate unavailable (fail-closed): ${l.message}`,evaluation:null}}return n.decision==="allowed"?{status:"allow",decision:"allowed",evaluation:n}:n.decision==="approval_required"?{status:"approval_required",decision:"approval_required",approvalId:a,approvalCreated:s,warning:i,evaluation:n}:(await $m(r,t,n.reasons,"blocked"),{status:"deny",decision:n.decision,reason:`${r.action} ${n.decision}: ${n.reasons.join(", ")}`,evaluation:n})}async function $m(e,t,r,o){try{let n=await v(t.home);await h({home:n.home,type:"policy_blocked",result:"blocked",details:{boundary:"sensitive_operation",action:e.action,class:e.className,target:t.target??null,project:t.project??null,host:t.host??null,outcome:o,reasons:r}})}catch{}}import{existsSync as _l}from"node:fs";import{mkdir as Gm,readFile as ia,rm as ES,writeFile as Km}from"node:fs/promises";import be from"node:path";import{existsSync as kS}from"node:fs";import{readdir as wS,readFile as ml}from"node:fs/promises";import wt from"node:path";import{fileURLToPath as RS}from"node:url";import Um from"node:path";var sS=new Set(["id","version","title","description","intended_use","approvals","standing_orders","policy_proposals","managed_blocks","rollback","metadata"]),iS=new Set(["id","action","authority","allowed","approval_required","scope_projects","scope_hosts","reason"]),lS=new Set(["target","summary","rationale","rollback_note"]),cS=new Set(["target","marker","content","rollback_key"]),dS=new Set(["strategy","restores","notes"]),uS=new Set(["maturity","owner","source"]),pS=new Set(["SOUL.MD","POLICY.MD"]),Bm=["AGENTS.md","CLAUDE.md","GEMINI.md","Agents.md",".claude/CLAUDE.md"],mS=new Set(Bm);function Tr(e){let t=[];return tt(e)?(Cr(e,sS,"pack",t),ne(e,"id","pack",t,/^[a-z0-9][a-z0-9-]{2,63}$/u),ne(e,"version","pack",t,/^[0-9]+\.[0-9]+\.[0-9]+$/u),ne(e,"title","pack",t),ne(e,"description","pack",t),ne(e,"intended_use","pack",t),Ir(e.approvals,"pack.approvals",t,!1),gS(e.standing_orders,t),fS(e.policy_proposals,t),hS(e.managed_blocks,t),yS(e.rollback,t),_S(e.metadata,t),vS(e,t),t):["Policy pack must be an object"]}function tt(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Vm(e){return typeof e=="string"?e:null}function gS(e,t){if(!Array.isArray(e)){t.push("pack.standing_orders must be an array");return}for(let[r,o]of e.entries()){let n=`pack.standing_orders[${r}]`;if(!tt(o)){t.push(`${n} must be an object`);continue}Cr(o,iS,n,t),ne(o,"id",n,t,/^[a-z0-9][a-z0-9-]{2,63}$/u),sa(o,"action",n,["add","propose"],t),sa(o,"authority",n,["operator-approved","proposal"],t),Ir(o.allowed,`${n}.allowed`,t,!0),Ir(o.approval_required,`${n}.approval_required`,t,!0),Ir(o.scope_projects,`${n}.scope_projects`,t,!0),Ir(o.scope_hosts,`${n}.scope_hosts`,t,!0),ne(o,"reason",n,t);let a=Array.isArray(o.allowed)?o.allowed:[],s=Array.isArray(o.approval_required)?o.approval_required:[];a.length===0&&s.length===0&&t.push(`${n} must declare at least one allowed or approval_required action`)}}function fS(e,t){if(!Array.isArray(e)){t.push("pack.policy_proposals must be an array");return}for(let[r,o]of e.entries()){let n=`pack.policy_proposals[${r}]`;if(!tt(o)){t.push(`${n} must be an object`);continue}Cr(o,lS,n,t),sa(o,"target",n,["SOUL.md","POLICY.md"],t),ne(o,"summary",n,t),ne(o,"rationale",n,t),ne(o,"rollback_note",n,t)}}function hS(e,t){if(!Array.isArray(e)){t.push("pack.managed_blocks must be an array");return}for(let[r,o]of e.entries()){let n=`pack.managed_blocks[${r}]`;if(!tt(o)){t.push(`${n} must be an object`);continue}Cr(o,cS,n,t),ne(o,"target",n,t),ne(o,"marker",n,t),ne(o,"content",n,t),ne(o,"rollback_key",n,t),typeof o.target=="string"&&bS(o.target,n,t)}}function yS(e,t){if(!tt(e)){t.push("pack.rollback must be an object");return}Cr(e,dS,"pack.rollback",t),sa(e,"strategy","pack.rollback",["proposal-only","managed-block","snapshot-required"],t),Ir(e.restores,"pack.rollback.restores",t,!0),Array.isArray(e.restores)&&e.restores.length===0&&t.push("pack.rollback.restores must include at least one rollback item"),ne(e,"notes","pack.rollback",t)}function _S(e,t){if(e!==void 0){if(!tt(e)){t.push("pack.metadata must be an object");return}Cr(e,uS,"pack.metadata",t);for(let[r,o]of Object.entries(e))o!==null&&typeof o!="string"&&typeof o!="number"&&typeof o!="boolean"&&t.push(`pack.metadata.${r} must be a scalar value`)}}function bS(e,t,r){let o=e.replaceAll("\\","/"),n=Um.basename(o).toUpperCase();(Um.isAbsolute(e)||o.includes("../")||o.startsWith("../"))&&r.push(`${t}.target must be a relative managed host file path`),pS.has(n)&&r.push(`${t}.target must not target protected SOUL.md or POLICY.md`),mS.has(o)||r.push(`${t}.target is outside supported managed-block scope`)}function vS(e,t){let r=JSON.stringify(e);/(sk-[A-Za-z0-9_-]{8,}|api[_-]?key\s*[:=]|secret\s*[:=]|token\s*[:=]|password\s*[:=])/iu.test(r)&&t.push("pack must not contain credential-like material"),/https?:\/\//iu.test(r)&&t.push("pack must not require trust in external URLs")}function Cr(e,t,r,o){for(let n of Object.keys(e))t.has(n)||o.push(`${r}.${n} is not allowed`)}function ne(e,t,r,o,n){let a=e[t];if(typeof a!="string"||a.trim()===""){o.push(`${r}.${t} must be a non-empty string`);return}n&&!n.test(a)&&o.push(`${r}.${t} has invalid format`)}function sa(e,t,r,o,n){let a=e[t];(typeof a!="string"||!o.includes(a))&&n.push(`${r}.${t} must be one of ${o.join(", ")}`)}function Ir(e,t,r,o){e===void 0&&!o||(!Array.isArray(e)||!e.every(n=>typeof n=="string"))&&r.push(`${t} must be an array of strings`)}async function gl(){return(await Wm()).map(({pack:t,source:r})=>({id:t.id,version:t.version,title:t.title,description:t.description,intended_use:t.intended_use,source:r})).sort((t,r)=>t.id.localeCompare(r.id))}async function qo(e){let r=(await Wm()).find(o=>o.pack.id===e);if(!r)throw new Error(`Policy pack not found: ${e}`);return{...r.pack,source:r.source}}async function fl(e){try{let{value:t,source:r}=e.file?{value:JSON.parse(await ml(e.file,"utf8")),source:wt.resolve(e.file)}:await SS(e.id),o=Tr(t),n=tt(t)?Vm(t.id):null;return{valid:o.length===0,id:n,source:r,errors:o,warnings:[]}}catch(t){return{valid:!1,id:e.id??null,source:e.file?wt.resolve(e.file):null,errors:[t instanceof Error?t.message:"Unknown policy pack validation error"],warnings:[]}}}async function Wm(){let e=await Jm(),t=[];for(let r of e){let o=JSON.parse(await ml(r,"utf8")),n=Tr(o);if(n.length>0)throw new Error(`Invalid built-in policy pack ${r}: ${n.join("; ")}`);t.push({pack:o,source:r})}return t}async function SS(e){if(!e)throw new Error("policy packs validate requires <id> or --file <path>");let t=await Jm();for(let r of t){let o=JSON.parse(await ml(r,"utf8"));if(tt(o)&&o.id===e)return{value:o,source:r}}throw new Error(`Policy pack not found: ${e}`)}async function Jm(){let e=AS(),t=(await wS(e)).filter(r=>r.endsWith(".json")).map(r=>wt.join(e,r)).sort();if(t.length===0)throw new Error(`No policy packs found in ${e}`);return t}function AS(){let e=wt.dirname(RS(import.meta.url)),r=[wt.resolve(process.cwd(),"policy-packs"),wt.resolve(e,"../../../policy-packs"),wt.resolve(e,"../../../../policy-packs"),wt.resolve(e,"../../../../../policy-packs")].find(o=>kS(o));if(!r)throw new Error("Built-in policy pack catalog not found");return r}async function bl(e){if(e.apply&&!e.reviewed)throw new Error("policy packs apply requires a prior dry-run review; pass --reviewed with --apply after reviewing the plan");let t=await v(e.home),r=await PS(e),o=be.resolve(e.targetRoot??process.cwd()),n=new Date().toISOString(),a=await xS({home:t.home,pack:r.pack,targetRoot:o,createdAt:n}),s=a.map(qm),i=a.filter(p=>p.changed),l=VS(r.pack),c=e.apply&&i.length>0?await DS({home:t.home,pack:r.pack,source:r.source,targetRoot:o,files:i,approvalEvidence:e.approvalEvidence??null,createdAt:n}):null;if(e.apply){let p=[];try{for(let g of i)await kl(g,"after"),p.push(g)}catch(g){throw await OS(p),await h({home:t.home,type:"policy_pack_apply_failed",result:"error",details:{pack:{id:r.pack.id,version:r.pack.version,source:r.source},targetRoot:o,snapshotPath:c,rolledBackFiles:p.map(y=>qm(y)),error:g instanceof Error?g.message:String(g)}}),g}}let d={pack:{id:r.pack.id,version:r.pack.version,title:r.pack.title,source:r.source},dryRun:!e.apply,applied:e.apply,reviewed:e.reviewed,targetRoot:o,files:s,standingOrderChanges:r.pack.standing_orders.length,policyProposals:r.pack.policy_proposals.length,managedBlocks:r.pack.managed_blocks.length,warnings:l,snapshotRequired:i.length>0,snapshotPath:c};return await h({home:t.home,type:e.apply?"policy_pack_apply":"policy_pack_apply_dry_run",details:WS(d,e.approvalEvidence)}),d}async function vl(e){let t=await v(e.home),r=NS(await ia(e.snapshotPath,"utf8"),e.snapshotPath),o=r.files.map(a=>CS(a));if(e.apply)for(let a of r.files)await kl(a,"before");let n={snapshotPath:e.snapshotPath,pack:{id:r.pack.id,version:r.pack.version},dryRun:!e.apply,applied:e.apply,files:o};return await h({home:t.home,type:e.apply?"policy_pack_rollback":"policy_pack_rollback_dry_run",details:{snapshotPath:e.snapshotPath,pack:n.pack,dryRun:n.dryRun,applied:n.applied,files:n.files}}),n}async function PS(e){if(e.file){let r=be.resolve(e.file),o=JSON.parse(await ia(r,"utf8")),n=Tr(o);if(n.length>0)throw new Error(`Invalid policy pack ${r}: ${n.join("; ")}`);return{pack:o,source:r}}if(!e.id)throw new Error("policy packs apply requires <id> or --file <path>");let t=await qo(e.id);return{pack:t,source:t.source}}async function xS(e){let t=[];for(let r of e.pack.standing_orders)t.push(await jS(e.home,e.pack,r));for(let r of e.pack.policy_proposals)t.push(await IS(e.home,e.pack,r,e.createdAt));for(let r of e.pack.managed_blocks)t.push(await TS(e.targetRoot,e.pack,r));return t}async function jS(e,t,r){if(r.action==="add"&&r.authority==="operator-approved"){let n=be.join(e,"standing-orders",`${r.id}.yaml`);return await hl("standing_order",n,HS(r,t))}let o=be.join(e,"proposals",`standing-order-${t.id}-${r.id}.md`);return await hl("standing_order",o,$S(r,t))}async function IS(e,t,r,o){let n=o.replaceAll(/[:.]/gu,"-"),a=be.join(e,"proposals",`${n}-${t.id}-${r.target}.md`);return await hl("policy_proposal",a,FS(r,t,o))}async function TS(e,t,r){let o=be.resolve(e,r.target);if(!qS(e,o))throw new Error(`Policy pack managed block target escapes target root: ${r.target}`);let n=_l(o),a=n?await ia(o,"utf8"):null,s=US(a,t,r);return zm("managed_block",o,n,a,s)}async function hl(e,t,r){let o=_l(t),n=o?await ia(t,"utf8"):null;return zm(e,t,o,n,r)}function zm(e,t,r,o,n){let a=o===null?null:E(o),s=n===null?null:E(n),i=o!==n;return{kind:e,targetPath:t,action:i?r?"replace":"create":"noop",changed:i,beforeHash:a,afterHash:s,diff:JS(o,n),beforeExists:r,beforeContent:o,afterContent:n}}function qm(e){return{kind:e.kind,targetPath:e.targetPath,action:e.action,changed:e.changed,beforeHash:e.beforeHash,afterHash:e.afterHash,diff:e.diff}}function CS(e){return{kind:e.kind,targetPath:e.targetPath,action:e.beforeExists?"replace":"remove",changed:!0,beforeHash:e.afterHash,afterHash:e.beforeHash,diff:Ym(e.afterHash,e.beforeHash)}}async function kl(e,t){let r=t==="before"?e.beforeExists:e.afterHash!==null,o=t==="before"?e.beforeContent:e.afterContent;r&&o!==null?(await Gm(be.dirname(e.targetPath),{recursive:!0,mode:448}),pe(e.targetPath,{allowSymlinkTarget:!0}),await Km(e.targetPath,o,{encoding:"utf8",mode:384})):_l(e.targetPath)&&await ES(e.targetPath)}async function OS(e){for(let t of[...e].reverse())await kl(t,"before")}function NS(e,t){let r;try{r=JSON.parse(e)}catch(n){throw new Error(`Invalid policy pack snapshot ${t}: ${n instanceof Error?n.message:String(n)}`,{cause:n})}let o=MS(r);if(o.length>0)throw new Error(`Invalid policy pack snapshot ${t}: ${o.join("; ")}`);return r}function MS(e){let t=[];if(!yl(e))return["snapshot must be an object"];(typeof e.id!="string"||!e.id)&&t.push("id must be a non-empty string");let r=e.pack;return yl(r)?((typeof r.id!="string"||!r.id)&&t.push("pack.id must be a non-empty string"),(typeof r.version!="string"||!r.version)&&t.push("pack.version must be a non-empty string"),typeof r.source=="string"||r.source===null||t.push("pack.source must be a string or null")):t.push("pack must be an object"),(typeof e.targetRoot!="string"||!e.targetRoot)&&t.push("targetRoot must be a non-empty string"),(typeof e.createdAt!="string"||!e.createdAt)&&t.push("createdAt must be a non-empty string"),typeof e.approvalEvidence=="string"||e.approvalEvidence===null||t.push("approvalEvidence must be a string or null"),Array.isArray(e.files)?e.files.forEach((o,n)=>{t.push(...LS(o,`files[${n}]`))}):t.push("files must be an array"),t}function LS(e,t){let r=[];if(!yl(e))return[`${t} must be an object`];["standing_order","policy_proposal","managed_block"].includes(typeof e.kind=="string"?e.kind:"")||r.push(`${t}.kind is invalid`),(typeof e.targetPath!="string"||!be.isAbsolute(e.targetPath))&&r.push(`${t}.targetPath must be an absolute path`),["create","replace","noop","remove"].includes(typeof e.action=="string"?e.action:"")||r.push(`${t}.action is invalid`),typeof e.changed!="boolean"&&r.push(`${t}.changed must be boolean`),typeof e.beforeExists!="boolean"&&r.push(`${t}.beforeExists must be boolean`);for(let o of["beforeHash","afterHash","beforeContent","afterContent"])typeof e[o]=="string"||e[o]===null||r.push(`${t}.${o} must be a string or null`);return typeof e.diff!="string"&&r.push(`${t}.diff must be a string`),r}function yl(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function DS(e){let t=be.join(e.home,"backups","policy-packs");await Gm(t,{recursive:!0,mode:448});let r={id:T("policy_pack_snapshot"),pack:{id:e.pack.id,version:e.pack.version,source:e.source},targetRoot:e.targetRoot,createdAt:e.createdAt,files:e.files,approvalEvidence:e.approvalEvidence},o=`${e.createdAt.replaceAll(/[:.]/gu,"-")}-${e.pack.id}.json`,n=be.join(t,o);return await Km(n,JSON.stringify(r,null,2),{encoding:"utf8",mode:384,flag:"wx"}),n}function HS(e,t){return[`id: ${e.id}`,`source: policy-pack:${t.id}@${t.version}`,`allowed: ${JSON.stringify(e.allowed)}`,`approval_required: ${JSON.stringify(e.approval_required)}`,`scope_projects: ${JSON.stringify(e.scope_projects)}`,`scope_hosts: ${JSON.stringify(e.scope_hosts)}`,`reason: ${JSON.stringify(e.reason)}`,""].join(`
|
|
1088
|
+
`)}function $S(e,t){return["# Standing Order Proposal","",`Policy Pack: ${t.id}@${t.version}`,`Standing Order: ${e.id}`,`Action: ${e.action}`,`Authority: ${e.authority}`,"","## Allowed","",...e.allowed.map(r=>`- ${r}`),"","## Approval Required","",...e.approval_required.map(r=>`- ${r}`),"","## Reason","",e.reason,""].join(`
|
|
1089
|
+
`)}function FS(e,t,r){return["# Policy Pack Proposal","",`Policy Pack: ${t.id}@${t.version}`,`Target: ${e.target}`,`Created At: ${r}`,"","## Summary","",e.summary,"","## Rationale","",e.rationale,"","## Rollback Note","",e.rollback_note,""].join(`
|
|
1090
|
+
`)}function US(e,t,r){let o=BS(t,r);if(e===null||e.length===0)return o;let n=Xm(t,r),a=e.indexOf(n.start),s=e.indexOf(n.end);if(a>=0&&s>a){let l=s+n.end.length,c=e.slice(l).replace(/^\n/u,"");return`${e.slice(0,a)}${o}${c}`}let i=e.endsWith(`
|
|
1091
1091
|
`)?`
|
|
1092
1092
|
`:`
|
|
1093
1093
|
|
|
1094
|
-
`;return`${e}${i}${o}`}function
|
|
1094
|
+
`;return`${e}${i}${o}`}function BS(e,t){let r=Xm(e,t),o=t.content.endsWith(`
|
|
1095
1095
|
`)?t.content:`${t.content}
|
|
1096
1096
|
`;return`${r.start}
|
|
1097
1097
|
${o}${r.end}
|
|
1098
|
-
`}function Xm(e,t){return{start:`<!-- nativesoul:policy-pack:${e.id}:${t.marker}:start v1 -->`,end:`<!-- nativesoul:policy-pack:${e.id}:${t.marker}:end -->`}}function
|
|
1099
|
-
`)}function
|
|
1098
|
+
`}function Xm(e,t){return{start:`<!-- nativesoul:policy-pack:${e.id}:${t.marker}:start v1 -->`,end:`<!-- nativesoul:policy-pack:${e.id}:${t.marker}:end -->`}}function VS(e){let t=[];return e.policy_proposals.length>0&&t.push("Protected SOUL.md/POLICY.md changes are written as proposals only."),e.standing_orders.some(r=>r.authority==="proposal"||r.action==="propose")&&t.push("Proposal-only standing orders are written to proposals/ and do not change authority automatically."),t}function WS(e,t){return{pack:e.pack,dryRun:e.dryRun,applied:e.applied,reviewed:e.reviewed,targetRoot:e.targetRoot,snapshotPath:e.snapshotPath,approvalEvidence:t??null,files:e.files,warnings:e.warnings}}function JS(e,t){return e===t?"No changes.":Ym(e===null?null:E(e),t===null?null:E(t),e===null?0:e.split(/\r?\n/u).length,t===null?0:t.split(/\r?\n/u).length)}function Ym(e,t,r=0,o=0){return[`before: ${e??"missing"}`,`after: ${t??"missing"}`,`lines_before: ${r}`,`lines_after: ${o}`].join(`
|
|
1099
|
+
`)}function qS(e,t){let r=be.relative(e,t);return r===""||!r.startsWith("..")&&!be.isAbsolute(r)}import GS from"node:path";async function Or(e={}){let t=f(e.home),r=e.host??"all",[o,n,a,s]=await Promise.all([it(t.home),A(In(t.home)),A(dr(t.home)),Kt({home:t.home,host:r,surface:e.surface,targetRoot:e.targetRoot})]);return Ys({home:t.home,targetRoot:e.targetRoot?GS.resolve(e.targetRoot):null,host:r,profile:o,onboardingComplete:n,activationComplete:a,hosts:s.hosts})}async function Go(e={}){let t=await Or(e);if(!e.profile||t.profile?.profile===e.profile)return t;let r={...t.profile??jn,profile:e.profile,updated_at:t.profile?.updated_at??"dry-run"};return{...t,profile:r,plan:[{id:"activation-profile-switch",component:"bootstrap",status:"approval_required",action:`Switch activation profile to ${e.profile}.`,target:`${t.home}/state/activation-profile.json`,dry_run:!0,requires_user_confirmed:!0,reason:"Activation profile replacement requires explicit reset/user confirmation."},...t.plan]}}var KS=["codex","claude","antigravity","gemini","grok"];async function la(e={}){let t=await v(e.home),r=await it(t.home),o=e.leaderHost??eA(r?.scheduler_host),n=o??e.host??"all",a=zS({cadence:e.cadence??r?.heartbeat_cadence,projectScope:e.projectScope??L(process.cwd(),t.home),behavior:e.behavior,mode:e.mode}),s=await XS({home:t.home,host:n,surface:e.surface,mode:a.mode,heartbeat:Zm(a),targetRoot:e.targetRoot}),i=YS(s,o),l=i?[]:s.length===0?["HEARTBEAT_NO_HOSTS_EVALUATED"]:["HEARTBEAT_NATIVE_SCHEDULER_BLOCKED_BY_HOST"];return{dry_run:!0,action:i?"recommend":"blocked_by_host",recommended_leader:i?{host:i.host,surface:i.surface,native_id:i.native_id??""}:null,profile:a,candidates:s,warnings:l}}async function wl(e={}){let t=await v(e.home),r=e.dry_run!==!1,o=e.user_confirmed===!0,n=await la({...e,home:t.home}),a=n.recommended_leader?n.candidates.find(i=>i.host===n.recommended_leader?.host&&i.surface===n.recommended_leader.surface)?.dry_run??null:null;if(!n.recommended_leader)return{dry_run:r,applied:!1,user_confirmed:o,action:"blocked_by_host",plan:n,dry_run_reconcile:a,applied_reconcile:null,warnings:n.warnings};if(r)return{dry_run:!0,applied:!1,user_confirmed:o,action:"planned",plan:n,dry_run_reconcile:a,applied_reconcile:null,warnings:[]};if(!o)return{dry_run:!1,applied:!1,user_confirmed:!1,action:"rejected",plan:n,dry_run_reconcile:a,applied_reconcile:null,warnings:["HEARTBEAT_ACTIVATION_REQUIRES_USER_CONFIRMED"]};let s=await yt({home:t.home,host:n.recommended_leader.host,surface:n.recommended_leader.surface,mode:n.profile.mode,apply:!0,heartbeat:Zm(n.profile),hostConfigRoot:Ye(n.recommended_leader.host,e.targetRoot),targetRoot:e.targetRoot});return await h({home:t.home,type:"activation.heartbeat.applied",details:{host:n.recommended_leader.host,surface:n.recommended_leader.surface,mode:n.profile.mode,cadence:n.profile.cadence,project_scope:n.profile.project_scope,native_schedule_supported:s.schedule.native_schedule_supported,native_id:s.schedule.native_id}}),{dry_run:!1,applied:!0,user_confirmed:!0,action:"applied",plan:n,dry_run_reconcile:a,applied_reconcile:s,warnings:s.warnings}}function zS(e){return{cadence:e.cadence??"daily",skip_when_busy:!0,project_scope:e.projectScope??"current-project",behavior:e.behavior??"read_only",mode:e.mode??"leader",silent_ack:"HEARTBEAT_OK",hidden_fallback_scheduler:!1}}async function XS(e){let t=[];for(let r of qe(e.host))for(let o of Ke(r,e.surface)){let n=await yt({home:e.home,host:r,surface:o,mode:e.mode,apply:!1,heartbeat:e.heartbeat,hostConfigRoot:Ye(r,e.targetRoot),targetRoot:e.targetRoot});t.push({host:r,surface:o,status:QS(n),native_schedule_supported:n.schedule.native_schedule_supported,native_id:n.schedule.native_id,reason:ZS(n),dry_run:n})}return t}function YS(e,t){let r=e.filter(o=>o.status==="supported"&&o.native_id);return t?r.find(o=>o.host===t)??null:r.sort((o,n)=>Qm(o)-Qm(n))[0]??null}function Qm(e){let t=KS.indexOf(e.host),r=e.surface==="claude-desktop"?-.25:e.surface==="claude-code"?0:.25;return(t===-1?99:t)+r}function QS(e){return e.adapter_result.status==="ok"&&e.schedule.native_schedule_supported&&e.schedule.native_id?"supported":e.adapter_result.status==="degraded"?"degraded":"blocked_by_host"}function ZS(e){switch(e.adapter_result.status){case"ok":return"native_scheduler_supported";case"degraded":return e.adapter_result.reason;case"unsupported":return e.adapter_result.reason;case"error":return e.adapter_result.message}}function Zm(e){return{cadence:e.cadence,skipWhenBusy:e.skip_when_busy,projectScope:e.project_scope,behavior:e.behavior}}function eA(e){return e==="codex"||e==="claude"||e==="grok"||e==="antigravity"||e==="gemini"?e:null}import{randomUUID as tA}from"node:crypto";import rA from"node:path";var oA="NativeSoul activation verification marker";async function Ko(e={}){let t=iA(e),r=K(t.projectCwd,e.home),o=await Kt({home:e.home,host:e.host??"all",surface:e.surface,targetRoot:e.targetRoot}),n=[];for(let c of o.hosts)n.push(await nA({home:o.home,inputHost:c,testCwd:t.projectCwd}));let a=await sA({home:e.home,testProject:`${r.id}-${tA()}`,apply:e.apply===!0,userConfirmed:e.userConfirmed===!0,retainTestData:e.retainTestData===!0}),s=[...new Set([...n.flatMap(c=>c.recommendations),...a.status==="failed"?["Review memory persistence and rerun verification."]:[]])],i=n.map(c=>c.status),l=cA(i,a.status);return{schema_version:1,home:o.home,target_root:o.target_root,host:e.host??"all",surface:e.surface??null,project:{requested_cwd:t.projectCwd,normalized:r.id,source:r.source,git_root:r.git_root,remote:r.remote,alias_key:r.alias_key},overall_status:l,memory_recall:a,hosts:n,recommendations:s}}async function nA(e){let t=[],r=await aA({home:e.home,host:e.inputHost.host,cwd:e.testCwd,warnings:e.inputHost.handshake.last?.warnings??[]});e.inputHost.mcp_registration.configured||t.push(`Install MCP registration for ${e.inputHost.host}: nativesoul mcp install --host ${e.inputHost.host} --apply --json`),r.status!=="ready"&&t.push(`Regenerate bootstrap context for ${e.inputHost.host}: nativesoul bootstrap --host ${e.inputHost.host} --cwd ${e.testCwd} --format inject --json`);let o=lA(e.inputHost.provider_parity.heartbeat),n=[...e.inputHost.full_native_evidence.missing_requirements];o==="unsupported"&&(n.includes("native_scheduler")||n.push("native_scheduler"),t.push(`Choose a host with native scheduler support or configure external scheduler workflow for ${e.inputHost.host}.`));let s=e.inputHost.provider_parity.heartbeat==="unsupported-native"&&e.inputHost.host!=="codex"?"blocked_by_host":r.status==="failed"||r.status==="degraded"||r.cache.status==="degraded"||r.cache.status==="missing"||!e.inputHost.plugin.enabled?"degraded":"ready";return{host:e.inputHost.host,surface:e.inputHost.surface,status:s,mcp:{configured:e.inputHost.mcp_registration.configured,issues:e.inputHost.mcp_registration.issues.map(i=>i.message)},bootstrap:r,heartbeat:{status:o,requirements:n},recommendations:t}}async function aA(e){let t=[...e.warnings],r=[],o="ready",n=!1,a="",s="ready";try{let i=await pt({home:e.home,host:e.host,cwd:e.cwd,readOnly:!0});t.push(...i.warnings),i.warnings.some(l=>l.startsWith("HOST_ADAPTER_UNAVAILABLE")||l==="PROJECT_MEMORY_EMPTY")&&(s="degraded")}catch(i){t.push(`bootstrap_injection_failed:${Rl(i)}`),s="failed"}try{let i=await qs({home:e.home,host:e.host,projectCwd:e.cwd,recordTelemetry:!1});a=i.targetPath,n=i.stale,r.push(...i.warnings),r.length>0&&(o=i.warnings.some(l=>l==="BOOTSTRAP_CACHE_MISSING")?"missing":"degraded",s==="ready"&&(s="degraded"))}catch{r.push("bootstrap_cache_check_failed"),o="missing",s==="ready"&&(s="degraded")}return{status:s,warnings:t,cache:{status:o,warnings:r,targetPath:a,stale:n}}}async function sA(e){let t=[],r=null,o=!1,n=!1;try{let a=`verify-${e.testProject}`,s=`${oA} ${e.testProject}`;r=await ee(e.home,{project:a,content:s,confidence:.91,source:{host:"activation-verification",session_id:`verification-${e.testProject}`}});let i=await Ht(e.home,s,a,8),l=await Dt({home:e.home,project:a,status:"candidate",limit:8}),c=i.some(d=>d.id===r?.id)||l.some(d=>d.id===r?.id);if(e.apply&&e.userConfirmed&&r){let d=await Nt(e.home,r.id);r=d,n=r.id===d.id&&r.status==="active"}if(!e.retainTestData&&r)try{r.status==="candidate"?await Mt(e.home,r.id):await Lt(e.home,r.id),o=!0}catch(d){t.push(`memory_cleanup_failed:${Rl(d)}`)}return{test_project:e.testProject,candidate_id:r?.id??"",candidate_status:r?.status??"candidate",recalled:c,promoted:n,status:c?"passed":"failed",warnings:t,cleanup_performed:o}}catch(a){return t.push(`memory_recall_check_failed:${Rl(a)}`),{test_project:e.testProject,candidate_id:r?.id??"",candidate_status:r?.status??"candidate",recalled:!1,promoted:!1,status:"failed",warnings:t,cleanup_performed:!1}}}function iA(e){return{projectCwd:rA.resolve(e.projectCwd??process.cwd())}}function lA(e){return e==="native"?"native":e==="official-fallback"?"official_fallback":"unsupported"}function cA(e,t){return e.includes("blocked_by_host")?"blocked_by_host":e.includes("degraded")||t==="failed"?"degraded":e.length>0?"ready":"degraded"}function Rl(e){return e instanceof Error?e.message:String(e)}async function eg(e){let t=await v(e),r=_(t.database);try{r.integrityCheck()}finally{r.close()}return await h({home:t.home,type:"workspace_initialized",details:{createdDirectories:t.createdDirectories.length,createdFiles:t.createdFiles.length,preservedFiles:t.preservedFiles.length}}),t}function ca(e){let t=f(e);if(!dA(t.database))return{home:t.home,initialized:!1,database:t.database,migrations:0,memories:0,events:0,capabilities:0,ledger:uA()};let r=_(t.database,{readOnly:!0});try{return{home:t.home,initialized:!0,database:t.database,...r.counts()}}finally{r.close()}}function uA(){return{hosts:0,sessions:0,memory_edges:0,commitments:0,standing_orders:0,capability_sources:0,capability_experience:0,schedules:0,leases:0,runs:0,work_items:0,work_item_events:0}}function m(e,t,r){t?process.stdout.write(`${JSON.stringify(pA(e),null,2)}
|
|
1100
1100
|
`):process.stdout.write(`${r}
|
|
1101
|
-
`)}function pA(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}async function zo(){if(process.stdin.isTTY)return"";let e=[];for await(let t of process.stdin)e.push(Buffer.isBuffer(t)?t:Buffer.from(String(t)));return Buffer.concat(e).toString("utf8")}function Xo(e){let t=e.trim();if(t.length!==0)try{return JSON.parse(t)}catch{return t}}function tg(e){if(typeof e=="string")return e;if(!e||Array.isArray(e)||typeof e!="object")return"";for(let t of["prompt","user_prompt","message","text","content"]){let r=e[t];if(typeof r=="string")return r}return""}function
|
|
1101
|
+
`)}function pA(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}async function zo(){if(process.stdin.isTTY)return"";let e=[];for await(let t of process.stdin)e.push(Buffer.isBuffer(t)?t:Buffer.from(String(t)));return Buffer.concat(e).toString("utf8")}function Xo(e){let t=e.trim();if(t.length!==0)try{return JSON.parse(t)}catch{return t}}function tg(e){if(typeof e=="string")return e;if(!e||Array.isArray(e)||typeof e!="object")return"";for(let t of["prompt","user_prompt","message","text","content"]){let r=e[t];if(typeof r=="string")return r}return""}function Sl(e){if(e[0]==="--help"||e[0]==="-h")return{command:"help",rest:[],flags:new Map([["help",!0]])};let[t,...r]=e,o=[],n=new Map;for(let a=0;a<r.length;a+=1){let s=r[a];if(s)if(s==="-h")n.set("help",!0);else if(s.startsWith("--")){let i=s.slice(2),l=r[a+1];l&&!l.startsWith("--")?(n.set(i,l),a+=1):n.set(i,!0)}else o.push(s)}return{command:t,rest:o,flags:n}}function Al(e){return e.command==="help"||b(e.flags,"help")}function b(e,t){return e.get(t)===!0}function u(e,t){let r=e.get(t);return typeof r=="string"?r:void 0}function P(e,t){let r=u(e,t);if(!r)return;let o=Number(r);return Number.isFinite(o)?o:void 0}var Nr=new Set(["codex","claude","grok","antigravity","gemini"]);function Yo(e){let t=u(e,"host")??"all";if(t==="all"||Nr.has(t))return t;throw new Error(`Unsupported adapter host: ${t}`)}function rg(e){let t=u(e,"host");if(t&&Nr.has(t))return t;throw new Error("This command requires --host codex|claude|grok|antigravity|gemini")}function rt(e){if(b(e,"all-hosts"))return"all";let t=u(e,"host")??"all";if(t==="all"||Nr.has(t))return t;throw new Error(`Unsupported install host: ${t}`)}function Ie(e){let t=u(e,"surface");if(t!==void 0){if(t==="desktop"||t==="claude-desktop")return"claude-desktop";if(t==="claude-code")return"claude-code";throw new Error("install surface must be claude-code, desktop, or claude-desktop")}}function Qo(e){let t=u(e,"host");if(t&&Nr.has(t))return t;throw new Error("This command requires --host codex|claude|grok|antigravity|gemini")}function Zo(e){let t=u(e,"host");if(t!==void 0){if(Nr.has(t))return t;throw new Error("This command accepts --host codex|claude|grok|antigravity|gemini")}}function og(e){let t=u(e,"result");if(t!==void 0){if(t==="ok"||t==="error"||t==="blocked")return t;throw new Error("audit --result must be ok, error, or blocked")}}function ng(e){let t=u(e,"status");if(t!==void 0){if(t==="pending"||t==="approved"||t==="rejected")return t;throw new Error("approvals --status must be pending, approved, or rejected")}}function ag(e){let t=u(e,"format")??"json";if(t==="json"||t==="jsonl")return t;throw new Error("audit export --format must be json or jsonl")}function sg(e){let t=u(e,"status");if(t!==void 0){if(t==="open"||t==="completed"||t==="dismissed"||t==="expired")return t;throw new Error("commitments --status must be open, completed, dismissed, or expired")}}function da(e){let t=u(e,"status");if(t!==void 0){if(t==="inbox"||t==="assigned"||t==="in_progress"||t==="review"||t==="blocked"||t==="done"||t==="failed")return t;throw new Error("work --status must be inbox, assigned, in_progress, review, blocked, done, or failed")}}function ua(e){let t=u(e,"priority");if(t!==void 0){if(t==="low"||t==="normal"||t==="high"||t==="urgent")return t;throw new Error("work --priority must be low, normal, high, or urgent")}}function El(e,t){let r=u(e,t);if(r!==void 0)return r.split(",").map(o=>o.trim()).filter(Boolean)}function ig(e){let t=u(e,"status");if(t!==void 0){if(t==="active"||t==="archived"||t==="forgotten"||t==="all")return t;throw new Error("project list --status must be active, archived, forgotten, or all")}}function lg(e){let t=u(e,"class");if(t==="read_local"||t==="probe_external"||t==="write_local"||t==="write_project"||t==="external_write"||t==="destructive"||t==="identity_policy_change")return t;throw new Error("policy evaluate requires --class read_local|probe_external|write_local|write_project|external_write|destructive|identity_policy_change")}function pa(e){let t=u(e,"mode")??"leader";if(t==="leader"||t==="federated"||t==="per-project")return t;throw new Error("schedule --mode must be leader, federated, or per-project")}function cg(e){let t=u(e,"host")??"generic";if(t==="generic"||Nr.has(t))return t;throw new Error(`Unsupported MCP manifest host: ${t}`)}function Pl(e){return Qo(e)}function xl(e){let t=u(e,"command-mode")??"package";if(t==="package"||t==="local"||t==="absolute")return t;throw new Error(`Unsupported MCP command mode: ${t}`)}function dg(e){let t=u(e,"format")??"json";if(t==="json"||t==="inject"||t==="cache")return t;throw new Error("bootstrap --format must be json, inject, or cache")}async function jl(e,t,r){let o=e.rest[0]??"status",n={home:t,host:rt(e.flags),surface:Ie(e.flags),targetRoot:u(e.flags,"target-root")};if(o==="status"){let a=await Or(n);m(a,r,`Activation status: ${a.overall_status}`);return}if(o==="plan"){let a=await Go({...n,profile:mA(e)});m(a,r,`Activation plan: ${a.plan.length} dry-run action(s)`);return}if(o==="heartbeat"){let a=e.rest[1]??"plan",s={home:t,host:rt(e.flags),surface:Ie(e.flags),targetRoot:u(e.flags,"target-root"),leaderHost:gA(e),mode:pa(e.flags),cadence:u(e.flags,"cadence"),projectScope:u(e.flags,"project")??u(e.flags,"project-scope"),behavior:fA(e),user_confirmed:b(e.flags,"user-confirmed")};if(a==="plan"){let i=await la(s);m(i,r,i.recommended_leader?`Heartbeat leader recommended: ${i.recommended_leader.host}`:"Heartbeat native scheduler blocked by host");return}if(a==="apply"){let i=await wl({...s,dry_run:!b(e.flags,"apply")});m(i,r,i.applied?"Heartbeat activation applied":`Heartbeat activation ${i.action}`);return}throw new Error("activate heartbeat requires plan or apply")}throw new Error("activate requires status, plan, or heartbeat")}function mA(e){let t=u(e.flags,"profile");if(t!==void 0){if(t==="quickstart"||t==="advanced")return t;throw new Error("activate plan requires --profile quickstart|advanced")}}function gA(e){let t=u(e.flags,"leader-host");if(t!==void 0){if(t==="codex"||t==="claude"||t==="grok"||t==="antigravity"||t==="gemini")return t;throw new Error("activate heartbeat requires --leader-host codex|claude|grok|antigravity|gemini")}}function fA(e){let t=u(e.flags,"behavior");if(t!==void 0){if(t==="read_only"||t==="approval_required")return t;throw new Error("activate heartbeat requires --behavior read_only|approval_required")}}async function Il(e,t){let r=e.rest[0],o=Yo(e.flags);if(r==="hot-scan"){let n=await Tt({home:u(e.flags,"home"),host:o,delta:b(e.flags,"delta"),ttlSeconds:P(e.flags,"ttl-seconds")}),a=n.reduce((s,i)=>s+i.count,0);m(n,t,`Hot-scanned ${a} capability record(s)`);return}if(r==="scan"){let n=await Jr(o);m(n,t,`Scanned ${n.length} adapter(s)`);return}if(r==="doctor"){let n=await qr(o),a=n.reduce((s,i)=>s+i.diagnostics.length,0);m(n,t,`Adapter doctor found ${a} diagnostic(s)`);return}if(r==="managed-block"){let n=rg(e.flags),a=await Gr(n);m(a,t,`Managed block preview for ${a.host}: ${a.targetPath}`);return}if(r==="install-managed-block"){let n=Qo(e.flags),a=await Kr({home:u(e.flags,"home"),host:n,apply:b(e.flags,"apply"),targetPath:u(e.flags,"target")});m(a,t,`${a.dryRun?"Planned":"Applied"} managed block for ${a.host}: ${a.action}`);return}if(r==="rollback-managed-block"){let n=u(e.flags,"snapshot");if(!n)throw new Error("adapters rollback-managed-block requires --snapshot <path>");let a=await ms({home:u(e.flags,"home"),snapshotPath:n,apply:b(e.flags,"apply")});m(a,t,`${a.dryRun?"Planned rollback":"Rolled back"} managed block target ${a.targetPath}`);return}throw new Error("adapters requires scan, hot-scan, doctor, or managed-block")}async function Tl(e,t,r){let o=e.rest[0];if(o==="list"){let n=na({home:t,status:ng(e.flags)});m(n,r,yA(n.approvals,n.warning));return}if(o==="show"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error("approvals show requires <id|.>");let a=n==="."?hA(t):oa({home:t,id:n}).approval;m(a,r,a?_A(a):`Approval not found: ${n}`),a||(process.exitCode=1);return}if(o==="approve"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error("approvals approve requires <id>");let a=oa({home:t,id:n}).approval;if(!a){m({approval:null,applied:!1,action:"approve",warning:"approval_not_found"},r,`Approval not found: ${n}`),process.exitCode=1;return}if(!b(e.flags,"confirm")){m({approval:a,applied:!1,action:"approve",warning:"requires --confirm"},r,`Approval approve dry-run: ${a.id} (${a.action}); rerun with --confirm to apply.`);return}let s=await xr({home:t,id:n,status:"approved",reviewer:"cli",reason:u(e.flags,"reason")??null});m(s.approval,r,s.approval?`Approval approved: ${s.approval.id}`:`Approval not found: ${n}`),s.approval||(process.exitCode=1);return}if(o==="reject"){let n=e.rest[1]??u(e.flags,"id"),a=u(e.flags,"reason");if(!n||!a)throw new Error("approvals reject requires <id> --reason <text>");let s=await xr({home:t,id:n,status:"rejected",reviewer:"cli",reason:a});m(s.approval,r,s.approval?`Approval rejected: ${s.approval.id}`:`Approval not found: ${n}`),s.approval||(process.exitCode=1);return}throw new Error("approvals requires list, show, approve, or reject")}function hA(e){return na({home:e,status:"pending"}).approvals[0]??null}function yA(e,t){return t?`Approvals unavailable: ${t}`:e.length===0?"No approvals found":[`${e.length} approval(s)`,...e.map(r=>`${r.id} ${r.action} ${r.class} ${r.target??"-"} ${r.status} ${r.reviewer??"-"} ${r.created_at}`)].join(`
|
|
1102
1102
|
`)}function _A(e){return[`Approval ${e.id}`,`Action: ${e.action}`,`Class: ${e.class}`,`Target: ${e.target??"-"}`,`Project: ${e.project??"-"}`,`Host: ${e.host??"-"}`,`Status: ${e.status}`,`Reviewer: ${e.reviewer??"-"}`,`Reason: ${e.reason??"-"}`,`Created: ${e.created_at}`,`Decided: ${e.decided_at??"-"}`].join(`
|
|
1103
1103
|
`)}async function Cl(e,t,r){let o=e.rest[0],n={home:t,type:u(e.flags,"type"),result:og(e.flags),limit:P(e.flags,"limit")};if(o==="list"){let a=await un(n);m(a,r,`${a.length} audit event(s)`);return}if(o==="export"){let a=ag(e.flags),s=await Ga({...n,format:a});if(a==="jsonl"){process.stdout.write(s.events.map(i=>JSON.stringify(i)).join(`
|
|
1104
1104
|
`)),s.events.length>0&&process.stdout.write(`
|
|
1105
1105
|
`);return}process.stdout.write(`${JSON.stringify(s.events,null,2)}
|
|
1106
1106
|
`);return}throw new Error("audit requires list or export")}async function Ol(e,t,r){let o=e.rest[0];if(o==="refresh"){let n=await Tt({home:t,host:Yo(e.flags),delta:b(e.flags,"delta"),ttlSeconds:P(e.flags,"ttl-seconds")}),a=n.reduce((s,i)=>s+i.count,0);m(n,r,`Refreshed ${a} capability record(s)`);return}if(o==="learn"){let n=await ys({home:t,host:Yo(e.flags),limit:P(e.flags,"limit")});m(n,r,`Learned ${n.generated} capability card(s), changed ${n.changed}`);return}if(o==="list"){let n=await Ee({home:t,host:Zo(e.flags),readyOnly:b(e.flags,"ready-only"),limit:P(e.flags,"limit")});m(n,r,`${n.length} capability record(s)`);return}if(o==="search"){let n=e.rest.slice(1).join(" ")||(u(e.flags,"query")??""),a=await Yr({home:t,query:n,host:b(e.flags,"all-hosts")?void 0:Zo(e.flags)??"codex",readyOnly:b(e.flags,"ready-only"),limit:P(e.flags,"limit")});m(a,r,`${a.length} capability record(s) found`);return}if(o==="show"){let n=e.rest[1]??u(e.flags,"uid");if(!n)throw new Error("capabilities show requires <uid> or --uid <uid>");let a=await Ct({home:t,uid:n});if(!a)throw new Error(`Capability not found: ${n}`);m(a,r,`Capability ${a.uid}: ready=${a.ready}`);return}if(o==="explain"){let n=e.rest[1]??u(e.flags,"uid");if(!n){ug("capabilities explain requires <uid> or --uid <uid>",r);return}let a=await $i({home:t,uid:n});if(!a){ug(bA(n),r);return}m(a,r,vA(a));return}throw new Error("capabilities requires refresh, learn, list, search, show, or explain")}function ug(e,t){if(t){m({error:e},!0,e),process.exitCode=1;return}throw new Error(e)}function bA(e){return`Capability not found: ${e}. Run "nativesoul capabilities search ${e} --all-hosts" to find available capability UIDs.`}function vA(e){return[`Capability ${e.uid}: ${e.readiness_label} (ready=${e.readiness.ready})`,`Source: ${e.source}`,`Schema hash: ${e.schema_hash??"none"}`,"Readiness signals:",...e.readiness_signals.map(kA)].join(`
|
|
1107
|
-
`)}function kA(e){let t=e.satisfied?"\u2713":"\u2717",r=e.reason?` - ${e.reason}`:"";return`- ${t} ${e.signal}${r}`}async function Nl(e,t,r){let o=e.rest[0];if(o==="create"){let n=u(e.flags,"summary")??u(e.flags,"text");if(!n)throw new Error("commitments create requires --summary <text>");let a=u(e.flags,"project")??L(process.cwd(),t),s=await Qr({home:t,project:a,summary:n,dueAt:u(e.flags,"due-at")??null,ttlSeconds:P(e.flags,"ttl-seconds")});m(s,r,s.created?`Commitment created: ${s.commitment.id}`:`Commitment deduped: ${s.commitment.id}`);return}if(o==="list"){let n=await Zr({home:t,project:u(e.flags,"project"),status:sg(e.flags),includeExpired:b(e.flags,"include-expired"),limit:P(e.flags,"limit")});m(n,r,`${n.length} commitment(s)`);return}if(o==="complete"||o==="dismiss"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error(`commitments ${o} requires <id> or --id <id>`);let a=o==="complete"?await eo(t,n):await _s(t,n);m(a,r,`Commitment ${o}d: ${a.id}`);return}throw new Error("commitments requires create, list, complete, or dismiss")}async function Dl(e,t,r){let o=u(e.flags,"project")??K(process.cwd(),t).id,n=Uo({home:t,project:o,host:u(e.flags,"host"),since:u(e.flags,"since"),until:u(e.flags,"until"),groupBy:wA(e.flags),limit:P(e.flags,"limit")});m(n,r,
|
|
1108
|
-
`)}function Ml(e){return e.cost_reported_runs===0?"not reported by host":
|
|
1109
|
-
`):"HEARTBEAT_OK";m(i,r,l);return}if(o==="complete"){let n=u(e.flags,"slot")??e.rest[1];if(!n)throw new Error("heartbeat complete requires --slot <id>");let a=u(e.flags,"project")??L(process.cwd(),t),s=u(e.flags,"host")??"codex",i=await Jo({home:t,slot:n,host:s,project:a,result:u(e.flags,"result")??"HEARTBEAT_OK",evidence:u(e.flags,"evidence")?{note:u(e.flags,"evidence")??""}:{},workItemId:u(e.flags,"work-item")});m(i,r,`Heartbeat completed: ${i.lease.id}`);return}if(o==="status"){let n=await ll({home:t,project:u(e.flags,"project"),limit:P(e.flags,"limit")});m(n,r,`${n.length} heartbeat lease(s)`);return}throw new Error("heartbeat requires claim, complete, or status")}async function Ul(e,t,r){let o=e.rest[0];if(o==="reconcile"){let n=Qo(e.flags),a=u(e.flags,"target-root"),s=await yt({home:t,host:n,surface:Ie(e.flags),mode:pa(e.flags),apply:b(e.flags,"apply"),hostConfigRoot:a?Ye(n,a):void 0,targetRoot:a});m(s,r,s.applied?`Schedule reconciled: ${s.schedule.id}`:`Schedule reconcile planned: ${s.schedule.id}`);return}if(o==="list"){let n=await Po({home:t,host:Zo(e.flags),limit:P(e.flags,"limit")});m(n,r,`${n.length} schedule record(s)`);return}if(o==="disable"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error("schedule disable requires <id> or --id <id>");let a=await yi({home:t,id:n,apply:b(e.flags,"apply")});m(a,r,a.applied?`Schedule disabled: ${n}`:`Schedule disable planned: ${n}`);return}throw new Error("schedule requires reconcile, list, or disable")}async function Bl(e,t,r){if(e.rest[0]==="openclaw"){let a=u(e.flags,"source")??e.rest[1];if(!a)throw new Error("import openclaw requires --source <path>");let s=await
|
|
1110
|
-
`)}async function Wl(e,t,r){let o=await Li({page:u(e.flags,"page")});m(o,r,o.ok?`Marketing audit PASS: ${o.summary.claims_checked} claim(s), ${o.summary.pages_scanned} page(s)`:`Marketing audit FAIL: ${o.issues.length} issue(s)`),o.ok||(process.exitCode=1)}var pg={life_activation_status:async(e,t)=>await Or({home:t,host:Jl(e.host),targetRoot:St(e.target_root)??St(e.targetRoot)}),life_activation_plan:async(e,t)=>await Go({home:t,host:Jl(e.host),targetRoot:St(e.target_root)??St(e.targetRoot),profile:OA(e.profile)}),life_activation_verify:async(e,t)=>await Ko({home:t,host:Jl(e.host),surface:NA(e.surface),targetRoot:St(e.target_root)??St(e.targetRoot),projectCwd:St(e.project_cwd)??St(e.projectCwd),apply:ql(e.apply),userConfirmed:ql(e["user-confirmed"]),retainTestData:ql(e["retain-test-data"])})},mg=[{name:"life_activation_status",description:"Return activation status by component, including bootstrap, MCP, plugins/hooks, heartbeat, recall, memory, and cross-host verification.",inputSchema:{type:"object",properties:{host:{type:"string"},target_root:{type:"string"},targetRoot:{type:"string"}}}},{name:"life_activation_plan",description:"Return a read-only dry-run activation plan with exact files, settings, scheduler actions, and approvals.",inputSchema:{type:"object",properties:{host:{type:"string"},profile:{type:"string"},target_root:{type:"string"},targetRoot:{type:"string"}}}},{name:"life_activation_verify",description:"Run cross-host activation verification for bootstrap cache, MCP, scheduler evidence, and memory recall.",inputSchema:{type:"object",properties:{host:{type:"string"},surface:{type:"string"},project_cwd:{type:"string"},projectCwd:{type:"string"},target_root:{type:"string"},targetRoot:{type:"string"},apply:{type:"boolean"},"user-confirmed":{type:"boolean"},"retain-test-data":{type:"boolean"}}}}];function Jl(e){if(e===void 0)return"all";if(e==="all"||e==="codex"||e==="claude"||e==="grok"||e==="antigravity"||e==="gemini")return e;throw new Error("Invalid activation host")}function OA(e){if(e!==void 0){if(e==="quickstart"||e==="advanced")return e;throw new Error("Invalid activation profile")}}function NA(e){if(e!==void 0){if(e==="desktop"||e==="claude-desktop")return"claude-desktop";if(e==="claude-code")return"claude-code";throw new Error("activation verify surface must be claude-code, desktop, or claude-desktop")}}function St(e){return typeof e=="string"?e:void 0}function ql(e){return e===!0}var MA=["2025-11-25","2024-11-05","2024-10-07"],_g={...pg,life_status:(e,t)=>ca(t),life_bootstrap:async(e,t)=>await UA({home:t,host:C(e.host,"codex"),cwd:C(e.cwd,process.cwd()),query:F(e.query)}),life_recall:async(e,t)=>await Ht(t,C(e.query,""),C(e.project,"default"),ga(e.limit,5)),life_remember_propose:async(e,t)=>await ee(t,{project:C(e.project,"default"),content:C(e.content,""),type:F(e.type),confidence:gg(e.confidence),source:{host:"mcp",session_id:"local"}}),life_memory_promote:async(e,t)=>await Nt(t,C(e.id,"")),life_memory_reject:async(e,t)=>await Mt(t,C(e.id,"")),life_memory_forget:async(e,t)=>await Lt(t,C(e.id,"")),life_memory_expire:async(e,t)=>await co(t,C(e.id,"")),life_capability_search:async(e,t)=>await Yr({home:t,query:C(e.query,""),host:WA(e)?void 0:F(e.host)??"codex",readyOnly:Mr(e.readyOnly,!1),limit:ga(e.limit,8)}),life_capability_status:async(e,t)=>{let r=C(e.uid,""),o=r?await Ct({home:t,uid:r}):null;if(!o)throw new Error(`Capability not found: ${r}`);return o},life_policy_evaluate:async(e,t)=>await kt({home:t,action:C(e.action,""),className:yg(e.class),target:F(e.target)}),life_approval_request:async(e,t)=>await KA({home:t,action:C(e.action,""),className:yg(e.class),target:F(e.target),project:F(e.project),host:F(e.host)}),life_approval_decide:async(e,t)=>{let r=C(e.id,""),o=await xr({home:t,id:r,status:GA(e.status),reviewer:C(e.host,"mcp"),reason:F(e.reason)??null});if(!o.approval)throw new Error(`Approval not found: ${r}`);return o},life_commitment_create:async(e,t)=>await Qr({home:t,project:C(e.project,"default"),summary:C(e.summary,""),dueAt:F(e.due_at),ttlSeconds:gg(e.ttl_seconds),source:{host:"mcp",session_id:"local"}}),life_commitment_complete:async(e,t)=>await eo(t,C(e.id,"")),life_work_item_create:async(e,t)=>await Lo({home:t,project:C(e.project,"default"),title:C(e.title,""),description:F(e.description),priority:Gl(e.priority),source:"mcp",tags:fg(e.tags),host:F(e.host)}),life_work_item_list:async(e,t)=>await Do({home:t,project:F(e.project),status:hg(e.status),priority:Gl(e.priority),assignedHost:F(e.host),limit:ga(e.limit,50)}),life_work_item_claim:async(e,t)=>await Ho({home:t,id:C(e.id,""),host:C(e.host,"mcp")}),life_work_item_update:async(e,t)=>await $o({home:t,id:C(e.id,""),status:hg(e.status),priority:Gl(e.priority),assignedHost:F(e.host),description:F(e.description),tags:e.tags===void 0?void 0:fg(e.tags)}),life_work_item_complete:async(e,t)=>await Fo({home:t,id:C(e.id,""),status:VA(e.status)}),life_heartbeat_claim:async(e,t)=>await Wo({home:t,slot:C(e.slot,""),host:C(e.host,"codex"),project:C(e.project,"default"),ttlSeconds:ga(e.ttl_seconds,1500)}),life_heartbeat_complete:async(e,t)=>await Jo({home:t,slot:C(e.slot,""),host:C(e.host,"codex"),project:C(e.project,"default"),result:e.result??"HEARTBEAT_OK",evidence:e.evidence??{},workItemId:F(e.work_item_id)}),life_onboarding_status:async(e,t)=>await oo(t),life_onboard_apply:async(e,t)=>await no({home:t,dry_run:Mr(e.dry_run,!0),user_confirmed:Mr(e.user_confirmed,!1),files:JA(e.files),config_patch:qA(e.config_patch)}),life_onboard_complete:async(e,t)=>await ao({home:t,archive:e.archive===void 0?!0:Mr(e.archive,!0)})},LA=new Set(Object.keys(_g));function DA(e){return e.method?.startsWith("notifications/")?!0:!Object.prototype.hasOwnProperty.call(e,"id")}async function fa(e,t){if(DA(e))return null;let r=e.id??null;try{if(e.method==="initialize"){let o=tn(e.params),n=F(o.protocolVersion),a=n&&MA.includes(n)?n:"2024-11-05";return ot(r,{protocolVersion:a,serverInfo:{name:"nativesoul",version:"0.1.0"},capabilities:{tools:{}}})}if(e.method==="ping")return ot(r,{});if(e.method==="resources/list")return ot(r,{resources:[]});if(e.method==="prompts/list")return ot(r,{prompts:[]});if(e.method==="tools/list")return ot(r,{tools:[{name:"life_status",description:"Return local NativeSoul health and counts.",inputSchema:{type:"object"}},{name:"life_bootstrap",description:"Return compact bootstrap context for a host and cwd.",inputSchema:{type:"object",required:["host","cwd"],properties:{host:{type:"string"},cwd:{type:"string"},query:{type:"string"}}}},{name:"life_recall",description:"Search project-scoped memory.",inputSchema:{type:"object",required:["query","project"],properties:{query:{type:"string"},project:{type:"string"},limit:{type:"number"}}}},{name:"life_remember_propose",description:"Create a redacted local candidate memory for a project.",inputSchema:{type:"object",required:["project","content"],properties:{project:{type:"string"},content:{type:"string"},type:{type:"string"},confidence:{type:"number"}}}},{name:"life_memory_promote",description:"Promote a candidate memory to active status.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_memory_reject",description:"Reject a candidate memory.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_memory_forget",description:"Forget an active memory.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_memory_expire",description:"Expire an active memory.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_capability_search",description:"Search persisted local capability records.",inputSchema:{type:"object",required:["query"],properties:{query:{type:"string"},host:{type:"string"},allHosts:{type:"boolean"},all_hosts:{type:"boolean"},readyOnly:{type:"boolean"},limit:{type:"number"}}}},{name:"life_capability_status",description:"Return one persisted capability record by uid.",inputSchema:{type:"object",required:["uid"],properties:{uid:{type:"string"}}}},{name:"life_policy_evaluate",description:"Evaluate a proposed action against local policy and standing orders.",inputSchema:{type:"object",required:["action","class"],properties:{action:{type:"string"},class:{type:"string"},target:{type:"string"}}}},{name:"life_approval_request",description:"Request approval for a sensitive action. If blocked, stop and return control to the human; there is no server or polling in this turn-based protocol.",inputSchema:{type:"object",required:["action","class"],properties:{action:{type:"string"},class:{type:"string"},target:{type:"string"},project:{type:"string"},host:{type:"string"}}}},{name:"life_approval_decide",description:"Record a human-driven approval decision. Acting agents must not self-approve; use this only from a human-operated host turn.",inputSchema:{type:"object",required:["id","status"],properties:{id:{type:"string"},status:{type:"string",enum:["approved","rejected"]},reason:{type:"string"},host:{type:"string"}}}},{name:"life_commitment_create",description:"Create a local project-scoped commitment with optional TTL.",inputSchema:{type:"object",required:["project","summary"],properties:{project:{type:"string"},summary:{type:"string"},due_at:{type:"string"},ttl_seconds:{type:"number"}}}},{name:"life_commitment_complete",description:"Complete a local commitment by id.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_work_item_create",description:"Create a local project-scoped work item.",inputSchema:{type:"object",required:["project","title"],properties:{project:{type:"string"},title:{type:"string"},description:{type:"string"},priority:{type:"string",enum:["low","normal","high","urgent"]},tags:{type:"array",items:{type:"string"}},host:{type:"string"}}}},{name:"life_work_item_list",description:"List local work items with optional filters.",inputSchema:{type:"object",properties:{project:{type:"string"},status:{type:"string",enum:["inbox","assigned","in_progress","review","blocked","done","failed"]},priority:{type:"string",enum:["low","normal","high","urgent"]},host:{type:"string"},limit:{type:"number"}}}},{name:"life_work_item_claim",description:"Claim one work item for a host.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},host:{type:"string"}}}},{name:"life_work_item_update",description:"Update one work item through the shared status machine.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},status:{type:"string",enum:["inbox","assigned","in_progress","review","blocked","done","failed"]},priority:{type:"string",enum:["low","normal","high","urgent"]},host:{type:"string"},description:{type:"string"},tags:{type:"array",items:{type:"string"}}}}},{name:"life_work_item_complete",description:"Complete one work item as done or failed.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},status:{type:"string",enum:["done","failed"]}}}},{name:"life_heartbeat_claim",description:"Claim a local heartbeat lease for a project and slot.",inputSchema:{type:"object",required:["slot","host","project"],properties:{slot:{type:"string"},host:{type:"string"},project:{type:"string"},ttl_seconds:{type:"number"}}}},{name:"life_heartbeat_complete",description:"Complete a local heartbeat lease and record a run.",inputSchema:{type:"object",required:["slot","host","project"],properties:{slot:{type:"string"},host:{type:"string"},project:{type:"string"},result:{type:"string"},evidence:{type:"object"},work_item_id:{type:"string"}}}},{name:"life_onboarding_status",description:"Return onboarding ritual status, per-theme interview guidance, file_generation_rules, and optional heartbeat/scan offers. Call before drafting files.",inputSchema:{type:"object"}},...mg,{name:"life_onboard_apply",description:"Dry-run or apply AI-generated onboarding human files.",inputSchema:{type:"object",required:["files"],properties:{dry_run:{type:"boolean"},user_confirmed:{type:"boolean"},files:{type:"object"},config_patch:{type:"object"}}}},{name:"life_onboard_complete",description:"Archive BOOTSTRAP.md and mark onboarding ritual complete.",inputSchema:{type:"object",properties:{archive:{type:"boolean"}}}}]});if(e.method==="tools/call"){let o=await kr(t);if(!o.ok)return ot(r,o);let n=BA(e.params);return ot(r,await $A(n.name??"",n.arguments??{},t))}if(LA.has(e.method)){let o=await kr(t);return o.ok?ot(r,await vg(e.method,tn(e.params),t)):ot(r,o)}return ma(r,-32601,`Unknown method: ${e.method}`)}catch(o){return o instanceof Ot?ma(r,-32010,o.message,{code:o.code,id:o.id,from:o.from,to:o.to}):o instanceof Ce?ma(r,-32011,o.message,{code:o.code,id:o.id,status:o.status}):ma(r,-32603,o instanceof Error?o.message:"Unknown MCP error")}}async function bg(e){let t="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>{t+=r;let o=t.split(/\r?\n/u);t=o.pop()??"";for(let n of o){let a=n.trim();a&&HA(a,e).catch(s=>{process.stderr.write(`NativeSoul MCP response error: ${zA(s)}
|
|
1107
|
+
`)}function kA(e){let t=e.satisfied?"\u2713":"\u2717",r=e.reason?` - ${e.reason}`:"";return`- ${t} ${e.signal}${r}`}async function Nl(e,t,r){let o=e.rest[0];if(o==="create"){let n=u(e.flags,"summary")??u(e.flags,"text");if(!n)throw new Error("commitments create requires --summary <text>");let a=u(e.flags,"project")??L(process.cwd(),t),s=await Qr({home:t,project:a,summary:n,dueAt:u(e.flags,"due-at")??null,ttlSeconds:P(e.flags,"ttl-seconds")});m(s,r,s.created?`Commitment created: ${s.commitment.id}`:`Commitment deduped: ${s.commitment.id}`);return}if(o==="list"){let n=await Zr({home:t,project:u(e.flags,"project"),status:sg(e.flags),includeExpired:b(e.flags,"include-expired"),limit:P(e.flags,"limit")});m(n,r,`${n.length} commitment(s)`);return}if(o==="complete"||o==="dismiss"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error(`commitments ${o} requires <id> or --id <id>`);let a=o==="complete"?await eo(t,n):await _s(t,n);m(a,r,`Commitment ${o}d: ${a.id}`);return}throw new Error("commitments requires create, list, complete, or dismiss")}async function Dl(e,t,r){let o=u(e.flags,"project")??K(process.cwd(),t).id,n=Uo({home:t,project:o,host:u(e.flags,"host"),since:u(e.flags,"since"),until:u(e.flags,"until"),groupBy:wA(e.flags),limit:P(e.flags,"limit")});m(n,r,RA(n))}function wA(e){let t=u(e,"group-by");if(t===void 0)return"total";if(t==="project"||t==="host"||t==="day")return t;throw new Error("cost --group-by must be project, host, or day")}function RA(e){let t=[`NativeSoul cost report (${e.filters.group_by})`,`Project: ${e.filters.project??"all"}`,`Host: ${e.filters.host??"all"}`,`Window: ${e.filters.since??"beginning"} -> ${e.filters.until??"now"}`,`Total reported: ${Ml(e.totals)}`,`Coverage: ${Ll(e.totals.reported_runs,e.totals.total_runs)}`],r=e.groups.length>0?e.groups:e.by_host;if(r.length>0){t.push("Groups:");for(let o of r)t.push(`- ${o.label}: ${Ml(o)} (${Ll(o.reported_runs,o.total_runs)})`)}if(e.by_session.length>0){t.push("Sessions:");for(let o of e.by_session)t.push(`- ${o.label}: ${Ml(o)} (${Ll(o.reported_runs,o.total_runs)})`)}return t.join(`
|
|
1108
|
+
`)}function Ml(e){return e.cost_reported_runs===0?"not reported by host":SA(e.total_usd)}function Ll(e,t){let r=t===0?0:Math.round(e/t*100);return`${e}/${t} reported (${r}%)`}function SA(e){return`$${e.toFixed(2)}`}async function Hl(e,t,r){let o=e.rest[0];if(o==="data"){let n=AA(e.flags),a=await Bo({home:t,project:u(e.flags,"project"),host:u(e.flags,"host"),limit:P(e.flags,"limit"),since:u(e.flags,"since"),until:u(e.flags,"until")});m(n?EA(a,n):a,r,`Dashboard data ready: ${a.initialized?"initialized":"not initialized"}`);return}if(o==="viewer"){let n=await zi({home:t,project:u(e.flags,"project"),host:u(e.flags,"host"),limit:P(e.flags,"limit"),since:u(e.flags,"since"),until:u(e.flags,"until"),output:u(e.flags,"output")});m(n,r,`Dashboard viewer written: ${n.outputPath}`);return}throw new Error("dashboard requires data or viewer")}function AA(e){let t=u(e,"section");if(t!==void 0){if(t==="work"||t==="approvals"||t==="cost")return t;throw new Error("dashboard --section must be work, approvals, or cost")}}function EA(e,t){return{schema_version:e.schema_version,generated_at:e.generated_at,filters:e.filters,read_only:e.read_only,[t]:e[t]}}async function $l(e,t,r){let o=e.rest[0];if(o==="m7"||o==="report"){let n=await Sr({home:t,project:u(e.flags,"project"),host:u(e.flags,"host"),limit:P(e.flags,"limit")});m(n,r,n.m7_gate.feedback_validated?"M7 feedback report ready":"M7 feedback report has gaps");return}throw new Error("feedback requires m7 or report")}async function Fl(e,t,r){let o=e.rest[0];if(o==="claim"){let n=u(e.flags,"slot")??e.rest[1];if(!n)throw new Error("heartbeat claim requires --slot <id>");let a=u(e.flags,"project")??L(process.cwd(),t),s=u(e.flags,"host")??"codex",i=await Wo({home:t,slot:n,host:s,project:a,ttlSeconds:P(e.flags,"ttl-seconds")}),l=i.claimed?[`Heartbeat lease claimed: ${i.lease.id}`,i.heartbeat_checklist].filter(Boolean).join(`
|
|
1109
|
+
`):"HEARTBEAT_OK";m(i,r,l);return}if(o==="complete"){let n=u(e.flags,"slot")??e.rest[1];if(!n)throw new Error("heartbeat complete requires --slot <id>");let a=u(e.flags,"project")??L(process.cwd(),t),s=u(e.flags,"host")??"codex",i=await Jo({home:t,slot:n,host:s,project:a,result:u(e.flags,"result")??"HEARTBEAT_OK",evidence:u(e.flags,"evidence")?{note:u(e.flags,"evidence")??""}:{},workItemId:u(e.flags,"work-item")});m(i,r,`Heartbeat completed: ${i.lease.id}`);return}if(o==="status"){let n=await ll({home:t,project:u(e.flags,"project"),limit:P(e.flags,"limit")});m(n,r,`${n.length} heartbeat lease(s)`);return}throw new Error("heartbeat requires claim, complete, or status")}async function Ul(e,t,r){let o=e.rest[0];if(o==="reconcile"){let n=Qo(e.flags),a=u(e.flags,"target-root"),s=await yt({home:t,host:n,surface:Ie(e.flags),mode:pa(e.flags),apply:b(e.flags,"apply"),hostConfigRoot:a?Ye(n,a):void 0,targetRoot:a});m(s,r,s.applied?`Schedule reconciled: ${s.schedule.id}`:`Schedule reconcile planned: ${s.schedule.id}`);return}if(o==="list"){let n=await Po({home:t,host:Zo(e.flags),limit:P(e.flags,"limit")});m(n,r,`${n.length} schedule record(s)`);return}if(o==="disable"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error("schedule disable requires <id> or --id <id>");let a=await yi({home:t,id:n,apply:b(e.flags,"apply")});m(a,r,a.applied?`Schedule disabled: ${n}`:`Schedule disable planned: ${n}`);return}throw new Error("schedule requires reconcile, list, or disable")}async function Bl(e,t,r){if(e.rest[0]==="openclaw"){let a=u(e.flags,"source")??e.rest[1];if(!a)throw new Error("import openclaw requires --source <path>");let s=await Si({home:t,sourcePath:a,cwd:u(e.flags,"cwd")??process.cwd(),project:u(e.flags,"project"),apply:b(e.flags,"apply"),limit:P(e.flags,"limit")});m(s,r,s.applied?`OpenClaw import applied: ${s.persisted_memories.length} candidate(s), ${s.warnings.length} warning(s)`:`OpenClaw import dry-run: ${s.mapped_records.length} mapped, ${s.skipped_records.length} skipped, ${s.warnings.length} warning(s)`);return}let n=PA(e);if(n){let a=u(e.flags,"source")??e.rest[1];if(!a)throw new Error("import native requires --source <path>");let s=await xi({home:t,host:n,sourcePath:a,cwd:u(e.flags,"cwd")??process.cwd(),project:u(e.flags,"project"),apply:b(e.flags,"apply"),limit:P(e.flags,"limit")});m(s,r,s.applied?`${n} import applied: ${s.persisted_memories.length} candidate(s), ${s.warnings.length} warning(s), ${s.conflicts.length} conflict(s)`:`${n} import dry-run: ${s.mapped_records.length} mapped, ${s.skipped_records.length} skipped, ${s.conflicts.length} conflict(s), ${s.warnings.length} warning(s)`);return}throw new Error("import requires openclaw, native --host <host>, or a supported host alias")}function PA(e){let t=e.rest[0],r=t==="native"?u(e.flags,"host"):t;return r==="nativesoul"||r==="codex"||r==="claude"||r==="gemini"||r==="grok"||r==="antigravity"?r:null}import{spawnSync as xA}from"node:child_process";async function Vl(e,t,r){let[o,n]=e.rest;if(o==="activate"){if(!n)throw new Error("license activate requires a license key");let a=await Ti({home:t,key:n}),s=a.ok?{ok:!0,action:"activate",license:en(a.license),message:"License activated via Dodo"}:{ok:!1,action:"activate",reason:a.reason,license:en(a.license),message:`License activation failed: ${a.reason}`};m(s,r,s.message??"License activated via Dodo"),s.ok||(process.exitCode=1);return}if(o==="status"){let a=await xe(t),s=a?jA(a):me,i=await TA(e),l=await Di({home:t,currentVersion:Yt,latestKnownVersion:i}),c={ok:!0,action:"status",license:en(s),update_entitlement:l,message:CA(s,l,b(e.flags,"check-updates"))};m(c,r,c.message??`License status: ${s.state}`);return}if(o==="deactivate"){let a=await Oi({home:t}),s=a.ok?{ok:!0,action:"deactivate",license:en(a.license),message:"License deactivated via Dodo; local NativeSoul data was not removed"}:{ok:!1,action:"deactivate",reason:a.reason,license:en(a.license),message:`License deactivation failed: ${a.reason}`};m(s,r,s.message??"License deactivated via Dodo; local NativeSoul data was not removed"),s.ok||(process.exitCode=1);return}throw new Error("license requires activate, status, or deactivate")}function jA(e){return{state:e.state,license_key:e.license_key,instance_id:e.instance_id,purchased_at:e.purchased_at??null,version_at_activation:e.version_at_activation??null,updates_until:e.updates_until,last_checked_at:e.last_checked_at,source:e.source}}function en(e){return{...e,license_key:e.license_key?IA(e.license_key):null}}function IA(e){return e.length<=8?"[REDACTED_LICENSE_KEY]":`${e.slice(0,4)}\u2026${e.slice(-4)}`}async function TA(e){let t=u(e.flags,"latest-known-version");if(t)return t;if(!b(e.flags,"check-updates"))return;let r=process.platform==="win32"?"npm.cmd":"npm",o=xA(r,["view","nativesoul","version","--registry=https://registry.npmjs.org/"],{encoding:"utf8",timeout:15e3,shell:process.platform==="win32"});if(o.status===0)return o.stdout.trim()||void 0}function CA(e,t,r){let o=t.updates_status==="unknown"?"unknown":t.updates_until??"unknown",n=t.newer_major_available==="unknown"?r?"unknown":"unknown \u2014 run with `--check-updates`":t.newer_major_available?"available":"not detected",a=[`License status: ${e.state}`,e.state==="licensed"?"Perpetual build: active \u2014 your licence keeps working.":"Perpetual build: unavailable until activated.",`Updates window: ${o}`,`Newer major: ${n}`];return t.soft_nudge.visible&&t.soft_nudge.message&&a.push(t.soft_nudge.message),a.join(`
|
|
1110
|
+
`)}async function Wl(e,t,r){let o=await Li({page:u(e.flags,"page")});m(o,r,o.ok?`Marketing audit PASS: ${o.summary.claims_checked} claim(s), ${o.summary.pages_scanned} page(s)`:`Marketing audit FAIL: ${o.issues.length} issue(s)`),o.ok||(process.exitCode=1)}var pg={life_activation_status:async(e,t)=>await Or({home:t,host:Jl(e.host),targetRoot:Rt(e.target_root)??Rt(e.targetRoot)}),life_activation_plan:async(e,t)=>await Go({home:t,host:Jl(e.host),targetRoot:Rt(e.target_root)??Rt(e.targetRoot),profile:OA(e.profile)}),life_activation_verify:async(e,t)=>await Ko({home:t,host:Jl(e.host),surface:NA(e.surface),targetRoot:Rt(e.target_root)??Rt(e.targetRoot),projectCwd:Rt(e.project_cwd)??Rt(e.projectCwd),apply:ql(e.apply),userConfirmed:ql(e["user-confirmed"]),retainTestData:ql(e["retain-test-data"])})},mg=[{name:"life_activation_status",description:"Return activation status by component, including bootstrap, MCP, plugins/hooks, heartbeat, recall, memory, and cross-host verification.",inputSchema:{type:"object",properties:{host:{type:"string"},target_root:{type:"string"},targetRoot:{type:"string"}}}},{name:"life_activation_plan",description:"Return a read-only dry-run activation plan with exact files, settings, scheduler actions, and approvals.",inputSchema:{type:"object",properties:{host:{type:"string"},profile:{type:"string"},target_root:{type:"string"},targetRoot:{type:"string"}}}},{name:"life_activation_verify",description:"Run cross-host activation verification for bootstrap cache, MCP, scheduler evidence, and memory recall.",inputSchema:{type:"object",properties:{host:{type:"string"},surface:{type:"string"},project_cwd:{type:"string"},projectCwd:{type:"string"},target_root:{type:"string"},targetRoot:{type:"string"},apply:{type:"boolean"},"user-confirmed":{type:"boolean"},"retain-test-data":{type:"boolean"}}}}];function Jl(e){if(e===void 0)return"all";if(e==="all"||e==="codex"||e==="claude"||e==="grok"||e==="antigravity"||e==="gemini")return e;throw new Error("Invalid activation host")}function OA(e){if(e!==void 0){if(e==="quickstart"||e==="advanced")return e;throw new Error("Invalid activation profile")}}function NA(e){if(e!==void 0){if(e==="desktop"||e==="claude-desktop")return"claude-desktop";if(e==="claude-code")return"claude-code";throw new Error("activation verify surface must be claude-code, desktop, or claude-desktop")}}function Rt(e){return typeof e=="string"?e:void 0}function ql(e){return e===!0}var MA=["2025-11-25","2024-11-05","2024-10-07"],_g={...pg,life_status:(e,t)=>ca(t),life_bootstrap:async(e,t)=>await UA({home:t,host:C(e.host,"codex"),cwd:C(e.cwd,process.cwd()),query:F(e.query)}),life_recall:async(e,t)=>await Ht(t,C(e.query,""),C(e.project,"default"),ga(e.limit,5)),life_remember_propose:async(e,t)=>await ee(t,{project:C(e.project,"default"),content:C(e.content,""),type:F(e.type),confidence:gg(e.confidence),source:{host:"mcp",session_id:"local"}}),life_memory_promote:async(e,t)=>await Nt(t,C(e.id,"")),life_memory_reject:async(e,t)=>await Mt(t,C(e.id,"")),life_memory_forget:async(e,t)=>await Lt(t,C(e.id,"")),life_memory_expire:async(e,t)=>await co(t,C(e.id,"")),life_capability_search:async(e,t)=>await Yr({home:t,query:C(e.query,""),host:WA(e)?void 0:F(e.host)??"codex",readyOnly:Mr(e.readyOnly,!1),limit:ga(e.limit,8)}),life_capability_status:async(e,t)=>{let r=C(e.uid,""),o=r?await Ct({home:t,uid:r}):null;if(!o)throw new Error(`Capability not found: ${r}`);return o},life_policy_evaluate:async(e,t)=>await kt({home:t,action:C(e.action,""),className:yg(e.class),target:F(e.target)}),life_approval_request:async(e,t)=>await KA({home:t,action:C(e.action,""),className:yg(e.class),target:F(e.target),project:F(e.project),host:F(e.host)}),life_approval_decide:async(e,t)=>{let r=C(e.id,""),o=await xr({home:t,id:r,status:GA(e.status),reviewer:C(e.host,"mcp"),reason:F(e.reason)??null});if(!o.approval)throw new Error(`Approval not found: ${r}`);return o},life_commitment_create:async(e,t)=>await Qr({home:t,project:C(e.project,"default"),summary:C(e.summary,""),dueAt:F(e.due_at),ttlSeconds:gg(e.ttl_seconds),source:{host:"mcp",session_id:"local"}}),life_commitment_complete:async(e,t)=>await eo(t,C(e.id,"")),life_work_item_create:async(e,t)=>await Lo({home:t,project:C(e.project,"default"),title:C(e.title,""),description:F(e.description),priority:Gl(e.priority),source:"mcp",tags:fg(e.tags),host:F(e.host)}),life_work_item_list:async(e,t)=>await Do({home:t,project:F(e.project),status:hg(e.status),priority:Gl(e.priority),assignedHost:F(e.host),limit:ga(e.limit,50)}),life_work_item_claim:async(e,t)=>await Ho({home:t,id:C(e.id,""),host:C(e.host,"mcp")}),life_work_item_update:async(e,t)=>await $o({home:t,id:C(e.id,""),status:hg(e.status),priority:Gl(e.priority),assignedHost:F(e.host),description:F(e.description),tags:e.tags===void 0?void 0:fg(e.tags)}),life_work_item_complete:async(e,t)=>await Fo({home:t,id:C(e.id,""),status:VA(e.status)}),life_heartbeat_claim:async(e,t)=>await Wo({home:t,slot:C(e.slot,""),host:C(e.host,"codex"),project:C(e.project,"default"),ttlSeconds:ga(e.ttl_seconds,1500)}),life_heartbeat_complete:async(e,t)=>await Jo({home:t,slot:C(e.slot,""),host:C(e.host,"codex"),project:C(e.project,"default"),result:e.result??"HEARTBEAT_OK",evidence:e.evidence??{},workItemId:F(e.work_item_id)}),life_onboarding_status:async(e,t)=>await oo(t),life_onboard_apply:async(e,t)=>await no({home:t,dry_run:Mr(e.dry_run,!0),user_confirmed:Mr(e.user_confirmed,!1),files:JA(e.files),config_patch:qA(e.config_patch)}),life_onboard_complete:async(e,t)=>await ao({home:t,archive:e.archive===void 0?!0:Mr(e.archive,!0)})},LA=new Set(Object.keys(_g));function DA(e){return e.method?.startsWith("notifications/")?!0:!Object.prototype.hasOwnProperty.call(e,"id")}async function fa(e,t){if(DA(e))return null;let r=e.id??null;try{if(e.method==="initialize"){let o=tn(e.params),n=F(o.protocolVersion),a=n&&MA.includes(n)?n:"2024-11-05";return ot(r,{protocolVersion:a,serverInfo:{name:"nativesoul",version:"0.1.0"},capabilities:{tools:{}}})}if(e.method==="ping")return ot(r,{});if(e.method==="resources/list")return ot(r,{resources:[]});if(e.method==="prompts/list")return ot(r,{prompts:[]});if(e.method==="tools/list")return ot(r,{tools:[{name:"life_status",description:"Return local NativeSoul health and counts.",inputSchema:{type:"object"}},{name:"life_bootstrap",description:"Return compact bootstrap context for a host and cwd.",inputSchema:{type:"object",required:["host","cwd"],properties:{host:{type:"string"},cwd:{type:"string"},query:{type:"string"}}}},{name:"life_recall",description:"Search project-scoped memory.",inputSchema:{type:"object",required:["query","project"],properties:{query:{type:"string"},project:{type:"string"},limit:{type:"number"}}}},{name:"life_remember_propose",description:"Create a redacted local candidate memory for a project.",inputSchema:{type:"object",required:["project","content"],properties:{project:{type:"string"},content:{type:"string"},type:{type:"string"},confidence:{type:"number"}}}},{name:"life_memory_promote",description:"Promote a candidate memory to active status.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_memory_reject",description:"Reject a candidate memory.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_memory_forget",description:"Forget an active memory.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_memory_expire",description:"Expire an active memory.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_capability_search",description:"Search persisted local capability records.",inputSchema:{type:"object",required:["query"],properties:{query:{type:"string"},host:{type:"string"},allHosts:{type:"boolean"},all_hosts:{type:"boolean"},readyOnly:{type:"boolean"},limit:{type:"number"}}}},{name:"life_capability_status",description:"Return one persisted capability record by uid.",inputSchema:{type:"object",required:["uid"],properties:{uid:{type:"string"}}}},{name:"life_policy_evaluate",description:"Evaluate a proposed action against local policy and standing orders.",inputSchema:{type:"object",required:["action","class"],properties:{action:{type:"string"},class:{type:"string"},target:{type:"string"}}}},{name:"life_approval_request",description:"Request approval for a sensitive action. If blocked, stop and return control to the human; there is no server or polling in this turn-based protocol.",inputSchema:{type:"object",required:["action","class"],properties:{action:{type:"string"},class:{type:"string"},target:{type:"string"},project:{type:"string"},host:{type:"string"}}}},{name:"life_approval_decide",description:"Record a human-driven approval decision. Acting agents must not self-approve; use this only from a human-operated host turn.",inputSchema:{type:"object",required:["id","status"],properties:{id:{type:"string"},status:{type:"string",enum:["approved","rejected"]},reason:{type:"string"},host:{type:"string"}}}},{name:"life_commitment_create",description:"Create a local project-scoped commitment with optional TTL.",inputSchema:{type:"object",required:["project","summary"],properties:{project:{type:"string"},summary:{type:"string"},due_at:{type:"string"},ttl_seconds:{type:"number"}}}},{name:"life_commitment_complete",description:"Complete a local commitment by id.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"}}}},{name:"life_work_item_create",description:"Create a local project-scoped work item.",inputSchema:{type:"object",required:["project","title"],properties:{project:{type:"string"},title:{type:"string"},description:{type:"string"},priority:{type:"string",enum:["low","normal","high","urgent"]},tags:{type:"array",items:{type:"string"}},host:{type:"string"}}}},{name:"life_work_item_list",description:"List local work items with optional filters.",inputSchema:{type:"object",properties:{project:{type:"string"},status:{type:"string",enum:["inbox","assigned","in_progress","review","blocked","done","failed"]},priority:{type:"string",enum:["low","normal","high","urgent"]},host:{type:"string"},limit:{type:"number"}}}},{name:"life_work_item_claim",description:"Claim one work item for a host.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},host:{type:"string"}}}},{name:"life_work_item_update",description:"Update one work item through the shared status machine.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},status:{type:"string",enum:["inbox","assigned","in_progress","review","blocked","done","failed"]},priority:{type:"string",enum:["low","normal","high","urgent"]},host:{type:"string"},description:{type:"string"},tags:{type:"array",items:{type:"string"}}}}},{name:"life_work_item_complete",description:"Complete one work item as done or failed.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"string"},status:{type:"string",enum:["done","failed"]}}}},{name:"life_heartbeat_claim",description:"Claim a local heartbeat lease for a project and slot.",inputSchema:{type:"object",required:["slot","host","project"],properties:{slot:{type:"string"},host:{type:"string"},project:{type:"string"},ttl_seconds:{type:"number"}}}},{name:"life_heartbeat_complete",description:"Complete a local heartbeat lease and record a run.",inputSchema:{type:"object",required:["slot","host","project"],properties:{slot:{type:"string"},host:{type:"string"},project:{type:"string"},result:{type:"string"},evidence:{type:"object"},work_item_id:{type:"string"}}}},{name:"life_onboarding_status",description:"Return onboarding ritual status, per-theme interview guidance, file_generation_rules, and optional heartbeat/scan offers. Call before drafting files.",inputSchema:{type:"object"}},...mg,{name:"life_onboard_apply",description:"Dry-run or apply AI-generated onboarding human files.",inputSchema:{type:"object",required:["files"],properties:{dry_run:{type:"boolean"},user_confirmed:{type:"boolean"},files:{type:"object"},config_patch:{type:"object"}}}},{name:"life_onboard_complete",description:"Archive BOOTSTRAP.md and mark onboarding ritual complete.",inputSchema:{type:"object",properties:{archive:{type:"boolean"}}}}]});if(e.method==="tools/call"){let o=await kr(t);if(!o.ok)return ot(r,o);let n=BA(e.params);return ot(r,await $A(n.name??"",n.arguments??{},t))}if(LA.has(e.method)){let o=await kr(t);return o.ok?ot(r,await vg(e.method,tn(e.params),t)):ot(r,o)}return ma(r,-32601,`Unknown method: ${e.method}`)}catch(o){return o instanceof Ot?ma(r,-32010,o.message,{code:o.code,id:o.id,from:o.from,to:o.to}):o instanceof Ce?ma(r,-32011,o.message,{code:o.code,id:o.id,status:o.status}):ma(r,-32603,o instanceof Error?o.message:"Unknown MCP error")}}async function bg(e){let t="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>{t+=r;let o=t.split(/\r?\n/u);t=o.pop()??"";for(let n of o){let a=n.trim();a&&HA(a,e).catch(s=>{process.stderr.write(`NativeSoul MCP response error: ${zA(s)}
|
|
1111
1111
|
`)})}})}async function HA(e,t){let r;try{r=JSON.parse(e)}catch{process.stdout.write(`${JSON.stringify({jsonrpc:"2.0",id:null,error:{code:-32700,message:"Parse error"}})}
|
|
1112
1112
|
`);return}let o=await fa(r,t);o&&process.stdout.write(`${JSON.stringify(o)}
|
|
1113
1113
|
`)}async function $A(e,t,r){let o=await vg(e,t,r);return{content:[{type:"text",text:JSON.stringify(o)}]}}var FA={life_memory_promote:"memory.promote",life_memory_reject:"memory.reject",life_memory_forget:"memory.forget",life_work_item_create:"work_item.create",life_work_item_claim:"work_item.claim",life_work_item_complete:"work_item.complete"};async function vg(e,t,r){let o=_g[e];if(!o)throw new Error(`Unknown tool: ${e}`);let n=FA[e];if(n){let a=await rr(n,{home:r,target:F(t.id)??F(t.title)??null,project:F(t.project),host:F(t.host)});if(a.status==="deny")throw new Error(`Blocked by policy gate: ${a.reason}`);if(a.status==="approval_required")return{blocked:!0,allowed:!1,decision:"approval_required",approval_id:a.approvalId,approval_created:a.approvalCreated,wait:"human",instruction:a.approvalId?`approval ${a.approvalId} pending - run: nativesoul approvals approve ${a.approvalId} --confirm`:"approval pending but unavailable - inspect NativeSoul approval storage",warning:a.warning}}return await o(t,r)}async function UA(e){try{let t=await pt({...e,readOnly:!0});try{await Me({home:e.home,host:e.host,outcome:"succeeded",tier:"B",cwd:t.project.cwd,project:t.project.id,tokensUsed:t.context_budget.tokens_used,tokensMax:t.context_budget.tokens_max,source:"mcp-life-bootstrap",warnings:t.warnings})}catch{}return t}catch(t){try{await Me({home:e.home,host:e.host,outcome:"failed",tier:"B",cwd:e.cwd,project:null,source:"mcp-life-bootstrap",error:t})}catch{}throw t}}function ot(e,t){return{jsonrpc:"2.0",id:e,result:t}}function ma(e,t,r,o){return{jsonrpc:"2.0",id:e,error:o===void 0?{code:t,message:r}:{code:t,message:r,data:o}}}function BA(e){return tn(e)}function tn(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function C(e,t){return typeof e=="string"?e:t}function F(e){return typeof e=="string"?e:void 0}function ga(e,t){return typeof e=="number"?e:t}function gg(e){return typeof e=="number"?e:void 0}function fg(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function hg(e){if(e!==void 0){if(e==="inbox"||e==="assigned"||e==="in_progress"||e==="review"||e==="blocked"||e==="done"||e==="failed")return e;throw new Error("Invalid work item status")}}function VA(e){if(e!==void 0){if(e==="done"||e==="failed")return e;throw new Error("Work item terminal status must be done or failed")}}function Gl(e){if(e!==void 0){if(e==="low"||e==="normal"||e==="high"||e==="urgent")return e;throw new Error("Invalid work item priority")}}function Mr(e,t){return typeof e=="boolean"?e:t}function WA(e){return Mr(e.allHosts,!1)||Mr(e.all_hosts,!1)}function JA(e){let t=tn(e),r={};for(let[o,n]of Object.entries(t))typeof n=="string"&&(r[o]=n);return r}function qA(e){let r=tn(e).hosts;if(!Array.isArray(r))return;let o=r.filter(n=>typeof n=="string");return o.length>0?{hosts:o}:void 0}function yg(e){if(e==="read_local"||e==="probe_external"||e==="write_local"||e==="write_project"||e==="external_write"||e==="destructive"||e==="identity_policy_change")return e;throw new Error("Invalid policy action class")}function GA(e){if(e==="approved"||e==="rejected")return e;throw new Error("life_approval_decide status must be approved or rejected")}async function KA(e){let t=await et(e),r=t.approval?.id??null;return t.evaluation.decision==="approval_required"?{blocked:!0,allowed:!1,decision:"approval_required",approval_id:r,approval_created:t.approval_created,wait:"human",instruction:r?`approval ${r} pending - run: nativesoul approvals approve ${r} --confirm`:"approval pending but unavailable - inspect NativeSoul approval storage",warning:t.warning}:t.evaluation.decision==="allowed"?{blocked:!1,allowed:!0,decision:"allowed",approval_id:t.approval?.id??null,approval_status:t.approval?.status??null,warning:t.warning}:t.evaluation.decision==="proposal_required"?{blocked:!1,allowed:!1,decision:"proposal_required",approval_id:null,instruction:"use the existing SOUL.md/POLICY.md proposal flow; approvals do not cover protected human files",warning:t.warning}:{blocked:!1,allowed:!1,decision:"denied",approval_id:null,instruction:"stop; denied actions are not approvable through Approval Gate",warning:t.warning}}function zA(e){return e instanceof Error?e.message:"Unknown MCP response error"}async function Kl(e,t,r){let o=e.rest[0];if(!o){await bg(t);return}if(o==="manifest"){let n=Gt({host:cg(e.flags),commandMode:xl(e.flags),home:t,projectRoot:u(e.flags,"project-root")});m(n,r,`MCP manifest generated for ${n.host}`);return}if(o==="smoke"){let n=await fa({jsonrpc:"2.0",id:1,method:"initialize"},t),a=await fa({jsonrpc:"2.0",id:2,method:"life_status"},t),s={ok:n!==null&&a!==null&&"result"in n&&"result"in a,initialize:n,status:a};m(s,r,s.ok?"MCP smoke passed":"MCP smoke failed");return}if(o==="install"){let n=await Ao({home:t,host:Pl(e.flags),targetPath:u(e.flags,"target"),apply:b(e.flags,"apply"),commandMode:xl(e.flags),projectRoot:u(e.flags,"project-root")});m(n,r,`${n.dryRun?"Planned":"Applied"} MCP registration for ${n.host}: ${n.action}`);return}if(o==="rollback"){let n=u(e.flags,"snapshot");if(!n)throw new Error("mcp rollback requires --snapshot <path>");let a=await hi({home:t,snapshotPath:n,apply:b(e.flags,"apply")});m(a,r,`${a.dryRun?"Planned rollback":"Rolled back"} MCP target ${a.targetPath}`);return}if(o==="doctor"){let n=await Eo({host:Pl(e.flags),targetPath:u(e.flags,"target")});m(n,r,n.configured?`MCP configured for ${n.host}`:`MCP not configured for ${n.host}`);return}throw new Error("mcp requires manifest, smoke, install, rollback, doctor, or stdio mode with no subcommand")}async function zl(e,t,r){let o=e.rest[0];if(o==="flush-hook"){let n=u(e.flags,"text")?"":await zo(),a=Xo(n),s=u(e.flags,"text")??(typeof a=="string"?a:void 0),i=await Cs({home:t,host:u(e.flags,"host")??"codex",cwd:u(e.flags,"cwd")??process.cwd(),event:u(e.flags,"event")??e.rest[1],text:s,payload:typeof a=="string"?void 0:a});m(i,r,`Memory candidate proposed from ${i.host} ${i.event}: ${i.memory.id}`);return}if(o==="recall-hook"){let n=u(e.flags,"prompt")?"":await zo(),a=Xo(n),s=u(e.flags,"prompt")??tg(a),i=await Os({home:t,host:u(e.flags,"host")??"codex",cwd:u(e.flags,"cwd")??process.cwd(),prompt:s,limit:P(e.flags,"limit")});m(i,r,i.context||`Memory recall skipped: ${i.decision.reason}`);return}if(o==="index"){let n=await js({home:t,limit:P(e.flags,"limit")});m(n,r,`Semantic index updated: ${n.indexed_count} indexed, ${n.skipped_unchanged} unchanged`);return}if(o==="reflect"){let n=await ki({home:t,cwd:u(e.flags,"cwd")??process.cwd(),project:u(e.flags,"project"),limit:P(e.flags,"limit"),apply:b(e.flags,"apply")});m(n,r,n.applied?`Reflection report applied: ${n.proposals.length} proposal(s), ${n.report_path}`:n.report);return}if(o==="add"){let n=u(e.flags,"text");if(!n)throw new Error("memory add requires --text");let a=u(e.flags,"project")??u(e.flags,"scope")??L(process.cwd(),t),s=await Ts(t,{content:n,project:a});m(s,r,`Memory added: ${s.id}`);return}if(o==="propose"){let n=u(e.flags,"text");if(!n)throw new Error("memory propose requires --text");let a=u(e.flags,"project")??u(e.flags,"scope")??L(process.cwd(),t),s=await ee(t,{content:n,project:a});m(s,r,`Memory proposed: ${s.id}`);return}if(o==="promote"||o==="reject"||o==="forget"||o==="expire"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error(`memory ${o} requires <id> or --id <id>`);let a=o==="promote"?await Nt(t,n):o==="reject"?await Mt(t,n):o==="forget"?await Lt(t,n):await co(t,n);m(a,r,`Memory ${o}d: ${a.id}`);return}if(o==="export"){let n=u(e.flags,"project")??u(e.flags,"scope"),a=await Dt({home:t,project:n,includeForgotten:b(e.flags,"include-forgotten"),limit:P(e.flags,"limit")});m(a,r,`${a.length} memor${a.length===1?"y":"ies"} exported`);return}if(o==="search"){let n=e.rest.slice(1).join(" ")||(u(e.flags,"query")??""),a=u(e.flags,"project")??L(process.cwd(),t),s=P(e.flags,"limit")??5,i=await Ht(t,n,a,s);m(i,r,`${i.length} memor${i.length===1?"y":"ies"} found`);return}throw new Error("memory requires add, propose, flush-hook, recall-hook, index, reflect, promote, reject, forget, expire, export, or search")}async function Xl(e,t,r){let o=e.rest[0];if(o==="list"){let n=await Ms({home:t,status:ig(e.flags),limit:P(e.flags,"limit")});m(n,r,XA(n.projects,n.warning));return}if(o==="show"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error("project show requires <id|.>");let a=await Ls({home:t,id:n,cwd:u(e.flags,"cwd")??process.cwd()});m(a,r,YA(a)),a.registry_available&&!a.registry&&(process.exitCode=1);return}if(o==="rename"){let n=e.rest[1]??u(e.flags,"id"),a=u(e.flags,"name");if(!n||!a)throw new Error("project rename requires <id|.> --name <display>");let s=await Ds({home:t,id:n,name:a,cwd:u(e.flags,"cwd")??process.cwd()});m(s,r,s.found?`Project renamed: ${s.id} -> ${s.new_name}`:`Project not found: ${s.id}`),s.found||(process.exitCode=1);return}if(o==="alias"){let n=e.rest[1];if(n==="list"){let a=await Fs({home:t});m(a,r,Object.keys(a.aliases).length===0?"No project aliases":ZA(a.aliases));return}if(n==="add"){let a=e.rest[2],s=u(e.flags,"as");if(!a||!s)throw new Error("project alias add requires <id> --as <custom-id>");let i=await Us({home:t,id:a,alias:s,apply:b(e.flags,"apply")});m(i,r,kg(i));return}if(n==="remove"){let a=e.rest[2]??u(e.flags,"as");if(!a)throw new Error("project alias remove requires <custom-id>");let s=await Bs({home:t,alias:a,apply:b(e.flags,"apply")});m(s,r,kg(s));return}throw new Error("project alias requires add, remove, or list")}if(o==="forget"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error("project forget requires <id>");let a=await Hs({home:t,id:n,includeMemories:b(e.flags,"include-memories"),apply:b(e.flags,"apply"),confirm:u(e.flags,"confirm")});m(a,r,eE(a)),(!a.found||a.mode==="forget_memories"&&!a.guard_ok)&&(process.exitCode=1);return}if(o==="reactivate"){let n=e.rest[1]??u(e.flags,"id");if(!n)throw new Error("project reactivate requires <id>");let a=await $s({home:t,id:n});m(a,r,tE(a)),a.found||(process.exitCode=1);return}if(o==="pin"){let n=u(e.flags,"cwd")??process.cwd(),a=await vs({cwd:n,home:t,apply:b(e.flags,"apply")});m(a,r,a.applied?`Project marker pinned at ${a.marker_path} (${a.base_id})`:`Project pin dry-run: would write ${a.marker_path} (${a.base_id})`);return}throw new Error("project requires list, show, rename, alias, forget, reactivate, or pin")}function XA(e,t){if(t)return`Project registry unavailable: ${t}`;if(e.length===0)return"No projects found";let r=e.map(o=>{let n=o.counts;return`${o.id} ${o.display_name} ${o.status} memories:${n.memories.active}/${n.memories.total} commitments:${n.commitments.open}/${n.commitments.total} semantic:${n.semantic_memory_index.total} runs:${n.runs.total} sessions:${n.sessions.total}`});return[`${e.length} project(s)`,...r].join(`
|
|
@@ -1216,8 +1216,8 @@ Commands:
|
|
|
1216
1216
|
onboard apply --payload-file <path> [--apply] [--user-confirmed] [--home <path>] [--json]
|
|
1217
1217
|
onboard complete [--no-archive] [--home <path>] [--json]
|
|
1218
1218
|
mcp [--home <path>]
|
|
1219
|
-
`)}async function dE(e){let t=
|
|
1219
|
+
`)}async function dE(e){let t=Sl(e);if(gE(t)){process.stdout.write(`${Yt}
|
|
1220
1220
|
`);return}if(Al(t)){oc();return}let r=u(t.flags,"home"),o=b(t.flags,"json");if(!fE(t)){let n=await kr(r);if(!n.ok){m(n,o,No(n)),process.exitCode=1;return}}switch(t.command){case"init":{let n=await eg(r);m(n,o,`NativeSoul initialized at ${n.home}`);return}case"status":{let n=ca(r);m(n,o,`NativeSoul ${n.initialized?"initialized":"not initialized"} at ${n.home}`);return}case"doctor":{if(b(t.flags,"deep")){let a=b(t.flags,"require-full-native"),s=await Kt({home:r,host:rt(t.flags),surface:Ie(t.flags),targetRoot:u(t.flags,"target-root")}),i=`full-native ${s.full_native_matrix.full_native_count}/${s.full_native_matrix.host_count}`;m(s,o,s.healthy?`NativeSoul deep doctor healthy: ${s.status}; ${i}`:`NativeSoul deep doctor found ${s.issues.length} issue(s); ${i}`),a&&!s.full_native_matrix.require_full_native_ready&&(process.exitCode=1);return}let n=await ho(r);m(n,o,n.healthy?`NativeSoul healthy at ${n.home}`:`NativeSoul has ${n.issues.length} issue(s)`);return}case"install":{if(b(t.flags,"apply")){let a=await rr("install.apply",{home:r,target:u(t.flags,"target-root")??null});if(a.status==="deny")throw new Error(`Blocked by policy gate: ${a.reason}`);if(a.status==="approval_required"){m({blocked:!0,allowed:!1,decision:"approval_required",approval_id:a.approvalId,instruction:a.approvalId?`approval ${a.approvalId} pending - run: nativesoul approvals approve ${a.approvalId} --confirm`:"approval pending but unavailable"},o,`install apply blocked: approval required${a.approvalId?` (${a.approvalId})`:""}`);return}}let n=await dl({home:r,host:rt(t.flags),surface:Ie(t.flags),apply:b(t.flags,"apply"),targetRoot:u(t.flags,"target-root")});{let a=n.applied?`NativeSoul install ${n.status}`:`NativeSoul install planned: ${n.status}`,s=n.hosts.filter(l=>l.notices.includes("NATIVE_SCHEDULE_AVAILABLE_NOT_ENABLED")).map(l=>l.host),i=s.length>0?`
|
|
1221
1221
|
Native scheduling is available but not enabled on: ${[...new Set(s)].join(", ")}. Turn it on with \`nativesoul schedule reconcile --host <host> --mode leader --apply\`.`:"";m(n,o,`${a}${i}`)}return}case"uninstall":{let n=await pl({home:r,host:rt(t.flags),surface:Ie(t.flags),apply:b(t.flags,"apply"),targetRoot:u(t.flags,"target-root"),purgeData:b(t.flags,"purge-data"),confirmPurge:u(t.flags,"confirm-purge-nativesoul-data")});m(n,o,n.applied?`NativeSoul uninstall applied: ${n.status}`:`NativeSoul uninstall planned: ${n.status}`);return}case"memory":{await zl(t,r,o);return}case"project":{await Xl(t,r,o);return}case"import":{await Bl(t,r,o);return}case"license":{await Vl(t,r,o);return}case"marketing-audit":{await Wl(t,r,o);return}case"commitments":{await Nl(t,r,o);return}case"work":{await rc(t,r,o);return}case"dashboard":{await Hl(t,r,o);return}case"cost":{await Dl(t,r,o);return}case"feedback":{await $l(t,r,o);return}case"adapters":{await Il(t,o);return}case"activate":{await jl(t,r,o);return}case"capabilities":{await Ol(t,r,o);return}case"audit":{await Cl(t,r,o);return}case"approvals":{await Tl(t,r,o);return}case"policy":{await Zl(t,r,o);return}case"scan":{await ec(t,r,o);return}case"heartbeat":{await Fl(t,r,o);return}case"schedule":{await Ul(t,r,o);return}case"bootstrap":{let n=u(t.flags,"cwd")??process.cwd(),a=u(t.flags,"host")??"codex",s=dg(t.flags);if(b(t.flags,"plan")){let l=await Xs({home:r,host:a,cwd:n,query:u(t.flags,"query")});m(l,o,uE(l));return}if(s==="cache"){try{let l=await mr({home:r,host:a,recordTelemetry:!1});m(l,o,l.content)}catch(l){try{let c=await mr({home:mo(n),host:a,recordTelemetry:!1});m(c,o,c.content);return}catch{}throw await pE({home:r,host:a,cwd:n,source:"bootstrap-cache",error:l}),l}return}let i=await pt({home:r,host:a,cwd:n,query:u(t.flags,"query"),readOnly:s==="inject"});if(s==="inject"){try{let l=await Ln({home:r,host:a,payload:i});m(l,o,l.content)}catch(l){try{let d=await Ln({home:mo(n),host:a,payload:i,recordTelemetry:!1});m(d,o,d.content);return}catch{}let c=gr({host:a,payload:i,degraded:!0,warnings:[`BOOTSTRAP_CACHE_WRITE_SKIPPED:${mE(l)}`]});m(c,o,c.content)}return}m(i,o,`Bootstrap ready for ${a} in project ${i.project.id}`);return}case"onboard":{await Ql(t,r,o);return}case"mcp":{await Kl(t,r,o);return}case"help":case void 0:oc();return;default:throw new Error(`Unknown command: ${t.command}`)}}function uE(e){let t=e.budget.softMax>0?Math.round(e.budget.used/e.budget.softMax*100):0,r=e.files.filter(a=>a.included).length,o=e.warnings.length,n=e.files.map(a=>{let s=a.included?"included":"omitted",i=a.truncated?" truncated":"";return`- ${a.role}: ${s}${i} - ${a.reason} (${a.injectedChars}/${a.rawChars} chars)`});return[`Context: ${e.budget.used}/${e.budget.softMax} ${e.budget.unit} (${t}%) \xB7 ${r} files \xB7 ${e.memoryRecall.returned} memories \xB7 ${o} warnings \xB7 policy: strict`,`Project: ${e.project.id}`,`Cache: ${e.cache.hit?"hit":"miss"}${e.cache.key?` (${e.cache.key})`:""}`,"Files:",...n,`Memory recall: ${e.memoryRecall.mode} \xB7 limit ${e.memoryRecall.limit} \xB7 returned ${e.memoryRecall.returned}${e.memoryRecall.query?` \xB7 query "${e.memoryRecall.query}"`:""}`,"Warnings:",...e.warnings.length>0?e.warnings.map(a=>`- ${a}`):["- none"]].join(`
|
|
1222
|
-
`)}async function pE(e){try{await Me({home:e.home,host:e.host,outcome:"failed",tier:"D",cwd:e.cwd,project:L(e.cwd,e.home),source:e.source,error:e.error})}catch{}}function mE(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"?e.code:"unavailable"}function gE(e){return e.command==="--version"||e.command==="-v"||e.command==="version"}function fE(e){if(e.command==="license"){let t=e.rest[0];return t==="activate"||t==="status"}return!1}function hE(){if(process.argv[1]===void 0)return!1;let e=cE(import.meta.url);try{return
|
|
1223
|
-
`),process.exitCode=1});export{dE as main,
|
|
1222
|
+
`)}async function pE(e){try{await Me({home:e.home,host:e.host,outcome:"failed",tier:"D",cwd:e.cwd,project:L(e.cwd,e.home),source:e.source,error:e.error})}catch{}}function mE(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"?e.code:"unavailable"}function gE(e){return e.command==="--version"||e.command==="-v"||e.command==="version"}function fE(e){if(e.command==="license"){let t=e.rest[0];return t==="activate"||t==="status"}return!1}function hE(){if(process.argv[1]===void 0)return!1;let e=cE(import.meta.url);try{return Rg(process.argv[1])===Rg(e)}catch{return lE.resolve(process.argv[1])===e}}hE()&&dE(process.argv.slice(2)).catch(e=>{let t=e instanceof Error?e.message:"Unknown error";process.stderr.write(`nativesoul error: ${t}
|
|
1223
|
+
`),process.exitCode=1});export{dE as main,Sl as parseArgs,Al as shouldPrintHelp};
|