docuvia 1.7.1 → 1.8.0

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/dist/cli.js CHANGED
@@ -162,7 +162,7 @@ ${r}`;async function V(t,e){await De(t,Si,e)}import oi from"fs";import Zu from"p
162
162
  `,K)}function is(t,e,r){return{kind:$e.FLUSH_STAGED_L3,skippedDisabled:t,flushed:0,deduped:0,stillPending:e,commitSha:r,noGraphToAttach:!1}}function Ov(t){let e=new Map;for(let r of t){let n=e.get(r.filePath);n?n.push(r):e.set(r.filePath,[r])}return e}function yv(t,e){let r=[],n=[];for(let i of t)e.has(i.filePath)?r.push(i):n.push(i);return{toFlush:r,stillPending:n}}function Iv(t){return t.map(e=>({title:e.title,content:e.content,nodeType:e.nodeType,confidence:e.confidence}))}async function Lv(t,e,r,n,i){let s=Rv.resolve(t,r);if(!Av.existsSync(s))return e.warn(Q.FLUSH_STAGED_L3_FILE_DELETED(r),{droppedCount:n.length}),{persisted:0,deduped:0,dropped:n,retry:[],noGraphToAttach:!1};let{files:o,droppedFiles:a}=Wr(s,t,e);a.length>0&&e.warn(Q.FILES_DROPPED(a.length),{droppedFiles:a,filePath:r});let l=await ci({workspaceRoot:t,logger:e,resolvedTargetPath:s,files:o,decisions:Iv(n),source:wt.AGENT_AUTHORED,extractionModel:null,commitSha:i,writerEnhancements:{warnOnAnchorContradictions:!0,captureAnchorRanges:!0}});return l.persisted+l.deduped===0?{persisted:0,deduped:0,dropped:[],retry:n,noGraphToAttach:l.noGraphToAttach}:{persisted:l.persisted,deduped:l.deduped,dropped:[],retry:[],noGraphToAttach:!1}}async function VE(t){let{workspaceRoot:e,logger:r}=t;if(!(await di(e,r))[rr.COMMIT_L3_WRITE])return r.info(Q.FLUSH_STAGED_L3_DISABLED),await V(e,{event:j.FLUSH_STAGED_L3_DISABLED}),is(!0,0,null);let i=await ui(e,r);if(i.length===0)return r.info(Q.FLUSH_STAGED_L3_EMPTY),is(!1,0,null);let s=R.resolve(A.GitProvider),o=await s.getHeadSha(e);if(!o)return is(!1,i.length,null);let a=new Set(await s.getFilesChangedByCommit(e,o)),{toFlush:l,stillPending:c}=yv(i,a);if(l.length===0)return await V(e,{event:j.FLUSH_STAGED_L3_SUMMARY,flushed:0,stillPending:c.length,commitSha:o}),is(!1,c.length,o);let u=Ov(l),p=0,d=0,f=0,m=0,_=[];try{for(let[L,N]of u){let w=await Lv(e,r,L,N,o);p+=w.persisted,d+=w.deduped,f+=w.dropped.length,m+=Number(w.noGraphToAttach),_.push(...w.retry)}}catch(L){let N=L instanceof Error?L.message:String(L);return r.warn(Q.FLUSH_STAGED_L3_ERROR(N)),await V(e,{event:j.FLUSH_STAGED_L3_SUMMARY,error:N,commitSha:o}),is(!1,i.length,o)}let I=[...c,..._];return await ld(e,I),r.info(Q.FLUSH_STAGED_L3_SUMMARY(p,I.length)),await V(e,{event:j.FLUSH_STAGED_L3_SUMMARY,flushed:p,deduped:d,stillPending:I.length,droppedDeleted:f,commitSha:o}),{kind:$e.FLUSH_STAGED_L3,skippedDisabled:!1,flushed:p,deduped:d,stillPending:I.length,commitSha:o,noGraphToAttach:m>0}}var Vr=class{constructor(e,r,n){this.workspaceRoot=e;this.logger=r;this.options=n}workspaceRoot;logger;options;async execute(){return this.options?.flushStagedL3?VE({workspaceRoot:this.workspaceRoot,logger:this.logger}):this.options?.agentAuthoredDecisions?UE({workspaceRoot:this.workspaceRoot,logger:this.logger,targetPath:this.options.targetPath,decisions:this.options.agentAuthoredDecisions}):this.options?.targetPath?this.executeDecisionExtraction(this.options.targetPath):this.options?.escalateToLsp?this.executeTierBBatch():this.executeAutoMode()}async executeTierBBatch(){let{workspaceRoot:e,logger:r,options:n}=this,i;try{let s=R.resolve(A.GitProvider),o=R.resolve(A.KnowledgeGitService,{logger:r});return i=await R.resolve(A.GraphStoreOpener)({dbPath:ie(e),readonly:!1}),await wE(bv(e,r,i,s,o,n))}catch(s){let o=s instanceof Error?s.message:String(s);throw await V(e,{event:j.TIER_B_ERROR,message:o}),s}finally{await i?.close()}}async executeAutoMode(){let{workspaceRoot:e,logger:r}=this;r.info(Q.AUTO_ANALYZING),await V(e,{event:j.AUTO_START});let n;try{let i=R.resolve(A.GitProvider),s=R.resolve(A.KnowledgeGitService,{logger:r});return n=await R.resolve(A.GraphStoreOpener)({dbPath:ie(e),readonly:!1}),await this.dispatchAutoMode(n,i,s)}catch(i){let s=i instanceof Error?i.message:String(i);throw await V(e,{event:j.AUTO_ERROR,message:s}),i}finally{await n?.close()}}async dispatchAutoMode(e,r,n){let{workspaceRoot:i,logger:s}=this,o=await r.getHeadSha(i),a=e.meta.get(E.META_KEY_LAST_INGESTED_SOURCE_SHA);if(await this.maybeLogTierBCommitCapNudge(e),o&&a&&o===a){let p=await r.hasUncommittedChanges(i);return s.info(p?Q.AUTO_NOOP_DIRTY_WORKTREE:Q.AUTO_NOOP),await V(i,{event:j.DELTA_NOOP,headSha:o,dirtyWorktree:p}),{kind:$e.AUTO_DELTA_NOOP,headSha:o,dirtyWorktree:p}}let l=e.projects.getFirst(),{l2Nodes:c}=e.graph.count();if(!l||c===0)return await this.dispatchEmptyGraph(e,r,n,o);if(!o)return await V(i,{event:j.DELTA_NO_HEAD}),{kind:$e.AUTO_DELTA_NOOP,headSha:null,dirtyWorktree:!1};let u=a;return u||(u=await n.resolveNewestSourceTrailerSha(i)),u?await td({workspaceRoot:i,logger:s,store:e,git:r,knowledgeGit:n,projectId:l.id,fromSha:u,headSha:o}):await ai({workspaceRoot:i,logger:s,store:e,git:r})}async dispatchEmptyGraph(e,r,n,i){let{workspaceRoot:s,logger:o}=this,a=i?await this.tryHydrateThenDelta(e,r,n,i):void 0;return a||await ai({workspaceRoot:s,logger:o,store:e,git:r})}async tryHydrateThenDelta(e,r,n,i){let{workspaceRoot:s,logger:o}=this,a=R.resolve(A.HydrationService,{logger:o}),l=await a.resolveHydrationCommit(s);if(!l)return;let c=await Pv(r,s,l);if(!c||!(await a.hydrate(s,e)).hydrated)return;let p=await ti(e.projects,r,s);return await td({workspaceRoot:s,logger:o,store:e,git:r,knowledgeGit:n,projectId:p.id,fromSha:c,headSha:i})}async maybeLogTierBCommitCapNudge(e){let{workspaceRoot:r,logger:n}=this;try{if(!li(e))return;n.info(Q.TIER_B_CAP_NUDGE),await V(r,{event:j.TIER_B_COMMIT_CAP_NUDGE})}catch{}}async executeDecisionExtraction(e){let{workspaceRoot:r,logger:n,options:i}=this;n.info(Q.EXTRACTING(e)),await V(r,{event:j.FOCUSED_START,targetPath:e});let s=Cv.resolve(r,e);if(!Nv.existsSync(s)){let I=Q.PATH_NOT_FOUND(e);throw await V(r,{event:j.FOCUSED_ERROR,targetPath:e,message:I}),new S(O.FS_READ_FAILED,I)}let{files:o,droppedFiles:a}=Wr(s,r,n);if(a.length>0&&n.warn(Q.FILES_DROPPED(a.length),{droppedFiles:a,targetPath:e}),o.length===0)return await V(r,{event:j.FOCUSED_SUMMARY,targetPath:e,decisionsCount:0}),{kind:$e.DECISION_EXTRACTION,targetPath:e,decisions:[],persisted:0,deduped:0};let l=o.map(I=>`--- ${I.relativePath} ---
163
163
  ${I.content}`).join(`
164
164
 
165
- `),u=R.resolve(A.LlmClient)();u.initialize({baseUrl:i.llmBaseUrl,apiKey:i.llmApiKey});let p;try{p=await u.chatCompletion({model:i.llmModel,temperature:.2,messages:[{role:_r.SYSTEM,content:nE},{role:_r.USER,content:l}]})}catch(I){let L=I instanceof Error?I.message:String(I);throw await V(r,{event:j.FOCUSED_ERROR,targetPath:e,message:L}),I}let d=p.choices[0]?.message.content,f=Ra(d);if(f===void 0){let I=Q.LLM_NON_JSON_OUTPUT;throw await V(r,{event:j.FOCUSED_ERROR,targetPath:e,message:I}),new S(O.LLM_INVALID_RESPONSE,I)}let{persisted:m,deduped:_}=await this.persistDecisions(s,o,f);return await V(r,{event:j.FOCUSED_SUMMARY,targetPath:e,decisionsCount:f.length}),{kind:$e.DECISION_EXTRACTION,targetPath:e,decisions:f,persisted:m,deduped:_}}async persistDecisions(e,r,n){let{workspaceRoot:i,logger:s,options:o}=this;return ci({workspaceRoot:i,logger:s,resolvedTargetPath:e,files:r,decisions:n,source:wt.ANALYZE,extractionModel:o?.llmModel??null})}};async function Pv(t,e,r){let i=(await t.getCommitLog(e,E.KNOWLEDGE_ROOT,E.KNOWLEDGE_LOG_SCAN_LIMIT)).find(s=>s.sha===r);return i?ir(i.message):void 0}function Dv(t){return{providerConfig:t?.lspProviderConfig,commitCap:t?.tierBCommitCap,llmBaseUrl:t?.llmBaseUrl,llmApiKey:t?.llmApiKey,llmModel:t?.llmModel,full:t?.full}}function vv(t){return{tierCDailyCallCap:t?.tierCDailyCallCap,tierCDailyTokenCap:t?.tierCDailyTokenCap,tierCWallClockMs:t?.tierCWallClockMs,tierCItemCap:t?.tierCItemCap,tierCLoadThreshold:t?.tierCLoadThreshold,tierCDrainAll:t?.tierCDrainAll}}function bv(t,e,r,n,i,s){return{workspaceRoot:t,logger:e,store:r,git:n,knowledgeGit:i,...Dv(s),...vv(s),force:s?.force}}var Ia={DETECTING_CHANGES:"Detecting changes...",DB_NOT_FOUND:'Local database not found. Please run "docuvia init".'},La={START:"review.start",ERROR:"review.error",SUMMARY:"review.summary"};async function Na(t,e){await De(t,Wd,e)}var Ca=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async execute(e){let{workspaceRoot:r,logger:n}=this;n.info(Ia.DETECTING_CHANGES),await Na(r,{event:La.START,baseRef:e??null});let o=(await R.resolve(A.GitProvider).getChangedFilesSince(r,e)).map(c=>({file:c.file,status:c.status}));await Yr(r,n);let a=R.resolve(A.GraphStoreOpener),l;try{l=await a({dbPath:ie(r),readonly:!0})}catch(c){throw c instanceof S&&c.code===O.DB_NOT_FOUND?(await Na(r,{event:La.ERROR,message:Ia.DB_NOT_FOUND}),new S(O.DB_NOT_FOUND,Ia.DB_NOT_FOUND,c)):c}try{let u=R.resolve(A.ChangeDetectionService,{logger:n}).detectChanges({store:l,baseRef:e??null,filesChanged:o});return await Na(r,{event:La.SUMMARY,baseRef:e??null,riskLevel:u.riskLevel,filesChanged:u.filesChanged.length,affectedNodes:u.affectedNodes.length}),u}finally{await l.close()}}};var Dt={RESOLVING:"Resolving blast radius...",DB_NOT_FOUND:'Local database not found. Please run "docuvia init".',REGISTRY_MEDIATED_COVERAGE_NOTE:'This symbol is resolved through the docuviaFactory/TOKENS registry -- the static edge graph does not model registry-mediated dependencies, so a "no dependents" result may be incomplete.',RISK_NOTE_EMPTY_WITH_PARTIAL_COVERAGE:(t,e)=>`No dependents found, but only ${t} of ${e} workspace files have been analyzed -- this is UNKNOWN, not confirmed zero. Run "docuvia analyze" for fuller coverage.`,RISK_NOTE_EMPTY_STATIC_EDGES_ONLY:"No static dependents found. The edge graph models calls/extends/implements only -- runtime-variable imports, computed import() specifiers, and child_process spawns are invisible, so absence of edges is not evidence of no dependents.",RISK_NOTE_EMPTY_LOW_RESOLUTION:(t,e)=>`No static dependents found, but only ${t} of ${e} call sites in this symbol's own file resolved into edges during ingestion -- dependents calling it from here may be missing from the graph. Run "docuvia analyze --escalate-to-lsp --full" to recover them.`,RISK_NOTE_PARTIAL_COVERAGE_NON_EMPTY:(t,e)=>`Only ${t} of ${e} workspace files have been analyzed -- this result may be missing dependents from unprocessed files.`},ss={START:"impact.start",ERROR:"impact.error",SUMMARY:"impact.summary"};async function os(t,e){await De(t,jd,e)}function wv(t,e,r,n){return t===void 0||e===void 0||t<e?Dt.RISK_NOTE_EMPTY_WITH_PARTIAL_COVERAGE(t??0,e??0):r?Dt.REGISTRY_MEDIATED_COVERAGE_NOTE:n&&n.applicable>=E.DEFAULT_CALL_RESOLUTION_MIN_SAMPLE&&n.resolved/n.applicable<E.DEFAULT_CALL_RESOLUTION_NOTE_THRESHOLD?Dt.RISK_NOTE_EMPTY_LOW_RESOLUTION(n.resolved,n.applicable):Dt.RISK_NOTE_EMPTY_STATIC_EDGES_ONLY}function zE(t){let{blastRadiusCount:e,computedRiskLevel:r,workspaceFilesProcessed:n,workspaceFilesTotal:i,registryMediated:s}=t;return e===0?{riskLevel:je.UNKNOWN,epistemic:hl.LOWER_BOUND,riskNote:wv(n,i,s,t.targetFileResolution)}:n===void 0||i===void 0||n<i?{riskLevel:r,epistemic:hl.LOWER_BOUND,riskNote:Dt.RISK_NOTE_PARTIAL_COVERAGE_NON_EMPTY(n??0,i??0)}:{riskLevel:r}}function JE(t,e){if(t)return e===Dt.REGISTRY_MEDIATED_COVERAGE_NOTE?void 0:Dt.REGISTRY_MEDIATED_COVERAGE_NOTE}import*as qE from"path";import*as QE from"fs/promises";var Pa=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async execute(e){let{workspaceRoot:r,logger:n}=this;n.info(Dt.RESOLVING),await os(r,{event:ss.START,target:e}),await Yr(r,n);let i=R.resolve(A.GraphStoreOpener),s;try{s=await i({dbPath:ie(r),readonly:!0})}catch(o){throw o instanceof S&&o.code===O.DB_NOT_FOUND?(await os(r,{event:ss.ERROR,target:e,message:Dt.DB_NOT_FOUND}),new S(O.DB_NOT_FOUND,Dt.DB_NOT_FOUND,o)):o}try{let o=R.resolve(A.ImpactService,{logger:n}),a=o.getBlastRadius(s,e);if(!a)return await os(r,{event:ss.SUMMARY,target:e,found:!1,blastRadiusCount:0,riskLevel:null}),null;let l=o.computeRiskLevel(s,a.length);return await os(r,{event:ss.SUMMARY,target:e,found:!0,blastRadiusCount:a.length,riskLevel:l}),{blastRadius:a,...await this.resolveEpistemicFields(s,e,a.length,l)}}finally{await s.close()}}async resolveEpistemicFields(e,r,n,i){let{tierBCoverage:s,registryMediated:o,targetFileResolution:a}=await this.resolveTargetContext(e,r,n),l=e.files.getTierBCoverage(),c=zE({blastRadiusCount:n,computedRiskLevel:i,workspaceFilesProcessed:l?.processedFiles,workspaceFilesTotal:l?.totalFiles,registryMediated:o,targetFileResolution:a}),u=JE(o,c.riskNote);return{riskLevel:c.riskLevel,...c.epistemic?{epistemic:c.epistemic}:{},...c.riskNote?{riskNote:c.riskNote}:{},...u?{coverageNote:u}:{},...s?{tierBCoverage:s}:{}}}async resolveTargetContext(e,r,n){let i=e.graph.findNodeByName(r),s=R.resolve(A.TierBCoverageHintProvider).resolve(e,i?.filePath,n===0,!1),o=n===0&&!!i?.filePath&&await this.fileUsesFactoryRegistry(i.filePath),a;if(i?.filePath){let l=ua(e)[i.filePath];l&&(a={resolved:l.resolved,applicable:l.total-l.selfDiscarded})}return{tierBCoverage:s,registryMediated:o,targetFileResolution:a}}async fileUsesFactoryRegistry(e){let r;try{r=await QE.readFile(qE.join(this.workspaceRoot,e),K)}catch{return!1}return/docuviaFactory|TOKENS\./.test(r)}};var Da={QUERYING:"Querying local knowledge graph...",DB_NOT_FOUND:'Local database not found. Please run "docuvia init".'},va={START:"query.start",ERROR:"query.error",SUMMARY:"query.summary"};async function ba(t,e){await De(t,Vd,e)}var wa=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async execute(e,r){let{workspaceRoot:n,logger:i}=this;i.info(Da.QUERYING),await ba(n,{event:va.START,target:e}),await Yr(n,i);let s=R.resolve(A.GraphStoreOpener),o;try{o=await s({dbPath:ie(n),readonly:!0})}catch(a){throw a instanceof S&&a.code===O.DB_NOT_FOUND?(await ba(n,{event:va.ERROR,target:e,message:Da.DB_NOT_FOUND}),new S(O.DB_NOT_FOUND,Da.DB_NOT_FOUND,a)):a}try{let l=R.resolve(A.QueryService,{logger:i}).query(o,e,r),c=!!l.l2||l.l3.length>0||!!l.context;return await ba(n,{event:va.SUMMARY,target:e,found:c}),l}finally{await o.close()}}};var Fa={EXPORTING:"Exporting topology...",DB_NOT_FOUND:'Local database not found. Please run "docuvia init".'},Ma={START:"export-topology.start",ERROR:"export-topology.error",SUMMARY:"export-topology.summary"};async function ka(t,e){await De(t,zd,e)}var Ga=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async execute(e={}){let{workspaceRoot:r,logger:n}=this;n.info(Fa.EXPORTING),await ka(r,{event:Ma.START,collapse:e.collapse??null});let i=R.resolve(A.GraphStoreOpener),s;try{s=await i({dbPath:ie(r),readonly:!0})}catch(o){throw o instanceof S&&o.code===O.DB_NOT_FOUND?(await ka(r,{event:Ma.ERROR,message:Fa.DB_NOT_FOUND}),new S(O.DB_NOT_FOUND,Fa.DB_NOT_FOUND,o)):o}try{let a=R.resolve(A.TopologyBuilder,{logger:n}).build({workspaceRoot:r,l2Rows:s.graph.getAllNodes(),linkRows:s.graph.getAllLinks(),l3Rows:s.l3.getAllExportable(),tagRows:s.tags.getAllTagLinks()},e);return await ka(r,{event:Ma.SUMMARY,nodeCount:a.stats.nodeCount,linkCount:a.stats.linkCount,groupCount:a.stats.groupCount,collapsed:a.collapsed}),a}finally{await s.close()}}};async function On(t,e){await De(t,Jd,e)}function Fv(t){if(t)try{let e=JSON.parse(t);return typeof e.headSha!="string"||!Array.isArray(e.remainingQueue)?void 0:e}catch{return}}async function XE(t,e){let r=R.resolve(A.GraphStoreOpener),n=R.resolve(A.KnowledgeGitService,{logger:e}),i=await r({dbPath:ie(t),readonly:!1});try{i.meta.get("tierCProcessedThisRun")==="true"&&await i.withWriteLock(()=>{i.meta.set("tierCProcessedThisRun","")});let s=Fv(i.meta.get(E.META_KEY_TIER_B_BATCH_PENDING));if(!s)return;await n.runUnderKnowledgeLock(t,async()=>{await i.withWriteLock(()=>{i.meta.set(E.META_KEY_TIER_B_QUEUE,JSON.stringify(s.remainingQueue)),i.meta.set(E.META_KEY_LAST_TIER_B_BATCH_SHA,s.headSha),i.meta.set(E.META_KEY_TIER_B_CHANGED_BYTES,"0"),i.meta.set(E.META_KEY_TIER_B_BATCH_PENDING,"")})}),await On(t,{event:ii.TIER_B_FINALIZED,headSha:s.headSha,remainingQueueSize:s.remainingQueue.length})}finally{await i.close()}}var xa=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async openStoreForSnapshot(e){try{return await e({dbPath:ie(this.workspaceRoot),readonly:!1})}catch(r){throw r instanceof S&&r.code===O.DB_NOT_FOUND?(await On(this.workspaceRoot,{event:ii.ERROR,message:pa.DB_NOT_FOUND}),new S(O.DB_NOT_FOUND,pa.DB_NOT_FOUND,r)):r}}async shouldSkipSnapshot(e,r){let i=await R.resolve(A.GitProvider).getHeadSha(this.workspaceRoot)??null,s=i&&typeof e.hasSourceCommitInHistory=="function"?await e.hasSourceCommitInHistory(this.workspaceRoot,i):!1,o=r.meta.get(E.META_KEY_TIER_B_BATCH_PENDING),a=r.meta.get(E.META_KEY_LAST_TIER_B_BATCH_SHA),l=r.meta.get("tierCProcessedThisRun")==="true";return{shouldSkip:!!(i&&s&&a===i&&!o&&!l),headSha:i}}async execute(){let{workspaceRoot:e,logger:r}=this;r.info(pa.SNAPSHOTTING),await On(e,{event:ii.START,workspaceRoot:e});let n=R.resolve(A.GraphStoreOpener),i=R.resolve(A.KnowledgeGitService,{logger:r}),s=await this.openStoreForSnapshot(n);try{let{shouldSkip:o,headSha:a}=await this.shouldSkipSnapshot(i,s);if(o)return r.info("Knowledge graph snapshot is already up to date with HEAD, skipping."),await On(e,{event:"snapshot.skipped",reason:"already-up-to-date",headSha:a}),{nodesWritten:0,edgesWritten:0,markdownFilesWritten:0};let l=await si(e,s,i);return await XE(e,r),await On(e,{event:ii.SUMMARY,nodesWritten:l.nodesWritten,edgesWritten:l.edgesWritten,markdownFilesWritten:l.markdownFilesWritten}),l}finally{await s.close()}}};var ud={HYDRATING:"Hydrating local database from the knowledge branch...",NOTHING_TO_HYDRATE:'Nothing to hydrate from yet. Please run "docuvia init".'},Ua={START:"hydrate.start",SUMMARY:"hydrate.summary"};async function Ha(t,e){await De(t,qd,e)}var Ba=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async execute(e){let{workspaceRoot:r,logger:n}=this;n.info(ud.HYDRATING),await Ha(r,{event:Ua.START,workspaceRoot:r});let s=await R.resolve(A.GraphStoreOpener)({dbPath:ie(r),readonly:!1});try{let a=await R.resolve(A.HydrationService,{logger:n}).hydrate(r,s,void 0,e);return a.hydrated?(await Ha(r,{event:Ua.SUMMARY,hydrated:!0,knowledgeSha:a.knowledgeSha,nodesLoaded:a.nodesLoaded,edgesLoaded:a.edgesLoaded,edgesDropped:a.edgesDropped}),a):(await Ha(r,{event:Ua.SUMMARY,hydrated:!1,message:ud.NOTHING_TO_HYDRATE}),a)}finally{await s.close()}}};var as={SYNCING:"Reconciling the knowledge branch with the remote...",VALIDITY_PASS_BASELINE:"L3 validity pass: first run -- stamped baseline cursor, judged nothing",VALIDITY_PASS_SUMMARY:(t,e)=>`L3 validity pass: ${t} decision(s) confirmed alive, ${e} demoted as dead/superseded`,VALIDITY_PASS_FAILED:t=>`L3 validity pass failed (retries on the next sync): ${t}`},ls={START:"sync-knowledge.start",SUMMARY:"sync-knowledge.summary",VALIDITY_PASS:"sync-knowledge.l3-validity-pass"};async function cs(t,e){await De(t,Qd,e)}var Ka="l3ValidityJudgedSha";function Mv(t){if(!t.anchor_ranges)return null;try{let e=JSON.parse(t.anchor_ranges);return!Array.isArray(e)||e.length===0?null:{ranges:e}}catch{return null}}function ZE(t){if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}}function kv(t,e,r){let n=e.get(t.path);if(!n||n.size===0)return!0;for(let i=t.startRow+1;i<=t.endRow+1;i++){let s=n.get(i);if(s&&r.has(s))return!0}return!1}function Gv(t,e,r,n){let i=0,s=0;for(let{row:o,anchors:a}of e){if(!a.ranges.some(p=>n.has(p.path)))continue;let l=new Set([...ZE(o.source_commits),...ZE(o.initial_source_commits),...o.commit_hash?[o.commit_hash]:[]]),c=a.ranges.every(p=>kv(p,r,l)),u=c?tr.ACTIVE:tr.GARBAGE;u!==o.validity_status&&(t.l3.updateValidityStatus(o.id,u),c?i++:s++)}return{activated:i,superseded:s}}async function eS(t){let{workspaceRoot:e,logger:r,store:n,git:i,blame:s}=t,o=await i.getHeadSha(e),a={activated:0,superseded:0,baseline:!1};if(!o)return a;let l=n.meta.get(Ka);if(l===o)return a;if(!l)return n.meta.set(Ka,o),a.baseline=!0,a;let c=n.l3.getAllExportable().map(I=>({row:I,anchors:Mv(I)})).filter(I=>I.anchors!==null&&(I.row.validity_status===tr.PENDING||I.row.validity_status===tr.ACTIVE));if(c.length===0)return n.meta.set(Ka,o),a;let u=new Set(c.flatMap(I=>I.anchors.ranges.map(L=>L.path))),p=new Set((await i.getChangedFilesSince(e,l,"HEAD")).map(I=>I.file)),d=[...u].filter(I=>p.has(I)),f=new Map;for(let I of d)f.set(I,await s.getBlameLineOwners(e,I));let m=new Set(d),_=Gv(n,c,f,m);return a.activated=_.activated,a.superseded=_.superseded,n.meta.set(Ka,o),a}var Ya=class{constructor(e,r,n){this.workspaceRoot=e;this.logger=r;this.gitNetworkTimeoutMs=n}workspaceRoot;logger;gitNetworkTimeoutMs;async execute(){let{workspaceRoot:e,logger:r,gitNetworkTimeoutMs:n}=this;r.info(as.SYNCING),await cs(e,{event:ls.START,workspaceRoot:e});let i=R.resolve(A.KnowledgeGitService,{logger:r,gitNetworkTimeoutMs:n}),s=await i.syncKnowledgeBranch(e);s.branchTipSha&&await this.importL3Cards(i,s.branchTipSha);try{await this.runValidityPass()}catch(o){let a=o instanceof Error?o.message:String(o);r.warn(as.VALIDITY_PASS_FAILED(a)),await cs(e,{event:ls.VALIDITY_PASS,status:"error",error:a})}return await cs(e,{event:ls.SUMMARY,status:s.status,branchTipSha:s.branchTipSha??null}),s}async importL3Cards(e,r){let{workspaceRoot:n,logger:i}=this,s=R.resolve(A.HydrationService,{logger:i}),a=await R.resolve(A.GraphStoreOpener)({dbPath:ie(n),readonly:!1});try{await e.runUnderKnowledgeLock(n,()=>s.importL3Cards(n,r,a))}finally{await a.close()}}async runValidityPass(){let{workspaceRoot:e,logger:r}=this,i=await R.resolve(A.GraphStoreOpener)({dbPath:ie(e),readonly:!1});try{let s=await eS({workspaceRoot:e,logger:r,store:i,git:R.resolve(A.GitProvider),blame:R.resolve(A.LineBlameProvider)});s.baseline?r.info(as.VALIDITY_PASS_BASELINE):r.info(as.VALIDITY_PASS_SUMMARY(s.activated,s.superseded)),await cs(e,{event:ls.VALIDITY_PASS,status:"ok",activated:s.activated,superseded:s.superseded,baseline:s.baseline})}finally{await i.close()}}};var ue={DB_RUNNER:"db_runner",DB_FOUND:"db_found",GRAPH_EMPTY:"graph_empty",POST_COMMIT_INGESTION:"post_commit_ingestion",GIT_REACHABILITY:"git_reachability",GIT_RUNNER:"git_runner",LOGS:"logs",TIER_B_COMMIT_CAP:"tier_b_commit_cap",TIER_B_COVERAGE:"tier_b_coverage",GIT_HOOK:"git_hook",PRE_PUSH_HOOK:"pre_push_hook",LLM_REACHABILITY:"llm_reachability",LSP_BINARY:t=>`lsp_binary_${t}`,AGENT_HOOKS_CLAUDE:"agent_hooks_claude",AGENT_HOOKS_CURSOR:"agent_hooks_cursor",TIER_C_QUEUE:"tier_c_queue",STAGED_L3_DECISIONS:"staged_l3_decisions",L2_SEMANTIC_COVERAGE:"l2_semantic_coverage",WORKTREE_DIVERGENCE:"worktree_divergence",AGENT_AUTHED_ADOPTION:"agent_authored_adoption",CALL_GRAPH_RESOLUTION:"call_graph_resolution",CANARY_SELF_TEST:"canary_self_test"},tS=".log",dd={CLAUDE:"Claude",CURSOR:"Cursor"},k={DB_RUNNER_NOT_REGISTERED:"DiagnosticRunnerDb not registered",DB_NOT_FOUND_AT:t=>`Local database not found at ${t}`,GRAPH_EMPTY:"The knowledge graph is empty (nothing ingested yet) -- staged decisions have no L2 anchor to attach to.",GRAPH_EMPTY_SUGGESTION:"run `docuvia init` first \u2014 decisions need a graph to attach to",GRAPH_EMPTY_OK:t=>`Knowledge graph populated (${t} L2 node(s)).`,POST_COMMIT_INGESTION_OK:t=>`Knowledge graph is up to date with HEAD (Tier C queue: ${t} pending).`,POST_COMMIT_INGESTION_RECENT:(t,e)=>`Delta ingestion is behind HEAD (last ingested ${t?t.slice(0,7):"never"}) but ran recently -- likely still in flight from the post-commit hook (Tier C queue: ${e} pending).`,POST_COMMIT_INGESTION_STALE:t=>`The graph is behind HEAD and no analyze run has completed recently -- the post-commit hook's backgrounded ingestion may not be firing (Tier C queue: ${t} pending).`,POST_COMMIT_INGESTION_STALE_SUGGESTION:"run `docuvia analyze` manually to ingest the pending commits, and check `.docuvia/logs/post-commit-hook.log` for hook failures",GIT_RUNNER_NOT_REGISTERED:"DiagnosticRunnerGit not registered",GIT_NETWORK_TIMEOUT_SUGGESTION:"The Git remote operation timed out (5000ms). Check your internet connection or DNS settings.",GIT_NOT_A_REPO_SUGGESTION:"Ensure this workspace is a valid Git repository and the remote 'origin' is set correctly.",GIT_REMOTE_UNREADABLE_SUGGESTION:"Check your SSH keys, PAT, or Git credentials for the remote repository.",GIT_REACHABILITY_FAILED:t=>`Git remote reachability check failed: ${t}`,GIT_NOT_A_REPO_TEXT:"does not appear to be a git repository",GIT_REMOTE_UNREADABLE_TEXT:"Could not read from remote repository",LOGS_ERRORS_FOUND:t=>`Found ${t} critical errors in logs.`,LOGS_ERRORS_FOUND_SUGGESTION:"Check the files in .docuvia/logs/ for details.",LOGS_CHECKED_CLEAN:t=>`Checked ${t} log files, no critical errors found.`,LOGS_NOT_FOUND_AT:t=>`No logs found at ${t}`,TIER_B_CAP_OK:"Tier B commit-cap not yet reached.",TIER_B_CAP_EXCEEDED:"Changed code since the last Tier B batch has exceeded the cap -- push, or run `docuvia analyze --escalate-to-lsp && docuvia snapshot`, to trigger it.",TIER_B_COVERAGE_OK:(t,e)=>`Tier B coverage: ${t}/${e} files processed.`,TIER_B_COVERAGE_LOW:(t,e,r)=>`Only ${r.toFixed(1)}% of tracked files have ever been Tier B-processed (${t}/${e}) -- query results for the rest may show empty edges that mean "unprocessed", not "no relationships".`,TIER_B_COVERAGE_LOW_SUGGESTION:"Run `docuvia analyze --escalate-to-lsp --full` to resync.",GIT_HOOK_NOT_INSTALLED:"No Docuvia post-commit hook installed.",GIT_HOOK_DUPLICATE:"Duplicate hook blocks detected (both the legacy `docuvia snapshot` and current `docuvia analyze` blocks are present and will both fire on every commit).",GIT_HOOK_DUPLICATE_SUGGESTION:"run `docuvia doctor --fix` to repair",GIT_HOOK_LEGACY_ONLY:"The post-commit hook is still running the legacy `docuvia snapshot` command, which no longer performs Tier A delta ingestion.",GIT_HOOK_LEGACY_ONLY_SUGGESTION:"re-run `docuvia init` to upgrade the hook",GIT_HOOK_FLUSH_STALE:"The post-commit hook predates the commit-l3-write flush step -- staged agent-authored L3 decisions would never be flushed into the graph.",GIT_HOOK_FLUSH_STALE_SUGGESTION:"re-run `docuvia init` to upgrade the hook",GIT_HOOK_NOT_RESOLVABLE:"The post-commit hook is installed but `docuvia` is not resolvable from this workspace (the `npx --no-install` invocation would silently no-op on every commit).",GIT_HOOK_NOT_RESOLVABLE_SUGGESTION:"reinstall Docuvia as a project dependency, or check PATH",GIT_HOOK_RESOLVABLE:t=>`Post-commit hook is installed and \`docuvia\` resolves (${t}).`,GIT_HOOK_REPAIRED_NOTE:" Repaired via `doctor --fix` -- re-run `doctor` to confirm.",PRE_PUSH_HOOK_NOT_INSTALLED:"No Docuvia pre-push hook installed.",PRE_PUSH_HOOK_STALE:"The pre-push hook predates the `sync-knowledge` step -- pushes no longer reconcile the knowledge branch with origin.",PRE_PUSH_HOOK_STALE_SUGGESTION:"re-run `docuvia init` to upgrade the hook",PRE_PUSH_HOOK_ENV_GATE_STALE:"The pre-push hook predates the --fallback-ast env-gate flag -- its Tier B step will fail (skipping snapshot/sync-knowledge for that push) whenever the LSP environment isn't ready.",PRE_PUSH_HOOK_HOOKS_CHECK_STALE:"The pre-push hook predates the `hooks check` gate -- its Tier B/snapshot/sync-knowledge chain would run even when `tier-b-c-prepush` is disabled via `docuvia hooks disable`.",PRE_PUSH_HOOK_FAILURE_HINT_STALE:"The pre-push hook predates the Tier B/sync failure hint -- Tier B/C failures stay silent at push time (only in JSONL logs).",PRE_PUSH_HOOK_OK:t=>`Pre-push hook is installed and includes the sync-knowledge step (${t}).`,PRE_PUSH_HOOK_NOT_RESOLVABLE:"The pre-push hook is installed but `docuvia` is not resolvable from this workspace (the `npx --no-install` invocation would silently no-op on every push -- Tier B and sync-knowledge never actually run).",PRE_PUSH_HOOK_REPAIRED_NOTE:" Repaired via `doctor --fix` -- re-run `doctor` to confirm.",LLM_NOT_CONFIGURED:"Not configured -- Tier C is inactive (AI_DOCUVIA_INTEGRATIONS_OPENAI_BASE_URL or AI_DOCUVIA_MODEL not set).",LLM_REACHABLE:"Tier C LLM bridge is reachable and accepts the configured API key.",LLM_UNREACHABLE:t=>`Tier C LLM bridge is configured but unreachable or rejecting requests: ${t}`,LLM_UNREACHABLE_SUGGESTION:"Check that the CLIProxyAPI bridge is running, that its /v1/chat/completions route accepts the configured API key, and that AI_DOCUVIA_INTEGRATIONS_OPENAI_BASE_URL points at it.",TIER_C_QUEUE_OK:(t,e)=>`Tier C queue: ${t} pending, last drain processed ${e} item(s).`,TIER_C_QUEUE_STUCK:(t,e)=>`Tier C queue is stuck (${t} pending; last drain processed 0, reason: ${e}) -- the LLM bridge path analyze dials is not working, so L2 descriptions/validated edges will never be backfilled.`,TIER_C_QUEUE_STUCK_SUGGESTION:"Check that the CLIProxyAPI bridge is running and its /v1/chat/completions route accepts the configured API key, then run `docuvia analyze --escalate-to-lsp` to retry the drain",TIER_C_QUEUE_NEVER_DRAINED:t=>`Tier C queue has ${t} pending item(s) but no drain has ever completed -- either never enqueued-to-drained or permanently stuck from the start.`,TIER_C_QUEUE_NEVER_DRAINED_SUGGESTION:"Run `docuvia analyze --escalate-to-lsp` once so the drain path actually executes, and check `.docuvia/logs/analyze.log` for tierC events",STAGED_L3_OK:t=>t===0?"No agent-authored decisions waiting in the staging file.":`${t} staged agent-authored decision(s) waiting, none older than the staging window.`,STAGED_L3_STRANDED:(t,e,r)=>`${t} agent-authored decision(s) stranded in the staging file -- the oldest has waited ${e} day(s), anchored to \`${r}\`. \`--stage\` only flushes when a later commit's diff contains that exact file, so these will never land on their own.`,STAGED_L3_STRANDED_SUGGESTION:"Write them directly with `docuvia analyze <file> --agent-authored` (the default path -- it lands in one pass, no LLM call, no scheduling), then clear `.docuvia/pending-l3-decisions.json`",L2_SEMANTIC_COVERAGE_OK:(t,e)=>`L2 semantic coverage: ${t}/${e} node(s) carry a description.`,L2_SEMANTIC_COVERAGE_LOW:(t,e,r)=>`Only ${r.toFixed(1)}% of L2 nodes carry a description (${t}/${e}) -- the knowledge graph is structurally correct but semantically empty, so query/impact results surface little "why" content.`,L2_SEMANTIC_COVERAGE_LOW_SUGGESTION:"Run `docuvia analyze --escalate-to-lsp` (Tier C) so the LLM enrichment pass can backfill descriptions, or explicitly declare the graph structural-only",L2_SEMANTIC_COVERAGE_STRUCTURAL_ONLY:(t,e)=>`L2 semantic coverage: ${t}/${e} node(s) carry a description (structural-only graph -- Tier C LLM enrichment is not configured, so descriptions cannot be written yet).`,WORKTREE_DIVERGENCE_OK:t=>`${t} worktree(s) total; no sibling worktree carries its own .docuvia graph.`,WORKTREE_DIVERGENCE_FAIL:(t,e)=>`${t} sibling worktree(s) carry their own .docuvia/local.db -- ${e.join(", ")}: per-worktree knowledge graphs that never reconcile (decisions staged in one worktree never reach the others).`,WORKTREE_DIVERGENCE_SUGGESTION:"Point all worktrees at one graph via a shared DOCUVIA_DB_PATH (or a symlinked .docuvia), or run `docuvia sync-knowledge` from a canonical worktree before pushing",AGENT_AUTHED_ADOPTION_OK:(t,e,r,n)=>`Agent-authored decisions: ${n} flushed in graph, ${t} staged pending flush; ${r} of ${e} recently-changed file(s) carry no staged decision.`,AGENT_AUTHED_ADOPTION_SKIPPED:"No recently-changed files to evaluate for agent-authored staging.",LSP_BINARY_AVAILABLE:t=>`LSP-precision edges available (${t} resolved).`,LSP_BINARY_UNAVAILABLE:t=>`LSP-precision edges unavailable (${t}).`,LSP_BINARY_UNAVAILABLE_SUGGESTION:"Build/compile the project so the language server can resolve it (install dependencies, restore/build for compiled languages), then re-run `docuvia doctor`.",AGENT_HOOKS_FOUND:t=>`${t} hooks found.`,AGENT_HOOKS_NOT_FOUND:t=>`${t} hooks not found (run \`docuvia init\` to install).`,CALL_GRAPH_RESOLUTION_NO_DATA:"No call-site resolution data recorded yet (run `docuvia analyze` to populate it).",CALL_GRAPH_RESOLUTION_OK:(t,e,r)=>`Call-graph resolution: ${t}/${e} applicable call site(s) resolved into calls edges across ${r} ingested file(s).`,CALL_GRAPH_RESOLUTION_LOW:(t,e,r,n)=>`Call-graph resolution is low: only ${r.toFixed(1)}% of applicable call sites resolved into calls edges (${t}/${e} across ${n} file(s)) -- impact results in these areas may understate real dependents ("no dependents" can mean "unresolved", not "safe").`,CALL_GRAPH_RESOLUTION_LOW_SUGGESTION:"Run `docuvia analyze --escalate-to-lsp --full` to let Tier B LSP edge resolution recover the unresolved call sites.",CANARY_SELF_TEST_OK:t=>`Graph self-test passed: ${t} sampled node(s) resolved via exact-name lookup; the FTS index answered a known-present token.`,CANARY_SELF_TEST_LOOKUP_FAIL:(t,e)=>`Graph self-test FAILED: ${t} of ${e} sampled l2_nodes row(s) could not be resolved by exact-name lookup -- rows exist that query/impact can never find.`,CANARY_SELF_TEST_FTS_FAIL:t=>`Graph self-test FAILED: FTS search for known-indexed token "${t}" returned 0 rows while l2_nodes holds data -- the FTS index is out of sync with l2_nodes.`,CANARY_SELF_TEST_FAIL_SUGGESTION:"Run `docuvia analyze --full` to rebuild the local graph from the working tree (or `docuvia hydrate --force` to re-pull it from the knowledge branch)."};async function rS(t,e,r){let n=R.resolve(A.EdgeResolutionProviders,{logger:e}),i=await pd(t,n),s=[];for(let o of i){let a=n[o];if(!a)continue;let l=a();r&&l.configure(r);let c=await l.checkAvailability(t);c.available||s.push(c)}return s.length===0?{available:!0}:i.length>0&&s.length===i.length?s.length===1?s[0]:{available:!1,reason:s.map(o=>o.reason??"").join("; ")}:{available:!0}}async function pd(t,e){if(!R.has(A.GraphStoreOpener))return Object.keys(e);let r;try{r=await R.resolve(A.GraphStoreOpener)({dbPath:ie(t),readonly:!0});let i=ts(r),s=new Set;for(let o of i){let a=rd(o.file);a&&s.add(a)}return Array.from(s)}catch{return Object.keys(e)}finally{await r?.close()}}import{existsSync as xv}from"fs";import*as gd from"path";import{execFile as Uv}from"child_process";import{promisify as Hv}from"util";var Bv=Hv(Uv),Kv=5e3,Yv="npx",$v="--no-install",fd="docuvia",Wv=[".cmd",".CMD",".exe",""],nS="docuvia doctor";function jv(t){let e=gd.join(t,"node_modules",".bin");return(process.platform==="win32"?Wv.map(n=>`${fd}${n}`):[fd]).some(n=>xv(gd.join(e,n)))}function iS(t){if(!t||typeof t!="object")return"";let{stdout:e,stderr:r}=t;return`${e??""}${r??""}`}async function Vv(t){try{let e=await Bv(Yv,[$v,fd],{cwd:t,timeout:Kv});return iS(e).includes(nS)}catch(e){return iS(e).includes(nS)}}async function hd(t){return jv(t)?!0:Vv(t)}import*as At from"path";import*as er from"fs/promises";var $a=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async execute(e={}){let{skipDb:r=!1,skipGit:n=!1,skipLogs:i=!1,skipHooks:s=!1,skipLsp:o=!1,skipLlm:a=!1,fix:l=!1,llmBaseUrl:c,llmApiKey:u,llmModel:p}=e,d={},f=[await this.runOrSkip(r,()=>this.runDbDiagnostics(d)),await this.runOrSkip(n,()=>this.runGitDiagnostics(d)),await this.runOrSkip(i,()=>this.runLogsDiagnostics(d)),await this.runOrSkip(n,()=>this.runGitHookDiagnostic(d,l)),await this.runOrSkip(n,()=>this.runPrePushHookDiagnostic(d,l)),await this.runOrSkip(a,()=>this.runLlmReachabilityDiagnostic(d,c,u,p)),await this.runOrSkip(o,()=>this.runLspBinaryDiagnostic(d)),await this.runOrSkip(r,()=>this.runTierBCoverageDiagnostic(d)),await this.runOrSkip(r,()=>this.runGraphEmptyDiagnostic(d)),await this.runOrSkip(r||n,()=>this.runPostCommitIngestionDiagnostic(d)),...await this.runGraphHealthDiagnostics(d,r,n,c)];return await this.runOrSkip(r,()=>this.runTierBCommitCapDiagnostic(d)),await this.runOrSkip(s,()=>this.runAgentHooksDiagnostic(d)),{allPassed:f.every(Boolean),diagnostics:d}}async runOrSkip(e,r){if(e)return!0;let n=await r();return n===void 0?!0:!!n}async runGraphHealthDiagnostics(e,r,n,i){return[await this.runOrSkip(r,()=>this.runTierCQueueDiagnostic(e)),await this.runOrSkip(r,()=>this.runL2SemanticCoverageDiagnostic(e,i)),await this.runStagedL3Diagnostic(e),await this.runOrSkip(n,()=>this.runWorktreeDivergenceDiagnostic(e)),await this.runOrSkip(r||n,()=>this.runAgentAuthoredAdoptionDiagnostic(e)),await this.runOrSkip(r,()=>this.runCallGraphResolutionDiagnostic(e)),await this.runOrSkip(r,()=>this.runCanarySelfTestDiagnostic(e))]}async runCanarySelfTestDiagnostic(e){if(!R.has(A.GraphStoreOpener))return!0;let r;try{r=await R.resolve(A.GraphStoreOpener)({dbPath:ie(this.workspaceRoot),readonly:!0});let i=r.graph.getCanarySample(E.DEFAULT_CANARY_SAMPLE_SIZE);if(i.length===0)return!0;let s=i.filter(({name:a})=>!r?.graph.findNodeByName(a));if(s.length>0)return e[ue.CANARY_SELF_TEST]={status:Y.FAIL,message:k.CANARY_SELF_TEST_LOOKUP_FAIL(s.length,i.length),suggestion:k.CANARY_SELF_TEST_FAIL_SUGGESTION},!1;let o;for(let{name:a}of i)if(o=a.split(/[^A-Za-z0-9]+/).filter(Boolean).reduce((c,u)=>u.length>=3&&u.length>c.length?u:c,""),o)break;return o&&r.fts.searchL2Nodes([o],10).length===0?(e[ue.CANARY_SELF_TEST]={status:Y.FAIL,message:k.CANARY_SELF_TEST_FTS_FAIL(o),suggestion:k.CANARY_SELF_TEST_FAIL_SUGGESTION},!1):(e[ue.CANARY_SELF_TEST]={status:Y.PASS,message:k.CANARY_SELF_TEST_OK(i.length)},!0)}catch{return!0}finally{await r?.close()}}async runGitHookDiagnostic(e,r){if(!R.has(A.GitProvider))return!0;try{let n=R.resolve(A.GitProvider),i=await n.readHookFile(this.workspaceRoot,E.POST_COMMIT_HOOK_NAME),s=!!i?.includes(E.POST_COMMIT_HOOK_MARKER),o=!!i?.includes(E.LEGACY_POST_COMMIT_HOOK_MARKER),a=!!i?.includes(E.POST_COMMIT_FLUSH_L3_MARKER),l=await this.classifyGitHookState(n,s,o,a);return l=await this.repairGitHookIfRequested(r,l,s,o,a),e[ue.GIT_HOOK]=l,l.status===Y.PASS}catch{return!0}}async repairGitHookIfRequested(e,r,n,i,s){return e?n&&i?this.repairDuplicateGitHookIfRequested(r):r.status===Y.FAIL&&!s?this.repairStaleGitHookIfRequested(r):r:r}async repairStaleGitHookIfRequested(e){if(!R.has(A.KnowledgeGitService))return e;let r=R.resolve(A.KnowledgeGitService,{logger:this.logger}),{installed:n}=await r.installPostCommitHook(this.workspaceRoot);return n?{...e,message:e.message+k.GIT_HOOK_REPAIRED_NOTE}:e}async classifyGitHookState(e,r,n,i){if(!r&&!n)return{status:Y.PASS,message:k.GIT_HOOK_NOT_INSTALLED};if(r&&n)return{status:Y.FAIL,message:k.GIT_HOOK_DUPLICATE,suggestion:k.GIT_HOOK_DUPLICATE_SUGGESTION};if(n)return{status:Y.FAIL,message:k.GIT_HOOK_LEGACY_ONLY,suggestion:k.GIT_HOOK_LEGACY_ONLY_SUGGESTION};if(!i)return{status:Y.FAIL,message:k.GIT_HOOK_FLUSH_STALE,suggestion:k.GIT_HOOK_FLUSH_STALE_SUGGESTION};if(!await hd(this.workspaceRoot))return{status:Y.FAIL,message:k.GIT_HOOK_NOT_RESOLVABLE,suggestion:k.GIT_HOOK_NOT_RESOLVABLE_SUGGESTION};let o=await e.resolveHooksDir(this.workspaceRoot);return{status:Y.PASS,message:k.GIT_HOOK_RESOLVABLE(At.join(o,E.POST_COMMIT_HOOK_NAME))}}async repairDuplicateGitHookIfRequested(e){if(!R.has(A.KnowledgeGitService))return e;let r=R.resolve(A.KnowledgeGitService,{logger:this.logger}),{repaired:n}=await r.repairDuplicatePostCommitHook(this.workspaceRoot);return n?{...e,message:e.message+k.GIT_HOOK_REPAIRED_NOTE}:e}async runPrePushHookDiagnostic(e,r){if(!R.has(A.GitProvider))return!0;try{let n=R.resolve(A.GitProvider),i=await n.readHookFile(this.workspaceRoot,E.PRE_PUSH_HOOK_NAME),s=!!i?.includes(E.PRE_PUSH_HOOK_MARKER),o=!!i?.includes(E.PRE_PUSH_SYNC_KNOWLEDGE_MARKER),a=!!i?.includes(E.PRE_PUSH_ENV_GATE_MARKER),l=!!i?.includes(E.PRE_PUSH_HOOKS_CHECK_MARKER),c=!!i?.includes(E.PRE_PUSH_FAILURE_HINT_MARKER),u=await this.classifyPrePushHookState(n,s,o,a,l,c);return u=await this.repairPrePushHookIfRequested(r,u,s,o,a,l,c),e[ue.PRE_PUSH_HOOK]=u,u.status===Y.PASS}catch{return!0}}async repairPrePushHookIfRequested(e,r,n,i,s,o,a){return!e||!n||i&&s&&o&&a?r:this.repairStalePrePushHookIfRequested(r)}async repairStalePrePushHookIfRequested(e){if(!R.has(A.KnowledgeGitService))return e;let r=R.resolve(A.KnowledgeGitService,{logger:this.logger}),{installed:n}=await r.installPrePushHook(this.workspaceRoot);return n?{...e,message:e.message+k.PRE_PUSH_HOOK_REPAIRED_NOTE}:e}async classifyPrePushHookState(e,r,n,i,s,o){if(!r)return{status:Y.PASS,message:k.PRE_PUSH_HOOK_NOT_INSTALLED};if(!n)return{status:Y.FAIL,message:k.PRE_PUSH_HOOK_STALE,suggestion:k.PRE_PUSH_HOOK_STALE_SUGGESTION};if(!i)return{status:Y.FAIL,message:k.PRE_PUSH_HOOK_ENV_GATE_STALE,suggestion:k.PRE_PUSH_HOOK_STALE_SUGGESTION};if(!s)return{status:Y.FAIL,message:k.PRE_PUSH_HOOK_HOOKS_CHECK_STALE,suggestion:k.PRE_PUSH_HOOK_STALE_SUGGESTION};if(!o)return{status:Y.FAIL,message:k.PRE_PUSH_HOOK_FAILURE_HINT_STALE,suggestion:k.PRE_PUSH_HOOK_STALE_SUGGESTION};if(!await hd(this.workspaceRoot))return{status:Y.FAIL,message:k.PRE_PUSH_HOOK_NOT_RESOLVABLE,suggestion:k.GIT_HOOK_NOT_RESOLVABLE_SUGGESTION};let l=await e.resolveHooksDir(this.workspaceRoot);return{status:Y.PASS,message:k.PRE_PUSH_HOOK_OK(At.join(l,E.PRE_PUSH_HOOK_NAME))}}async runLlmReachabilityDiagnostic(e,r,n,i){if(!r||!i)return e[ue.LLM_REACHABILITY]={status:Y.PASS,message:k.LLM_NOT_CONFIGURED},!0;if(!R.has(A.LlmClient))return!0;try{let o=R.resolve(A.LlmClient)();o.initialize({baseUrl:r,apiKey:n});let a=await o.checkBridgeReachability(i);return a.available?(e[ue.LLM_REACHABILITY]={status:Y.PASS,message:k.LLM_REACHABLE},!0):(e[ue.LLM_REACHABILITY]={status:Y.FAIL,message:k.LLM_UNREACHABLE(a.reason??""),suggestion:k.LLM_UNREACHABLE_SUGGESTION},!1)}catch{return!0}}async runLspBinaryDiagnostic(e){if(!R.has(A.EdgeResolutionProviders))return!0;try{let r=R.resolve(A.EdgeResolutionProviders,{logger:this.logger}),n=await pd(this.workspaceRoot,r),i=!0;for(let s of n){let o=r[s];if(!o)continue;let a=o(),l=await a.checkAvailability(this.workspaceRoot);e[ue.LSP_BINARY(s)]=l.available?{status:Y.PASS,message:k.LSP_BINARY_AVAILABLE(a.name)}:{status:Y.FAIL,message:k.LSP_BINARY_UNAVAILABLE(l.reason??""),suggestion:k.LSP_BINARY_UNAVAILABLE_SUGGESTION},l.available||(i=!1)}return i}catch{return!0}}async runAgentHooksDiagnostic(e){let r=[{key:ue.AGENT_HOOKS_CLAUDE,dir:vn,filename:Tr,platformName:dd.CLAUDE},{key:ue.AGENT_HOOKS_CURSOR,dir:bn,filename:Ar,platformName:dd.CURSOR}];for(let{key:n,dir:i,filename:s,platformName:o}of r){let a=At.join(this.workspaceRoot,i,s),l;try{await er.stat(a),l=!0}catch{l=!1}e[n]={status:Y.PASS,message:l?k.AGENT_HOOKS_FOUND(o):k.AGENT_HOOKS_NOT_FOUND(o)}}}async runTierBCommitCapDiagnostic(e){if(!R.has(A.GraphStoreOpener))return;let r;try{r=await R.resolve(A.GraphStoreOpener)({dbPath:ie(this.workspaceRoot),readonly:!0});let i=li(r);e[ue.TIER_B_COMMIT_CAP]={status:Y.PASS,message:i?k.TIER_B_CAP_EXCEEDED:k.TIER_B_CAP_OK}}catch{}finally{await r?.close()}}async runTierBCoverageDiagnostic(e){if(!R.has(A.GraphStoreOpener))return!0;let r;try{r=await R.resolve(A.GraphStoreOpener)({dbPath:ie(this.workspaceRoot),readonly:!0});let{totalFiles:i,processedFiles:s}=r.files.getTierBCoverage(),o=i>0?s/i:1,a=o<E.DEFAULT_TIER_B_COVERAGE_FAIL_THRESHOLD;return e[ue.TIER_B_COVERAGE]=a?{status:Y.FAIL,message:k.TIER_B_COVERAGE_LOW(s,i,o*100),suggestion:k.TIER_B_COVERAGE_LOW_SUGGESTION}:{status:Y.PASS,message:k.TIER_B_COVERAGE_OK(s,i)},!a}catch{return!0}finally{await r?.close()}}async runGraphEmptyDiagnostic(e){if(!R.has(A.GraphStoreOpener))return!0;let r;try{r=await R.resolve(A.GraphStoreOpener)({dbPath:ie(this.workspaceRoot),readonly:!0});let i=r.projects.getFirst(),{l2Nodes:s}=r.graph.count(),o=!i||s===0;return e[ue.GRAPH_EMPTY]=o?{status:Y.FAIL,message:k.GRAPH_EMPTY,suggestion:k.GRAPH_EMPTY_SUGGESTION}:{status:Y.PASS,message:k.GRAPH_EMPTY_OK(s)},!o}catch{return!0}finally{await r?.close()}}async runPostCommitIngestionDiagnostic(e){if(!R.has(A.GraphStoreOpener)||!R.has(A.GitProvider))return!0;let r;try{let n=R.resolve(A.GitProvider);r=await R.resolve(A.GraphStoreOpener)({dbPath:ie(this.workspaceRoot),readonly:!0});let s=await n.getHeadSha(this.workspaceRoot);if(!s)return!0;let o=r.meta.get(E.META_KEY_LAST_INGESTED_SOURCE_SHA),a=Zt(r).length;if(o===s)return e[ue.POST_COMMIT_INGESTION]={status:Y.PASS,message:k.POST_COMMIT_INGESTION_OK(a)},!0;let l=await this.hasRecentAnalyzeActivity();return e[ue.POST_COMMIT_INGESTION]=l?{status:Y.PASS,message:k.POST_COMMIT_INGESTION_RECENT(o,a)}:{status:Y.FAIL,message:k.POST_COMMIT_INGESTION_STALE(a),suggestion:k.POST_COMMIT_INGESTION_STALE_SUGGESTION},l}catch{return!0}finally{await r?.close()}}async hasRecentAnalyzeActivity(){let e=At.join(this.workspaceRoot,he,Er,Si),r;try{r=await er.readFile(e,K)}catch{return!1}let n=E.DEFAULT_POST_COMMIT_INGESTION_GRACE_MS,i=Date.now(),s=r.split(`
165
+ `),u=R.resolve(A.LlmClient)();u.initialize({baseUrl:i.llmBaseUrl,apiKey:i.llmApiKey});let p;try{p=await u.chatCompletion({model:i.llmModel,temperature:.2,messages:[{role:_r.SYSTEM,content:nE},{role:_r.USER,content:l}]})}catch(I){let L=I instanceof Error?I.message:String(I);throw await V(r,{event:j.FOCUSED_ERROR,targetPath:e,message:L}),I}let d=p.choices[0]?.message.content,f=Ra(d);if(f===void 0){let I=Q.LLM_NON_JSON_OUTPUT;throw await V(r,{event:j.FOCUSED_ERROR,targetPath:e,message:I}),new S(O.LLM_INVALID_RESPONSE,I)}let{persisted:m,deduped:_}=await this.persistDecisions(s,o,f);return await V(r,{event:j.FOCUSED_SUMMARY,targetPath:e,decisionsCount:f.length}),{kind:$e.DECISION_EXTRACTION,targetPath:e,decisions:f,persisted:m,deduped:_}}async persistDecisions(e,r,n){let{workspaceRoot:i,logger:s,options:o}=this;return ci({workspaceRoot:i,logger:s,resolvedTargetPath:e,files:r,decisions:n,source:wt.ANALYZE,extractionModel:o?.llmModel??null})}};async function Pv(t,e,r){let i=(await t.getCommitLog(e,E.KNOWLEDGE_ROOT,E.KNOWLEDGE_LOG_SCAN_LIMIT)).find(s=>s.sha===r);return i?ir(i.message):void 0}function Dv(t){return{providerConfig:t?.lspProviderConfig,commitCap:t?.tierBCommitCap,llmBaseUrl:t?.llmBaseUrl,llmApiKey:t?.llmApiKey,llmModel:t?.llmModel,full:t?.full}}function vv(t){return{tierCDailyCallCap:t?.tierCDailyCallCap,tierCDailyTokenCap:t?.tierCDailyTokenCap,tierCWallClockMs:t?.tierCWallClockMs,tierCItemCap:t?.tierCItemCap,tierCLoadThreshold:t?.tierCLoadThreshold,tierCDrainAll:t?.tierCDrainAll}}function bv(t,e,r,n,i,s){return{workspaceRoot:t,logger:e,store:r,git:n,knowledgeGit:i,...Dv(s),...vv(s),force:s?.force}}var Ia={DETECTING_CHANGES:"Detecting changes...",DB_NOT_FOUND:'Local database not found. Please run "docuvia init".'},La={START:"review.start",ERROR:"review.error",SUMMARY:"review.summary"};async function Na(t,e){await De(t,Wd,e)}var Ca=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async execute(e){let{workspaceRoot:r,logger:n}=this;n.info(Ia.DETECTING_CHANGES),await Na(r,{event:La.START,baseRef:e??null});let o=(await R.resolve(A.GitProvider).getChangedFilesSince(r,e)).map(c=>({file:c.file,status:c.status}));await Yr(r,n);let a=R.resolve(A.GraphStoreOpener),l;try{l=await a({dbPath:ie(r),readonly:!0})}catch(c){throw c instanceof S&&c.code===O.DB_NOT_FOUND?(await Na(r,{event:La.ERROR,message:Ia.DB_NOT_FOUND}),new S(O.DB_NOT_FOUND,Ia.DB_NOT_FOUND,c)):c}try{let u=R.resolve(A.ChangeDetectionService,{logger:n}).detectChanges({store:l,baseRef:e??null,filesChanged:o});return await Na(r,{event:La.SUMMARY,baseRef:e??null,riskLevel:u.riskLevel,filesChanged:u.filesChanged.length,affectedNodes:u.affectedNodes.length}),u}finally{await l.close()}}};var Dt={RESOLVING:"Resolving blast radius...",DB_NOT_FOUND:'Local database not found. Please run "docuvia init".',REGISTRY_MEDIATED_COVERAGE_NOTE:'This symbol is resolved through the docuviaFactory/TOKENS registry -- the static edge graph does not model registry-mediated dependencies, so a "no dependents" result may be incomplete.',RISK_NOTE_EMPTY_WITH_PARTIAL_COVERAGE:(t,e)=>`No dependents found, but only ${t} of ${e} workspace files have been analyzed -- this is UNKNOWN, not confirmed zero. Run "docuvia analyze" for fuller coverage.`,RISK_NOTE_EMPTY_STATIC_EDGES_ONLY:"No static dependents found. The edge graph models calls/extends/implements only -- runtime-variable imports, computed import() specifiers, and child_process spawns are invisible, so absence of edges is not evidence of no dependents.",RISK_NOTE_EMPTY_LOW_RESOLUTION:(t,e)=>`No static dependents found, but only ${t} of ${e} call sites in this symbol's own file resolved into edges during ingestion -- dependents calling it from here may be missing from the graph. Run "docuvia analyze --escalate-to-lsp --full" to recover them.`,RISK_NOTE_PARTIAL_COVERAGE_NON_EMPTY:(t,e)=>`Only ${t} of ${e} workspace files have been analyzed -- this result may be missing dependents from unprocessed files.`},ss={START:"impact.start",ERROR:"impact.error",SUMMARY:"impact.summary"};async function os(t,e){await De(t,jd,e)}function wv(t,e,r,n){return t===void 0||e===void 0||t<e?Dt.RISK_NOTE_EMPTY_WITH_PARTIAL_COVERAGE(t??0,e??0):r?Dt.REGISTRY_MEDIATED_COVERAGE_NOTE:n&&n.applicable>=E.DEFAULT_CALL_RESOLUTION_MIN_SAMPLE&&n.resolved/n.applicable<E.DEFAULT_CALL_RESOLUTION_NOTE_THRESHOLD?Dt.RISK_NOTE_EMPTY_LOW_RESOLUTION(n.resolved,n.applicable):Dt.RISK_NOTE_EMPTY_STATIC_EDGES_ONLY}function zE(t){let{blastRadiusCount:e,computedRiskLevel:r,workspaceFilesProcessed:n,workspaceFilesTotal:i,registryMediated:s}=t;return e===0?{riskLevel:je.UNKNOWN,epistemic:hl.LOWER_BOUND,riskNote:wv(n,i,s,t.targetFileResolution)}:n===void 0||i===void 0||n<i?{riskLevel:r,epistemic:hl.LOWER_BOUND,riskNote:Dt.RISK_NOTE_PARTIAL_COVERAGE_NON_EMPTY(n??0,i??0)}:{riskLevel:r}}function JE(t,e){if(t)return e===Dt.REGISTRY_MEDIATED_COVERAGE_NOTE?void 0:Dt.REGISTRY_MEDIATED_COVERAGE_NOTE}import*as qE from"path";import*as QE from"fs/promises";var Pa=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async execute(e){let{workspaceRoot:r,logger:n}=this;n.info(Dt.RESOLVING),await os(r,{event:ss.START,target:e}),await Yr(r,n);let i=R.resolve(A.GraphStoreOpener),s;try{s=await i({dbPath:ie(r),readonly:!0})}catch(o){throw o instanceof S&&o.code===O.DB_NOT_FOUND?(await os(r,{event:ss.ERROR,target:e,message:Dt.DB_NOT_FOUND}),new S(O.DB_NOT_FOUND,Dt.DB_NOT_FOUND,o)):o}try{let o=R.resolve(A.ImpactService,{logger:n}),a=o.getBlastRadius(s,e);if(!a)return await os(r,{event:ss.SUMMARY,target:e,found:!1,blastRadiusCount:0,riskLevel:null}),null;let l=o.computeRiskLevel(s,a.length);return await os(r,{event:ss.SUMMARY,target:e,found:!0,blastRadiusCount:a.length,riskLevel:l}),{blastRadius:a,...await this.resolveEpistemicFields(s,e,a.length,l)}}finally{await s.close()}}async resolveEpistemicFields(e,r,n,i){let{tierBCoverage:s,registryMediated:o,targetFileResolution:a}=await this.resolveTargetContext(e,r,n),l=e.files.getTierBCoverage(),c=zE({blastRadiusCount:n,computedRiskLevel:i,workspaceFilesProcessed:l?.processedFiles,workspaceFilesTotal:l?.totalFiles,registryMediated:o,targetFileResolution:a}),u=l!=null&&l.totalFiles>0&&l.processedFiles<l.totalFiles,p=JE(o,c.riskNote);return{riskLevel:c.riskLevel,...c.epistemic?{epistemic:c.epistemic}:{},...c.riskNote?{riskNote:c.riskNote}:{},...p?{coverageNote:p}:{},...s?{tierBCoverage:s}:{},...u?{partialCoverage:!0}:{}}}async resolveTargetContext(e,r,n){let i=e.graph.findNodeByName(r),s=R.resolve(A.TierBCoverageHintProvider).resolve(e,i?.filePath,n===0,!1),o=n===0&&!!i?.filePath&&await this.fileUsesFactoryRegistry(i.filePath),a;if(i?.filePath){let l=ua(e)[i.filePath];l&&(a={resolved:l.resolved,applicable:l.total-l.selfDiscarded})}return{tierBCoverage:s,registryMediated:o,targetFileResolution:a}}async fileUsesFactoryRegistry(e){let r;try{r=await QE.readFile(qE.join(this.workspaceRoot,e),K)}catch{return!1}return/docuviaFactory|TOKENS\./.test(r)}};var Da={QUERYING:"Querying local knowledge graph...",DB_NOT_FOUND:'Local database not found. Please run "docuvia init".'},va={START:"query.start",ERROR:"query.error",SUMMARY:"query.summary"};async function ba(t,e){await De(t,Vd,e)}var wa=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async execute(e,r){let{workspaceRoot:n,logger:i}=this;i.info(Da.QUERYING),await ba(n,{event:va.START,target:e}),await Yr(n,i);let s=R.resolve(A.GraphStoreOpener),o;try{o=await s({dbPath:ie(n),readonly:!0})}catch(a){throw a instanceof S&&a.code===O.DB_NOT_FOUND?(await ba(n,{event:va.ERROR,target:e,message:Da.DB_NOT_FOUND}),new S(O.DB_NOT_FOUND,Da.DB_NOT_FOUND,a)):a}try{let l=R.resolve(A.QueryService,{logger:i}).query(o,e,r),c=!!l.l2||l.l3.length>0||!!l.context;return await ba(n,{event:va.SUMMARY,target:e,found:c}),l}finally{await o.close()}}};var Fa={EXPORTING:"Exporting topology...",DB_NOT_FOUND:'Local database not found. Please run "docuvia init".'},Ma={START:"export-topology.start",ERROR:"export-topology.error",SUMMARY:"export-topology.summary"};async function ka(t,e){await De(t,zd,e)}var Ga=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async execute(e={}){let{workspaceRoot:r,logger:n}=this;n.info(Fa.EXPORTING),await ka(r,{event:Ma.START,collapse:e.collapse??null});let i=R.resolve(A.GraphStoreOpener),s;try{s=await i({dbPath:ie(r),readonly:!0})}catch(o){throw o instanceof S&&o.code===O.DB_NOT_FOUND?(await ka(r,{event:Ma.ERROR,message:Fa.DB_NOT_FOUND}),new S(O.DB_NOT_FOUND,Fa.DB_NOT_FOUND,o)):o}try{let a=R.resolve(A.TopologyBuilder,{logger:n}).build({workspaceRoot:r,l2Rows:s.graph.getAllNodes(),linkRows:s.graph.getAllLinks(),l3Rows:s.l3.getAllExportable(),tagRows:s.tags.getAllTagLinks()},e);return await ka(r,{event:Ma.SUMMARY,nodeCount:a.stats.nodeCount,linkCount:a.stats.linkCount,groupCount:a.stats.groupCount,collapsed:a.collapsed}),a}finally{await s.close()}}};async function On(t,e){await De(t,Jd,e)}function Fv(t){if(t)try{let e=JSON.parse(t);return typeof e.headSha!="string"||!Array.isArray(e.remainingQueue)?void 0:e}catch{return}}async function XE(t,e){let r=R.resolve(A.GraphStoreOpener),n=R.resolve(A.KnowledgeGitService,{logger:e}),i=await r({dbPath:ie(t),readonly:!1});try{i.meta.get("tierCProcessedThisRun")==="true"&&await i.withWriteLock(()=>{i.meta.set("tierCProcessedThisRun","")});let s=Fv(i.meta.get(E.META_KEY_TIER_B_BATCH_PENDING));if(!s)return;await n.runUnderKnowledgeLock(t,async()=>{await i.withWriteLock(()=>{i.meta.set(E.META_KEY_TIER_B_QUEUE,JSON.stringify(s.remainingQueue)),i.meta.set(E.META_KEY_LAST_TIER_B_BATCH_SHA,s.headSha),i.meta.set(E.META_KEY_TIER_B_CHANGED_BYTES,"0"),i.meta.set(E.META_KEY_TIER_B_BATCH_PENDING,"")})}),await On(t,{event:ii.TIER_B_FINALIZED,headSha:s.headSha,remainingQueueSize:s.remainingQueue.length})}finally{await i.close()}}var xa=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async openStoreForSnapshot(e){try{return await e({dbPath:ie(this.workspaceRoot),readonly:!1})}catch(r){throw r instanceof S&&r.code===O.DB_NOT_FOUND?(await On(this.workspaceRoot,{event:ii.ERROR,message:pa.DB_NOT_FOUND}),new S(O.DB_NOT_FOUND,pa.DB_NOT_FOUND,r)):r}}async shouldSkipSnapshot(e,r){let i=await R.resolve(A.GitProvider).getHeadSha(this.workspaceRoot)??null,s=i&&typeof e.hasSourceCommitInHistory=="function"?await e.hasSourceCommitInHistory(this.workspaceRoot,i):!1,o=r.meta.get(E.META_KEY_TIER_B_BATCH_PENDING),a=r.meta.get(E.META_KEY_LAST_TIER_B_BATCH_SHA),l=r.meta.get("tierCProcessedThisRun")==="true";return{shouldSkip:!!(i&&s&&a===i&&!o&&!l),headSha:i}}async execute(){let{workspaceRoot:e,logger:r}=this;r.info(pa.SNAPSHOTTING),await On(e,{event:ii.START,workspaceRoot:e});let n=R.resolve(A.GraphStoreOpener),i=R.resolve(A.KnowledgeGitService,{logger:r}),s=await this.openStoreForSnapshot(n);try{let{shouldSkip:o,headSha:a}=await this.shouldSkipSnapshot(i,s);if(o)return r.info("Knowledge graph snapshot is already up to date with HEAD, skipping."),await On(e,{event:"snapshot.skipped",reason:"already-up-to-date",headSha:a}),{nodesWritten:0,edgesWritten:0,markdownFilesWritten:0};let l=await si(e,s,i);return await XE(e,r),await On(e,{event:ii.SUMMARY,nodesWritten:l.nodesWritten,edgesWritten:l.edgesWritten,markdownFilesWritten:l.markdownFilesWritten}),l}finally{await s.close()}}};var ud={HYDRATING:"Hydrating local database from the knowledge branch...",NOTHING_TO_HYDRATE:'Nothing to hydrate from yet. Please run "docuvia init".'},Ua={START:"hydrate.start",SUMMARY:"hydrate.summary"};async function Ha(t,e){await De(t,qd,e)}var Ba=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async execute(e){let{workspaceRoot:r,logger:n}=this;n.info(ud.HYDRATING),await Ha(r,{event:Ua.START,workspaceRoot:r});let s=await R.resolve(A.GraphStoreOpener)({dbPath:ie(r),readonly:!1});try{let a=await R.resolve(A.HydrationService,{logger:n}).hydrate(r,s,void 0,e);return a.hydrated?(await Ha(r,{event:Ua.SUMMARY,hydrated:!0,knowledgeSha:a.knowledgeSha,nodesLoaded:a.nodesLoaded,edgesLoaded:a.edgesLoaded,edgesDropped:a.edgesDropped}),a):(await Ha(r,{event:Ua.SUMMARY,hydrated:!1,message:ud.NOTHING_TO_HYDRATE}),a)}finally{await s.close()}}};var as={SYNCING:"Reconciling the knowledge branch with the remote...",VALIDITY_PASS_BASELINE:"L3 validity pass: first run -- stamped baseline cursor, judged nothing",VALIDITY_PASS_SUMMARY:(t,e)=>`L3 validity pass: ${t} decision(s) confirmed alive, ${e} demoted as dead/superseded`,VALIDITY_PASS_FAILED:t=>`L3 validity pass failed (retries on the next sync): ${t}`},ls={START:"sync-knowledge.start",SUMMARY:"sync-knowledge.summary",VALIDITY_PASS:"sync-knowledge.l3-validity-pass"};async function cs(t,e){await De(t,Qd,e)}var Ka="l3ValidityJudgedSha";function Mv(t){if(!t.anchor_ranges)return null;try{let e=JSON.parse(t.anchor_ranges);return!Array.isArray(e)||e.length===0?null:{ranges:e}}catch{return null}}function ZE(t){if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}}function kv(t,e,r){let n=e.get(t.path);if(!n||n.size===0)return!0;for(let i=t.startRow+1;i<=t.endRow+1;i++){let s=n.get(i);if(s&&r.has(s))return!0}return!1}function Gv(t,e,r,n){let i=0,s=0;for(let{row:o,anchors:a}of e){if(!a.ranges.some(p=>n.has(p.path)))continue;let l=new Set([...ZE(o.source_commits),...ZE(o.initial_source_commits),...o.commit_hash?[o.commit_hash]:[]]),c=a.ranges.every(p=>kv(p,r,l)),u=c?tr.ACTIVE:tr.GARBAGE;u!==o.validity_status&&(t.l3.updateValidityStatus(o.id,u),c?i++:s++)}return{activated:i,superseded:s}}async function eS(t){let{workspaceRoot:e,logger:r,store:n,git:i,blame:s}=t,o=await i.getHeadSha(e),a={activated:0,superseded:0,baseline:!1};if(!o)return a;let l=n.meta.get(Ka);if(l===o)return a;if(!l)return n.meta.set(Ka,o),a.baseline=!0,a;let c=n.l3.getAllExportable().map(I=>({row:I,anchors:Mv(I)})).filter(I=>I.anchors!==null&&(I.row.validity_status===tr.PENDING||I.row.validity_status===tr.ACTIVE));if(c.length===0)return n.meta.set(Ka,o),a;let u=new Set(c.flatMap(I=>I.anchors.ranges.map(L=>L.path))),p=new Set((await i.getChangedFilesSince(e,l,"HEAD")).map(I=>I.file)),d=[...u].filter(I=>p.has(I)),f=new Map;for(let I of d)f.set(I,await s.getBlameLineOwners(e,I));let m=new Set(d),_=Gv(n,c,f,m);return a.activated=_.activated,a.superseded=_.superseded,n.meta.set(Ka,o),a}var Ya=class{constructor(e,r,n){this.workspaceRoot=e;this.logger=r;this.gitNetworkTimeoutMs=n}workspaceRoot;logger;gitNetworkTimeoutMs;async execute(){let{workspaceRoot:e,logger:r,gitNetworkTimeoutMs:n}=this;r.info(as.SYNCING),await cs(e,{event:ls.START,workspaceRoot:e});let i=R.resolve(A.KnowledgeGitService,{logger:r,gitNetworkTimeoutMs:n}),s=await i.syncKnowledgeBranch(e);s.branchTipSha&&await this.importL3Cards(i,s.branchTipSha);try{await this.runValidityPass()}catch(o){let a=o instanceof Error?o.message:String(o);r.warn(as.VALIDITY_PASS_FAILED(a)),await cs(e,{event:ls.VALIDITY_PASS,status:"error",error:a})}return await cs(e,{event:ls.SUMMARY,status:s.status,branchTipSha:s.branchTipSha??null}),s}async importL3Cards(e,r){let{workspaceRoot:n,logger:i}=this,s=R.resolve(A.HydrationService,{logger:i}),a=await R.resolve(A.GraphStoreOpener)({dbPath:ie(n),readonly:!1});try{await e.runUnderKnowledgeLock(n,()=>s.importL3Cards(n,r,a))}finally{await a.close()}}async runValidityPass(){let{workspaceRoot:e,logger:r}=this,i=await R.resolve(A.GraphStoreOpener)({dbPath:ie(e),readonly:!1});try{let s=await eS({workspaceRoot:e,logger:r,store:i,git:R.resolve(A.GitProvider),blame:R.resolve(A.LineBlameProvider)});s.baseline?r.info(as.VALIDITY_PASS_BASELINE):r.info(as.VALIDITY_PASS_SUMMARY(s.activated,s.superseded)),await cs(e,{event:ls.VALIDITY_PASS,status:"ok",activated:s.activated,superseded:s.superseded,baseline:s.baseline})}finally{await i.close()}}};var ue={DB_RUNNER:"db_runner",DB_FOUND:"db_found",GRAPH_EMPTY:"graph_empty",POST_COMMIT_INGESTION:"post_commit_ingestion",GIT_REACHABILITY:"git_reachability",GIT_RUNNER:"git_runner",LOGS:"logs",TIER_B_COMMIT_CAP:"tier_b_commit_cap",TIER_B_COVERAGE:"tier_b_coverage",GIT_HOOK:"git_hook",PRE_PUSH_HOOK:"pre_push_hook",LLM_REACHABILITY:"llm_reachability",LSP_BINARY:t=>`lsp_binary_${t}`,AGENT_HOOKS_CLAUDE:"agent_hooks_claude",AGENT_HOOKS_CURSOR:"agent_hooks_cursor",TIER_C_QUEUE:"tier_c_queue",STAGED_L3_DECISIONS:"staged_l3_decisions",L2_SEMANTIC_COVERAGE:"l2_semantic_coverage",WORKTREE_DIVERGENCE:"worktree_divergence",AGENT_AUTHED_ADOPTION:"agent_authored_adoption",CALL_GRAPH_RESOLUTION:"call_graph_resolution",CANARY_SELF_TEST:"canary_self_test"},tS=".log",dd={CLAUDE:"Claude",CURSOR:"Cursor"},k={DB_RUNNER_NOT_REGISTERED:"DiagnosticRunnerDb not registered",DB_NOT_FOUND_AT:t=>`Local database not found at ${t}`,GRAPH_EMPTY:"The knowledge graph is empty (nothing ingested yet) -- staged decisions have no L2 anchor to attach to.",GRAPH_EMPTY_SUGGESTION:"run `docuvia init` first \u2014 decisions need a graph to attach to",GRAPH_EMPTY_OK:t=>`Knowledge graph populated (${t} L2 node(s)).`,POST_COMMIT_INGESTION_OK:t=>`Knowledge graph is up to date with HEAD (Tier C queue: ${t} pending).`,POST_COMMIT_INGESTION_RECENT:(t,e)=>`Delta ingestion is behind HEAD (last ingested ${t?t.slice(0,7):"never"}) but ran recently -- likely still in flight from the post-commit hook (Tier C queue: ${e} pending).`,POST_COMMIT_INGESTION_STALE:t=>`The graph is behind HEAD and no analyze run has completed recently -- the post-commit hook's backgrounded ingestion may not be firing (Tier C queue: ${t} pending).`,POST_COMMIT_INGESTION_STALE_SUGGESTION:"run `docuvia analyze` manually to ingest the pending commits, and check `.docuvia/logs/post-commit-hook.log` for hook failures",GIT_RUNNER_NOT_REGISTERED:"DiagnosticRunnerGit not registered",GIT_NETWORK_TIMEOUT_SUGGESTION:"The Git remote operation timed out (5000ms). Check your internet connection or DNS settings.",GIT_NOT_A_REPO_SUGGESTION:"Ensure this workspace is a valid Git repository and the remote 'origin' is set correctly.",GIT_REMOTE_UNREADABLE_SUGGESTION:"Check your SSH keys, PAT, or Git credentials for the remote repository.",GIT_REACHABILITY_FAILED:t=>`Git remote reachability check failed: ${t}`,GIT_NOT_A_REPO_TEXT:"does not appear to be a git repository",GIT_REMOTE_UNREADABLE_TEXT:"Could not read from remote repository",LOGS_ERRORS_FOUND:t=>`Found ${t} critical errors in logs.`,LOGS_ERRORS_FOUND_SUGGESTION:"Check the files in .docuvia/logs/ for details.",LOGS_CHECKED_CLEAN:t=>`Checked ${t} log files, no critical errors found.`,LOGS_NOT_FOUND_AT:t=>`No logs found at ${t}`,TIER_B_CAP_OK:"Tier B commit-cap not yet reached.",TIER_B_CAP_EXCEEDED:"Changed code since the last Tier B batch has exceeded the cap -- push, or run `docuvia analyze --escalate-to-lsp && docuvia snapshot`, to trigger it.",TIER_B_COVERAGE_OK:(t,e)=>`Tier B coverage: ${t}/${e} files processed.`,TIER_B_COVERAGE_LOW:(t,e,r)=>`Only ${r.toFixed(1)}% of tracked files have ever been Tier B-processed (${t}/${e}) -- query results for the rest may show empty edges that mean "unprocessed", not "no relationships".`,TIER_B_COVERAGE_LOW_SUGGESTION:"Run `docuvia analyze --escalate-to-lsp --full` to resync.",GIT_HOOK_NOT_INSTALLED:"No Docuvia post-commit hook installed.",GIT_HOOK_DUPLICATE:"Duplicate hook blocks detected (both the legacy `docuvia snapshot` and current `docuvia analyze` blocks are present and will both fire on every commit).",GIT_HOOK_DUPLICATE_SUGGESTION:"run `docuvia doctor --fix` to repair",GIT_HOOK_LEGACY_ONLY:"The post-commit hook is still running the legacy `docuvia snapshot` command, which no longer performs Tier A delta ingestion.",GIT_HOOK_LEGACY_ONLY_SUGGESTION:"re-run `docuvia init` to upgrade the hook",GIT_HOOK_FLUSH_STALE:"The post-commit hook predates the commit-l3-write flush step -- staged agent-authored L3 decisions would never be flushed into the graph.",GIT_HOOK_FLUSH_STALE_SUGGESTION:"re-run `docuvia init` to upgrade the hook",GIT_HOOK_NOT_RESOLVABLE:"The post-commit hook is installed but `docuvia` is not resolvable from this workspace (the `npx --no-install` invocation would silently no-op on every commit).",GIT_HOOK_NOT_RESOLVABLE_SUGGESTION:"reinstall Docuvia as a project dependency, or check PATH",GIT_HOOK_RESOLVABLE:t=>`Post-commit hook is installed and \`docuvia\` resolves (${t}).`,GIT_HOOK_REPAIRED_NOTE:" Repaired via `doctor --fix` -- re-run `doctor` to confirm.",PRE_PUSH_HOOK_NOT_INSTALLED:"No Docuvia pre-push hook installed.",PRE_PUSH_HOOK_STALE:"The pre-push hook predates the `sync-knowledge` step -- pushes no longer reconcile the knowledge branch with origin.",PRE_PUSH_HOOK_STALE_SUGGESTION:"re-run `docuvia init` to upgrade the hook",PRE_PUSH_HOOK_ENV_GATE_STALE:"The pre-push hook predates the --fallback-ast env-gate flag -- its Tier B step will fail (skipping snapshot/sync-knowledge for that push) whenever the LSP environment isn't ready.",PRE_PUSH_HOOK_HOOKS_CHECK_STALE:"The pre-push hook predates the `hooks check` gate -- its Tier B/snapshot/sync-knowledge chain would run even when `tier-b-c-prepush` is disabled via `docuvia hooks disable`.",PRE_PUSH_HOOK_FAILURE_HINT_STALE:"The pre-push hook predates the Tier B/sync failure hint -- Tier B/C failures stay silent at push time (only in JSONL logs).",PRE_PUSH_HOOK_OK:t=>`Pre-push hook is installed and includes the sync-knowledge step (${t}).`,PRE_PUSH_HOOK_NOT_RESOLVABLE:"The pre-push hook is installed but `docuvia` is not resolvable from this workspace (the `npx --no-install` invocation would silently no-op on every push -- Tier B and sync-knowledge never actually run).",PRE_PUSH_HOOK_REPAIRED_NOTE:" Repaired via `doctor --fix` -- re-run `doctor` to confirm.",LLM_NOT_CONFIGURED:"Not configured -- Tier C is inactive (AI_DOCUVIA_INTEGRATIONS_OPENAI_BASE_URL or AI_DOCUVIA_MODEL not set).",LLM_REACHABLE:"Tier C LLM bridge is reachable and accepts the configured API key.",LLM_UNREACHABLE:t=>`Tier C LLM bridge is configured but unreachable or rejecting requests: ${t}`,LLM_UNREACHABLE_SUGGESTION:"Check that the CLIProxyAPI bridge is running, that its /v1/chat/completions route accepts the configured API key, and that AI_DOCUVIA_INTEGRATIONS_OPENAI_BASE_URL points at it.",TIER_C_QUEUE_OK:(t,e)=>`Tier C queue: ${t} pending, last drain processed ${e} item(s).`,TIER_C_QUEUE_STUCK:(t,e)=>`Tier C queue is stuck (${t} pending; last drain processed 0, reason: ${e}) -- the LLM bridge path analyze dials is not working, so L2 descriptions/validated edges will never be backfilled.`,TIER_C_QUEUE_STUCK_SUGGESTION:"Check that the CLIProxyAPI bridge is running and its /v1/chat/completions route accepts the configured API key, then run `docuvia analyze --escalate-to-lsp` to retry the drain",TIER_C_QUEUE_NEVER_DRAINED:t=>`Tier C queue has ${t} pending item(s) but no drain has ever completed -- either never enqueued-to-drained or permanently stuck from the start.`,TIER_C_QUEUE_NEVER_DRAINED_SUGGESTION:"Run `docuvia analyze --escalate-to-lsp` once so the drain path actually executes, and check `.docuvia/logs/analyze.log` for tierC events",STAGED_L3_OK:t=>t===0?"No agent-authored decisions waiting in the staging file.":`${t} staged agent-authored decision(s) waiting, none older than the staging window.`,STAGED_L3_STRANDED:(t,e,r)=>`${t} agent-authored decision(s) stranded in the staging file -- the oldest has waited ${e} day(s), anchored to \`${r}\`. \`--stage\` only flushes when a later commit's diff contains that exact file, so these will never land on their own.`,STAGED_L3_STRANDED_SUGGESTION:"Write them directly with `docuvia analyze <file> --agent-authored` (the default path -- it lands in one pass, no LLM call, no scheduling), then clear `.docuvia/pending-l3-decisions.json`",L2_SEMANTIC_COVERAGE_OK:(t,e)=>`L2 semantic coverage: ${t}/${e} node(s) carry a description.`,L2_SEMANTIC_COVERAGE_LOW:(t,e,r)=>`Only ${r.toFixed(1)}% of L2 nodes carry a description (${t}/${e}) -- the knowledge graph is structurally correct but semantically empty, so query/impact results surface little "why" content.`,L2_SEMANTIC_COVERAGE_LOW_SUGGESTION:"Run `docuvia analyze --escalate-to-lsp` (Tier C) so the LLM enrichment pass can backfill descriptions, or explicitly declare the graph structural-only",L2_SEMANTIC_COVERAGE_STRUCTURAL_ONLY:(t,e)=>`L2 semantic coverage: ${t}/${e} node(s) carry a description (structural-only graph -- Tier C LLM enrichment is not configured, so descriptions cannot be written yet).`,WORKTREE_DIVERGENCE_OK:t=>`${t} worktree(s) total; no sibling worktree carries its own .docuvia graph.`,WORKTREE_DIVERGENCE_FAIL:(t,e)=>`${t} sibling worktree(s) carry their own .docuvia/local.db -- ${e.join(", ")}: per-worktree knowledge graphs that never reconcile (decisions staged in one worktree never reach the others).`,WORKTREE_DIVERGENCE_SUGGESTION:"Point all worktrees at one graph via a shared DOCUVIA_DB_PATH (or a symlinked .docuvia), or run `docuvia sync-knowledge` from a canonical worktree before pushing",AGENT_AUTHED_ADOPTION_OK:(t,e,r,n)=>`Agent-authored decisions: ${n} flushed in graph, ${t} staged pending flush; ${r} of ${e} recently-changed file(s) carry no staged decision.`,AGENT_AUTHED_ADOPTION_SKIPPED:"No recently-changed files to evaluate for agent-authored staging.",LSP_BINARY_AVAILABLE:t=>`LSP-precision edges available (${t} resolved).`,LSP_BINARY_UNAVAILABLE:t=>`LSP-precision edges unavailable (${t}).`,LSP_BINARY_UNAVAILABLE_SUGGESTION:"Build/compile the project so the language server can resolve it (install dependencies, restore/build for compiled languages), then re-run `docuvia doctor`.",AGENT_HOOKS_FOUND:t=>`${t} hooks found.`,AGENT_HOOKS_NOT_FOUND:t=>`${t} hooks not found (run \`docuvia init\` to install).`,CALL_GRAPH_RESOLUTION_NO_DATA:"No call-site resolution data recorded yet (run `docuvia analyze` to populate it).",CALL_GRAPH_RESOLUTION_OK:(t,e,r)=>`Call-graph resolution: ${t}/${e} applicable call site(s) resolved into calls edges across ${r} ingested file(s).`,CALL_GRAPH_RESOLUTION_LOW:(t,e,r,n)=>`Call-graph resolution is low: only ${r.toFixed(1)}% of applicable call sites resolved into calls edges (${t}/${e} across ${n} file(s)) -- impact results in these areas may understate real dependents ("no dependents" can mean "unresolved", not "safe").`,CALL_GRAPH_RESOLUTION_LOW_SUGGESTION:"Run `docuvia analyze --escalate-to-lsp --full` to let Tier B LSP edge resolution recover the unresolved call sites.",CANARY_SELF_TEST_OK:t=>`Graph self-test passed: ${t} sampled node(s) resolved via exact-name lookup; the FTS index answered a known-present token.`,CANARY_SELF_TEST_LOOKUP_FAIL:(t,e)=>`Graph self-test FAILED: ${t} of ${e} sampled l2_nodes row(s) could not be resolved by exact-name lookup -- rows exist that query/impact can never find.`,CANARY_SELF_TEST_FTS_FAIL:t=>`Graph self-test FAILED: FTS search for known-indexed token "${t}" returned 0 rows while l2_nodes holds data -- the FTS index is out of sync with l2_nodes.`,CANARY_SELF_TEST_FAIL_SUGGESTION:"Run `docuvia analyze --full` to rebuild the local graph from the working tree (or `docuvia hydrate --force` to re-pull it from the knowledge branch)."};async function rS(t,e,r){let n=R.resolve(A.EdgeResolutionProviders,{logger:e}),i=await pd(t,n),s=[];for(let o of i){let a=n[o];if(!a)continue;let l=a();r&&l.configure(r);let c=await l.checkAvailability(t);c.available||s.push(c)}return s.length===0?{available:!0}:i.length>0&&s.length===i.length?s.length===1?s[0]:{available:!1,reason:s.map(o=>o.reason??"").join("; ")}:{available:!0}}async function pd(t,e){if(!R.has(A.GraphStoreOpener))return Object.keys(e);let r;try{r=await R.resolve(A.GraphStoreOpener)({dbPath:ie(t),readonly:!0});let i=ts(r),s=new Set;for(let o of i){let a=rd(o.file);a&&s.add(a)}return Array.from(s)}catch{return Object.keys(e)}finally{await r?.close()}}import{existsSync as xv}from"fs";import*as gd from"path";import{execFile as Uv}from"child_process";import{promisify as Hv}from"util";var Bv=Hv(Uv),Kv=5e3,Yv="npx",$v="--no-install",fd="docuvia",Wv=[".cmd",".CMD",".exe",""],nS="docuvia doctor";function jv(t){let e=gd.join(t,"node_modules",".bin");return(process.platform==="win32"?Wv.map(n=>`${fd}${n}`):[fd]).some(n=>xv(gd.join(e,n)))}function iS(t){if(!t||typeof t!="object")return"";let{stdout:e,stderr:r}=t;return`${e??""}${r??""}`}async function Vv(t){try{let e=await Bv(Yv,[$v,fd],{cwd:t,timeout:Kv});return iS(e).includes(nS)}catch(e){return iS(e).includes(nS)}}async function hd(t){return jv(t)?!0:Vv(t)}import*as At from"path";import*as er from"fs/promises";var $a=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async execute(e={}){let{skipDb:r=!1,skipGit:n=!1,skipLogs:i=!1,skipHooks:s=!1,skipLsp:o=!1,skipLlm:a=!1,fix:l=!1,llmBaseUrl:c,llmApiKey:u,llmModel:p}=e,d={},f=[await this.runOrSkip(r,()=>this.runDbDiagnostics(d)),await this.runOrSkip(n,()=>this.runGitDiagnostics(d)),await this.runOrSkip(i,()=>this.runLogsDiagnostics(d)),await this.runOrSkip(n,()=>this.runGitHookDiagnostic(d,l)),await this.runOrSkip(n,()=>this.runPrePushHookDiagnostic(d,l)),await this.runOrSkip(a,()=>this.runLlmReachabilityDiagnostic(d,c,u,p)),await this.runOrSkip(o,()=>this.runLspBinaryDiagnostic(d)),await this.runOrSkip(r,()=>this.runTierBCoverageDiagnostic(d)),await this.runOrSkip(r,()=>this.runGraphEmptyDiagnostic(d)),await this.runOrSkip(r||n,()=>this.runPostCommitIngestionDiagnostic(d)),...await this.runGraphHealthDiagnostics(d,r,n,c)];return await this.runOrSkip(r,()=>this.runTierBCommitCapDiagnostic(d)),await this.runOrSkip(s,()=>this.runAgentHooksDiagnostic(d)),{allPassed:f.every(Boolean),diagnostics:d}}async runOrSkip(e,r){if(e)return!0;let n=await r();return n===void 0?!0:!!n}async runGraphHealthDiagnostics(e,r,n,i){return[await this.runOrSkip(r,()=>this.runTierCQueueDiagnostic(e)),await this.runOrSkip(r,()=>this.runL2SemanticCoverageDiagnostic(e,i)),await this.runStagedL3Diagnostic(e),await this.runOrSkip(n,()=>this.runWorktreeDivergenceDiagnostic(e)),await this.runOrSkip(r||n,()=>this.runAgentAuthoredAdoptionDiagnostic(e)),await this.runOrSkip(r,()=>this.runCallGraphResolutionDiagnostic(e)),await this.runOrSkip(r,()=>this.runCanarySelfTestDiagnostic(e))]}async runCanarySelfTestDiagnostic(e){if(!R.has(A.GraphStoreOpener))return!0;let r;try{r=await R.resolve(A.GraphStoreOpener)({dbPath:ie(this.workspaceRoot),readonly:!0});let i=r.graph.getCanarySample(E.DEFAULT_CANARY_SAMPLE_SIZE);if(i.length===0)return!0;let s=i.filter(({name:a})=>!r?.graph.findNodeByName(a));if(s.length>0)return e[ue.CANARY_SELF_TEST]={status:Y.FAIL,message:k.CANARY_SELF_TEST_LOOKUP_FAIL(s.length,i.length),suggestion:k.CANARY_SELF_TEST_FAIL_SUGGESTION},!1;let o;for(let{name:a}of i)if(o=a.split(/[^A-Za-z0-9]+/).filter(Boolean).reduce((c,u)=>u.length>=3&&u.length>c.length?u:c,""),o)break;return o&&r.fts.searchL2Nodes([o],10).length===0?(e[ue.CANARY_SELF_TEST]={status:Y.FAIL,message:k.CANARY_SELF_TEST_FTS_FAIL(o),suggestion:k.CANARY_SELF_TEST_FAIL_SUGGESTION},!1):(e[ue.CANARY_SELF_TEST]={status:Y.PASS,message:k.CANARY_SELF_TEST_OK(i.length)},!0)}catch{return!0}finally{await r?.close()}}async runGitHookDiagnostic(e,r){if(!R.has(A.GitProvider))return!0;try{let n=R.resolve(A.GitProvider),i=await n.readHookFile(this.workspaceRoot,E.POST_COMMIT_HOOK_NAME),s=!!i?.includes(E.POST_COMMIT_HOOK_MARKER),o=!!i?.includes(E.LEGACY_POST_COMMIT_HOOK_MARKER),a=!!i?.includes(E.POST_COMMIT_FLUSH_L3_MARKER),l=await this.classifyGitHookState(n,s,o,a);return l=await this.repairGitHookIfRequested(r,l,s,o,a),e[ue.GIT_HOOK]=l,l.status===Y.PASS}catch{return!0}}async repairGitHookIfRequested(e,r,n,i,s){return e?n&&i?this.repairDuplicateGitHookIfRequested(r):r.status===Y.FAIL&&!s?this.repairStaleGitHookIfRequested(r):r:r}async repairStaleGitHookIfRequested(e){if(!R.has(A.KnowledgeGitService))return e;let r=R.resolve(A.KnowledgeGitService,{logger:this.logger}),{installed:n}=await r.installPostCommitHook(this.workspaceRoot);return n?{...e,message:e.message+k.GIT_HOOK_REPAIRED_NOTE}:e}async classifyGitHookState(e,r,n,i){if(!r&&!n)return{status:Y.PASS,message:k.GIT_HOOK_NOT_INSTALLED};if(r&&n)return{status:Y.FAIL,message:k.GIT_HOOK_DUPLICATE,suggestion:k.GIT_HOOK_DUPLICATE_SUGGESTION};if(n)return{status:Y.FAIL,message:k.GIT_HOOK_LEGACY_ONLY,suggestion:k.GIT_HOOK_LEGACY_ONLY_SUGGESTION};if(!i)return{status:Y.FAIL,message:k.GIT_HOOK_FLUSH_STALE,suggestion:k.GIT_HOOK_FLUSH_STALE_SUGGESTION};if(!await hd(this.workspaceRoot))return{status:Y.FAIL,message:k.GIT_HOOK_NOT_RESOLVABLE,suggestion:k.GIT_HOOK_NOT_RESOLVABLE_SUGGESTION};let o=await e.resolveHooksDir(this.workspaceRoot);return{status:Y.PASS,message:k.GIT_HOOK_RESOLVABLE(At.join(o,E.POST_COMMIT_HOOK_NAME))}}async repairDuplicateGitHookIfRequested(e){if(!R.has(A.KnowledgeGitService))return e;let r=R.resolve(A.KnowledgeGitService,{logger:this.logger}),{repaired:n}=await r.repairDuplicatePostCommitHook(this.workspaceRoot);return n?{...e,message:e.message+k.GIT_HOOK_REPAIRED_NOTE}:e}async runPrePushHookDiagnostic(e,r){if(!R.has(A.GitProvider))return!0;try{let n=R.resolve(A.GitProvider),i=await n.readHookFile(this.workspaceRoot,E.PRE_PUSH_HOOK_NAME),s=!!i?.includes(E.PRE_PUSH_HOOK_MARKER),o=!!i?.includes(E.PRE_PUSH_SYNC_KNOWLEDGE_MARKER),a=!!i?.includes(E.PRE_PUSH_ENV_GATE_MARKER),l=!!i?.includes(E.PRE_PUSH_HOOKS_CHECK_MARKER),c=!!i?.includes(E.PRE_PUSH_FAILURE_HINT_MARKER),u=await this.classifyPrePushHookState(n,s,o,a,l,c);return u=await this.repairPrePushHookIfRequested(r,u,s,o,a,l,c),e[ue.PRE_PUSH_HOOK]=u,u.status===Y.PASS}catch{return!0}}async repairPrePushHookIfRequested(e,r,n,i,s,o,a){return!e||!n||i&&s&&o&&a?r:this.repairStalePrePushHookIfRequested(r)}async repairStalePrePushHookIfRequested(e){if(!R.has(A.KnowledgeGitService))return e;let r=R.resolve(A.KnowledgeGitService,{logger:this.logger}),{installed:n}=await r.installPrePushHook(this.workspaceRoot);return n?{...e,message:e.message+k.PRE_PUSH_HOOK_REPAIRED_NOTE}:e}async classifyPrePushHookState(e,r,n,i,s,o){if(!r)return{status:Y.PASS,message:k.PRE_PUSH_HOOK_NOT_INSTALLED};if(!n)return{status:Y.FAIL,message:k.PRE_PUSH_HOOK_STALE,suggestion:k.PRE_PUSH_HOOK_STALE_SUGGESTION};if(!i)return{status:Y.FAIL,message:k.PRE_PUSH_HOOK_ENV_GATE_STALE,suggestion:k.PRE_PUSH_HOOK_STALE_SUGGESTION};if(!s)return{status:Y.FAIL,message:k.PRE_PUSH_HOOK_HOOKS_CHECK_STALE,suggestion:k.PRE_PUSH_HOOK_STALE_SUGGESTION};if(!o)return{status:Y.FAIL,message:k.PRE_PUSH_HOOK_FAILURE_HINT_STALE,suggestion:k.PRE_PUSH_HOOK_STALE_SUGGESTION};if(!await hd(this.workspaceRoot))return{status:Y.FAIL,message:k.PRE_PUSH_HOOK_NOT_RESOLVABLE,suggestion:k.GIT_HOOK_NOT_RESOLVABLE_SUGGESTION};let l=await e.resolveHooksDir(this.workspaceRoot);return{status:Y.PASS,message:k.PRE_PUSH_HOOK_OK(At.join(l,E.PRE_PUSH_HOOK_NAME))}}async runLlmReachabilityDiagnostic(e,r,n,i){if(!r||!i)return e[ue.LLM_REACHABILITY]={status:Y.PASS,message:k.LLM_NOT_CONFIGURED},!0;if(!R.has(A.LlmClient))return!0;try{let o=R.resolve(A.LlmClient)();o.initialize({baseUrl:r,apiKey:n});let a=await o.checkBridgeReachability(i);return a.available?(e[ue.LLM_REACHABILITY]={status:Y.PASS,message:k.LLM_REACHABLE},!0):(e[ue.LLM_REACHABILITY]={status:Y.FAIL,message:k.LLM_UNREACHABLE(a.reason??""),suggestion:k.LLM_UNREACHABLE_SUGGESTION},!1)}catch{return!0}}async runLspBinaryDiagnostic(e){if(!R.has(A.EdgeResolutionProviders))return!0;try{let r=R.resolve(A.EdgeResolutionProviders,{logger:this.logger}),n=await pd(this.workspaceRoot,r),i=!0;for(let s of n){let o=r[s];if(!o)continue;let a=o(),l=await a.checkAvailability(this.workspaceRoot);e[ue.LSP_BINARY(s)]=l.available?{status:Y.PASS,message:k.LSP_BINARY_AVAILABLE(a.name)}:{status:Y.FAIL,message:k.LSP_BINARY_UNAVAILABLE(l.reason??""),suggestion:k.LSP_BINARY_UNAVAILABLE_SUGGESTION},l.available||(i=!1)}return i}catch{return!0}}async runAgentHooksDiagnostic(e){let r=[{key:ue.AGENT_HOOKS_CLAUDE,dir:vn,filename:Tr,platformName:dd.CLAUDE},{key:ue.AGENT_HOOKS_CURSOR,dir:bn,filename:Ar,platformName:dd.CURSOR}];for(let{key:n,dir:i,filename:s,platformName:o}of r){let a=At.join(this.workspaceRoot,i,s),l;try{await er.stat(a),l=!0}catch{l=!1}e[n]={status:Y.PASS,message:l?k.AGENT_HOOKS_FOUND(o):k.AGENT_HOOKS_NOT_FOUND(o)}}}async runTierBCommitCapDiagnostic(e){if(!R.has(A.GraphStoreOpener))return;let r;try{r=await R.resolve(A.GraphStoreOpener)({dbPath:ie(this.workspaceRoot),readonly:!0});let i=li(r);e[ue.TIER_B_COMMIT_CAP]={status:Y.PASS,message:i?k.TIER_B_CAP_EXCEEDED:k.TIER_B_CAP_OK}}catch{}finally{await r?.close()}}async runTierBCoverageDiagnostic(e){if(!R.has(A.GraphStoreOpener))return!0;let r;try{r=await R.resolve(A.GraphStoreOpener)({dbPath:ie(this.workspaceRoot),readonly:!0});let{totalFiles:i,processedFiles:s}=r.files.getTierBCoverage(),o=i>0?s/i:1,a=o<E.DEFAULT_TIER_B_COVERAGE_FAIL_THRESHOLD;return e[ue.TIER_B_COVERAGE]=a?{status:Y.FAIL,message:k.TIER_B_COVERAGE_LOW(s,i,o*100),suggestion:k.TIER_B_COVERAGE_LOW_SUGGESTION}:{status:Y.PASS,message:k.TIER_B_COVERAGE_OK(s,i)},!a}catch{return!0}finally{await r?.close()}}async runGraphEmptyDiagnostic(e){if(!R.has(A.GraphStoreOpener))return!0;let r;try{r=await R.resolve(A.GraphStoreOpener)({dbPath:ie(this.workspaceRoot),readonly:!0});let i=r.projects.getFirst(),{l2Nodes:s}=r.graph.count(),o=!i||s===0;return e[ue.GRAPH_EMPTY]=o?{status:Y.FAIL,message:k.GRAPH_EMPTY,suggestion:k.GRAPH_EMPTY_SUGGESTION}:{status:Y.PASS,message:k.GRAPH_EMPTY_OK(s)},!o}catch{return!0}finally{await r?.close()}}async runPostCommitIngestionDiagnostic(e){if(!R.has(A.GraphStoreOpener)||!R.has(A.GitProvider))return!0;let r;try{let n=R.resolve(A.GitProvider);r=await R.resolve(A.GraphStoreOpener)({dbPath:ie(this.workspaceRoot),readonly:!0});let s=await n.getHeadSha(this.workspaceRoot);if(!s)return!0;let o=r.meta.get(E.META_KEY_LAST_INGESTED_SOURCE_SHA),a=Zt(r).length;if(o===s)return e[ue.POST_COMMIT_INGESTION]={status:Y.PASS,message:k.POST_COMMIT_INGESTION_OK(a)},!0;let l=await this.hasRecentAnalyzeActivity();return e[ue.POST_COMMIT_INGESTION]=l?{status:Y.PASS,message:k.POST_COMMIT_INGESTION_RECENT(o,a)}:{status:Y.FAIL,message:k.POST_COMMIT_INGESTION_STALE(a),suggestion:k.POST_COMMIT_INGESTION_STALE_SUGGESTION},l}catch{return!0}finally{await r?.close()}}async hasRecentAnalyzeActivity(){let e=At.join(this.workspaceRoot,he,Er,Si),r;try{r=await er.readFile(e,K)}catch{return!1}let n=E.DEFAULT_POST_COMMIT_INGESTION_GRACE_MS,i=Date.now(),s=r.split(`
166
166
  `).filter(o=>o.trim().length>0);for(let o of s)try{let a=JSON.parse(o);if(typeof a.ts=="string"){let l=Date.parse(a.ts);if(!Number.isNaN(l)&&i-l<=n)return!0}}catch{}return!1}async runTierCQueueDiagnostic(e){if(!R.has(A.GraphStoreOpener))return!0;let r;try{r=await R.resolve(A.GraphStoreOpener)({dbPath:ie(this.workspaceRoot),readonly:!0});let i=Zt(r).length;if(i===0)return e[ue.TIER_C_QUEUE]={status:Y.PASS,message:k.TIER_C_QUEUE_OK(0,0)},!0;let s=await this.readLastTierCDrainOutcome();return s?s.processed===0?(e[ue.TIER_C_QUEUE]={status:Y.FAIL,message:k.TIER_C_QUEUE_STUCK(i,s.reason??"unknown"),suggestion:k.TIER_C_QUEUE_STUCK_SUGGESTION},!1):(e[ue.TIER_C_QUEUE]={status:Y.PASS,message:k.TIER_C_QUEUE_OK(i,s.processed)},!0):(e[ue.TIER_C_QUEUE]={status:Y.FAIL,message:k.TIER_C_QUEUE_NEVER_DRAINED(i),suggestion:k.TIER_C_QUEUE_NEVER_DRAINED_SUGGESTION},!1)}catch{return!0}finally{await r?.close()}}async runStagedL3Diagnostic(e){let r;try{r=await ui(this.workspaceRoot,this.logger)}catch{return!0}let n=Date.now(),i=r.filter(a=>{let l=Date.parse(a.stagedAt);return Number.isFinite(l)&&n-l>=E.DEFAULT_STAGED_L3_STRANDED_AFTER_MS});if(i.length===0)return e[ue.STAGED_L3_DECISIONS]={status:Y.PASS,message:k.STAGED_L3_OK(r.length)},!0;let s=i.reduce((a,l)=>Date.parse(a.stagedAt)<=Date.parse(l.stagedAt)?a:l),o=Math.floor((n-Date.parse(s.stagedAt))/E.DEFAULT_STAGED_L3_STRANDED_AFTER_MS);return e[ue.STAGED_L3_DECISIONS]={status:Y.FAIL,message:k.STAGED_L3_STRANDED(i.length,o,s.filePath),suggestion:k.STAGED_L3_STRANDED_SUGGESTION},!1}async readLastTierCDrainOutcome(){let e=At.join(this.workspaceRoot,he,Er,Si),r;try{r=await er.readFile(e,K)}catch{return}let n,i;for(let s of r.split(`
167
167
  `))try{let o=JSON.parse(s);o.event===j.TIER_C_SUMMARY?n={processed:Number(o.processed??0)}:o.event===j.TIER_C_ITEM_FAILED&&typeof o.reason=="string"&&(i=o.reason)}catch{}if(n)return{processed:n.processed,reason:i}}async runL2SemanticCoverageDiagnostic(e,r){if(!R.has(A.GraphStoreOpener))return!0;let n;try{n=await R.resolve(A.GraphStoreOpener)({dbPath:ie(this.workspaceRoot),readonly:!0});let{totalNodes:s,describedNodes:o}=n.graph.getSemanticCoverage(),a=s>0?o/s:1,l=a<E.DEFAULT_L2_SEMANTIC_COVERAGE_FAIL_THRESHOLD,c=!!r;return e[ue.L2_SEMANTIC_COVERAGE]=l?c?{status:Y.FAIL,message:k.L2_SEMANTIC_COVERAGE_LOW(o,s,a*100),suggestion:k.L2_SEMANTIC_COVERAGE_LOW_SUGGESTION}:{status:Y.PASS,message:k.L2_SEMANTIC_COVERAGE_STRUCTURAL_ONLY(o,s)}:{status:Y.PASS,message:k.L2_SEMANTIC_COVERAGE_OK(o,s)},!(l&&c)}catch{return!0}finally{await n?.close()}}async runWorktreeDivergenceDiagnostic(e){if(!R.has(A.GitProvider))return!0;try{let n=await R.resolve(A.GitProvider).listWorktrees(this.workspaceRoot),i=At.resolve(this.workspaceRoot),s=[];for(let o of n){if(At.resolve(o.path)===i)continue;let a=At.join(o.path,he,Ti);await er.stat(a).catch(()=>null)&&s.push(o.path)}return e[ue.WORKTREE_DIVERGENCE]=s.length>0?{status:Y.FAIL,message:k.WORKTREE_DIVERGENCE_FAIL(s.length,s),suggestion:k.WORKTREE_DIVERGENCE_SUGGESTION}:{status:Y.PASS,message:k.WORKTREE_DIVERGENCE_OK(n.length)},s.length===0}catch{return!0}}async runAgentAuthoredAdoptionDiagnostic(e){if(!R.has(A.GraphStoreOpener)||!R.has(A.GitProvider))return!0;let r;try{let n=R.resolve(A.GitProvider);r=await R.resolve(A.GraphStoreOpener)({dbPath:ie(this.workspaceRoot),readonly:!0});let s=await n.getHeadSha(this.workspaceRoot),o=r.meta.get(E.META_KEY_LAST_INGESTED_SOURCE_SHA),a=o&&o!==s?await n.getChangedFilesSince(this.workspaceRoot,o):[];if(a.length===0)return e[ue.AGENT_AUTHED_ADOPTION]={status:Y.PASS,message:k.AGENT_AUTHED_ADOPTION_SKIPPED},!0;let l=await ui(this.workspaceRoot,this.logger),c=new Set(l.map(d=>d.filePath)),u=r.l3.getAllExportable().filter(d=>d.source===wt.AGENT_AUTHORED).length,p=a.filter(d=>!c.has(d.file)).length;return e[ue.AGENT_AUTHED_ADOPTION]={status:Y.PASS,message:k.AGENT_AUTHED_ADOPTION_OK(l.length,a.length,p,u)},!0}catch{return!0}finally{await r?.close()}}async runCallGraphResolutionDiagnostic(e){if(!R.has(A.GraphStoreOpener))return!0;let r;try{r=await R.resolve(A.GraphStoreOpener)({dbPath:ie(this.workspaceRoot),readonly:!0});let{byFile:i,total:s}=Y_(r),o=Object.keys(i).length;if(o===0||s.total===0)return e[ue.CALL_GRAPH_RESOLUTION]={status:Y.PASS,message:k.CALL_GRAPH_RESOLUTION_NO_DATA},!0;let a=sp(s),l=a>0?s.resolved/a:1,c=l<E.DEFAULT_CALL_RESOLUTION_NOTE_THRESHOLD;return e[ue.CALL_GRAPH_RESOLUTION]=c?{status:Y.PASS,message:k.CALL_GRAPH_RESOLUTION_LOW(s.resolved,a,l*100,o),suggestion:k.CALL_GRAPH_RESOLUTION_LOW_SUGGESTION}:{status:Y.PASS,message:k.CALL_GRAPH_RESOLUTION_OK(s.resolved,a,o)},!0}catch{return!0}finally{await r?.close()}}async runDbDiagnostics(e){let r=At.join(this.workspaceRoot,he,Ti);if(!await er.stat(r).catch(()=>null))return e[ue.DB_FOUND]={status:Y.FAIL,message:k.DB_NOT_FOUND_AT(r)},!1;if(!R.has(A.DiagnosticRunnerDb))return e[ue.DB_RUNNER]={status:Y.FAIL,message:k.DB_RUNNER_NOT_REGISTERED},!1;let s=await R.resolve(A.DiagnosticRunnerDb).checkHealth(r);return this.mergeDiagnosticResults(e,s)}async runGitDiagnostics(e){if(!R.has(A.DiagnosticRunnerGit))return e[ue.GIT_RUNNER]={status:Y.FAIL,message:k.GIT_RUNNER_NOT_REGISTERED},!1;try{let n=await R.resolve(A.DiagnosticRunnerGit,{logger:this.logger}).checkHealth(this.workspaceRoot);return this.mergeDiagnosticResults(e,n)}catch(r){return e[ue.GIT_REACHABILITY]=this.buildGitReachabilityFailure(r),!1}}mergeDiagnosticResults(e,r){let n=!0;for(let[i,s]of Object.entries(r))e[i]=s,s.status===Y.FAIL&&(n=!1);return n}buildGitReachabilityFailure(e){let r=e instanceof S||e instanceof Error?e.message:String(e),n;return e instanceof S&&(e.code===O.GIT_NETWORK_TIMEOUT?n=k.GIT_NETWORK_TIMEOUT_SUGGESTION:e.code===O.GIT_COMMAND_FAILED&&r.includes(k.GIT_NOT_A_REPO_TEXT)?n=k.GIT_NOT_A_REPO_SUGGESTION:e.code===O.GIT_COMMAND_FAILED&&r.includes(k.GIT_REMOTE_UNREADABLE_TEXT)&&(n=k.GIT_REMOTE_UNREADABLE_SUGGESTION)),{status:Y.FAIL,message:k.GIT_REACHABILITY_FAILED(r),suggestion:n}}async runLogsDiagnostics(e){let r=At.join(this.workspaceRoot,he,Er);try{let{errorsFound:n,logsChecked:i}=await this.scanLogFiles(r);return n>0?(e[ue.LOGS]={status:Y.FAIL,message:k.LOGS_ERRORS_FOUND(n),suggestion:k.LOGS_ERRORS_FOUND_SUGGESTION},!1):(e[ue.LOGS]={status:Y.PASS,message:k.LOGS_CHECKED_CLEAN(i)},!0)}catch{return e[ue.LOGS]={status:Y.PASS,message:k.LOGS_NOT_FOUND_AT(r)},!0}}async scanLogFiles(e){let r=0,n=0,i=await er.readdir(e);for(let s of i){if(!s.endsWith(tS))continue;n++;let a=(await er.readFile(At.join(e,s),K)).split(`
168
168
  `).filter(l=>l.trim().length>0);for(let l of a)try{let c=JSON.parse(l);c.level&&c.level>=50&&r++}catch{}}return{errorsFound:r,logsChecked:n}}};var Wa=class{constructor(e,r){this.workspaceRoot=e;this.logger=r}workspaceRoot;logger;async execute(e=!1){let{workspaceRoot:r,logger:n}=this,i=R.resolve(A.KnowledgeGitService,{logger:n}),s=await this.removeHookSafely(()=>i.removePostCommitHook(r),E.POST_COMMIT_HOOK_NAME),o=await this.removeHookSafely(()=>i.removePrePushHook(r),E.PRE_PUSH_HOOK_NAME),a=!1;if(!e)try{({deleted:a}=await i.deleteKnowledgeBranch(r))}catch(l){this.logger.warn("Failed to delete the docuvia-knowledge git branch",{error:l instanceof Error?l.message:String(l)})}return{postCommitRemoved:s,prePushRemoved:o,knowledgeBranchDeleted:a}}async removeHookSafely(e,r){try{let{removed:n}=await e();return n}catch(n){return this.logger.warn(`Failed to remove the ${r} git hook`,{error:n instanceof Error?n.message:String(n)}),!1}}};import sS from"fs/promises";import zv from"path";var oS={REMOVED:"Removed .docuvia/ directory",NOT_FOUND:".docuvia/ directory not present; nothing to remove"};async function aS(t,e){let r=zv.join(t,he);if(!ha(r,t))throw new S(O.UNINSTALL_WORKFLOW_FAILED,`Refusing to remove directory at ${r}: resolved outside workspace ${t}`);let n=!0;try{await sS.access(r)}catch{n=!1}return n?(await sS.rm(r,{recursive:!0,force:!0}),e.info(oS.REMOVED),{removed:!0}):(e.debug(oS.NOT_FOUND),{removed:!1})}async function lS(t,e){return di(t,e)}async function cS(t,e,r,n){return await jE(t,e,r,n),di(t,n)}function Ee(t,e){let r=T.get(t,e);if(r===void 0)throw new S(O.INVALID_INPUT,M_.MISSING_MEMORY_KEY(e,t));return r}function uS(t){let e=T.get(t,y.LSP_BINARY_OVERRIDE),r=T.get(t,y.LSP_ARGS_OVERRIDE),n=T.get(t,y.LSP_TIMEOUT_MS),i=T.get(t,y.LSP_MAX_PROCESSES);if(!(e===void 0&&r===void 0&&n===void 0&&i===void 0))return{binaryOverride:e,argsOverride:r,timeoutMs:n,maxProcesses:i}}var X={async init(t,e){let r=Ee(t,y.WORKSPACE_ROOT);return new ga(r,e).execute()},async clean(t,e){let r=Ee(t,y.WORKSPACE_ROOT);return new ma(r,e).execute()},async status(t,e){let r=Ee(t,y.WORKSPACE_ROOT);return new Ta(r,e).execute()},async sync(t,e,r){let n=Ee(t,y.WORKSPACE_ROOT),i=Ee(t,y.API_URL),s=Ee(t,y.PROJECT_ID),o=T.get(t,y.COMMIT_SHA);return new Aa(n,e,i,r).execute({projectId:s,commitSha:o})},async analyze(t,e,r){let n=Ee(t,y.WORKSPACE_ROOT);if(T.get(t,y.FLUSH_STAGED_L3))return new Vr(n,e,{flushStagedL3:!0}).execute();let s=T.get(t,y.TARGET_PATH),o=T.get(t,y.AGENT_AUTHORED_DECISIONS);if(s&&o)return new Vr(n,e,{targetPath:s,agentAuthoredDecisions:o}).execute();if(s){let l=Ee(t,y.LLM_BASE_URL),c=Ee(t,y.LLM_MODEL);return new Vr(n,e,{targetPath:s,llmBaseUrl:l,llmApiKey:r,llmModel:c}).execute()}return T.get(t,y.ESCALATE_TO_LSP)?new Vr(n,e,{escalateToLsp:!0,lspProviderConfig:uS(t),tierBCommitCap:T.get(t,y.TIER_B_COMMIT_CAP),full:T.get(t,y.TIER_B_FULL_RESYNC),llmBaseUrl:T.get(t,y.LLM_BASE_URL),llmApiKey:r,llmModel:T.get(t,y.LLM_MODEL),tierCDailyCallCap:T.get(t,y.TIER_C_DAILY_CALL_CAP),tierCDailyTokenCap:T.get(t,y.TIER_C_DAILY_TOKEN_CAP),tierCWallClockMs:T.get(t,y.TIER_C_WALL_CLOCK_MS),tierCItemCap:T.get(t,y.TIER_C_ITEM_CAP),tierCLoadThreshold:T.get(t,y.TIER_C_LOAD_THRESHOLD),force:T.get(t,y.FORCE),tierCDrainAll:T.get(t,y.TIER_C_DRAIN_ALL)}).execute():new Vr(n,e).execute()},async stageAgentAuthoredDecisions(t,e){let r=Ee(t,y.WORKSPACE_ROOT),n=Ee(t,y.TARGET_PATH),i=Ee(t,y.AGENT_AUTHORED_DECISIONS),s=qv.resolve(r,n);if(!Jv.existsSync(s))throw new S(O.FS_READ_FAILED,Q.PATH_NOT_FOUND(n));return KE(r,n,i,e)},async review(t,e){let r=Ee(t,y.WORKSPACE_ROOT),n=T.get(t,y.BASE_REF);return new Ca(r,e).execute(n)},async impact(t,e){let r=Ee(t,y.WORKSPACE_ROOT),n=Ee(t,y.TARGET);return new Pa(r,e).execute(n)},async query(t,e){let r=Ee(t,y.WORKSPACE_ROOT),n=Ee(t,y.TARGET),i=T.get(t,y.LIMIT);return new wa(r,e).execute(n,i)},async exportTopology(t,e){let r=Ee(t,y.WORKSPACE_ROOT),n=T.get(t,y.COLLAPSE);return new Ga(r,e).execute({collapse:n})},async snapshot(t,e){let r=Ee(t,y.WORKSPACE_ROOT);return new xa(r,e).execute()},async hydrate(t,e,r){let n=Ee(t,y.WORKSPACE_ROOT);return new Ba(n,e).execute(r)},async syncKnowledge(t,e){let r=Ee(t,y.WORKSPACE_ROOT),n=T.get(t,y.GIT_NETWORK_TIMEOUT_MS);return new Ya(r,e,n).execute()},async doctor(t,e,r){let n=Ee(t,y.WORKSPACE_ROOT);return new $a(n,e).execute(r)},async uninstallGitHooks(t,e){let r=Ee(t,y.WORKSPACE_ROOT),n=T.get(t,y.KEEP_DB);return new Wa(r,e).execute(n)},async removeDocuviaDir(t,e){let r=Ee(t,y.WORKSPACE_ROOT);return aS(r,e)},async listHooks(t,e){let r=Ee(t,y.WORKSPACE_ROOT);return lS(r,e)},async setHookEnabled(t,e){let r=Ee(t,y.WORKSPACE_ROOT),n=Ee(t,y.HOOK_NAME),i=Ee(t,y.HOOK_ENABLED);return cS(r,n,i,e)},async checkTierBGate(t,e){let r=Ee(t,y.WORKSPACE_ROOT);return rS(r,e,uS(t))}};import dS from"pino";import{createRequire as Qv}from"module";var Xv=Qv(import.meta.url),md="pino-pretty",Zv=`[docuvia] ${md} unavailable, falling back to plain JSON logs.