diff --git a/plugin/scripts/worker-service.cjs b/plugin/scripts/worker-service.cjs index 080d6d16..be5d2bc6 100755 --- a/plugin/scripts/worker-service.cjs +++ b/plugin/scripts/worker-service.cjs @@ -833,7 +833,7 @@ View Observations Live @ http://localhost:${i}`:void 0;return{hookSpecificOutput `+String.fromCodePoint(128172)+` Community https://discord.gg/J4wttp9vDu `+String.fromCodePoint(128250)+` Watch live in browser http://localhost:${r}/ `)}catch{}return{exitCode:ot.SUCCESS}}}});var N$,M$=Pe(()=>{"use strict";Or();oe();gn();N$={async execute(t){if(!await Rr())return{continue:!0,suppressOutput:!0,exitCode:ot.SUCCESS};let{sessionId:r,cwd:n,filePath:i,edits:s}=t;if(!i)throw new Error("fileEditHandler requires filePath");if(y.dataIn("HOOK",`FileEdit: ${i}`,{editCount:s?.length??0}),!n)throw new Error(`Missing cwd in FileEdit hook input for session ${r}, file ${i}`);try{let o=await Tt("/api/sessions/observations",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({contentSessionId:r,tool_name:"write_file",tool_input:{filePath:i,edits:s},tool_response:{success:!0},cwd:n})});if(!o.ok)return y.warn("HOOK","File edit observation storage failed, skipping",{status:o.status,filePath:i}),{continue:!0,suppressOutput:!0,exitCode:ot.SUCCESS};y.debug("HOOK","File edit observation sent successfully",{filePath:i})}catch(o){return y.warn("HOOK","File edit observation fetch error, skipping",{error:o instanceof Error?o.message:String(o)}),{continue:!0,suppressOutput:!0,exitCode:ot.SUCCESS}}return{continue:!0,suppressOutput:!0}}}});function gge(t){return t.toLowerCase().replace(" am","a").replace(" pm","p")}function vge(t){return new Date(t).toLocaleString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0})}function yge(t){return new Date(t).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric"})}function _ge(t,e){let r=new Map;for(let s of t){let o=yge(s.created_at_epoch);r.has(o)||r.set(o,[]),r.get(o).push(s)}let n=Array.from(r.entries()).sort((s,o)=>{let a=s[1][0].created_at_epoch,c=o[1][0].created_at_epoch;return a-c}),i=["Existing observations for this file \u2014 review via get_observations([IDs]) to avoid duplicates:"];for(let[s,o]of n){i.push(`### ${s}`);for(let a of o){let c=a.title||"Untitled",u=hge[a.type]||"\u2753",l=gge(vge(a.created_at_epoch));i.push(`${a.id} ${l} ${u} ${c}`)}}return i.join(` -`)}var hge,D$,j$=Pe(()=>{"use strict";Or();oe();vv();Yt();Nt();hge={decision:"\u2696\uFE0F",bugfix:"\u{1F534}",feature:"\u{1F7E3}",refactor:"\u{1F504}",discovery:"\u{1F535}",change:"\u2705"};D$={async execute(t){let r=t.toolInput?.file_path;if(!r)return{continue:!0,suppressOutput:!0};let n=_e.loadFromFile(At);if(t.cwd&&iu(t.cwd,n.CLAUDE_MEM_EXCLUDED_PROJECTS))return y.debug("HOOK","Project excluded from tracking, skipping file context",{cwd:t.cwd}),{continue:!0,suppressOutput:!0};if(!await Rr())return{continue:!0,suppressOutput:!0};try{let s=new URLSearchParams({path:r});t.cwd&&s.set("project",t.cwd);let o=await Tt(`/api/observations/by-file?${s.toString()}`,{method:"GET"});if(!o.ok)return y.warn("HOOK","File context query failed, skipping",{status:o.status,filePath:r}),{continue:!0,suppressOutput:!0};let a=await o.json();return!a.observations||a.observations.length===0?{continue:!0,suppressOutput:!0}:{hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"allow",additionalContext:_ge(a.observations,r)}}}catch(s){return y.warn("HOOK","File context fetch error, skipping",{error:s instanceof Error?s.message:String(s)}),{continue:!0,suppressOutput:!0}}}}});var z$,L$=Pe(()=>{"use strict";Or();oe();z$={async execute(t){if(!await Rr())return{continue:!0,suppressOutput:!0};let{sessionId:r}=t;if(!r)return y.warn("HOOK","session-complete: Missing sessionId, skipping"),{continue:!0,suppressOutput:!0};y.info("HOOK","\u2192 session-complete: Removing session from active map",{contentSessionId:r});try{let n=await Tt("/api/sessions/complete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({contentSessionId:r})});if(n.ok)y.info("HOOK","Session completed successfully",{contentSessionId:r});else{let i=await n.text();y.warn("HOOK","session-complete: Failed to complete session",{status:n.status,body:i})}}catch(n){y.warn("HOOK","session-complete: Error completing session",{error:n.message})}return{continue:!0,suppressOutput:!0}}}});function N9(t){let e=bge[t];return e||(y.warn("HOOK",`Unknown event type: ${t}, returning no-op`),{async execute(){return{continue:!0,suppressOutput:!0,exitCode:ot.SUCCESS}}})}var bge,M9=Pe(()=>{"use strict";gn();oe();k$();T$();R$();P$();A$();M$();j$();L$();k$();T$();R$();P$();A$();M$();j$();L$();bge={context:E$,"session-init":$$,observation:I$,summarize:O$,"session-complete":z$,"user-message":C$,"file-edit":N$,"file-context":D$}});var j9={};un(j9,{hookCommand:()=>xge,isWorkerUnavailableError:()=>D9});function D9(t){let e=t instanceof Error?t.message:String(t),r=e.toLowerCase();return["econnrefused","econnreset","epipe","etimedout","enotfound","econnaborted","enetunreach","ehostunreach","fetch failed","unable to connect","socket hang up"].some(i=>r.includes(i))||r.includes("timed out")||r.includes("timeout")||/failed:\s*5\d{2}/.test(e)||/status[:\s]+5\d{2}/.test(e)||/failed:\s*429/.test(e)||/status[:\s]+429/.test(e)?!0:(/failed:\s*4\d{2}/.test(e)||/status[:\s]+4\d{2}/.test(e)||t instanceof TypeError||t instanceof ReferenceError||t instanceof SyntaxError,!1)}async function xge(t,e,r={}){let n=process.stderr.write.bind(process.stderr);process.stderr.write=(()=>!0);try{let i=I9(t),s=N9(e),o=await x9(),a=i.normalizeInput(o);a.platform=t;let c=await s.execute(a),u=i.formatOutput(c);console.log(JSON.stringify(u));let l=c.exitCode??ot.SUCCESS;return r.skipExit||process.exit(l),l}catch(i){return D9(i)?(y.warn("HOOK",`Worker unavailable, skipping hook: ${i instanceof Error?i.message:i}`),r.skipExit||process.exit(ot.SUCCESS),ot.SUCCESS):(y.error("HOOK",`Hook error: ${i instanceof Error?i.message:i}`,{},i instanceof Error?i:void 0),r.skipExit||process.exit(ot.BLOCKING_ERROR),ot.BLOCKING_ERROR)}finally{process.stderr.write=n}}var z9=Pe(()=>{"use strict";S9();R9();M9();gn();oe()});var q$={};un(q$,{cleanClaudeMd:()=>Nge,generateClaudeMd:()=>Age});function Ege(t){return wge[t]||"\u{1F4DD}"}function kge(t){let e=(t.title?.length||0)+(t.subtitle?.length||0)+(t.narrative?.length||0)+(t.facts?.length||0);return Math.ceil(e/4)}function $ge(t){let e=new Set;try{let n=(0,q9.execSync)("git ls-files",{cwd:t,encoding:"utf-8",maxBuffer:52428800}).trim().split(` +`)}var hge,D$,j$=Pe(()=>{"use strict";Or();oe();vv();Yt();Nt();hge={decision:"\u2696\uFE0F",bugfix:"\u{1F534}",feature:"\u{1F7E3}",refactor:"\u{1F504}",discovery:"\u{1F535}",change:"\u2705"};D$={async execute(t){let r=t.toolInput?.file_path;if(!r)return{continue:!0,suppressOutput:!0};let n=_e.loadFromFile(At);if(t.cwd&&iu(t.cwd,n.CLAUDE_MEM_EXCLUDED_PROJECTS))return y.debug("HOOK","Project excluded from tracking, skipping file context",{cwd:t.cwd}),{continue:!0,suppressOutput:!0};if(!await Rr())return{continue:!0,suppressOutput:!0};try{let s=new URLSearchParams({path:r}),o=await Tt(`/api/observations/by-file?${s.toString()}`,{method:"GET"});if(!o.ok)return y.warn("HOOK","File context query failed, skipping",{status:o.status,filePath:r}),{continue:!0,suppressOutput:!0};let a=await o.json();return!a.observations||a.observations.length===0?{continue:!0,suppressOutput:!0}:{hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"allow",additionalContext:_ge(a.observations,r)}}}catch(s){return y.warn("HOOK","File context fetch error, skipping",{error:s instanceof Error?s.message:String(s)}),{continue:!0,suppressOutput:!0}}}}});var z$,L$=Pe(()=>{"use strict";Or();oe();z$={async execute(t){if(!await Rr())return{continue:!0,suppressOutput:!0};let{sessionId:r}=t;if(!r)return y.warn("HOOK","session-complete: Missing sessionId, skipping"),{continue:!0,suppressOutput:!0};y.info("HOOK","\u2192 session-complete: Removing session from active map",{contentSessionId:r});try{let n=await Tt("/api/sessions/complete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({contentSessionId:r})});if(n.ok)y.info("HOOK","Session completed successfully",{contentSessionId:r});else{let i=await n.text();y.warn("HOOK","session-complete: Failed to complete session",{status:n.status,body:i})}}catch(n){y.warn("HOOK","session-complete: Error completing session",{error:n.message})}return{continue:!0,suppressOutput:!0}}}});function N9(t){let e=bge[t];return e||(y.warn("HOOK",`Unknown event type: ${t}, returning no-op`),{async execute(){return{continue:!0,suppressOutput:!0,exitCode:ot.SUCCESS}}})}var bge,M9=Pe(()=>{"use strict";gn();oe();k$();T$();R$();P$();A$();M$();j$();L$();k$();T$();R$();P$();A$();M$();j$();L$();bge={context:E$,"session-init":$$,observation:I$,summarize:O$,"session-complete":z$,"user-message":C$,"file-edit":N$,"file-context":D$}});var j9={};un(j9,{hookCommand:()=>xge,isWorkerUnavailableError:()=>D9});function D9(t){let e=t instanceof Error?t.message:String(t),r=e.toLowerCase();return["econnrefused","econnreset","epipe","etimedout","enotfound","econnaborted","enetunreach","ehostunreach","fetch failed","unable to connect","socket hang up"].some(i=>r.includes(i))||r.includes("timed out")||r.includes("timeout")||/failed:\s*5\d{2}/.test(e)||/status[:\s]+5\d{2}/.test(e)||/failed:\s*429/.test(e)||/status[:\s]+429/.test(e)?!0:(/failed:\s*4\d{2}/.test(e)||/status[:\s]+4\d{2}/.test(e)||t instanceof TypeError||t instanceof ReferenceError||t instanceof SyntaxError,!1)}async function xge(t,e,r={}){let n=process.stderr.write.bind(process.stderr);process.stderr.write=(()=>!0);try{let i=I9(t),s=N9(e),o=await x9(),a=i.normalizeInput(o);a.platform=t;let c=await s.execute(a),u=i.formatOutput(c);console.log(JSON.stringify(u));let l=c.exitCode??ot.SUCCESS;return r.skipExit||process.exit(l),l}catch(i){return D9(i)?(y.warn("HOOK",`Worker unavailable, skipping hook: ${i instanceof Error?i.message:i}`),r.skipExit||process.exit(ot.SUCCESS),ot.SUCCESS):(y.error("HOOK",`Hook error: ${i instanceof Error?i.message:i}`,{},i instanceof Error?i:void 0),r.skipExit||process.exit(ot.BLOCKING_ERROR),ot.BLOCKING_ERROR)}finally{process.stderr.write=n}}var z9=Pe(()=>{"use strict";S9();R9();M9();gn();oe()});var q$={};un(q$,{cleanClaudeMd:()=>Nge,generateClaudeMd:()=>Age});function Ege(t){return wge[t]||"\u{1F4DD}"}function kge(t){let e=(t.title?.length||0)+(t.subtitle?.length||0)+(t.narrative?.length||0)+(t.facts?.length||0);return Math.ceil(e/4)}function $ge(t){let e=new Set;try{let n=(0,q9.execSync)("git ls-files",{cwd:t,encoding:"utf-8",maxBuffer:52428800}).trim().split(` `).filter(i=>i);for(let i of n){let s=sr.default.join(t,i),o=sr.default.dirname(s);for(;o.length>t.length&&o.startsWith(t);)e.add(o),o=sr.default.dirname(o)}}catch(r){y.warn("CLAUDE_MD","git ls-files failed, falling back to directory walk",{error:String(r)}),F9(t,e)}return e}function F9(t,e,r=0){if(r>10)return;let n=["node_modules",".git",".next","dist","build",".cache","__pycache__",".venv","venv",".idea",".vscode","coverage",".claude-mem",".open-next",".turbo"];try{let i=(0,or.readdirSync)(t,{withFileTypes:!0});for(let s of i){if(!s.isDirectory()||n.includes(s.name)||s.name.startsWith(".")&&s.name!==".claude")continue;let o=sr.default.join(t,s.name);e.add(o),F9(o,e,r+1)}}catch{}}function Tge(t,e){let r=n=>{if(!n)return!1;try{let i=JSON.parse(n);if(Array.isArray(i))return i.some(s=>jo(s,e))}catch{}return!1};return r(t.files_modified)||r(t.files_read)}function Ige(t,e,r,n){let i=n*3,s=` SELECT o.*, o.discovery_tokens FROM observations o diff --git a/src/cli/handlers/file-context.ts b/src/cli/handlers/file-context.ts index a57ca768..aadab97b 100644 --- a/src/cli/handlers/file-context.ts +++ b/src/cli/handlers/file-context.ts @@ -104,9 +104,6 @@ export const fileContextHandler: EventHandler = { // Query worker for observations related to this file try { const queryParams = new URLSearchParams({ path: filePath }); - if (input.cwd) { - queryParams.set('project', input.cwd); - } const response = await workerHttpRequest(`/api/observations/by-file?${queryParams.toString()}`, { method: 'GET',