pi-herdsman 0.2.0 → 0.2.1

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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: generalist
3
- description: General-purpose execution agent for scoped tasks that do not fit specialized roles
3
+ description: General-purpose execution agent for scoped tasks that do not fit scout, researcher, implementer, or reviewer
4
4
  model: openai-codex/gpt-5.6-luna
5
5
  thinking: medium
6
6
  agents: ["scout", "researcher"]
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: implementer
3
- description: Focused implementation agent for an explicitly approved, resolved change; edits, tests, and reports
3
+ description: Focused implementation agent for a resolved change; use when the required behavior is already decided and the task is to edit, test, and report
4
4
  model: openai-codex/gpt-5.6-luna
5
5
  thinking: high
6
6
  agents: ["scout"]
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: researcher
3
- description: Focused current-information research specialist for authoritative evidence beyond the local codebase; returns a concise source-grounded brief
3
+ description: External research specialist for questions that require web, documentation, standards, vendor, or other authoritative evidence beyond the repository; use for current facts, API behavior, comparisons, and source-backed recommendations
4
4
  model: openai-codex/gpt-5.6-luna
5
5
  thinking: medium
6
6
  systemPromptMode: replace
@@ -11,10 +11,10 @@ skills: []
11
11
  tools: ["read", "ls", "find", "grep", "web_search", "fetch_content", "get_search_content", "source_check"]
12
12
  ---
13
13
 
14
- You are researcher, a focused research agent for current or authoritative
15
- information, comparisons, and evidence beyond the local codebase. Answer the
16
- assigned question directly with current, source-grounded evidence available
17
- through the active capabilities.
14
+ You are researcher, a read-only external research specialist. Investigate
15
+ questions whose answer depends on evidence beyond the repository, such as
16
+ official documentation, APIs, standards, vendor behavior, current facts,
17
+ technical comparisons, or prior art.
18
18
 
19
19
  If authoritative sources are supplied, inspect them first. Otherwise use
20
20
  bounded research for the required angles and prefer official and primary
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: reviewer
3
- description: Independent read-only review specialist for diffs, plans, codebase health, and PR/issue validation
3
+ description: Independent read-only reviewer for plans, diffs, implementations, and codebase health; use when work needs verification, missing-case analysis, or regression review rather than modification
4
4
  model: openai-codex/gpt-5.6-luna
5
5
  thinking: medium
6
6
  agents: ["scout", "researcher"]
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: scout
3
- description: Fast read-only codebase reconnaissance for unfamiliar areas; returns verified entry points, dependencies, constraints, and risks for handoff, not implementation
3
+ description: Read-only codebase reconnaissance for unfamiliar areas; use to find entry points, trace flows, dependencies, constraints, and risks before deciding or editing
4
4
  model: openai-codex/gpt-5.6-luna
5
5
  thinking: medium
6
6
  systemPromptMode: replace
package/dist/index.js CHANGED
@@ -40,24 +40,24 @@ ${n.snapshot}`:e.detail.message,details:t})}async function qu(e,n,t,s,i,r,a,o,d)
40
40
  `,o);if(!a(d===-1?n.recentOutput.slice(o):n.recentOutput.slice(o,d))||d===-1)break;o=d+1}}if(n.agents?.length&&a("agents")){for(let o of n.agents)if(!a(o))break}if(n.process){for(let o of Gf(n.process))if(!a(o))break}return i}function wc(e,n){let t=Ct(n);return t.some(s=>s.lead===e)?e:t[0]?.lead}function x(e){return typeof e=="string"&&e.trim()?e:""}function Xf(e,n){if(n<=0)return"";if(Ae(e)<=n)return e;let t="\u2026";if(Ae(t)>=n)return Tn(t,n,"");let s=Array.from(e);for(let i=0;i<s.length;i++){let r=t+s.slice(i).join("");if(Ae(r)<=n)return r}return Tn(e,n,"")}function Yf(e){return e.replace(/\u001b\][^\u0007]*(?:\u0007|\u001b\\)/gu,"").replace(/\u001b\[[0-?]*[ -/]*[@-~]/gu,"").replace(/[\u0000-\u001f\u007f]/gu," ").replace(/\s+/gu," ").trim()}function Vf(e,n){if(n<=0)return"";let t=e.map(Yf).filter(Boolean),s=t.at(-1)??"?",i="\u25CF";if(n<=Ae(i))return Tn(i,n,"");let r=`${i} `,a=n-Ae(r);if(a<=0)return i;let o=Xf(s,a),d=`${r}${o}`;for(let c=t.length-2;c>=0;c--){let f=`${r}${t[c]} \u2192 ${d.slice(r.length)}`;if(Ae(f)<=n)d=f;else break}return d}function Qf(e,n,t,s){let i=Vf(e,t);if(!n?.length)return i;let r=` [${n.join(", ")}]`,a=t-Ae(i);if(a<6)return i;let o=Tn(r,a,"\u2026");return`${i}${s.fg("muted",o)}`}function sr(e){return Array.isArray(e)?e.filter(n=>typeof n=="string"&&!!n):[]}function ac(e){return sr(e).flatMap(n=>n.split(",").map(t=>t.trim()).filter(t=>t.length>0))}function Ic(e){let n=Array.isArray(e.tools)&&e.tools.length>0,t=ac(e.tools),s=new Set(ac(e.excludeTools));if(n){let r=t.filter(a=>!s.has(a));return r.length?r.join(", "):"none"}if(e.noTools===!0)return"none";let i=[...s];return i.length?`default except ${i.join(", ")}`:"default"}function bc(e){let n=sr(e.skills);return e.noSkills===!1||e.noSkills===void 0&&e.inheritSkills===!0?n.length?`default + ${n.join(", ")}`:"default":n.length?n.join(", "):"none"}function Po(e){return e.flatMap(n=>{let t=x(n.name??n.agent),s=x(n.description);if(!t)return[];let i=[...n.enabled===!1?["status disabled"]:[],`tools ${Ic(n)}`,`skills ${bc(n)}`,...Array.isArray(n.agents)&&n.agents.length?[`delegates ${n.agents.join(", ")}`]:[]];return[` ${t}${s?` \u2014 ${s}`:""} | ${i.join(" | ")}`]})}function ko(e){let n=xf();if(!$f(e))return e;let t=Cf(n,e);return t===""?"~":t!==".."&&!t.startsWith(`..${Tf}`)?`~/${t}`:e}function Zf(e){let n=rc(e);if(n==="SKILL.md"){let t=rc(Pf(e));if(t&&t!=="."&&t!=="..")return t}return n||e}function eg(e){return x(e.extensionSource)?x(e.overrideSource)?"overridden":"bundled":"custom"}function ng(e){let n=Ic(e);return n==="default"?void 0:n!=="none"||e.noTools===!0||Array.isArray(e.tools)&&e.tools.length>0?n:void 0}function tg(e){let n=[...new Set(sr(e.skills))],t=n.map(Zf),s=new Map;for(let a of t)s.set(a,(s.get(a)??0)+1);let i=t.map((a,o)=>s.get(a)>1?sg(n[o]??"",n,a,o):a),r=bc({...e,skills:i});return r==="none"||r==="default"?void 0:r}function at(e,n,t,s="customMessageText"){return`${e.fg("muted",`${n.padEnd(9)} `)}${e.fg(s,t)}`}function sg(e,n,t,s){let i=e.split(/[\\/]/u).filter(Boolean);if(i.at(-1)==="SKILL.md"&&i.pop(),!i.length)return t;let r=n.map(a=>{let o=a.split(/[\\/]/u).filter(Boolean);return o.at(-1)==="SKILL.md"&&o.pop(),o});for(let a=1;a<=i.length;a++){let o=i.slice(-a).join("/");if(r.every((d,c)=>c===s||d.slice(-a).join("/")!==o))return o}return i.join("/")}function ir(e,n,t){let s=new uc.Box(e,n,t),i=s.render.bind(s);return s.render=r=>i(r).map(a=>Ae(a)>r?Tn(a,Math.max(0,r),""):a),s}function Sc(e,n,t={}){let s=e.length>1?[`${n.bold(n.fg("customMessageLabel","Definitions"))}${n.fg("muted",` \xB7 ${e.length}`)}`]:[];e.forEach(r=>{let a=x(r.name??r.agent);if(!a)return;s.length>1&&s.push("");let o=eg(r),d=o==="bundled"?"":` ${n.fg(o==="overridden"?"warning":"accent",o)}`;s.push(`${n.bold(n.fg("customMessageText",a))}${d}`);let c=x(r.description);c&&s.push(n.fg("customMessageText",c)),r.enabled===!1&&s.push(at(n,"status","disabled","warning"));let f=x(r.model),l=x(r.thinking);f?s.push(`${n.fg("customMessageText",f)}${l?` ${n.fg("muted","\xB7")} ${n.fg("muted",l)}`:""}`):l&&s.push(at(n,"thinking",l));let u=ng(r);u&&s.push(at(n,"tools",u));let p=tg(r);p&&s.push(at(n,"skills",p));let m=sr(r.agents);m.length&&s.push(at(n,"delegates",m.join(", ")));let v=x(r.projectSource);v&&s.push(at(n,"project",ko(v),"dim"));let h=x(r.overrideSource);if(h&&s.push(at(n,o==="overridden"?"override":"source",ko(h),"dim")),typeof t.instructions=="string"){let S=Array.from(t.instructions).length;t.expanded===!0?s.push("",n.bold(n.fg("customMessageLabel","Instructions")),t.instructions||"(empty)"):s.push(at(n,"instructions",`${S} chars \xB7 Ctrl+O to expand`))}});let i=ir(1,1,r=>n.bg("customMessageBg",r));return i.addChild(new Te(s.join(`
41
41
  `),0,0)),i}function vc(e,n){let t=e.details&&typeof e.details=="object"?e.details.summary:void 0;return or(new Te([n.bold(n.fg("customMessageLabel","Stop all")),typeof t=="string"?t:""].join(`
42
42
  `),0,0),n,1)}function kc(e,n){let t=e.data;if(!t||typeof t!="object"||Array.isArray(t))return;let s=t;if(s.phase!=="finished"||typeof s.sessionId!="string"||typeof s.startedAt!="number"||typeof s.completedAt!="number")return;let i=os(s.startedAt,s.completedAt);if(i)return new Un(`${n.bold(n.fg("customMessageLabel","herd run"))}${n.fg("muted"," \xB7 ")}${n.fg("accent",i)}`,0,0)}function dt(e,n){if(n!=null){if(typeof n=="string")return n?`${e}: ${n}`:void 0;if(typeof n=="object"){let t=Object.entries(n).filter(([,s])=>s!=null&&s!=="");return t.length?`${e}: ${t.map(([s,i])=>`${s}=${String(i)}`).join(", ")}`:void 0}return`${e}: ${String(n)}`}}function $o(e,n){e=x(e)||"agent";let t=x(n.definition),s=n.cleanup_errors&&typeof n.cleanup_errors=="object"?["","Cleanup warnings:",JSON.stringify(n.cleanup_errors,null,2)]:[];if(n.ok===!1){let i=n.error??{};return[`Agent ${e} failed.`,`Category: ${x(i.category)||"error"}`,`Message: ${x(i.message)||"Operation failed"}`,...i.ids&&typeof i.ids=="object"?[dt("Identity",i.ids)].filter(r=>r!==void 0):[],...i.details&&typeof i.details=="object"?[dt("Stage",i.details.stage)].filter(r=>r!==void 0):[],...i.primary?[dt("Primary",i.primary)].filter(r=>r!==void 0):[],...i.cleanup?[dt("Cleanup",i.cleanup)].filter(r=>r!==void 0):[],...x(i.nextAction)?[`Next action: ${x(i.nextAction)}`]:[],...s].join(`
43
- `)}if(e==="inspect"){let i=n.process&&typeof n.process=="object"?n.process:void 0,r=Array.isArray(i?.foreground_processes)?i.foreground_processes.map(a=>{if(!a||typeof a!="object")return"";let o=a;return x(o.cmdline)||x(o.argv0)}).filter(Boolean):[];return[`Inspect agent ${x(n.agent)||"unknown"}.`,...x(n.session_id)?[`Session: ${n.session_id}`]:[],...x(n.pane_id)?[`Pane: ${n.pane_id}`]:[],...r.length?[`Foreground: ${r.join(" \xB7 ")}`]:[],...x(n.recent_output)?["Recent activity:",x(n.recent_output)]:[]].join(`
43
+ `)}if(e==="inspect"){let i=n.process&&typeof n.process=="object"?n.process:void 0,r=Array.isArray(i?.foreground_processes)?i.foreground_processes.map(a=>{if(!a||typeof a!="object")return"";let o=a;return x(o.cmdline)||x(o.argv0)}).filter(Boolean):[];return[`Inspect agent ${x(n.agent)||"unknown"}.`,...x(n.session_id)?[`Session: ${n.session_id}`]:[],...x(n.pane_id)?[`Pane: ${n.pane_id}`]:[],...r.length?[`Foreground: ${r.join(" \xB7 ")}`]:[],...x(n.recent_output)?["Recent activity:",x(n.recent_output)]:[],...n.recent_output_truncated===!0?["Recent output truncated: yes"]:[]].join(`
44
44
  `)}if(e==="list"){let i=Array.isArray(n.agents)?n.agents:[],r=Array.isArray(n.agent_definitions)?n.agent_definitions:[],a=i.filter(u=>!x(u.parent_label)),o=u=>{let p=x(u.agent);return p?i.filter(m=>x(m.parent_label)===p):[]},d=(u,p="",m=!1)=>{let v=x(u.pi_session_id)||x(u.pi_session_path),h=x(u.agent)||"unknown",S=x(u.agent_definition),R=x(u.state)||"unknown",F=[...S?[`definition ${S}`]:[],R,...m?["non-actionable"]:[],...!m&&Array.isArray(u.available_actions)?[`can ${u.available_actions.join(", ")||"nothing"}`]:[],...u.orphan===!0?["orphan"]:[],...u.stale===!0?[`stale${typeof u.inactive_ms=="number"?` ${Math.floor(u.inactive_ms/6e4)}m inactive`:""}`]:[]];return[`${p}${h} \xB7 ${F.join(" \xB7 ")}`,...v?[`${p} session: ${v}`]:[],...u.state==="unknown"&&x(u.diagnostic)?[`${p} diagnostic: ${x(u.diagnostic)}`]:[],...x(u.cleanup_error)?[`${p} cleanup warning: ${x(u.cleanup_error)}`]:[],...u.result_error&&typeof u.result_error=="object"?[`${p} result error: ${JSON.stringify(u.result_error)}`]:[],...m&&x(u.parent_label)?[`${p} parent: ${x(u.parent_label)} (not present)`]:[]]},c=new Set,f=a.flatMap(u=>{let p=o(u);return c.add(u),p.forEach(m=>c.add(m)),[...d(u),...p.length?[" agents:"]:[],...p.flatMap(m=>d(m," ")),""]}),l=i.filter(u=>!c.has(u));return[`Agents: ${i.length}`,"",...f,...l.length?["Unmatched ancestry (recovery only):",...l.flatMap(u=>d(u," ",!0)),""]:[],...r.length?["Agent definitions:",...Po(r)]:[]].join(`
45
45
  `)}return[`${e[0].toUpperCase()}${e.slice(1)} agent ${x(n.agent)||"unknown"}${t?` (${t})`:""}.`,...x(n.session_id)?[`Session: ${n.session_id}`]:[],...x(n.request_id)?[`Request: ${n.request_id}`]:[],...x(n.assignment_request_id)?[`Assignment request: ${n.assignment_request_id}`]:[],...e==="reply"&&x(n.ask_id)?[`Ask: ${n.ask_id}`]:[],...s].join(`
46
- `)}function Pe(e,n,t){return e?.fg?e.fg(n,t):t}function ts(e,n,t,s){return`${Pe(e,n,t)} ${s}`}function _c(e,n){return e?.expanded===!0||n?.expanded===!0}function ig(e){let n=e?.details??e?.result;return n&&typeof n=="object"?n:{}}function rg(e){return Array.isArray(e?.content)?e.content.filter(n=>n?.type==="text").map(n=>typeof n.text=="string"?n.text:"").join(`
46
+ `)}function Me(e,n,t){return e?.fg?e.fg(n,t):t}function ts(e,n,t,s){return`${Me(e,n,t)} ${s}`}function _c(e,n){return e?.expanded===!0||n?.expanded===!0}function ig(e){let n=e?.details??e?.result;return n&&typeof n=="object"?n:{}}function rg(e){return Array.isArray(e?.content)?e.content.filter(n=>n?.type==="text").map(n=>typeof n.text=="string"?n.text:"").join(`
47
47
  `):typeof e?.content=="string"?e.content:""}function Ac(e){let n=x(e);return n.length>12?`${Array.from(n).slice(0,11).join("")}\u2026`:n}function og(e){return typeof e=="string"?e.split(`
48
- `).filter(n=>n.length>0):[]}function ag(e){if(!e||typeof e!="object")return[];let n=e.foreground_processes;return Array.isArray(n)?n.flatMap(t=>{if(!t||typeof t!="object")return[];let s=t,i=x(s.cmdline)||x(s.argv0);return i?[i]:[]}):[]}function dg(e){return og(e.recent_output)}function _o(e,n,t){let s=ag(e.process),i=dg(e),r=[];if(n){let d=e.process;return d&&typeof d=="object"&&r.push("",Pe(t,"customMessageLabel","foreground:"),...s.length?s.map(c=>` ${c}`):[" (none)"]),i.length&&r.push("",Pe(t,"customMessageLabel","recent activity:"),...i.map(c=>` ${c}`)),e.recent_output_truncated===!0&&r.push("",Pe(t,"warning","recent output truncated: yes")),r}let a=s[0]?Ke(s[0]):void 0,o=i.at(-1)?Ke(i.at(-1)):void 0;return a&&o?r.push(`${a} \xB7 ${o}`):(a||o)&&r.push(a||o),e.recent_output_truncated===!0&&r.push("output truncated \xB7 Ctrl+O"),r.slice(0,3)}function Ec(e){let n=x(e.action),t=n==="delegate"?"task":n==="ask"?"question":"message",s=e[t];return typeof s=="string"&&s.trim()?{label:t,text:s}:void 0}function cg(e,n,t,s){let i=[e,n].filter(Boolean).join(" ");return`${Pe(s,"toolTitle",s.bold(i))}${t?` ${Pe(s,"accent",t)}`:""}`}function lg(e,n,t,s){let i=x(n.action),r=Ec(n),a=[];e==="agent"?i==="delegate"?(n.session&&a.push(["session",n.session]),n.definition&&a.push(["definition",n.definition]),n.label&&a.push(["label",n.label]),n.cwd&&a.push(["cwd",ko(String(n.cwd))]),n.timeoutMs&&a.push(["timeout",n.timeoutMs]),n.fork&&a.push(["fork",n.fork])):n.agent&&a.push(["agent",n.agent]):e==="staff"&&(n.lead&&a.push(["lead",n.lead]),n.askId&&a.push(["ask",n.askId]));let o=new nr;o.addChild(new Un(s,0,0)),a.length&&o.addChild(new Te(a.flatMap(([f,l])=>["",f==="definition"?Pe(t,"muted",`${f}: ${String(l)}`):`${f}: ${String(l)}`]).join(`
48
+ `).filter(n=>n.length>0):[]}function ag(e){if(!e||typeof e!="object")return[];let n=e.foreground_processes;return Array.isArray(n)?n.flatMap(t=>{if(!t||typeof t!="object")return[];let s=t,i=x(s.cmdline)||x(s.argv0);return i?[i]:[]}):[]}function dg(e){return og(e.recent_output)}function _o(e,n,t){let s=ag(e.process),i=dg(e),r=[];if(n){let d=e.process;return d&&typeof d=="object"&&r.push("",Me(t,"customMessageLabel","foreground:"),...s.length?s.map(c=>` ${c}`):[" (none)"]),i.length&&r.push("",Me(t,"customMessageLabel","recent activity:"),...i.map(c=>` ${c}`)),e.recent_output_truncated===!0&&r.push("",Me(t,"warning","recent output truncated: yes")),r}let a=s[0]?Ke(s[0]):void 0,o=i.at(-1)?Ke(i.at(-1)):void 0;return a&&o?r.push(`${a} \xB7 ${o}`):(a||o)&&r.push(a||o),e.recent_output_truncated===!0&&r.push("output truncated \xB7 Ctrl+O"),r.slice(0,3)}function Ec(e){let n=x(e.action),t=n==="delegate"?"task":n==="ask"?"question":"message",s=e[t];return typeof s=="string"&&s.trim()?{label:t,text:s}:void 0}function cg(e,n,t,s){let i=[e,n].filter(Boolean).join(" ");return`${Me(s,"toolTitle",s.bold(i))}${t?` ${Me(s,"accent",t)}`:""}`}function lg(e,n,t,s){let i=x(n.action),r=Ec(n),a=[];e==="agent"?i==="delegate"?(n.session&&a.push(["session",n.session]),n.definition&&a.push(["definition",n.definition]),n.label&&a.push(["label",n.label]),n.cwd&&a.push(["cwd",ko(String(n.cwd))]),n.timeoutMs&&a.push(["timeout",n.timeoutMs]),n.fork&&a.push(["fork",n.fork])):n.agent&&a.push(["agent",n.agent]):e==="staff"&&(n.lead&&a.push(["lead",n.lead]),n.askId&&a.push(["ask",n.askId]));let o=new nr;o.addChild(new Un(s,0,0)),a.length&&o.addChild(new Te(a.flatMap(([f,l])=>["",f==="definition"?Me(t,"muted",`${f}: ${String(l)}`):`${f}: ${String(l)}`]).join(`
49
49
  `),0,0)),r&&(o.addChild(new rs(1)),o.addChild(new Un(`${r.label}:`,0,0)),o.addChild(new is(r.text,0,0,ss())));let d=Array.isArray(n.files)?n.files.filter(f=>typeof f=="string").map(f=>` ${f}`):[];d.length&&(o.addChild(new rs(1)),o.addChild(new Te(["files:",...d].join(`
50
- `),0,0)));let c=ir(0,0,f=>f);return c.addChild(o),c}function Gs(e,n,t,s={}){let i=s?.args??n,r=x(i.action),o=e==="agent"&&r==="delegate"&&!!i.session?"continue":r,d="";e==="agent"&&r==="delegate"?d=x(i.label)||x(i.definition):e==="agent"?d=x(i.agent):e==="staff"&&(d=r==="list"?"":Ac(i.lead));let c=cg(e,o,d,t),l=s?.isPartial||s?.argsComplete===!1?`${c}\u2026`:c;if(_c(s,void 0))return lg(e,i,t,l);let u=new nr;u.addChild(new Un(l,0,0));let p=Ec(i);if(p){let v=Ke(p.text);v&&u.addChild(new is(` ${v}`,0,0,ss(),{color:h=>Pe(t,"muted",h)}))}let m=ir(0,0,v=>v);return m.addChild(u),m}function ug(e,n,t,s){let i=e.error&&typeof e.error=="object"?e.error:{},r=x(i.message)||"Operation failed";return t?[`${s} failed`,`category: ${x(i.category)||"error"}`,`message: ${r}`,...x(i.nextAction)?[`next: ${x(i.nextAction)}`]:[],...i.ids&&typeof i.ids=="object"?[dt("identity",i.ids)]:[],...i.details&&typeof i.details=="object"?[dt("stage",i.details.stage)].filter(Boolean):[],...i.primary?[dt("primary",i.primary)].filter(a=>a!==void 0):[],...i.cleanup?[dt("cleanup",i.cleanup)].filter(a=>a!==void 0):[],...e.cleanup_errors&&typeof e.cleanup_errors=="object"?["cleanup errors:",JSON.stringify(e.cleanup_errors,null,2)]:[]]:[ts(n,"error","\u2717",s),` ${Ke(r,160)}`,...x(i.nextAction)?[Pe(n,"muted",` next: ${Ke(x(i.nextAction),120)}`)]:[]]}function fg(e){let n=Array.isArray(e.agents)?e.agents:[],t=0,s=0,i=0;for(let r of n){if(!r||typeof r!="object")continue;let a=r;a.state==="working"&&t++,a.state==="blocked"&&s++,Array.isArray(a.available_actions)&&a.available_actions.includes("reply")&&i++}return[`agents ${n.length}`,t?`${t} working`:"",s?`${s} blocked`:"",i?`${i} needs reply`:""].filter(Boolean).join(" \xB7 ")}function gg(e){let n=(Array.isArray(e.agents)?e.agents:[]).filter(o=>!!o&&typeof o=="object"),t=new Map,s=new Map;for(let o of n){let d=x(o.agent);d&&s.set(d,o);let c=x(o.parent_label);c&&t.set(c,[...t.get(c)??[],o])}let i=[],r=new Set,a=(o,d,c)=>{if(r.has(o))return;r.add(o);let f=x(o.agent)||"unknown",l=x(o.state)||"unknown",u=x(o.agent_definition),p=Array.isArray(o.available_actions)?o.available_actions.join(", "):"",m=x(o.parent_label),v=x(o.pi_session_id)||x(o.pi_session_path),h=[l,...u?[`definition: ${u}`]:[],...p?[`can: ${p}`]:[],...o.orphan===!0?["orphan"]:[],...o.stale===!0?[`stale${typeof o.inactive_ms=="number"?` \xB7 inactive ${pc(o.inactive_ms)}`:""}`]:[]];i.push(`${d}${f} ${h.join(" \xB7 ")}`),v&&i.push(`${d} session: ${v}`),x(o.diagnostic)&&i.push(`${d} diagnostic: ${x(o.diagnostic)}`),x(o.cleanup_error)&&i.push(`${d} cleanup warning: ${x(o.cleanup_error)}`),o.result_error!==void 0&&o.result_error!==null&&i.push(`${d} result error: ${typeof o.result_error=="object"?JSON.stringify(o.result_error):String(o.result_error)}`),m&&!s.has(m)&&i.push(`${d} parent: ${m} (not present)`);let S=new Set(c).add(f);for(let R of t.get(f)??[])S.has(x(R.agent))||a(R,`${d} `,S)};for(let o of n)s.has(x(o.parent_label))||a(o,"",new Set);for(let o of n)r.has(o)||a(o,"",new Set);return i}function pg(e,n,t,s,i){let r=x(t.display_name)||x(t.agent)||x(t.label)||x(t.lead)||x(s.agent)||x(s.label)||"agent",o=[n==="list"?e==="staff"?"staff":"agents":n==="inspect"?`inspect ${r}`:n==="delegate"?`${r} started`:e==="chief"?n==="ask"?"waiting for Chief":"sent to Chief":n==="steer"?"steering sent":n==="reply"?`reply sent to ${r}`:n==="close"?`${r} closed`:`${n} ${r}`],d=[["definition",t.definition??t.agent_definition],["session",t.session_id??t.pi_session_id??t.session??t.chiefSessionId],["request",t.request_id],["assignment request",t.assignment_request_id],["ask",t.ask_id??t.askId??s.askId],["pane",t.pane_id],["lead",t.lead],["record",t.id],["workspace",t.workspace_id],["captured",t.captured_at]],c=t.identity&&typeof t.identity=="object"?t.identity:{};e==="staff"&&n==="inspect"&&d.push(["session",c.pi_session_id],["pane",c.pane_id],["workspace",c.workspace_id]);for(let[f,l]of d)l!==void 0&&l!==""&&o.push(`${f}: ${String(l)}`);if(n==="list"&&e==="agent"&&o.push("",...gg(t),...Array.isArray(t.agent_definitions)&&t.agent_definitions.length?["","Agent definitions:",...t.agent_definitions.flatMap(f=>{let l=f&&typeof f=="object"?x(f.name??f.agent):"";return l?[` ${l}`]:[]})]:[]),n==="list"&&e==="staff"){let f=Array.isArray(t.leads)?t.leads:[];o.push("",...f.flatMap(l=>{if(!l||typeof l!="object")return[];let u=Array.isArray(l.agents)?l.agents.length:0,p=l.agent_counts&&typeof l.agent_counts=="object"?l.agent_counts:{},m=typeof p.total=="number"?p.total:u,v=x(l.runtime_state)||"unknown";return[`${x(l.display_name)||x(l.lead)||"lead"} ${v}${m?` \xB7 ${m} agent${m===1?"":"s"}`:""}`,` lead: ${x(l.lead)}`,...typeof l.needs_you=="boolean"?[` needs you: ${l.needs_you?"yes":"no"}`]:[],...x(l.pending_ask_id)?[` ask: ${x(l.pending_ask_id)}`]:[],...x(l.pending_ask_question)?[` question: ${x(l.pending_ask_question)}`]:[],...l.last_activity!==void 0&&l.last_activity!==null?[` last activity: ${String(l.last_activity)}`]:[],...l.agent_counts&&typeof l.agent_counts=="object"?[` agent counts: ${Object.entries(p).filter(([,h])=>h!==void 0).map(([h,S])=>`${h}=${String(S)}`).join(" \xB7 ")}`]:[],...Array.isArray(l.available_actions)?[` can: ${l.available_actions.join(", ")}`]:[]]}))}return n==="inspect"&&o.push(..._o(t,!0,i)),e==="staff"&&n==="inspect"&&Array.isArray(t.agents)&&o.push("","agents:",...t.agents.flatMap(f=>{if(!f||typeof f!="object")return[];let l=f;return[` ${x(l.label)||x(l.id)||"agent"} \xB7 ${x(l.state)||"unknown"}`]})),t.cleanup_error&&o.push("",`cleanup warning: ${String(t.cleanup_error)}`),t.cleanup_errors&&typeof t.cleanup_errors=="object"&&o.push("","cleanup errors:",JSON.stringify(t.cleanup_errors,null,2)),o}function rr(e,n,t,s,i={}){let r=ig(n),a=i?.args??{},o=x(a.action)||x(r.action)||"agent",d=_c(i,t),c=r.ok===!1||i?.isError===!0;if(c&&r.error&&typeof r.error=="object")return new Te(ug(r,s,d,`${e} ${o}`).join(`
50
+ `),0,0)));let c=ir(0,0,f=>f);return c.addChild(o),c}function Gs(e,n,t,s={}){let i=s?.args??n,r=x(i.action),o=e==="agent"&&r==="delegate"&&!!i.session?"continue":r,d="";e==="agent"&&r==="delegate"?d=x(i.label)||x(i.definition):e==="agent"?d=x(i.agent):e==="staff"&&(d=r==="list"?"":Ac(i.lead));let c=cg(e,o,d,t),l=s?.isPartial||s?.argsComplete===!1?`${c}\u2026`:c;if(_c(s,void 0))return lg(e,i,t,l);let u=new nr;u.addChild(new Un(l,0,0));let p=Ec(i);if(p){let v=Ke(p.text);v&&u.addChild(new is(` ${v}`,0,0,ss(),{color:h=>Me(t,"muted",h)}))}let m=ir(0,0,v=>v);return m.addChild(u),m}function ug(e,n,t,s){let i=e.error&&typeof e.error=="object"?e.error:{},r=x(i.message)||"Operation failed";return t?[`${s} failed`,`category: ${x(i.category)||"error"}`,`message: ${r}`,...x(i.nextAction)?[`next: ${x(i.nextAction)}`]:[],...i.ids&&typeof i.ids=="object"?[dt("identity",i.ids)]:[],...i.details&&typeof i.details=="object"?[dt("stage",i.details.stage)].filter(Boolean):[],...i.primary?[dt("primary",i.primary)].filter(a=>a!==void 0):[],...i.cleanup?[dt("cleanup",i.cleanup)].filter(a=>a!==void 0):[],...e.cleanup_errors&&typeof e.cleanup_errors=="object"?["cleanup errors:",JSON.stringify(e.cleanup_errors,null,2)]:[]]:[ts(n,"error","\u2717",s),` ${Ke(r,160)}`,...x(i.nextAction)?[Me(n,"muted",` next: ${Ke(x(i.nextAction),120)}`)]:[]]}function fg(e){let n=Array.isArray(e.agents)?e.agents:[],t=0,s=0,i=0;for(let r of n){if(!r||typeof r!="object")continue;let a=r;a.state==="working"&&t++,a.state==="blocked"&&s++,Array.isArray(a.available_actions)&&a.available_actions.includes("reply")&&i++}return[`agents ${n.length}`,t?`${t} working`:"",s?`${s} blocked`:"",i?`${i} needs reply`:""].filter(Boolean).join(" \xB7 ")}function gg(e){let n=(Array.isArray(e.agents)?e.agents:[]).filter(o=>!!o&&typeof o=="object"),t=new Map,s=new Map;for(let o of n){let d=x(o.agent);d&&s.set(d,o);let c=x(o.parent_label);c&&t.set(c,[...t.get(c)??[],o])}let i=[],r=new Set,a=(o,d,c)=>{if(r.has(o))return;r.add(o);let f=x(o.agent)||"unknown",l=x(o.state)||"unknown",u=x(o.agent_definition),p=Array.isArray(o.available_actions)?o.available_actions.join(", "):"",m=x(o.parent_label),v=x(o.pi_session_id)||x(o.pi_session_path),h=[l,...u?[`definition: ${u}`]:[],...p?[`can: ${p}`]:[],...o.orphan===!0?["orphan"]:[],...o.stale===!0?[`stale${typeof o.inactive_ms=="number"?` \xB7 inactive ${pc(o.inactive_ms)}`:""}`]:[]];i.push(`${d}${f} ${h.join(" \xB7 ")}`),v&&i.push(`${d} session: ${v}`),x(o.diagnostic)&&i.push(`${d} diagnostic: ${x(o.diagnostic)}`),x(o.cleanup_error)&&i.push(`${d} cleanup warning: ${x(o.cleanup_error)}`),o.result_error!==void 0&&o.result_error!==null&&i.push(`${d} result error: ${typeof o.result_error=="object"?JSON.stringify(o.result_error):String(o.result_error)}`),m&&!s.has(m)&&i.push(`${d} parent: ${m} (not present)`);let S=new Set(c).add(f);for(let R of t.get(f)??[])S.has(x(R.agent))||a(R,`${d} `,S)};for(let o of n)s.has(x(o.parent_label))||a(o,"",new Set);for(let o of n)r.has(o)||a(o,"",new Set);return i}function pg(e,n,t,s,i){let r=x(t.display_name)||x(t.agent)||x(t.label)||x(t.lead)||x(s.agent)||x(s.label)||"agent",o=[n==="list"?e==="staff"?"staff":"agents":n==="inspect"?`inspect ${r}`:n==="delegate"?`${r} started`:e==="chief"?n==="ask"?"waiting for Chief":"sent to Chief":n==="steer"?"steering sent":n==="reply"?`reply sent to ${r}`:n==="close"?`${r} closed`:`${n} ${r}`],d=[["definition",t.definition??t.agent_definition],["session",t.session_id??t.pi_session_id??t.session??t.chiefSessionId],["request",t.request_id],["assignment request",t.assignment_request_id],["ask",t.ask_id??t.askId??s.askId],["pane",t.pane_id],["lead",t.lead],["record",t.id],["workspace",t.workspace_id],["captured",t.captured_at]],c=t.identity&&typeof t.identity=="object"?t.identity:{};e==="staff"&&n==="inspect"&&d.push(["session",c.pi_session_id],["pane",c.pane_id],["workspace",c.workspace_id]);for(let[f,l]of d)l!==void 0&&l!==""&&o.push(`${f}: ${String(l)}`);if(n==="list"&&e==="agent"&&o.push("",...gg(t),...Array.isArray(t.agent_definitions)&&t.agent_definitions.length?["","Agent definitions:",...t.agent_definitions.flatMap(f=>{let l=f&&typeof f=="object"?x(f.name??f.agent):"";return l?[` ${l}`]:[]})]:[]),n==="list"&&e==="staff"){let f=Array.isArray(t.leads)?t.leads:[];o.push("",...f.flatMap(l=>{if(!l||typeof l!="object")return[];let u=Array.isArray(l.agents)?l.agents.length:0,p=l.agent_counts&&typeof l.agent_counts=="object"?l.agent_counts:{},m=typeof p.total=="number"?p.total:u,v=x(l.runtime_state)||"unknown";return[`${x(l.display_name)||x(l.lead)||"lead"} ${v}${m?` \xB7 ${m} agent${m===1?"":"s"}`:""}`,` lead: ${x(l.lead)}`,...typeof l.needs_you=="boolean"?[` needs you: ${l.needs_you?"yes":"no"}`]:[],...x(l.pending_ask_id)?[` ask: ${x(l.pending_ask_id)}`]:[],...x(l.pending_ask_question)?[` question: ${x(l.pending_ask_question)}`]:[],...l.last_activity!==void 0&&l.last_activity!==null?[` last activity: ${String(l.last_activity)}`]:[],...l.agent_counts&&typeof l.agent_counts=="object"?[` agent counts: ${Object.entries(p).filter(([,h])=>h!==void 0).map(([h,S])=>`${h}=${String(S)}`).join(" \xB7 ")}`]:[],...Array.isArray(l.available_actions)?[` can: ${l.available_actions.join(", ")}`]:[]]}))}return n==="inspect"&&o.push(..._o(t,!0,i)),e==="staff"&&n==="inspect"&&Array.isArray(t.agents)&&o.push("","agents:",...t.agents.flatMap(f=>{if(!f||typeof f!="object")return[];let l=f;return[` ${x(l.label)||x(l.id)||"agent"} \xB7 ${x(l.state)||"unknown"}`]})),t.cleanup_error&&o.push("",`cleanup warning: ${String(t.cleanup_error)}`),t.cleanup_errors&&typeof t.cleanup_errors=="object"&&o.push("","cleanup errors:",JSON.stringify(t.cleanup_errors,null,2)),o}function rr(e,n,t,s,i={}){let r=ig(n),a=i?.args??{},o=x(a.action)||x(r.action)||"agent",d=_c(i,t),c=r.ok===!1||i?.isError===!0;if(c&&r.error&&typeof r.error=="object")return new Te(ug(r,s,d,`${e} ${o}`).join(`
51
51
  `),0,0);if(c){let l=rg(n),u=d?l.length>4e3?`${l.slice(0,3999)}\u2026`:l||"Operation failed":Ke(l,240)||"Operation failed";return new Te(ts(s,"error","\u2717",u),0,0)}if(t?.isPartial||i?.isPartial)return Gs(e,a,s,{...i,expanded:!1});if(d)return new Te(pg(e,o,r,a,s).join(`
52
- `),0,0);if(e==="agent"){if(o==="list")return new Te(Pe(s,"toolTitle",fg(r)),0,0);if(o==="inspect"){let p=x(r.agent)||"agent";return new Te([Pe(s,"toolTitle",`inspect ${p}`),..._o(r,!1,s).map(m=>Pe(s,"muted",` ${m}`))].join(`
52
+ `),0,0);if(e==="agent"){if(o==="list")return new Te(Me(s,"toolTitle",fg(r)),0,0);if(o==="inspect"){let p=x(r.agent)||"agent";return new Te([Me(s,"toolTitle",`inspect ${p}`),..._o(r,!1,s).map(m=>Me(s,"muted",` ${m}`))].join(`
53
53
  `),0,0)}let l=x(r.agent)||x(r.label)||x(r.agent_label)||x(a.agent)||x(a.label)||x(a.definition)||"agent",u=o==="delegate"?`${l} started`:o==="steer"?"steering sent":o==="reply"?"reply sent":o==="close"?`${l} closed`:`${o} ${l}`;return new Te(ts(s,"success","\u2713",u)+(r.cleanup_error?`
54
- ${Pe(s,"warning"," ! cleanup warning \xB7 Ctrl+O")}`:""),0,0)}if(e==="chief"){let l=o==="ask";return new Te(ts(s,l?"warning":"success",l?"?":"\u2713",l?"waiting for Chief":"sent to Chief"),0,0)}if(o==="list"){let l=Array.isArray(r.leads)?r.leads:[],u=l.filter(m=>m?.runtime_state==="working").length,p=l.filter(m=>m?.needs_you===!0).length;return new Te(Pe(s,"toolTitle",[`staff ${l.length} leads`,u?`${u} working`:"",p?`${p} needs you`:""].filter(Boolean).join(" \xB7 ")),0,0)}let f=x(r.display_name)||Ac(r.lead)||"lead";return o==="inspect"?new Te([Pe(s,"toolTitle",`inspect ${f}`),..._o(r,!1,s).map(l=>Pe(s,"muted",` ${l}`))].join(`
54
+ ${Me(s,"warning"," ! cleanup warning \xB7 Ctrl+O")}`:""),0,0)}if(e==="chief"){let l=o==="ask";return new Te(ts(s,l?"warning":"success",l?"?":"\u2713",l?"waiting for Chief":"sent to Chief"),0,0)}if(o==="list"){let l=Array.isArray(r.leads)?r.leads:[],u=l.filter(m=>m?.runtime_state==="working").length,p=l.filter(m=>m?.needs_you===!0).length;return new Te(Me(s,"toolTitle",[`staff ${l.length} leads`,u?`${u} working`:"",p?`${p} needs you`:""].filter(Boolean).join(" \xB7 ")),0,0)}let f=x(r.display_name)||Ac(r.lead)||"lead";return o==="inspect"?new Te([Me(s,"toolTitle",`inspect ${f}`),..._o(r,!1,s).map(l=>Me(s,"muted",` ${l}`))].join(`
55
55
  `),0,0):new Te(ts(s,"success","\u2713",`${o==="reply"?"replied":"sent"} to ${f}`),0,0)}function dc(e){return bf("sha256").update(e).digest("hex")}function cc(e,n,t,s){let i,r=!1;try{if(s==="result"&&!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(t))throw new Error("invalid result request id");let a=er(Mf(),"pi-herdsman",String(process.getuid?.()??"user")),o=s==="result"?er(a,"results"):er(a,"output",dc(n));kf(o,{recursive:!0,mode:448}),vo(o,448);let d=er(o,s==="result"?t:`${dc(t)}.txt`);i=`${d}.${process.pid}.${Sf()}.tmp`;let c=_f(i,"wx",384);r=!0;try{Rf(c,e,{encoding:"utf8"})}finally{vf(c)}return vo(i,384),Af(i,d),vo(d,384),d}catch{try{i&&r&&Ef(i)}catch{}return}}function Xs(e,n){let t=n.persist==="completion",s=t?cc(e,n.sessionId,n.requestId??n.key,"result"):void 0,i=t&&!s,r=t?`${s?`Result file: ${s}`:"Result file could not be saved."}
56
56
 
57
57
  ${e}`:e,a=n.keep==="tail"?If:wf,o=a(r,{maxBytes:Us,maxLines:Ws});if(!o.truncated)return{content:r,truncated:!1,...s?{resultPath:s}:{},...i?{persistenceError:"Result file could not be saved."}:{}};let d=t?void 0:cc(e,n.sessionId,n.key,"overflow"),c=o.totalLines,f=u=>`[Output truncated: ${o.outputLines}/${c} lines, ${ic(Buffer.byteLength(u))}/${ic(Buffer.byteLength(r))}.${d?` Full output: ${d}`:t?"":" Full output could not be saved."}]`,l=f(o.content);for(let u=0;u<4;u++){let p=Buffer.byteLength(l)+1;if(o.outputLines+1<=Ws&&Buffer.byteLength(o.content)+p<=Us)break;o=a(r,{maxBytes:Math.max(1,Us-p),maxLines:Math.max(1,Ws-1)}),l=f(o.content)}for(l=f(o.content);(Buffer.byteLength(o.content)+Buffer.byteLength(l)+1>Us||o.outputLines+1>Ws)&&o.content.length>0;){let u=Math.max(1,Us-Buffer.byteLength(l)-1),p=Math.max(1,Ws-1),m=a(o.content,{maxBytes:u,maxLines:p});if(m.content===o.content)break;o=m,l=f(o.content)}return{content:`${o.content}
58
- ${l}`,truncated:!0,...d?{fullOutputPath:d}:{},...s?{resultPath:s}:{},...i?{persistenceError:"Result file could not be saved."}:{}}}var Te=class extends Un{render(n){return super.render(n).map(t=>Ae(t)>n?Tn(t,n,""):t)}};function or(e,n,t=0){let s=ir(t,1,i=>n.bg("customMessageBg",i));return s.addChild(e),s}function Rc(e,n,t){let s=e.details,i=s?.status==="failed",r=Number.isFinite(s?.elapsedMs)&&s?.elapsedMs!==void 0&&s.elapsedMs>=0?os(0,s.elapsedMs):void 0,a=s?.agentLabel??"agent",o=s?.agentDefinition&&s.agentDefinition!==a?` \xB7 ${s.agentDefinition}`:"",d=`${Pe(t,i?"error":"success",i?"\u2717":"\u2713")} ${t.bold(a)}${i?" failed":" completed"}${o?Pe(t,"muted",o):""}`,c=(e.content??"").replace(/^Agent result · [^\n]*\n\n/u,"").replace(/^Result file: [^\n]*\n\n/u,"").replace(/^Result file could not be saved\.\n\n/u,""),f=new nr;if(n.expanded){f.addChild(new Un(d,0,0));let l=[...s?.agentDefinition?[`definition: ${s.agentDefinition}`]:[],...s?.piSessionId?[`session: ${s.piSessionId}`]:[],...s?.requestId?[`request: ${s.requestId}`]:[],...r?[`elapsed: ${r}`]:[],...s?.contextUsage?.percent!=null?[`context: ${Math.round(s.contextUsage.percent)}%`]:[],...s?.fullOutputPath?[`full output: ${s.fullOutputPath}`]:[],...s?.resultPath?[`result file: ${s.resultPath}`]:[],...s?.error?[`error: ${s.error.code}: ${s.error.message}`]:[]];l.length&&(f.addChild(new rs(1)),f.addChild(new Te(l.join(`
59
- `),0,0))),c&&(f.addChild(new rs(1)),f.addChild(new is(c,0,0,ss())))}else{f.addChild(new Un(d+(r?` \xB7 ${r}`:"")+(s?.contextUsage?.percent!=null?` \xB7 ctx ${Math.round(s.contextUsage.percent)}%`:""),0,0));let l=Ke(c);l&&f.addChild(new is(l,2,0,ss(),{color:u=>Pe(t,"muted",u)}))}return or(f,t,n.outputPad??0)}function xc(e,n,t){let s=e.details&&typeof e.details=="object"?e.details:{},i=x(s.agentLabel)||"agent",r=x(s.question)||"Input is required.",a=`${Pe(t,"warning","?")} ${t.bold(i)} needs input`,o=new nr;if(o.addChild(new Un(a,0,0)),n.expanded){o.addChild(new rs(1)),o.addChild(new Un("question:",0,0)),o.addChild(new is(r,0,0,ss()));let d=[...x(s.askId)?[`ask: ${x(s.askId)}`]:[],...x(s.requestId)?[`request: ${x(s.requestId)}`]:[],...x(s.piSessionId)?[`session: ${x(s.piSessionId)}`]:[],...x(s.paneId)?[`pane: ${x(s.paneId)}`]:[]];d.length&&(o.addChild(new rs(1)),o.addChild(new Te(d.join(`
60
- `),0,0)))}else{let d=Ke(r,240)??"Input is required.";o.addChild(new is(` ${d}`,0,0,ss(),{color:c=>Pe(t,"muted",c)}))}return or(o,t,n.outputPad??0)}function Mc(e,n,t){let s=e.details&&typeof e.details=="object"?e.details:{},i=x(s.agentLabel)||"agent",r=Number.isFinite(s.inactiveMs)&&Number(s.inactiveMs)>=0?os(0,Number(s.inactiveMs))??"unknown":"unknown",a=n.expanded?[`${i} inactive`,"","state: working",`inactive: ${r}`,...Number.isFinite(s.thresholdMs)?[`threshold: ${os(0,Number(s.thresholdMs))??"unknown"}`]:[],...x(s.requestId)?[`request: ${x(s.requestId)}`]:[],...x(s.piSessionId)?[`session: ${x(s.piSessionId)}`]:[],...x(s.paneId)?[`pane: ${x(s.paneId)}`]:[],"","Inactivity is advisory only.","Inspect before intervening.","Do not close solely because of inactivity."]:[ts(t,"warning","!",`${i} inactive \xB7 ${r}`)," working \xB7 inactivity is not proof of a hang"];return or(new Te(a.join(`
58
+ ${l}`,truncated:!0,...d?{fullOutputPath:d}:{},...s?{resultPath:s}:{},...i?{persistenceError:"Result file could not be saved."}:{}}}var Te=class extends Un{render(n){return super.render(n).map(t=>Ae(t)>n?Tn(t,n,""):t)}};function or(e,n,t=0){let s=ir(t,1,i=>n.bg("customMessageBg",i));return s.addChild(e),s}function Rc(e,n,t){let s=e.details,i=s?.status==="failed",r=Number.isFinite(s?.elapsedMs)&&s?.elapsedMs!==void 0&&s.elapsedMs>=0?os(0,s.elapsedMs):void 0,a=s?.agentLabel??"agent",o=s?.agentDefinition&&s.agentDefinition!==a?` \xB7 ${s.agentDefinition}`:"",d=`${Me(t,i?"error":"success",i?"\u2717":"\u2713")} ${t.bold(a)}${i?" failed":" completed"}${o?Me(t,"muted",o):""}`,c=(e.content??"").replace(/^Agent result · [^\n]*\n\n/u,"").replace(/^Result file: [^\n]*\n\n/u,"").replace(/^Result file could not be saved\.\n\n/u,""),f=new nr;if(n.expanded){f.addChild(new Un(d,0,0));let l=[...s?.agentDefinition?[`definition: ${s.agentDefinition}`]:[],...s?.piSessionId?[`session: ${s.piSessionId}`]:[],...s?.requestId?[`request: ${s.requestId}`]:[],...r?[`elapsed: ${r}`]:[],...s?.contextUsage?.percent!=null?[`context: ${Math.round(s.contextUsage.percent)}%`]:[],...s?.fullOutputPath?[`full output: ${s.fullOutputPath}`]:[],...s?.resultPath?[`result file: ${s.resultPath}`]:[],...s?.resultPersistenceError?[Me(t,"warning",`result persistence error: ${s.resultPersistenceError}`)]:[],...s?.error?[`error: ${s.error.code}: ${s.error.message}`]:[]];l.length&&(f.addChild(new rs(1)),f.addChild(new Te(l.join(`
59
+ `),0,0))),c&&(f.addChild(new rs(1)),f.addChild(new is(c,0,0,ss())))}else{let l=[...s?.truncated===!0?["output truncated"]:[],...s?.resultPersistenceError?["result not saved"]:[]];f.addChild(new Un(d+(r?` \xB7 ${r}`:"")+(s?.contextUsage?.percent!=null?` \xB7 ctx ${Math.round(s.contextUsage.percent)}%`:"")+(l.length?` \xB7 ${l.join(" \xB7 ")} \xB7 Ctrl+O`:""),0,0));let u=Ke(c);u&&f.addChild(new is(u,2,0,ss(),{color:p=>Me(t,"muted",p)}))}return or(f,t,n.outputPad??0)}function xc(e,n,t){let s=e.details&&typeof e.details=="object"?e.details:{},i=x(s.agentLabel)||"agent",r=x(s.question)||"Input is required.",a=`${Me(t,"warning","?")} ${t.bold(i)} needs input`,o=new nr;if(o.addChild(new Un(a,0,0)),n.expanded){o.addChild(new rs(1)),o.addChild(new Un("question:",0,0)),o.addChild(new is(r,0,0,ss()));let d=[...x(s.askId)?[`ask: ${x(s.askId)}`]:[],...x(s.requestId)?[`request: ${x(s.requestId)}`]:[],...x(s.piSessionId)?[`session: ${x(s.piSessionId)}`]:[],...x(s.paneId)?[`pane: ${x(s.paneId)}`]:[]];d.length&&(o.addChild(new rs(1)),o.addChild(new Te(d.join(`
60
+ `),0,0)))}else{let d=Ke(r,240)??"Input is required.";o.addChild(new is(` ${d}`,0,0,ss(),{color:c=>Me(t,"muted",c)}))}return or(o,t,n.outputPad??0)}function Mc(e,n,t){let s=e.details&&typeof e.details=="object"?e.details:{},i=x(s.agentLabel)||"agent",r=Number.isFinite(s.inactiveMs)&&Number(s.inactiveMs)>=0?os(0,Number(s.inactiveMs))??"unknown":"unknown",a=n.expanded?[`${i} inactive`,"","state: working",`inactive: ${r}`,...Number.isFinite(s.thresholdMs)?[`threshold: ${os(0,Number(s.thresholdMs))??"unknown"}`]:[],...x(s.requestId)?[`request: ${x(s.requestId)}`]:[],...x(s.piSessionId)?[`session: ${x(s.piSessionId)}`]:[],...x(s.paneId)?[`pane: ${x(s.paneId)}`]:[],"","Inactivity is advisory only.","Inspect before intervening.","Do not close solely because of inactivity."]:[ts(t,"warning","!",`${i} inactive \xB7 ${r}`)," working \xB7 inactivity is not proof of a hang"];return or(new Te(a.join(`
61
61
  `),0,0),t,n.outputPad??0)}var lc=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Ao=class{snapshot={agents:[],stale:!1,unavailable:!0};frame=0;timer;invalidateUI;theme;constructor(n,t){this.invalidateUI=n,this.theme=t??{fg:(s,i)=>i,bold:s=>s}}setSnapshot(n){this.snapshot=n;let t=n.agents.some(s=>s.state==="working"||s.state==="settling"||s.state==="starting");t&&!this.timer&&(this.timer=setInterval(()=>{this.frame++,this.invalidate()},120)),!t&&this.timer&&(clearInterval(this.timer),this.timer=void 0),this.invalidate()}invalidate(){this.invalidateUI?.()}render(n){let t=this.snapshot,s=t.unavailable?"unavailable":`${tr(t.agents)}${t.stale?" \xB7 stale":""}`,i=Qf(t.breadcrumb??["herd"],t.ownTools,Math.max(0,n),this.theme),r=this.theme.fg("success",i),a=os(t.herdRunStartedAt,Date.now()),o=!t.identityOnly&&a?this.theme.fg("accent",` \xB7 ${a}`):"",d=t.identityOnly||!s?"":this.theme.fg("muted",` ${s}`),c=`${r}${o}${d}`,f=[Tn(c,Math.max(0,n),"\u2026")];return t.identityOnly||f.push(...Bf(t.agents,{now:Date.now(),frame:this.frame,width:Math.max(0,n),theme:this.theme}).map(({text:l})=>l)),f}dispose(){this.timer&&clearInterval(this.timer),this.timer=void 0,this.invalidateUI=void 0}};function Co(e,n){return new Ao(e,n)}var _g="__PI_HERDSMAN_AGENT_V4__:",Ag=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/,To="^[A-Za-z0-9](?:[A-Za-z0-9._-]*[A-Za-z0-9])?$",Eg=Sg(import.meta.url),Pc="pi-herdsman-agent-definitions",cr="pi-herdsman-herd-run",Do=["staff"],Bo=10*6e4,Rg=3e4,xg=5e3,Mg=8,Pg=4;function dr(e){let n=Math.ceil(e/Pg);return`${e/1024} KiB \xB7 \u2248${n.toLocaleString("en-US")} tokens`}var $g=`Coordinate managed agents.
62
62
 
63
63
  The session-start instructions include the current agent-definition roster.
@@ -245,7 +245,7 @@ Return a concise actionable handoff covering what you inspected or changed,
245
245
  validation performed, material findings or decisions, unresolved risks or
246
246
  blockers, remaining work, and reusable paths or artifacts.`,Ng=250,Og=8;function $c(e){return`${e.provider}/${e.id}`}function qg(e){return`${$g}
247
247
 
248
- ${e.kind==="lead"?Cg:Tg}`}async function Jc(e,n){let t=(await ls(e)).definitions.map(s=>Vr(s,n.kind==="managed-agent"?"leaf":"delegating"));return n.kind==="managed-agent"?t.filter(s=>n.allowedAgentDefinitions.has(s.name)&&s.enabled!==!1):t}var zc=["action","definition","agent","label","cwd","task","files","fork","timeoutMs","message","session"],jg=["definition","agent","label","cwd","task","fork","message","session"];function Fg(e){let n=new Set(zc),t=Object.keys(e).filter(s=>!n.has(s));t.length&&$("invalid_request",`Unsupported agent fields: ${t.join(", ")}`,e.action)}function Hg(e){let n=jg.filter(t=>{let s=e[t];return s!==void 0&&(typeof s!="string"||!s.trim())});n.length&&$("invalid_request",`Fields must contain non-whitespace text when supplied: ${n.join(", ")}`,e.action)}function Tt(e,n,t){let s=new Set(t),i=zc.filter(r=>e[r]!==void 0&&!s.has(r));i.length&&$("invalid_request",`${n} does not support: ${i.join(", ")}. Allowed: ${t.join(", ")}`,e.action)}function Cc(e,n){e===void 0||ii(e)||$("invalid_request",'Agent label must start with a lowercase letter, contain only lowercase letters, digits, "_" or "-", and be at most 32 characters',n)}function Bg(e){e===void 0||Number.isInteger(e)&&e>=kt&&e<=_t||$("invalid_request",`timeoutMs must be an integer from ${kt} through ${_t}`,"delegate")}function Ug(e){if(Fg(e),Hg(e),Cc(e.label,e.action),Cc(e.agent,e.action),Bg(e.timeoutMs),e.action==="list")return Tt(e,"list",["action"]),{action:"list"};if(e.action==="steer")return Tt(e,"steer",["action","agent","message","files"]),e.agent||$("invalid_request","Steer requires an agent","steer"),e.message||$("invalid_request","Steer requires a non-empty message","steer"),{action:"steer",agent:e.agent,message:e.message,...e.files?{files:e.files}:{}};if(e.action==="reply")return Tt(e,"reply",["action","agent","message","files"]),e.agent||$("invalid_request","Reply requires an agent","reply"),e.message||$("invalid_request","Reply requires a non-empty message","reply"),{action:"reply",agent:e.agent,message:e.message,...e.files?{files:e.files}:{}};if(e.action==="close")return Tt(e,"close",["action","agent"]),e.agent||$("invalid_request","Close requires an agent","close"),{action:"close",agent:e.agent};if(e.action==="inspect")return Tt(e,"inspect",["action","agent"]),e.agent||$("invalid_request","Inspect requires an agent","inspect"),{action:"inspect",agent:e.agent};if(e.action==="delegate"&&e.definition!==void 0)return Tt(e,"Definition delegation",["action","definition","label","cwd","task","files","fork","timeoutMs"]),e.definition||$("invalid_request","Definition delegation requires a definition","delegate"),e.task||$("invalid_request","Definition delegation requires a non-empty task","delegate"),{action:"delegate",definition:e.definition,task:e.task,...e.label!==void 0?{label:e.label}:{},...e.cwd!==void 0?{cwd:e.cwd}:{},...e.files!==void 0?{files:e.files}:{},...e.fork!==void 0?{fork:e.fork}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{}};if(e.action==="delegate"&&e.session!==void 0)return Tt(e,"Session delegation",["action","session","label","task","files","timeoutMs"]),e.session||$("invalid_request","Session delegation requires a session","delegate"),e.task||$("invalid_request","Session delegation requires a non-empty task","delegate"),{action:"delegate",session:e.session,task:e.task,...e.label!==void 0?{label:e.label}:{},...e.files!==void 0?{files:e.files}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{}};e.action!=="delegate"&&$("invalid_request","Unsupported agent action",e.action),$("invalid_request","Delegate requires exactly one of definition or session","delegate")}var ve=new Map,ri=new Map,oi=new Map,ai=new Map,ut=new Map,lr=new Set,Dn=new Map,ti=0,us,_n={generation:0,activityKnown:!1,contextKnown:!1,modelKnown:!1,thinkingKnown:!1},lt=!1,Lo=!1,ct,_e=new Map;function pr(e){_e.delete(e)}function Wg(e){_e.get(e)?.startsWith("Ask delivery failed")&&_e.delete(e)}var ur=new Set,Ot=new Map,qt=new Map,di=new Set,$e,si,nn=!0,Me,ds=!1;function Jg(e,n){return gr(Wc(),"pi-herdsman",process.getuid?.().toString()??"user","locks",`delegation-${Hc("sha256").update(`${e}\0${n}`).digest("hex")}`)}function Xo(e,n){try{return ht(Jg(e,n),{name:"delegation lifecycle",occupiedMessage:"Delegation lifecycle is already in progress"})}catch(t){throw t instanceof Ee&&$("agent_busy",t.message,"lifecycle",{details:{workspaceId:e,parentSessionId:n},nextAction:"Let the current delegation lifecycle finish or stop it through its owning agent, then retry."}),t}}function zg(e){let n=li(e);return gr(Wc(),"pi-herdsman",process.getuid?.().toString()??"user","locks",`session-${Hc("sha256").update(n).digest("hex")}`)}function Kg(e){try{return ht(zg(e),{name:"session activation",occupiedMessage:"The exact Pi session is already being activated"})}catch(n){throw n instanceof Ee&&$("agent_busy","The exact Pi session is already being activated","delegate",{nextAction:"Let the current session activation finish, then retry."}),n}}function Kc(e){if(e===void 0)return[];let n;try{n=JSON.parse(e)}catch{throw new Error("PI_HERDSMAN_ALLOWED_AGENT_DEFINITIONS must be a JSON string array")}if(!Array.isArray(n)||n.some(t=>typeof t!="string"||t.trim().length===0)||new Set(n).size!==n.length)throw new Error("PI_HERDSMAN_ALLOWED_AGENT_DEFINITIONS must be a JSON array of unique non-empty strings");return n}function Gg(){return Kc(process.env.PI_HERDSMAN_ALLOWED_AGENT_DEFINITIONS)}var Nt=/^[a-z][a-z0-9_-]{0,31}$/;function ii(e){return typeof e=="string"&&Nt.test(e)}function Yo(){let e=process.env;if(!e.PI_HERDSMAN_MAILBOX)return"PI_HERDSMAN_MAILBOX missing";if(!e.PI_HERDSMAN_MAILBOX.startsWith("/"))return"PI_HERDSMAN_MAILBOX is not absolute";if(!Dc(e.PI_HERDSMAN_RUN_ID))return"PI_HERDSMAN_RUN_ID invalid";if(!Dc(e.PI_HERDSMAN_OWNER_SESSION_ID))return"PI_HERDSMAN_OWNER_SESSION_ID invalid";if(!ii(e.PI_HERDSMAN_LABEL))return"PI_HERDSMAN_LABEL invalid";if(!e.PI_HERDSMAN_WORKSPACE_ID?.trim())return"PI_HERDSMAN_WORKSPACE_ID missing";if(dn(e.PI_HERDSMAN_WORKSPACE_ID,e.PI_HERDSMAN_LABEL)!==e.PI_HERDSMAN_MAILBOX)return"PI_HERDSMAN_MAILBOX does not match workspace/label";if(!e.PI_HERDSMAN_AGENT_DEFINITION?.trim())return"PI_HERDSMAN_AGENT_DEFINITION missing";if(!e.HERDR_PANE_ID?.trim())return"HERDR_PANE_ID missing";try{Kc(e.PI_HERDSMAN_ALLOWED_AGENT_DEFINITIONS)}catch(n){return String(n).replace(/^Error: /,"")}}function Xg(){return Yo()===void 0}var Yg=()=>Xg()?"managed-agent":process.env.PI_HERDSMAN_MAILBOX!==void 0?"unmanaged":process.env.HERDR_ENV==="1"?"lead":"unmanaged";function X(e,n,t,s){try{e.appendEntry(t,{error:String(s),timestamp:Date.now()})}catch{n.ui?.notify?.(t,"error")}}function No(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0}function Vg(e,n){let t;for(let s of e){if(!s||typeof s!="object"||Array.isArray(s))continue;let i=s;if(i.type!=="custom"||i.customType!==cr)continue;let r=i.data;if(!r||typeof r!="object"||Array.isArray(r))continue;let a=r;if(a.sessionId===n){if(a.phase==="started"&&No(a.startedAt)){t===void 0&&(t=a.startedAt);continue}a.phase==="finished"&&No(a.startedAt)&&No(a.completedAt)&&a.completedAt>=a.startedAt&&t===a.startedAt&&(t=void 0)}}return t}async function cs(e){let n=Ko.create(e.cwd,gi(),{projectTrusted:e.isProjectTrusted()});await n.reload();let t=n.getGlobalSettings()?.piHerdsman?.spawnPlacement,s=n.getProjectSettings()?.piHerdsman?.spawnPlacement,i=n.isProjectTrusted()&&(s==="tab"||s==="split");return{effective:(i?s:t)==="split"?"split":"tab",scope:i?"project":"global"}}async function ci(e){let n=Ko.create(e.cwd,gi(),{projectTrusted:!1});await n.reload();let t=n.getGlobalSettings()?.piHerdsman??{};return{inline:bo(t.inlineAttachmentLimitBytes),mailbox:bo(t.mailboxPayloadLimitBytes)}}async function Oo(e,n,t,s,i,r){let a=await ci(e);return bt(n,t,e.cwd,s,i,{inlineLimitBytes:a.inline.bytes,mailboxLimitBytes:Math.min(a.mailbox.bytes,Pt),serializedBytes:o=>co(r(o))}).text}async function ls(e){let n=Ko.create(e.cwd,gi(),{projectTrusted:e.isProjectTrusted()});await n.reload();let t=n.isProjectTrusted()&&n.getProjectSettings()?.piHerdsman?.projectAgents===!0;return{projectAgentsEnabled:t,definitions:Gr(t?{projectRoot:e.cwd}:{})}}var Uo="pi-herdsman-agent-definition";function Gc(e){let n=e,t;for(let s of n){if(s.type!=="custom"||s.customType!==Uo)continue;let i=s.data;if(!i||typeof i!="object"||Object.keys(i).length!==1||typeof i.name!="string"||!i.name.trim())throw new Error("invalid pi-herdsman-agent-definition entry");let r=i.name.trim();if(t!==void 0&&t!==r)throw new Error("conflicting pi-herdsman-agent-definition entries");t=r}return t}function wr(e){let n=Gc(e.getEntries());if(!n)throw new Error("missing pi-herdsman-agent-definition entry");return n}function Ln(e){if(!e.piSessionFile)throw new Error("managed agent has no Pi session file");return wr(Jn.open(e.piSessionFile))}function Qg(e,n,t){if(n.sessionManager.getEntries().some(i=>i.type==="custom"&&i.customType===Uo)){if(wr(n.sessionManager)!==t)throw new Error("agent session agent definition does not match environment");return}e.appendEntry(Uo,{name:t})}var Wn=class extends Error{};function li(e){try{return Go(e)}catch(n){throw new Error(`could not canonicalize exact Pi session path ${e}: ${String(n)}`)}}function An(e,n){return e===n?!0:!e||!n?!1:li(e)===li(n)}function Zg(e,n){if(e===n)return!0;let t=li(n);try{return Go(e)===t}catch(s){if(s.code==="ENOENT")return!1;throw new Error(`could not canonicalize exact Pi session path ${e}: ${String(s)}`)}}function ep(e,n){if(e===n)return!0;if(!e||!n)return!1;try{return Go(e)===n}catch(t){if(t.code==="ENOENT")return!1;throw new Error(`could not canonicalize exact Pi session path ${e}: ${String(t)}`)}}async function Xc(e,n){let t=n.trim();if(!t)throw new Wn("assignment requires an exact session path or full UUID session ID");let s,i=!1;if(t.includes("/")||t.includes("\\")||t.endsWith(".jsonl")||t.startsWith("~"))s=t==="~"||t.startsWith("~/")||t.startsWith("~\\")?zn(Ig(),t.slice(2)):zn(e.cwd,t),i=(await Jn.listAll()).some(o=>zn(o.path)===s);else{if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(t))throw new Wn("assignment session must be an exact .jsonl path or full UUID session ID; prefixes are not allowed");let o=(await Jn.listAll()).filter(d=>d.id===t);if(o.length>1)throw new Wn(`assignment session ID ${t} is ambiguous`);if(!o.length)throw new Wn(`no assignment session found for exact session ID ${t}`);s=o[0].path,i=!0}let r=Jn.open(s),a=r.getSessionId();if(!a)throw new Wn(`no assignment session found for exact session path ${s}`);if(!i&&!Bc(s,{throwIfNoEntry:!1}))throw new Wn(`no assignment session found for exact session path ${s}`);return{path:r.getSessionFile()??s,id:a}}async function Tc(e,n){try{return await n()}catch(t){if(!(t instanceof Wn))throw t;$("invalid_request",t.message,e)}}async function np(e,n,t="delegate"){let s=await Xc(e,n),i=Jn.open(s.path),r=i.getHeader();(typeof r?.cwd!="string"||!r.cwd.trim())&&$("invalid_request",`Saved assignment session has no non-empty cwd in its session header: ${s.path}`,t);let a=i.getCwd();return{path:s.path,id:s.id,agent:wr(i),cwd:a}}function qo(e,n){return n==="global"?gr(gi(),"settings.json"):gr(e.cwd,hg,"settings.json")}async function tp(e,n,t){let s=await ee(e,n,["--version"],{signal:t,timeout:1e4}),i=String(s).match(/(\d+)\.(\d+)\.(\d+)/);(!i||Number(i[1])<0||Number(i[1])===0&&Number(i[2])<8)&&$("invalid_request","Herdr >=0.8.0 is required","preflight")}function Kn(e,n){return{id:e,path:n}}function Xn(e){if(!e||typeof e!="object")return[];let n=[];return e.agent_session!=null&&n.push(e.agent_session),e.session_id!=null&&n.push({kind:"id",value:e.session_id}),e.pi_session_id!=null&&n.push({kind:"id",value:e.pi_session_id}),e.session_path!=null&&n.push({kind:"path",value:e.session_path}),e.pi_session_path!=null&&n.push({kind:"path",value:e.pi_session_path}),n}function kn(e){return e?.agent_session?.agent==="pi"&&e.agent_session.source==="herdr:pi"}async function sp(e,n,t,s,i){let r=await Promise.all(t.map(async a=>{let o;try{o=(await ee(e,n,["workspace","get",a],{signal:i}))?.workspace}catch{return[a,s.has(a)?{workspaceCwd:s.get(a)}:{}]}let d=o?.worktree&&typeof o.worktree=="object"&&(typeof o.worktree.checkout_path=="string"||typeof o.worktree.repo_name=="string")?o.worktree:void 0,c={...typeof o?.label=="string"&&o.label?{workspaceLabel:o.label}:{},...typeof d?.checkout_path=="string"?{workspaceCwd:d.checkout_path}:s.has(a)?{workspaceCwd:s.get(a)}:{}};if(!d)return[a,c];let f;try{f=await ee(e,n,["worktree","list","--workspace",a],{signal:i})}catch{return[a,c]}let l=Array.isArray(f?.worktrees)?f.worktrees:[],u=d?l.find(S=>S?.open_workspace_id===a):void 0,p=typeof d?.repo_name=="string"?d.repo_name:typeof f?.source?.repo_name=="string"?f.source.repo_name:void 0,m=typeof u?.branch=="string"?u.branch:void 0,v=typeof o?.label=="string"?o.label:void 0,h=typeof f?.source?.source_checkout_path=="string"?f.source.source_checkout_path:s.get(a);return[a,{...v?{workspaceLabel:v}:{},...h?{workspaceCwd:h}:{},...d&&p?{repoName:p}:{},...d&&m?{branch:m}:{}}]}));return new Map(r)}function Vo(e,n){let t=Ye(e);return t?.kind==="path"&&n.path!==void 0?Zg(t.value,n.path):Wi(e,n)}function pi(e,n){let t=Xn(e);return t.length>0&&t.every(s=>Vo(s,n))}function ip(e,n){let t=Xn(e),s=!1;for(let i of t)Vo(i,n)&&(s=!0);return s}function Yc(e,n){let t=Ye(e);if(!t)return!1;if(t.kind==="id")return t.value===n;try{return Jn.open(t.value).getSessionId()===n}catch{return!1}}function Vc(e,n){let t=Xn(e);return t.length>0&&t.every(s=>Yc(s,n))}function hn(e){let n=Xn(e).map(t=>{let s=Ye(t);if(s){if(s.kind==="id")return s.value;try{return Jn.open(s.value).getSessionId()||void 0}catch{return}}});return n.length>0&&n.every(t=>t!==void 0&&t===n[0])?n[0]:void 0}function rp(e){let n=Xn(e).map(Ye).find(t=>t?.kind==="path")?.value;if(n)try{let t=Jn.open(n),s=typeof t.getSessionName=="function"?t.getSessionName():void 0;return typeof s=="string"&&s.trim()?s.trim():void 0}catch{return}}function op(e,n,t){if(!kn(e)||n?.agent!=="pi")return!1;let s=Ye(e?.agent_session);if(s?.kind!=="path"||!Vc(e,t))return!1;try{return!Gc(Jn.open(s.value).getEntries())}catch{return!1}}function Gn(e,n){let t=[e?.name,e?.herdr_agent].filter(s=>typeof s=="string"&&s.length>0);return t.length===0||t.every(s=>s===n)}async function mi(e,n,t,s={}){let i=s.signal,r;for(let o=0;;o++){let d;try{d=await ee(e,t,["agent","get",n.paneId],{signal:i})}catch(f){if(i?.aborted)throw f;$("invalid_request",`Unable to validate the official Herdr Pi integration: ${String(f)}`,"integration")}if(r=d.agent??d,Gn(r,n.herdrAgent)||$("target_not_found","live Herdr agent alias mismatch","integration"),(typeof r.pane_id=="string"&&r.pane_id!==n.paneId||typeof r.workspace_id=="string"&&r.workspace_id!==n.workspaceId||typeof r.cwd=="string"&&!qe(r.cwd,n.cwd))&&$("target_not_found","live Herdr agent identity mismatch","integration"),!Xn(r).length){if(s.waitForSession===!0&&o<Og){await bg(Ng,void 0,{signal:i});continue}$("invalid_request","Herdr detected this agent, but the official Pi integration did not report its session identity. Run `herdr integration install pi`, restart Pi, and verify with `herdr integration status`.","integration",{retryAttempted:o>0})}pi(r,Kn(n.piSessionId,n.piSessionFile))||$("target_not_found","live Herdr agent Pi session mismatch","integration");break}let a=Wo(r.tokens);a.task!==void 0&&(n.task=a.task),a.startedAt!==void 0&&(n.startedAt=a.startedAt),a.model!==void 0&&(n.model=a.model),a.thinking!==void 0&&(n.thinking=a.thinking),n.contextPercent=a.contextPercent}function Qc(e){let n=process.env,t=n.PI_HERDSMAN_MAILBOX,s;try{s=t?Be(t):void 0}catch(a){$("internal_failure",`Agent mailbox state is malformed or oversized: ${String(a)}`,"controller",{ids:{label:n.PI_HERDSMAN_LABEL,paneId:n.HERDR_PANE_ID}})}let i=e.sessionManager.getSessionId(),r=e.sessionManager.getSessionFile();return(!s||!t||s.workspaceId!==n.PI_HERDSMAN_WORKSPACE_ID||s.agentLabel!==n.PI_HERDSMAN_LABEL||s.paneId!==n.HERDR_PANE_ID||s.ownerSessionId!==n.PI_HERDSMAN_OWNER_SESSION_ID||s.piSessionId!==i||!An(s.piSessionFile,r)||zn(s.cwd)!==zn(e.cwd)||s.runId!==n.PI_HERDSMAN_RUN_ID)&&$("target_not_found","Delegation controller identity is not a valid managed agent","controller",{ids:{label:n.PI_HERDSMAN_LABEL,paneId:n.HERDR_PANE_ID}}),s}function ap(e){let s=e.sessionManager.getBranch().at(-1)?.message;if(s?.role!=="assistant"||!Array.isArray(s.content))return!1;let i=s.content.filter(r=>r.type==="toolCall");return i.length===1&&i[0].name==="ask_owner"}function dp(e){let n=Qc(e),t=process.env;try{if(wr(e.sessionManager)!==t.PI_HERDSMAN_AGENT_DEFINITION)throw new Error("agent session agent definition does not match environment")}catch(s){$("target_not_found",`Delegation controller session identity is invalid: ${String(s)}`,"controller",{ids:{label:n.agentLabel,paneId:n.paneId}})}return n}function Wo(e){let n=e&&typeof e=="object"?e:{},t=i=>{let r=n[i];return typeof r=="string"&&r.trim()?r:void 0},s=(i,r)=>{let a=n[i];if(a==null||typeof a=="string"&&!a.trim())return;let o=Number(a);return Number.isFinite(o)&&r(o)?o:void 0};return{task:t("task"),startedAt:s("started",i=>i>=0),model:t("model"),thinking:t("thinking"),contextPercent:s("ctx",i=>Number.isInteger(i)&&i>=0&&i<=100)}}function Zs(e){return Eo({model:e.model})}function ei(e){let n=e.thinkingLevel;return typeof n=="string"&&n?n:void 0}function En(e,n,t,s={}){let i=[["runId",n.runId,e.runId],["ownerSessionId",n.ownerSessionId,e.ownerSessionId],["workspaceId",n.workspaceId,e.workspaceId],["agentLabel",n.agentLabel,e.label],["paneId",n.paneId,e.paneId]].filter(([,r,a])=>r!==a);if(qe(n.cwd,e.cwd)||i.push(["cwd",n.cwd,e.cwd]),n.piSessionId!==e.piSessionId&&i.push(["piSessionId",n.piSessionId,e.piSessionId]),An(n.piSessionFile,e.piSessionFile)||i.push(["piSessionFile",n.piSessionFile,e.piSessionFile]),i.length&&$("target_not_found",`Agent identity does not match managed state: ${i.map(([r,a,o])=>`${r}=${JSON.stringify(a)} != ${JSON.stringify(o)}`).join(", ")}`,"identity"),t){let r=[["workspaceId",t.workspace_id,e.workspaceId],["agentLabel",t.label,e.label],["paneId",t.pane_id,e.paneId]].filter(([,d,c])=>d!==c);qe(t.cwd,e.cwd)||r.push(["cwd",t.cwd,e.cwd]),Gn(t,e.herdrAgent)||r.push(["herdrAlias",t,e.herdrAgent]);let a=Kn(e.piSessionId,e.piSessionFile),o=Xn(t);(o.length===0&&s.requireLiveSession||o.length>0&&!o.every(d=>Vo(d,a)))&&r.push(["session",o,a]),r.length&&$("target_not_found",`Live Herdr agent identity does not match managed state: ${r.map(([d,c,f])=>`${d}=${JSON.stringify(c)} != ${JSON.stringify(f)}`).join(", ")}`,"identity")}s.requestId&&n.activeRequestId!==s.requestId&&n.completedRequestId!==s.requestId&&$("target_not_found","Agent request identity does not match managed state","identity")}function Zc(e,n){return e?.requestId===n?.requestId&&e?.task===n?.task&&e?.startedAt===n?.startedAt}function el(e){return Math.max(0,Math.min(100,Math.round(e)))}function cp(e,n){ti+=1,us={generation:ti,revision:1,runtime:e,...n.activity&&{activity:n.activity},...n.context!==void 0&&n.context!==null?{context:el(n.context)}:{},...n.model?{model:n.model}:{},...n.thinking?{thinking:n.thinking}:{}},_n={generation:ti,activityKnown:!1,contextKnown:!1,modelKnown:!1,thinkingKnown:!1},lt=!0}function lp(){ti+=1,us=void 0,_n={generation:ti,activityKnown:!1,contextKnown:!1,modelKnown:!1,thinkingKnown:!1},lt=!1}function up(e,n){let t=us;if(!t)return!1;let s=!1;if(JSON.stringify(t.runtime)!==JSON.stringify(e)&&(t.runtime=e,s=!0),n.activity!==void 0){let i=n.activity??void 0;Zc(t.activity,i)||(t.activity=i,s=!0)}if(n.context!==void 0){let i=n.context===null?void 0:el(n.context);t.context!==i&&(t.context=i,s=!0)}if(n.model!==void 0){let i=n.model??void 0;t.model!==i&&(t.model=i,s=!0)}if(n.thinking!==void 0){let i=n.thinking??void 0;t.thinking!==i&&(t.thinking=i,s=!0)}return s&&(t.revision+=1,lt=!0),s}function fp(e){return{...e,runtime:{...e.runtime},...e.activity?{activity:{...e.activity}}:{activity:void 0}}}function gp(e,n){let{runtime:t,activity:s}=e,i=Ke(s?`${t.label} \xB7 ${s.task}`:t.label,80)??t.label.slice(0,80),r=["--source",`pi-herdsman:${t.runId}`,"--title",i,"--display-agent",t.agentDefinition,"--token","managed=1","--token",`role=${t.agentDefinition}`],a=n.generation!==e.generation;return(a||!n.activityKnown||!Zc(n.activity,s))&&(s?r.push("--token",`request=${s.requestId}`,"--token",`task=${Ke(s.task)??""}`,"--token",`started=${s.startedAt}`):r.push("--clear-token","request","--clear-token","task","--clear-token","started")),(a||!n.contextKnown||n.context!==e.context)&&(s&&e.context!==void 0?r.push("--token",`ctx=${e.context}`):r.push("--clear-token","ctx")),(a||!n.modelKnown||e.model!==n.model)&&r.push(e.model!==void 0?"--token":"--clear-token",e.model!==void 0?`model=${e.model}`:"model"),(a||!n.thinkingKnown||e.thinking!==n.thinking)&&r.push(e.thinking!==void 0?"--token":"--clear-token",e.thinking!==void 0?`thinking=${e.thinking}`:"thinking"),r}async function pp(e,n){if(!Lo){Lo=!0;try{for(;lt&&us;){lt=!1;let t=fp(us),s=t.generation,i=t.revision,r=!1;try{await ee(e,n,["pane","report-metadata",t.runtime.paneId,...gp(t,_n)],{timeout:1e4,signal:ct?.signal,noResult:!0}),r=!0}catch{r=!1}let a=us;if(!a||a.generation!==s)continue;if(!r){if(a.revision!==i){lt=!0;continue}lt=!0;break}let o=_n.generation!==t.generation,d=o||!_n.modelKnown||t.model!==_n.model,c=o||!_n.thinkingKnown||t.thinking!==_n.thinking;_n={generation:s,activityKnown:!0,activity:t.activity?{...t.activity}:void 0,contextKnown:!0,context:t.context,modelKnown:!0,model:t.model??(d?void 0:_n.model),thinkingKnown:!0,thinking:t.thinking??(c?void 0:_n.thinking)},a.revision!==i&&(lt=!0)}}finally{Lo=!1}}}function Dt(e,n,t,s,i=!1){i?cp(t,s):up(t,s),pp(e,n)}function Lt(e,n){return{label:e.agentLabel,paneId:e.paneId,runId:e.runId,agentDefinition:process.env.PI_HERDSMAN_AGENT_DEFINITION,cwd:n.cwd}}function nl(e){let n=process.env;if(!Yo())return{version:4,runId:n.PI_HERDSMAN_RUN_ID,ownerSessionId:n.PI_HERDSMAN_OWNER_SESSION_ID,workspaceId:n.PI_HERDSMAN_WORKSPACE_ID,agentLabel:n.PI_HERDSMAN_LABEL,paneId:n.HERDR_PANE_ID,piSessionId:e.sessionManager.getSessionId(),piSessionFile:e.sessionManager.getSessionFile(),cwd:e.cwd,updatedAt:Date.now()}}function Dc(e){return!!e&&/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(e)}function ni(e,n){return e.runId===n.runId&&e.ownerSessionId===n.ownerSessionId&&e.workspaceId===n.workspaceId&&e.agentLabel===n.agentLabel&&e.paneId===n.paneId&&e.piSessionId===n.piSessionId&&An(e.piSessionFile,n.piSessionFile)&&qe(e.cwd,n.cwd)}function mp(e,n){Or(e,n)}async function jo(e,n,t,s,i,r,a,o=Date.now(),d=yn(),c=t==="task"?"delegate":t==="steer"?"steer":"reply"){s.trim()||$("invalid_request","Message must not be empty",c),t==="reply"&&!a&&$("invalid_request","Reply request is missing its ask ID",c);let f={version:4,runId:n.runId,requestId:d,ownerSessionId:n.ownerSessionId,workspaceId:n.workspaceId,agentLabel:n.label,paneId:n.paneId,kind:t,...t==="reply"?{askId:a}:{},text:s,createdAt:o},l=await ci(i),u=Xt(f);u>l.mailbox.bytes&&$("invalid_request",`Mailbox payload is ${u} bytes; configured limit is ${l.mailbox.bytes} bytes`,c);let p=Be(n.mailboxPath);p||$("target_not_found","Agent mailbox state is unavailable",c),En(n,p),await mi(e,n,i,{signal:r});try{Na(n.mailboxPath,f)}catch(v){String(v).toLowerCase().includes("too large")&&$("invalid_request","Request exceeds the mailbox size limit",c),$("internal_failure",String(v),c)}let m=!1;$e?.();try{await ee(e,i,["agent","prompt",n.paneId,Fa(d)],{signal:r});let v=await Li(n.mailboxPath,S=>S.lastAck?.requestId===d,{timeoutMs:5e3,signal:r});(!v||v.lastAck?.requestId!==d)&&$("internal_failure","Agent acknowledgement identity did not match",c);let h=v.lastAck;h||$("internal_failure","Agent acknowledgement was missing",c);try{En(n,v)}catch(S){let R=`Acknowledged request identity changed after acknowledgement: ${String(S)}`;if(_e.set(n.label,R),X(e,i,"pi_herdsman_cleanup_error",S),S instanceof ke)throw new ke({...S.detail,operation:c});$("target_not_found",R,c)}if(m=!0,!h.accepted){let S=h.code==="busy"||h.code==="idle"?"agent_busy":h.code==="invalid"?"invalid_request":h.code==="identity"?"target_not_found":"internal_failure";$(S,h.message??"Agent rejected request",c)}return t==="task"&&(n.activeRequestId=d,n.task=s,n.startedAt=Date.now(),n.contextPercent=void 0,ea(e,n,i,Me?.signal),fi(e,n,i,Me?.signal)),d}finally{if(m)try{Or(n.mailboxPath,d)}catch(v){let h=`Acknowledged request could not be removed: ${String(v)}`;_e.set(n.label,h),X(e,i,"pi_herdsman_cleanup_error",v)}}}function Ir(e,n){if(!n)return!1;try{return!!it(e,n)}catch{return!0}}async function en(e,n,t,s=!1,i=!1,r){let a=r?{agents:r}:i?await qn(e,n,t):await Qt(e,n,t),o="workspaceId"in a?a.workspaceId:process.env.HERDR_WORKSPACE_ID??n.cwd,d=fn(),c=i?d:d.filter(({state:u})=>u.workspaceId===o),f=c.flatMap(({path:u,state:p})=>{let m=Ve(p.workspaceId,p.agentLabel,p.runId),v=a.agents.filter(Le=>Le.workspace_id===p.workspaceId&&Le.pane_id===p.paneId&&(!Le.cwd||qe(Le.cwd,p.cwd))&&Gn(Le,m)&&pi(Le,Kn(p.piSessionId,p.piSessionFile)));if(v.length!==1)return[];let h=v[0],S;try{S=Ln(p)}catch{return[]}let R=Ye(h.agent_session),F=R?.kind==="id"?R.value:h.session_id??h.pi_session_id,J=R?.kind==="path"?R.value:h.session_path??h.pi_session_path,V=ho(h),pe=Ir(u,p.completedRequestId),Y=wt(u,p),we=Ka(V,p.activeRequestId,pe,Y,!!p.pendingAskId,!!p.resultError),Q=ml(p,c),Se=we==="settling"&&!!p.activeRequestId&&!pe&&!Y&&!p.resultError&&Q,Ie=Se?"blocked":we,Re=!p.pendingAskId&&(Ie==="working"||Se),Z=Date.now();return[{state:p,agentDefinition:S,lifecycleState:V,listed:{label:p.agentLabel,kind:h.agent_session?.agent,state:Ie,steerable:Re,workspace_id:p.workspaceId,pane_id:h.pane_id,tab_id:h.tab_id,tab_label:h.tab_label,cwd:h.cwd,pi_session_id:F,pi_session_path:J,display_agent:h.display_agent,managed:!0,owner_session_id:p.ownerSessionId,agent_definition:S,...h.model??h.agent_model?{model:h.model??h.agent_model}:{},...h.thinking??h.agent_thinking?{thinking:h.thinking??h.agent_thinking}:{},active_request_id:p.activeRequestId,...p.resultError?{result_error:p.resultError}:{},...p.lastActivityAt!==void 0?{last_activity_at:p.lastActivityAt,...we==="working"&&p.activeRequestId&&p.lastActivityAt<=Z&&Z-p.lastActivityAt>=Bo?{stale:!0,inactive_ms:Z-p.lastActivityAt}:{}}:{},tokens:h.tokens??{}}}]}),l=[];if(s)try{let u=(await ee(e,n,["pane","list","--workspace",o],{signal:t}))?.panes;if(Array.isArray(u)){let p=new Set(c.map(({state:m})=>m.ownerSessionId));for(let m of p){let v=a.agents.filter(R=>Xn(R).some(F=>Yc(F,m)));if(v.length!==1)continue;let h=v[0];if(!Vc(h,m)||typeof h.pane_id!="string"||!h.pane_id.trim())continue;let S=u.filter(R=>R?.workspace_id===o&&R?.pane_id===h.pane_id);S.length===1&&op(h,S[0],m)&&l.push(m)}}}catch{}return{agents:f,mailboxes:c,liveAgents:a.agents,leadSessionIds:l}}async function mr(e,n,t,s){let[i,r]=await Promise.all([Qt(e,n,s),ee(e,n,["pane","list","--workspace",t.workspaceId],{signal:s})]);Array.isArray(r?.panes)||$("internal_failure","Agent pane absence could not be proven","close");let a=Ve(t.workspaceId,t.agentLabel,t.runId),o=Kn(t.piSessionId,t.piSessionFile);(r.panes.some(c=>c.pane_id===t.paneId)||i.agents.some(c=>c.workspace_id===t.workspaceId&&(c.pane_id===t.paneId||c.name===a||c.herdr_agent===a||pi(c,o))))&&$("target_not_found","Agent is still live; orphan recovery is refused","close")}async function tl(e,n,t,s,i,r){if(!s)return t.agents;let a=t.agents.filter(({state:d})=>d.ownerSessionId===i);if(s.kind==="lead"){let d=[...a],c=new Map(d.map(u=>[u.state.agentLabel,u])),f=t.agents.filter(({state:u})=>u.ownerSessionId!==i),l=!0;for(;f.length&&l;){l=!1;for(let u=f.length-1;u>=0;u--){let p=f[u],m=t.agents.find(({state:S})=>S.piSessionId===p.state.ownerSessionId);if(m&&c.has(m.state.agentLabel)){let S={...p,parentLabel:m.state.agentLabel};d.push(S),c.set(p.state.agentLabel,S),f.splice(u,1),l=!0;continue}if(m)continue;let v=t.mailboxes.find(({state:S})=>S.ownerSessionId===i&&S.piSessionId===p.state.ownerSessionId)?.state;if(!v)continue;try{Ln(v),await mr(e,n,v,r)}catch{continue}let h={...p,parentLabel:v.agentLabel,orphan:!0};d.push(h),c.set(p.state.agentLabel,h),f.splice(u,1),l=!0}}for(let u of f){let p=t.agents.find(({state:S})=>S.piSessionId===u.state.ownerSessionId),m=new Set,v=u,h=!1;for(;;){if(m.has(v.state.piSessionId)){h=!0;break}m.add(v.state.piSessionId);let S=t.agents.find(({state:R})=>R.piSessionId===v.state.ownerSessionId);if(!S)break;v=S}d.push({...u,listed:{...u.listed,state:"unknown",steerable:!1,recovery_only:!0,diagnostic:h?"cyclic ancestry; recovery only":"incomplete ancestry; recovery only"},...p?{parentLabel:p.state.agentLabel}:{}})}return d}let o=[];for(let d of t.agents){let c=a.find(({state:f})=>f.piSessionId===d.state.ownerSessionId);if(d.state.ownerSessionId===i){o.push(d);continue}if(s.kind==="managed-agent"||!c){if(s.kind==="managed-agent")continue;let f=t.mailboxes.find(({state:l})=>l.ownerSessionId===i&&l.piSessionId===d.state.ownerSessionId)?.state;if(!f)continue;try{Ln(f)}catch{continue}try{await mr(e,n,f,r)}catch{continue}o.push({...d,parentLabel:f.agentLabel,orphan:!0});continue}o.push({...d,parentLabel:c.state.agentLabel})}return o}function sl(e,n,t){return e.map(({listed:s,state:i,parentLabel:r,orphan:a})=>{let o=i.ownerSessionId===n,d=[];if(!s.recovery_only&&o){if(d.push("inspect"),s.steerable===!0&&d.push("steer"),i.pendingAskId)try{let u=It(dn(i.workspaceId,i.agentLabel),i);u?.askId===i.pendingAskId&&u.requestId===i.activeRequestId&&u.runId===i.runId&&u.ownerSessionId===i.ownerSessionId&&u.workspaceId===i.workspaceId&&u.agentLabel===i.agentLabel&&u.paneId===i.paneId&&u.piSessionId===i.piSessionId&&d.push("reply")}catch{}d.push("close")}else!s.recovery_only&&a&&t?.kind==="lead"&&d.push("close");let{label:c,steerable:f,...l}=s;return{...l,agent:s.label,available_actions:d,..._e.has(s.label)?{cleanup_error:_e.get(s.label)}:{},...r?{parent_label:r}:{},...a?{orphan:!0}:{}}})}async function Qo(e,n,t,s,i=!1){let r=await en(e,n,s,i);return{...r,visible:await tl(e,n,r,t,n.sessionManager.getSessionId(),s)}}function Lc(e,n){let t=nl(n);if(!t)return["?"];let s=e.agents.find(({state:o})=>ni(o,t));if(!s)return["?",process.env.PI_HERDSMAN_AGENT_DEFINITION&&process.env.PI_HERDSMAN_LABEL?St(process.env.PI_HERDSMAN_AGENT_DEFINITION,process.env.PI_HERDSMAN_LABEL):process.env.PI_HERDSMAN_AGENT_DEFINITION??"?"];let i=[St(s.agentDefinition,s.state.agentLabel)],r=new Set([s.state.piSessionId]),a=s.state.ownerSessionId;for(;;){let o=e.agents.find(({state:d})=>d.piSessionId===a);if(o){if(r.has(o.state.piSessionId))return["?",...i.reverse()];r.add(o.state.piSessionId),i.push(St(o.agentDefinition,o.state.agentLabel)),a=o.state.ownerSessionId;continue}return e.mailboxes.some(({state:d})=>d.piSessionId===a)?["?",...i.reverse()]:e.leadSessionIds.includes(a)?["herd",...i.reverse()]:["?",...i.reverse()]}}async function Nc(e,n,t,s){return(await Qo(e,n,t,s)).visible.map(({listed:r})=>r)}function hp(){return Tr().map(({diagnostic:e})=>({state:"unknown",available_actions:[],managed:!0,diagnostic:e}))}async function yp(e,n,t,s){return{ok:!0,agents:[...sl((await Qo(e,n,s,t)).visible,n.sessionManager.getSessionId(),s).filter(r=>r.recovery_only!==!0),...s?.kind==="lead"?hp():[]],agent_definitions:s?await Jc(n,s):[]}}function il(e,n){return`${e.mailboxPath}/result-${n}.json`}var rl=["runId","requestId","ownerSessionId","workspaceId","agentLabel","paneId","cwd","piSessionId","piSessionFile"];function ol(e,n){return!e||typeof e!="object"?!1:rl.every(t=>e[t]===n[t])}function wp(e){return JSON.stringify(rl.map(n=>e[n]))}function ft(e,n){return{runId:e.runId,requestId:n,ownerSessionId:e.ownerSessionId,workspaceId:e.workspaceId,agentLabel:"label"in e?e.label:e.agentLabel,paneId:e.paneId,cwd:e.cwd,piSessionId:e.piSessionId,piSessionFile:e.piSessionFile}}function hi(e,n){return e.some(t=>{let s=t?.message??t;return s?.customType!=="pi-herdsman-agent-result"?!1:ol(s?.details??t?.details,n)})}function Ip(e,n,t){return e.runId===n.runId&&e.ownerSessionId===n.ownerSessionId&&e.workspaceId===n.workspaceId&&e.agentLabel===n.agentLabel&&e.paneId===n.paneId&&e.requestId===t}function bp(e,n){if(e.workspace_id!==n.workspaceId)return!1;let t=Ve(n.workspaceId,n.agentLabel,n.runId),s=[e.herdr_agent,e.name].filter(r=>typeof r=="string"),i=[e.label].filter(r=>typeof r=="string");return e.pane_id===n.paneId||s.includes(t)||i.includes(n.agentLabel)||s.some(r=>r.startsWith(`${n.agentLabel.slice(0,15)}_`))}async function Sp(e,n,t,s,i){if(ve.get(n.label)!==n)return;let r=n.activeRequestId??n.completedRequestId;if(s.runId!==n.runId||s.ownerSessionId!==n.ownerSessionId||s.workspaceId!==n.workspaceId||s.agentLabel!==n.label||s.paneId!==n.paneId||s.requestId!==r||!nn)return;let a=t.sessionManager.getEntries?.()??[],o=ta(n,s.requestId),d=ft(n,s.requestId);if(!hi(a,d)&&!di.has(o)){let c=s.status==="completed"&&Number.isFinite(n.startedAt)&&n.startedAt!==void 0&&n.startedAt>=0&&Number.isFinite(s.completedAt)&&s.completedAt>=0&&s.completedAt>=n.startedAt?s.completedAt-n.startedAt:void 0,f=Xs(s.status==="completed"?s.text:s.error?.message??"Agent failed",{keep:"head",sessionId:n.piSessionId??n.runId,key:s.requestId,requestId:s.requestId,...s.status==="completed"?{persist:"completion"}:{}});f.persistenceError&&X(e,t,"pi_herdsman_result_error",f.persistenceError);let l=Cp(n,s.requestId,a);e.sendMessage({customType:"pi-herdsman-agent-result",content:[`Agent result \xB7 agent=${s.agentLabel} \xB7 definition=${n.agentDefinition} \xB7 session=${n.piSessionId??"?"} \xB7 request=${s.requestId} \xB7 status=${s.status}`,f.content,...l?[l.content]:[]].join(`
248
+ ${e.kind==="lead"?Cg:Tg}`}async function Jc(e,n){let t=(await ls(e)).definitions.map(s=>Vr(s,n.kind==="managed-agent"?"leaf":"delegating"));return n.kind==="managed-agent"?t.filter(s=>n.allowedAgentDefinitions.has(s.name)&&s.enabled!==!1):t}var zc=["action","definition","agent","label","cwd","task","files","fork","timeoutMs","message","session"],jg=["definition","agent","label","cwd","task","fork","message","session"];function Fg(e){let n=new Set(zc),t=Object.keys(e).filter(s=>!n.has(s));t.length&&$("invalid_request",`Unsupported agent fields: ${t.join(", ")}`,e.action)}function Hg(e){let n=jg.filter(t=>{let s=e[t];return s!==void 0&&(typeof s!="string"||!s.trim())});n.length&&$("invalid_request",`Fields must contain non-whitespace text when supplied: ${n.join(", ")}`,e.action)}function Tt(e,n,t){let s=new Set(t),i=zc.filter(r=>e[r]!==void 0&&!s.has(r));i.length&&$("invalid_request",`${n} does not support: ${i.join(", ")}. Allowed: ${t.join(", ")}`,e.action)}function Cc(e,n){e===void 0||ii(e)||$("invalid_request",'Agent label must start with a lowercase letter, contain only lowercase letters, digits, "_" or "-", and be at most 32 characters',n)}function Bg(e){e===void 0||Number.isInteger(e)&&e>=kt&&e<=_t||$("invalid_request",`timeoutMs must be an integer from ${kt} through ${_t}`,"delegate")}function Ug(e){if(Fg(e),Hg(e),Cc(e.label,e.action),Cc(e.agent,e.action),Bg(e.timeoutMs),e.action==="list")return Tt(e,"list",["action"]),{action:"list"};if(e.action==="steer")return Tt(e,"steer",["action","agent","message","files"]),e.agent||$("invalid_request","Steer requires an agent","steer"),e.message||$("invalid_request","Steer requires a non-empty message","steer"),{action:"steer",agent:e.agent,message:e.message,...e.files?{files:e.files}:{}};if(e.action==="reply")return Tt(e,"reply",["action","agent","message","files"]),e.agent||$("invalid_request","Reply requires an agent","reply"),e.message||$("invalid_request","Reply requires a non-empty message","reply"),{action:"reply",agent:e.agent,message:e.message,...e.files?{files:e.files}:{}};if(e.action==="close")return Tt(e,"close",["action","agent"]),e.agent||$("invalid_request","Close requires an agent","close"),{action:"close",agent:e.agent};if(e.action==="inspect")return Tt(e,"inspect",["action","agent"]),e.agent||$("invalid_request","Inspect requires an agent","inspect"),{action:"inspect",agent:e.agent};if(e.action==="delegate"&&e.definition!==void 0)return Tt(e,"Definition delegation",["action","definition","label","cwd","task","files","fork","timeoutMs"]),e.definition||$("invalid_request","Definition delegation requires a definition","delegate"),e.task||$("invalid_request","Definition delegation requires a non-empty task","delegate"),{action:"delegate",definition:e.definition,task:e.task,...e.label!==void 0?{label:e.label}:{},...e.cwd!==void 0?{cwd:e.cwd}:{},...e.files!==void 0?{files:e.files}:{},...e.fork!==void 0?{fork:e.fork}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{}};if(e.action==="delegate"&&e.session!==void 0)return Tt(e,"Session delegation",["action","session","label","task","files","timeoutMs"]),e.session||$("invalid_request","Session delegation requires a session","delegate"),e.task||$("invalid_request","Session delegation requires a non-empty task","delegate"),{action:"delegate",session:e.session,task:e.task,...e.label!==void 0?{label:e.label}:{},...e.files!==void 0?{files:e.files}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{}};e.action!=="delegate"&&$("invalid_request","Unsupported agent action",e.action),$("invalid_request","Delegate requires exactly one of definition or session","delegate")}var ve=new Map,ri=new Map,oi=new Map,ai=new Map,ut=new Map,lr=new Set,Dn=new Map,ti=0,us,_n={generation:0,activityKnown:!1,contextKnown:!1,modelKnown:!1,thinkingKnown:!1},lt=!1,Lo=!1,ct,_e=new Map;function pr(e){_e.delete(e)}function Wg(e){_e.get(e)?.startsWith("Ask delivery failed")&&_e.delete(e)}var ur=new Set,Ot=new Map,qt=new Map,di=new Set,$e,si,nn=!0,Pe,ds=!1;function Jg(e,n){return gr(Wc(),"pi-herdsman",process.getuid?.().toString()??"user","locks",`delegation-${Hc("sha256").update(`${e}\0${n}`).digest("hex")}`)}function Xo(e,n){try{return ht(Jg(e,n),{name:"delegation lifecycle",occupiedMessage:"Delegation lifecycle is already in progress"})}catch(t){throw t instanceof Ee&&$("agent_busy",t.message,"lifecycle",{details:{workspaceId:e,parentSessionId:n},nextAction:"Let the current delegation lifecycle finish or stop it through its owning agent, then retry."}),t}}function zg(e){let n=li(e);return gr(Wc(),"pi-herdsman",process.getuid?.().toString()??"user","locks",`session-${Hc("sha256").update(n).digest("hex")}`)}function Kg(e){try{return ht(zg(e),{name:"session activation",occupiedMessage:"The exact Pi session is already being activated"})}catch(n){throw n instanceof Ee&&$("agent_busy","The exact Pi session is already being activated","delegate",{nextAction:"Let the current session activation finish, then retry."}),n}}function Kc(e){if(e===void 0)return[];let n;try{n=JSON.parse(e)}catch{throw new Error("PI_HERDSMAN_ALLOWED_AGENT_DEFINITIONS must be a JSON string array")}if(!Array.isArray(n)||n.some(t=>typeof t!="string"||t.trim().length===0)||new Set(n).size!==n.length)throw new Error("PI_HERDSMAN_ALLOWED_AGENT_DEFINITIONS must be a JSON array of unique non-empty strings");return n}function Gg(){return Kc(process.env.PI_HERDSMAN_ALLOWED_AGENT_DEFINITIONS)}var Nt=/^[a-z][a-z0-9_-]{0,31}$/;function ii(e){return typeof e=="string"&&Nt.test(e)}function Yo(){let e=process.env;if(!e.PI_HERDSMAN_MAILBOX)return"PI_HERDSMAN_MAILBOX missing";if(!e.PI_HERDSMAN_MAILBOX.startsWith("/"))return"PI_HERDSMAN_MAILBOX is not absolute";if(!Dc(e.PI_HERDSMAN_RUN_ID))return"PI_HERDSMAN_RUN_ID invalid";if(!Dc(e.PI_HERDSMAN_OWNER_SESSION_ID))return"PI_HERDSMAN_OWNER_SESSION_ID invalid";if(!ii(e.PI_HERDSMAN_LABEL))return"PI_HERDSMAN_LABEL invalid";if(!e.PI_HERDSMAN_WORKSPACE_ID?.trim())return"PI_HERDSMAN_WORKSPACE_ID missing";if(dn(e.PI_HERDSMAN_WORKSPACE_ID,e.PI_HERDSMAN_LABEL)!==e.PI_HERDSMAN_MAILBOX)return"PI_HERDSMAN_MAILBOX does not match workspace/label";if(!e.PI_HERDSMAN_AGENT_DEFINITION?.trim())return"PI_HERDSMAN_AGENT_DEFINITION missing";if(!e.HERDR_PANE_ID?.trim())return"HERDR_PANE_ID missing";try{Kc(e.PI_HERDSMAN_ALLOWED_AGENT_DEFINITIONS)}catch(n){return String(n).replace(/^Error: /,"")}}function Xg(){return Yo()===void 0}var Yg=()=>Xg()?"managed-agent":process.env.PI_HERDSMAN_MAILBOX!==void 0?"unmanaged":process.env.HERDR_ENV==="1"?"lead":"unmanaged";function X(e,n,t,s){try{e.appendEntry(t,{error:String(s),timestamp:Date.now()})}catch{n.ui?.notify?.(t,"error")}}function No(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0}function Vg(e,n){let t;for(let s of e){if(!s||typeof s!="object"||Array.isArray(s))continue;let i=s;if(i.type!=="custom"||i.customType!==cr)continue;let r=i.data;if(!r||typeof r!="object"||Array.isArray(r))continue;let a=r;if(a.sessionId===n){if(a.phase==="started"&&No(a.startedAt)){t===void 0&&(t=a.startedAt);continue}a.phase==="finished"&&No(a.startedAt)&&No(a.completedAt)&&a.completedAt>=a.startedAt&&t===a.startedAt&&(t=void 0)}}return t}async function cs(e){let n=Ko.create(e.cwd,gi(),{projectTrusted:e.isProjectTrusted()});await n.reload();let t=n.getGlobalSettings()?.piHerdsman?.spawnPlacement,s=n.getProjectSettings()?.piHerdsman?.spawnPlacement,i=n.isProjectTrusted()&&(s==="tab"||s==="split");return{effective:(i?s:t)==="split"?"split":"tab",scope:i?"project":"global"}}async function ci(e){let n=Ko.create(e.cwd,gi(),{projectTrusted:!1});await n.reload();let t=n.getGlobalSettings()?.piHerdsman??{};return{inline:bo(t.inlineAttachmentLimitBytes),mailbox:bo(t.mailboxPayloadLimitBytes)}}async function Oo(e,n,t,s,i,r){let a=await ci(e);return bt(n,t,e.cwd,s,i,{inlineLimitBytes:a.inline.bytes,mailboxLimitBytes:Math.min(a.mailbox.bytes,Pt),serializedBytes:o=>co(r(o))}).text}async function ls(e){let n=Ko.create(e.cwd,gi(),{projectTrusted:e.isProjectTrusted()});await n.reload();let t=n.isProjectTrusted()&&n.getProjectSettings()?.piHerdsman?.projectAgents===!0;return{projectAgentsEnabled:t,definitions:Gr(t?{projectRoot:e.cwd}:{})}}var Uo="pi-herdsman-agent-definition";function Gc(e){let n=e,t;for(let s of n){if(s.type!=="custom"||s.customType!==Uo)continue;let i=s.data;if(!i||typeof i!="object"||Object.keys(i).length!==1||typeof i.name!="string"||!i.name.trim())throw new Error("invalid pi-herdsman-agent-definition entry");let r=i.name.trim();if(t!==void 0&&t!==r)throw new Error("conflicting pi-herdsman-agent-definition entries");t=r}return t}function wr(e){let n=Gc(e.getEntries());if(!n)throw new Error("missing pi-herdsman-agent-definition entry");return n}function Ln(e){if(!e.piSessionFile)throw new Error("managed agent has no Pi session file");return wr(Jn.open(e.piSessionFile))}function Qg(e,n,t){if(n.sessionManager.getEntries().some(i=>i.type==="custom"&&i.customType===Uo)){if(wr(n.sessionManager)!==t)throw new Error("agent session agent definition does not match environment");return}e.appendEntry(Uo,{name:t})}var Wn=class extends Error{};function li(e){try{return Go(e)}catch(n){throw new Error(`could not canonicalize exact Pi session path ${e}: ${String(n)}`)}}function An(e,n){return e===n?!0:!e||!n?!1:li(e)===li(n)}function Zg(e,n){if(e===n)return!0;let t=li(n);try{return Go(e)===t}catch(s){if(s.code==="ENOENT")return!1;throw new Error(`could not canonicalize exact Pi session path ${e}: ${String(s)}`)}}function ep(e,n){if(e===n)return!0;if(!e||!n)return!1;try{return Go(e)===n}catch(t){if(t.code==="ENOENT")return!1;throw new Error(`could not canonicalize exact Pi session path ${e}: ${String(t)}`)}}async function Xc(e,n){let t=n.trim();if(!t)throw new Wn("assignment requires an exact session path or full UUID session ID");let s,i=!1;if(t.includes("/")||t.includes("\\")||t.endsWith(".jsonl")||t.startsWith("~"))s=t==="~"||t.startsWith("~/")||t.startsWith("~\\")?zn(Ig(),t.slice(2)):zn(e.cwd,t),i=(await Jn.listAll()).some(o=>zn(o.path)===s);else{if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(t))throw new Wn("assignment session must be an exact .jsonl path or full UUID session ID; prefixes are not allowed");let o=(await Jn.listAll()).filter(d=>d.id===t);if(o.length>1)throw new Wn(`assignment session ID ${t} is ambiguous`);if(!o.length)throw new Wn(`no assignment session found for exact session ID ${t}`);s=o[0].path,i=!0}let r=Jn.open(s),a=r.getSessionId();if(!a)throw new Wn(`no assignment session found for exact session path ${s}`);if(!i&&!Bc(s,{throwIfNoEntry:!1}))throw new Wn(`no assignment session found for exact session path ${s}`);return{path:r.getSessionFile()??s,id:a}}async function Tc(e,n){try{return await n()}catch(t){if(!(t instanceof Wn))throw t;$("invalid_request",t.message,e)}}async function np(e,n,t="delegate"){let s=await Xc(e,n),i=Jn.open(s.path),r=i.getHeader();(typeof r?.cwd!="string"||!r.cwd.trim())&&$("invalid_request",`Saved assignment session has no non-empty cwd in its session header: ${s.path}`,t);let a=i.getCwd();return{path:s.path,id:s.id,agent:wr(i),cwd:a}}function qo(e,n){return n==="global"?gr(gi(),"settings.json"):gr(e.cwd,hg,"settings.json")}async function tp(e,n,t){let s=await ee(e,n,["--version"],{signal:t,timeout:1e4}),i=String(s).match(/(\d+)\.(\d+)\.(\d+)/);(!i||Number(i[1])<0||Number(i[1])===0&&Number(i[2])<8)&&$("invalid_request","Herdr >=0.8.0 is required","preflight")}function Kn(e,n){return{id:e,path:n}}function Xn(e){if(!e||typeof e!="object")return[];let n=[];return e.agent_session!=null&&n.push(e.agent_session),e.session_id!=null&&n.push({kind:"id",value:e.session_id}),e.pi_session_id!=null&&n.push({kind:"id",value:e.pi_session_id}),e.session_path!=null&&n.push({kind:"path",value:e.session_path}),e.pi_session_path!=null&&n.push({kind:"path",value:e.pi_session_path}),n}function kn(e){return e?.agent_session?.agent==="pi"&&e.agent_session.source==="herdr:pi"}async function sp(e,n,t,s,i){let r=await Promise.all(t.map(async a=>{let o;try{o=(await ee(e,n,["workspace","get",a],{signal:i}))?.workspace}catch{return[a,s.has(a)?{workspaceCwd:s.get(a)}:{}]}let d=o?.worktree&&typeof o.worktree=="object"&&(typeof o.worktree.checkout_path=="string"||typeof o.worktree.repo_name=="string")?o.worktree:void 0,c={...typeof o?.label=="string"&&o.label?{workspaceLabel:o.label}:{},...typeof d?.checkout_path=="string"?{workspaceCwd:d.checkout_path}:s.has(a)?{workspaceCwd:s.get(a)}:{}};if(!d)return[a,c];let f;try{f=await ee(e,n,["worktree","list","--workspace",a],{signal:i})}catch{return[a,c]}let l=Array.isArray(f?.worktrees)?f.worktrees:[],u=d?l.find(S=>S?.open_workspace_id===a):void 0,p=typeof d?.repo_name=="string"?d.repo_name:typeof f?.source?.repo_name=="string"?f.source.repo_name:void 0,m=typeof u?.branch=="string"?u.branch:void 0,v=typeof o?.label=="string"?o.label:void 0,h=typeof f?.source?.source_checkout_path=="string"?f.source.source_checkout_path:s.get(a);return[a,{...v?{workspaceLabel:v}:{},...h?{workspaceCwd:h}:{},...d&&p?{repoName:p}:{},...d&&m?{branch:m}:{}}]}));return new Map(r)}function Vo(e,n){let t=Ye(e);return t?.kind==="path"&&n.path!==void 0?Zg(t.value,n.path):Wi(e,n)}function pi(e,n){let t=Xn(e);return t.length>0&&t.every(s=>Vo(s,n))}function ip(e,n){let t=Xn(e),s=!1;for(let i of t)Vo(i,n)&&(s=!0);return s}function Yc(e,n){let t=Ye(e);if(!t)return!1;if(t.kind==="id")return t.value===n;try{return Jn.open(t.value).getSessionId()===n}catch{return!1}}function Vc(e,n){let t=Xn(e);return t.length>0&&t.every(s=>Yc(s,n))}function hn(e){let n=Xn(e).map(t=>{let s=Ye(t);if(s){if(s.kind==="id")return s.value;try{return Jn.open(s.value).getSessionId()||void 0}catch{return}}});return n.length>0&&n.every(t=>t!==void 0&&t===n[0])?n[0]:void 0}function rp(e){let n=Xn(e).map(Ye).find(t=>t?.kind==="path")?.value;if(n)try{let t=Jn.open(n),s=typeof t.getSessionName=="function"?t.getSessionName():void 0;return typeof s=="string"&&s.trim()?s.trim():void 0}catch{return}}function op(e,n,t){if(!kn(e)||n?.agent!=="pi")return!1;let s=Ye(e?.agent_session);if(s?.kind!=="path"||!Vc(e,t))return!1;try{return!Gc(Jn.open(s.value).getEntries())}catch{return!1}}function Gn(e,n){let t=[e?.name,e?.herdr_agent].filter(s=>typeof s=="string"&&s.length>0);return t.length===0||t.every(s=>s===n)}async function mi(e,n,t,s={}){let i=s.signal,r;for(let o=0;;o++){let d;try{d=await ee(e,t,["agent","get",n.paneId],{signal:i})}catch(f){if(i?.aborted)throw f;$("invalid_request",`Unable to validate the official Herdr Pi integration: ${String(f)}`,"integration")}if(r=d.agent??d,Gn(r,n.herdrAgent)||$("target_not_found","live Herdr agent alias mismatch","integration"),(typeof r.pane_id=="string"&&r.pane_id!==n.paneId||typeof r.workspace_id=="string"&&r.workspace_id!==n.workspaceId||typeof r.cwd=="string"&&!qe(r.cwd,n.cwd))&&$("target_not_found","live Herdr agent identity mismatch","integration"),!Xn(r).length){if(s.waitForSession===!0&&o<Og){await bg(Ng,void 0,{signal:i});continue}$("invalid_request","Herdr detected this agent, but the official Pi integration did not report its session identity. Run `herdr integration install pi`, restart Pi, and verify with `herdr integration status`.","integration",{retryAttempted:o>0})}pi(r,Kn(n.piSessionId,n.piSessionFile))||$("target_not_found","live Herdr agent Pi session mismatch","integration");break}let a=Wo(r.tokens);a.task!==void 0&&(n.task=a.task),a.startedAt!==void 0&&(n.startedAt=a.startedAt),a.model!==void 0&&(n.model=a.model),a.thinking!==void 0&&(n.thinking=a.thinking),n.contextPercent=a.contextPercent}function Qc(e){let n=process.env,t=n.PI_HERDSMAN_MAILBOX,s;try{s=t?Be(t):void 0}catch(a){$("internal_failure",`Agent mailbox state is malformed or oversized: ${String(a)}`,"controller",{ids:{label:n.PI_HERDSMAN_LABEL,paneId:n.HERDR_PANE_ID}})}let i=e.sessionManager.getSessionId(),r=e.sessionManager.getSessionFile();return(!s||!t||s.workspaceId!==n.PI_HERDSMAN_WORKSPACE_ID||s.agentLabel!==n.PI_HERDSMAN_LABEL||s.paneId!==n.HERDR_PANE_ID||s.ownerSessionId!==n.PI_HERDSMAN_OWNER_SESSION_ID||s.piSessionId!==i||!An(s.piSessionFile,r)||zn(s.cwd)!==zn(e.cwd)||s.runId!==n.PI_HERDSMAN_RUN_ID)&&$("target_not_found","Delegation controller identity is not a valid managed agent","controller",{ids:{label:n.PI_HERDSMAN_LABEL,paneId:n.HERDR_PANE_ID}}),s}function ap(e){let s=e.sessionManager.getBranch().at(-1)?.message;if(s?.role!=="assistant"||!Array.isArray(s.content))return!1;let i=s.content.filter(r=>r.type==="toolCall");return i.length===1&&i[0].name==="ask_owner"}function dp(e){let n=Qc(e),t=process.env;try{if(wr(e.sessionManager)!==t.PI_HERDSMAN_AGENT_DEFINITION)throw new Error("agent session agent definition does not match environment")}catch(s){$("target_not_found",`Delegation controller session identity is invalid: ${String(s)}`,"controller",{ids:{label:n.agentLabel,paneId:n.paneId}})}return n}function Wo(e){let n=e&&typeof e=="object"?e:{},t=i=>{let r=n[i];return typeof r=="string"&&r.trim()?r:void 0},s=(i,r)=>{let a=n[i];if(a==null||typeof a=="string"&&!a.trim())return;let o=Number(a);return Number.isFinite(o)&&r(o)?o:void 0};return{task:t("task"),startedAt:s("started",i=>i>=0),model:t("model"),thinking:t("thinking"),contextPercent:s("ctx",i=>Number.isInteger(i)&&i>=0&&i<=100)}}function Zs(e){return Eo({model:e.model})}function ei(e){let n=e.thinkingLevel;return typeof n=="string"&&n?n:void 0}function En(e,n,t,s={}){let i=[["runId",n.runId,e.runId],["ownerSessionId",n.ownerSessionId,e.ownerSessionId],["workspaceId",n.workspaceId,e.workspaceId],["agentLabel",n.agentLabel,e.label],["paneId",n.paneId,e.paneId]].filter(([,r,a])=>r!==a);if(qe(n.cwd,e.cwd)||i.push(["cwd",n.cwd,e.cwd]),n.piSessionId!==e.piSessionId&&i.push(["piSessionId",n.piSessionId,e.piSessionId]),An(n.piSessionFile,e.piSessionFile)||i.push(["piSessionFile",n.piSessionFile,e.piSessionFile]),i.length&&$("target_not_found",`Agent identity does not match managed state: ${i.map(([r,a,o])=>`${r}=${JSON.stringify(a)} != ${JSON.stringify(o)}`).join(", ")}`,"identity"),t){let r=[["workspaceId",t.workspace_id,e.workspaceId],["agentLabel",t.label,e.label],["paneId",t.pane_id,e.paneId]].filter(([,d,c])=>d!==c);qe(t.cwd,e.cwd)||r.push(["cwd",t.cwd,e.cwd]),Gn(t,e.herdrAgent)||r.push(["herdrAlias",t,e.herdrAgent]);let a=Kn(e.piSessionId,e.piSessionFile),o=Xn(t);(o.length===0&&s.requireLiveSession||o.length>0&&!o.every(d=>Vo(d,a)))&&r.push(["session",o,a]),r.length&&$("target_not_found",`Live Herdr agent identity does not match managed state: ${r.map(([d,c,f])=>`${d}=${JSON.stringify(c)} != ${JSON.stringify(f)}`).join(", ")}`,"identity")}s.requestId&&n.activeRequestId!==s.requestId&&n.completedRequestId!==s.requestId&&$("target_not_found","Agent request identity does not match managed state","identity")}function Zc(e,n){return e?.requestId===n?.requestId&&e?.task===n?.task&&e?.startedAt===n?.startedAt}function el(e){return Math.max(0,Math.min(100,Math.round(e)))}function cp(e,n){ti+=1,us={generation:ti,revision:1,runtime:e,...n.activity&&{activity:n.activity},...n.context!==void 0&&n.context!==null?{context:el(n.context)}:{},...n.model?{model:n.model}:{},...n.thinking?{thinking:n.thinking}:{}},_n={generation:ti,activityKnown:!1,contextKnown:!1,modelKnown:!1,thinkingKnown:!1},lt=!0}function lp(){ti+=1,us=void 0,_n={generation:ti,activityKnown:!1,contextKnown:!1,modelKnown:!1,thinkingKnown:!1},lt=!1}function up(e,n){let t=us;if(!t)return!1;let s=!1;if(JSON.stringify(t.runtime)!==JSON.stringify(e)&&(t.runtime=e,s=!0),n.activity!==void 0){let i=n.activity??void 0;Zc(t.activity,i)||(t.activity=i,s=!0)}if(n.context!==void 0){let i=n.context===null?void 0:el(n.context);t.context!==i&&(t.context=i,s=!0)}if(n.model!==void 0){let i=n.model??void 0;t.model!==i&&(t.model=i,s=!0)}if(n.thinking!==void 0){let i=n.thinking??void 0;t.thinking!==i&&(t.thinking=i,s=!0)}return s&&(t.revision+=1,lt=!0),s}function fp(e){return{...e,runtime:{...e.runtime},...e.activity?{activity:{...e.activity}}:{activity:void 0}}}function gp(e,n){let{runtime:t,activity:s}=e,i=Ke(s?`${t.label} \xB7 ${s.task}`:t.label,80)??t.label.slice(0,80),r=["--source",`pi-herdsman:${t.runId}`,"--title",i,"--display-agent",t.agentDefinition,"--token","managed=1","--token",`role=${t.agentDefinition}`],a=n.generation!==e.generation;return(a||!n.activityKnown||!Zc(n.activity,s))&&(s?r.push("--token",`request=${s.requestId}`,"--token",`task=${Ke(s.task)??""}`,"--token",`started=${s.startedAt}`):r.push("--clear-token","request","--clear-token","task","--clear-token","started")),(a||!n.contextKnown||n.context!==e.context)&&(s&&e.context!==void 0?r.push("--token",`ctx=${e.context}`):r.push("--clear-token","ctx")),(a||!n.modelKnown||e.model!==n.model)&&r.push(e.model!==void 0?"--token":"--clear-token",e.model!==void 0?`model=${e.model}`:"model"),(a||!n.thinkingKnown||e.thinking!==n.thinking)&&r.push(e.thinking!==void 0?"--token":"--clear-token",e.thinking!==void 0?`thinking=${e.thinking}`:"thinking"),r}async function pp(e,n){if(!Lo){Lo=!0;try{for(;lt&&us;){lt=!1;let t=fp(us),s=t.generation,i=t.revision,r=!1;try{await ee(e,n,["pane","report-metadata",t.runtime.paneId,...gp(t,_n)],{timeout:1e4,signal:ct?.signal,noResult:!0}),r=!0}catch{r=!1}let a=us;if(!a||a.generation!==s)continue;if(!r){if(a.revision!==i){lt=!0;continue}lt=!0;break}let o=_n.generation!==t.generation,d=o||!_n.modelKnown||t.model!==_n.model,c=o||!_n.thinkingKnown||t.thinking!==_n.thinking;_n={generation:s,activityKnown:!0,activity:t.activity?{...t.activity}:void 0,contextKnown:!0,context:t.context,modelKnown:!0,model:t.model??(d?void 0:_n.model),thinkingKnown:!0,thinking:t.thinking??(c?void 0:_n.thinking)},a.revision!==i&&(lt=!0)}}finally{Lo=!1}}}function Dt(e,n,t,s,i=!1){i?cp(t,s):up(t,s),pp(e,n)}function Lt(e,n){return{label:e.agentLabel,paneId:e.paneId,runId:e.runId,agentDefinition:process.env.PI_HERDSMAN_AGENT_DEFINITION,cwd:n.cwd}}function nl(e){let n=process.env;if(!Yo())return{version:4,runId:n.PI_HERDSMAN_RUN_ID,ownerSessionId:n.PI_HERDSMAN_OWNER_SESSION_ID,workspaceId:n.PI_HERDSMAN_WORKSPACE_ID,agentLabel:n.PI_HERDSMAN_LABEL,paneId:n.HERDR_PANE_ID,piSessionId:e.sessionManager.getSessionId(),piSessionFile:e.sessionManager.getSessionFile(),cwd:e.cwd,updatedAt:Date.now()}}function Dc(e){return!!e&&/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(e)}function ni(e,n){return e.runId===n.runId&&e.ownerSessionId===n.ownerSessionId&&e.workspaceId===n.workspaceId&&e.agentLabel===n.agentLabel&&e.paneId===n.paneId&&e.piSessionId===n.piSessionId&&An(e.piSessionFile,n.piSessionFile)&&qe(e.cwd,n.cwd)}function mp(e,n){Or(e,n)}async function jo(e,n,t,s,i,r,a,o=Date.now(),d=yn(),c=t==="task"?"delegate":t==="steer"?"steer":"reply"){s.trim()||$("invalid_request","Message must not be empty",c),t==="reply"&&!a&&$("invalid_request","Reply request is missing its ask ID",c);let f={version:4,runId:n.runId,requestId:d,ownerSessionId:n.ownerSessionId,workspaceId:n.workspaceId,agentLabel:n.label,paneId:n.paneId,kind:t,...t==="reply"?{askId:a}:{},text:s,createdAt:o},l=await ci(i),u=Xt(f);u>l.mailbox.bytes&&$("invalid_request",`Mailbox payload is ${u} bytes; configured limit is ${l.mailbox.bytes} bytes`,c);let p=Be(n.mailboxPath);p||$("target_not_found","Agent mailbox state is unavailable",c),En(n,p),await mi(e,n,i,{signal:r});try{Na(n.mailboxPath,f)}catch(v){String(v).toLowerCase().includes("too large")&&$("invalid_request","Request exceeds the mailbox size limit",c),$("internal_failure",String(v),c)}let m=!1;$e?.();try{await ee(e,i,["agent","prompt",n.paneId,Fa(d)],{signal:r});let v=await Li(n.mailboxPath,S=>S.lastAck?.requestId===d,{timeoutMs:5e3,signal:r});(!v||v.lastAck?.requestId!==d)&&$("internal_failure","Agent acknowledgement identity did not match",c);let h=v.lastAck;h||$("internal_failure","Agent acknowledgement was missing",c);try{En(n,v)}catch(S){let R=`Acknowledged request identity changed after acknowledgement: ${String(S)}`;if(_e.set(n.label,R),X(e,i,"pi_herdsman_cleanup_error",S),S instanceof ke)throw new ke({...S.detail,operation:c});$("target_not_found",R,c)}if(m=!0,!h.accepted){let S=h.code==="busy"||h.code==="idle"?"agent_busy":h.code==="invalid"?"invalid_request":h.code==="identity"?"target_not_found":"internal_failure";$(S,h.message??"Agent rejected request",c)}return t==="task"&&(n.activeRequestId=d,n.task=s,n.startedAt=Date.now(),n.contextPercent=void 0,ea(e,n,i,Pe?.signal),fi(e,n,i,Pe?.signal)),d}finally{if(m)try{Or(n.mailboxPath,d)}catch(v){let h=`Acknowledged request could not be removed: ${String(v)}`;_e.set(n.label,h),X(e,i,"pi_herdsman_cleanup_error",v)}}}function Ir(e,n){if(!n)return!1;try{return!!it(e,n)}catch{return!0}}async function en(e,n,t,s=!1,i=!1,r){let a=r?{agents:r}:i?await qn(e,n,t):await Qt(e,n,t),o="workspaceId"in a?a.workspaceId:process.env.HERDR_WORKSPACE_ID??n.cwd,d=fn(),c=i?d:d.filter(({state:u})=>u.workspaceId===o),f=c.flatMap(({path:u,state:p})=>{let m=Ve(p.workspaceId,p.agentLabel,p.runId),v=a.agents.filter(Le=>Le.workspace_id===p.workspaceId&&Le.pane_id===p.paneId&&(!Le.cwd||qe(Le.cwd,p.cwd))&&Gn(Le,m)&&pi(Le,Kn(p.piSessionId,p.piSessionFile)));if(v.length!==1)return[];let h=v[0],S;try{S=Ln(p)}catch{return[]}let R=Ye(h.agent_session),F=R?.kind==="id"?R.value:h.session_id??h.pi_session_id,J=R?.kind==="path"?R.value:h.session_path??h.pi_session_path,V=ho(h),pe=Ir(u,p.completedRequestId),Y=wt(u,p),we=Ka(V,p.activeRequestId,pe,Y,!!p.pendingAskId,!!p.resultError),Q=ml(p,c),Se=we==="settling"&&!!p.activeRequestId&&!pe&&!Y&&!p.resultError&&Q,Ie=Se?"blocked":we,Re=!p.pendingAskId&&(Ie==="working"||Se),Z=Date.now();return[{state:p,agentDefinition:S,lifecycleState:V,listed:{label:p.agentLabel,kind:h.agent_session?.agent,state:Ie,steerable:Re,workspace_id:p.workspaceId,pane_id:h.pane_id,tab_id:h.tab_id,tab_label:h.tab_label,cwd:h.cwd,pi_session_id:F,pi_session_path:J,display_agent:h.display_agent,managed:!0,owner_session_id:p.ownerSessionId,agent_definition:S,...h.model??h.agent_model?{model:h.model??h.agent_model}:{},...h.thinking??h.agent_thinking?{thinking:h.thinking??h.agent_thinking}:{},active_request_id:p.activeRequestId,...p.resultError?{result_error:p.resultError}:{},...p.lastActivityAt!==void 0?{last_activity_at:p.lastActivityAt,...we==="working"&&p.activeRequestId&&p.lastActivityAt<=Z&&Z-p.lastActivityAt>=Bo?{stale:!0,inactive_ms:Z-p.lastActivityAt}:{}}:{},tokens:h.tokens??{}}}]}),l=[];if(s)try{let u=(await ee(e,n,["pane","list","--workspace",o],{signal:t}))?.panes;if(Array.isArray(u)){let p=new Set(c.map(({state:m})=>m.ownerSessionId));for(let m of p){let v=a.agents.filter(R=>Xn(R).some(F=>Yc(F,m)));if(v.length!==1)continue;let h=v[0];if(!Vc(h,m)||typeof h.pane_id!="string"||!h.pane_id.trim())continue;let S=u.filter(R=>R?.workspace_id===o&&R?.pane_id===h.pane_id);S.length===1&&op(h,S[0],m)&&l.push(m)}}}catch{}return{agents:f,mailboxes:c,liveAgents:a.agents,leadSessionIds:l}}async function mr(e,n,t,s){let[i,r]=await Promise.all([Qt(e,n,s),ee(e,n,["pane","list","--workspace",t.workspaceId],{signal:s})]);Array.isArray(r?.panes)||$("internal_failure","Agent pane absence could not be proven","close");let a=Ve(t.workspaceId,t.agentLabel,t.runId),o=Kn(t.piSessionId,t.piSessionFile);(r.panes.some(c=>c.pane_id===t.paneId)||i.agents.some(c=>c.workspace_id===t.workspaceId&&(c.pane_id===t.paneId||c.name===a||c.herdr_agent===a||pi(c,o))))&&$("target_not_found","Agent is still live; orphan recovery is refused","close")}async function tl(e,n,t,s,i,r){if(!s)return t.agents;let a=t.agents.filter(({state:d})=>d.ownerSessionId===i);if(s.kind==="lead"){let d=[...a],c=new Map(d.map(u=>[u.state.agentLabel,u])),f=t.agents.filter(({state:u})=>u.ownerSessionId!==i),l=!0;for(;f.length&&l;){l=!1;for(let u=f.length-1;u>=0;u--){let p=f[u],m=t.agents.find(({state:S})=>S.piSessionId===p.state.ownerSessionId);if(m&&c.has(m.state.agentLabel)){let S={...p,parentLabel:m.state.agentLabel};d.push(S),c.set(p.state.agentLabel,S),f.splice(u,1),l=!0;continue}if(m)continue;let v=t.mailboxes.find(({state:S})=>S.ownerSessionId===i&&S.piSessionId===p.state.ownerSessionId)?.state;if(!v)continue;try{Ln(v),await mr(e,n,v,r)}catch{continue}let h={...p,parentLabel:v.agentLabel,orphan:!0};d.push(h),c.set(p.state.agentLabel,h),f.splice(u,1),l=!0}}for(let u of f){let p=t.agents.find(({state:S})=>S.piSessionId===u.state.ownerSessionId),m=new Set,v=u,h=!1;for(;;){if(m.has(v.state.piSessionId)){h=!0;break}m.add(v.state.piSessionId);let S=t.agents.find(({state:R})=>R.piSessionId===v.state.ownerSessionId);if(!S)break;v=S}d.push({...u,listed:{...u.listed,state:"unknown",steerable:!1,recovery_only:!0,diagnostic:h?"cyclic ancestry; recovery only":"incomplete ancestry; recovery only"},...p?{parentLabel:p.state.agentLabel}:{}})}return d}let o=[];for(let d of t.agents){let c=a.find(({state:f})=>f.piSessionId===d.state.ownerSessionId);if(d.state.ownerSessionId===i){o.push(d);continue}if(s.kind==="managed-agent"||!c){if(s.kind==="managed-agent")continue;let f=t.mailboxes.find(({state:l})=>l.ownerSessionId===i&&l.piSessionId===d.state.ownerSessionId)?.state;if(!f)continue;try{Ln(f)}catch{continue}try{await mr(e,n,f,r)}catch{continue}o.push({...d,parentLabel:f.agentLabel,orphan:!0});continue}o.push({...d,parentLabel:c.state.agentLabel})}return o}function sl(e,n,t){return e.map(({listed:s,state:i,parentLabel:r,orphan:a})=>{let o=i.ownerSessionId===n,d=[];if(!s.recovery_only&&o){if(d.push("inspect"),s.steerable===!0&&d.push("steer"),i.pendingAskId)try{let u=It(dn(i.workspaceId,i.agentLabel),i);u?.askId===i.pendingAskId&&u.requestId===i.activeRequestId&&u.runId===i.runId&&u.ownerSessionId===i.ownerSessionId&&u.workspaceId===i.workspaceId&&u.agentLabel===i.agentLabel&&u.paneId===i.paneId&&u.piSessionId===i.piSessionId&&d.push("reply")}catch{}d.push("close")}else!s.recovery_only&&a&&t?.kind==="lead"&&d.push("close");let{label:c,steerable:f,...l}=s;return{...l,agent:s.label,available_actions:d,..._e.has(s.label)?{cleanup_error:_e.get(s.label)}:{},...r?{parent_label:r}:{},...a?{orphan:!0}:{}}})}async function Qo(e,n,t,s,i=!1){let r=await en(e,n,s,i);return{...r,visible:await tl(e,n,r,t,n.sessionManager.getSessionId(),s)}}function Lc(e,n){let t=nl(n);if(!t)return["?"];let s=e.agents.find(({state:o})=>ni(o,t));if(!s)return["?",process.env.PI_HERDSMAN_AGENT_DEFINITION&&process.env.PI_HERDSMAN_LABEL?St(process.env.PI_HERDSMAN_AGENT_DEFINITION,process.env.PI_HERDSMAN_LABEL):process.env.PI_HERDSMAN_AGENT_DEFINITION??"?"];let i=[St(s.agentDefinition,s.state.agentLabel)],r=new Set([s.state.piSessionId]),a=s.state.ownerSessionId;for(;;){let o=e.agents.find(({state:d})=>d.piSessionId===a);if(o){if(r.has(o.state.piSessionId))return["?",...i.reverse()];r.add(o.state.piSessionId),i.push(St(o.agentDefinition,o.state.agentLabel)),a=o.state.ownerSessionId;continue}return e.mailboxes.some(({state:d})=>d.piSessionId===a)?["?",...i.reverse()]:e.leadSessionIds.includes(a)?["herd",...i.reverse()]:["?",...i.reverse()]}}async function Nc(e,n,t,s){return(await Qo(e,n,t,s)).visible.map(({listed:r})=>r)}function hp(){return Tr().map(({diagnostic:e})=>({state:"unknown",available_actions:[],managed:!0,diagnostic:e}))}async function yp(e,n,t,s){return{ok:!0,agents:[...sl((await Qo(e,n,s,t)).visible,n.sessionManager.getSessionId(),s).filter(r=>r.recovery_only!==!0),...s?.kind==="lead"?hp():[]],agent_definitions:s?await Jc(n,s):[]}}function il(e,n){return`${e.mailboxPath}/result-${n}.json`}var rl=["runId","requestId","ownerSessionId","workspaceId","agentLabel","paneId","cwd","piSessionId","piSessionFile"];function ol(e,n){return!e||typeof e!="object"?!1:rl.every(t=>e[t]===n[t])}function wp(e){return JSON.stringify(rl.map(n=>e[n]))}function ft(e,n){return{runId:e.runId,requestId:n,ownerSessionId:e.ownerSessionId,workspaceId:e.workspaceId,agentLabel:"label"in e?e.label:e.agentLabel,paneId:e.paneId,cwd:e.cwd,piSessionId:e.piSessionId,piSessionFile:e.piSessionFile}}function hi(e,n){return e.some(t=>{let s=t?.message??t;return s?.customType!=="pi-herdsman-agent-result"?!1:ol(s?.details??t?.details,n)})}function Ip(e,n,t){return e.runId===n.runId&&e.ownerSessionId===n.ownerSessionId&&e.workspaceId===n.workspaceId&&e.agentLabel===n.agentLabel&&e.paneId===n.paneId&&e.requestId===t}function bp(e,n){if(e.workspace_id!==n.workspaceId)return!1;let t=Ve(n.workspaceId,n.agentLabel,n.runId),s=[e.herdr_agent,e.name].filter(r=>typeof r=="string"),i=[e.label].filter(r=>typeof r=="string");return e.pane_id===n.paneId||s.includes(t)||i.includes(n.agentLabel)||s.some(r=>r.startsWith(`${n.agentLabel.slice(0,15)}_`))}async function Sp(e,n,t,s,i){if(ve.get(n.label)!==n)return;let r=n.activeRequestId??n.completedRequestId;if(s.runId!==n.runId||s.ownerSessionId!==n.ownerSessionId||s.workspaceId!==n.workspaceId||s.agentLabel!==n.label||s.paneId!==n.paneId||s.requestId!==r||!nn)return;let a=t.sessionManager.getEntries?.()??[],o=ta(n,s.requestId),d=ft(n,s.requestId);if(!hi(a,d)&&!di.has(o)){let c=s.status==="completed"&&Number.isFinite(n.startedAt)&&n.startedAt!==void 0&&n.startedAt>=0&&Number.isFinite(s.completedAt)&&s.completedAt>=0&&s.completedAt>=n.startedAt?s.completedAt-n.startedAt:void 0,f=Xs(s.status==="completed"?s.text:s.error?.message??"Agent failed",{keep:"head",sessionId:n.piSessionId??n.runId,key:s.requestId,requestId:s.requestId,...s.status==="completed"?{persist:"completion"}:{}});f.persistenceError&&X(e,t,"pi_herdsman_result_error",f.persistenceError);let l=Cp(n,s.requestId,a);e.sendMessage({customType:"pi-herdsman-agent-result",content:[`Agent result \xB7 agent=${s.agentLabel} \xB7 definition=${n.agentDefinition} \xB7 session=${n.piSessionId??"?"} \xB7 request=${s.requestId} \xB7 status=${s.status}`,f.content,...l?[l.content]:[]].join(`
249
249
 
250
250
  `),display:!0,details:{runId:s.runId,requestId:s.requestId,ownerSessionId:s.ownerSessionId,workspaceId:s.workspaceId,agentLabel:s.agentLabel,paneId:s.paneId,cwd:n.cwd,...n.piSessionId!==void 0?{piSessionId:n.piSessionId}:{},...n.piSessionFile!==void 0?{piSessionFile:n.piSessionFile}:{},agentDefinition:n.agentDefinition,status:s.status,...c!==void 0?{elapsedMs:c}:{},contextUsage:s.contextUsage,truncated:f.truncated,...f.resultPath?{resultPath:f.resultPath}:{},...f.fullOutputPath?{fullOutputPath:f.fullOutputPath}:{},...f.persistenceError?{resultPersistenceError:f.persistenceError}:{},...l?{delegationStatus:l.content,activeDirectChildCount:l.activeDirectChildCount,pendingDirectResultCount:l.pendingDirectResultCount,unresolvedDirectChildCount:l.unresolvedDirectChildCount}:{},error:s.error}},{triggerTurn:!0,deliverAs:"steer"}),di.add(o)}ve.get(n.label)!==n||!nn||(fs(n,s.requestId),br(n),Zo(n),n.completedRequestId=s.requestId,n.activeRequestId=void 0,n.task=void 0,n.startedAt=void 0,n.contextPercent=void 0,await dl(e,n,s,t,i)||Jo(e,n,s,t,i))}function vp(e,n,t){if(!hi(t,ft(e,n)))return!1;let s=Be(e.mailboxPath);return!!(s&&s.runId===e.runId&&s.ownerSessionId===e.ownerSessionId&&s.workspaceId===e.workspaceId&&s.agentLabel===e.label&&s.paneId===e.paneId&&qe(s.cwd,e.cwd)&&s.piSessionId===e.piSessionId&&An(s.piSessionFile,e.piSessionFile)&&!s.activeRequestId&&s.completedRequestId===n)}async function al(e,n,t,s,i){if(n.noLiveAgent)return!0;let r,a=process.env.PI_HERDSMAN_MAILBOX!==void 0;try{a&&(r=Xo(n.workspaceId,n.ownerSessionId));let o=(await en(e,s,i)).agents.find(({state:c})=>c.runId===n.runId&&c.ownerSessionId===n.ownerSessionId&&c.workspaceId===n.workspaceId&&c.agentLabel===n.label&&c.paneId===n.paneId&&qe(c.cwd,n.cwd)&&c.piSessionId===n.piSessionId&&An(c.piSessionFile,n.piSessionFile))?.listed;if(!o)throw new Error("live agent disappeared");let d=Be(n.mailboxPath);if((!d||d.activeRequestId===t.requestId||d.completedRequestId!==t.requestId)&&(d=await Li(n.mailboxPath,c=>c.runId===n.runId&&c.ownerSessionId===n.ownerSessionId&&c.completedRequestId===t.requestId&&!c.activeRequestId,{timeoutMs:5e3,signal:i})),En(n,d,o,{requireLiveSession:!0,requestId:t.requestId}),d.activeRequestId&&d.activeRequestId!==t.requestId)throw new Error("agent has a different active assignment");return a?await yr(e,s,o,d,i,{allowPostCompletionTransition:!0}):await sa(e,s,o,d,i,{allowPostCompletionTransition:!0}),si?.(s),!0}catch(o){let d=String(o);return _e.get(n.label)!==d&&X(e,s,"pi_herdsman_cleanup_error",o),_e.set(n.label,d),$e?.(),!1}finally{r?.()}}async function dl(e,n,t,s,i){if(!vp(n,t.requestId,s.sessionManager.getEntries?.()??[]))return!1;if(n.noLiveAgent)try{ja(n.mailboxPath,t.requestId)}catch(r){let a=String(r);return _e.get(n.label)!==a&&X(e,s,"pi_herdsman_cleanup_error",r),_e.set(n.label,a),!1}else if(!await al(e,n,t,s,i))return!1;return di.delete(ta(n,t.requestId)),pr(n.label),$e?.(),n.noLiveAgent&&si?.(s),!0}async function ui(e,n,t,s,i){if(!nn)return;let r=`${n.mailboxPath}:${s.requestId}`;if(!ur.has(r)){ur.add(r);try{await Sp(e,n,t,s,i),cl(n,s.requestId)}catch(a){ll(e,n,t,s,i,a)}finally{ur.delete(r)}}}async function Oc(e,n,t){let s=n.sessionManager.getEntries?.()??[],i;try{i=n.sessionManager.getSessionId()}catch{return}for(let r of[...ve.values()]){if(r.ownerSessionId!==i)continue;let a=r.completedRequestId;if(!a)continue;let o;try{o=it(r.mailboxPath,a)}catch{continue}!o||!hi(s,ft(r,a))||await ui(e,r,n,o,t)}}function cl(e,n){let t=`${e.mailboxPath}:${n}`,s=Ot.get(t);s&&(clearTimeout(s),Ot.delete(t))}function ll(e,n,t,s,i,r){Rs(r);let a=`${n.mailboxPath}:${s.requestId}`;if(Ot.get(a))return;_e.set(n.label,`Result delivery failed; retrying: ${String(r)}`);let d=setTimeout(()=>{if(Ot.delete(a),!(!nn||ve.get(n.label)!==n))try{let c=it(n.mailboxPath,s.requestId);c&&ui(e,n,t,c,i)}catch(c){ll(e,n,t,s,i,c)}},250);Ot.set(a,d)}function kp(e,n){let t=`${e.mailboxPath}:${n}`,s=qt.get(t);s&&(clearTimeout(s),qt.delete(t))}function Jo(e,n,t,s,i,r=new Error("agent state is not durably completed")){Rs(r);let a=`${n.mailboxPath}:${t.requestId}`;if(qt.has(a))return;_e.has(n.label)||_e.set(n.label,`Result cleanup failed; retrying: ${String(r)}`);let o=setTimeout(async()=>{if(qt.delete(a),!(!nn||ve.get(n.label)!==n))try{await dl(e,n,t,s,i)||Jo(e,n,t,s,i)}catch(d){Jo(e,n,t,s,i,d)}},250);qt.set(a,o)}function fs(e,n){let t=n??e.activeRequestId??e.completedRequestId;if(!t)return;cl(e,t),kp(e,t);let s=il(e,t),i=oi.get(s);i&&(clearTimeout(i),oi.delete(s));let r=ri.get(s);r&&(fr(s,r),ri.delete(s))}function br(e){let n=Lr(e.mailboxPath),t=ut.get(n);t&&(clearTimeout(t),ut.delete(n));let s=ai.get(n);s&&(fr(n,s),ai.delete(n))}function Zo(e){let n=`${e.mailboxPath}:`;for(let t of[...Dn.keys()])if(t.startsWith(n)){let s=Dn.get(t);s&&clearTimeout(s),Dn.delete(t)}}function ul(e,n,t,s,i,r){n.set(e,s);try{if(s(),n.get(e)!==s)return;yg(e,{interval:250},s)}catch(a){n.delete(e),r(a),t.has(e)||t.set(e,setTimeout(()=>{t.delete(e),i()},250))}}function _p(e,n){return e.some(t=>{let s=t?.message,i=t?.details??s?.details;return(t?.customType==="pi-herdsman-agent-ask"||s?.customType==="pi-herdsman-agent-ask")&&i?.askId===n.askId&&i?.requestId===n.requestId&&i?.runId===n.runId&&i?.agentLabel===n.agentLabel&&i?.workspaceId===n.workspaceId&&i?.paneId===n.paneId&&i?.piSessionId===n.piSessionId})}function Ap(e,n,t,s,i){if(ve.get(n.label)!==n||!nn||t.sessionManager.getSessionId()!==n.ownerSessionId||!s.pendingAskId||s.pendingAskId!==i.askId||!s.activeRequestId||i.requestId!==s.activeRequestId||i.runId!==s.runId||i.ownerSessionId!==s.ownerSessionId||i.workspaceId!==s.workspaceId||i.agentLabel!==s.agentLabel||i.paneId!==s.paneId||i.piSessionId!==s.piSessionId)return!1;En(n,s);let r=t.sessionManager.getBranch();return _p(r,i)||e.sendMessage({customType:"pi-herdsman-agent-ask",content:`Agent ${i.agentLabel} needs your input:
251
251
 
@@ -260,7 +260,7 @@ Reply using agent action "reply" for this agent.`,display:!0,details:{askId:i.as
260
260
  ${_}
261
261
  </global_instructions>`:void 0].filter(k=>k!==void 0).join(`
262
262
 
263
- `)},be=(y,w,_)=>{let k=process.env.HERDR_PANE_ID;if(!k)return Promise.resolve();let M=["pane","report-metadata",k,"--source","pi-herdsman:lead","--title",w==="active"?"chief":"Pi Herdsman lead",...w==="active"?["--token","pi_herdsman_role=chief"]:w==="inactive"?["--token","pi_herdsman_role=lead"]:["--clear-token","pi_herdsman_role"]];return n=n.catch(()=>{}).then(async()=>{_===l&&await ee(e,y,M,{noResult:!0,timeout:1e4})}).catch(()=>{}),n},re=y=>{e.appendEntry("pi-herdsman-role",{role:y})},Ne=()=>{try{return e.appendEntry("pi-herdsman-lead-state",{instanceId:we,...Y?{pendingAsk:Y}:{}}),ce()}catch(y){return Q=!1,f&&X(e,f,"pi_herdsman_state_error",y),!1}},ce=()=>{if(a?.kind!=="lead"||d!=="inactive")return!0;try{return zd(fe(),{version:1,instanceId:we,piSessionId:f?.sessionManager.getSessionId()??"",...Y?{pendingAsk:Y}:{},updatedAt:Date.now()}),Q=!0,!0}catch(y){Q=!1;try{let w=f?.sessionManager.getSessionId();w&&$t(fe(),w,we)}catch{}return f&&X(e,f,"pi_herdsman_state_error",y),!1}},ln=(y,w=!0)=>{let _=!1,k,M=U=>{try{U()}catch(z){k??=z}};M(()=>{De&&(ye(),_=!0)}),pe();let te=c;c=void 0,M(()=>te?.release()),V(),d="inactive",!_&&!De&&M(()=>Yn("inactive")),w&&M(()=>re("lead")),Q&&M(()=>Ne()),k&&y&&X(e,y,"pi_herdsman_role_error",k),y&&be(y,"inactive",l)},tn=(y,w,_)=>{pe(),c=w,V(),d="active";try{wi()}catch(k){throw d="inactive",c=void 0,V(),k}re("chief"),be(y,"active",_)},Vn=y=>{let w=!1,_,k=te=>{try{te()}catch(U){_??=U}};k(()=>{De&&(ye(),w=!0)}),pe();let M=c;c=void 0,V(),d="suspended",k(()=>M?.release()),!w&&!De&&k(()=>Yn("suspended")),k(()=>re("chief")),_&&y&&X(e,y,"pi_herdsman_role_error",_),y&&be(y,"suspended",l)},Ht=y=>{Y=void 0,we=yn(),Q=!0;let w=[...y.sessionManager.getEntries()].reverse().find(k=>k?.type==="custom"&&k.customType==="pi-herdsman-lead-state"),_=!1;if(w){let k=w.data;if(!k||typeof k!="object"||Object.keys(k).some(M=>M!=="instanceId"&&M!=="pendingAsk")||k.instanceId!==void 0&&(typeof k.instanceId!="string"||!Ag.test(k.instanceId)))_=!0;else{let M=k.pendingAsk;M===void 0||M&&typeof M=="object"&&Object.keys(M).length===3&&typeof M.askId=="string"&&/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(M.askId)&&typeof M.question=="string"&&Qi(M.question)&&typeof M.text=="string"&&M.text.length>0?Y=M?{askId:M.askId,question:M.question,text:M.text}:void 0:_=!0}}if(_){Y=void 0,Q=!1,X(e,y,"pi_herdsman_state_error",new Error("invalid pi-herdsman-lead-state entry"));try{$t(fe(),y.sessionManager.getSessionId(),we)}catch(k){X(e,y,"pi_herdsman_state_error",k)}return}ce()},Qn=(y,w)=>y.sessionManager.getEntries().some(_=>_?.customType?.startsWith?.("pi-herdsman-")&&_?.details?.id===w),sn=y=>{if(!Q)throw new Error("Lead coordination state is unavailable");let w=mn(fe(),y.sessionManager.getSessionId());if(!w||w.instanceId!==we||w.piSessionId!==y.sessionManager.getSessionId()||JSON.stringify(w.pendingAsk)!==JSON.stringify(Y))throw new Error("Lead coordination state changed; retry the action")},ps=()=>{if(d==="active")return c?.descriptor;if(d==="inactive")try{return rt(fe().descriptor)}catch{return}},wl=async(y,w)=>(await qn(e,y,y.signal)).agents.filter(_=>kn(_)&&hn(_)===w&&typeof _.pane_id=="string"&&typeof _.tab_id=="string"&&typeof _.workspace_id=="string"),ia=async(y,w)=>{let k=(await qn(e,y,y.signal)).agents.filter(te=>kn(te)&&hn(te)===w.piSessionId);if(k.length!==1||!k[0]||typeof k[0].pane_id!="string"||typeof k[0].tab_id!="string"||typeof k[0].workspace_id!="string"||k[0].pane_id!==w.paneId||k[0].tab_id!==w.tabId||k[0].workspace_id!==w.workspaceId)return;let M=k[0];try{let te=await ee(e,y,["agent","get",w.paneId],{signal:y.signal}),U=te?.agent??te;if(!kn(U)||hn(U)!==w.piSessionId)return}catch{return}return M},Il=async(y,w)=>{let _=await wl(y,w),M=(await en(e,y,y.signal,!1,!0)).agents.some(({state:te})=>te.piSessionId===w);return _.filter(te=>!M&&hn(te)===w&&!!mn(fe(),w))},Fe=async y=>{let w=ps();if(!w)return;let _=fe();if(d==="active"){let k;try{k=rt(_.descriptor)}catch{return}return!c||!ot(k,c.descriptor)||!Vi(_)||w.claim.pid!==process.pid||w.piSessionId!==y.sessionManager.getSessionId()||w.paneId!==process.env.HERDR_PANE_ID||w.tabId!==process.env.HERDR_TAB_ID||w.workspaceId!==process.env.HERDR_WORKSPACE_ID?void 0:w}if(!(d!=="inactive"||!Vi(_)))try{return await ia(y,w)?w:void 0}catch{return}},Ii=()=>ps()?"No active chief is available: descriptor exists but its live Pi identity could not be verified":"No active chief is available",bl=async(y,w,_=!0)=>{let k=w.sessionManager.getSessionId();if(y.toSessionId!==k)return!1;if(d==="active"){let U=await Fe(w);if(!U)throw new Error("Chief lease could not be verified");if(y.leaseId!==U.leaseId||y.leadSessionId!==y.fromSessionId||y.kind!=="lead_message"&&y.kind!=="lead_ask"||(await Il(w,y.fromSessionId)).length!==1)return!1;let N=mn(fe(),y.leadSessionId);return!!N&&N.piSessionId===y.leadSessionId&&(y.kind!=="lead_ask"||N.pendingAsk?.askId===y.askId&&N.pendingAsk!==void 0)}let M=_?await Fe(w):(()=>{try{let U=rt(fe().descriptor);return Vi(fe())?U:void 0}catch{return}})();if(!M)throw new Error("Chief lease could not be verified");return mn(fe(),k)?y.leaseId===M.leaseId&&y.fromSessionId===M.piSessionId&&y.leadSessionId===k&&(y.kind==="chief_message"||y.kind==="chief_reply"&&!!Y&&y.askId===Y.askId):!1},Sr=async(y,w,_,k,M,te=Date.now())=>{sn(_);let U=await Fe(_);if(!U)throw new Error(Ii());let z=_.sessionManager.getSessionId();if(U.piSessionId===z)throw new Error("Chief target is invalid");let N={version:1,id:M??(y==="lead_ask"&&k?Yi(z,k,U.leaseId):yn()),leaseId:U.leaseId,kind:y,fromSessionId:z,toSessionId:U.piSessionId,leadSessionId:z,...k?{askId:k}:{},text:w,createdAt:te},ie=await Fe(_);if(sn(_),!ie||!ot(ie,U)||N.toSessionId!==ie.piSessionId)throw new Error("Chief target changed before the message was queued");let le=fe();y==="lead_ask"?go(N,le):fo(N,le);try{sn(_)}catch(Ce){try{Ds(le,N.toSessionId,N.id,N)}catch(Wt){Q=!1,X(e,_,"pi_herdsman_state_error",Wt);try{Xi(le,N.toSessionId,N.id)}catch(Is){X(e,_,"pi_herdsman_state_error",Is)}}throw Ce}return N},bi=async()=>{let y=Se,w;return Se=new Promise(_=>{w=_}),await y,w},Sl=async y=>{let w=await bi();try{if(!Q||d!=="inactive"||!Y)return;sn(y);let _=await Fe(y);if(sn(y),!_)return;let k=fe(),M=Y;if(po(k,_.piSessionId,y.sessionManager.getSessionId(),M.askId,_.leaseId))return;sn(y),await Sr("lead_ask",M.text,y,M.askId),sn(y)}finally{w()}},vl=y=>{let w=++Re;Ie&&clearTimeout(Ie);let _=new Map,k=(U,z)=>{let N=U;if(N?.generation!==Re||N.sessionId!==y.sessionManager.getSessionId()||N.instanceId!==we||Me?.signal.aborted||Me?.signal!==N.signal||d!==N.role||N.role==="inactive"&&!Q)throw new Error(`Stale inbox transaction (${z})`);N.role==="inactive"&&sn(y)},M=(U,z=!0)=>({runtime:fe(),sessionId:y.sessionManager.getSessionId(),signal:Me?.signal,cleanupError:N=>{X(e,y,"pi_herdsman_state_error",N)},isDelivered:N=>Qn(y,N),isAuthorized:async N=>{if(U){let ie=await Fe(y);if(!ie)throw new Error("Chief lease could not be verified");if(N.toSessionId!==y.sessionManager.getSessionId()||N.leaseId!==ie.leaseId)return!1}return bl(N,y,z)},sendMessage:(N,ie)=>e.sendMessage(N,ie),transaction:{begin:N=>{let ie={id:N.id,record:N,generation:w,sessionId:y.sessionManager.getSessionId(),instanceId:we,role:d,signal:Me?.signal};return _.set(N.id,ie),ie},revalidate:(N,ie)=>{k(N,ie)},clear:N=>{for(let[ie,le]of _)le===N&&_.delete(ie)}},accepted:async N=>{let ie=_.get(N.id);if(!(d!=="inactive"||!Q||N.kind!=="chief_message"&&N.kind!=="chief_reply")&&N.kind==="chief_reply"&&Y?.askId===N.askId){let le=Y;if(Y=void 0,!Ne())throw Y=le,new Error("Lead coordination state is unavailable");process.env.HERDR_PANE_ID&&t(y,{paneId:process.env.HERDR_PANE_ID})}},rejected:N=>{}}),te=()=>{w!==Re||Me?.signal.aborted||(Ie=setTimeout(()=>{Ie=void 0,mo(M(d==="active",d==="active")).catch(()=>{}).finally(te)},500),Ie.unref?.())};Sl(y).catch(()=>{}).then(()=>mo(M(!1))).catch(()=>{}).finally(te)},kl=y=>{if(!Q)throw new Error("Lead coordination state is unavailable");let w=fn().some(({state:_})=>_.ownerSessionId===y);if(Y||w||Tr().length)throw new Error(Y?"Cannot activate chief while a chief ask is pending":"Cannot activate chief while owned agent work exists")},ra=!1,Si=!1,vr,oa=async(y,w=!1)=>{if(i!=="lead")throw new Error("Only a lead can activate chief");let _=y.sessionManager.getSessionId();kl(_),Si=!1;let k=++l,M=process.env.HERDR_PANE_ID,te=process.env.HERDR_WORKSPACE_ID,U=process.env.HERDR_TAB_ID;if(!M||!U||!te)throw new Error("staff requires a herdr lead identity");let z;try{z=Ud({piSessionId:_,paneId:M,tabId:U,workspaceId:te})}catch(ie){if(ie instanceof Ee){if(w){try{$t(fe(),_,we)}catch(le){X(e,y,"pi_herdsman_state_error",le)}Vn(y)}else y.mode==="tui"&&y.hasUI&&await yi?.(y);return"A chief is already active in this herdr runtime."}throw ie}if(k!==l){try{z.release()}catch(ie){X(e,y,"pi_herdsman_role_error",ie)}return"Chief activation cancelled."}let N=!1;try{De??=e.getActiveTools(),vr?.();try{Uc(Bs(fe(),_))}catch(ie){if(ie.code!=="ENOENT")throw ie}tn(y,z,k),N=!0,jt?.(),cn?.(),Rn?.(y)}catch(ie){if(Si=!0,De)try{ye()}catch{}pe();try{cn?.()}catch{}if(N)try{he?.(y)}catch{}V(),d="inactive",c=void 0;try{z.release()}catch(le){X(e,y,"pi_herdsman_role_error",le)}try{re("lead"),Q&&Ne()}catch{}throw ie}return"Chief mode active."},_l=async y=>{if(y?.hasUI&&y.ui?.confirm){let w=Ue?await Ue(y):void 0,_=w===void 0||w.unknown?"Outstanding supervised lead asks could not be verified.":w.count?`Outstanding supervised lead asks: ${w.count}. They will remain pending.`:"No outstanding supervised lead asks are currently known.";if(!await y.ui.confirm("Leave chief mode?",`${_}
263
+ `)},be=(y,w,_)=>{let k=process.env.HERDR_PANE_ID;if(!k)return Promise.resolve();let M=["pane","report-metadata",k,"--source","pi-herdsman:lead","--title",w==="active"?"chief":"Pi Herdsman lead",...w==="active"?["--token","pi_herdsman_role=chief"]:w==="inactive"?["--token","pi_herdsman_role=lead"]:["--clear-token","pi_herdsman_role"]];return n=n.catch(()=>{}).then(async()=>{_===l&&await ee(e,y,M,{noResult:!0,timeout:1e4})}).catch(()=>{}),n},re=y=>{e.appendEntry("pi-herdsman-role",{role:y})},Ne=()=>{try{return e.appendEntry("pi-herdsman-lead-state",{instanceId:we,...Y?{pendingAsk:Y}:{}}),ce()}catch(y){return Q=!1,f&&X(e,f,"pi_herdsman_state_error",y),!1}},ce=()=>{if(a?.kind!=="lead"||d!=="inactive")return!0;try{return zd(fe(),{version:1,instanceId:we,piSessionId:f?.sessionManager.getSessionId()??"",...Y?{pendingAsk:Y}:{},updatedAt:Date.now()}),Q=!0,!0}catch(y){Q=!1;try{let w=f?.sessionManager.getSessionId();w&&$t(fe(),w,we)}catch{}return f&&X(e,f,"pi_herdsman_state_error",y),!1}},ln=(y,w=!0)=>{let _=!1,k,M=U=>{try{U()}catch(z){k??=z}};M(()=>{De&&(ye(),_=!0)}),pe();let te=c;c=void 0,M(()=>te?.release()),V(),d="inactive",!_&&!De&&M(()=>Yn("inactive")),w&&M(()=>re("lead")),Q&&M(()=>Ne()),k&&y&&X(e,y,"pi_herdsman_role_error",k),y&&be(y,"inactive",l)},tn=(y,w,_)=>{pe(),c=w,V(),d="active";try{wi()}catch(k){throw d="inactive",c=void 0,V(),k}re("chief"),be(y,"active",_)},Vn=y=>{let w=!1,_,k=te=>{try{te()}catch(U){_??=U}};k(()=>{De&&(ye(),w=!0)}),pe();let M=c;c=void 0,V(),d="suspended",k(()=>M?.release()),!w&&!De&&k(()=>Yn("suspended")),k(()=>re("chief")),_&&y&&X(e,y,"pi_herdsman_role_error",_),y&&be(y,"suspended",l)},Ht=y=>{Y=void 0,we=yn(),Q=!0;let w=[...y.sessionManager.getEntries()].reverse().find(k=>k?.type==="custom"&&k.customType==="pi-herdsman-lead-state"),_=!1;if(w){let k=w.data;if(!k||typeof k!="object"||Object.keys(k).some(M=>M!=="instanceId"&&M!=="pendingAsk")||k.instanceId!==void 0&&(typeof k.instanceId!="string"||!Ag.test(k.instanceId)))_=!0;else{let M=k.pendingAsk;M===void 0||M&&typeof M=="object"&&Object.keys(M).length===3&&typeof M.askId=="string"&&/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(M.askId)&&typeof M.question=="string"&&Qi(M.question)&&typeof M.text=="string"&&M.text.length>0?Y=M?{askId:M.askId,question:M.question,text:M.text}:void 0:_=!0}}if(_){Y=void 0,Q=!1,X(e,y,"pi_herdsman_state_error",new Error("invalid pi-herdsman-lead-state entry"));try{$t(fe(),y.sessionManager.getSessionId(),we)}catch(k){X(e,y,"pi_herdsman_state_error",k)}return}ce()},Qn=(y,w)=>y.sessionManager.getEntries().some(_=>_?.customType?.startsWith?.("pi-herdsman-")&&_?.details?.id===w),sn=y=>{if(!Q)throw new Error("Lead coordination state is unavailable");let w=mn(fe(),y.sessionManager.getSessionId());if(!w||w.instanceId!==we||w.piSessionId!==y.sessionManager.getSessionId()||JSON.stringify(w.pendingAsk)!==JSON.stringify(Y))throw new Error("Lead coordination state changed; retry the action")},ps=()=>{if(d==="active")return c?.descriptor;if(d==="inactive")try{return rt(fe().descriptor)}catch{return}},wl=async(y,w)=>(await qn(e,y,y.signal)).agents.filter(_=>kn(_)&&hn(_)===w&&typeof _.pane_id=="string"&&typeof _.tab_id=="string"&&typeof _.workspace_id=="string"),ia=async(y,w)=>{let k=(await qn(e,y,y.signal)).agents.filter(te=>kn(te)&&hn(te)===w.piSessionId);if(k.length!==1||!k[0]||typeof k[0].pane_id!="string"||typeof k[0].tab_id!="string"||typeof k[0].workspace_id!="string"||k[0].pane_id!==w.paneId||k[0].tab_id!==w.tabId||k[0].workspace_id!==w.workspaceId)return;let M=k[0];try{let te=await ee(e,y,["agent","get",w.paneId],{signal:y.signal}),U=te?.agent??te;if(!kn(U)||hn(U)!==w.piSessionId)return}catch{return}return M},Il=async(y,w)=>{let _=await wl(y,w),M=(await en(e,y,y.signal,!1,!0)).agents.some(({state:te})=>te.piSessionId===w);return _.filter(te=>!M&&hn(te)===w&&!!mn(fe(),w))},Fe=async y=>{let w=ps();if(!w)return;let _=fe();if(d==="active"){let k;try{k=rt(_.descriptor)}catch{return}return!c||!ot(k,c.descriptor)||!Vi(_)||w.claim.pid!==process.pid||w.piSessionId!==y.sessionManager.getSessionId()||w.paneId!==process.env.HERDR_PANE_ID||w.tabId!==process.env.HERDR_TAB_ID||w.workspaceId!==process.env.HERDR_WORKSPACE_ID?void 0:w}if(!(d!=="inactive"||!Vi(_)))try{return await ia(y,w)?w:void 0}catch{return}},Ii=()=>ps()?"No active chief is available: descriptor exists but its live Pi identity could not be verified":"No active chief is available",bl=async(y,w,_=!0)=>{let k=w.sessionManager.getSessionId();if(y.toSessionId!==k)return!1;if(d==="active"){let U=await Fe(w);if(!U)throw new Error("Chief lease could not be verified");if(y.leaseId!==U.leaseId||y.leadSessionId!==y.fromSessionId||y.kind!=="lead_message"&&y.kind!=="lead_ask"||(await Il(w,y.fromSessionId)).length!==1)return!1;let N=mn(fe(),y.leadSessionId);return!!N&&N.piSessionId===y.leadSessionId&&(y.kind!=="lead_ask"||N.pendingAsk?.askId===y.askId&&N.pendingAsk!==void 0)}let M=_?await Fe(w):(()=>{try{let U=rt(fe().descriptor);return Vi(fe())?U:void 0}catch{return}})();if(!M)throw new Error("Chief lease could not be verified");return mn(fe(),k)?y.leaseId===M.leaseId&&y.fromSessionId===M.piSessionId&&y.leadSessionId===k&&(y.kind==="chief_message"||y.kind==="chief_reply"&&!!Y&&y.askId===Y.askId):!1},Sr=async(y,w,_,k,M,te=Date.now())=>{sn(_);let U=await Fe(_);if(!U)throw new Error(Ii());let z=_.sessionManager.getSessionId();if(U.piSessionId===z)throw new Error("Chief target is invalid");let N={version:1,id:M??(y==="lead_ask"&&k?Yi(z,k,U.leaseId):yn()),leaseId:U.leaseId,kind:y,fromSessionId:z,toSessionId:U.piSessionId,leadSessionId:z,...k?{askId:k}:{},text:w,createdAt:te},ie=await Fe(_);if(sn(_),!ie||!ot(ie,U)||N.toSessionId!==ie.piSessionId)throw new Error("Chief target changed before the message was queued");let le=fe();y==="lead_ask"?go(N,le):fo(N,le);try{sn(_)}catch(Ce){try{Ds(le,N.toSessionId,N.id,N)}catch(Wt){Q=!1,X(e,_,"pi_herdsman_state_error",Wt);try{Xi(le,N.toSessionId,N.id)}catch(Is){X(e,_,"pi_herdsman_state_error",Is)}}throw Ce}return N},bi=async()=>{let y=Se,w;return Se=new Promise(_=>{w=_}),await y,w},Sl=async y=>{let w=await bi();try{if(!Q||d!=="inactive"||!Y)return;sn(y);let _=await Fe(y);if(sn(y),!_)return;let k=fe(),M=Y;if(po(k,_.piSessionId,y.sessionManager.getSessionId(),M.askId,_.leaseId))return;sn(y),await Sr("lead_ask",M.text,y,M.askId),sn(y)}finally{w()}},vl=y=>{let w=++Re;Ie&&clearTimeout(Ie);let _=new Map,k=(U,z)=>{let N=U;if(N?.generation!==Re||N.sessionId!==y.sessionManager.getSessionId()||N.instanceId!==we||Pe?.signal.aborted||Pe?.signal!==N.signal||d!==N.role||N.role==="inactive"&&!Q)throw new Error(`Stale inbox transaction (${z})`);N.role==="inactive"&&sn(y)},M=(U,z=!0)=>({runtime:fe(),sessionId:y.sessionManager.getSessionId(),signal:Pe?.signal,cleanupError:N=>{X(e,y,"pi_herdsman_state_error",N)},isDelivered:N=>Qn(y,N),isAuthorized:async N=>{if(U){let ie=await Fe(y);if(!ie)throw new Error("Chief lease could not be verified");if(N.toSessionId!==y.sessionManager.getSessionId()||N.leaseId!==ie.leaseId)return!1}return bl(N,y,z)},sendMessage:(N,ie)=>e.sendMessage(N,ie),transaction:{begin:N=>{let ie={id:N.id,record:N,generation:w,sessionId:y.sessionManager.getSessionId(),instanceId:we,role:d,signal:Pe?.signal};return _.set(N.id,ie),ie},revalidate:(N,ie)=>{k(N,ie)},clear:N=>{for(let[ie,le]of _)le===N&&_.delete(ie)}},accepted:async N=>{let ie=_.get(N.id);if(!(d!=="inactive"||!Q||N.kind!=="chief_message"&&N.kind!=="chief_reply")&&N.kind==="chief_reply"&&Y?.askId===N.askId){let le=Y;if(Y=void 0,!Ne())throw Y=le,new Error("Lead coordination state is unavailable");process.env.HERDR_PANE_ID&&t(y,{paneId:process.env.HERDR_PANE_ID})}},rejected:N=>{}}),te=()=>{w!==Re||Pe?.signal.aborted||(Ie=setTimeout(()=>{Ie=void 0,mo(M(d==="active",d==="active")).catch(()=>{}).finally(te)},500),Ie.unref?.())};Sl(y).catch(()=>{}).then(()=>mo(M(!1))).catch(()=>{}).finally(te)},kl=y=>{if(!Q)throw new Error("Lead coordination state is unavailable");let w=fn().some(({state:_})=>_.ownerSessionId===y);if(Y||w||Tr().length)throw new Error(Y?"Cannot activate chief while a chief ask is pending":"Cannot activate chief while owned agent work exists")},ra=!1,Si=!1,vr,oa=async(y,w=!1)=>{if(i!=="lead")throw new Error("Only a lead can activate chief");let _=y.sessionManager.getSessionId();kl(_),Si=!1;let k=++l,M=process.env.HERDR_PANE_ID,te=process.env.HERDR_WORKSPACE_ID,U=process.env.HERDR_TAB_ID;if(!M||!U||!te)throw new Error("staff requires a herdr lead identity");let z;try{z=Ud({piSessionId:_,paneId:M,tabId:U,workspaceId:te})}catch(ie){if(ie instanceof Ee){if(w){try{$t(fe(),_,we)}catch(le){X(e,y,"pi_herdsman_state_error",le)}Vn(y)}else y.mode==="tui"&&y.hasUI&&await yi?.(y);return"A chief is already active in this herdr runtime."}throw ie}if(k!==l){try{z.release()}catch(ie){X(e,y,"pi_herdsman_role_error",ie)}return"Chief activation cancelled."}let N=!1;try{De??=e.getActiveTools(),vr?.();try{Uc(Bs(fe(),_))}catch(ie){if(ie.code!=="ENOENT")throw ie}tn(y,z,k),N=!0,jt?.(),cn?.(),Rn?.(y)}catch(ie){if(Si=!0,De)try{ye()}catch{}pe();try{cn?.()}catch{}if(N)try{he?.(y)}catch{}V(),d="inactive",c=void 0;try{z.release()}catch(le){X(e,y,"pi_herdsman_role_error",le)}try{re("lead"),Q&&Ne()}catch{}throw ie}return"Chief mode active."},_l=async y=>{if(y?.hasUI&&y.ui?.confirm){let w=Ue?await Ue(y):void 0,_=w===void 0||w.unknown?"Outstanding supervised lead asks could not be verified.":w.count?`Outstanding supervised lead asks: ${w.count}. They will remain pending.`:"No outstanding supervised lead asks are currently known.";if(!await y.ui.confirm("Leave chief mode?",`${_}
264
264
 
265
265
  Supervised leads will not be changed.`))return"Chief leave cancelled."}return++l,++Re,Ie&&clearTimeout(Ie),Ie=void 0,cn?.(),f&&await be(f,"suspended",l),ln(f),f&&he?.(f),"Chief mode left."},kr=!1;a&&e.on("turn_start",()=>{kr=!1});let aa,da;if(a){let y,w=new Map,_,k,M=!0,te=g=>{if(k!==void 0)return;let b=_??Date.now();k=b;try{e.appendEntry(cr,{phase:"started",sessionId:g.sessionManager.getSessionId(),startedAt:b})}catch(I){X(e,g,"pi_herdsman_state_error",I)}$e?.()},U=g=>{if(k===void 0||!M)return;let b=g.sessionManager.getSessionId();if(w.size>0||fn().some(({state:C})=>C.ownerSessionId===b))return;let I=k,D=Date.now();try{e.appendEntry(cr,{phase:"finished",sessionId:b,startedAt:I,completedAt:D}),k=void 0,$e?.()}catch(C){X(e,g,"pi_herdsman_state_error",C)}};a.kind==="lead"&&(si=U);let z,N=!1,ie=!1,le,Ce=0,Wt=0,Is=new Map,tt,un=0,Ei,bs,Ri=0,xi;Ft=async(g,b,I)=>{let D=await bi();try{if(d!=="active"||!c)return;let C=await Fe(g);if(!C)return;let A=b??(await qn(e,g,g.signal)).agents,q=I??await en(e,g,g.signal,!1,!0),E=new Set(q.agents.map(({state:H})=>H.piSessionId));for(let H of A){let j=hn(H);if(!kn(H)||!j||j===C.piSessionId||E.has(j)||typeof H.pane_id!="string"||typeof H.tab_id!="string"||typeof H.workspace_id!="string"||A.filter(L=>kn(L)&&hn(L)===j).length!==1)continue;let T=mn(fe(),j),B=T?.pendingAsk;if(!(!T||!B)&&!po(fe(),C.piSessionId,j,B.askId,C.leaseId)){let L=await Fe(g),K=mn(fe(),j);if(!L||L.leaseId!==C.leaseId||L.piSessionId!==C.piSessionId||L.claim.pid!==C.claim.pid||L.claim.id!==C.claim.id||L.paneId!==C.paneId||L.tabId!==C.tabId||L.workspaceId!==C.workspaceId||L.createdAt!==C.createdAt||!K||K.piSessionId!==j||K.instanceId!==T.instanceId||K.pendingAsk?.askId!==B.askId||K.pendingAsk?.question!==B.question||K.pendingAsk?.text!==B.text)continue;go({version:1,id:Yi(j,B.askId,C.leaseId),leaseId:C.leaseId,kind:"lead_ask",fromSessionId:j,toSessionId:C.piSessionId,leadSessionId:j,askId:B.askId,text:B.text,createdAt:Date.now()})}}}finally{D()}};let Jt=async(g,b,I)=>{let D=b??(await qn(e,g,g.signal)).agents,A=(I??await en(e,g,g.signal,!1,!0)).agents.map(({state:L,listed:K})=>({piSessionId:L.piSessionId,ownerSessionId:L.ownerSessionId,workspaceId:L.workspaceId,paneId:L.paneId,runtimeState:K.state==="working"||K.state==="settling"?"working":K.state==="blocked"?"blocked":"unknown",agentLabel:L.agentLabel})),q=new Set(A.map(L=>L.piSessionId)),E=D.flatMap(L=>{let K=hn(L);if(!kn(L)||!K)return[];let se=rp(L);return[{sessionId:K,sessionKind:"id",workspaceId:L.workspace_id,paneId:L.pane_id,tabId:L.tab_id,workspaceCwd:L.cwd,herdrName:L.name,tabLabel:L.tab_label,...se?{sessionName:se}:{},tokens:L.tokens,runtimeState:ho(L),...typeof L.last_activity_at=="number"?{lastActivity:L.last_activity_at}:{}}]}),H=new Map;for(let L of E)!H.has(L.workspaceId)&&L.workspaceCwd&&H.set(L.workspaceId,L.workspaceCwd);let j=await sp(e,g,[...new Set(E.map(L=>L.workspaceId))],H,g.signal),T=D.some(L=>(L?.agent==="pi"||L?.agent_session?.agent==="pi")&&hn(L)===void 0)?["Live Pi agents are present but their session identities are unresolvable"]:void 0,B=E.flatMap(L=>{try{let K=mn(fe(),L.sessionId);return K?[K]:[]}catch(K){throw X(e,g,"pi_herdsman_state_error",K),K}});return{...Kd({agents:E,managedAgents:A,coordinationStates:B,workspaceProvenance:j,chiefSessionId:c?.descriptor.piSessionId,managedAgentSessionIds:q}),...T?{diagnostics:T}:{}}};Ue=async g=>{try{return{count:(await Jt(g)).leads.filter(I=>I.pendingAskId!==void 0).length,unknown:!1}}catch{return{count:0,unknown:!0}}};let zt=async(g,b)=>{if(d!=="active")return!1;let I=R(g),D=()=>R(g)===I&&(b?.()??!0),C=!1;try{let A=(await qn(e,g,g.signal)).agents,q=await en(e,g,g.signal,!1,!0,A),E=await Jt(g,A,q);if(!D()||(await Ft(g,A,q),!D()))return!1;m=E,v=!0,h=I,S=!1,C=!0,xi?.()}catch{D()&&(S=F(g))}if(D()&&d==="active"&&g.mode==="tui")try{me?.()}catch{}return C};a&&e.on("before_agent_start",(g,b)=>{if(a.kind==="lead"&&gt(b))return e.setActiveTools([...Do]),{systemPrompt:de(g.systemPromptOptions)};let I=o;if(!(!I||I.sessionId!==b.sessionManager.getSessionId()))return{systemPrompt:`${g.systemPrompt}
266
266
 
@@ -271,11 +271,11 @@ ${JSON.stringify(I.definitions,null,2)}
271
271
  </agent_definitions>
272
272
 
273
273
  This is the session-start definition snapshot. Use agent list for live agent state or to refresh agent definitions after configuration changes.`}}),a?.kind==="lead"&&e.on("tool_call",async(g,b)=>{if(!(g.toolName===Do[0]||!gt(b)))return{block:!0,reason:"Chief mode may only use the staff tool."}}),e.on("agent_start",async(g,b)=>{if(pe(),a.kind==="lead"&&(_=Date.now(),M=!1),!gt(b))return;let I=l,D=u,C=b.sessionManager.getSessionId(),A=c.descriptor.piSessionId;if(A===C)try{let q=await zt(b,()=>d==="active"&&l===I&&D===u&&b.sessionManager.getSessionId()===C&&c?.descriptor.piSessionId===A);if(d!=="active"||l!==I||D!==u||b.sessionManager.getSessionId()!==C||c?.descriptor.piSessionId!==A)return;let E=q?"fresh":F(b)?"stale":"unavailable";p={content:Mo(m,{status:E}),timestamp:Date.now(),sessionId:C}}catch{d==="active"&&l===I&&D===u&&b.sessionManager.getSessionId()===C&&c?.descriptor.piSessionId===A&&(p={content:Mo(F(b)?m:void 0,{status:F(b)?"stale":"unavailable"}),timestamp:Date.now(),sessionId:C})}}),e.on("context",(g,b)=>{if(!(!gt(b)||!p||b.sessionManager.getSessionId()!==p.sessionId))return{messages:[...g.messages,{role:"custom",customType:"pi-herdsman-supervision-context",content:p.content,display:!1,timestamp:p.timestamp}]}}),e.on("agent_end",()=>{pe()}),Le=g=>{zt(g)},jt=()=>{z&&clearInterval(z),z=void 0,(y||le)&&le?.ui?.setWidget?.("pi-herdsman",void 0),y?.dispose(),y=void 0,$e=void 0},Rn=g=>{if(jt?.(),cn?.(),!(g.mode!=="tui"||!g.hasUI||!g.ui?.setWidget)){try{g.ui.setWidget("pi-herdsman-staff",(b,I)=>(me=()=>b.requestRender(),hc(()=>m.leads,()=>J(g))))}catch{me=void 0;return}bs=setInterval(()=>{zt(g)},2e3),bs.unref?.(),zt(g)}},cn=(g=!0)=>{if(xi=void 0,me=void 0,bs&&clearInterval(bs),bs=void 0,g)try{f?.ui?.setWidget?.("pi-herdsman-staff",void 0)}catch{}};let Ml=async(g,b)=>{let D=(await Jt(g)).leads.find(E=>E.lead===b);if(!D)throw new Error("Lead changed; reopen staff.");let C=mn(fe(),D.lead);if(!C||C.piSessionId!==D.lead||D.instanceId!==void 0&&C.instanceId!==D.instanceId)throw new Error("Lead changed; reopen staff.");if((await qn(e,g,g.signal)).agents.filter(E=>E?.pane_id===D.paneId&&E?.tab_id===D.tabId&&E?.workspace_id===D.workspaceId&&kn(E)&&hn(E)===D.lead).length!==1)throw new Error("Lead changed; reopen staff.");await ee(e,g,["agent","focus",D.paneId],{signal:g.signal})};yi=async g=>{if(await g.ui.select("chief",["Focus chief","Cancel"])!=="Focus chief")return;let I=rt(fe().descriptor),D=await ia(g,I),C=rt(fe().descriptor);if(!kn(D)||hn(D)!==I.piSessionId||!ot(C,I))throw new Error("Chief changed; reopen the command.");await ee(e,g,["agent","focus",D.pane_id],{signal:g.signal})};let Pl=async g=>{if(g.mode!=="tui"){await zt(g),g.ui.notify(mc(m.leads,J(g)));return}await g.ui.custom((b,I,D,C)=>{let A=++Ri,q=l,E=u,H=g.sessionManager.getSessionId(),j,T="overview",B,L,K,se="",oe=new vg,Oe={selectedPrefix:W=>I.fg("accent",W),selectedText:W=>I.fg("accent",W),description:W=>I.fg("muted",W),scrollInfo:W=>I.fg("muted",W),noMatch:W=>I.fg("warning",W)},Xe=()=>A===Ri&&l===q&&E===u&&d==="active"&&g.sessionManager.getSessionId()===H,He=()=>{A===Ri&&++Ri,xi=void 0,C(void 0)},wn=W=>{Ml(g,W).then(He).catch(ae=>g.ui.notify(String(ae).replace(/^Error: /u,""),"error"))},st=()=>{let W=J(g),ae=W==="unavailable"?[]:Ct(m.leads),xe=ae.map(ge=>({value:ge.lead,label:ge.displayName,description:`${ge.runtimeState} \xB7 ${ge.agentCounts.total} agent${ge.agentCounts.total===1?"":"s"}${ge.pendingAskId?" \xB7 needs you":""}`}));j=wc(j,ae),K=new kg(xe,8,Oe);let an=xe.findIndex(ge=>ge.value===j);an>=0&&K.setSelectedIndex(an),K.onSelectionChange=ge=>{j=ge.value},K.onSelect=ge=>wn(ge.value),K.onCancel=He,oe.clear(),oe.addChild(new ar(ge=>I.fg("border",ge))),oe.addChild(new Qs(I.bold(I.fg("accent",W==="unavailable"?"Pi Herdsman \xB7 unavailable":`Pi Herdsman \xB7 ${ae.length} herd${ae.length===1?"":"s"}${W==="stale"?" \xB7 stale":""}`)),0,0)),oe.addChild(K),oe.addChild(new Qs(I.fg("muted","Space peek \xB7 Enter focus \xB7 Esc close"),0,0)),oe.addChild(new ar(ge=>I.fg("border",ge))),se=[W,...ae.map(ge=>`${ge.lead}:${ge.runtimeState}:${ge.pendingAskId??""}:${ge.agentCounts.total}`)].join("\0")},We=()=>{oe.clear(),oe.addChild(new ar(W=>I.fg("border",W))),B&&oe.addChild(new Qs(I.bold(I.fg("accent",`Peek \xB7 ${B.displayName}`)),0,0)),B&&oe.addChild(new Qs(yc(B,L,1e4).join(`
274
- `),0,0)),oe.addChild(new Qs(I.fg("muted","Esc back \xB7 Enter focus \xB7 Ctrl+C close"),0,0)),oe.addChild(new ar(W=>I.fg("border",W)))},ue={render(W){let ae=J(g),xe=ae==="unavailable"?[]:Ct(m.leads);if(T==="peek"&&B)return oe.render(W);let an=[ae,...xe.map(ge=>`${ge.lead}:${ge.runtimeState}:${ge.pendingAskId??""}:${ge.agentCounts.total}`)].join("\0");return(!K||an!==se)&&st(),oe.render(W)},invalidate(){b.requestRender()},handleInput(W){if(Vs(W,Ys.ctrl("c")))return He();if(T==="peek"){Vs(W,Ys.escape)||Vs(W,Ys.space)?(T="overview",st(),b.requestRender()):Vs(W,Ys.enter)&&B&&wn(B.lead);return}if(Vs(W,Ys.space)){let ae=m.leads.find(xe=>xe.lead===j);if(!ae)return;B=ae,L={agents:ae.agents.map(xe=>`${xe.label} \xB7 ${xe.state}`)},T="peek",We(),b.requestRender(),Ji(e,g,{workspaceId:ae.workspaceId,paneId:ae.paneId,tabId:ae.tabId,piSessionId:ae.lead},g.signal,xe=>kn(xe)&&xe?.pane_id===ae.paneId&&xe?.tab_id===ae.tabId&&hn(xe)===ae.lead&&mn(fe(),ae.lead)?.piSessionId===ae.lead&&ae.availableActions.includes("inspect")).then(xe=>{Xe()&&(L={recentOutput:xe.recentOutput,process:xe.process,agents:ae.agents.map(an=>`${an.label} \xB7 ${an.state}`)},T="peek",We(),b.requestRender())}).catch(()=>{});return}K?.handleInput(W)}};return st(),xi=()=>b.requestRender(),zt(g).then(()=>b.requestRender()).catch(()=>{}),ue})},xr=a.kind==="lead"?["herd"]:["?",process.env.PI_HERDSMAN_AGENT_DEFINITION&&process.env.PI_HERDSMAN_LABEL?St(process.env.PI_HERDSMAN_AGENT_DEFINITION,process.env.PI_HERDSMAN_LABEL):process.env.PI_HERDSMAN_AGENT_DEFINITION??"?"],Mr,Ss=()=>Mr?{ownTools:Mr}:{},mt={agents:[],stale:!1,unavailable:!0,breadcrumb:xr,...Ss()},vs=async(g,b)=>{let I=await Qo(e,g,a,b,!0);return{agents:sl(I.visible,g.sessionManager.getSessionId(),a).filter(A=>!A.recovery_only).map(A=>{let q=ve.get(A.agent),E=A.tokens??{},H=Wo(E);return{label:A.agent,state:A.state,definition:Ke(typeof A.agent_definition=="string"&&A.agent_definition.trim()?A.agent_definition:typeof A.display_agent=="string"?A.display_agent:typeof E.role=="string"?E.role:void 0),paneId:A.pane_id,sessionId:A.pi_session_id,task:typeof E.task=="string"?E.task:q?.task,startedAt:H.startedAt??q?.startedAt,model:H.model!==void 0?H.model:q?.model??A.model??void 0,thinking:H.thinking!==void 0?H.thinking:q?.thinking??A.thinking??void 0,contextPercent:H.contextPercent,...A.stale?{stale:!0,inactiveMs:typeof A.inactive_ms=="number"?A.inactive_ms:void 0}:{},...A.parent_label?{parentLabel:A.parent_label}:{},...A.orphan?{orphan:!0}:{}}}),stale:!1,unavailable:!1,...a.kind==="lead"&&k!==void 0?{herdRunStartedAt:k}:{},breadcrumb:a.kind==="lead"?["herd"]:Lc(I,g),...Ss(),refreshedAt:Date.now()}},ga=g=>{if(!w.size)return g;let b=[...w.values()].filter(({label:I})=>!g.agents.some(D=>D.label===I)).map(({label:I,definition:D,task:C,startedAt:A,parentLabel:q})=>({label:I,definition:D,state:"starting",...C!==void 0?{task:C}:{},startedAt:A,...q?{parentLabel:q}:{}}));return{...g,unavailable:!1,agents:[...g.agents,...b]}},$l=g=>{for(let[b,I]of w){let D=g.agents.find(E=>E.label===b),C=ve.get(b),A=I.requestId!==void 0&&(D?.state==="working"||D?.state==="blocked"),q=I.requestId!==void 0&&C?.activeRequestId!==I.requestId;(A||q)&&w.get(b)===I&&w.delete(b)}},Mi=async(g,b=Ce)=>{if(!(b!==Ce||g!==le)){if(ie){N=!0;return}ie=!0;try{if(mt=await vs(g,Me?.signal),b!==Ce||g!==le)return;$l(mt),b===Ce&&g===le&&Wt===b&&y?.setSnapshot(ga(mt))}catch{b===Ce&&g===le&&y?.setSnapshot(ga({...mt.unavailable?{agents:[],stale:!1,unavailable:!0,breadcrumb:mt.breadcrumb}:{...mt,stale:!0},...Ss()}))}finally{b===Ce&&g===le&&(ie=!1,N&&(N=!1,Mi(g,b)))}}},Cl=async g=>{let b=await vs(g,Me?.signal),I=Ro(b.agents,{now:Date.now()});if(!I.length){g.ui.notify("No running agents.");return}let D=fc(I),C=new Map;for(let[T,B]of D.entries()){if(C.has(B)){g.ui.notify("Running list is ambiguous; reopen Running.","warning");return}C.set(B,T)}let A=await g.ui.select("Running",D);if(A===void 0)return;let q=C.get(A),E=q===void 0||q<0?void 0:I[q];if(!E)return;let j=(await vs(g,Me?.signal)).agents.find(T=>T.label===E.label&&T.paneId===E.paneId&&T.sessionId===E.sessionId);if(!j?.paneId){g.ui.notify("Agent changed; reopen Running.","warning");return}await ee(e,g,["agent","focus",j.paneId],{signal:Me?.signal})},pa=async g=>{for(;;){let b=(await ls(g)).definitions,I=b.filter(se=>se.extensionSource),D=b.filter(se=>!se.extensionSource),C=se=>{let oe=typeof se.frontmatter.model=="string"?as(se.frontmatter.model):"default",Oe=se.frontmatter.thinking===!1?"off":se.frontmatter.thinking??"default";return{name:`${se.name}${se.projectSource?" [project]":""}${se.overrideSource&&(se.extensionSource||se.projectSource)?" *":""}`,model:oe,thinking:Oe,definition:se}},A=[...I,...D].map(C),q=Math.max(0,...A.map(({name:se})=>Ae(se))),E=Math.max(0,...A.map(({model:se})=>Ae(se))),H=[],j=(se,oe)=>{oe.length&&(H.push(`--- ${se} ---`),H.push(...oe.map(({name:Oe,model:Xe,thinking:He})=>`${Qe(Oe,q)} ${Qe(Xe,E)} ${He}`)))};j("Bundled (* overridden)",I.map(C)),j("Custom",D.map(C));let T=await g.ui.select("Definitions",H);if(!T)return;if(T.startsWith("---"))continue;let B=A.find(({name:se,model:oe,thinking:Oe})=>`${Qe(se,q)} ${Qe(oe,E)} ${Oe}`===T);if(!B)return;let L=B.definition,K=L.name;for(;;){let se=typeof L.frontmatter.model=="string"?as(L.frontmatter.model):"default",oe=L.frontmatter.thinking===!1?"off":L.frontmatter.thinking??"default",Oe=await g.ui.select(L.name,[`Model ${se}`,`Thinking ${oe}`,`Enabled ${vt(L)?"yes":"no"}`,"Details\u2026","Back"]);if(!Oe)return;if(Oe==="Back")break;if(Oe==="Details\u2026"){let We;try{We=(await ls(g)).definitions.find(W=>W.name===K)}catch(W){g.ui.notify(String(W),"error");break}if(!We){g.ui.notify(`Definition ${K} is no longer available.`,"warning");break}let ue=Vr(We);if(g.mode==="tui"){let W=Qr(We.body,[],"definition details");e.appendEntry(Pc,{definitions:[ue],instructions:W})}else g.ui.notify(Po([ue]).join(`
274
+ `),0,0)),oe.addChild(new Qs(I.fg("muted","Esc back \xB7 Enter focus \xB7 Ctrl+C close"),0,0)),oe.addChild(new ar(W=>I.fg("border",W)))},ue={render(W){let ae=J(g),xe=ae==="unavailable"?[]:Ct(m.leads);if(T==="peek"&&B)return oe.render(W);let an=[ae,...xe.map(ge=>`${ge.lead}:${ge.runtimeState}:${ge.pendingAskId??""}:${ge.agentCounts.total}`)].join("\0");return(!K||an!==se)&&st(),oe.render(W)},invalidate(){b.requestRender()},handleInput(W){if(Vs(W,Ys.ctrl("c")))return He();if(T==="peek"){Vs(W,Ys.escape)||Vs(W,Ys.space)?(T="overview",st(),b.requestRender()):Vs(W,Ys.enter)&&B&&wn(B.lead);return}if(Vs(W,Ys.space)){let ae=m.leads.find(xe=>xe.lead===j);if(!ae)return;B=ae,L={agents:ae.agents.map(xe=>`${xe.label} \xB7 ${xe.state}`)},T="peek",We(),b.requestRender(),Ji(e,g,{workspaceId:ae.workspaceId,paneId:ae.paneId,tabId:ae.tabId,piSessionId:ae.lead},g.signal,xe=>kn(xe)&&xe?.pane_id===ae.paneId&&xe?.tab_id===ae.tabId&&hn(xe)===ae.lead&&mn(fe(),ae.lead)?.piSessionId===ae.lead&&ae.availableActions.includes("inspect")).then(xe=>{Xe()&&(L={recentOutput:xe.recentOutput,process:xe.process,agents:ae.agents.map(an=>`${an.label} \xB7 ${an.state}`)},T="peek",We(),b.requestRender())}).catch(()=>{});return}K?.handleInput(W)}};return st(),xi=()=>b.requestRender(),zt(g).then(()=>b.requestRender()).catch(()=>{}),ue})},xr=a.kind==="lead"?["herd"]:["?",process.env.PI_HERDSMAN_AGENT_DEFINITION&&process.env.PI_HERDSMAN_LABEL?St(process.env.PI_HERDSMAN_AGENT_DEFINITION,process.env.PI_HERDSMAN_LABEL):process.env.PI_HERDSMAN_AGENT_DEFINITION??"?"],Mr,Ss=()=>Mr?{ownTools:Mr}:{},mt={agents:[],stale:!1,unavailable:!0,breadcrumb:xr,...Ss()},vs=async(g,b)=>{let I=await Qo(e,g,a,b,!0);return{agents:sl(I.visible,g.sessionManager.getSessionId(),a).filter(A=>!A.recovery_only).map(A=>{let q=ve.get(A.agent),E=A.tokens??{},H=Wo(E);return{label:A.agent,state:A.state,definition:Ke(typeof A.agent_definition=="string"&&A.agent_definition.trim()?A.agent_definition:typeof A.display_agent=="string"?A.display_agent:typeof E.role=="string"?E.role:void 0),paneId:A.pane_id,sessionId:A.pi_session_id,task:typeof E.task=="string"?E.task:q?.task,startedAt:H.startedAt??q?.startedAt,model:H.model!==void 0?H.model:q?.model??A.model??void 0,thinking:H.thinking!==void 0?H.thinking:q?.thinking??A.thinking??void 0,contextPercent:H.contextPercent,...A.stale?{stale:!0,inactiveMs:typeof A.inactive_ms=="number"?A.inactive_ms:void 0}:{},...A.parent_label?{parentLabel:A.parent_label}:{},...A.orphan?{orphan:!0}:{}}}),stale:!1,unavailable:!1,...a.kind==="lead"&&k!==void 0?{herdRunStartedAt:k}:{},breadcrumb:a.kind==="lead"?["herd"]:Lc(I,g),...Ss(),refreshedAt:Date.now()}},ga=g=>{if(!w.size)return g;let b=[...w.values()].filter(({label:I})=>!g.agents.some(D=>D.label===I)).map(({label:I,definition:D,task:C,startedAt:A,parentLabel:q})=>({label:I,definition:D,state:"starting",...C!==void 0?{task:C}:{},startedAt:A,...q?{parentLabel:q}:{}}));return{...g,unavailable:!1,agents:[...g.agents,...b]}},$l=g=>{for(let[b,I]of w){let D=g.agents.find(E=>E.label===b),C=ve.get(b),A=I.requestId!==void 0&&(D?.state==="working"||D?.state==="blocked"),q=I.requestId!==void 0&&C?.activeRequestId!==I.requestId;(A||q)&&w.get(b)===I&&w.delete(b)}},Mi=async(g,b=Ce)=>{if(!(b!==Ce||g!==le)){if(ie){N=!0;return}ie=!0;try{if(mt=await vs(g,Pe?.signal),b!==Ce||g!==le)return;$l(mt),b===Ce&&g===le&&Wt===b&&y?.setSnapshot(ga(mt))}catch{b===Ce&&g===le&&y?.setSnapshot(ga({...mt.unavailable?{agents:[],stale:!1,unavailable:!0,breadcrumb:mt.breadcrumb}:{...mt,stale:!0},...Ss()}))}finally{b===Ce&&g===le&&(ie=!1,N&&(N=!1,Mi(g,b)))}}},Cl=async g=>{let b=await vs(g,Pe?.signal),I=Ro(b.agents,{now:Date.now()});if(!I.length){g.ui.notify("No running agents.");return}let D=fc(I),C=new Map;for(let[T,B]of D.entries()){if(C.has(B)){g.ui.notify("Running list is ambiguous; reopen Running.","warning");return}C.set(B,T)}let A=await g.ui.select("Running",D);if(A===void 0)return;let q=C.get(A),E=q===void 0||q<0?void 0:I[q];if(!E)return;let j=(await vs(g,Pe?.signal)).agents.find(T=>T.label===E.label&&T.paneId===E.paneId&&T.sessionId===E.sessionId);if(!j?.paneId){g.ui.notify("Agent changed; reopen Running.","warning");return}await ee(e,g,["agent","focus",j.paneId],{signal:Pe?.signal})},pa=async g=>{for(;;){let b=(await ls(g)).definitions,I=b.filter(se=>se.extensionSource),D=b.filter(se=>!se.extensionSource),C=se=>{let oe=typeof se.frontmatter.model=="string"?as(se.frontmatter.model):"default",Oe=se.frontmatter.thinking===!1?"off":se.frontmatter.thinking??"default";return{name:`${se.name}${se.projectSource?" [project]":""}${se.overrideSource&&(se.extensionSource||se.projectSource)?" *":""}`,model:oe,thinking:Oe,definition:se}},A=[...I,...D].map(C),q=Math.max(0,...A.map(({name:se})=>Ae(se))),E=Math.max(0,...A.map(({model:se})=>Ae(se))),H=[],j=(se,oe)=>{oe.length&&(H.push(`--- ${se} ---`),H.push(...oe.map(({name:Oe,model:Xe,thinking:He})=>`${Qe(Oe,q)} ${Qe(Xe,E)} ${He}`)))};j("Bundled (* overridden)",I.map(C)),j("Custom",D.map(C));let T=await g.ui.select("Definitions",H);if(!T)return;if(T.startsWith("---"))continue;let B=A.find(({name:se,model:oe,thinking:Oe})=>`${Qe(se,q)} ${Qe(oe,E)} ${Oe}`===T);if(!B)return;let L=B.definition,K=L.name;for(;;){let se=typeof L.frontmatter.model=="string"?as(L.frontmatter.model):"default",oe=L.frontmatter.thinking===!1?"off":L.frontmatter.thinking??"default",Oe=await g.ui.select(L.name,[`Model ${se}`,`Thinking ${oe}`,`Enabled ${vt(L)?"yes":"no"}`,"Details\u2026","Back"]);if(!Oe)return;if(Oe==="Back")break;if(Oe==="Details\u2026"){let We;try{We=(await ls(g)).definitions.find(W=>W.name===K)}catch(W){g.ui.notify(String(W),"error");break}if(!We){g.ui.notify(`Definition ${K} is no longer available.`,"warning");break}let ue=Vr(We);if(g.mode==="tui"){let W=Qr(We.body,[],"definition details");e.appendEntry(Pc,{definitions:[ue],instructions:W})}else g.ui.notify(Po([ue]).join(`
275
275
  `));continue}let Xe,He;if(Oe.startsWith("Model")){Xe="model",await g.modelRegistry.refresh();let We=g.scopedModels?.map(({model:ge})=>ge)??[],ue=We.length?We:g.modelRegistry.getAvailable(),W=[...new Set(ue.map(ge=>$c(ge)))].sort(),ae=new Map;for(let ge of W){let ks=as(ge);ae.set(ks,(ae.get(ks)??0)+1)}let xe=W.map(ge=>{let ks=as(ge);return ae.get(ks)===1?ks:ge}),an=await g.ui.select("Model",["Use default",...xe,"Back"]);if(!an)return;if(an==="Back")continue;He=an==="Use default"?void 0:W[xe.indexOf(an)]??an}else if(Oe.startsWith("Thinking")){Xe="thinking",await g.modelRegistry.refresh();let We=typeof L.frontmatter.model=="string"?L.frontmatter.model:void 0,ue=We?g.modelRegistry.getAll().find(xe=>$c(xe)===We):void 0,W=ue?mg(ue):[...rd],ae=await g.ui.select("Thinking",["Use default",...W,"Back"]);if(!ae)return;if(ae==="Back")continue;He=ae==="Use default"?void 0:ae}else if(Oe.startsWith("Enabled"))Xe="enabled",He=!vt(L);else continue;let wn=gd(L,Xe,He),st=fd(L.name,L.projectSource?{projectRoot:g.cwd}:{});if(wn.changed&&st.overrideSource!==wn.path)throw new Error(`agent ${L.name} override verification failed`);g.ui.notify(wn.changed?Xe==="enabled"?`${L.name} ${He?"enabled":"disabled"}.`:`${L.name} ${Xe} ${He===void 0?"reset":`set to ${He}`}.`:`${L.name} ${Xe} is already inherited; no change made.`);break}}},ma=async g=>{let b=await cs(g),I=await g.ui.select("Layout",[b.effective==="tab"?"tab (current)":"tab",b.effective==="split"?"split (current)":"split"]);if(!I)return;let D=I.startsWith("split")?"split":"tab";So(qo(g,b.scope),D);let C=await cs(g);if(C.effective!==D)throw new Error(`Agent placement did not become effective: ${C.effective}`);g.ui.notify(`placement: ${C.effective} (${C.scope})`)},ha=g=>{e.sendMessage({customType:"pi-herdsman-stop-summary",content:`[Pi Herdsman] Stop all result:
276
- ${g}`,display:!0,details:{summary:g}},{triggerTurn:!1})},ya=async g=>{let b=await vs(g,Me?.signal);if(!b.agents.length){ha("No owned agents running.");return}if(!await g.ui.confirm("Stop all agents?",`${tr(b.agents)}
276
+ ${g}`,display:!0,details:{summary:g}},{triggerTurn:!1})},ya=async g=>{let b=await vs(g,Pe?.signal);if(!b.agents.length){ha("No owned agents running.");return}if(!await g.ui.confirm("Stop all agents?",`${tr(b.agents)}
277
277
 
278
- Active work or pending results may be discarded.`))return;g.abort();let D=await Tp(e,g,Me?.signal);ha(D),a.kind==="lead"&&U(g)},Tl=async g=>{for(;;){let b=await vs(g,Me?.signal),I=tr(b.agents)||"0",D=(await ls(g)).definitions,C=await g.ui.select("agents",[`Running ${I}`,`Definitions ${D.length}`,`Layout ${(await cs(g)).effective}`,"Message limits","Stop all\u2026"]);if(!C)return;if(C.startsWith("Running"))await Cl(g);else if(C.startsWith("Definitions"))await pa(g);else if(C.startsWith("Layout"))await ma(g);else if(C==="Message limits"){let A=await ci(g),q=[1,4,16,64,128].map(B=>({label:dr(B*1024),bytes:B*1024})),E=await g.ui.select("Message limits",[`Inline attachments ${dr(A.inline.bytes)} \xB7 ${A.inline.source}${A.inline.invalidSource?` (invalid ${A.inline.invalidSource} override ignored)`:""}`,`Mailbox payload ${dr(A.mailbox.bytes)} \xB7 ${A.mailbox.source}${A.mailbox.invalidSource?` (invalid ${A.mailbox.invalidSource} override ignored)`:""}`]);if(!E)continue;let H=E.startsWith("Inline")?"inlineAttachmentLimitBytes":"mailboxPayloadLimitBytes",j=await g.ui.select("Limit",[...q.map(({label:B})=>B),"Custom\u2026","Reset"]);if(!j)continue;let T;if(j==="Reset")T=void 0;else if(j==="Custom\u2026"){let B=await g.ui.input("Custom limit in KiB (1\u20131024)");if(B===void 0)continue;let L=Number(B);if(!/^\d+$/.test(B.trim())||!Io(L*1024)){g.ui.notify("Enter an integer from 1 through 1024 KiB","error");continue}T=L*1024}else T=q.find(({label:B})=>B===j)?.bytes;if(j!=="Reset"&&j!=="Custom\u2026"&&T===void 0)continue;nc(qo(g,"global"),H,T),g.ui.notify(`${H}: ${T===void 0?"reset":dr(T)}`)}else C==="Stop all\u2026"&&await ya(g)}};if(a.kind==="lead"){process.env.HERDR_PANE_ID&&e.registerCommand("chief",{description:"Activate chief mode, or open its overview when already active",getArgumentCompletions:b=>["leave"].filter(I=>I.startsWith(b.trim())).map(I=>({value:I,label:I})),handler:async(b,I)=>{let D=b.trim().split(/\s+/u).filter(Boolean);if(D.length>1||D[0]&&D[0]!=="leave")return I.ui.notify("Usage: /chief [leave]","error");try{if(!D.length&&d==="active")return void await Pl(I);let C=D[0]==="leave"?await _l(I):await oa(I);I.ui.notify(C)}catch(C){I.ui.notify(String(C).replace(/^Error: /,""),"error")}}}),Z={name:"chief",label:"chief",description:"For ordinary leads only. A lead owns its complete agent tree; the chief supervises leads and never changes ownership. Message and ask require a currently valid chief and reject before mutation when none exists. Use message for meaningful progress, results, warnings, and completion, including exact artifact paths; use ask when a chief decision is genuinely required, make it the only and final coordination call of the turn, do not guess, and wait for the reply. Questions are limited to 1,024 characters and 1,024 UTF-8 bytes; channel message records are bounded to 8 KiB, so multibyte content can hit the byte limit first. Chief messages arrive as follow-ups, so integrate them through normal delegation. Descendants use ask_owner, never chief.",executionMode:"sequential",parameters:O.Union([O.Object({action:Ze(["message"]),message:O.String({minLength:1}),files:O.Optional(O.Array(O.String({minLength:1})))},{additionalProperties:!1}),O.Object({action:Ze(["ask"]),question:O.String({minLength:1,maxLength:1024}),files:O.Optional(O.Array(O.String({minLength:1})))},{additionalProperties:!1})]),execute:async(b,I,D,C,A)=>{if(a.kind!=="lead"||d!=="inactive")throw new Error("Chief is available only to ordinary leads");if(!I||typeof I.action!="string")throw new Error("Invalid chief action");let q=I.action==="message"?["action","message","files"]:I.action==="ask"?["action","question","files"]:[];if(!q.length||Object.keys(I).some(E=>!q.includes(E)))throw new Error("Invalid chief action");if(I.action==="message"){if(typeof I.message!="string"||!I.message.trim())throw new Error("Message must contain non-whitespace text");if(!Q)throw new Error("Lead coordination state is unavailable");let E,H=await bi();try{let j=await Fe(A);if(!j)throw new Error(Ii());let T=yn(),B=Date.now(),L=await Oo(A,I.message,I.files??[],"chief.message","Message",K=>({version:1,id:T,leaseId:j.leaseId,kind:"lead_message",fromSessionId:A.sessionManager.getSessionId(),toSessionId:j.piSessionId,leadSessionId:A.sessionManager.getSessionId(),text:K,createdAt:B}));E=await Sr("lead_message",L,A,void 0,T,B)}catch(j){try{if(E)try{Ds(fe(),E.toSessionId,E.id,E)}catch(T){Q=!1;try{Xi(fe(),E.toSessionId,E.id)}catch(B){X(e,A,"pi_herdsman_state_error",B)}try{$t(fe(),A.sessionManager.getSessionId(),we)}catch(B){X(e,A,"pi_herdsman_state_error",B)}X(e,A,"pi_herdsman_state_error",T)}}catch(T){X(e,A,"pi_herdsman_state_error",T)}throw j}finally{H()}if(!E)throw new Error("Chief message was not queued");return{content:[{type:"text",text:`Message sent to chief (${E.id}).`}],details:{id:E.id,chiefSessionId:E.toSessionId}}}if(I.action==="ask"){if(!Qi(I.question))throw new Error("Question must be non-empty and at most 1,024 characters and 1,024 UTF-8 bytes");let E=await bi();try{if(sn(A),Y)throw new Error("A chief ask is already pending");if(!Q)throw new Error("Lead coordination state is unavailable");if(!await Fe(A))throw new Error(Ii());sn(A);let H=yn(),j=await Fe(A);if(!j)throw new Error(Ii());let T=Yi(A.sessionManager.getSessionId(),H,j.leaseId),B=Date.now(),L=await Oo(A,I.question,I.files??[],"chief.ask","Question",oe=>({version:1,id:T,leaseId:j.leaseId,kind:"lead_ask",fromSessionId:A.sessionManager.getSessionId(),toSessionId:j.piSessionId,leadSessionId:A.sessionManager.getSessionId(),askId:H,text:oe,createdAt:B})),K=Y;Y={askId:H,question:I.question,text:L};try{if(!Ne())throw new Error("Lead coordination state is unavailable")}catch(oe){throw Y=K,Ne()||(Q=!1),oe}let se=await Sr("lead_ask",L,A,H,T,B);return sn(A),process.env.HERDR_PANE_ID&&t(A,{paneId:process.env.HERDR_PANE_ID,pendingAskId:H}),{content:[{type:"text",text:`Question sent to chief (${H}).`}],details:{id:se.id,askId:H,chiefSessionId:se.toSessionId},terminate:!0}}finally{E()}}throw new Error("Invalid chief action")},renderCall:(b,I,D)=>Gs("chief",b,I,D),renderResult:(b,I,D,C)=>rr("chief",b,I,D,C)};let g={name:"staff",label:"staff",description:"The lead is the exact full Pi session ID shown as lead in a fresh automatic supervision snapshot or returned by staff list; never use display_name. Chief-only supervision coordination. The chief supervises leads and does not own their agent trees. A fresh supervision snapshot is automatically supplied at the start of each chief agent run; treat it as the default current coordination state. For general state questions and ordinary messages or replies, use a fresh snapshot directly; do not call staff list, inspect, or another read command first. The message and reply actions revalidate exact identity and state themselves. Use list when the automatic snapshot is stale or unavailable, an immediately refreshed exact roster is materially necessary, or you are diagnosing identity or supervision projection problems. Use inspect only when deeper lead evidence is needed. Use the lead field's exact full Pi session ID and only fresh available_actions, never infer from display state or metadata. Every exact-identity-verified lead accepts message; reply only with the exact pending ask ID and current chief lease. Messages are bounded and direction-aware, and temporary verification or delivery failures retain queued records. Metadata is presentation-only and never authority. Messages use follow-up delivery. Human conversation remains the dispatch surface.",executionMode:"sequential",parameters:O.Union([O.Object({action:Ze(["list"])},{additionalProperties:!1}),O.Object({action:Ze(["inspect"]),lead:O.String({pattern:To,description:"The lead is the exact full Pi session ID shown as lead in a fresh automatic supervision snapshot or returned by staff list; never use display_name."})},{additionalProperties:!1}),O.Object({action:Ze(["message"]),lead:O.String({pattern:To,description:"The lead is the exact full Pi session ID shown as lead in a fresh automatic supervision snapshot or returned by staff list; never use display_name."}),message:O.String({pattern:"\\S"}),files:O.Optional(O.Array(O.String({minLength:1})))},{additionalProperties:!1}),O.Object({action:Ze(["reply"]),lead:O.String({pattern:To,description:"The lead is the exact full Pi session ID shown as lead in a fresh automatic supervision snapshot or returned by staff list; never use display_name."}),askId:O.String({pattern:"\\S"}),message:O.String({pattern:"\\S"}),files:O.Optional(O.Array(O.String({minLength:1})))},{additionalProperties:!1})]),execute:async(b,I,D,C,A)=>{if(d!=="active"||!c)throw new Error("Staff is available only to the active chief");if(!await Fe(A))throw new Error("Chief lease is no longer active");let q={list:["action"],inspect:["action","lead"],message:["action","lead","message","files"],reply:["action","lead","askId","message","files"]};if(!I||!q[I.action]||Object.keys(I).some(ue=>!q[I.action].includes(ue)))throw new Error("Invalid staff action");let E=async()=>Jt(A),H=ue=>{let W=Xs(JSON.stringify(ue,null,2),{keep:"head",sessionId:A.sessionManager.getSessionId(),key:b});return{content:[{type:"text",text:W.content}],details:{...ue,truncated:W.truncated,...W.fullOutputPath?{full_output_path:W.fullOutputPath}:{}}}},j=await E();if(I.action==="list"){if(!await Fe(A))throw new Error("Chief lease is no longer active");return H({ok:!0,action:"list",...Gd(j)})}let T=j.leads.find(ue=>ue.lead===I.lead);if(!T)throw new Error("Lead target was not found or is no longer eligible. Retry with lead set to the exact full Pi session ID shown as lead in a fresh automatic supervision snapshot or returned by staff list; never use display_name.");let B=(ue,W)=>ue.lead===W.lead&&ue.paneId===W.paneId&&ue.workspaceId===W.workspaceId&&ue.tabId===W.tabId&&ue.instanceId===W.instanceId&&ue.pendingAskId===W.pendingAskId;if(!T.availableActions.includes(I.action))throw new Error(`Lead does not currently allow ${I.action}`);if(I.action==="inspect"){let ue=await Ji(e,A,{workspaceId:T.workspaceId,paneId:T.paneId,tabId:T.tabId,piSessionId:T.lead},D,W=>kn(W)&&hn(W)===T.lead&&W.pane_id===T.paneId&&W.tab_id===T.tabId&&(()=>{let ae=mn(fe(),T.lead);return ae?.piSessionId===T.lead&&ae.instanceId===T.instanceId})());return H({ok:!0,action:"inspect",lead:T.lead,display_name:T.displayName,identity:{workspace_id:T.workspaceId,pane_id:T.paneId,tab_id:T.tabId,pi_session_id:T.lead},captured_at:ue.capturedAt,recent_output_truncated:ue.recentOutputTruncated,...ue.recentOutput?{recent_output:ue.recentOutput}:{},...ue.process?{process:ue.process}:{},agents:T.agents})}let L=await Fe(A);if(!L||!ot(L,c.descriptor))throw new Error("Chief lease is no longer active");let K=(await Jt(A)).leads.find(ue=>ue.lead===I.lead);if(!K||!B(K,T)||!K.availableActions.includes(I.action))throw new Error("Lead target changed before the message was queued");let se=await Fe(A);if(!se||!ot(se,c.descriptor))throw new Error("Chief lease is no longer active");if(I.action==="reply"&&I.askId!==K.pendingAskId)throw new Error("Lead ask ID is no longer pending");let oe=yn(),Oe=Date.now(),Xe=await Oo(A,I.message,I.files??[],`staff.${I.action}`,I.action==="message"?"Message":"Reply",ue=>({version:1,id:oe,leaseId:se.leaseId,kind:I.action==="message"?"chief_message":"chief_reply",fromSessionId:se.piSessionId,toSessionId:T.lead,leadSessionId:T.lead,...I.action==="reply"?{askId:I.askId}:{},text:ue,createdAt:Oe})),He=await Fe(A),wn=(await Jt(A)).leads.find(ue=>ue.lead===I.lead);if(!He||!ot(He,se)||!wn||!B(wn,K)||!wn.availableActions.includes(I.action))throw new Error("Lead or Chief changed before the message was queued");if(I.action==="reply"&&I.askId!==wn.pendingAskId)throw new Error("Lead ask ID is no longer pending");let st={version:1,id:oe,leaseId:se.leaseId,kind:I.action==="message"?"chief_message":"chief_reply",fromSessionId:se.piSessionId,toSessionId:T.lead,leadSessionId:T.lead,...I.action==="reply"?{askId:I.askId}:{},text:Xe,createdAt:Oe},We=fe();return fo(st,We),H({ok:!0,action:I.action,id:st.id,lead:T.lead,display_name:T.displayName,next_action:"Lead activity returns asynchronously; continue only independent chief work, otherwise end the turn. Do not poll."})},renderCall:(b,I,D)=>Gs("staff",b,I,D),renderResult:(b,I,D,C)=>rr("staff",b,I,D,C)};vr=()=>{if(ra)return;let b=e.getActiveTools();try{e.registerTool(g)}finally{e.setActiveTools(b)}ra=!0,vr=void 0},e.registerCommand("agents",{description:"Manage Herdr agents",getArgumentCompletions:b=>{let I=["definitions","placement","stop"],D=b.trimStart();if(!D||!D.includes(" "))return I.filter(q=>q.startsWith(D)).map(q=>({value:q,label:q}));let C=D.trim().split(/\s+/u);if(C[0]!=="placement"||C.length>2)return null;let A=C[1]??"";return["tab","split"].filter(q=>q.startsWith(A)).map(q=>({value:`placement ${q}`,label:q}))},handler:async(b,I)=>{if(!I.hasUI)return;let D="Usage: /agents definitions | placement [tab|split] | stop",C="Usage: /agents placement [tab|split]",A=b.trim()?b.trim().split(/\s+/u):[];try{if(!A.length)return void await Tl(I);if(A[0]==="definitions"&&A.length===1)return void await pa(I);if(A[0]==="placement"){if(A.length>2||A[1]&&!["tab","split"].includes(A[1]))return I.ui.notify(C,"error");if(A.length===1)return void await ma(I);let q=await cs(I);So(qo(I,q.scope),A[1]);let E=await cs(I);if(E.effective!==A[1])throw new Error(`Agent placement did not become effective: ${E.effective}`);return void I.ui.notify(`placement: ${E.effective} (${E.scope})`)}if(A[0]==="stop"&&A.length===1)return void await ya(I);I.ui.notify(D,"error")}catch(q){I.ui.notify(String(q),"error")}}})}let wa=async(g,b)=>{ve.clear();let I;try{I=await en(e,g,b)}catch(q){X(e,g,"pi_herdsman_recovery_error",q),$e?.();return}let D=g.sessionManager.getSessionId(),C=g.sessionManager.getEntries?.()??[],A=I.mailboxes.filter(({state:q})=>q.ownerSessionId===D);for(let{path:q,state:E}of A)try{let H=I.agents.find(K=>K.state.workspaceId===E.workspaceId&&K.state.agentLabel===E.agentLabel&&K.state.runId===E.runId&&K.state.paneId===E.paneId&&K.state.piSessionId===E.piSessionId&&An(K.state.piSessionFile,E.piSessionFile));if(!H&&q===dn(E.workspaceId,E.agentLabel)&&E.completedRequestId&&!E.activeRequestId){let K=E.completedRequestId,se=it(q,K);if(se&&Ip(se,E,K)&&!I.liveAgents.some(oe=>bp(oe,E))){let oe=Mp(q,E,Ln(E));En(oe,E),ve.set(oe.label,oe),await ui(e,oe,g,se,b);continue}}if(!H)throw new Error(`Direct agent ${E.agentLabel} could not be recovered as an exact managed agent`);let j={label:E.agentLabel,herdrAgent:Ve(E.workspaceId,E.agentLabel,E.runId),workspaceId:E.workspaceId,paneId:E.paneId,tabId:H.listed.tab_id??"",cwd:E.cwd,runId:E.runId,ownerSessionId:E.ownerSessionId,mailboxPath:q,piSessionId:E.piSessionId,piSessionFile:E.piSessionFile,activeRequestId:E.activeRequestId,completedRequestId:E.completedRequestId,...(()=>{let K=Wo(H.listed.tokens);return{task:K.task,startedAt:K.startedAt,contextPercent:K.contextPercent,model:K.model??H.listed.model??null,thinking:K.thinking??H.listed.thinking??null}})(),agentDefinition:H.agentDefinition};if(En(j,E,H.listed),await mi(e,j,g,{signal:b}),ve.set(j.label,j),j.activeRequestId){ea(e,j,g,b),fi(e,j,g,b);continue}if(!j.completedRequestId)continue;let T=j.completedRequestId,B=it(j.mailboxPath,T);if(B){await ui(e,j,g,B,b);continue}if(!hi(C,ft(j,T)))throw new Error(`Direct agent ${E.agentLabel} has no matching durable result entry`);if(!await al(e,j,{requestId:T},g,b))throw new Error(`Direct agent ${E.agentLabel} cleanup is unresolved`)}catch(H){hr(E.agentLabel),X(e,g,"pi_herdsman_recovery_error",H)}$e?.()};i!=="managed-agent"&&e.on("agent_settled",(g,b)=>{a.kind==="lead"&&(M=!0,U(b)),Oc(e,b,Me?.signal).catch(()=>{})});let Ia=async(g,b,I)=>{if(Ei===I||b.aborted||I!==un)return;let D=g.sessionManager.getSessionId();if(fn().some(({state:C})=>C.ownerSessionId===D&&!!C.activeRequestId&&C.lastActivityAt!==void 0)){Ei=I;try{let C=await en(e,g,b);if(b.aborted||I!==un)return;let A=Date.now();for(let q of C.agents){if(b.aborted||I!==un)return;let{state:E,listed:H}=q;if(E.ownerSessionId!==D||H.state!=="working"||!E.activeRequestId||E.lastActivityAt===void 0||E.lastActivityAt>A||A-E.lastActivityAt<Bo)continue;let j=`${E.runId}:${E.activeRequestId}`;if(Is.get(j)===E.lastActivityAt)continue;let T=fn().find(({state:L})=>ni(L,E))?.state;if(!T||T.ownerSessionId!==D||T.runId!==E.runId||T.workspaceId!==E.workspaceId||T.agentLabel!==E.agentLabel||T.paneId!==E.paneId||T.piSessionId!==E.piSessionId||!An(T.piSessionFile,E.piSessionFile)||T.activeRequestId!==E.activeRequestId||T.lastActivityAt!==E.lastActivityAt)continue;if(b.aborted||I!==un)return;let B=A-T.lastActivityAt;try{if(b.aborted||I!==un)return;e.sendMessage({customType:"pi-herdsman-agent-stale",content:`Agent ${T.agentLabel} has had no observed Pi activity for ${Math.floor(B/6e4)}m ${Math.floor(B%6e4/1e3)}s.
278
+ Active work or pending results may be discarded.`))return;g.abort();let D=await Tp(e,g,Pe?.signal);ha(D),a.kind==="lead"&&U(g)},Tl=async g=>{for(;;){let b=await vs(g,Pe?.signal),I=tr(b.agents)||"0",D=(await ls(g)).definitions,C=await g.ui.select("agents",[`Running ${I}`,`Definitions ${D.length}`,`Layout ${(await cs(g)).effective}`,"Message limits","Stop all\u2026"]);if(!C)return;if(C.startsWith("Running"))await Cl(g);else if(C.startsWith("Definitions"))await pa(g);else if(C.startsWith("Layout"))await ma(g);else if(C==="Message limits"){let A=await ci(g),q=[1,4,16,64,128].map(B=>({label:dr(B*1024),bytes:B*1024})),E=await g.ui.select("Message limits",[`Inline attachments ${dr(A.inline.bytes)} \xB7 ${A.inline.source}${A.inline.invalidSource?` (invalid ${A.inline.invalidSource} override ignored)`:""}`,`Mailbox payload ${dr(A.mailbox.bytes)} \xB7 ${A.mailbox.source}${A.mailbox.invalidSource?` (invalid ${A.mailbox.invalidSource} override ignored)`:""}`]);if(!E)continue;let H=E.startsWith("Inline")?"inlineAttachmentLimitBytes":"mailboxPayloadLimitBytes",j=await g.ui.select("Limit",[...q.map(({label:B})=>B),"Custom\u2026","Reset"]);if(!j)continue;let T;if(j==="Reset")T=void 0;else if(j==="Custom\u2026"){let B=await g.ui.input("Custom limit in KiB (1\u20131024)");if(B===void 0)continue;let L=Number(B);if(!/^\d+$/.test(B.trim())||!Io(L*1024)){g.ui.notify("Enter an integer from 1 through 1024 KiB","error");continue}T=L*1024}else T=q.find(({label:B})=>B===j)?.bytes;if(j!=="Reset"&&j!=="Custom\u2026"&&T===void 0)continue;nc(qo(g,"global"),H,T),g.ui.notify(`${H}: ${T===void 0?"reset":dr(T)}`)}else C==="Stop all\u2026"&&await ya(g)}};if(a.kind==="lead"){process.env.HERDR_PANE_ID&&e.registerCommand("chief",{description:"Activate chief mode, or open its overview when already active",getArgumentCompletions:b=>["leave"].filter(I=>I.startsWith(b.trim())).map(I=>({value:I,label:I})),handler:async(b,I)=>{let D=b.trim().split(/\s+/u).filter(Boolean);if(D.length>1||D[0]&&D[0]!=="leave")return I.ui.notify("Usage: /chief [leave]","error");try{if(!D.length&&d==="active")return void await Pl(I);let C=D[0]==="leave"?await _l(I):await oa(I);I.ui.notify(C)}catch(C){I.ui.notify(String(C).replace(/^Error: /,""),"error")}}}),Z={name:"chief",label:"chief",description:"For ordinary leads only. A lead owns its complete agent tree; the chief supervises leads and never changes ownership. Message and ask require a currently valid chief and reject before mutation when none exists. Use message for meaningful progress, results, warnings, and completion, including exact artifact paths; use ask when a chief decision is genuinely required, make it the only and final coordination call of the turn, do not guess, and wait for the reply. Questions are limited to 1,024 characters and 1,024 UTF-8 bytes; channel message records are bounded to 8 KiB, so multibyte content can hit the byte limit first. Chief messages arrive as follow-ups, so integrate them through normal delegation. Descendants use ask_owner, never chief.",executionMode:"sequential",parameters:O.Union([O.Object({action:Ze(["message"]),message:O.String({minLength:1}),files:O.Optional(O.Array(O.String({minLength:1})))},{additionalProperties:!1}),O.Object({action:Ze(["ask"]),question:O.String({minLength:1,maxLength:1024}),files:O.Optional(O.Array(O.String({minLength:1})))},{additionalProperties:!1})]),execute:async(b,I,D,C,A)=>{if(a.kind!=="lead"||d!=="inactive")throw new Error("Chief is available only to ordinary leads");if(!I||typeof I.action!="string")throw new Error("Invalid chief action");let q=I.action==="message"?["action","message","files"]:I.action==="ask"?["action","question","files"]:[];if(!q.length||Object.keys(I).some(E=>!q.includes(E)))throw new Error("Invalid chief action");if(I.action==="message"){if(typeof I.message!="string"||!I.message.trim())throw new Error("Message must contain non-whitespace text");if(!Q)throw new Error("Lead coordination state is unavailable");let E,H=await bi();try{let j=await Fe(A);if(!j)throw new Error(Ii());let T=yn(),B=Date.now(),L=await Oo(A,I.message,I.files??[],"chief.message","Message",K=>({version:1,id:T,leaseId:j.leaseId,kind:"lead_message",fromSessionId:A.sessionManager.getSessionId(),toSessionId:j.piSessionId,leadSessionId:A.sessionManager.getSessionId(),text:K,createdAt:B}));E=await Sr("lead_message",L,A,void 0,T,B)}catch(j){try{if(E)try{Ds(fe(),E.toSessionId,E.id,E)}catch(T){Q=!1;try{Xi(fe(),E.toSessionId,E.id)}catch(B){X(e,A,"pi_herdsman_state_error",B)}try{$t(fe(),A.sessionManager.getSessionId(),we)}catch(B){X(e,A,"pi_herdsman_state_error",B)}X(e,A,"pi_herdsman_state_error",T)}}catch(T){X(e,A,"pi_herdsman_state_error",T)}throw j}finally{H()}if(!E)throw new Error("Chief message was not queued");return{content:[{type:"text",text:`Message sent to chief (${E.id}).`}],details:{id:E.id,chiefSessionId:E.toSessionId}}}if(I.action==="ask"){if(!Qi(I.question))throw new Error("Question must be non-empty and at most 1,024 characters and 1,024 UTF-8 bytes");let E=await bi();try{if(sn(A),Y)throw new Error("A chief ask is already pending");if(!Q)throw new Error("Lead coordination state is unavailable");if(!await Fe(A))throw new Error(Ii());sn(A);let H=yn(),j=await Fe(A);if(!j)throw new Error(Ii());let T=Yi(A.sessionManager.getSessionId(),H,j.leaseId),B=Date.now(),L=await Oo(A,I.question,I.files??[],"chief.ask","Question",oe=>({version:1,id:T,leaseId:j.leaseId,kind:"lead_ask",fromSessionId:A.sessionManager.getSessionId(),toSessionId:j.piSessionId,leadSessionId:A.sessionManager.getSessionId(),askId:H,text:oe,createdAt:B})),K=Y;Y={askId:H,question:I.question,text:L};try{if(!Ne())throw new Error("Lead coordination state is unavailable")}catch(oe){throw Y=K,Ne()||(Q=!1),oe}let se=await Sr("lead_ask",L,A,H,T,B);return sn(A),process.env.HERDR_PANE_ID&&t(A,{paneId:process.env.HERDR_PANE_ID,pendingAskId:H}),{content:[{type:"text",text:`Question sent to chief (${H}).`}],details:{id:se.id,askId:H,chiefSessionId:se.toSessionId},terminate:!0}}finally{E()}}throw new Error("Invalid chief action")},renderCall:(b,I,D)=>Gs("chief",b,I,D),renderResult:(b,I,D,C)=>rr("chief",b,I,D,C)};let g={name:"staff",label:"staff",description:"The lead is the exact full Pi session ID shown as lead in a fresh automatic supervision snapshot or returned by staff list; never use display_name. Chief-only supervision coordination. The chief supervises leads and does not own their agent trees. A fresh supervision snapshot is automatically supplied at the start of each chief agent run; treat it as the default current coordination state. For general state questions and ordinary messages or replies, use a fresh snapshot directly; do not call staff list, inspect, or another read command first. The message and reply actions revalidate exact identity and state themselves. Use list when the automatic snapshot is stale or unavailable, an immediately refreshed exact roster is materially necessary, or you are diagnosing identity or supervision projection problems. Use inspect only when deeper lead evidence is needed. Use the lead field's exact full Pi session ID and only fresh available_actions, never infer from display state or metadata. Every exact-identity-verified lead accepts message; reply only with the exact pending ask ID and current chief lease. Messages are bounded and direction-aware, and temporary verification or delivery failures retain queued records. Metadata is presentation-only and never authority. Messages use follow-up delivery. Human conversation remains the dispatch surface.",executionMode:"sequential",parameters:O.Union([O.Object({action:Ze(["list"])},{additionalProperties:!1}),O.Object({action:Ze(["inspect"]),lead:O.String({pattern:To,description:"The lead is the exact full Pi session ID shown as lead in a fresh automatic supervision snapshot or returned by staff list; never use display_name."})},{additionalProperties:!1}),O.Object({action:Ze(["message"]),lead:O.String({pattern:To,description:"The lead is the exact full Pi session ID shown as lead in a fresh automatic supervision snapshot or returned by staff list; never use display_name."}),message:O.String({pattern:"\\S"}),files:O.Optional(O.Array(O.String({minLength:1})))},{additionalProperties:!1}),O.Object({action:Ze(["reply"]),lead:O.String({pattern:To,description:"The lead is the exact full Pi session ID shown as lead in a fresh automatic supervision snapshot or returned by staff list; never use display_name."}),askId:O.String({pattern:"\\S"}),message:O.String({pattern:"\\S"}),files:O.Optional(O.Array(O.String({minLength:1})))},{additionalProperties:!1})]),execute:async(b,I,D,C,A)=>{if(d!=="active"||!c)throw new Error("Staff is available only to the active chief");if(!await Fe(A))throw new Error("Chief lease is no longer active");let q={list:["action"],inspect:["action","lead"],message:["action","lead","message","files"],reply:["action","lead","askId","message","files"]};if(!I||!q[I.action]||Object.keys(I).some(ue=>!q[I.action].includes(ue)))throw new Error("Invalid staff action");let E=async()=>Jt(A),H=ue=>{let W=Xs(JSON.stringify(ue,null,2),{keep:"head",sessionId:A.sessionManager.getSessionId(),key:b});return{content:[{type:"text",text:W.content}],details:{...ue,truncated:W.truncated,...W.fullOutputPath?{full_output_path:W.fullOutputPath}:{}}}},j=await E();if(I.action==="list"){if(!await Fe(A))throw new Error("Chief lease is no longer active");return H({ok:!0,action:"list",...Gd(j)})}let T=j.leads.find(ue=>ue.lead===I.lead);if(!T)throw new Error("Lead target was not found or is no longer eligible. Retry with lead set to the exact full Pi session ID shown as lead in a fresh automatic supervision snapshot or returned by staff list; never use display_name.");let B=(ue,W)=>ue.lead===W.lead&&ue.paneId===W.paneId&&ue.workspaceId===W.workspaceId&&ue.tabId===W.tabId&&ue.instanceId===W.instanceId&&ue.pendingAskId===W.pendingAskId;if(!T.availableActions.includes(I.action))throw new Error(`Lead does not currently allow ${I.action}`);if(I.action==="inspect"){let ue=await Ji(e,A,{workspaceId:T.workspaceId,paneId:T.paneId,tabId:T.tabId,piSessionId:T.lead},D,W=>kn(W)&&hn(W)===T.lead&&W.pane_id===T.paneId&&W.tab_id===T.tabId&&(()=>{let ae=mn(fe(),T.lead);return ae?.piSessionId===T.lead&&ae.instanceId===T.instanceId})());return H({ok:!0,action:"inspect",lead:T.lead,display_name:T.displayName,identity:{workspace_id:T.workspaceId,pane_id:T.paneId,tab_id:T.tabId,pi_session_id:T.lead},captured_at:ue.capturedAt,recent_output_truncated:ue.recentOutputTruncated,...ue.recentOutput?{recent_output:ue.recentOutput}:{},...ue.process?{process:ue.process}:{},agents:T.agents})}let L=await Fe(A);if(!L||!ot(L,c.descriptor))throw new Error("Chief lease is no longer active");let K=(await Jt(A)).leads.find(ue=>ue.lead===I.lead);if(!K||!B(K,T)||!K.availableActions.includes(I.action))throw new Error("Lead target changed before the message was queued");let se=await Fe(A);if(!se||!ot(se,c.descriptor))throw new Error("Chief lease is no longer active");if(I.action==="reply"&&I.askId!==K.pendingAskId)throw new Error("Lead ask ID is no longer pending");let oe=yn(),Oe=Date.now(),Xe=await Oo(A,I.message,I.files??[],`staff.${I.action}`,I.action==="message"?"Message":"Reply",ue=>({version:1,id:oe,leaseId:se.leaseId,kind:I.action==="message"?"chief_message":"chief_reply",fromSessionId:se.piSessionId,toSessionId:T.lead,leadSessionId:T.lead,...I.action==="reply"?{askId:I.askId}:{},text:ue,createdAt:Oe})),He=await Fe(A),wn=(await Jt(A)).leads.find(ue=>ue.lead===I.lead);if(!He||!ot(He,se)||!wn||!B(wn,K)||!wn.availableActions.includes(I.action))throw new Error("Lead or Chief changed before the message was queued");if(I.action==="reply"&&I.askId!==wn.pendingAskId)throw new Error("Lead ask ID is no longer pending");let st={version:1,id:oe,leaseId:se.leaseId,kind:I.action==="message"?"chief_message":"chief_reply",fromSessionId:se.piSessionId,toSessionId:T.lead,leadSessionId:T.lead,...I.action==="reply"?{askId:I.askId}:{},text:Xe,createdAt:Oe},We=fe();return fo(st,We),H({ok:!0,action:I.action,id:st.id,lead:T.lead,display_name:T.displayName,next_action:"Lead activity returns asynchronously; continue only independent chief work, otherwise end the turn. Do not poll."})},renderCall:(b,I,D)=>Gs("staff",b,I,D),renderResult:(b,I,D,C)=>rr("staff",b,I,D,C)};vr=()=>{if(ra)return;let b=e.getActiveTools();try{e.registerTool(g)}finally{e.setActiveTools(b)}ra=!0,vr=void 0},e.registerCommand("agents",{description:"Manage Herdr agents",getArgumentCompletions:b=>{let I=["definitions","placement","stop"],D=b.trimStart();if(!D||!D.includes(" "))return I.filter(q=>q.startsWith(D)).map(q=>({value:q,label:q}));let C=D.trim().split(/\s+/u);if(C[0]!=="placement"||C.length>2)return null;let A=C[1]??"";return["tab","split"].filter(q=>q.startsWith(A)).map(q=>({value:`placement ${q}`,label:q}))},handler:async(b,I)=>{if(!I.hasUI)return;let D="Usage: /agents definitions | placement [tab|split] | stop",C="Usage: /agents placement [tab|split]",A=b.trim()?b.trim().split(/\s+/u):[];try{if(!A.length)return void await Tl(I);if(A[0]==="definitions"&&A.length===1)return void await pa(I);if(A[0]==="placement"){if(A.length>2||A[1]&&!["tab","split"].includes(A[1]))return I.ui.notify(C,"error");if(A.length===1)return void await ma(I);let q=await cs(I);So(qo(I,q.scope),A[1]);let E=await cs(I);if(E.effective!==A[1])throw new Error(`Agent placement did not become effective: ${E.effective}`);return void I.ui.notify(`placement: ${E.effective} (${E.scope})`)}if(A[0]==="stop"&&A.length===1)return void await ya(I);I.ui.notify(D,"error")}catch(q){I.ui.notify(String(q),"error")}}})}let wa=async(g,b)=>{ve.clear();let I;try{I=await en(e,g,b)}catch(q){X(e,g,"pi_herdsman_recovery_error",q),$e?.();return}let D=g.sessionManager.getSessionId(),C=g.sessionManager.getEntries?.()??[],A=I.mailboxes.filter(({state:q})=>q.ownerSessionId===D);for(let{path:q,state:E}of A)try{let H=I.agents.find(K=>K.state.workspaceId===E.workspaceId&&K.state.agentLabel===E.agentLabel&&K.state.runId===E.runId&&K.state.paneId===E.paneId&&K.state.piSessionId===E.piSessionId&&An(K.state.piSessionFile,E.piSessionFile));if(!H&&q===dn(E.workspaceId,E.agentLabel)&&E.completedRequestId&&!E.activeRequestId){let K=E.completedRequestId,se=it(q,K);if(se&&Ip(se,E,K)&&!I.liveAgents.some(oe=>bp(oe,E))){let oe=Mp(q,E,Ln(E));En(oe,E),ve.set(oe.label,oe),await ui(e,oe,g,se,b);continue}}if(!H)throw new Error(`Direct agent ${E.agentLabel} could not be recovered as an exact managed agent`);let j={label:E.agentLabel,herdrAgent:Ve(E.workspaceId,E.agentLabel,E.runId),workspaceId:E.workspaceId,paneId:E.paneId,tabId:H.listed.tab_id??"",cwd:E.cwd,runId:E.runId,ownerSessionId:E.ownerSessionId,mailboxPath:q,piSessionId:E.piSessionId,piSessionFile:E.piSessionFile,activeRequestId:E.activeRequestId,completedRequestId:E.completedRequestId,...(()=>{let K=Wo(H.listed.tokens);return{task:K.task,startedAt:K.startedAt,contextPercent:K.contextPercent,model:K.model??H.listed.model??null,thinking:K.thinking??H.listed.thinking??null}})(),agentDefinition:H.agentDefinition};if(En(j,E,H.listed),await mi(e,j,g,{signal:b}),ve.set(j.label,j),j.activeRequestId){ea(e,j,g,b),fi(e,j,g,b);continue}if(!j.completedRequestId)continue;let T=j.completedRequestId,B=it(j.mailboxPath,T);if(B){await ui(e,j,g,B,b);continue}if(!hi(C,ft(j,T)))throw new Error(`Direct agent ${E.agentLabel} has no matching durable result entry`);if(!await al(e,j,{requestId:T},g,b))throw new Error(`Direct agent ${E.agentLabel} cleanup is unresolved`)}catch(H){hr(E.agentLabel),X(e,g,"pi_herdsman_recovery_error",H)}$e?.()};i!=="managed-agent"&&e.on("agent_settled",(g,b)=>{a.kind==="lead"&&(M=!0,U(b)),Oc(e,b,Pe?.signal).catch(()=>{})});let Ia=async(g,b,I)=>{if(Ei===I||b.aborted||I!==un)return;let D=g.sessionManager.getSessionId();if(fn().some(({state:C})=>C.ownerSessionId===D&&!!C.activeRequestId&&C.lastActivityAt!==void 0)){Ei=I;try{let C=await en(e,g,b);if(b.aborted||I!==un)return;let A=Date.now();for(let q of C.agents){if(b.aborted||I!==un)return;let{state:E,listed:H}=q;if(E.ownerSessionId!==D||H.state!=="working"||!E.activeRequestId||E.lastActivityAt===void 0||E.lastActivityAt>A||A-E.lastActivityAt<Bo)continue;let j=`${E.runId}:${E.activeRequestId}`;if(Is.get(j)===E.lastActivityAt)continue;let T=fn().find(({state:L})=>ni(L,E))?.state;if(!T||T.ownerSessionId!==D||T.runId!==E.runId||T.workspaceId!==E.workspaceId||T.agentLabel!==E.agentLabel||T.paneId!==E.paneId||T.piSessionId!==E.piSessionId||!An(T.piSessionFile,E.piSessionFile)||T.activeRequestId!==E.activeRequestId||T.lastActivityAt!==E.lastActivityAt)continue;if(b.aborted||I!==un)return;let B=A-T.lastActivityAt;try{if(b.aborted||I!==un)return;e.sendMessage({customType:"pi-herdsman-agent-stale",content:`Agent ${T.agentLabel} has had no observed Pi activity for ${Math.floor(B/6e4)}m ${Math.floor(B%6e4/1e3)}s.
279
279
 
280
280
  State: working
281
281
  Request: ${T.activeRequestId}
@@ -283,8 +283,8 @@ Last observed activity: ${Math.floor(B/6e4)}m ${Math.floor(B%6e4/1e3)}s ago
283
283
 
284
284
  This is an inactivity advisory, not proof of a hang.
285
285
  It is safe to leave the agent running. Steer, inspect, or close only when task evidence justifies it;
286
- do not close solely because of inactivity.`,display:!0,details:{runId:T.runId,requestId:T.activeRequestId,agentLabel:T.agentLabel,ownerSessionId:T.ownerSessionId,workspaceId:T.workspaceId,paneId:T.paneId,piSessionId:T.piSessionId,lastActivityAt:T.lastActivityAt,inactiveMs:B,thresholdMs:Bo}},{triggerTurn:!0,deliverAs:"steer"}),I===un&&!b.aborted&&Is.set(j,T.lastActivityAt)}catch{}}}finally{Ei===I&&(Ei=void 0)}}},ba=(g,b)=>{let I=++un;tt&&clearTimeout(tt);let D=()=>{b.aborted||I!==un||(tt=setTimeout(()=>{b.aborted||I!==un||(tt=void 0,Ia(g,b,I).catch(()=>{}).finally(()=>{I===un&&D()}))},Rg),tt.unref?.())};Ia(g,b,I).catch(()=>{}).finally(()=>{I===un&&D()})};a.kind==="managed-agent"&&(aa=wa),da=ba,he=g=>{if(g.mode!=="tui"||!g.hasUI||!g.ui?.setWidget)return;let b=++Ce;le=g,g.ui.setWidget("pi-herdsman",(I,D)=>{let C=Co(()=>I.requestRender(),D);return a.kind==="managed-agent"&&C.setSnapshot({agents:[],stale:!1,unavailable:!0,breadcrumb:xr,...Ss()}),b===Ce&&g===le?(y=C,Wt=b):C.dispose(),C}),$e=()=>{le===g&&Mi(g,b)},z=setInterval(()=>{Mi(g,b)},2e3),Mi(g,b)},e.on("session_start",async(g,b)=>{pe(),o=void 0,++u;let I=d,D=f;++l,I==="active"&&D&&await be(D,"suspended",l);let C,A=H=>{try{H()}catch(j){C??=j}};if(De&&A(()=>ye()),f=b,d="inactive",A(()=>c?.release()),c=void 0,V(),C&&X(e,b,"pi_herdsman_role_error",C),a.kind==="lead"){let H=b.sessionManager.getSessionId();_=void 0,k=Vg(b.sessionManager.getEntries?.()??[],H),M=k===void 0,si=U}if(a.kind==="lead"){Ht(b);let H="lead",j=!1;try{H=jd(b.sessionManager.getEntries())}catch(T){j=!0,X(e,b,"pi_herdsman_role_error",T),re("lead"),Q=!1;try{$t(fe(),b.sessionManager.getSessionId(),we)}catch(B){X(e,b,"pi_herdsman_state_error",B)}ln(b,!1),e.setActiveTools(e.getActiveTools().filter(B=>B!=="chief"))}if(H==="chief")try{await oa(b,!0),d==="active"&&be(b,d,l)}catch(T){T instanceof Ee?Vn(b):(X(e,b,"pi_herdsman_role_error",T),Si?Si=!1:ln(b))}else!j&&!De&&Yn("inactive")}Me?.abort(),w.clear(),Me=new AbortController;let q=Me.signal;a.kind==="lead"&&process.env.HERDR_SOCKET_PATH&&(d==="inactive"||d==="active")&&(d==="active"||Q)&&vl(b),z&&clearInterval(z),z=void 0,N=!1,ie=!1,y&&(le?.ui?.setWidget?.("pi-herdsman",void 0),y.dispose(),y=void 0),cn?.(I==="active"),Wt=0,le=void 0,$e=void 0;let E=++Ce;if(nn=!0,le=b,a.kind==="lead"&&process.env.HERDR_PANE_ID&&d==="inactive"&&t(b,{paneId:process.env.HERDR_PANE_ID,name:e.getSessionName?.(),...Y?{pendingAskId:Y.askId}:{}}),Mr=a.kind==="managed-agent"?e.getActiveTools():void 0,mt={agents:[],stale:!1,unavailable:!0,breadcrumb:xr,...Ss()},a.kind==="lead"&&d==="active"?Rn?.(b):he?.(b),!(a.kind==="lead"&&d==="active"))try{o={sessionId:b.sessionManager.getSessionId(),definitions:await Jc(b,a)}}catch(H){o=void 0,X(e,b,"pi_herdsman_definition_error",H)}if(a.kind==="managed-agent"){$e?.();return}await wa(b,q),a.kind==="lead"&&k!==void 0&&b.isIdle()&&(M=!0,U(b)),ba(b,q)}),a.kind==="lead"&&e.on("session_info_changed",(g,b)=>{d==="inactive"&&process.env.HERDR_PANE_ID&&t(b,{paneId:process.env.HERDR_PANE_ID,name:g?.name??e.getSessionName?.(),...Y?{pendingAskId:Y.askId}:{}})}),e.on("session_tree",(g,b)=>{if(nn)for(let I of ve.values())I.activeRequestId&&fi(e,I,b,Me?.signal)}),e.on("session_shutdown",async()=>{if(++u,o=void 0,++Re,Ie&&clearTimeout(Ie),Ie=void 0,++l,a.kind==="lead"&&d==="active")Vn(f);else if(a.kind==="lead"){try{let g=f?.sessionManager.getSessionId();g&&$t(fe(),g,we)}catch(g){f&&X(e,f,"pi_herdsman_state_error",g)}ln(void 0,!1)}Me?.abort(),w.clear(),Me=void 0,++Ce,nn=!1,z&&clearInterval(z),z=void 0,tt&&clearTimeout(tt),tt=void 0,++un,Is.clear(),N=!1,ie=!1,y&&(le?.ui?.setWidget?.("pi-herdsman",void 0),y.dispose(),y=void 0),cn?.(),Wt=0,le=void 0,f=void 0,$e=void 0,a.kind==="lead"&&(_=void 0,k=void 0,M=!0,si=void 0);for(let[g,b]of ri)fr(g,b);ri.clear();for(let[g,b]of ai)fr(g,b);ai.clear();for(let g of oi.values())clearTimeout(g);oi.clear();for(let g of ut.values())clearTimeout(g);ut.clear();for(let g of Ot.values())clearTimeout(g);Ot.clear();for(let g of Dn.values())clearTimeout(g);Dn.clear();for(let g of qt.values())clearTimeout(g);qt.clear(),ur.clear(),di.clear(),lr.clear(),ve.clear(),_e.clear()}),e.registerTool({name:"agent",label:"agent",description:qg(a),executionMode:"sequential",parameters:O.Union([O.Object({action:Ze(["list"])},{additionalProperties:!1}),O.Object({action:Ze(["delegate"]),definition:a.kind==="managed-agent"?{...Ze([...a.allowedAgentDefinitions]),description:"Allowed agent definition for delegation."}:O.String({description:"Agent definition for a fresh agent.",pattern:"\\S"}),task:O.String({description:"Non-empty task.",pattern:"\\S"}),label:O.Optional(O.String({description:"Optional logical agent label matching ^[a-z][a-z0-9_-]{0,31}$.",pattern:Nt.source})),cwd:O.Optional(O.String({description:"Working directory for a fresh agent."})),fork:O.Optional(O.String({description:"Exact saved Pi session path or full UUID used as context for a fork."})),timeoutMs:O.Optional(O.Integer({minimum:kt,maximum:_t,description:"Total startup budget in milliseconds."})),files:O.Optional(O.Array(O.String({description:"Readable regular local file path."}),{description:"Supporting files for delegation, steering, replying, or ask_owner. Complete strict UTF-8 text may be embedded when it fits; other files are represented by canonical local path and byte size. Files do not grant capabilities."}))},{additionalProperties:!1}),O.Object({action:Ze(["delegate"]),session:O.String({pattern:"\\S"}),label:O.Optional(O.String({description:"Optional logical agent label matching ^[a-z][a-z0-9_-]{0,31}$.",pattern:Nt.source})),task:O.String({pattern:"\\S"}),files:O.Optional(O.Array(O.String())),timeoutMs:O.Optional(O.Integer({minimum:kt,maximum:_t}))},{additionalProperties:!1}),O.Object({action:Ze(["steer"]),agent:O.String({pattern:Nt.source}),message:O.String({pattern:"\\S"}),files:O.Optional(O.Array(O.String()))},{additionalProperties:!1}),O.Object({action:Ze(["reply"]),agent:O.String({pattern:Nt.source}),message:O.String({pattern:"\\S"}),files:O.Optional(O.Array(O.String()))},{additionalProperties:!1}),O.Object({action:Ze(["close"]),agent:O.String({pattern:Nt.source})},{additionalProperties:!1}),O.Object({action:Ze(["inspect"]),agent:O.String({pattern:Nt.source})},{additionalProperties:!1})]),execute:async(g,b,I,D,C)=>{try{let A=await qp(e,C,b,I,a,w);if($e?.(),a.kind==="lead"&&b.action==="delegate"&&A.ok===!0&&te(C),b.action==="delegate"&&A.ok===!0&&!kr)try{e.sendMessage({customType:"pi-herdsman-delegation-guidance",content:"Agent work is asynchronous. Delegate any other useful independent work now. If no useful independent work remains, end your turn; do not poll, sleep, or actively wait. Agent results and attention will resume it automatically. Do not conclude or produce the final synthesis while unresolved agent work remains.",display:!1},{triggerTurn:!0,deliverAs:"steer"}),kr=!0}catch{}_e.size&&(A.cleanup_errors=Object.fromEntries(_e));let q=Xs($o(b.action,A),{keep:"head",sessionId:C.sessionManager.getSessionId(),key:g});return{content:[{type:"text",text:q.content}],details:{...A,truncated:q.truncated,...q.fullOutputPath?{full_output_path:q.fullOutputPath}:{}}}}catch(A){if(!(A instanceof ke))throw A;let q=A.detail,E=Xs($o(b.action,{ok:!1,error:q}),{keep:"head",sessionId:C.sessionManager.getSessionId(),key:g});return{content:[{type:"text",text:E.content}],details:{ok:!1,error:q,truncated:E.truncated,...E.fullOutputPath?{full_output_path:E.fullOutputPath}:{}}}}},renderCall:(g,b,I)=>Gs("agent",g,b,I),renderResult:(g,b,I,D)=>rr("agent",g,b,I,D)}),a.kind==="lead"&&process.env.HERDR_PANE_ID&&e.registerTool(Z)}if(i!=="managed-agent")return;ds=!1;let P,ms=!1,Mn="",rn,Bt=0,Ge,Zn,et=!1,_r=!1,Ar=!1,hs,ys,Pn=r.length>0,Ut,vi,nt,pt=0,ki=!1,_i,Er=()=>_i?{ownTools:_i}:{},ws=(y=Date.now(),w=!1)=>{if(!P?.activeRequestId||rn||!w&&P.lastActivityAt!==void 0&&y>=P.lastActivityAt&&y-P.lastActivityAt<xg)return;let _={...P,lastActivityAt:y,updatedAt:y};try{Nn(process.env.PI_HERDSMAN_MAILBOX,_),P=_}catch(k){hs&&X(e,hs,"pi_herdsman_state_error",k)}},Ai,ca=()=>{++pt,vi&&clearInterval(vi),vi=void 0,Ut&&(nt?.ui?.setWidget?.("pi-herdsman",void 0),Ut.dispose(),Ut=void 0),nt=void 0,ki=!1},la=async(y,w)=>{if(!(w!==pt||y!==nt||ki)){ki=!0;try{let _=await en(e,y,void 0,ct?.signal,!0);if(w!==pt||y!==nt)return;Ai=Lc(_,y),Ut?.setSnapshot({agents:[],stale:!1,unavailable:!1,breadcrumb:Ai,...Er(),identityOnly:!0,refreshedAt:Date.now()})}catch{w===pt&&y===nt&&Ut?.setSnapshot({agents:[],stale:!1,unavailable:!0,breadcrumb:Ai??["?",process.env.PI_HERDSMAN_AGENT_DEFINITION&&process.env.PI_HERDSMAN_LABEL?St(process.env.PI_HERDSMAN_AGENT_DEFINITION,process.env.PI_HERDSMAN_LABEL):process.env.PI_HERDSMAN_AGENT_DEFINITION??"?"],...Er(),identityOnly:!0})}finally{w===pt&&y===nt&&(ki=!1)}}},Rr=()=>{for(let y of[...ve.values()])hr(y.label);ve.clear()},Al=(y,w,_,k)=>{if(!P)return!1;let M={...P,lastAck:{requestId:y,accepted:w,..._?{code:_}:{},...k?{message:k}:{},acknowledgedAt:Date.now()},updatedAt:Date.now()};try{return Nn(process.env.PI_HERDSMAN_MAILBOX,M),P=M,!0}catch(te){return hs&&X(e,hs,"pi_herdsman_state_error",te),!1}},ua=(y,w)=>{try{mp(process.env.PI_HERDSMAN_MAILBOX,y)}catch(_){X(e,w,"pi_herdsman_state_error",_),w.ui?.notify?.("pi_herdsman_state_error: request cleanup failed","error")}},on=(y,w,_,k,M)=>{Al(y,w,k,M)&&ua(y,_)},El=()=>!!P?.activeRequestId&&!P.pendingAskId&&!P.completedRequestId&&!rn&&!et&&!wt(process.env.PI_HERDSMAN_MAILBOX,P)&&jc(P),Rl=()=>P?.activeRequestId?P.pendingAskId?"already waiting for an owner reply":P.completedRequestId||rn?"assignment is settling":et?"assignment state is settling":wt(process.env.PI_HERDSMAN_MAILBOX,P)?"a control request is still pending":jc(P)?"agent state is not eligible":"direct agent work is still active":"no active assignment";e.registerTool({name:"ask_owner",label:"Ask owner",description:"Ask your direct owner for a decision that is required to continue. Call this alone as the final tool call of the turn, then stop and wait for the reply. Only one question may be outstanding.",executionMode:"sequential",parameters:O.Object({question:O.String({minLength:1,description:"Non-empty decision question required to continue."}),files:O.Optional(O.Array(O.String({description:"Readable regular local file path."}),{description:"Supporting files. Complete strict UTF-8 text may be embedded when it fits; other files are canonical local references. Files do not grant capabilities."}))},{additionalProperties:!1}),execute:async(y,w,_,k,M)=>{if(typeof w.question!="string"||!w.question.trim())throw new Error("Question must contain non-whitespace text");if(!ap(M))throw new Error("Call ask_owner alone as the final tool call of the turn, with no other tool calls, then wait for the reply.");let te=Qc(M);if(!P||!ni(P,te))throw new Error("Agent identity is not eligible to ask its owner");if(!El())throw new Error(`Agent cannot ask its owner: ${Rl()}`);let U=yn(),z=Date.now(),N=await ci(M),ie={version:4,askId:U,requestId:P.activeRequestId,runId:P.runId,ownerSessionId:P.ownerSessionId,workspaceId:P.workspaceId,agentLabel:P.agentLabel,paneId:P.paneId,piSessionId:P.piSessionId,question:bt(w.question,w.files??[],P.cwd,"ask_owner","Question",{inlineLimitBytes:N.inline.bytes,mailboxLimitBytes:N.mailbox.bytes,serializedBytes:Ce=>Op(P,U,Ce,z)}).text,createdAt:z},le=Xt(ie);le>N.mailbox.bytes&&$("invalid_request",`Mailbox payload is ${le} bytes; configured limit is ${N.mailbox.bytes} bytes`,"ask_owner");try{Oa(process.env.PI_HERDSMAN_MAILBOX,ie);let Ce={...P,pendingAskId:U,updatedAt:Date.now()};Nn(process.env.PI_HERDSMAN_MAILBOX,Ce),P=Ce}catch(Ce){try{qr(process.env.PI_HERDSMAN_MAILBOX)}catch{}throw Ce}return Mn="",{content:[{type:"text",text:"Question sent to your owner. This assignment is blocked until the reply; the reply will resume it automatically."}],details:{askId:U,assignmentRequestId:ie.requestId},terminate:!0}}}),e.on("session_before_switch",()=>({cancel:!0})),e.on("session_before_fork",()=>({cancel:!0})),e.on("session_start",async(y,w)=>{ca(),_i=void 0,Pn&&Rr(),ms=!1,ds=!1,P=void 0,ys=void 0,Ai=void 0,ct?.abort(),ct=new AbortController;try{let _=!1;hs=w;let k=nl(w);if(!k)throw new Error("invalid agent environment");Pn||(_i=e.getActiveTools()),Qg(e,w,process.env.PI_HERDSMAN_AGENT_DEFINITION);let M=Be(process.env.PI_HERDSMAN_MAILBOX);if(M&&!ni(M,k))throw new Error("agent session identity changed while state existed");if(P=k,M&&ni(M,k)&&(P={...k,...M,updatedAt:Date.now()},_=!!P.activeRequestId,P.activeRequestId&&!P.pendingAskId))try{let z=it(process.env.PI_HERDSMAN_MAILBOX,P.activeRequestId);z&&z.runId===P.runId&&z.ownerSessionId===P.ownerSessionId&&z.workspaceId===P.workspaceId&&z.agentLabel===P.agentLabel&&z.paneId===P.paneId&&z.requestId===P.activeRequestId?(P={...P,activeRequestId:void 0,completedRequestId:z.requestId,lastActivityAt:void 0,updatedAt:Date.now()},_=!1):z&&X(e,w,"pi_herdsman_state_error",new Error("active agent result identity did not match state"))}catch(z){X(e,w,"pi_herdsman_state_error",z)}if(!M){let{definitions:z}=await ls(w),N=z.find(ie=>ie.name===process.env.PI_HERDSMAN_AGENT_DEFINITION);if(!N)throw new Error(`agent ${process.env.PI_HERDSMAN_AGENT_DEFINITION} not found`);if(!vt(N))throw new Error(`agent ${N.name} is disabled; enable it through /agents \u2192 Definitions before starting a new agent`);Xr(N,z)}if(Nn(process.env.PI_HERDSMAN_MAILBOX,P),Pn){let z=a;if(!z||z.kind!=="managed-agent")throw new Error("delegation controller scope is unavailable");dp(w),await aa?.(w,ct.signal),ds=!0}if(P.activeRequestId&&ws(Date.now(),_),Pn&&da?.(w,ct.signal),ms=!0,!Pn&&w.mode==="tui"&&w.hasUI&&w.ui?.setWidget){let z=pt;nt=w,w.ui.setWidget("pi-herdsman",(N,ie)=>{let le=Co(()=>N.requestRender(),ie);return le.setSnapshot({agents:[],stale:!1,unavailable:!0,breadcrumb:["?",process.env.PI_HERDSMAN_AGENT_DEFINITION&&process.env.PI_HERDSMAN_LABEL?St(process.env.PI_HERDSMAN_AGENT_DEFINITION,process.env.PI_HERDSMAN_LABEL):process.env.PI_HERDSMAN_AGENT_DEFINITION??"?"],...Er(),identityOnly:!0}),z===pt&&w===nt?Ut=le:le.dispose(),le}),vi=setInterval(()=>{la(w,z)},2e3),la(w,z)}let te=Zs(w),U=ei(w);Dt(e,w,Lt(P,w),{activity:null,context:null,model:te||null,thinking:U||null},!0)}catch(_){ms=!1,ds=!1,P=void 0,Pn&&Rr(),X(e,w,"pi_herdsman_state_error",_),w.ui?.notify?.(`pi_herdsman_state_error: ${String(_)}`,"error")}}),e.on("input",(y,w)=>{let _=y.text;if(typeof _!="string"||!_.startsWith(_g))return{action:"continue"};let k=Ha(_);if(!k)return{action:"handled"};let M;try{M=Nr(process.env.PI_HERDSMAN_MAILBOX,k)}catch{return on(k,!1,w,"invalid","Malformed or oversized request"),{action:"handled"}}if(!M)return on(k,!1,w,"invalid","Request was not found"),{action:"handled"};if(!ms||!P)return{action:"handled"};if(M.runId!==P.runId||M.ownerSessionId!==P.ownerSessionId||M.workspaceId!==P.workspaceId||M.agentLabel!==P.agentLabel||M.paneId!==P.paneId)return on(k,!1,w,"identity","Request identity did not match agent state"),{action:"handled"};if(M.kind==="reply"){let U;try{U=It(process.env.PI_HERDSMAN_MAILBOX,P)}catch(N){return X(e,w,"pi_herdsman_state_error",N),on(k,!1,w,"identity","Malformed or oversized owner ask"),{action:"handled"}}if(!P.activeRequestId||!P.pendingAskId||M.askId!==P.pendingAskId||!U||U.askId!==P.pendingAskId||U.requestId!==P.activeRequestId||U.runId!==P.runId||U.ownerSessionId!==P.ownerSessionId||U.workspaceId!==P.workspaceId||U.agentLabel!==P.agentLabel||U.paneId!==P.paneId||U.piSessionId!==P.piSessionId)return on(k,!1,w,"identity","Owner reply did not match the pending ask"),{action:"handled"};let z={...P,pendingAskId:void 0,lastAck:{requestId:k,accepted:!0,acknowledgedAt:Date.now()},updatedAt:Date.now()};try{Nn(process.env.PI_HERDSMAN_MAILBOX,z)}catch(N){return X(e,w,"pi_herdsman_state_error",N),{action:"handled"}}P=z;try{qr(process.env.PI_HERDSMAN_MAILBOX)}catch(N){X(e,w,"pi_herdsman_state_error",N)}return Mn="",{action:"transform",text:`Owner reply:
286
+ do not close solely because of inactivity.`,display:!0,details:{runId:T.runId,requestId:T.activeRequestId,agentLabel:T.agentLabel,ownerSessionId:T.ownerSessionId,workspaceId:T.workspaceId,paneId:T.paneId,piSessionId:T.piSessionId,lastActivityAt:T.lastActivityAt,inactiveMs:B,thresholdMs:Bo}},{triggerTurn:!0,deliverAs:"steer"}),I===un&&!b.aborted&&Is.set(j,T.lastActivityAt)}catch{}}}finally{Ei===I&&(Ei=void 0)}}},ba=(g,b)=>{let I=++un;tt&&clearTimeout(tt);let D=()=>{b.aborted||I!==un||(tt=setTimeout(()=>{b.aborted||I!==un||(tt=void 0,Ia(g,b,I).catch(()=>{}).finally(()=>{I===un&&D()}))},Rg),tt.unref?.())};Ia(g,b,I).catch(()=>{}).finally(()=>{I===un&&D()})};a.kind==="managed-agent"&&(aa=wa),da=ba,he=g=>{if(g.mode!=="tui"||!g.hasUI||!g.ui?.setWidget)return;let b=++Ce;le=g,g.ui.setWidget("pi-herdsman",(I,D)=>{let C=Co(()=>I.requestRender(),D);return a.kind==="managed-agent"&&C.setSnapshot({agents:[],stale:!1,unavailable:!0,breadcrumb:xr,...Ss()}),b===Ce&&g===le?(y=C,Wt=b):C.dispose(),C}),$e=()=>{le===g&&Mi(g,b)},z=setInterval(()=>{Mi(g,b)},2e3),Mi(g,b)},e.on("session_start",async(g,b)=>{pe(),o=void 0,++u;let I=d,D=f;++l,I==="active"&&D&&await be(D,"suspended",l);let C,A=H=>{try{H()}catch(j){C??=j}};if(De&&A(()=>ye()),f=b,d="inactive",A(()=>c?.release()),c=void 0,V(),C&&X(e,b,"pi_herdsman_role_error",C),a.kind==="lead"){let H=b.sessionManager.getSessionId();_=void 0,k=Vg(b.sessionManager.getEntries?.()??[],H),M=k===void 0,si=U}if(a.kind==="lead"){Ht(b);let H="lead",j=!1;try{H=jd(b.sessionManager.getEntries())}catch(T){j=!0,X(e,b,"pi_herdsman_role_error",T),re("lead"),Q=!1;try{$t(fe(),b.sessionManager.getSessionId(),we)}catch(B){X(e,b,"pi_herdsman_state_error",B)}ln(b,!1),e.setActiveTools(e.getActiveTools().filter(B=>B!=="chief"))}if(H==="chief")try{await oa(b,!0),d==="active"&&be(b,d,l)}catch(T){T instanceof Ee?Vn(b):(X(e,b,"pi_herdsman_role_error",T),Si?Si=!1:ln(b))}else!j&&!De&&Yn("inactive")}Pe?.abort(),w.clear(),Pe=new AbortController;let q=Pe.signal;a.kind==="lead"&&process.env.HERDR_SOCKET_PATH&&(d==="inactive"||d==="active")&&(d==="active"||Q)&&vl(b),z&&clearInterval(z),z=void 0,N=!1,ie=!1,y&&(le?.ui?.setWidget?.("pi-herdsman",void 0),y.dispose(),y=void 0),cn?.(I==="active"),Wt=0,le=void 0,$e=void 0;let E=++Ce;if(nn=!0,le=b,a.kind==="lead"&&process.env.HERDR_PANE_ID&&d==="inactive"&&t(b,{paneId:process.env.HERDR_PANE_ID,name:e.getSessionName?.(),...Y?{pendingAskId:Y.askId}:{}}),Mr=a.kind==="managed-agent"?e.getActiveTools():void 0,mt={agents:[],stale:!1,unavailable:!0,breadcrumb:xr,...Ss()},a.kind==="lead"&&d==="active"?Rn?.(b):he?.(b),!(a.kind==="lead"&&d==="active"))try{o={sessionId:b.sessionManager.getSessionId(),definitions:await Jc(b,a)}}catch(H){o=void 0,X(e,b,"pi_herdsman_definition_error",H)}if(a.kind==="managed-agent"){$e?.();return}await wa(b,q),a.kind==="lead"&&k!==void 0&&b.isIdle()&&(M=!0,U(b)),ba(b,q)}),a.kind==="lead"&&e.on("session_info_changed",(g,b)=>{d==="inactive"&&process.env.HERDR_PANE_ID&&t(b,{paneId:process.env.HERDR_PANE_ID,name:g?.name??e.getSessionName?.(),...Y?{pendingAskId:Y.askId}:{}})}),e.on("session_tree",(g,b)=>{if(nn)for(let I of ve.values())I.activeRequestId&&fi(e,I,b,Pe?.signal)}),e.on("session_shutdown",async()=>{if(++u,o=void 0,++Re,Ie&&clearTimeout(Ie),Ie=void 0,++l,a.kind==="lead"&&d==="active")Vn(f);else if(a.kind==="lead"){try{let g=f?.sessionManager.getSessionId();g&&$t(fe(),g,we)}catch(g){f&&X(e,f,"pi_herdsman_state_error",g)}ln(void 0,!1)}Pe?.abort(),w.clear(),Pe=void 0,++Ce,nn=!1,z&&clearInterval(z),z=void 0,tt&&clearTimeout(tt),tt=void 0,++un,Is.clear(),N=!1,ie=!1,y&&(le?.ui?.setWidget?.("pi-herdsman",void 0),y.dispose(),y=void 0),cn?.(),Wt=0,le=void 0,f=void 0,$e=void 0,a.kind==="lead"&&(_=void 0,k=void 0,M=!0,si=void 0);for(let[g,b]of ri)fr(g,b);ri.clear();for(let[g,b]of ai)fr(g,b);ai.clear();for(let g of oi.values())clearTimeout(g);oi.clear();for(let g of ut.values())clearTimeout(g);ut.clear();for(let g of Ot.values())clearTimeout(g);Ot.clear();for(let g of Dn.values())clearTimeout(g);Dn.clear();for(let g of qt.values())clearTimeout(g);qt.clear(),ur.clear(),di.clear(),lr.clear(),ve.clear(),_e.clear()}),e.registerTool({name:"agent",label:"agent",description:qg(a),executionMode:"sequential",parameters:O.Union([O.Object({action:Ze(["list"])},{additionalProperties:!1}),O.Object({action:Ze(["delegate"]),definition:a.kind==="managed-agent"?{...Ze([...a.allowedAgentDefinitions]),description:"Allowed agent definition for delegation."}:O.String({description:"Agent definition for a fresh agent.",pattern:"\\S"}),task:O.String({description:"Non-empty task.",pattern:"\\S"}),label:O.Optional(O.String({description:"Optional logical agent label matching ^[a-z][a-z0-9_-]{0,31}$.",pattern:Nt.source})),cwd:O.Optional(O.String({description:"Working directory for a fresh agent."})),fork:O.Optional(O.String({description:"Exact saved Pi session path or full UUID used as context for a fork."})),timeoutMs:O.Optional(O.Integer({minimum:kt,maximum:_t,description:"Total startup budget in milliseconds."})),files:O.Optional(O.Array(O.String({description:"Readable regular local file path."}),{description:"Supporting files for delegation, steering, replying, or ask_owner. Complete strict UTF-8 text may be embedded when it fits; other files are represented by canonical local path and byte size. Files do not grant capabilities."}))},{additionalProperties:!1}),O.Object({action:Ze(["delegate"]),session:O.String({pattern:"\\S"}),label:O.Optional(O.String({description:"Optional logical agent label matching ^[a-z][a-z0-9_-]{0,31}$.",pattern:Nt.source})),task:O.String({pattern:"\\S"}),files:O.Optional(O.Array(O.String())),timeoutMs:O.Optional(O.Integer({minimum:kt,maximum:_t}))},{additionalProperties:!1}),O.Object({action:Ze(["steer"]),agent:O.String({pattern:Nt.source}),message:O.String({pattern:"\\S"}),files:O.Optional(O.Array(O.String()))},{additionalProperties:!1}),O.Object({action:Ze(["reply"]),agent:O.String({pattern:Nt.source}),message:O.String({pattern:"\\S"}),files:O.Optional(O.Array(O.String()))},{additionalProperties:!1}),O.Object({action:Ze(["close"]),agent:O.String({pattern:Nt.source})},{additionalProperties:!1}),O.Object({action:Ze(["inspect"]),agent:O.String({pattern:Nt.source})},{additionalProperties:!1})]),execute:async(g,b,I,D,C)=>{try{let A=await qp(e,C,b,I,a,w);if($e?.(),a.kind==="lead"&&b.action==="delegate"&&A.ok===!0&&te(C),b.action==="delegate"&&A.ok===!0&&!kr)try{e.sendMessage({customType:"pi-herdsman-delegation-guidance",content:"Agent work is asynchronous. Delegate any other useful independent work now. If no useful independent work remains, end your turn; do not poll, sleep, or actively wait. Agent results and attention will resume it automatically. Do not conclude or produce the final synthesis while unresolved agent work remains.",display:!1},{triggerTurn:!0,deliverAs:"steer"}),kr=!0}catch{}_e.size&&(A.cleanup_errors=Object.fromEntries(_e));let q=Xs($o(b.action,A),{keep:"head",sessionId:C.sessionManager.getSessionId(),key:g});return{content:[{type:"text",text:q.content}],details:{...A,truncated:q.truncated,...q.fullOutputPath?{full_output_path:q.fullOutputPath}:{}}}}catch(A){if(!(A instanceof ke))throw A;let q=A.detail,E=Xs($o(b.action,{ok:!1,error:q}),{keep:"head",sessionId:C.sessionManager.getSessionId(),key:g});return{content:[{type:"text",text:E.content}],details:{ok:!1,error:q,truncated:E.truncated,...E.fullOutputPath?{full_output_path:E.fullOutputPath}:{}}}}},renderCall:(g,b,I)=>Gs("agent",g,b,I),renderResult:(g,b,I,D)=>rr("agent",g,b,I,D)}),a.kind==="lead"&&process.env.HERDR_PANE_ID&&e.registerTool(Z)}if(i!=="managed-agent")return;ds=!1;let P,ms=!1,Mn="",rn,Bt=0,Ge,Zn,et=!1,_r=!1,Ar=!1,hs,ys,Pn=r.length>0,Ut,vi,nt,pt=0,ki=!1,_i,Er=()=>_i?{ownTools:_i}:{},ws=(y=Date.now(),w=!1)=>{if(!P?.activeRequestId||rn||!w&&P.lastActivityAt!==void 0&&y>=P.lastActivityAt&&y-P.lastActivityAt<xg)return;let _={...P,lastActivityAt:y,updatedAt:y};try{Nn(process.env.PI_HERDSMAN_MAILBOX,_),P=_}catch(k){hs&&X(e,hs,"pi_herdsman_state_error",k)}},Ai,ca=()=>{++pt,vi&&clearInterval(vi),vi=void 0,Ut&&(nt?.ui?.setWidget?.("pi-herdsman",void 0),Ut.dispose(),Ut=void 0),nt=void 0,ki=!1},la=async(y,w)=>{if(!(w!==pt||y!==nt||ki)){ki=!0;try{let _=await en(e,y,void 0,ct?.signal,!0);if(w!==pt||y!==nt)return;Ai=Lc(_,y),Ut?.setSnapshot({agents:[],stale:!1,unavailable:!1,breadcrumb:Ai,...Er(),identityOnly:!0,refreshedAt:Date.now()})}catch{w===pt&&y===nt&&Ut?.setSnapshot({agents:[],stale:!1,unavailable:!0,breadcrumb:Ai??["?",process.env.PI_HERDSMAN_AGENT_DEFINITION&&process.env.PI_HERDSMAN_LABEL?St(process.env.PI_HERDSMAN_AGENT_DEFINITION,process.env.PI_HERDSMAN_LABEL):process.env.PI_HERDSMAN_AGENT_DEFINITION??"?"],...Er(),identityOnly:!0})}finally{w===pt&&y===nt&&(ki=!1)}}},Rr=()=>{for(let y of[...ve.values()])hr(y.label);ve.clear()},Al=(y,w,_,k)=>{if(!P)return!1;let M={...P,lastAck:{requestId:y,accepted:w,..._?{code:_}:{},...k?{message:k}:{},acknowledgedAt:Date.now()},updatedAt:Date.now()};try{return Nn(process.env.PI_HERDSMAN_MAILBOX,M),P=M,!0}catch(te){return hs&&X(e,hs,"pi_herdsman_state_error",te),!1}},ua=(y,w)=>{try{mp(process.env.PI_HERDSMAN_MAILBOX,y)}catch(_){X(e,w,"pi_herdsman_state_error",_),w.ui?.notify?.("pi_herdsman_state_error: request cleanup failed","error")}},on=(y,w,_,k,M)=>{Al(y,w,k,M)&&ua(y,_)},El=()=>!!P?.activeRequestId&&!P.pendingAskId&&!P.completedRequestId&&!rn&&!et&&!wt(process.env.PI_HERDSMAN_MAILBOX,P)&&jc(P),Rl=()=>P?.activeRequestId?P.pendingAskId?"already waiting for an owner reply":P.completedRequestId||rn?"assignment is settling":et?"assignment state is settling":wt(process.env.PI_HERDSMAN_MAILBOX,P)?"a control request is still pending":jc(P)?"agent state is not eligible":"direct agent work is still active":"no active assignment";e.registerTool({name:"ask_owner",label:"Ask owner",description:"Ask your direct owner for a decision that is required to continue. Call this alone as the final tool call of the turn, then stop and wait for the reply. Only one question may be outstanding.",executionMode:"sequential",parameters:O.Object({question:O.String({minLength:1,description:"Non-empty decision question required to continue."}),files:O.Optional(O.Array(O.String({description:"Readable regular local file path."}),{description:"Supporting files. Complete strict UTF-8 text may be embedded when it fits; other files are canonical local references. Files do not grant capabilities."}))},{additionalProperties:!1}),execute:async(y,w,_,k,M)=>{if(typeof w.question!="string"||!w.question.trim())throw new Error("Question must contain non-whitespace text");if(!ap(M))throw new Error("Call ask_owner alone as the final tool call of the turn, with no other tool calls, then wait for the reply.");let te=Qc(M);if(!P||!ni(P,te))throw new Error("Agent identity is not eligible to ask its owner");if(!El())throw new Error(`Agent cannot ask its owner: ${Rl()}`);let U=yn(),z=Date.now(),N=await ci(M),ie={version:4,askId:U,requestId:P.activeRequestId,runId:P.runId,ownerSessionId:P.ownerSessionId,workspaceId:P.workspaceId,agentLabel:P.agentLabel,paneId:P.paneId,piSessionId:P.piSessionId,question:bt(w.question,w.files??[],P.cwd,"ask_owner","Question",{inlineLimitBytes:N.inline.bytes,mailboxLimitBytes:N.mailbox.bytes,serializedBytes:Ce=>Op(P,U,Ce,z)}).text,createdAt:z},le=Xt(ie);le>N.mailbox.bytes&&$("invalid_request",`Mailbox payload is ${le} bytes; configured limit is ${N.mailbox.bytes} bytes`,"ask_owner");try{Oa(process.env.PI_HERDSMAN_MAILBOX,ie);let Ce={...P,pendingAskId:U,updatedAt:Date.now()};Nn(process.env.PI_HERDSMAN_MAILBOX,Ce),P=Ce}catch(Ce){try{qr(process.env.PI_HERDSMAN_MAILBOX)}catch{}throw Ce}return Mn="",{content:[{type:"text",text:"Question sent to your owner. This assignment is blocked until the reply; the reply will resume it automatically."}],details:{askId:U,assignmentRequestId:ie.requestId},terminate:!0}}}),e.on("session_before_switch",()=>({cancel:!0})),e.on("session_before_fork",()=>({cancel:!0})),e.on("session_start",async(y,w)=>{ca(),_i=void 0,Pn&&Rr(),ms=!1,ds=!1,P=void 0,ys=void 0,Ai=void 0,ct?.abort(),ct=new AbortController;try{let _=!1;hs=w;let k=nl(w);if(!k)throw new Error("invalid agent environment");Pn||(_i=e.getActiveTools()),Qg(e,w,process.env.PI_HERDSMAN_AGENT_DEFINITION);let M=Be(process.env.PI_HERDSMAN_MAILBOX);if(M&&!ni(M,k))throw new Error("agent session identity changed while state existed");if(P=k,M&&ni(M,k)&&(P={...k,...M,updatedAt:Date.now()},_=!!P.activeRequestId,P.activeRequestId&&!P.pendingAskId))try{let z=it(process.env.PI_HERDSMAN_MAILBOX,P.activeRequestId);z&&z.runId===P.runId&&z.ownerSessionId===P.ownerSessionId&&z.workspaceId===P.workspaceId&&z.agentLabel===P.agentLabel&&z.paneId===P.paneId&&z.requestId===P.activeRequestId?(P={...P,activeRequestId:void 0,completedRequestId:z.requestId,lastActivityAt:void 0,updatedAt:Date.now()},_=!1):z&&X(e,w,"pi_herdsman_state_error",new Error("active agent result identity did not match state"))}catch(z){X(e,w,"pi_herdsman_state_error",z)}if(!M){let{definitions:z}=await ls(w),N=z.find(ie=>ie.name===process.env.PI_HERDSMAN_AGENT_DEFINITION);if(!N)throw new Error(`agent ${process.env.PI_HERDSMAN_AGENT_DEFINITION} not found`);if(!vt(N))throw new Error(`agent ${N.name} is disabled; enable it through /agents \u2192 Definitions before starting a new agent`);Xr(N,z)}if(Nn(process.env.PI_HERDSMAN_MAILBOX,P),Pn){let z=a;if(!z||z.kind!=="managed-agent")throw new Error("delegation controller scope is unavailable");dp(w),await aa?.(w,ct.signal),ds=!0}if(P.activeRequestId&&ws(Date.now(),_),Pn&&da?.(w,ct.signal),ms=!0,!Pn&&w.mode==="tui"&&w.hasUI&&w.ui?.setWidget){let z=pt;nt=w,w.ui.setWidget("pi-herdsman",(N,ie)=>{let le=Co(()=>N.requestRender(),ie);return le.setSnapshot({agents:[],stale:!1,unavailable:!0,breadcrumb:["?",process.env.PI_HERDSMAN_AGENT_DEFINITION&&process.env.PI_HERDSMAN_LABEL?St(process.env.PI_HERDSMAN_AGENT_DEFINITION,process.env.PI_HERDSMAN_LABEL):process.env.PI_HERDSMAN_AGENT_DEFINITION??"?"],...Er(),identityOnly:!0}),z===pt&&w===nt?Ut=le:le.dispose(),le}),vi=setInterval(()=>{la(w,z)},2e3),la(w,z)}let te=Zs(w),U=ei(w);Dt(e,w,Lt(P,w),{activity:null,context:null,model:te||null,thinking:U||null},!0)}catch(_){ms=!1,ds=!1,P=void 0,Pn&&Rr(),X(e,w,"pi_herdsman_state_error",_),w.ui?.notify?.(`pi_herdsman_state_error: ${String(_)}`,"error")}}),e.on("input",(y,w)=>{let _=y.text;if(typeof _!="string"||!_.startsWith(_g))return{action:"continue"};let k=Ha(_);if(!k)return{action:"handled"};let M;try{M=Nr(process.env.PI_HERDSMAN_MAILBOX,k)}catch{return on(k,!1,w,"invalid","Malformed or oversized request"),{action:"handled"}}if(!M)return on(k,!1,w,"invalid","Request was not found"),{action:"handled"};if(!ms||!P)return{action:"handled"};if(M.runId!==P.runId||M.ownerSessionId!==P.ownerSessionId||M.workspaceId!==P.workspaceId||M.agentLabel!==P.agentLabel||M.paneId!==P.paneId)return on(k,!1,w,"identity","Request identity did not match agent state"),{action:"handled"};if(M.kind==="reply"){let U;try{U=It(process.env.PI_HERDSMAN_MAILBOX,P)}catch(N){return X(e,w,"pi_herdsman_state_error",N),on(k,!1,w,"identity","Malformed or oversized owner ask"),{action:"handled"}}if(!P.activeRequestId||!P.pendingAskId||M.askId!==P.pendingAskId||!U||U.askId!==P.pendingAskId||U.requestId!==P.activeRequestId||U.runId!==P.runId||U.ownerSessionId!==P.ownerSessionId||U.workspaceId!==P.workspaceId||U.agentLabel!==P.agentLabel||U.paneId!==P.paneId||U.piSessionId!==P.piSessionId)return on(k,!1,w,"identity","Owner reply did not match the pending ask"),{action:"handled"};let z={...P,pendingAskId:void 0,lastAck:{requestId:k,accepted:!0,acknowledgedAt:Date.now()},updatedAt:Date.now()};try{Nn(process.env.PI_HERDSMAN_MAILBOX,z)}catch(N){return X(e,w,"pi_herdsman_state_error",N),{action:"handled"}}P=z;try{qr(process.env.PI_HERDSMAN_MAILBOX)}catch(N){X(e,w,"pi_herdsman_state_error",N)}return Mn="",{action:"transform",text:`Owner reply:
287
287
 
288
288
  ${M.text}
289
289
 
290
- Continue the original assignment using this answer.`}}if(M.kind==="steer"&&P.pendingAskId)return on(k,!1,w,"busy","Agent is waiting for an owner reply"),{action:"handled"};if(M.kind==="task"&&P.resultError)return on(k,!1,w,"busy",P.resultError.nextAction),{action:"handled"};if(M.kind==="task"&&(P.completedRequestId!==void 0||!Ga(w.isIdle(),P.activeRequestId,!!rn||et)))return on(k,!1,w,"busy",P.completedRequestId?"Agent assignment is already complete":"Agent already has an active assignment"),{action:"handled"};if(M.kind==="steer"&&(rn||et))return on(k,!1,w,"busy","Agent completion is being published"),{action:"handled"};let te=w.isIdle();if(M.kind==="steer"&&!Xa(te,P.activeRequestId,et,te&&ml(P)))return on(k,!1,w,"idle","Agent is not accepting steering"),{action:"handled"};if(M.kind==="task"){let U={...P,activeRequestId:k,completedRequestId:void 0,lastActivityAt:Date.now(),lastAck:{requestId:k,accepted:!0,acknowledgedAt:Date.now()},updatedAt:Date.now()};try{Nn(process.env.PI_HERDSMAN_MAILBOX,U)}catch(ie){return X(e,w,"pi_herdsman_state_error",ie),{action:"handled"}}P=U,ys=Date.now();let z=Zs(w),N=ei(w);Dt(e,w,Lt(P,w),{activity:{requestId:k,task:M.text,startedAt:ys},context:null,...z?{model:z}:{},...N?{thinking:N}:{}}),ua(k,w)}if(M.kind==="steer"){if(te)return on(k,!0,w),Mn="",{action:"transform",text:M.text};try{e.sendUserMessage(M.text,{deliverAs:"steer"}),on(k,!0,w)}catch(U){on(k,!1,w,"delivery",String(U))}return{action:"handled"}}return Mn="",{action:"transform",text:M.text}}),e.on("message_end",(y,w)=>{if(ws(),!P?.activeRequestId||rn)return;let _=y.message??y;_?.role==="assistant"&&(Pn&&Fc(P,w.sessionManager.getEntries?.()??[])||(Mn=Ja([_])))}),e.on("turn_end",(y,w)=>{if(ws(),!P?.activeRequestId)return;let _=Br(w.getContextUsage?.()),k=_?.percent==null?void 0:Math.round(_.percent),M=Zs(w),te=ei(w);Dt(e,w,Lt(P,w),{context:k??null,...M?{model:M}:{},...te?{thinking:te}:{}})}),e.on("turn_start",()=>{ws()});for(let y of["message_update","tool_execution_start","tool_execution_update","tool_execution_end"])e.on(y,()=>ws());e.on("model_select",(y,w)=>{if(!P)return;let _=Eo(y);if(typeof _!="string")return;let k=ei(w);Dt(e,w,Lt(P,w),{model:_,...k?{thinking:k}:{}})}),e.on("thinking_level_select",(y,w)=>{if(!P||typeof y?.level!="string")return;let _=Zs(w);Dt(e,w,Lt(P,w),{thinking:y.level,..._?{model:_}:{}})});let fa=y=>{if(P?.activeRequestId){et=!0;try{let w=P.activeRequestId,_={...P,completedRequestId:w,activeRequestId:void 0,lastActivityAt:void 0,updatedAt:Date.now()};Nn(process.env.PI_HERDSMAN_MAILBOX,_),P=_,ys=void 0;let k=Zs(y),M=ei(y);et=!1,_r=!1,Zn&&clearInterval(Zn),Zn=void 0,Mn="",Dt(e,y,Lt(P,y),{activity:null,context:null,...k?{model:k}:{},...M?{thinking:M}:{}})}catch(w){_r||(_r=!0,X(e,y,"pi_herdsman_state_error",w)),Zn||(Zn=setInterval(()=>fa(y),250))}}},xl=y=>{if(!P?.activeRequestId||P.pendingAskId||rn||et||Pn&&Fc(P,y.sessionManager.getEntries?.()??[]))return;rn={version:4,runId:P.runId,requestId:P.activeRequestId,ownerSessionId:P.ownerSessionId,workspaceId:P.workspaceId,agentLabel:P.agentLabel,paneId:P.paneId,status:Mn?"completed":"failed",...Mn?{text:Mn}:{error:{code:"empty_result",message:"Agent produced no assistant text"}},contextUsage:Br(y.getContextUsage?.()),completedAt:Date.now()},Bt=0,Ar=!1;let _=()=>{let k=rn;if(k){Bt++;try{qa(process.env.PI_HERDSMAN_MAILBOX,k),rn=void 0,Ge&&clearInterval(Ge),Ge=void 0,fa(y)}catch(M){if(k.status==="completed"&&String(M).toLowerCase().includes("too large")){rn={...k,status:"failed",text:void 0,error:{code:"result_too_large",message:"Agent assistant response exceeded the mailbox result limit"}},Bt=0,_();return}if(Bt>=Mg){let te={code:"write_failure",message:`Could not persist agent result after ${Bt} attempts: ${String(M).slice(0,512)}`,requestId:k.requestId,runId:k.runId,ownerSessionId:k.ownerSessionId,workspaceId:k.workspaceId,agentLabel:k.agentLabel,paneId:k.paneId,originalStatus:k.status,attempts:Bt,failedAt:Date.now(),retrySafe:!1,cleanupSafe:!0,nextAction:"Inspect result_error, resolve mailbox persistence, then close this agent before starting another assignment; follow the stored recovery nextAction."};try{let U={...P,activeRequestId:void 0,completedRequestId:void 0,lastActivityAt:void 0,resultError:te,updatedAt:Date.now()};Nn(process.env.PI_HERDSMAN_MAILBOX,U),P=U,rn=void 0,Ge&&clearInterval(Ge),Ge=void 0,ys=void 0,Mn="",Dt(e,y,Lt(P,y),{activity:null,context:null})}catch(U){X(e,y,"pi_herdsman_result_error",JSON.stringify({recovery:te,recoveryError:String(U)})),Ge&&clearInterval(Ge),Ge=void 0}return}Ar||(Ar=!0,X(e,y,"pi_herdsman_result_error",M))}}};_(),rn&&!Ge&&(Ge=setInterval(_,250))};e.on("agent_settled",(y,w)=>{xl(w),Pn&&Oc(e,w,Me?.signal).catch(()=>{})}),e.on("session_shutdown",()=>{ca(),ct?.abort(),ct=void 0,lp(),ms=!1,ds=!1,P=void 0,Pn&&Rr(),Ge&&clearInterval(Ge),Ge=void 0,Zn&&clearInterval(Zn),Zn=void 0})}export{lh as default,np as resolveAssignmentSession,Xc as resolveManagedSession,Gc as sessionAgentDefinition};
290
+ Continue the original assignment using this answer.`}}if(M.kind==="steer"&&P.pendingAskId)return on(k,!1,w,"busy","Agent is waiting for an owner reply"),{action:"handled"};if(M.kind==="task"&&P.resultError)return on(k,!1,w,"busy",P.resultError.nextAction),{action:"handled"};if(M.kind==="task"&&(P.completedRequestId!==void 0||!Ga(w.isIdle(),P.activeRequestId,!!rn||et)))return on(k,!1,w,"busy",P.completedRequestId?"Agent assignment is already complete":"Agent already has an active assignment"),{action:"handled"};if(M.kind==="steer"&&(rn||et))return on(k,!1,w,"busy","Agent completion is being published"),{action:"handled"};let te=w.isIdle();if(M.kind==="steer"&&!Xa(te,P.activeRequestId,et,te&&ml(P)))return on(k,!1,w,"idle","Agent is not accepting steering"),{action:"handled"};if(M.kind==="task"){let U={...P,activeRequestId:k,completedRequestId:void 0,lastActivityAt:Date.now(),lastAck:{requestId:k,accepted:!0,acknowledgedAt:Date.now()},updatedAt:Date.now()};try{Nn(process.env.PI_HERDSMAN_MAILBOX,U)}catch(ie){return X(e,w,"pi_herdsman_state_error",ie),{action:"handled"}}P=U,ys=Date.now();let z=Zs(w),N=ei(w);Dt(e,w,Lt(P,w),{activity:{requestId:k,task:M.text,startedAt:ys},context:null,...z?{model:z}:{},...N?{thinking:N}:{}}),ua(k,w)}if(M.kind==="steer"){if(te)return on(k,!0,w),Mn="",{action:"transform",text:M.text};try{e.sendUserMessage(M.text,{deliverAs:"steer"}),on(k,!0,w)}catch(U){on(k,!1,w,"delivery",String(U))}return{action:"handled"}}return Mn="",{action:"transform",text:M.text}}),e.on("message_end",(y,w)=>{if(ws(),!P?.activeRequestId||rn)return;let _=y.message??y;_?.role==="assistant"&&(Pn&&Fc(P,w.sessionManager.getEntries?.()??[])||(Mn=Ja([_])))}),e.on("turn_end",(y,w)=>{if(ws(),!P?.activeRequestId)return;let _=Br(w.getContextUsage?.()),k=_?.percent==null?void 0:Math.round(_.percent),M=Zs(w),te=ei(w);Dt(e,w,Lt(P,w),{context:k??null,...M?{model:M}:{},...te?{thinking:te}:{}})}),e.on("turn_start",()=>{ws()});for(let y of["message_update","tool_execution_start","tool_execution_update","tool_execution_end"])e.on(y,()=>ws());e.on("model_select",(y,w)=>{if(!P)return;let _=Eo(y);if(typeof _!="string")return;let k=ei(w);Dt(e,w,Lt(P,w),{model:_,...k?{thinking:k}:{}})}),e.on("thinking_level_select",(y,w)=>{if(!P||typeof y?.level!="string")return;let _=Zs(w);Dt(e,w,Lt(P,w),{thinking:y.level,..._?{model:_}:{}})});let fa=y=>{if(P?.activeRequestId){et=!0;try{let w=P.activeRequestId,_={...P,completedRequestId:w,activeRequestId:void 0,lastActivityAt:void 0,updatedAt:Date.now()};Nn(process.env.PI_HERDSMAN_MAILBOX,_),P=_,ys=void 0;let k=Zs(y),M=ei(y);et=!1,_r=!1,Zn&&clearInterval(Zn),Zn=void 0,Mn="",Dt(e,y,Lt(P,y),{activity:null,context:null,...k?{model:k}:{},...M?{thinking:M}:{}})}catch(w){_r||(_r=!0,X(e,y,"pi_herdsman_state_error",w)),Zn||(Zn=setInterval(()=>fa(y),250))}}},xl=y=>{if(!P?.activeRequestId||P.pendingAskId||rn||et||Pn&&Fc(P,y.sessionManager.getEntries?.()??[]))return;rn={version:4,runId:P.runId,requestId:P.activeRequestId,ownerSessionId:P.ownerSessionId,workspaceId:P.workspaceId,agentLabel:P.agentLabel,paneId:P.paneId,status:Mn?"completed":"failed",...Mn?{text:Mn}:{error:{code:"empty_result",message:"Agent produced no assistant text"}},contextUsage:Br(y.getContextUsage?.()),completedAt:Date.now()},Bt=0,Ar=!1;let _=()=>{let k=rn;if(k){Bt++;try{qa(process.env.PI_HERDSMAN_MAILBOX,k),rn=void 0,Ge&&clearInterval(Ge),Ge=void 0,fa(y)}catch(M){if(k.status==="completed"&&String(M).toLowerCase().includes("too large")){rn={...k,status:"failed",text:void 0,error:{code:"result_too_large",message:"Agent assistant response exceeded the mailbox result limit"}},Bt=0,_();return}if(Bt>=Mg){let te={code:"write_failure",message:`Could not persist agent result after ${Bt} attempts: ${String(M).slice(0,512)}`,requestId:k.requestId,runId:k.runId,ownerSessionId:k.ownerSessionId,workspaceId:k.workspaceId,agentLabel:k.agentLabel,paneId:k.paneId,originalStatus:k.status,attempts:Bt,failedAt:Date.now(),retrySafe:!1,cleanupSafe:!0,nextAction:"Inspect result_error, resolve mailbox persistence, then close this agent before starting another assignment; follow the stored recovery nextAction."};try{let U={...P,activeRequestId:void 0,completedRequestId:void 0,lastActivityAt:void 0,resultError:te,updatedAt:Date.now()};Nn(process.env.PI_HERDSMAN_MAILBOX,U),P=U,rn=void 0,Ge&&clearInterval(Ge),Ge=void 0,ys=void 0,Mn="",Dt(e,y,Lt(P,y),{activity:null,context:null})}catch(U){X(e,y,"pi_herdsman_result_error",JSON.stringify({recovery:te,recoveryError:String(U)})),Ge&&clearInterval(Ge),Ge=void 0}return}Ar||(Ar=!0,X(e,y,"pi_herdsman_result_error",M))}}};_(),rn&&!Ge&&(Ge=setInterval(_,250))};e.on("agent_settled",(y,w)=>{xl(w),Pn&&Oc(e,w,Pe?.signal).catch(()=>{})}),e.on("session_shutdown",()=>{ca(),ct?.abort(),ct=void 0,lp(),ms=!1,ds=!1,P=void 0,Pn&&Rr(),Ge&&clearInterval(Ge),Ge=void 0,Zn&&clearInterval(Zn),Zn=void 0})}export{lh as default,np as resolveAssignmentSession,Xc as resolveManagedSession,Gc as sessionAgentDefinition};
@@ -164,8 +164,8 @@ Coordinate the assigned analysis and integrate direct agent results.
164
164
  ```
165
165
 
166
166
  The effective roster is validated atomically. Every `agents` name must exist.
167
- Bundled role descriptions and bodies describe role behavior only; orchestration
168
- guidance comes from the active controller contract.
167
+ Bundled role descriptions communicate each role's purpose and selection boundary;
168
+ the active controller contract remains authoritative for delegation behavior.
169
169
 
170
170
  With a non-empty explicit `tools` allowlist, `agent` is inferred unless
171
171
  explicitly denied. See [Delegation](../concepts/delegation.md).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-herdsman",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "type": "module",
5
5
  "description": "Asynchronous Pi agent orchestration with nested delegation, parallel execution, and supervision in herdr.",
6
6
  "license": "Apache-2.0",