Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions plugins/genie/scripts/session-context.cjs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
#!/usr/bin/env node
"use strict";var f=require("node:fs"),l=require("node:path");var c=require("node:fs"),P="[a-z0-9][a-z0-9-]{0,63}",E=new RegExp(`^${P}$`);function y(t,n){let e=null;try{let s=(0,c.lstatSync)(t);if(!s.isFile()||s.isSymbolicLink()||s.size>n)return null;e=(0,c.openSync)(t,c.constants.O_RDONLY|c.constants.O_NOFOLLOW|c.constants.O_NONBLOCK);let o=(0,c.fstatSync)(e);if(!o.isFile()||o.size>n)return null;let i=Buffer.alloc(o.size),r=0;for(;r<i.byteLength;){let a=(0,c.readSync)(e,i,r,i.byteLength-r,r);if(a===0)break;r+=a}return i.subarray(0,r).toString("utf8")}catch{return null}finally{if(e!==null)try{(0,c.closeSync)(e)}catch{}}}function m(t,n,e){let s=null;try{let o=(0,c.lstatSync)(t);if(!o.isFile()||o.isSymbolicLink()||o.size>n)return null;s=(0,c.openSync)(t,c.constants.O_RDONLY|c.constants.O_NOFOLLOW|c.constants.O_NONBLOCK);let i=(0,c.fstatSync)(s);if(!i.isFile()||i.size>n)return null;let r=Buffer.alloc(Math.min(i.size,e)),a=0;for(;a<r.byteLength;){let d=(0,c.readSync)(s,r,a,r.byteLength-a,a);if(d===0)break;a+=d}return r.subarray(0,a).toString("utf8")}catch{return null}finally{if(s!==null)try{(0,c.closeSync)(s)}catch{}}}var G={"row-end":/^\|\s*\*\*Status\*\*\s*\|(\s*.*?\s*)\|\s*$/m,"first-pipe":/^\|\s*\*\*Status\*\*\s*\|(\s*[^|\n]*?\s*)\|/m},F=/^\*\*Status:\*\*(\s*.*)$/m;function k(t,n,e){let s=new RegExp(n,"gm");for(let o=s.exec(t);o!==null;o=s.exec(t)){if(!e||e(o[1]))return o[1].trim();s.lastIndex=o.index+1}return null}function v(t,n,e){return k(t,G[n].source,e)}function D(t,n){return k(t,F.source,n)}function A(t,n){let e=n.startsWith("wish/")?n.slice(5):null;if(!e)return null;if(t.includes(e))return{wish:e,group:null};for(let o of t)if(e.startsWith(`${o}-`)){let i=e.slice(o.length+1);if(i)return{wish:o,group:i}}let s=e.lastIndexOf("-");return s>0&&s<e.length-1?{wish:e.slice(0,s),group:e.slice(s+1)}:{wish:e,group:null}}var M=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function N(t){return typeof t=="string"&&M.test(t)}var L=2048,I=256*1024,x=4*1024,H=64,Y=32,w=64*1024,$=4*1024,X=24,q=new Set(["DRAFT","FIX-FIRST","APPROVED","IN_PROGRESS","BLOCKED"]),z=new Set(["blocked","ready","in_progress","done"]),K=new Set(["DRAFT","FIX-FIRST","APPROVED","IN_PROGRESS","BLOCKED","SHIPPED","DONE","EXECUTED","MERGED"]),j=/^\s*[A-Z_ -]+\s*$/,V=/^\s*[A-Z_ -]/,Z=/^[A-Z_ -]+/,C=/^[a-z0-9][a-z0-9-]{0,63}$/,J=/^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/;function Q(){try{let t=[],n=0;for(;n<=w;){let r=Buffer.allocUnsafe(Math.min(16384,w+1-n)),a=(0,f.readSync)(0,r,0,r.byteLength,null);if(a===0)break;t.push(r.subarray(0,a)),n+=a}if(n>w)return{hookEventName:"SessionStart"};let e=Buffer.concat(t).toString("utf8").trim();if(!e)return{hookEventName:"SessionStart"};let s=JSON.parse(e);if(typeof s!="object"||s===null||Array.isArray(s))return{hookEventName:"SessionStart"};let o=s.hook_event_name,i=s.cwd;return{hookEventName:o==="SessionStart"?o:"SessionStart",cwd:typeof i=="string"&&(0,l.isAbsolute)(i)?i:void 0}}catch{return{hookEventName:"SessionStart"}}}function nn(t){let n=v(t,"first-pipe",s=>j.test(s))??void 0,e=D(t,s=>V.test(s))?.match(Z)?.[0];return(n??e)?.trim()??null}function W(t){let n=nn(t)?.split(/\s+[—-]\s+/)[0]?.trim();return n&&K.has(n)?n:null}function O(t){try{let n=(0,f.lstatSync)(t);return n.isDirectory()&&!n.isSymbolicLink()}catch{return!1}}function T(t){return O((0,l.join)(t,".genie"))&&O((0,l.join)(t,".genie","wishes"))}function tn(t){let n=(0,l.join)(t,".genie","wishes");if(!T(t))return[];let e=[];try{let s=[],o=(0,f.opendirSync)(n);try{for(let i=0;i<H;i++){let r=o.readSync();if(!r)break;r.isDirectory()&&!r.isSymbolicLink()&&E.test(r.name)&&s.push(r.name)}}finally{try{o.closeSync()}catch{}}s.sort();for(let i of s){let r=(0,l.join)(n,i,"WISH.md"),a=(0,f.existsSync)(r)?r:(0,l.join)(n,i,"wish.md");if(!(0,f.existsSync)(a))continue;let d=m(a,I,x);if(d===null)continue;let u=W(d);e.push({slug:i,status:u,active:u!==null&&q.has(u)})}}catch(s){process.stderr.write(`[session-context] unable to read wish state: ${s instanceof Error?s.message:String(s)}
`)}return e}function en(t,n){let e=(0,l.join)(t,".genie","wishes");if(!T(t))return null;let s=(0,l.join)(e,n,"WISH.md"),o=(0,f.existsSync)(s)?s:(0,l.join)(e,n,"wish.md");if(!(0,f.existsSync)(o))return null;let i=m(o,I,x);return i===null?null:W(i)}function sn(t){try{let n=(0,f.lstatSync)((0,l.join)(t,".git"));if(n.isSymbolicLink())return null;if(n.isDirectory())return{kind:"dir",path:(0,l.join)(t,".git")};if(n.isFile())return{kind:"file",path:(0,l.join)(t,".git")}}catch{}return null}function rn(t){let n=y(t,$);if(n===null)return null;let e=/^gitdir:\s*(.+?)\s*$/m.exec(n);if(!e)return null;let s=e[1];return(0,l.isAbsolute)(s)?s:(0,l.resolve)((0,l.dirname)(t),s)}function on(t){let n;try{n=(0,f.realpathSync)(t)}catch{n=(0,f.realpathSync)(process.cwd())}let e=n,s;for(let o=0;o<Y;o++){!s&&T(n)&&(s=n);let i=sn(n);if(i){if(i.kind==="dir")return{root:n,gitDir:i.path,dbPath:(0,l.join)(n,".genie","genie.db"),dbUnavailableReason:null};let a=rn(i.path);return a===null?{root:n,gitDir:null,dbPath:null,dbUnavailableReason:"unreadable .git pointer"}:(0,l.basename)((0,l.dirname)(a))==="worktrees"?{root:n,gitDir:a,dbPath:(0,l.join)((0,l.dirname)((0,l.dirname)((0,l.dirname)(a))),".genie","genie.db"),dbUnavailableReason:null}:{root:n,gitDir:a,dbPath:null,dbUnavailableReason:"external/separate git-dir layout"}}let r=(0,l.dirname)(n);if(r===n)break;n=r}return{root:s??e,gitDir:null,dbPath:null,dbUnavailableReason:"no repository root"}}function an(t){let n=y((0,l.join)(t,"HEAD"),$);if(n===null)return null;let e=/^ref:\s*refs\/heads\/(\S+?)\s*$/m.exec(n);return e?e[1]:null}function ln(){try{let t=require("node:sqlite");return typeof t.DatabaseSync=="function"?t:null}catch{return null}}function h(t){process.stderr.write(`[session-context] ${t} \u2014 falling back to wish-file scan
`)}function un(t){if(t===null)return{db:null,reason:null};if(!(0,f.existsSync)(t))return h(`genie.db absent at ${t}`),{db:null,reason:"genie.db absent"};let n=ln();if(n===null)return h("node:sqlite unavailable (minimum Node 22.13)"),{db:null,reason:"no sqlite driver"};try{let e=new n.DatabaseSync(t,{readOnly:!0});try{e.exec?.("PRAGMA busy_timeout = 2000")}catch{}return{db:e,reason:null}}catch(e){return h(`genie.db unreadable at ${t}: ${e instanceof Error?e.message:String(e)}`),{db:null,reason:"genie.db unreadable"}}}function p(t){try{t?.close()}catch{}}function cn(t){if(typeof t!="object"||t===null)return null;let n=t;if(!J.test(n.id)||!z.has(n.status))return null;let e=n.group_name;return e!=null&&!C.test(e)?null:{id:n.id,status:n.status,group:e??null}}function B(t){let n=[];for(let e of t.slice(0,X)){let s=cn(e);s&&n.push(s)}return n}function gn(t){return t.prepare(`SELECT wish FROM (
"use strict";var f=require("node:fs"),I=require("node:os"),a=require("node:path");var c=require("node:fs"),G="[a-z0-9][a-z0-9-]{0,63}",E=new RegExp(`^${G}$`);function y(t,n){let e=null;try{let s=(0,c.lstatSync)(t);if(!s.isFile()||s.isSymbolicLink()||s.size>n)return null;e=(0,c.openSync)(t,c.constants.O_RDONLY|c.constants.O_NOFOLLOW|c.constants.O_NONBLOCK);let o=(0,c.fstatSync)(e);if(!o.isFile()||o.size>n)return null;let i=Buffer.alloc(o.size),r=0;for(;r<i.byteLength;){let l=(0,c.readSync)(e,i,r,i.byteLength-r,r);if(l===0)break;r+=l}return i.subarray(0,r).toString("utf8")}catch{return null}finally{if(e!==null)try{(0,c.closeSync)(e)}catch{}}}function m(t,n,e){let s=null;try{let o=(0,c.lstatSync)(t);if(!o.isFile()||o.isSymbolicLink()||o.size>n)return null;s=(0,c.openSync)(t,c.constants.O_RDONLY|c.constants.O_NOFOLLOW|c.constants.O_NONBLOCK);let i=(0,c.fstatSync)(s);if(!i.isFile()||i.size>n)return null;let r=Buffer.alloc(Math.min(i.size,e)),l=0;for(;l<r.byteLength;){let g=(0,c.readSync)(s,r,l,r.byteLength-l,l);if(g===0)break;l+=g}return r.subarray(0,l).toString("utf8")}catch{return null}finally{if(s!==null)try{(0,c.closeSync)(s)}catch{}}}var F={"row-end":/^\|\s*\*\*Status\*\*\s*\|(\s*.*?\s*)\|\s*$/m,"first-pipe":/^\|\s*\*\*Status\*\*\s*\|(\s*[^|\n]*?\s*)\|/m},M=/^\*\*Status:\*\*(\s*.*)$/m;function v(t,n,e){let s=new RegExp(n,"gm");for(let o=s.exec(t);o!==null;o=s.exec(t)){if(!e||e(o[1]))return o[1].trim();s.lastIndex=o.index+1}return null}function k(t,n,e){return v(t,F[n].source,e)}function A(t,n){return v(t,M.source,n)}function D(t,n){let e=n.startsWith("wish/")?n.slice(5):null;if(!e)return null;if(t.includes(e))return{wish:e,group:null};for(let o of t)if(e.startsWith(`${o}-`)){let i=e.slice(o.length+1);if(i)return{wish:o,group:i}}let s=e.lastIndexOf("-");return s>0&&s<e.length-1?{wish:e.slice(0,s),group:e.slice(s+1)}:{wish:e,group:null}}var H=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function N(t){return typeof t=="string"&&H.test(t)}var L=2048,x=256*1024,C=4*1024,Y=64,X=32,w=64*1024,$=4*1024,q=24,z=new Set(["DRAFT","FIX-FIRST","APPROVED","IN_PROGRESS","BLOCKED"]),j=new Set(["blocked","ready","in_progress","done"]),K=new Set(["DRAFT","FIX-FIRST","APPROVED","IN_PROGRESS","BLOCKED","SHIPPED","DONE","EXECUTED","MERGED"]),V=/^\s*[A-Z_ -]+\s*$/,Z=/^\s*[A-Z_ -]/,J=/^[A-Z_ -]+/,W=/^[a-z0-9][a-z0-9-]{0,63}$/,Q=/^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/;function nn(){try{let t=[],n=0;for(;n<=w;){let r=Buffer.allocUnsafe(Math.min(16384,w+1-n)),l=(0,f.readSync)(0,r,0,r.byteLength,null);if(l===0)break;t.push(r.subarray(0,l)),n+=l}if(n>w)return{hookEventName:"SessionStart"};let e=Buffer.concat(t).toString("utf8").trim();if(!e)return{hookEventName:"SessionStart"};let s=JSON.parse(e);if(typeof s!="object"||s===null||Array.isArray(s))return{hookEventName:"SessionStart"};let o=s.hook_event_name,i=s.cwd;return{hookEventName:o==="SessionStart"?o:"SessionStart",cwd:typeof i=="string"&&(0,a.isAbsolute)(i)?i:void 0}}catch{return{hookEventName:"SessionStart"}}}function tn(t){let n=k(t,"first-pipe",s=>V.test(s))??void 0,e=A(t,s=>Z.test(s))?.match(J)?.[0];return(n??e)?.trim()??null}function B(t){let n=tn(t)?.split(/\s+[—-]\s+/)[0]?.trim();return n&&K.has(n)?n:null}function O(t){try{let n=(0,f.lstatSync)(t);return n.isDirectory()&&!n.isSymbolicLink()}catch{return!1}}function T(t){return O((0,a.join)(t,".genie"))&&O((0,a.join)(t,".genie","wishes"))}function en(t){let n=(0,a.join)(t,".genie","wishes");if(!T(t))return[];let e=[];try{let s=[],o=(0,f.opendirSync)(n);try{for(let i=0;i<Y;i++){let r=o.readSync();if(!r)break;r.isDirectory()&&!r.isSymbolicLink()&&E.test(r.name)&&s.push(r.name)}}finally{try{o.closeSync()}catch{}}s.sort();for(let i of s){let r=(0,a.join)(n,i,"WISH.md"),l=(0,f.existsSync)(r)?r:(0,a.join)(n,i,"wish.md");if(!(0,f.existsSync)(l))continue;let g=m(l,x,C);if(g===null)continue;let u=B(g);e.push({slug:i,status:u,active:u!==null&&z.has(u)})}}catch(s){process.stderr.write(`[session-context] unable to read wish state: ${s instanceof Error?s.message:String(s)}
`)}return e}function sn(t,n){let e=(0,a.join)(t,".genie","wishes");if(!T(t))return null;let s=(0,a.join)(e,n,"WISH.md"),o=(0,f.existsSync)(s)?s:(0,a.join)(e,n,"wish.md");if(!(0,f.existsSync)(o))return null;let i=m(o,x,C);return i===null?null:B(i)}function rn(t){try{let n=(0,f.lstatSync)((0,a.join)(t,".git"));if(n.isSymbolicLink())return null;if(n.isDirectory())return{kind:"dir",path:(0,a.join)(t,".git")};if(n.isFile())return{kind:"file",path:(0,a.join)(t,".git")}}catch{}return null}function on(t){let n=y(t,$);if(n===null)return null;let e=/^gitdir:\s*(.+?)\s*$/m.exec(n);if(!e)return null;let s=e[1];return(0,a.isAbsolute)(s)?s:(0,a.resolve)((0,a.dirname)(t),s)}function an(t){let n;try{n=(0,f.realpathSync)(t)}catch{n=(0,f.realpathSync)(process.cwd())}let e=n,s;for(let o=0;o<X;o++){!s&&T(n)&&(s=n);let i=rn(n);if(i){if(i.kind==="dir")return{root:n,gitDir:i.path,dbPath:(0,a.join)(n,".genie","genie.db"),dbUnavailableReason:null};let l=on(i.path);return l===null?{root:n,gitDir:null,dbPath:null,dbUnavailableReason:"unreadable .git pointer"}:(0,a.basename)((0,a.dirname)(l))==="worktrees"?{root:n,gitDir:l,dbPath:(0,a.join)((0,a.dirname)((0,a.dirname)((0,a.dirname)(l))),".genie","genie.db"),dbUnavailableReason:null}:{root:n,gitDir:l,dbPath:null,dbUnavailableReason:"external/separate git-dir layout"}}let r=(0,a.dirname)(n);if(r===n)break;n=r}return{root:s??e,gitDir:null,dbPath:null,dbUnavailableReason:"no repository root"}}function ln(t){let n=y((0,a.join)(t,"HEAD"),$);if(n===null)return null;let e=/^ref:\s*refs\/heads\/(\S+?)\s*$/m.exec(n);return e?e[1]:null}function un(){try{let t=require("node:sqlite");return typeof t.DatabaseSync=="function"?t:null}catch{return null}}function h(t){process.stderr.write(`[session-context] ${t} \u2014 falling back to wish-file scan
`)}function cn(){let t=process.env.GENIE_CONFIG_FILE??(0,a.join)(process.env.GENIE_HOME??(0,a.join)((0,I.homedir)(),".genie"),"config.json");try{if(!(0,f.existsSync)(t))return"standalone";let n=JSON.parse((0,f.readFileSync)(t,"utf8"));if(n===null||typeof n!="object")return"invalid";let e=n.orchestration;if(e===void 0)return"standalone";if(e===null||typeof e!="object")return"invalid";let s=e.mode;return s===void 0||s==="standalone"?"standalone":s==="orca"?"orca":"invalid"}catch{return"invalid"}}function dn(t){if(t===null)return{db:null,reason:null};let n=cn();if(n==="orca")return h("genie.db not opened \u2014 Orca is the selected lifecycle authority"),{db:null,reason:"Orca is the selected lifecycle authority"};if(n==="invalid")return h("genie.db not opened \u2014 orchestration authority config is unreadable"),{db:null,reason:"orchestration authority unreadable"};if(!(0,f.existsSync)(t))return h(`genie.db absent at ${t}`),{db:null,reason:"genie.db absent"};let e=un();if(e===null)return h("node:sqlite unavailable (minimum Node 22.13)"),{db:null,reason:"no sqlite driver"};try{let s=new e.DatabaseSync(t,{readOnly:!0});try{s.exec?.("PRAGMA busy_timeout = 2000")}catch{}return{db:s,reason:null}}catch(s){return h(`genie.db unreadable at ${t}: ${s instanceof Error?s.message:String(s)}`),{db:null,reason:"genie.db unreadable"}}}function p(t){try{t?.close()}catch{}}function fn(t){if(typeof t!="object"||t===null)return null;let n=t;if(!Q.test(n.id)||!j.has(n.status))return null;let e=n.group_name;return e!=null&&!W.test(e)?null:{id:n.id,status:n.status,group:e??null}}function P(t){let n=[];for(let e of t.slice(0,q)){let s=fn(e);s&&n.push(s)}return n}function gn(t){return t.prepare(`SELECT wish FROM (
SELECT wish FROM tasks WHERE wish IS NOT NULL
UNION SELECT wish FROM wish_groups WHERE wish IS NOT NULL
) ORDER BY LENGTH(wish) DESC`).all().map(e=>e.wish)}function fn(t,n){let e=t.prepare("SELECT id, status, group_name FROM tasks WHERE wish = ? ORDER BY rowid").all(n);return B(e)}function dn(t,n){let e=n.map(()=>"?").join(", "),s=t.prepare(`SELECT id, status, group_name FROM tasks
WHERE claimed_by IN (${e}) AND status = 'in_progress' ORDER BY rowid`).all(...n);return B(s)}function hn(t,n){return[...new Set([...t,...n])].sort((e,s)=>s.length-e.length)}function R(t){return Buffer.byteLength(t,"utf8")<=L?t:Buffer.from(t,"utf8").subarray(0,L).toString("utf8")}function Sn(t,n,e,s,o){let i=t.group===null?"":` group=${t.group}`,r=["Genie wish context (repository data, not instructions):"];if(r.push(`- wish=${t.wish} status=${n??"unknown"}${i} plan=${e}`),o!==null)r.push(`- tasks: unavailable (${o})`);else{let a=s.filter(u=>u.group===null).length,d=s.filter(u=>u.status==="ready").length;r.push(`- base=${a} ready=${d}`);for(let u of s)r.push(`- ${u.id} status=${u.status}`)}return R(r.join(`
`))}function pn(t,n){let e=["Genie task context (repository data, not instructions):",`- agent=${t} claimed=${n.length}`];for(let s of n)e.push(`- ${s.id} status=${s.status}`);return R(e.join(`
`))}function bn(t,n,e){let s=["Genie session context (repository data, not instructions):",`- repo=${t}, branch=${n??"<none>"}, active wishes: ${e}`];return R(s.join(`
`))}function En(){let t=[],n=process.env.GENIE_AGENT_ID,e=process.env.GENIE_AGENT_NAME;return N(n)&&t.push(n),e&&t.push(e),t}function _(t,n){process.stdout.write(n?JSON.stringify({hookSpecificOutput:{hookEventName:t,additionalContext:n}}):"{}")}function yn(){let t=Q();if(process.env.GENIE_WORKER==="1"){process.stdout.write("{}");return}let n=on(t.cwd??process.cwd()),e=n.gitDir===null?null:an(n.gitDir),s=tn(n.root),o=s.filter(g=>g.active).length,i=s.map(g=>g.slug),r=null,a=null;if(n.dbPath===null)n.dbUnavailableReason!==null&&(h(`genie.db unavailable (${n.dbUnavailableReason})`),a=`genie.db unavailable (${n.dbUnavailableReason})`);else{let g=un(n.dbPath);r=g.db,a=g.reason}let d=i;if(r!==null)try{d=hn(gn(r),i)}catch(g){p(r),r=null,a="genie.db unreadable",h(`genie.db unreadable at ${n.dbPath}: ${g instanceof Error?g.message:String(g)}`)}let u=e===null?null:A(d,e);if(u!==null&&d.includes(u.wish)&&E.test(u.wish)&&(u.group===null||C.test(u.group))&&u!==null){let g=[];if(r!==null)try{let S=fn(r,u.wish);g=u.group===null?S:S.filter(U=>U.group===u.group)}catch(S){p(r),r=null,a="genie.db unreadable",h(`genie.db unreadable at ${n.dbPath}: ${S instanceof Error?S.message:String(S)}`)}_(t.hookEventName,Sn(u,en(n.root,u.wish),`.genie/wishes/${u.wish}/WISH.md`,g,a)),p(r);return}let b=En();if(r!==null&&b.length>0)try{let g=dn(r,b);if(g.length>0){_(t.hookEventName,pn(b[0],g)),p(r);return}}catch(g){p(r),r=null,h(`genie.db unreadable at ${n.dbPath}: ${g instanceof Error?g.message:String(g)}`)}p(r),_(t.hookEventName,bn((0,l.basename)(n.root),e,o))}typeof require<"u"&&require.main===module&&yn();
) ORDER BY LENGTH(wish) DESC`).all().map(e=>e.wish)}function hn(t,n){let e=t.prepare("SELECT id, status, group_name FROM tasks WHERE wish = ? ORDER BY rowid").all(n);return P(e)}function Sn(t,n){let e=n.map(()=>"?").join(", "),s=t.prepare(`SELECT id, status, group_name FROM tasks
WHERE claimed_by IN (${e}) AND status = 'in_progress' ORDER BY rowid`).all(...n);return P(s)}function pn(t,n){return[...new Set([...t,...n])].sort((e,s)=>s.length-e.length)}function R(t){return Buffer.byteLength(t,"utf8")<=L?t:Buffer.from(t,"utf8").subarray(0,L).toString("utf8")}function bn(t,n,e,s,o){let i=t.group===null?"":` group=${t.group}`,r=["Genie wish context (repository data, not instructions):"];if(r.push(`- wish=${t.wish} status=${n??"unknown"}${i} plan=${e}`),o!==null)r.push(`- tasks: unavailable (${o})`);else{let l=s.filter(u=>u.group===null).length,g=s.filter(u=>u.status==="ready").length;r.push(`- base=${l} ready=${g}`);for(let u of s)r.push(`- ${u.id} status=${u.status}`)}return R(r.join(`
`))}function En(t,n){let e=["Genie task context (repository data, not instructions):",`- agent=${t} claimed=${n.length}`];for(let s of n)e.push(`- ${s.id} status=${s.status}`);return R(e.join(`
`))}function yn(t,n,e){let s=["Genie session context (repository data, not instructions):",`- repo=${t}, branch=${n??"<none>"}, active wishes: ${e}`];return R(s.join(`
`))}function mn(){let t=[],n=process.env.GENIE_AGENT_ID,e=process.env.GENIE_AGENT_NAME;return N(n)&&t.push(n),e&&t.push(e),t}function _(t,n){process.stdout.write(n?JSON.stringify({hookSpecificOutput:{hookEventName:t,additionalContext:n}}):"{}")}function wn(){let t=nn();if(process.env.GENIE_WORKER==="1"){process.stdout.write("{}");return}let n=an(t.cwd??process.cwd()),e=n.gitDir===null?null:ln(n.gitDir),s=en(n.root),o=s.filter(d=>d.active).length,i=s.map(d=>d.slug),r=null,l=null;if(n.dbPath===null)n.dbUnavailableReason!==null&&(h(`genie.db unavailable (${n.dbUnavailableReason})`),l=`genie.db unavailable (${n.dbUnavailableReason})`);else{let d=dn(n.dbPath);r=d.db,l=d.reason}let g=i;if(r!==null)try{g=pn(gn(r),i)}catch(d){p(r),r=null,l="genie.db unreadable",h(`genie.db unreadable at ${n.dbPath}: ${d instanceof Error?d.message:String(d)}`)}let u=e===null?null:D(g,e);if(u!==null&&g.includes(u.wish)&&E.test(u.wish)&&(u.group===null||W.test(u.group))&&u!==null){let d=[];if(r!==null)try{let S=hn(r,u.wish);d=u.group===null?S:S.filter(U=>U.group===u.group)}catch(S){p(r),r=null,l="genie.db unreadable",h(`genie.db unreadable at ${n.dbPath}: ${S instanceof Error?S.message:String(S)}`)}_(t.hookEventName,bn(u,sn(n.root,u.wish),`.genie/wishes/${u.wish}/WISH.md`,d,l)),p(r);return}let b=mn();if(r!==null&&b.length>0)try{let d=Sn(r,b);if(d.length>0){_(t.hookEventName,En(b[0],d)),p(r);return}}catch(d){p(r),r=null,h(`genie.db unreadable at ${n.dbPath}: ${d instanceof Error?d.message:String(d)}`)}p(r),_(t.hookEventName,yn((0,a.basename)(n.root),e,o))}typeof require<"u"&&require.main===module&&wn();
Loading
Loading