@maestria/pi 0.7.7 → 0.7.8

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,11 +1,11 @@
1
- import{existsSync as e,mkdirSync as t,readFileSync as n,writeFileSync as r}from"node:fs";import i from"node:path";import{homedir as a}from"node:os";import{Data as o,Effect as s}from"effect";import{Type as c}from"typebox";import{SUBAGENT_EVENTS as l}from"@gotgenes/pi-subagents";import{defineTool as u}from"@earendil-works/pi-coding-agent";const d={REVIEW_ACTIVATED:`maestria:review:activated`,REVIEW_DEACTIVATED:`maestria:review:deactivated`,SUBAGENT_COMPLETED:`maestria:subagent:completed`,SUBAGENT_FAILED:`maestria:subagent:failed`,SUBAGENT_STARTED:`maestria:subagent:started`},f=[`adventurer`,`architect`,`builder`,`diagnose`,`planner`,`reviewer`,`writer`],p=e=>{if(!f.some(t=>t===e))throw Error(`Unknown agent: "${e}". Allowed: ${f.join(`, `)}`)},m=(e,t)=>{if(e==null||e===``||!e.trim())throw Error(t)},h=(a,o)=>{if(!e(a))return console.warn(`[maestria] Agents source directory not found:`,a),0;try{t(o,{recursive:!0})}catch{return console.warn(`[maestria] Could not create agents directory:`,o),0}let s=0;for(let t of f){let c=i.join(a,`${t}.md`),l=i.join(o,`${t}.md`);if(!e(c)){console.warn(`[maestria] Agent source not found: ${t}.md`);continue}if(!e(l))try{let e=n(c,`utf-8`);r(l,e,`utf-8`),s+=1}catch(e){console.warn(`[maestria] Failed to deploy agent ${t}:`,e)}}return s>0&&console.log(`[maestria] Deployed ${s} specialist agents to ${o}`),s},ee=import.meta.dirname,te=i.join(ee,`..`,`agents`),ne=e=>{h(te,i.join(a(),`.pi`,`agent`,`agents`))},g=()=>({activeTask:``,blockers:[],completionPromise:``,filesModified:[],filesRead:[],handoffHistory:[],mode:null,nativeGoal:null,originalModel:null,originalTools:null,reviewMode:!1,reviewModel:null,specialistsDelegated:[],subagentStatus:{}}),_=(e,t,n)=>[t,...e.filter(e=>e!==t)].slice(0,n),v=(e,t,n,r)=>{let i=[{from:t,task:r,timestamp:Date.now(),to:n},...e.handoffHistory].slice(0,5);return{...e,handoffHistory:i}},re=(e,t)=>({...e,filesModified:_(e.filesModified,t,10)}),ie=(e,t)=>({...e,filesRead:_(e.filesRead,t,10)}),ae=(e,t)=>e.specialistsDelegated.includes(t)?e:{...e,specialistsDelegated:[...e.specialistsDelegated,t]},oe=e=>({originalModel:e.originalModel,originalTools:e.originalTools,state:{...e,originalModel:null,originalTools:null,reviewMode:!1}}),y=(e,t)=>{e.appendEntry(`maestria_state`,{...t})},b=e=>{let t=[];if(e.mode&&t.push(`**Mode:** ${e.mode.toUpperCase()}`),e.reviewModel!==null&&e.reviewModel!==void 0&&e.reviewModel!==``&&t.push(`**Review Model:** ${e.reviewModel}`),e.activeTask&&t.push(`**Goal:** ${e.activeTask}`),e.nativeGoal&&t.push(`**Native Goal:** ${e.nativeGoal.objective} (${e.nativeGoal.status})`),e.completionPromise&&t.push(`**Completion Promise:** ${e.completionPromise}`),e.specialistsDelegated.length>0&&t.push(`**Specialists Delegated:** ${e.specialistsDelegated.join(`, `)}`),e.blockers.length>0){t.push(`**Blockers:**`);for(let n of e.blockers)t.push(`- ${n}`)}let n=[];if(e.filesModified.length>0&&n.push(`**Modified:** ${e.filesModified.join(`, `)}`),e.filesRead.length>0&&n.push(`**Read:** ${e.filesRead.join(`, `)}`),n.length>0&&t.push(`**Files:** ${n.join(`; `)}`),e.handoffHistory.length>0){t.push(`**Recent Handoffs:**`);for(let n of e.handoffHistory)t.push(`- ${n.from} → ${n.to}: ${n.task}`)}return t.join(`
1
+ import{existsSync as e,mkdirSync as t,readFileSync as n,writeFileSync as r}from"node:fs";import i from"node:path";import{homedir as a}from"node:os";import{Data as o,Effect as s}from"effect";import{Type as c}from"typebox";import{SUBAGENT_EVENTS as l}from"@gotgenes/pi-subagents";import{defineTool as u}from"@earendil-works/pi-coding-agent";const d=()=>({activeTask:``,blockers:[],completionPromise:``,filesModified:[],filesRead:[],handoffHistory:[],mode:null,nativeGoal:null,originalModel:null,originalTools:null,reviewMode:!1,reviewModel:null,specialistsDelegated:[],subagentStatus:{}}),f=(e,t,n)=>[t,...e.filter(e=>e!==t)].slice(0,n),p=(e,t,n,r)=>{let i=[{from:t,task:r,timestamp:Date.now(),to:n},...e.handoffHistory].slice(0,5);return{...e,handoffHistory:i}},ee=(e,t)=>({...e,filesModified:f(e.filesModified,t,10)}),te=(e,t)=>({...e,filesRead:f(e.filesRead,t,10)}),ne=(e,t)=>e.specialistsDelegated.includes(t)?e:{...e,specialistsDelegated:[...e.specialistsDelegated,t]},re=e=>({originalModel:e.originalModel,originalTools:e.originalTools,state:{...e,originalModel:null,originalTools:null,reviewMode:!1}}),m=(e,t)=>{e.appendEntry(`maestria_state`,{...t})},h=e=>typeof e==`object`&&!!e,g=e=>{let t=e?.sessionManager;if(typeof t?.getBranch!=`function`)return null;let n=t.getBranch();return Array.isArray(n)?n:null},_=e=>{let t=d();if(!e)return t;for(let n=e.length-1;n>=0;--n){let r=e[n];if(r.type===`custom`&&r.customType===`maestria_state`){h(r.data)&&Object.assign(t,r.data);break}}return t},v=(e,t)=>{for(let t of Object.keys(e))Reflect.deleteProperty(e,t);Object.assign(e,t)},y=e=>{let t=[];if(e.mode&&t.push(`**Mode:** ${e.mode.toUpperCase()}`),e.reviewModel!==null&&e.reviewModel!==void 0&&e.reviewModel!==``&&t.push(`**Review Model:** ${e.reviewModel}`),e.activeTask&&t.push(`**Goal:** ${e.activeTask}`),e.nativeGoal&&t.push(`**Native Goal:** ${e.nativeGoal.objective} (${e.nativeGoal.status})`),e.completionPromise&&t.push(`**Completion Promise:** ${e.completionPromise}`),e.specialistsDelegated.length>0&&t.push(`**Specialists Delegated:** ${e.specialistsDelegated.join(`, `)}`),e.blockers.length>0){t.push(`**Blockers:**`);for(let n of e.blockers)t.push(`- ${n}`)}let n=[];if(e.filesModified.length>0&&n.push(`**Modified:** ${e.filesModified.join(`, `)}`),e.filesRead.length>0&&n.push(`**Read:** ${e.filesRead.join(`, `)}`),n.length>0&&t.push(`**Files:** ${n.join(`; `)}`),e.handoffHistory.length>0){t.push(`**Recent Handoffs:**`);for(let n of e.handoffHistory)t.push(`- ${n.from} → ${n.to}: ${n.task}`)}return t.join(`
2
2
 
3
- `)},x=async(e,t,n)=>{let{state:r,originalModel:i,originalTools:a}=oe(n);if(a&&a.length>0&&await e.setActiveTools(a),i!=null&&i!==``)try{let n=t.modelRegistry.getAll().find(e=>e.id===i);n&&await e.setModel(n)}catch{}Object.assign(n,r)},se=async(e,t,n)=>{let{reviewModel:r}=n;if(r==null||r===``)return null;try{let n=t.modelRegistry.getAll().find(e=>e.id===r);return n?(await e.setModel(n),r):(t.ui.notify(`Review model "${r}" not found in registry, staying on current.`),null)}catch{return t.ui.notify(`Could not switch to review model "${r}", staying on current.`),null}},ce=[`read`,`grep`,`find`,`ls`,`glob`],le=(e,t)=>{e.registerCommand(`maestria-status`,{description:`Show current maestria session state including handoff history`,handler:(e,n)=>{let r=b(t);if(!r){n.ui.notify(`No active maestria state to report.`);return}n.ui.setEditorText(r)}})},ue=(e,t)=>{e.registerCommand(`review`,{description:`Enter review mode. Blocks destructive tools, sets read-only toolset.`,handler:async(n,r)=>{if(!n.trim()){r.ui.notify(`Usage: /review <target> - describe what to review`);return}let i=r.model?.id??null,a=e.getActiveTools();if(Object.assign(t,{...t,originalModel:i,originalTools:a,reviewMode:!0}),y(e,t),t.reviewModel!==null&&t.reviewModel!==void 0&&t.reviewModel!==``){let n=await se(e,r,t);n!=null&&n!==``&&(r.ui.notify(`Review mode: switched to ${n}`),e.events?.emit(d.REVIEW_ACTIVATED,{originalModel:t.originalModel,reviewModel:n,timestamp:Date.now()}))}e.setActiveTools(ce),e.sendUserMessage([`[REVIEW: ${n}]`,``,`Review: ${n}. Use the reviewer prompt template.`,`Read only, no edits, report findings.`].join(`
4
- `),{deliverAs:`steer`})}})},de=(e,t)=>{e.registerCommand(`restore-model`,{description:`Restore the original model and tools that were active before review mode was entered.`,handler:async(n,r)=>{if(!t.reviewMode){r.ui.notify(`Not in review mode. Nothing to restore.`);return}let i=t.originalModel;await x(e,r,t),y(e,t),r.ui.notify(`Restored original model and tools.`),e.events?.emit(d.REVIEW_DEACTIVATED,{originalModel:i,timestamp:Date.now()})}})},fe=(e,t)=>{e.registerCommand(`handoff`,{description:`Generate a structured handoff prompt for a new task context`,handler:(n,r)=>{if(!n.trim()){r.ui.notify(`Usage: /handoff <goal> - describe the task context for handoff`);return}let i=n.trim(),a=[`**Goal:** ${i}`,``,`**Context:**`,`- Mode: ${t.mode??`none`}`,`- Active task: ${t.activeTask||`none`}`,`- Specialists delegated: ${(t.specialistsDelegated?.length??0)>0?t.specialistsDelegated.join(`, `):`none`}`,`- Recent handoffs: ${t.handoffHistory?.length??0} entries`,`- Files modified: ${(t.filesModified?.length??0)>0?t.filesModified.join(`, `):`none`}`,``,`**Requirements:**`,`(fill in specific requirements)`,``,`**Known problems:**`,(t.blockers?.length??0)>0?t.blockers.map(e=>`- ${e}`).join(`
3
+ `)},b=(e,t)=>{e.on(`session_before_compact`,e=>{let n=e.preparation;return{compaction:{details:{...t},firstKeptEntryId:n?.firstKeptEntryId??``,summary:y(t),tokensBefore:n?.tokensBefore??0}}}),e.on(`session_before_tree`,e=>e.preparation?.userWantsSummary===!0?{summary:{summary:y(t)}}:void 0)},x=(e,t)=>({setActiveTools:t=>e.setActiveTools(t),setModel:async n=>{t(n)&&await e.setModel(n)}}),S=async(e,t,n)=>{let{state:r,originalModel:i,originalTools:a}=re(n);if(a&&a.length>0&&await e.setActiveTools(a),i!=null&&i!==``)try{let n=t.modelRegistry.getAll().find(e=>e.id===i);n&&await e.setModel(n)}catch{}Object.assign(n,r)},C=async(e,t,n)=>{let{reviewModel:r}=n;if(r==null||r===``)return null;try{let n=t.modelRegistry.getAll().find(e=>e.id===r);return n?(await e.setModel(n),r):(t.ui.notify(`Review model "${r}" not found in registry, staying on current.`),null)}catch{return t.ui.notify(`Could not switch to review model "${r}", staying on current.`),null}},w={REVIEW_ACTIVATED:`maestria:review:activated`,REVIEW_DEACTIVATED:`maestria:review:deactivated`,SUBAGENT_COMPLETED:`maestria:subagent:completed`,SUBAGENT_FAILED:`maestria:subagent:failed`,SUBAGENT_STARTED:`maestria:subagent:started`},T=[`adventurer`,`architect`,`builder`,`diagnose`,`planner`,`reviewer`,`writer`],E=e=>{if(!T.some(t=>t===e))throw Error(`Unknown agent: "${e}". Allowed: ${T.join(`, `)}`)},D=(e,t)=>{if(e==null||e===``||!e.trim())throw Error(t)},ie=[`read`,`grep`,`find`,`ls`,`glob`],ae=(e,t)=>{e.registerCommand(`maestria-status`,{description:`Show current maestria session state including handoff history`,handler:(e,n)=>{let r=y(t);if(!r){n.ui.notify(`No active maestria state to report.`);return}n.ui.setEditorText(r)}})},oe=(e,t)=>{e.registerCommand(`review`,{description:`Enter review mode. Blocks destructive tools, sets read-only toolset.`,handler:async(n,r)=>{if(!n.trim()){r.ui.notify(`Usage: /review <target> - describe what to review`);return}let i=r.model?.id??null,a=e.getActiveTools();if(Object.assign(t,{...t,originalModel:i,originalTools:a,reviewMode:!0}),m(e,t),t.reviewModel!==null&&t.reviewModel!==void 0&&t.reviewModel!==``){let n=await C(e,r,t);n!=null&&n!==``&&(r.ui.notify(`Review mode: switched to ${n}`),e.events?.emit(w.REVIEW_ACTIVATED,{originalModel:t.originalModel,reviewModel:n,timestamp:Date.now()}))}e.setActiveTools(ie),e.sendUserMessage([`[REVIEW: ${n}]`,``,`Review: ${n}. Use the reviewer prompt template.`,`Read only, no edits, report findings.`].join(`
4
+ `),{deliverAs:`steer`})}})},se=(e,t)=>{e.registerCommand(`restore-model`,{description:`Restore the original model and tools that were active before review mode was entered.`,handler:async(n,r)=>{if(!t.reviewMode){r.ui.notify(`Not in review mode. Nothing to restore.`);return}let i=t.originalModel;await S(e,r,t),m(e,t),r.ui.notify(`Restored original model and tools.`),e.events?.emit(w.REVIEW_DEACTIVATED,{originalModel:i,timestamp:Date.now()})}})},ce=(e,t)=>{e.registerCommand(`handoff`,{description:`Generate a structured handoff prompt for a new task context`,handler:(n,r)=>{if(!n.trim()){r.ui.notify(`Usage: /handoff <goal> - describe the task context for handoff`);return}let i=n.trim(),a=[`**Goal:** ${i}`,``,`**Context:**`,`- Mode: ${t.mode??`none`}`,`- Active task: ${t.activeTask||`none`}`,`- Specialists delegated: ${(t.specialistsDelegated?.length??0)>0?t.specialistsDelegated.join(`, `):`none`}`,`- Recent handoffs: ${t.handoffHistory?.length??0} entries`,`- Files modified: ${(t.filesModified?.length??0)>0?t.filesModified.join(`, `):`none`}`,``,`**Requirements:**`,`(fill in specific requirements)`,``,`**Known problems:**`,(t.blockers?.length??0)>0?t.blockers.map(e=>`- ${e}`).join(`
5
5
  `):`(no known problems documented)`,``,`**Assumptions documented:**`,`(document assumptions made, tagged [inferred] where uncertain)`,``,`**Success criteria:**`,`(fill in how to verify completion)`,``,`**Next step:**`,`(fill in what happens after this task)`,``,`---`,`Complete the fields above before sending.`].join(`
6
- `);Object.assign(t,v(t,`current`,`next`,i)),y(e,t),e.sendUserMessage(a,{deliverAs:`steer`})}})},pe=(e,t)=>{e.registerCommand(`review-model`,{description:`Set which model to use when entering review mode`,handler:(n,r)=>{if(!n.trim()){r.ui.notify(`Usage: /review-model <model-id>`);return}let i=n.trim(),a=r.modelRegistry.getAll();if(!a.find(e=>e.id===i)){r.ui.notify(`Unknown model: "${i}". Available: ${a.map(e=>e.id).join(`, `)}`);return}t.reviewModel=i,y(e,t),r.ui.notify(`Review model set to: ${i}`)}})},me=(e,t)=>{le(e,t),ue(e,t),de(e,t),fe(e,t),pe(e,t)},he=e=>typeof e==`object`&&!!e,ge=e=>he(e)?typeof e.api==`string`&&typeof e.baseUrl==`string`&&typeof e.contextWindow==`number`&&typeof e.cost==`object`&&e.cost!==null&&typeof e.id==`string`&&Array.isArray(e.input)&&typeof e.maxTokens==`number`&&typeof e.name==`string`&&typeof e.provider==`string`&&typeof e.reasoning==`boolean`:!1,_e=e=>({appendEntry:(t,n)=>{e.appendEntry(t,n)},events:e.events,getActiveTools:()=>e.getActiveTools(),registerCommand:(t,n)=>{e.registerCommand(t,{description:n.description,handler:async(e,t)=>{await n.handler(e,t)}})},sendUserMessage:(t,n)=>{(n.deliverAs===`steer`||n.deliverAs===`followUp`)&&e.sendUserMessage(t,{deliverAs:n.deliverAs})},setActiveTools:t=>{e.setActiveTools(t)},setModel:async t=>{ge(t)&&await e.setModel(t)}}),ve=(e,t)=>{me(e,t)},ye=(e,t)=>{e.on(`session_before_compact`,e=>{let n=e.preparation;return{compaction:{details:{...t},firstKeptEntryId:n?.firstKeptEntryId??``,summary:b(t),tokensBefore:n?.tokensBefore??0}}}),e.on(`session_before_tree`,e=>e.preparation?.userWantsSummary===!0?{summary:{summary:b(t)}}:void 0)},S=e=>({on:(...t)=>{let[n,r]=t;n===`session_before_compact`&&e.on(`session_before_compact`,e=>r(e)),n===`session_before_tree`&&e.on(`session_before_tree`,e=>r(e))}}),C=(e,t)=>{ye(e,t)},w=[`fein`,`sonar`,`blitz`],T={blitz:`[MODE: blitz]`,fein:`[MODE: fein]`,sonar:`[MODE: sonar]`},E={blitz:1,fein:3,sonar:2},D=/```[\s\S]*?```|`[^`]*`/gu,O=e=>{let t=[],n;for(D.lastIndex=0;(n=D.exec(e))!==null;)t.push([n.index,n.index+n[0].length]);return t},k=(e,t)=>t.some(([t,n])=>e>=t&&e<n),A=e=>{let t=e.indexOf(`## MODE:`);return t===-1?`${e.replace(/\s+$/u,``)}\n`:`${e.slice(t).replace(/\s+$/u,``)}\n`},j=e=>e.replaceAll(/[.*+?^${}()|[\]\\]/gu,`\\$&`),M=e=>RegExp(`\\b${j(e)}\\b`,`giu`),N=(e,t)=>{if(!e)return null;let n=O(e),r=t?new Set([...t].map(e=>e.toLowerCase())):void 0,i=null;for(let t of w){if(r!=null&&r.has(t))continue;let a=M(t),o;for(;(o=a.exec(e))!==null;)k(o.index,n)||(i===null||E[t]>E[i.mode])&&(i={index:o.index,keyword:o[0],mode:t})}return i},P=(e,t)=>(e.slice(0,t.index)+e.slice(t.index+t.keyword.length).replace(/^:\s*/u,``)).replaceAll(/ {2,}/gu,` `).trim(),be=w,xe=T,F=new Map,Se=(e,t)=>{let r=n(i.resolve(t,`${e}.md`),`utf-8`);return A(r)},I=(e,t)=>{let n=`${i.resolve(t)}\0${e}`;if(!F.has(n))try{F.set(n,Se(e,t))}catch(t){console.warn(`[maestria] Failed to load mode prompt "${e}":`,t),F.set(n,``)}return`${xe[e]}\n\n${F.get(n)??``}`},Ce=(e,t,n)=>{if(!e)return null;let r=N(e,n);if(r===null)return null;let i=P(e,r);return{keyword:r.mode,prompt:I(r.mode,t),strippedText:i}},we=(e,t)=>t?`${e}\n\n${t}`:e,Te=(e,t,n,r)=>{e(async(e,i)=>{let{text:a}=e,o=Ce(a,n);return o?(t.reviewMode&&await r.restoreOriginalState(i),t.mode=o.keyword,r.persistState(),r.transform(we(o.prompt,o.strippedText))):r.noMatch})},Ee=(e,t,n)=>{e(`mode-clear`,{description:`Clear workflow mode and return to neutral routing`,handler:async(e,r)=>{t.reviewMode&&await n.restoreOriginalState(r),t.mode=null,n.persistState(),r.ui.notify(`Workflow mode cleared. Neutral routing is active.`)}});for(let r of be)e(r,{description:`Set workflow mode to ${r}`,handler:async(e,i)=>{t.reviewMode&&await n.restoreOriginalState(i),t.mode=r,n.persistState(),i.ui.notify(`Mode set to ${r}. Describe what you'd like to work on.`)}})},De=e=>typeof e==`object`&&!!e,Oe=e=>De(e)?typeof e.api==`string`&&typeof e.baseUrl==`string`&&typeof e.contextWindow==`number`&&typeof e.cost==`object`&&e.cost!==null&&typeof e.id==`string`&&Array.isArray(e.input)&&typeof e.maxTokens==`number`&&typeof e.name==`string`&&typeof e.provider==`string`&&typeof e.reasoning==`boolean`:!1,L=async(e,t,n)=>{await x({setActiveTools:t=>{e.setActiveTools(t)},setModel:async t=>{Oe(t)&&await e.setModel(t)}},t,n)},ke=import.meta.dirname,Ae=i.resolve(ke,`../agents/commands`),je=(e,t)=>{Te(t=>{e.on(`input`,t)},t,Ae,{noMatch:{action:`continue`},persistState:()=>{y(e,t)},restoreOriginalState:async n=>{await L(e,n,t)},transform:e=>({action:`transform`,text:e})})},Me=e=>typeof e!=`object`||!e?!1:`modelRegistry`in e&&`ui`in e,Ne=e=>({appendEntry:(t,n)=>{e.appendEntry(t,n)},registerCommand:(t,n)=>{e.registerCommand(t,{description:n.description,handler:async(e,t)=>{await n.handler(e,t)}})},setActiveTools:t=>{e.setActiveTools(t)},setModel:async t=>await e.setModel(t)}),Pe=(e,t)=>{Ee((t,n)=>{e.registerCommand(t,{description:n.description,handler:async(e,t)=>{await n.handler(e,t)}})},t,{persistState:()=>{y(e,t)},restoreOriginalState:async n=>{Me(n)&&await L(e,n,t)}})},Fe=import.meta.dirname,Ie=i.resolve(Fe,`../agents/commands`),Le=e=>(t,n)=>e.mode===null?{}:{systemPrompt:[t.systemPrompt,``,I(e.mode,Ie),``,`The user has set workflow mode to "${e.mode}". Honor this mode throughout the session until changed via /command.`].join(`
7
- `)},R=new Set([`completed`,`steered`,`aborted`,`stopped`,`error`]);var z=class extends o.TaggedError(`SubagentPollError`){};const Re=(e,t)=>s.sync(()=>{e.onUpdate?.({content:[{text:`${e.label} running... (${Math.round(t*(e.intervalMs??500)/1e3)}s)`,type:`text`}]})}),ze=e=>{let t=e.intervalMs??500,n=e.timeoutMs??18e4,r=Math.ceil(n/t);return s.gen(function*(){let i=0,a=yield*s.sync(()=>e.service.getRecord(e.id));for(;a&&!R.has(a.status)&&i<r;)yield*s.sleep(t),a=yield*s.sync(()=>e.service.getRecord(e.id)),i+=1,e.sendUpdates&&(yield*Re(e,i));return a&&!R.has(a.status)?yield*s.fail(new z({id:e.id,message:`Subagent ${e.id} timed out after ${n}ms`,reason:`timeout`})):a||(yield*s.fail(new z({id:e.id,message:`Subagent ${e.id} was cleaned up before completion`,reason:`missing`})))})},Be=(e,t)=>s.callback(n=>{let r=()=>{n(s.fail(new z({id:e,message:`Maestria subagent call aborted`,reason:`aborted`})))};return t.aborted?r():t.addEventListener(`abort`,r,{once:!0}),s.sync(()=>{t.removeEventListener(`abort`,r)})}),B=e=>{let t=ze(e);return e.signal?s.raceFirst(t,Be(e.id,e.signal)):t},Ve=e=>typeof e==`object`&&!!e,V=(e,t)=>{if(!Ve(e))return;let n=e[t];return typeof n==`string`?n:void 0},He=(e,t,n)=>e.on(l.STARTED,r=>{let i=V(r,`id`),a=V(r,`type`)??`unknown`;i!==void 0&&(n.subagentStatus[i]={startedAt:Date.now(),status:`running`,type:a},y(t,n),e.emit(d.SUBAGENT_STARTED,{id:i,timestamp:Date.now(),type:a}))}),Ue=(e,t,n)=>e.on(l.COMPLETED,r=>{let i=V(r,`id`);if(i===void 0)return;let a=n.subagentStatus[i];a!=null&&(a.status=`completed`,a.completedAt=Date.now()),y(t,n),e.emit(d.SUBAGENT_COMPLETED,{id:i,timestamp:Date.now(),type:a?.type})}),We=(e,t,n)=>e.on(l.FAILED,r=>{let i=V(r,`id`);if(i===void 0)return;let a=V(r,`status`)??`error`,o=n.subagentStatus[i];o!=null&&(o.status=a,o.completedAt=Date.now()),y(t,n),e.emit(d.SUBAGENT_FAILED,{id:i,timestamp:Date.now(),type:o?.type})}),Ge=(e,t,n)=>e.on(l.STEERED,e=>{let r=V(e,`id`);r!==void 0&&(n.subagentStatus[r]??={startedAt:Date.now(),status:`running`,type:`unknown`},y(t,n))}),Ke=(e,t,n)=>{let{events:r}=e;if(r==null)return;let i=[He(r,e,t),Ue(r,e,t),We(r,e,t),Ge(r,e,t)];n?.push(...i)},H=f,U=18e4,W=m,G=p,K=(e,t)=>{if(typeof e.abort==`function`)for(let n of t)try{e.abort(n)}catch{}},q=e=>s.tapError(B(e),()=>s.sync(()=>{K(e.service,[e.id])})),J=(e,t,n,r)=>{let i=ae(v(t,`orchestrator`,n,r),n);Object.assign(t,i),y(e,t)},qe=e=>{let t=e.mode??`single`;if(t===`single`){if(e.agent===void 0||e.agent===null||e.agent===``||!H.includes(e.agent))return`Invalid maestria_subagent call: 'agent' is required and must be one of ${H.join(`, `)}.`;W(e.task,`Task description is required`)}else if(t===`parallel`){if(!e.tasks||e.tasks.length<2)throw Error(`For parallel mode, tasks array is required with at least 2 items`);if(e.tasks.length>8)throw Error(`For parallel mode, tasks array may have at most 8 items (got ${e.tasks.length})`);for(let t of e.tasks)G(t.agent),W(t.task,`Task description is required for all tasks`)}else if(t===`chain`){if(!e.tasks||e.tasks.length<2)throw Error(`For chain mode, tasks array is required with at least 2 items`);for(let t of e.tasks)G(t.agent),W(t.task,`Task description is required for all tasks`)}return t},Je=async(e,t,n,r,i,a,o)=>{let c=n.spawn(r,i,{description:i.slice(0,80),foreground:!0,inheritContext:!0});J(e,t,r,i);let l=await s.runPromise(q({id:c,intervalMs:500,label:`Subagent ${r}`,onUpdate:o,sendUpdates:!0,service:n,signal:a,timeoutMs:U}));return{content:[{text:l.result??l.error??`No output.`,type:`text`}],details:{subagentId:c}}},Ye=(e,t,n,r)=>{let i=[];try{for(let a of r){let r=n.spawn(a.agent,a.task,{description:a.task.slice(0,80),foreground:!0,inheritContext:!0});i.push(r),J(e,t,a.agent,a.task)}}catch(e){throw K(n,i),e}return i},Xe=async(e,t,n,r,i)=>await s.runPromise(s.all(e.map((a,o)=>{let c=t[o];return s.match(B({id:a,intervalMs:500,label:`${c.agent} (${o+1}/${t.length})`,onUpdate:i,sendUpdates:!1,service:n,signal:r,timeoutMs:U}),{onFailure:t=>(K(n,e),{error:t}),onSuccess:e=>({record:e})})}),{concurrency:`unbounded`})),Ze=(e,t,n)=>{let r=[`## Parallel Results (${e.length} tasks)\n`];for(let[t,i]of e.entries()){let e=n[t];r.push(`### ${t+1}: ${i.agent}`),`error`in e?r.push(`⚠️ ${e.error instanceof Error?e.error.message:String(e.error)}`):r.push(e.record.result??e.record.error??`No output.`)}return{content:[{text:r.join(`
6
+ `);Object.assign(t,p(t,`current`,`next`,i)),m(e,t),e.sendUserMessage(a,{deliverAs:`steer`})}})},le=(e,t)=>{e.registerCommand(`review-model`,{description:`Set which model to use when entering review mode`,handler:(n,r)=>{if(!n.trim()){r.ui.notify(`Usage: /review-model <model-id>`);return}let i=n.trim(),a=r.modelRegistry.getAll();if(!a.find(e=>e.id===i)){r.ui.notify(`Unknown model: "${i}". Available: ${a.map(e=>e.id).join(`, `)}`);return}t.reviewModel=i,m(e,t),r.ui.notify(`Review model set to: ${i}`)}})},ue=(e,t)=>{ae(e,t),oe(e,t),se(e,t),ce(e,t),le(e,t)},de=(a,o)=>{if(!e(a))return console.warn(`[maestria] Agents source directory not found:`,a),0;try{t(o,{recursive:!0})}catch{return console.warn(`[maestria] Could not create agents directory:`,o),0}let s=0;for(let t of T){let c=i.join(a,`${t}.md`),l=i.join(o,`${t}.md`);if(!e(c)){console.warn(`[maestria] Agent source not found: ${t}.md`);continue}if(!e(l))try{let e=n(c,`utf-8`);r(l,e,`utf-8`),s+=1}catch(e){console.warn(`[maestria] Failed to deploy agent ${t}:`,e)}}return s>0&&console.log(`[maestria] Deployed ${s} specialist agents to ${o}`),s},fe=import.meta.dirname,pe=i.join(fe,`..`,`agents`),me=()=>{de(pe,i.join(a(),`.pi`,`agent`,`agents`))},he=e=>typeof e==`object`&&!!e,O=e=>he(e)?typeof e.api==`string`&&typeof e.baseUrl==`string`&&typeof e.contextWindow==`number`&&typeof e.cost==`object`&&e.cost!==null&&typeof e.id==`string`&&Array.isArray(e.input)&&typeof e.maxTokens==`number`&&typeof e.name==`string`&&typeof e.provider==`string`&&typeof e.reasoning==`boolean`:!1,k=e=>({appendEntry:(t,n)=>{e.appendEntry(t,n)},events:e.events,getActiveTools:()=>e.getActiveTools(),registerCommand:(t,n)=>{e.registerCommand(t,{description:n.description,handler:async(e,t)=>{await n.handler(e,t)}})},sendUserMessage:(t,n)=>{(n.deliverAs===`steer`||n.deliverAs===`followUp`)&&e.sendUserMessage(t,{deliverAs:n.deliverAs})},setActiveTools:t=>{e.setActiveTools(t)},setModel:async t=>{O(t)&&await e.setModel(t)}}),A=[`fein`,`sonar`,`blitz`],j={blitz:`[MODE: blitz]`,fein:`[MODE: fein]`,sonar:`[MODE: sonar]`},M={blitz:1,fein:3,sonar:2},N=/```[\s\S]*?```|`[^`]*`/gu,P=e=>{let t=[],n;for(N.lastIndex=0;(n=N.exec(e))!==null;)t.push([n.index,n.index+n[0].length]);return t},F=(e,t)=>t.some(([t,n])=>e>=t&&e<n),I=e=>{let t=e.indexOf(`## MODE:`);return t===-1?`${e.replace(/\s+$/u,``)}\n`:`${e.slice(t).replace(/\s+$/u,``)}\n`},L=e=>e.replaceAll(/[.*+?^${}()|[\]\\]/gu,`\\$&`),R=e=>RegExp(`\\b${L(e)}\\b`,`giu`),ge=(e,t)=>{if(!e)return null;let n=P(e),r=t?new Set([...t].map(e=>e.toLowerCase())):void 0,i=null;for(let t of A){if(r!=null&&r.has(t))continue;let a=R(t),o;for(;(o=a.exec(e))!==null;)F(o.index,n)||(i===null||M[t]>M[i.mode])&&(i={index:o.index,keyword:o[0],mode:t})}return i},_e=(e,t)=>(e.slice(0,t.index)+e.slice(t.index+t.keyword.length).replace(/^:\s*/u,``)).replaceAll(/ {2,}/gu,` `).trim(),ve=A,ye=j,z=new Map,be=(e,t)=>{let r=n(i.resolve(t,`${e}.md`),`utf-8`);return I(r)},B=(e,t)=>{let n=`${i.resolve(t)}\0${e}`;if(!z.has(n))try{z.set(n,be(e,t))}catch(t){console.warn(`[maestria] Failed to load mode prompt "${e}":`,t),z.set(n,``)}return`${ye[e]}\n\n${z.get(n)??``}`},xe=(e,t,n)=>{if(!e)return null;let r=ge(e,n);if(r===null)return null;let i=_e(e,r);return{keyword:r.mode,prompt:B(r.mode,t),strippedText:i}},Se=(e,t)=>t?`${e}\n\n${t}`:e,Ce=(e,t,n,r)=>{e(async(e,i)=>{let{text:a}=e,o=xe(a,n);return o?(t.reviewMode&&await r.restoreOriginalState(i),t.mode=o.keyword,r.persistState(),r.transform(Se(o.prompt,o.strippedText))):r.noMatch})},we=(e,t,n)=>{e(`mode-clear`,{description:`Clear workflow mode and return to neutral routing`,handler:async(e,r)=>{t.reviewMode&&await n.restoreOriginalState(r),t.mode=null,n.persistState(),r.ui.notify(`Workflow mode cleared. Neutral routing is active.`)}});for(let r of ve)e(r,{description:`Set workflow mode to ${r}`,handler:async(e,i)=>{t.reviewMode&&await n.restoreOriginalState(i),t.mode=r,n.persistState(),i.ui.notify(`Mode set to ${r}. Describe what you'd like to work on.`)}})},V=async(e,t,n)=>{await S(x(e,O),t,n)},Te=import.meta.dirname,Ee=i.resolve(Te,`../agents/commands`),De=(e,t)=>{Ce(t=>{e.on(`input`,t)},t,Ee,{noMatch:{action:`continue`},persistState:()=>{m(e,t)},restoreOriginalState:async n=>{await V(e,n,t)},transform:e=>({action:`transform`,text:e})})},Oe=e=>typeof e!=`object`||!e?!1:`modelRegistry`in e&&`ui`in e,ke=(e,t)=>{we((t,n)=>{e.registerCommand(t,{description:n.description,handler:async(e,t)=>{await n.handler(e,t)}})},t,{persistState:()=>{m(e,t)},restoreOriginalState:async n=>{Oe(n)&&await V(e,n,t)}})},Ae=import.meta.dirname,je=i.resolve(Ae,`../agents/commands`),Me=e=>(t,n)=>e.mode===null?{}:{systemPrompt:[t.systemPrompt,``,B(e.mode,je),``,`The user has set workflow mode to "${e.mode}". Honor this mode throughout the session until changed via /command.`].join(`
7
+ `)},H=new Set([`completed`,`steered`,`aborted`,`stopped`,`error`]);var U=class extends o.TaggedError(`SubagentPollError`){};const Ne=(e,t)=>s.sync(()=>{e.onUpdate?.({content:[{text:`${e.label} running... (${Math.round(t*(e.intervalMs??500)/1e3)}s)`,type:`text`}]})}),Pe=e=>{let t=e.intervalMs??500,n=e.timeoutMs??18e4,r=Math.ceil(n/t);return s.gen(function*(){let i=0,a=yield*s.sync(()=>e.service.getRecord(e.id));for(;a&&!H.has(a.status)&&i<r;)yield*s.sleep(t),a=yield*s.sync(()=>e.service.getRecord(e.id)),i+=1,e.sendUpdates&&(yield*Ne(e,i));return a&&!H.has(a.status)?yield*s.fail(new U({id:e.id,message:`Subagent ${e.id} timed out after ${n}ms`,reason:`timeout`})):a||(yield*s.fail(new U({id:e.id,message:`Subagent ${e.id} was cleaned up before completion`,reason:`missing`})))})},Fe=(e,t)=>s.callback(n=>{let r=()=>{n(s.fail(new U({id:e,message:`Maestria subagent call aborted`,reason:`aborted`})))};return t.aborted?r():t.addEventListener(`abort`,r,{once:!0}),s.sync(()=>{t.removeEventListener(`abort`,r)})}),W=e=>{let t=Pe(e);return e.signal?s.raceFirst(t,Fe(e.id,e.signal)):t},Ie=e=>typeof e==`object`&&!!e,G=(e,t)=>{if(!Ie(e))return;let n=e[t];return typeof n==`string`?n:void 0},Le=(e,t,n)=>e.on(l.STARTED,r=>{let i=G(r,`id`),a=G(r,`type`)??`unknown`;i!==void 0&&(n.subagentStatus[i]={startedAt:Date.now(),status:`running`,type:a},m(t,n),e.emit(w.SUBAGENT_STARTED,{id:i,timestamp:Date.now(),type:a}))}),Re=(e,t,n)=>e.on(l.COMPLETED,r=>{let i=G(r,`id`);if(i===void 0)return;let a=n.subagentStatus[i];a!=null&&(a.status=`completed`,a.completedAt=Date.now()),m(t,n),e.emit(w.SUBAGENT_COMPLETED,{id:i,timestamp:Date.now(),type:a?.type})}),ze=(e,t,n)=>e.on(l.FAILED,r=>{let i=G(r,`id`);if(i===void 0)return;let a=G(r,`status`)??`error`,o=n.subagentStatus[i];o!=null&&(o.status=a,o.completedAt=Date.now()),m(t,n),e.emit(w.SUBAGENT_FAILED,{id:i,timestamp:Date.now(),type:o?.type})}),Be=(e,t,n)=>e.on(l.STEERED,e=>{let r=G(e,`id`);r!==void 0&&(n.subagentStatus[r]??={startedAt:Date.now(),status:`running`,type:`unknown`},m(t,n))}),Ve=(e,t,n)=>{let{events:r}=e;if(r==null)return;let i=[Le(r,e,t),Re(r,e,t),ze(r,e,t),Be(r,e,t)];n?.push(...i)},K=T,q=18e4,J=(e,t)=>{for(let n of t)try{e.abort?.(n)}catch{}},Y=e=>s.tapError(W(e),()=>s.sync(()=>{J(e.service,[e.id])})),X=(e,t,n,r)=>{let i=ne(p(t,`orchestrator`,n,r),n);Object.assign(t,i),m(e,t)},He=e=>{let t=e.mode??`single`;if(t===`single`){if(e.agent===void 0||e.agent===``||!K.includes(e.agent))return`Invalid maestria_subagent call: 'agent' is required and must be one of ${K.join(`, `)}.`;D(e.task,`Task description is required`)}else if(t===`parallel`){if(!e.tasks||e.tasks.length<2)throw Error(`For parallel mode, tasks array is required with at least 2 items`);if(e.tasks.length>8)throw Error(`For parallel mode, tasks array may have at most 8 items (got ${e.tasks.length})`);for(let t of e.tasks)E(t.agent),D(t.task,`Task description is required for all tasks`)}else if(t===`chain`){if(!e.tasks||e.tasks.length<2)throw Error(`For chain mode, tasks array is required with at least 2 items`);for(let t of e.tasks)E(t.agent),D(t.task,`Task description is required for all tasks`)}return t},Ue=async(e,t,n,r,i,a,o)=>{let c=n.spawn(r,i,{description:i.slice(0,80),foreground:!0,inheritContext:!0});X(e,t,r,i);let l=await s.runPromise(Y({id:c,intervalMs:500,label:`Subagent ${r}`,onUpdate:o,sendUpdates:!0,service:n,signal:a,timeoutMs:q}));return{content:[{text:l.result??l.error??`No output.`,type:`text`}],details:{subagentId:c}}},We=(e,t,n,r)=>{let i=[];try{for(let a of r){let r=n.spawn(a.agent,a.task,{description:a.task.slice(0,80),foreground:!0,inheritContext:!0});i.push(r),X(e,t,a.agent,a.task)}}catch(e){throw J(n,i),e}return i},Ge=async(e,t,n,r,i)=>await s.runPromise(s.all(e.map((a,o)=>{let c=t[o];return s.match(W({id:a,intervalMs:500,label:`${c.agent} (${o+1}/${t.length})`,onUpdate:i,sendUpdates:!1,service:n,signal:r,timeoutMs:q}),{onFailure:t=>(J(n,e),{error:t}),onSuccess:e=>({record:e})})}),{concurrency:`unbounded`})),Ke=(e,t,n)=>{let r=[`## Parallel Results (${e.length} tasks)\n`];for(let[t,i]of e.entries()){let e=n[t];r.push(`### ${t+1}: ${i.agent}`),`error`in e?r.push(`⚠️ ${e.error instanceof Error?e.error.message:String(e.error)}`):r.push(e.record.result??e.record.error??`No output.`)}return{content:[{text:r.join(`
8
8
 
9
- `),type:`text`}],details:{subagentIds:t}}},Qe=async(e,t,n,r,i,a)=>{a?.({content:[{text:`Spawning ${r.length} parallel subagents...`,type:`text`}]});let o=Ye(e,t,n,r),s=await Xe(o,r,n,i,a);return a?.({content:[{text:`All ${r.length} parallel subagents settled.`,type:`text`}]}),Ze(r,o,s)},$e=(e,t)=>e.replaceAll(`{previous}`,()=>t),Y=async(e,t,n,r,i,a,o,c)=>{if(o>=r.length)return c;let l=r[o],u=o>0?$e(l.task,c):l.task,d=n.spawn(l.agent,u,{description:u.slice(0,80),foreground:!0,inheritContext:!0});J(e,t,l.agent,u),a?.({content:[{text:`Chain step ${o+1}/${r.length}: ${l.agent} running...`,type:`text`}]});let f;try{let e=await s.runPromise(q({id:d,intervalMs:500,label:`Chain step ${o+1}: ${l.agent}`,onUpdate:a,sendUpdates:!0,service:n,signal:i,timeoutMs:U}));f=e.result??e.error??`No output.`}catch(e){return`[error] ${e instanceof Error?e.message:String(e)}`}return o<r.length-1&&a?.({content:[{text:`Chain step ${o+1}/${r.length}: ${l.agent} completed. Moving to next step.`,type:`text`}]}),await Y(e,t,n,r,i,a,o+1,f)},et=async(e,t,n,r,i,a)=>({content:[{text:await Y(e,t,n,r,i,a,0,``),type:`text`}],details:{subagentId:`chain-completed`}}),tt=async(e,t,n,r,i,a)=>{let o=r.mode??`single`;if(o===`single`){if(typeof r.agent!=`string`||typeof r.task!=`string`)throw TypeError(`Single mode requires an agent and task`);return await Je(e,t,n,r.agent,r.task,i,a)}if((o===`parallel`||o===`chain`)&&Array.isArray(r.tasks))return await(o===`parallel`?Qe(e,t,n,r.tasks,i,a):et(e,t,n,r.tasks,i,a));throw Error(`Unknown dispatch mode`)},nt=c.Object({agent:c.String({description:`Specialist agent name (required): adventurer, architect, builder, diagnose, planner, reviewer, writer`}),mode:c.Optional(c.Union([c.Literal(`parallel`),c.Literal(`chain`),c.Literal(`single`)])),task:c.String({description:`Task description for the subagent (required)`}),tasks:c.Optional(c.Array(c.Object({agent:c.String(),task:c.String()}),{description:`Array of task objects for parallel or chain dispatch`}))}),rt=()=>({content:[{text:[`## Subagent Dispatch Unavailable`,``,"The `@gotgenes/pi-subagents` extension is required for subagent dispatch but has not been loaded.",``,`Install it as a Pi extension:`,``,"```",`pi install npm:@gotgenes/pi-subagents`,"```",``,`Then restart your Pi session.`].join(`
10
- `),type:`text`}],details:{}}),it=(e,t)=>({content:[{text:[`## Subagent Handoff Required`,``,`**From:** orchestrator`,`**To:** ${e}`,`**Task:** ${t}`,``,`Subagent dispatch failed. Please delegate this work manually.`].join(`
11
- `),type:`text`}],details:{}}),at=async(e,t,n,r,i)=>{let{getSubagentsService:a}=await import(`@gotgenes/pi-subagents`),o=a();if(!o||typeof o.spawn!=`function`)return rt();try{return await tt(e,t,o,n,r,i)}catch(e){console.warn(`[maestria] Subagent dispatch failed:`,e);let t=n.agent??n.tasks?.[0]?.agent??`unknown`,r=n.task??n.tasks?.map(e=>e.task).join(`; `)??`unknown`;return it(t,r)}},ot=(e,t)=>({description:`Dispatch a task to a @gotgenes/pi-subagents specialist subagent`,async execute(n,r,i,a,o){if(t.reviewMode)return{content:[{text:`Subagent dispatch is not available during review mode. Use /restore-model to exit review mode first.`,type:`text`}],details:{}};let s=qe(r);return s.startsWith(`Invalid`)?{content:[{text:`${s} Re-dispatch with a valid agent name; the orchestrator may continue read-only exploration while the brief is corrected.`,type:`text`}],details:{}}:await at(e,t,r,i,a?e=>{a({content:e.content.map(({text:e})=>({text:e,type:`text`})),details:e.details??{}})}:void 0)},label:`Maestria Subagent`,name:`maestria_subagent`,parameters:nt,promptGuidelines:[`Use maestria_subagent when a task MUST be delegated to a specialist subagent rather than handled directly. Each specialist has focused capabilities: adventurer (recon), architect (design), builder (impl), planner (planning), diagnose (bugs), reviewer (QA), writer (docs).`],promptSnippet:`Delegate tasks to @maestria specialist subagents (adventurer, architect, builder, planner, diagnose, reviewer, writer)`}),st=(e,t,n)=>{e.registerTool(ot(e,t)),Ke(e,t,n)},ct=e=>({appendEntry:(t,n)=>{e.appendEntry(t,n)},events:e.events,registerTool:t=>{e.registerTool(u({...t,async execute(e,n,r,i,a){return await t.execute(e,n,r,i,a)}}))}}),lt=[/rm\s+-rf\s+\//u,/dd\s+if=/u,/>\s*\/dev\/sd/u,/chmod\s+-R\s+777\s+\//u,/mkfs\.\w+/u,/:\(\)\{ :\|:& \};:/u,/>\s*\/etc\/(?<targetFile>passwd|shadow|sudoers)/u,/\beval\b/u,/wget\s+-O\s*-\s*\|\s*(?<wgetShell>bash|sh)/u,/curl\s+.*\|\s*(?<curlShell>bash|sh)/u,/crontab\s+-r/u],ut=/^(?<command>ls|cat|head|tail|git status|git diff|git log|git branch|find|grep|rg|pnpm test|npm test|pwd|which)\b/u,dt=e=>{let t=e.trim();if(t.includes(`$(`)||t.includes("`"))return!1;let n=t.replaceAll(/\d?>&[12]/gu,``);return!n.includes(`>`)&&n.split(/[\n;&|]+/u).every(e=>ut.test(e.trim()))},ft=e=>{for(let t of lt)if(t.test(e))return t;return null},pt=e=>e===`edit`||e===`write`||e===`bash`?`Review mode is active. Report findings, do not edit.`:null,X=e=>typeof e==`object`&&!!e,mt=(e,t)=>t??(e===`task`?`Use 'maestria_subagent' or 'task()' to delegate mutations to specialists.`:`Use 'maestria_subagent' to delegate mutations to specialists.`),Z=(e,t,n,r,i)=>{if(!(e.mode===null||!n.getActiveTools().some(e=>e===r))&&!(!(n.isMutationTool??(e=>{let t=e.toolName??``;return t===`edit`||t===`write`||t===`patch`||t===`bash`||n.extraMutations?.some(e=>e===t)===!0}))(t)||t.toolName===r)){if(n.isBashTool(t)){let e=X(t.input)?t.input:void 0,n=typeof e?.command==`string`?e.command:``;if(dt(n))return}return{block:!0,reason:`Tool '${t.toolName}' is blocked for the orchestrator. ${i}`}}},ht=async(e,t,n)=>{if(!t.isBashTool(e))return;let r=X(e.input)?e.input:void 0;if(!r)return;let{command:i}=r;if(typeof i!=`string`||!i)return;let a=ft(i);if(a&&!(n.hasUI===!0&&n.ui&&await n.ui.confirm(`Dangerous Pattern Detected`,`This command matches a dangerous pattern:\n${i}\nProceed?`)))return{block:!0,reason:`Command matches dangerous pattern: ${a}`}},gt=(e,t,n)=>{if(n.isReadTool(t)){let n=X(t.input)?t.input.path:void 0;if(typeof n==`string`&&n)return Object.assign(e,ie(e,n)),!0}else if(n.isWriteTool(t)){let n=X(t.input)?t.input.path:void 0;if(typeof n==`string`&&n)return Object.assign(e,re(e,n)),!0}return!1},_t=e=>{let{delegationTool:t}=e,n=mt(t,e.delegationHint),r=()=>{if(e.persist){e.persist();return}e.pi&&y(e.pi,e.getState())};return async(i,a)=>{if(i.toolName===void 0||i.toolName===``)return;let o=e.getState(),{toolName:s}=i,c=Z(o,i,e,t,n);if(c)return c;if(o.reviewMode&&(e.isWriteTool(i)||e.isBashTool(i)))return{block:!0,reason:pt(s)??`Review mode is active. Report findings, do not edit.`};let l=await ht(i,e,a);if(l)return l;gt(o,i,e)&&r()}},vt=e=>({appendEntry:(t,n)=>{e.appendEntry(t,n)},getActiveTools:()=>e.getActiveTools(),on:(t,n)=>{e.on(`tool_call`,async(e,t)=>await n(e,t))}}),yt=(e,t)=>{let n=_t({delegationTool:`subagent`,getActiveTools:()=>e.getActiveTools(),getState:()=>t,isBashTool:e=>e.toolName===`bash`,isMutationTool:e=>e.toolName===`edit`||e.toolName===`write`||e.toolName===`patch`||e.toolName===`bash`,isReadTool:e=>e.toolName===`read`,isWriteTool:e=>e.toolName===`edit`||e.toolName===`write`,persist:()=>{y(e,t)}});e.on(`tool_call`,n)},bt=e=>typeof e==`object`&&!!e,xt=e=>{let t=e?.sessionManager;if(typeof t?.getBranch!=`function`)return null;let n=t.getBranch();return Array.isArray(n)?n:null},Q=e=>{for(let t of Object.keys(e))Reflect.deleteProperty(e,t)},$=(e,t)=>{let n=g(),r=xt(t);if(!r){Q(e),Object.assign(e,n);return}for(let e=r.length-1;e>=0;--e){let t=r[e];if(t.type===`custom`&&t.customType===`maestria_state`){bt(t.data)&&Object.assign(n,t.data);break}}Q(e),Object.assign(e,n)},St=e=>{let t=g(),n=[];Pe(Ne(e),t),je(e,t);let r=Le(t);e.on(`before_agent_start`,(e,t)=>r(e,t)),e.on(`session_start`,(e,n)=>{ne(n),$(t,n)}),e.on(`session_tree`,(e,n)=>{$(t,n)}),C(S(e),t),st(ct(e),t,n),ve(_e(e),t),e.on(`session_shutdown`,()=>{for(let e of n)e();n.length=0}),yt(vt(e),t)};export{St as default};
9
+ `),type:`text`}],details:{subagentIds:t}}},qe=async(e,t,n,r,i,a)=>{a?.({content:[{text:`Spawning ${r.length} parallel subagents...`,type:`text`}]});let o=We(e,t,n,r),s=await Ge(o,r,n,i,a);return a?.({content:[{text:`All ${r.length} parallel subagents settled.`,type:`text`}]}),Ke(r,o,s)},Je=(e,t)=>e.replaceAll(`{previous}`,()=>t),Z=async(e,t,n,r,i,a,o,c)=>{if(o>=r.length)return c;let l=r[o],u=o>0?Je(l.task,c):l.task,d=n.spawn(l.agent,u,{description:u.slice(0,80),foreground:!0,inheritContext:!0});X(e,t,l.agent,u),a?.({content:[{text:`Chain step ${o+1}/${r.length}: ${l.agent} running...`,type:`text`}]});let f;try{let e=await s.runPromise(Y({id:d,intervalMs:500,label:`Chain step ${o+1}: ${l.agent}`,onUpdate:a,sendUpdates:!0,service:n,signal:i,timeoutMs:q}));f=e.result??e.error??`No output.`}catch(e){return`[error] ${e instanceof Error?e.message:String(e)}`}return o<r.length-1&&a?.({content:[{text:`Chain step ${o+1}/${r.length}: ${l.agent} completed. Moving to next step.`,type:`text`}]}),await Z(e,t,n,r,i,a,o+1,f)},Ye=async(e,t,n,r,i,a)=>({content:[{text:await Z(e,t,n,r,i,a,0,``),type:`text`}],details:{subagentId:`chain-completed`}}),Xe=async(e,t,n,r,i,a)=>{let o=r.mode??`single`;if(o===`single`){if(typeof r.agent!=`string`||typeof r.task!=`string`)throw TypeError(`Single mode requires an agent and task`);return await Ue(e,t,n,r.agent,r.task,i,a)}if((o===`parallel`||o===`chain`)&&Array.isArray(r.tasks))return await(o===`parallel`?qe(e,t,n,r.tasks,i,a):Ye(e,t,n,r.tasks,i,a));throw Error(`Unknown dispatch mode`)},Ze=c.Object({agent:c.String({description:`Specialist agent name (required): adventurer, architect, builder, diagnose, planner, reviewer, writer`}),mode:c.Optional(c.Union([c.Literal(`parallel`),c.Literal(`chain`),c.Literal(`single`)])),task:c.String({description:`Task description for the subagent (required)`}),tasks:c.Optional(c.Array(c.Object({agent:c.String(),task:c.String()}),{description:`Array of task objects for parallel or chain dispatch`}))}),Qe=()=>({content:[{text:[`## Subagent Dispatch Unavailable`,``,"The `@gotgenes/pi-subagents` extension is required for subagent dispatch but has not been loaded.",``,`Install it as a Pi extension:`,``,"```",`pi install npm:@gotgenes/pi-subagents`,"```",``,`Then restart your Pi session.`].join(`
10
+ `),type:`text`}],details:{}}),$e=(e,t)=>({content:[{text:[`## Subagent Handoff Required`,``,`**From:** orchestrator`,`**To:** ${e}`,`**Task:** ${t}`,``,`Subagent dispatch failed. Please delegate this work manually.`].join(`
11
+ `),type:`text`}],details:{}}),et=async(e,t,n,r,i)=>{let{getSubagentsService:a}=await import(`@gotgenes/pi-subagents`),o=a();if(!o||typeof o.spawn!=`function`)return Qe();try{return await Xe(e,t,o,n,r,i)}catch(e){console.warn(`[maestria] Subagent dispatch failed:`,e);let t=n.agent??n.tasks?.[0]?.agent??`unknown`,r=n.task??n.tasks?.map(e=>e.task).join(`; `)??`unknown`;return $e(t,r)}},tt=(e,t)=>({description:`Dispatch a task to a @gotgenes/pi-subagents specialist subagent`,async execute(n,r,i,a,o){if(t.reviewMode)return{content:[{text:`Subagent dispatch is not available during review mode. Use /restore-model to exit review mode first.`,type:`text`}],details:{}};let s=He(r);return s.startsWith(`Invalid`)?{content:[{text:`${s} Re-dispatch with a valid agent name; the orchestrator may continue read-only exploration while the brief is corrected.`,type:`text`}],details:{}}:await et(e,t,r,i,a?e=>{a({content:e.content.map(({text:e})=>({text:e,type:`text`})),details:e.details??{}})}:void 0)},label:`Maestria Subagent`,name:`maestria_subagent`,parameters:Ze,promptGuidelines:[`Use maestria_subagent when a task MUST be delegated to a specialist subagent rather than handled directly. Each specialist has focused capabilities: adventurer (recon), architect (design), builder (impl), planner (planning), diagnose (bugs), reviewer (QA), writer (docs).`],promptSnippet:`Delegate tasks to @maestria specialist subagents (adventurer, architect, builder, planner, diagnose, reviewer, writer)`}),nt=(e,t,n)=>{e.registerTool(tt(e,t)),Ve(e,t,n)},Q=e=>({appendEntry:(t,n)=>{e.appendEntry(t,n)},events:e.events,registerTool:t=>{e.registerTool(u({...t,async execute(e,n,r,i,a){return await t.execute(e,n,r,i,a)}}))}}),rt=[/rm\s+-rf\s+\//u,/dd\s+if=/u,/>\s*\/dev\/sd/u,/chmod\s+-R\s+777\s+\//u,/mkfs\.\w+/u,/:\(\)\{ :\|:& \};:/u,/>\s*\/etc\/(?<targetFile>passwd|shadow|sudoers)/u,/\beval\b/u,/wget\s+-O\s*-\s*\|\s*(?<wgetShell>bash|sh)/u,/curl\s+.*\|\s*(?<curlShell>bash|sh)/u,/crontab\s+-r/u],it=/^(?<command>ls|cat|head|tail|git status|git diff|git log|git branch|find|grep|rg|pnpm test|npm test|pwd|which)\b/u,at=e=>{let t=e.trim();if(t.includes(`$(`)||t.includes("`"))return!1;let n=t.replaceAll(/\d?>&[12]/gu,``);return!n.includes(`>`)&&n.split(/[\n;&|]+/u).every(e=>it.test(e.trim()))},ot=e=>{for(let t of rt)if(t.test(e))return t;return null},st=e=>e===`edit`||e===`write`||e===`bash`?`Review mode is active. Report findings, do not edit.`:null,$=e=>typeof e==`object`&&!!e,ct=(e,t)=>t??(e===`task`?`Use 'maestria_subagent' or 'task()' to delegate mutations to specialists.`:`Use 'maestria_subagent' to delegate mutations to specialists.`),lt=(e,t,n,r,i)=>{if(e.mode!==null&&n.getActiveTools().some(e=>e===r)&&(n.isMutationTool??(e=>{let t=e.toolName??``;return t===`edit`||t===`write`||t===`patch`||t===`bash`||n.extraMutations?.some(e=>e===t)===!0}))(t)&&t.toolName!==r){if(n.isBashTool(t)){let e=$(t.input)?t.input:void 0,n=typeof e?.command==`string`?e.command:``;if(at(n))return}return{block:!0,reason:`Tool '${t.toolName}' is blocked for the orchestrator. ${i}`}}},ut=async(e,t,n)=>{if(!t.isBashTool(e))return;let r=$(e.input)?e.input:void 0;if(!r)return;let{command:i}=r;if(typeof i!=`string`||!i)return;let a=ot(i);if(a&&!(n.hasUI===!0&&n.ui&&await n.ui.confirm(`Dangerous Pattern Detected`,`This command matches a dangerous pattern:\n${i}\nProceed?`)))return{block:!0,reason:`Command matches dangerous pattern: ${a}`}},dt=(e,t,n)=>{if(n.isReadTool(t)){let n=$(t.input)?t.input.path:void 0;if(typeof n==`string`&&n)return Object.assign(e,te(e,n)),!0}else if(n.isWriteTool(t)){let n=$(t.input)?t.input.path:void 0;if(typeof n==`string`&&n)return Object.assign(e,ee(e,n)),!0}return!1},ft=e=>{let{delegationTool:t}=e,n=ct(t,e.delegationHint),r=()=>{if(e.persist){e.persist();return}e.pi&&m(e.pi,e.getState())};return async(i,a)=>{if(i.toolName===void 0||i.toolName===``)return;let o=e.getState(),{toolName:s}=i,c=lt(o,i,e,t,n);if(c)return c;if(o.reviewMode&&(e.isWriteTool(i)||e.isBashTool(i)))return{block:!0,reason:st(s)??`Review mode is active. Report findings, do not edit.`};let l=await ut(i,e,a);if(l)return l;dt(o,i,e)&&r()}},pt=(e,t)=>{let n=ft({delegationTool:`subagent`,getActiveTools:()=>e.getActiveTools(),getState:()=>t,isBashTool:e=>e.toolName===`bash`,isMutationTool:e=>e.toolName===`edit`||e.toolName===`write`||e.toolName===`patch`||e.toolName===`bash`,isReadTool:e=>e.toolName===`read`,isWriteTool:e=>e.toolName===`edit`||e.toolName===`write`,persist:()=>{m(e,t)}});e.on(`tool_call`,n)},mt=e=>{let t=d(),n=[];ke(e,t),De(e,t);let r=Me(t);e.on(`before_agent_start`,(e,t)=>r(e,t)),e.on(`session_start`,(e,n)=>{me(),v(t,_(g(n)))}),e.on(`session_tree`,(e,n)=>{v(t,_(g(n)))}),b(e,t),nt(Q(e),t,n),ue(k(e),t),e.on(`session_shutdown`,()=>{for(let e of n)e();n.length=0}),pt(e,t)};export{mt as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maestria/pi",
3
- "version": "0.7.7",
3
+ "version": "0.7.8",
4
4
  "description": "Maestria extension for the Pi coding agent",
5
5
  "keywords": [
6
6
  "agent-orchestration",
@@ -27,14 +27,14 @@
27
27
  "provenance": true
28
28
  },
29
29
  "dependencies": {
30
- "effect": "4.0.0-rc.111"
30
+ "effect": "4.0.0-rc.113"
31
31
  },
32
32
  "devDependencies": {
33
- "@types/node": "^26.2.0",
34
- "typescript": "^7.0.2",
35
- "vitest": "4.1.11",
36
33
  "@maestria/core": "0.8.5",
37
- "@maestria/shared-pi": "0.4.0"
34
+ "@maestria/shared-pi": "0.4.0",
35
+ "@types/node": "^26.5.1",
36
+ "typescript": "^7.0.2",
37
+ "vitest": "4.1.11"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "@earendil-works/pi-coding-agent": "^0.84.1",