@team-semicolon/semicolony-cli 4.18.108 → 4.18.109

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.
Files changed (2) hide show
  1. package/dist/bundle.js +1 -1
  2. package/package.json +1 -1
package/dist/bundle.js CHANGED
@@ -1129,7 +1129,7 @@ SEMO Ops worker files moved to ${Kc(t)} (hooks: ${Mg(t)}).
1129
1129
  Bot mirrors and identity files (SOUL.md/MEMORY.md/USER.md) archived at ${vT(t)}.
1130
1130
  Collisions with pre-existing canonical files/dirs are diverted (never overwritten) to ${Fo.join(vT(t),"worker-conflicts")}.
1131
1131
  Spec: semo-ops docs/superpowers/specs/2026-07-20-semo-semicolony-local-separation-design.md
1132
- `),r.settingsRewritten=aXr(t),r}var zi,wfe,Fo,jat,sXr,Hat=H(()=>{"use strict";zi=v(require("fs")),wfe=v(require("os")),Fo=v(require("path"));Zf();jat="README.md",sXr=new Set(["SOUL.md","MEMORY.md","USER.md"])});function Vat(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function lp(t={}){let e=t.env??process.env,r=t.surface??"semicolony",n=xb(e,r),i=Bb(e,{surface:r}),s=n.value?.replace(/\/+$/,""),o=i.value;if(!s)throw new Error(`worker release Gateway URL is missing (${n.candidates.join(" or ")})`);if(!o)throw new Error(`worker release token is missing (${i.candidates.join(" or ")})`);if(!o.startsWith("wck_"))throw new Error("worker release token must be worker-scoped");let a=t.fetchImpl??fetch,c=async(l,u)=>{let d=await a(`${s}${l}`,{method:"POST",headers:{authorization:`Bearer ${o}`,"content-type":"application/json"},body:JSON.stringify(u)});if(!d.ok)throw new Error(`worker release Gateway ${l} failed with HTTP ${d.status}`);try{return await d.json()}catch{throw new Error(`worker release Gateway ${l} returned invalid JSON`)}};return{async fetchActiveRelease(){let l=await c("/worker/release/get",{});if(!Vat(l))throw new Error("worker release Gateway get response is invalid");return YA(l.version),l},async reportUpdate(l){let u=await c("/worker/release/report",l);if(!Vat(u)||typeof u.reported!="boolean"||typeof u.applied!="boolean")throw new Error("worker release Gateway report response is invalid");return{reported:u.reported,applied:u.applied}}}}var bB=H(()=>{"use strict";us();sO()});function rf(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Th(t,e,r){for(let n of Object.keys(t))if(!e.includes(n))throw new Error(`${r} has unsupported field: ${n}`)}function pn(t,e){if(typeof t!="string"||t.length===0)throw new Error(`${e} must be a non-empty string`);return t}function Am(t,e){if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t}function Xb(t,e,r){if(!cXr.test(t)||t.toLowerCase()!==Uo(e))throw new Error(`${r} sha256 does not match its content`)}function Zb(t,e){if(new Set(t).size!==t.length)throw new Error(`${e} must not contain duplicates`)}function Yat(t){return[...t].sort((r,n)=>Buffer.from(r).compare(Buffer.from(n))).every((r,n)=>r===t[n])}function Jat(t,e){if(/DATABASE_URL|postgres:\/\/|SEMO_OPS_WORKER_KB_TOKEN|\bAuthorization\b/i.test(t))throw new Error(`${e} contains a forbidden credential marker`)}function dXr(t,e){let r=Zat[e];if(!r||!rf(t))throw new Error(`agent_profiles[${e}] must follow canonical actor order`);let n=`agent_profiles[${e}]`;if(Th(t,["actor_id","runtime_profile","context","skills","tools"],n),t.actor_id!==r.actor_id)throw new Error(`${n}.actor_id must follow canonical actor order`);if(t.runtime_profile!==r.runtime_profile)throw new Error(`${n}.runtime_profile must be ${r.runtime_profile}`);if(!rf(t.context))throw new Error(`${n}.context must be an object`);Th(t.context,["content","sha256"],`${n}.context`);let i={content:pn(t.context.content,`${n}.context.content`),sha256:pn(t.context.sha256,`${n}.context.sha256`)};Jat(i.content,`${n}.context`),Xb(i.sha256,i.content,`${n}.context`);let s=Am(t.skills,`${n}.skills`).map((a,c)=>{let l=`${n}.skills[${c}]`;if(!rf(a))throw new Error(`${l} must be an object`);Th(a,["name","content","sha256"],l);let u={name:pn(a.name,`${l}.name`),content:pn(a.content,`${l}.content`),sha256:pn(a.sha256,`${l}.sha256`)};if(!EB.test(u.name))throw new Error(`${l}.name must be a release-managed skill name`);return Jat(u.content,l),Xb(u.sha256,u.content,l),u});if(Zb(s.map(a=>a.name),`${n} skill names`),!Yat(s.map(a=>a.name)))throw new Error(`${n} skill names must use canonical byte order`);let o=Am(t.tools,`${n}.tools`).map((a,c)=>{let l=pn(a,`${n}.tools[${c}]`);if(!uXr.includes(l))throw new Error(`${n}.tools[${c}] is not an allowed Agent tool`);return l});if(Zb(o,`${n} tools`),!Yat(o))throw new Error(`${n} tools must use canonical byte order`);return{actor_id:r.actor_id,runtime_profile:r.runtime_profile,context:i,skills:s,tools:o}}function fXr(t,e){if(!rf(t))throw new Error(`contexts[${e}] must be an object`);Th(t,["id","parity_group","claude_content","codex_content","sha256"],`contexts[${e}]`);let r={id:pn(t.id,`contexts[${e}].id`),parity_group:pn(t.parity_group,`contexts[${e}].parity_group`),claude_content:pn(t.claude_content,`contexts[${e}].claude_content`),codex_content:pn(t.codex_content,`contexts[${e}].codex_content`),sha256:pn(t.sha256,`contexts[${e}].sha256`)};if(!EB.test(r.id)||!EB.test(r.parity_group))throw new Error(`contexts[${e}] id and parity_group must be release-managed identifiers`);return Xb(r.sha256,Gs({claude_content:r.claude_content,codex_content:r.codex_content}),`contexts[${e}]`),r}function hXr(t,e){if(!rf(t))throw new Error(`skills[${e}] must be an object`);if("files"in t||"release_id"in t||"tree_sha256"in t){Th(t,["name","release_id","tree_sha256","files"],`skills[${e}]`);let n=pn(t.name,`skills[${e}].name`);if(!EB.test(n))throw new Error(`skills[${e}].name must be a release-managed skill name`);let i=pn(t.release_id,`skills[${e}].release_id`);if(!/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/i.test(i))throw new Error(`skills[${e}].release_id must be a UUID`);let s=pn(t.tree_sha256,`skills[${e}].tree_sha256`),o=new Set,a=new Set,c=Am(t.files,`skills[${e}].files`).map((u,d)=>{let f=`skills[${e}].files[${d}]`;if(!rf(u))throw new Error(`${f} must be an object`);Th(u,["path","mode","size","sha256","content_base64"],f);let h=pn(u.path,`${f}.path`);if(h.startsWith("/")||h.includes("\\")||h.endsWith("/")||h.split("/").some(w=>w===""||w==="."||w===".."))throw new Error(`${f} has an unsafe skill path`);let A=h.normalize("NFC").toLocaleLowerCase("en-US");if(o.has(h)||a.has(A))throw new Error(`${f} duplicates a skill path`);o.add(h),a.add(A);let g=pn(u.mode,`${f}.mode`);if(g!=="0644"&&g!=="0755")throw new Error(`${f}.mode is invalid`);if(!Number.isSafeInteger(u.size)||u.size<0)throw new Error(`${f}.size is invalid`);let m=pn(u.sha256,`${f}.sha256`),y=typeof u.content_base64=="string"?u.content_base64:"";if(!zat.test(y))throw new Error(`${f}.content_base64 is invalid`);let b=Buffer.from(y,"base64");if(b.toString("base64")!==y||b.byteLength!==u.size)throw new Error(`${f}.content_base64 size does not match`);return Xb(m,b,f),{path:h,mode:g,size:u.size,sha256:m,content_base64:y}});if(!o.has("SKILL.md"))throw new Error(`skills[${e}] must contain SKILL.md`);if([...c].sort((u,d)=>Buffer.from(u.path).compare(Buffer.from(d.path))).some((u,d)=>u.path!==c[d]?.path))throw new Error(`skills[${e}].files must use canonical path order`);return Xb(s,JSON.stringify(c.map(u=>({path:u.path,mode:u.mode==="0644"?420:493,size:u.size,sha256:u.sha256}))),`skills[${e}] tree`),{name:n,release_id:i,tree_sha256:s,files:c}}Th(t,["name","content","sha256"],`skills[${e}]`);let r={name:pn(t.name,`skills[${e}].name`),content:pn(t.content,`skills[${e}].content`),sha256:pn(t.sha256,`skills[${e}].sha256`)};if(!EB.test(r.name))throw new Error(`skills[${e}].name must be a release-managed skill name`);return Xb(r.sha256,r.content,`skills[${e}]`),r}function AXr(t,e){if(!zat.test(t))throw new Error(`${e} must be valid padded base64`);let r=Buffer.from(t,"base64");if(r.length===0)throw new Error(`${e} must not be empty`);if(r.toString("base64")!==t)throw new Error(`${e} must use canonical base64 encoding`);return r}function pXr(t,e){if(!rf(t))throw new Error(`assets[${e}] must be an object`);Th(t,["id","target","content_base64","sha256","mode"],`assets[${e}]`);let r={id:pn(t.id,`assets[${e}].id`),target:pn(t.target,`assets[${e}].target`),content_base64:pn(t.content_base64,`assets[${e}].content_base64`),sha256:pn(t.sha256,`assets[${e}].sha256`),mode:pn(t.mode,`assets[${e}].mode`)};if(!EB.test(r.id))throw new Error(`assets[${e}].id must be a safe identifier`);if(!_fe.has(r.target))throw new Error(`assets[${e}].target is not an allowed release asset target`);if(r.mode!=="0755"&&r.mode!=="0644")throw new Error(`assets[${e}].mode must be 0755 or 0644`);return Xb(r.sha256,AXr(r.content_base64,`assets[${e}].content_base64`),`assets[${e}]`),r}function Cfe(t){if(!rf(t))throw new Error("workspace_root must be an object");if(Th(t,["id","files"],"workspace_root"),t.id!=="semicolon-workspace")throw new Error("workspace_root.id must be semicolon-workspace");let e=Am(t.files,"workspace_root.files");if(e.length!==zO.length)throw new Error("workspace_root.files must contain exactly the fixed workspace-root files");let r=new Map;for(let[s,o]of e.entries()){if(!rf(o))throw new Error(`workspace_root.files[${s}] must be an object`);Th(o,["path","content","sha256","mode"],`workspace_root.files[${s}]`);let a=pn(o.path,`workspace_root.files[${s}].path`);if(!zO.includes(a))throw new Error("workspace_root file path is not allowed");if(r.has(a))throw new Error("workspace_root file paths must not contain duplicates");let c=pn(o.content,`workspace_root.files[${s}].content`),l=pn(o.sha256,`workspace_root.files[${s}].sha256`);if(pn(o.mode,`workspace_root.files[${s}].mode`)!=="0644")throw new Error(`workspace_root.files[${s}].mode must be 0644`);Xb(l,c,`workspace_root.files[${s}]`),r.set(a,{path:a,content:c,sha256:l,mode:"0644"})}let n=zO.map(s=>{let o=r.get(s);if(!o)throw new Error("workspace_root file path is not allowed");return o});if(!r.get("CLAUDE.md").content.includes("@AGENTS.md"))throw new Error("workspace_root CLAUDE.md must contain an @AGENTS.md pointer");return{id:"semicolon-workspace",files:n}}function Xat(t,e={}){if(t.schema!=="semo-ops/worker-release/v1")throw new Error("worker release manifest schema must be semo-ops/worker-release/v1");let r=Am(t.contexts,"contexts").map(fXr),n=Am(t.skills,"skills").map(hXr),i=Am(t.assets,"assets").map(pXr),s=Am(t.required_doctor_checks,"required_doctor_checks").map((c,l)=>pn(c,`required_doctor_checks[${l}]`));Zb(r.map(c=>c.id),"context ids"),Zb(r.map(c=>c.parity_group),"context parity groups"),Zb(n.map(c=>c.name),"skill names"),Zb(i.map(c=>c.id),"asset ids"),Zb(i.map(c=>c.target),"asset targets"),Zb(s,"required_doctor_checks");let o=e.profileId===lXr;if(o){if(r.length>0||n.length>0||i.length>0||t.workspace_root!==void 0)throw new Error("Agent release must not contain Human projection payload");let c=s.find(l=>!O_.includes(l));if(c)throw new Error(`Agent release has unknown required doctor check: ${c}`)}else if(t.agent_profiles!==void 0)throw new Error("agent_profiles is only supported by semo-ops-worker-agent");let a=o?Am(t.agent_profiles,"agent_profiles").map(dXr):void 0;if(o&&a?.length!==Zat.length)throw new Error("agent_profiles must contain exactly the canonical actor order");return{schema:"semo-ops/worker-release/v1",contexts:r,skills:n,assets:i,required_doctor_checks:s,...t.workspace_root===void 0?{}:{workspace_root:Cfe(t.workspace_root)},...a===void 0?{}:{agent_profiles:a}}}function Gs(t){if(t===null)return"null";if(typeof t=="string"||typeof t=="boolean")return JSON.stringify(t);if(typeof t=="number"){if(!Number.isFinite(t))throw new Error("manifest JSON must not contain non-finite numbers");return JSON.stringify(t)}if(Array.isArray(t))return`[${t.map(Gs).join(",")}]`;if(rf(t))return`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${Gs(t[e])}`).join(",")}}`;throw new Error("manifest must contain JSON values only")}function Uo(t){return(0,Kat.createHash)("sha256").update(t).digest("hex")}function wB(t,e={}){if(!rf(t))throw new Error("worker release manifest must be a JSON object");Th(t,["schema","contexts","skills","assets","required_doctor_checks","workspace_root","agent_profiles"],"worker release manifest");let r=Xat(t,e),n=Gs(r);return{manifest:r,canonicalManifest:n,manifestSha256:Uo(n)}}function e0(t,e={}){if(!rf(t))throw new Error("worker release manifest must be a JSON object");let r=Xat(t,e),n=Object.keys(t).filter(s=>!["schema","contexts","skills","assets","required_doctor_checks","workspace_root","agent_profiles"].includes(s)).sort(),i=Gs(t);return{manifest:r,canonicalManifest:i,manifestSha256:Uo(i),ignoredTopLevelKeys:n}}var Kat,cXr,EB,zat,_fe,lXr,Zat,uXr,O_,zO,Mh=H(()=>{"use strict";Kat=require("node:crypto"),cXr=/^[A-Fa-f0-9]{64}$/,EB=/^[a-z0-9][a-z0-9-]*$/,zat=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,_fe=new Set(["shared-script:feedback-capture.py","shared-hook:honcho-utterance-capture.sh"]),lXr="semo-ops-worker-agent",Zat=[{actor_id:"semi",runtime_profile:"semo-semi"},{actor_id:"colony",runtime_profile:"semo-colony"}],uXr=["decision_record","feedback_capture","kb_get","kb_note","kb_search"],O_=["agent:installation-state","agent:release-state","agent:gateway-release-auth","agent:profile:semi","agent:profile:colony","agent:context-digest:semi","agent:context-digest:colony","agent:skill-digests:semi","agent:skill-digests:colony","agent:tools:semi","agent:tools:colony","agent:kb-read:semi","agent:kb-read:colony","agent:feedback-auth:semi","agent:feedback-auth:colony","agent:note-auth:semi","agent:note-auth:colony","agent:service:slack-router","agent:service:kb-gateway","agent:no-token-in-profile"],zO=["AGENTS.md","CLAUDE.md",".claude/rules/projects.md"]});function ect(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function ZO(t){if(!ect(t))throw new Error("active worker release response must be an object");let e=t.release_id,r=t.version,n=t.manifest_sha256;if(typeof e!="string"||!mXr.test(e))throw new Error("active worker release id is invalid");let i=YA(r,"active worker release version");if(typeof n!="string"||!gXr.test(n))throw new Error("active worker release manifest_sha256 is invalid");return{release_id:e,version:i,manifest_sha256:n.toLowerCase()}}function yXr(t){let e=ZO(t);if(!ect(t)||!("manifest"in t))throw new Error("active worker release manifest is missing");let r=e0(t.manifest);if(r.manifestSha256!==e.manifest_sha256)throw new Error("active worker release manifest_sha256 does not match the canonical manifest");return{activeRelease:e,warnings:r.ignoredTopLevelKeys.map(n=>`ignored worker-release extension: ${n}`)}}function tct(t){return t.reduce((e,r)=>(e[r.level]+=1,e),{ok:0,warn:0,fail:0})}function kfe(t){let e=OA(t),r=t0.existsSync(e)?t0.readdirSync(e).filter(o=>o!=="README.md"):[],n=["SOUL.md","MEMORY.md","USER.md","bots"].filter(o=>t0.existsSync(s8.join(cW(t),o))),i=s8.join(t,".semicolony"),s=bXr.filter(o=>t0.existsSync(s8.join(i,o)));return[{id:"legacy-layout",label:"legacy semicolony worker dir",level:r.length>0?"warn":"ok",detail:r.length>0?`${e}\uC5D0 ${r.length}\uAC1C \uD56D\uBAA9 \uC794\uC874 \u2014 worker sync\uAC00 \uC774\uC804\uD568`:"\uC794\uC874 \uC5C6\uC74C"},{id:"semo-root-bot-artifacts",label:"semo root bot artifacts",level:n.length>0?"warn":"ok",detail:n.length>0?`\uBD07 \uC2DC\uB300 \uC0B0\uCD9C\uBB3C \uBC1C\uACAC: ${n.join(", ")} \u2014 legacy-semo-archive\uB85C \uC774\uB3D9 \uD544\uC694`:"\uC5C6\uC74C"},{id:"canonical-layout",label:"canonical SEMO Ops layout",level:t0.existsSync(Kc(t))&&t0.existsSync(Mg(t))?"ok":"warn",detail:`${Kc(t)} \xB7 ${Mg(t)}`},{id:"semicolony-home-residue",label:"legacy ~/.semicolony bot residue",level:s.length>0?"warn":"ok",detail:s.length>0?`${i}\uC5D0 \uBD07 \uC2DC\uB300 \uC794\uC874: ${s.join(", ")}`:"\uC5C6\uC74C"}]}function Ife(t){let e=Qa(t.homeDir,t.canonicalPath,Au(t.homeDir,t.legacyRelativePath));return e.status==="rejected"?{id:t.id,label:t.label,level:"fail",detail:`${e.source} worker file rejected: ${e.reason} (${e.filePath})`}:e.status==="absent"?{id:t.id,label:t.label,level:t.missingLevel??"warn",detail:t.missingDetail}:{id:t.id,label:t.label,level:e.source==="canonical"?"ok":"warn",detail:e.source==="canonical"?e.filePath:`${e.filePath} (read-only legacy fallback; run semo worker sync)`}}async function XO(t={}){let e=t.homeDir??vfe.homedir(),r=t.surface??"semicolony",n=Mi(e),i=t.releaseClient??lp({surface:r,env:t.env,fetchImpl:t.fetchImpl}),{activeRelease:s,warnings:o}=yXr(await i.fetchActiveRelease()),a=[],c=null,l=Qa(e,n.workerState,Au(e,"worker-state.json"));if(l.status==="rejected")a.push({id:"worker-state",label:"worker local state",level:"fail",detail:`${l.source} worker state rejected: ${l.reason} (${l.filePath})`});else if(l.status==="absent")a.push({id:"worker-state",label:"worker local state",level:"warn",detail:`${n.workerState} \uC5C6\uC74C \u2014 semo worker setup --force`});else try{c=Us(l.filePath),a.push({id:"worker-state",label:"worker local state",level:c&&l.source==="canonical"?"ok":"warn",detail:c?`${c.worker_id}/${c.device_id}${l.source==="legacy"?" (read-only legacy fallback)":""}`:"worker state is empty"})}catch(A){a.push({id:"worker-state",label:"worker local state",level:"fail",detail:`invalid local state: ${A.message}`})}let u=$6(c,t.now??new Date);a.push({id:"capability-snapshot",label:"Knowledge Fabric capability snapshot",level:u==="current"?"ok":"warn",detail:u==="current"?`server snapshot current until ${c?.schema_version===2?c.capability_snapshot?.expires_at:"unknown"}; protected requests still reload the DB lease`:`${u}; \uB85C\uCEEC \uC0C1\uD0DC\uC5D0\uC11C \uAD8C\uD55C\uC744 \uCD94\uB860\uD558\uC9C0 \uC54A\uC74C`});let d=null,f=Qa(e,n.releaseState,Au(e,"release-state.json"));if(f.status==="rejected")a.push({id:"release-state",label:"local worker release state",level:"fail",detail:`${f.source} worker release state rejected: ${f.reason} (${f.filePath})`});else if(f.status==="absent")a.push({id:"release-state",label:"local worker release state",level:"warn",detail:`${n.releaseState} \uC5C6\uC74C`});else try{d=Wd(f.filePath),a.push({id:"release-state",label:"local worker release state",level:d?"ok":"warn",detail:d?`${d.applied_release_id}@${d.applied_release_version}${f.source==="legacy"?" (read-only legacy fallback)":""}`:"release state is empty"})}catch(A){a.push({id:"release-state",label:"local worker release state",level:"fail",detail:`invalid local release state: ${A.message}`})}let h=!d||d.applied_release_id!==s.release_id||d.applied_release_version!==s.version||d.manifest_sha256!==s.manifest_sha256;return a.push({id:"release-target",label:"active worker release",level:h?"warn":"ok",detail:h?`update available: installed=${d?.applied_release_version??"none"}, target=${s.version}; run semo worker update`:`installed=${d?.applied_release_version??"none"}, target=${s.version}`}),a.push(Ife({homeDir:e,canonicalPath:n.env,legacyRelativePath:".env",id:"env-file",label:"worker env file",missingDetail:`${n.env} \uC5C6\uC74C \u2014 semo worker setup --force`}),Ife({homeDir:e,canonicalPath:n.kbMcp,legacyRelativePath:"kb-mcp.json",id:"mcp-config",label:"KB MCP config",missingDetail:c?.tool_adapters_enabled.includes("kb-mcp")?`${n.kbMcp} \uC5C6\uC74C \u2014 semo worker setup --with-kb-mcp --force`:"kb-mcp adapter is not enabled; config is optional",missingLevel:c?.tool_adapters_enabled.includes("kb-mcp")?"warn":"ok"}),Ife({homeDir:e,canonicalPath:n.dailyCheckHook,legacyRelativePath:"hooks/semo-ops-daily-check.sh",id:"daily-check-hook",label:"SessionStart daily check hook",missingDetail:`${n.dailyCheckHook} \uC5C6\uC74C \u2014 semo worker setup --force`})),Wat(e)&&a.push({id:"layout-migration",label:"SEMO Ops layout migration",level:"warn",detail:`${OA(e)} legacy \uB808\uC774\uC544\uC6C3 \uBC1C\uACAC \u2014 dry-run\uC5D0\uC11C\uB294 \uC774\uC804\uD558\uC9C0 \uC54A\uC74C`}),a.push(...kfe(e)),{dryRun:!0,state:c,releaseState:d,activeRelease:s,updateAvailable:h,warnings:o,checks:a,summary:tct(a)}}function EXr(t,e){return e.skipped?{id:"layout-migration",label:"SEMO Ops layout migration",level:"ok",detail:`${OA(t)} legacy \uB808\uC774\uC544\uC6C3 \uC5C6\uC74C \u2014 \uC774\uBBF8 \uC774\uC804 \uC644\uB8CC`}:{id:"layout-migration",label:"SEMO Ops layout migration",level:"ok",detail:`${e.migrated.length} files \u2192 semo/worker\xB7hooks, bots archived: ${e.archived.length>0}, settings rewritten: ${e.settingsRewritten}`}}async function rct(t={}){let e=t.homeDir??vfe.homedir(),r=Gat(e),n=await XO({...t,homeDir:e}),i=n.checks.filter(s=>s.id!=="layout-migration");return i.unshift(EXr(e,r)),{...n,dryRun:!1,checks:i,summary:tct(i)}}function wXr(t){return t==="ok"?yc.default.green("\u2713"):t==="warn"?yc.default.yellow("\u26A0"):yc.default.red("\u2717")}function o8(t){let e=ZO(t.activeRelease),r=["",yc.default.cyan.bold(t.dryRun?"SEMO Ops worker sync --dry-run":"SEMO Ops worker sync"),yc.default.gray(` active=${e.release_id}@${e.version} manifest=${e.manifest_sha256}`),""];for(let n of t.checks)r.push(` ${wXr(n.level)} ${n.label}${n.detail?yc.default.gray(` \u2014 ${n.detail}`):""}`);for(let n of t.warnings)r.push(yc.default.yellow(` \u26A0 ${n}`));return r.push(""),t.updateAvailable&&(r.push(yc.default.yellow(" update available \u2014 inspect with semo worker update --check")),r.push(yc.default.yellow(" apply explicitly with semo worker update, then semo worker doctor"))),r.push(` ${yc.default.bold("\uC694\uC57D")}: ${yc.default.green(`${t.summary.ok} ok`)} \xB7 ${yc.default.yellow(`${t.summary.warn} warn`)} \xB7 ${yc.default.red(`${t.summary.fail} fail`)}`),r.push(yc.default.gray(t.dryRun?" dry-run only: no local files were changed.":" legacy layout migration completed; release application remains explicit.")),r.push(""),r.join(`
1132
+ `),r.settingsRewritten=aXr(t),r}var zi,wfe,Fo,jat,sXr,Hat=H(()=>{"use strict";zi=v(require("fs")),wfe=v(require("os")),Fo=v(require("path"));Zf();jat="README.md",sXr=new Set(["SOUL.md","MEMORY.md","USER.md"])});function Vat(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function lp(t={}){let e=t.env??process.env,r=t.surface??"semicolony",n=xb(e,r),i=Bb(e,{surface:r}),s=n.value?.replace(/\/+$/,""),o=i.value;if(!s)throw new Error(`worker release Gateway URL is missing (${n.candidates.join(" or ")})`);if(!o)throw new Error(`worker release token is missing (${i.candidates.join(" or ")})`);if(!o.startsWith("wck_"))throw new Error("worker release token must be worker-scoped");let a=t.fetchImpl??fetch,c=async(l,u)=>{let d=await a(`${s}${l}`,{method:"POST",headers:{authorization:`Bearer ${o}`,"content-type":"application/json"},body:JSON.stringify(u)});if(!d.ok)throw new Error(`worker release Gateway ${l} failed with HTTP ${d.status}`);try{return await d.json()}catch{throw new Error(`worker release Gateway ${l} returned invalid JSON`)}};return{async fetchActiveRelease(){let l=await c("/worker/release/get",{});if(!Vat(l))throw new Error("worker release Gateway get response is invalid");return YA(l.version),l},async reportUpdate(l){let u=await c("/worker/release/report",l);if(!Vat(u)||typeof u.reported!="boolean"||typeof u.applied!="boolean")throw new Error("worker release Gateway report response is invalid");return{reported:u.reported,applied:u.applied}}}}var bB=H(()=>{"use strict";us();sO()});function rf(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Th(t,e,r){for(let n of Object.keys(t))if(!e.includes(n))throw new Error(`${r} has unsupported field: ${n}`)}function pn(t,e){if(typeof t!="string"||t.length===0)throw new Error(`${e} must be a non-empty string`);return t}function Am(t,e){if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t}function Xb(t,e,r){if(!cXr.test(t)||t.toLowerCase()!==Uo(e))throw new Error(`${r} sha256 does not match its content`)}function Zb(t,e){if(new Set(t).size!==t.length)throw new Error(`${e} must not contain duplicates`)}function Yat(t){return[...t].sort((r,n)=>Buffer.from(r).compare(Buffer.from(n))).every((r,n)=>r===t[n])}function Jat(t,e){if(/DATABASE_URL|postgres:\/\/|SEMO_OPS_WORKER_KB_TOKEN|\bAuthorization\b/i.test(t))throw new Error(`${e} contains a forbidden credential marker`)}function dXr(t,e){let r=Zat[e];if(!r||!rf(t))throw new Error(`agent_profiles[${e}] must follow canonical actor order`);let n=`agent_profiles[${e}]`;if(Th(t,["actor_id","runtime_profile","context","skills","tools"],n),t.actor_id!==r.actor_id)throw new Error(`${n}.actor_id must follow canonical actor order`);if(t.runtime_profile!==r.runtime_profile)throw new Error(`${n}.runtime_profile must be ${r.runtime_profile}`);if(!rf(t.context))throw new Error(`${n}.context must be an object`);Th(t.context,["content","sha256"],`${n}.context`);let i={content:pn(t.context.content,`${n}.context.content`),sha256:pn(t.context.sha256,`${n}.context.sha256`)};Jat(i.content,`${n}.context`),Xb(i.sha256,i.content,`${n}.context`);let s=Am(t.skills,`${n}.skills`).map((a,c)=>{let l=`${n}.skills[${c}]`;if(!rf(a))throw new Error(`${l} must be an object`);Th(a,["name","content","sha256"],l);let u={name:pn(a.name,`${l}.name`),content:pn(a.content,`${l}.content`),sha256:pn(a.sha256,`${l}.sha256`)};if(!EB.test(u.name))throw new Error(`${l}.name must be a release-managed skill name`);return Jat(u.content,l),Xb(u.sha256,u.content,l),u});if(Zb(s.map(a=>a.name),`${n} skill names`),!Yat(s.map(a=>a.name)))throw new Error(`${n} skill names must use canonical byte order`);let o=Am(t.tools,`${n}.tools`).map((a,c)=>{let l=pn(a,`${n}.tools[${c}]`);if(!uXr.includes(l))throw new Error(`${n}.tools[${c}] is not an allowed Agent tool`);return l});if(Zb(o,`${n} tools`),!Yat(o))throw new Error(`${n} tools must use canonical byte order`);return{actor_id:r.actor_id,runtime_profile:r.runtime_profile,context:i,skills:s,tools:o}}function fXr(t,e){if(!rf(t))throw new Error(`contexts[${e}] must be an object`);Th(t,["id","parity_group","claude_content","codex_content","sha256"],`contexts[${e}]`);let r={id:pn(t.id,`contexts[${e}].id`),parity_group:pn(t.parity_group,`contexts[${e}].parity_group`),claude_content:pn(t.claude_content,`contexts[${e}].claude_content`),codex_content:pn(t.codex_content,`contexts[${e}].codex_content`),sha256:pn(t.sha256,`contexts[${e}].sha256`)};if(!EB.test(r.id)||!EB.test(r.parity_group))throw new Error(`contexts[${e}] id and parity_group must be release-managed identifiers`);return Xb(r.sha256,Gs({claude_content:r.claude_content,codex_content:r.codex_content}),`contexts[${e}]`),r}function hXr(t,e){if(!rf(t))throw new Error(`skills[${e}] must be an object`);if("files"in t||"release_id"in t||"tree_sha256"in t){Th(t,["name","release_id","tree_sha256","files"],`skills[${e}]`);let n=pn(t.name,`skills[${e}].name`);if(!EB.test(n))throw new Error(`skills[${e}].name must be a release-managed skill name`);let i=pn(t.release_id,`skills[${e}].release_id`);if(!/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/i.test(i))throw new Error(`skills[${e}].release_id must be a UUID`);let s=pn(t.tree_sha256,`skills[${e}].tree_sha256`),o=new Set,a=new Set,c=Am(t.files,`skills[${e}].files`).map((u,d)=>{let f=`skills[${e}].files[${d}]`;if(!rf(u))throw new Error(`${f} must be an object`);Th(u,["path","mode","size","sha256","content_base64"],f);let h=pn(u.path,`${f}.path`);if(h.startsWith("/")||h.includes("\\")||h.endsWith("/")||h.split("/").some(w=>w===""||w==="."||w===".."))throw new Error(`${f} has an unsafe skill path`);let A=h.normalize("NFC").toLocaleLowerCase("en-US");if(o.has(h)||a.has(A))throw new Error(`${f} duplicates a skill path`);o.add(h),a.add(A);let g=pn(u.mode,`${f}.mode`);if(g!=="0644"&&g!=="0755")throw new Error(`${f}.mode is invalid`);if(!Number.isSafeInteger(u.size)||u.size<0)throw new Error(`${f}.size is invalid`);let m=pn(u.sha256,`${f}.sha256`),y=typeof u.content_base64=="string"?u.content_base64:"";if(!zat.test(y))throw new Error(`${f}.content_base64 is invalid`);let b=Buffer.from(y,"base64");if(b.toString("base64")!==y||b.byteLength!==u.size)throw new Error(`${f}.content_base64 size does not match`);return Xb(m,b,f),{path:h,mode:g,size:u.size,sha256:m,content_base64:y}});if(!o.has("SKILL.md"))throw new Error(`skills[${e}] must contain SKILL.md`);if([...c].sort((u,d)=>Buffer.from(u.path).compare(Buffer.from(d.path))).some((u,d)=>u.path!==c[d]?.path))throw new Error(`skills[${e}].files must use canonical path order`);return Xb(s,JSON.stringify(c.map(u=>({path:u.path,mode:u.mode==="0644"?420:493,size:u.size,sha256:u.sha256}))),`skills[${e}] tree`),{name:n,release_id:i,tree_sha256:s,files:c}}Th(t,["name","content","sha256"],`skills[${e}]`);let r={name:pn(t.name,`skills[${e}].name`),content:pn(t.content,`skills[${e}].content`),sha256:pn(t.sha256,`skills[${e}].sha256`)};if(!EB.test(r.name))throw new Error(`skills[${e}].name must be a release-managed skill name`);return Xb(r.sha256,r.content,`skills[${e}]`),r}function AXr(t,e){if(!zat.test(t))throw new Error(`${e} must be valid padded base64`);let r=Buffer.from(t,"base64");if(r.length===0)throw new Error(`${e} must not be empty`);if(r.toString("base64")!==t)throw new Error(`${e} must use canonical base64 encoding`);return r}function pXr(t,e){if(!rf(t))throw new Error(`assets[${e}] must be an object`);Th(t,["id","target","content_base64","sha256","mode"],`assets[${e}]`);let r={id:pn(t.id,`assets[${e}].id`),target:pn(t.target,`assets[${e}].target`),content_base64:pn(t.content_base64,`assets[${e}].content_base64`),sha256:pn(t.sha256,`assets[${e}].sha256`),mode:pn(t.mode,`assets[${e}].mode`)};if(!EB.test(r.id))throw new Error(`assets[${e}].id must be a safe identifier`);if(!_fe.has(r.target))throw new Error(`assets[${e}].target is not an allowed release asset target`);if(r.mode!=="0755"&&r.mode!=="0644")throw new Error(`assets[${e}].mode must be 0755 or 0644`);return Xb(r.sha256,AXr(r.content_base64,`assets[${e}].content_base64`),`assets[${e}]`),r}function Cfe(t){if(!rf(t))throw new Error("workspace_root must be an object");if(Th(t,["id","files"],"workspace_root"),t.id!=="semicolon-workspace")throw new Error("workspace_root.id must be semicolon-workspace");let e=Am(t.files,"workspace_root.files");if(e.length!==zO.length)throw new Error("workspace_root.files must contain exactly the fixed workspace-root files");let r=new Map;for(let[s,o]of e.entries()){if(!rf(o))throw new Error(`workspace_root.files[${s}] must be an object`);Th(o,["path","content","sha256","mode"],`workspace_root.files[${s}]`);let a=pn(o.path,`workspace_root.files[${s}].path`);if(!zO.includes(a))throw new Error("workspace_root file path is not allowed");if(r.has(a))throw new Error("workspace_root file paths must not contain duplicates");let c=pn(o.content,`workspace_root.files[${s}].content`),l=pn(o.sha256,`workspace_root.files[${s}].sha256`);if(pn(o.mode,`workspace_root.files[${s}].mode`)!=="0644")throw new Error(`workspace_root.files[${s}].mode must be 0644`);Xb(l,c,`workspace_root.files[${s}]`),r.set(a,{path:a,content:c,sha256:l,mode:"0644"})}let n=zO.map(s=>{let o=r.get(s);if(!o)throw new Error("workspace_root file path is not allowed");return o});if(!r.get("CLAUDE.md").content.includes("@AGENTS.md"))throw new Error("workspace_root CLAUDE.md must contain an @AGENTS.md pointer");return{id:"semicolon-workspace",files:n}}function Xat(t,e={}){if(t.schema!=="semo-ops/worker-release/v1")throw new Error("worker release manifest schema must be semo-ops/worker-release/v1");let r=Am(t.contexts,"contexts").map(fXr),n=Am(t.skills,"skills").map(hXr),i=Am(t.assets,"assets").map(pXr),s=Am(t.required_doctor_checks,"required_doctor_checks").map((c,l)=>pn(c,`required_doctor_checks[${l}]`));Zb(r.map(c=>c.id),"context ids"),Zb(r.map(c=>c.parity_group),"context parity groups"),Zb(n.map(c=>c.name),"skill names"),Zb(i.map(c=>c.id),"asset ids"),Zb(i.map(c=>c.target),"asset targets"),Zb(s,"required_doctor_checks");let o=e.profileId===lXr;if(o){if(r.length>0||n.length>0||i.length>0||t.workspace_root!==void 0)throw new Error("Agent release must not contain Human projection payload");let c=s.find(l=>!O_.includes(l));if(c)throw new Error(`Agent release has unknown required doctor check: ${c}`)}else if(t.agent_profiles!==void 0)throw new Error("agent_profiles is only supported by semo-ops-worker-agent");let a=o?Am(t.agent_profiles,"agent_profiles").map(dXr):void 0;if(o&&a?.length!==Zat.length)throw new Error("agent_profiles must contain exactly the canonical actor order");return{schema:"semo-ops/worker-release/v1",contexts:r,skills:n,assets:i,required_doctor_checks:s,...t.workspace_root===void 0?{}:{workspace_root:Cfe(t.workspace_root)},...a===void 0?{}:{agent_profiles:a}}}function Gs(t){if(t===null)return"null";if(typeof t=="string"||typeof t=="boolean")return JSON.stringify(t);if(typeof t=="number"){if(!Number.isFinite(t))throw new Error("manifest JSON must not contain non-finite numbers");return JSON.stringify(t)}if(Array.isArray(t))return`[${t.map(Gs).join(",")}]`;if(rf(t))return`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${Gs(t[e])}`).join(",")}}`;throw new Error("manifest must contain JSON values only")}function Uo(t){return(0,Kat.createHash)("sha256").update(t).digest("hex")}function wB(t,e={}){if(!rf(t))throw new Error("worker release manifest must be a JSON object");Th(t,["schema","contexts","skills","assets","required_doctor_checks","workspace_root","agent_profiles"],"worker release manifest");let r=Xat(t,e),n=Gs(r);return{manifest:r,canonicalManifest:n,manifestSha256:Uo(n)}}function e0(t,e={}){if(!rf(t))throw new Error("worker release manifest must be a JSON object");let r=Xat(t,e),n=Object.keys(t).filter(s=>!["schema","contexts","skills","assets","required_doctor_checks","workspace_root","agent_profiles"].includes(s)).sort(),i=Gs(t);return{manifest:r,canonicalManifest:i,manifestSha256:Uo(i),ignoredTopLevelKeys:n}}var Kat,cXr,EB,zat,_fe,lXr,Zat,uXr,O_,zO,Mh=H(()=>{"use strict";Kat=require("node:crypto"),cXr=/^[A-Fa-f0-9]{64}$/,EB=/^[a-z0-9][a-z0-9-]*$/,zat=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,_fe=new Set(["shared-script:feedback-capture.py","shared-hook:honcho-utterance-capture.sh"]),lXr="semo-ops-worker-agent",Zat=[{actor_id:"semi",runtime_profile:"semo-semi"},{actor_id:"colony",runtime_profile:"semo-colony"}],uXr=["action_create","action_list","decision_record","feedback_capture","kb_get","kb_note","kb_search"],O_=["agent:installation-state","agent:release-state","agent:gateway-release-auth","agent:profile:semi","agent:profile:colony","agent:context-digest:semi","agent:context-digest:colony","agent:skill-digests:semi","agent:skill-digests:colony","agent:tools:semi","agent:tools:colony","agent:kb-read:semi","agent:kb-read:colony","agent:feedback-auth:semi","agent:feedback-auth:colony","agent:note-auth:semi","agent:note-auth:colony","agent:service:slack-router","agent:service:kb-gateway","agent:no-token-in-profile"],zO=["AGENTS.md","CLAUDE.md",".claude/rules/projects.md"]});function ect(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function ZO(t){if(!ect(t))throw new Error("active worker release response must be an object");let e=t.release_id,r=t.version,n=t.manifest_sha256;if(typeof e!="string"||!mXr.test(e))throw new Error("active worker release id is invalid");let i=YA(r,"active worker release version");if(typeof n!="string"||!gXr.test(n))throw new Error("active worker release manifest_sha256 is invalid");return{release_id:e,version:i,manifest_sha256:n.toLowerCase()}}function yXr(t){let e=ZO(t);if(!ect(t)||!("manifest"in t))throw new Error("active worker release manifest is missing");let r=e0(t.manifest);if(r.manifestSha256!==e.manifest_sha256)throw new Error("active worker release manifest_sha256 does not match the canonical manifest");return{activeRelease:e,warnings:r.ignoredTopLevelKeys.map(n=>`ignored worker-release extension: ${n}`)}}function tct(t){return t.reduce((e,r)=>(e[r.level]+=1,e),{ok:0,warn:0,fail:0})}function kfe(t){let e=OA(t),r=t0.existsSync(e)?t0.readdirSync(e).filter(o=>o!=="README.md"):[],n=["SOUL.md","MEMORY.md","USER.md","bots"].filter(o=>t0.existsSync(s8.join(cW(t),o))),i=s8.join(t,".semicolony"),s=bXr.filter(o=>t0.existsSync(s8.join(i,o)));return[{id:"legacy-layout",label:"legacy semicolony worker dir",level:r.length>0?"warn":"ok",detail:r.length>0?`${e}\uC5D0 ${r.length}\uAC1C \uD56D\uBAA9 \uC794\uC874 \u2014 worker sync\uAC00 \uC774\uC804\uD568`:"\uC794\uC874 \uC5C6\uC74C"},{id:"semo-root-bot-artifacts",label:"semo root bot artifacts",level:n.length>0?"warn":"ok",detail:n.length>0?`\uBD07 \uC2DC\uB300 \uC0B0\uCD9C\uBB3C \uBC1C\uACAC: ${n.join(", ")} \u2014 legacy-semo-archive\uB85C \uC774\uB3D9 \uD544\uC694`:"\uC5C6\uC74C"},{id:"canonical-layout",label:"canonical SEMO Ops layout",level:t0.existsSync(Kc(t))&&t0.existsSync(Mg(t))?"ok":"warn",detail:`${Kc(t)} \xB7 ${Mg(t)}`},{id:"semicolony-home-residue",label:"legacy ~/.semicolony bot residue",level:s.length>0?"warn":"ok",detail:s.length>0?`${i}\uC5D0 \uBD07 \uC2DC\uB300 \uC794\uC874: ${s.join(", ")}`:"\uC5C6\uC74C"}]}function Ife(t){let e=Qa(t.homeDir,t.canonicalPath,Au(t.homeDir,t.legacyRelativePath));return e.status==="rejected"?{id:t.id,label:t.label,level:"fail",detail:`${e.source} worker file rejected: ${e.reason} (${e.filePath})`}:e.status==="absent"?{id:t.id,label:t.label,level:t.missingLevel??"warn",detail:t.missingDetail}:{id:t.id,label:t.label,level:e.source==="canonical"?"ok":"warn",detail:e.source==="canonical"?e.filePath:`${e.filePath} (read-only legacy fallback; run semo worker sync)`}}async function XO(t={}){let e=t.homeDir??vfe.homedir(),r=t.surface??"semicolony",n=Mi(e),i=t.releaseClient??lp({surface:r,env:t.env,fetchImpl:t.fetchImpl}),{activeRelease:s,warnings:o}=yXr(await i.fetchActiveRelease()),a=[],c=null,l=Qa(e,n.workerState,Au(e,"worker-state.json"));if(l.status==="rejected")a.push({id:"worker-state",label:"worker local state",level:"fail",detail:`${l.source} worker state rejected: ${l.reason} (${l.filePath})`});else if(l.status==="absent")a.push({id:"worker-state",label:"worker local state",level:"warn",detail:`${n.workerState} \uC5C6\uC74C \u2014 semo worker setup --force`});else try{c=Us(l.filePath),a.push({id:"worker-state",label:"worker local state",level:c&&l.source==="canonical"?"ok":"warn",detail:c?`${c.worker_id}/${c.device_id}${l.source==="legacy"?" (read-only legacy fallback)":""}`:"worker state is empty"})}catch(A){a.push({id:"worker-state",label:"worker local state",level:"fail",detail:`invalid local state: ${A.message}`})}let u=$6(c,t.now??new Date);a.push({id:"capability-snapshot",label:"Knowledge Fabric capability snapshot",level:u==="current"?"ok":"warn",detail:u==="current"?`server snapshot current until ${c?.schema_version===2?c.capability_snapshot?.expires_at:"unknown"}; protected requests still reload the DB lease`:`${u}; \uB85C\uCEEC \uC0C1\uD0DC\uC5D0\uC11C \uAD8C\uD55C\uC744 \uCD94\uB860\uD558\uC9C0 \uC54A\uC74C`});let d=null,f=Qa(e,n.releaseState,Au(e,"release-state.json"));if(f.status==="rejected")a.push({id:"release-state",label:"local worker release state",level:"fail",detail:`${f.source} worker release state rejected: ${f.reason} (${f.filePath})`});else if(f.status==="absent")a.push({id:"release-state",label:"local worker release state",level:"warn",detail:`${n.releaseState} \uC5C6\uC74C`});else try{d=Wd(f.filePath),a.push({id:"release-state",label:"local worker release state",level:d?"ok":"warn",detail:d?`${d.applied_release_id}@${d.applied_release_version}${f.source==="legacy"?" (read-only legacy fallback)":""}`:"release state is empty"})}catch(A){a.push({id:"release-state",label:"local worker release state",level:"fail",detail:`invalid local release state: ${A.message}`})}let h=!d||d.applied_release_id!==s.release_id||d.applied_release_version!==s.version||d.manifest_sha256!==s.manifest_sha256;return a.push({id:"release-target",label:"active worker release",level:h?"warn":"ok",detail:h?`update available: installed=${d?.applied_release_version??"none"}, target=${s.version}; run semo worker update`:`installed=${d?.applied_release_version??"none"}, target=${s.version}`}),a.push(Ife({homeDir:e,canonicalPath:n.env,legacyRelativePath:".env",id:"env-file",label:"worker env file",missingDetail:`${n.env} \uC5C6\uC74C \u2014 semo worker setup --force`}),Ife({homeDir:e,canonicalPath:n.kbMcp,legacyRelativePath:"kb-mcp.json",id:"mcp-config",label:"KB MCP config",missingDetail:c?.tool_adapters_enabled.includes("kb-mcp")?`${n.kbMcp} \uC5C6\uC74C \u2014 semo worker setup --with-kb-mcp --force`:"kb-mcp adapter is not enabled; config is optional",missingLevel:c?.tool_adapters_enabled.includes("kb-mcp")?"warn":"ok"}),Ife({homeDir:e,canonicalPath:n.dailyCheckHook,legacyRelativePath:"hooks/semo-ops-daily-check.sh",id:"daily-check-hook",label:"SessionStart daily check hook",missingDetail:`${n.dailyCheckHook} \uC5C6\uC74C \u2014 semo worker setup --force`})),Wat(e)&&a.push({id:"layout-migration",label:"SEMO Ops layout migration",level:"warn",detail:`${OA(e)} legacy \uB808\uC774\uC544\uC6C3 \uBC1C\uACAC \u2014 dry-run\uC5D0\uC11C\uB294 \uC774\uC804\uD558\uC9C0 \uC54A\uC74C`}),a.push(...kfe(e)),{dryRun:!0,state:c,releaseState:d,activeRelease:s,updateAvailable:h,warnings:o,checks:a,summary:tct(a)}}function EXr(t,e){return e.skipped?{id:"layout-migration",label:"SEMO Ops layout migration",level:"ok",detail:`${OA(t)} legacy \uB808\uC774\uC544\uC6C3 \uC5C6\uC74C \u2014 \uC774\uBBF8 \uC774\uC804 \uC644\uB8CC`}:{id:"layout-migration",label:"SEMO Ops layout migration",level:"ok",detail:`${e.migrated.length} files \u2192 semo/worker\xB7hooks, bots archived: ${e.archived.length>0}, settings rewritten: ${e.settingsRewritten}`}}async function rct(t={}){let e=t.homeDir??vfe.homedir(),r=Gat(e),n=await XO({...t,homeDir:e}),i=n.checks.filter(s=>s.id!=="layout-migration");return i.unshift(EXr(e,r)),{...n,dryRun:!1,checks:i,summary:tct(i)}}function wXr(t){return t==="ok"?yc.default.green("\u2713"):t==="warn"?yc.default.yellow("\u26A0"):yc.default.red("\u2717")}function o8(t){let e=ZO(t.activeRelease),r=["",yc.default.cyan.bold(t.dryRun?"SEMO Ops worker sync --dry-run":"SEMO Ops worker sync"),yc.default.gray(` active=${e.release_id}@${e.version} manifest=${e.manifest_sha256}`),""];for(let n of t.checks)r.push(` ${wXr(n.level)} ${n.label}${n.detail?yc.default.gray(` \u2014 ${n.detail}`):""}`);for(let n of t.warnings)r.push(yc.default.yellow(` \u26A0 ${n}`));return r.push(""),t.updateAvailable&&(r.push(yc.default.yellow(" update available \u2014 inspect with semo worker update --check")),r.push(yc.default.yellow(" apply explicitly with semo worker update, then semo worker doctor"))),r.push(` ${yc.default.bold("\uC694\uC57D")}: ${yc.default.green(`${t.summary.ok} ok`)} \xB7 ${yc.default.yellow(`${t.summary.warn} warn`)} \xB7 ${yc.default.red(`${t.summary.fail} fail`)}`),r.push(yc.default.gray(t.dryRun?" dry-run only: no local files were changed.":" legacy layout migration completed; release application remains explicit.")),r.push(""),r.join(`
1133
1133
  `)}var t0,vfe,s8,yc,gXr,mXr,bXr,a8=H(()=>{"use strict";t0=v(require("fs")),vfe=v(require("os")),s8=v(require("path")),yc=v(Ne());us();Zf();Hat();bB();Mh();pu();gXr=/^[a-f0-9]{64}$/i,mXr=/^[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}$/;bXr=["workspaces","mailbox","bin","bridge-token.txt"]});function xfe(t){try{return(0,c8.lstatSync)(t)}catch(e){if(e.code==="ENOENT")return null;throw new up("workspace_layout_unsafe_path",t)}}function nct(t){let e=xfe(t);if(!e)throw new up("workspace_layout_unsafe_path","root does not exist");if(e.isSymbolicLink())throw new up("workspace_layout_unsafe_path","root is a symbolic link");if(!e.isDirectory())throw new up("workspace_layout_unsafe_path","root is not a directory")}function ict(t,e){let r=xfe((0,_B.join)(t,e));if(!r)return"create";if(r.isSymbolicLink())throw new up("workspace_layout_unsafe_path",e);if(!r.isDirectory())throw new up("workspace_layout_conflict",e);return"reuse"}function u8(t){let e=(0,_B.resolve)(t);nct(e);let r=[],n=[];for(let i of l8)ict(e,i)==="reuse"?r.push(i):n.push(i);return{present:r,missing:n}}async function sct(t,e={}){let r=(0,_B.resolve)(t);nct(r);let n=new Map;for(let o of l8)n.set(o,ict(r,o));let i=[],s=[];for(let[o,a]of n){if(a==="reuse"){s.push(o);continue}let c=(0,_B.join)(r,o);try{(0,c8.mkdirSync)(c)}catch{throw new up("workspace_layout_unsafe_path",`${o} changed while the root was inspected`)}e.afterCreate?.(o);let l=xfe(c);if(!l||l.isSymbolicLink()||!l.isDirectory())throw new up("workspace_layout_unsafe_path",`${o} changed while the root was inspected`);i.push(o)}return{created:i,reused:s}}var c8,_B,l8,up,Bfe=H(()=>{"use strict";c8=require("node:fs"),_B=require("node:path"),l8=["projects","research","work","skills"],up=class extends Error{code;constructor(e,r){super(`${e}: ${r}`),this.name="WorkspaceRootLayoutError",this.code=e}}});function e1(t,e){let r=(0,Ma.resolve)(t),n=(0,Ma.resolve)(r,e),i=(0,Ma.relative)(r,n);if(i===".."||i.startsWith(`..${Ma.sep}`)||i.startsWith(Ma.sep))throw new dp("project_skill_unsafe_path",e);return n}function act(t){return(0,P_.createHash)("sha256").update(t).digest("hex")}function vXr(t){let e=(0,P_.createHash)("sha256"),r=[...t].sort((n,i)=>n.path===i.path?0:n.path<i.path?-1:1);for(let n of r)e.update(`${n.path} ${n.mode} ${n.sha256}
1134
1134
  `);return e.digest("hex")}function kXr(t){if(!_Xr.test(t.skillId)||typeof t.version!="string"||t.version.length===0||!CXr.test(t.contentDigest)||t.activationScope!=="project"&&t.activationScope!=="component"||t.activationScope==="component"&&!t.component)throw new dp("project_skill_pin_invalid",t.skillId??"(unnamed)")}function xXr(t,e){if(e.skillId!==t.skillId||e.version!==t.version||e.contentDigest!==t.contentDigest||!Array.isArray(e.files)||e.files.length===0)throw new dp("project_skill_pin_mismatch",t.skillId);for(let r of e.files)if(typeof r.path!="string"||!IXr.test(r.path)||typeof r.content!="string"||act(r.content)!==r.sha256)throw new dp("project_skill_bundle_corrupt",t.skillId);if(vXr(e.files)!==t.contentDigest)throw new dp("project_skill_bundle_corrupt",t.skillId)}function BXr(t,e){let r=`${oct}/${e}/`;return t.some(n=>n===`${oct}/${e}`||n.startsWith(r))}function SXr(t,e){let r=e1(t,e);if(!(0,Su.existsSync)(r))return;let n=(0,Su.lstatSync)(r);if(n.isSymbolicLink()||!n.isDirectory())throw new dp("project_skill_unsafe_path",e)}async function QXr(t,e,r){let n=e1(t,e),i=`${n}.semo-skill-tmp-${(0,P_.randomUUID)()}`;try{for(let s of r.files){let o=e1(i,s.path);await(0,la.mkdir)((0,Ma.dirname)(o),{recursive:!0}),await(0,la.writeFile)(o,s.content,{encoding:"utf8",mode:384,flag:"wx"}),await(0,la.chmod)(o,420)}await(0,la.rm)(n,{recursive:!0,force:!0}),await(0,la.mkdir)((0,Ma.dirname)(n),{recursive:!0}),await(0,la.rename)(i,n)}finally{await(0,la.rm)(i,{recursive:!0,force:!0})}}function Sfe(t){let e=e1(t,d8);if(!(0,Su.existsSync)(e))return{schema_version:1,skills:[]};let r=(0,Su.lstatSync)(e);if(r.isSymbolicLink()||!r.isFile())throw new dp("project_skill_unsafe_path",d8);let n=JSON.parse((0,Su.readFileSync)(e,"utf8"));if(n?.schema_version!==1||!Array.isArray(n.skills))throw new dp("project_skill_receipt_invalid",d8);return n}async function DXr(t,e){let r=e1(t,d8);await(0,la.mkdir)((0,Ma.dirname)(r),{recursive:!0});let n=`${r}.semo-tmp-${(0,P_.randomUUID)()}`;try{await(0,la.writeFile)(n,`${JSON.stringify(e,null,2)}
1135
1135
  `,{encoding:"utf8",mode:384,flag:"wx"}),await(0,la.chmod)(n,420),await(0,la.rename)(n,r)}finally{await(0,la.rm)(n,{force:!0})}}async function h8(t,e,r,n,i=()=>new Date){if(r.length===0)return{installed:[],reused:[],repositoryManaged:[],conflicts:[]};let s=n.gitTrackedFiles(t),o=[],a=[],c=[];for(let g of r){if(kXr(g),BXr(s,g.skillId)){o.push(g.skillId),a.push(g.skillId);continue}let m=await n.fetchBundle(e,g);xXr(g,m);for(let y of f8)SXr(t,`${y}/${g.skillId}`);c.push({pin:g,bundle:m})}if(a.length>0)return{installed:[],reused:[],repositoryManaged:o,conflicts:a};let l=Sfe(t),u=new Map(l.skills.map(g=>[g.skillId,g])),d=[],f=[],h=[],A=i().toISOString();for(let{pin:g,bundle:m}of c){let y=u.get(g.skillId),b=f8.map(E=>`${E}/${g.skillId}`),w=y?.contentDigest===g.contentDigest&&y.version===g.version&&b.every(E=>(0,Su.existsSync)((0,Ma.join)(t,E)));if(w)f.push(g.skillId);else{for(let E of b)await QXr(t,E,m);d.push(g.skillId)}h.push({skillId:g.skillId,version:g.version,contentDigest:g.contentDigest,activationScope:g.activationScope,...g.component?{component:g.component}:{},destinations:b,installedAt:w?y?.installedAt??A:A})}return h.sort((g,m)=>g.skillId.localeCompare(m.skillId)),await DXr(t,{schema_version:1,skills:h}),{installed:d,reused:f,repositoryManaged:o,conflicts:[]}}function cct(t,e){let r=f8.map(n=>{let i=(0,Ma.join)(t,n,e);return(0,Su.existsSync)(i)?RXr(i):null});return r.every(n=>n!==null&&n===r[0])}function RXr(t){let e=(0,P_.createHash)("sha256"),r=(n,i)=>{for(let s of(0,Su.readdirSync)(n,{withFileTypes:!0}).sort((o,a)=>o.name===a.name?0:o.name<a.name?-1:1)){let o=(0,Ma.join)(n,s.name),a=i?`${i}/${s.name}`:s.name;s.isDirectory()?r(o,a):e.update(`${a} ${act((0,Su.readFileSync)(o,"utf8"))}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@team-semicolon/semicolony-cli",
3
- "version": "4.18.108",
3
+ "version": "4.18.109",
4
4
  "description": "SemiColony CLI - AI operations and agent orchestration installer",
5
5
  "main": "dist/bundle.js",
6
6
  "bin": {