@aelinrezende/pipa-core 1.0.3 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -4,16 +4,22 @@ SDK para criar extensões do Pi com features reutilizáveis, API de execução e
|
|
|
4
4
|
|
|
5
5
|
Inclui `applyFeatures`, `PipaBaseFeature`, `PipaEvent`, `PipaApi` e o mapa `DomainEventMap`.
|
|
6
6
|
|
|
7
|
-
## Instalação
|
|
7
|
+
## Instalação
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
O pacote está publicado no npm:
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
npm install @aelinrezende/pipa-core
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Também funciona com `bun add @aelinrezende/pipa-core` ou `pnpm add @aelinrezende/pipa-core`.
|
|
16
|
+
|
|
17
|
+
### Desenvolvimento local
|
|
14
18
|
|
|
15
|
-
|
|
16
|
-
|
|
19
|
+
Para buildar o SDK a partir do fonte, clone `github.com/aelinrezende/pipa-source` e rode o build na pasta `.pi`:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
bun run scripts/build-core.ts
|
|
17
23
|
```
|
|
18
24
|
|
|
19
25
|
O build gera `dist-core/`, incluindo `index.js`, declarações TypeScript, `package.json` e uma cópia deste README.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"teammate-tree.widget.d.ts","sourceRoot":"","sources":["../../../../../../extensions/pipa/features/teammate/tui/teammate-tree.widget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAMlD,OAAO,EACL,kBAAkB,EAKlB,KAAK,QAAQ,EACd,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,KAAK,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;;AAEvC,qBAAa,kBAAmB,SAAQ,uBAAqD;IAEzF,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAHxB,YACmB,GAAG,EAAE,GAAG,EACR,YAAY,EAAE,MAAM,QAAQ,EAAE,EAC9B,KAAK,EAAE,KAAK,EAG9B;IAED,KAAK,IAAI,IAAI,CAEZ;IAED,IAAI,IAAI,IAAI,CAEX;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAmB9B;IAED,UAAU,IAAI,IAAI,CAEjB;IAED,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"teammate-tree.widget.d.ts","sourceRoot":"","sources":["../../../../../../extensions/pipa/features/teammate/tui/teammate-tree.widget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAMlD,OAAO,EACL,kBAAkB,EAKlB,KAAK,QAAQ,EACd,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,KAAK,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;;AAEvC,qBAAa,kBAAmB,SAAQ,uBAAqD;IAEzF,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAHxB,YACmB,GAAG,EAAE,GAAG,EACR,YAAY,EAAE,MAAM,QAAQ,EAAE,EAC9B,KAAK,EAAE,KAAK,EAG9B;IAED,KAAK,IAAI,IAAI,CAEZ;IAED,IAAI,IAAI,IAAI,CAEX;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAmB9B;IAED,UAAU,IAAI,IAAI,CAEjB;IAED,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAqDhD;IAED,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,WAAW;IAsBnB,OAAO,CAAC,YAAY;CA4BrB"}
|
package/index.js
CHANGED
|
@@ -138,7 +138,7 @@ ${Z}`:Z}case"replace":return X.replace(JQ(q.value),JQ(q.replacement));default:th
|
|
|
138
138
|
## Colaboração e Delegação
|
|
139
139
|
`,"Você tem autonomia para delegar tarefas.",`Abaixo estão os colegas que você pode acionar e os motivos para invocá-los:
|
|
140
140
|
|
|
141
|
-
`);$.systemPrompt+=W,$.systemPrompt+=Tq.unorderedList(U,({name:H,description:K})=>{return[H,p(K,J.frontmatter?.spawnableTeammates?.[H]??"—")]},"Nenhum colega encontrado.")}return $}updateInstanceOnAgentStart($,q){s.update(q.sessionId,{pipa:q})}}D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],nW.prototype,"initializeSession",null),D$([Y$("before_agent_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",Promise)],nW.prototype,"mitigateModelConcurrency",null),D$([Y$("before_agent_start"),h("design:type",Function),h("design:paramtypes",[typeof BeforeAgentStartEvent==="undefined"?Object:BeforeAgentStartEvent,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",typeof BeforeAgentStartEventResult==="undefined"?Object:BeforeAgentStartEventResult)],nW.prototype,"injectExecutionContext",null),D$([Y$("agent_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],nW.prototype,"updateInstanceOnAgentStart",null);class pj{intervals=new Set;every($,q){this.intervals.add(setInterval(q,$))}everyForTeammate($,q,J){this.every(q,()=>{let X=s.find($);if(!X)return;J(X)})}everyWhenTeammateIs($,q,J,X,Z){this.everyForTeammate(q,X,(U)=>{if(U.status!==$)return;let W=U.lastActiveAt??U.startedAt;if(Date.now()-W<J)return;Z(U)})}everyWhenTeammateFailed($,q,J){this.everyForTeammate($,q,(X)=>{if(X.status!=="failed")return;J(X)})}clearAll($){let{role:q}=s.find($)||{};if(q==="main")return;this.intervals.forEach(clearInterval),this.intervals.clear()}}class C8{sessionIntervals=new pj}var jJ$=60000,mJ$=300000,fJ$=3,xJ$=180000,IJ$=30000;class iW extends C8{failCount=0;removeInactiveTeammate($,q){let{role:J}=s.find(q.sessionId)||{};if(J==="main")return;this.sessionIntervals.everyWhenTeammateIs("idle",q.sessionId,mJ$,jJ$,()=>this.shutdown(void 0,q))}abortStuckTeammate($,q){let{role:J}=s.find(q.sessionId)||{};if(J==="main")return;this.sessionIntervals.everyWhenTeammateIs("running",q.sessionId,xJ$,IJ$,async(X)=>{await X.session?.abort(),q.nudge("teammates.stuck","Operação abortada por inatividade",["A sua operação atual estava demorando muito (mais de 3 minutos sem atualizações) e foi abortada para destravar você.","Por favor, verifique se há algo bloqueando a ferramenta e tente novamente ou mude sua abordagem."])})}setRunningStatus($,q){if(s.find(q.sessionId)?.isStopping)return;s.update(q.sessionId,{status:"running",lastActiveAt:Date.now()})}handleAgentEnd($,q){let J=s.find(q.sessionId),{status:X}=J||{};if(X==="failed"||J?.isStopping)return;s.update(q.sessionId,{status:"idle",lastTool:void 0}),q.toast.show("Colega [name] está aguardando instruções.")}async handleAgentFail($,q){if(!mJ($.message))return;if($.message.stopReason!=="error"){this.failCount=0;return}if(s.find(q.sessionId)?.isStopping)return;if(s.update(q.sessionId,{status:"failed"}),$.type!=="message_end")return;this.failCount++;let J=s.get(q.sessionId);if(!J.parentSessionId)return;if(k6.teammate.cycling.events.includes("error")&&this.failCount>=fJ$)this.failCount=0,await q.cycleModel();s.find(J.parentSessionId)?.pipa?.nudge("teammates.failed",[`Colega ${J.name} <${J.sessionId}> encontrou um erro e parou de funcionar.`])}async shutdown($,q){this.sessionIntervals.clearAll(q.sessionId);let J=s.find(q.sessionId);if(!J||J.isStopping||J.role==="main"||!J.parentSessionId||o.hasActiveTask(J.sessionId))return;s.update(J.sessionId,{status:"stopping"}),s.get(J.parentSessionId).pipa?.nudge("teammates.shutdown",`Colega ${J.name} <${J.sessionId}> encerrando...`),await J.session?.abort(),q.context.shutdown(),s.delete(q.sessionId)}}D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],iW.prototype,"removeInactiveTeammate",null),D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],iW.prototype,"abortStuckTeammate",null),D$([Y$("agent_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],iW.prototype,"setRunningStatus",null),D$([Y$("agent_end"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],iW.prototype,"handleAgentEnd",null),D$([Y$("message_start"),Y$("message_update"),Y$("message_end"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",Promise)],iW.prototype,"handleAgentFail",null),D$([Y$("session_shutdown"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",Promise)],iW.prototype,"shutdown",null);class oW{handleActivityEvent($,q){if(!s.find(q.sessionId))return;let X=$.args||$.input;s.update(q.sessionId,{lastActiveAt:Date.now(),lastEvent:$.type,lastTool:`${$.toolName}${X?`(${JSON.stringify(X)})`:""}`})}logTeammateMessages($,q){let J=s.get(q.sessionId);new e0(J.workspaceDir).save("messages.json",[{content:JSON.stringify($.message,null,0),timestamp:Date.now()}])}}D$([Y$("tool_call"),Y$("tool_result"),Y$("tool_execution_start"),Y$("tool_execution_update"),Y$("tool_execution_end"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],oW.prototype,"handleActivityEvent",null),D$([Y$("message_start"),h("design:type",Function),h("design:paramtypes",[typeof MessageEndEvent==="undefined"?Object:MessageEndEvent,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",Object)],oW.prototype,"logTeammateMessages",null);var _J$=300000,kJ$=15000,bJ$=60000;class sW extends C8{lastIdleNudgeAt=0;idleNudgeCount=0;failure={};nudgeInbox($,q){this.sessionIntervals.everyForTeammate(q.sessionId,60000,(J)=>{if(J.isStopping)return;let Z=new e0(J.workspaceDir).read("inbox.json")||[];if(!Z.length)return;q.nudge("teammates.inbox",`Você tem **${Z.length}** nova(s) mensagem(ns) na sua caixa de entrada. Leia quando puder`,{action:"teammates.read-inbox"})})}nudgeIdleTeammate($,q){this.sessionIntervals.everyWhenTeammateIs("idle",q.sessionId,_J$,kJ$,(J)=>{if(J.isStopping||this.idleNudgeCount>=2)return;if(Date.now()-this.lastIdleNudgeAt<bJ$)return;if(J.role==="main")return;if(s.listSubordinates(q.sessionId).some((Z)=>Z.isRunning))return;this.lastIdleNudgeAt=Date.now(),this.idleNudgeCount++,q.nudge("teammates.idle",`Acordando ${J.name}`,["Você está sem executar ações há 1 minuto.","Continue trabalhando no seu objetivo ou reporte um bloqueio ao supervisor."])})}nudgeFailedTeammate($,q){this.sessionIntervals.everyWhenTeammateFailed(q.sessionId,30000,(J)=>{if(J.isStopping||J.session?.isRetrying)return;let X=s.find(J.parentSessionId??"");if(!X?.isStopping)X?.pipa?.nudge("teammates.failed",`Tentando acordar ${J.name}...`);q.nudge("teammates.failed",`Recuperando ${J.name}`,[`Ei, ${J.name}. Parece que você teve um problema na última execução.`,"Detalhes:",Tq.unorderedList([`Último evento: ${J.lastEvent??"nenhum"}.`,`Status code: ${this.failure.code}.`,`Mensagem: ${this.failure.error?.slice(0,100)}.`]),"Tente retomar a tarefa."])})}async handleAgentFail($,q){if(!mJ($.message))return;if($.message.stopReason!=="error")return;let J=$.message.diagnostics?.[0]?.error;this.failure.code=J?.code,this.failure.error=J?.message}handleIdleActivityEvent(){this.lastIdleNudgeAt=0,this.idleNudgeCount=0}clearReminders($,q){this.sessionIntervals.clearAll(q.sessionId),this.lastIdleNudgeAt=0,this.idleNudgeCount=0}}D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],sW.prototype,"nudgeInbox",null),D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],sW.prototype,"nudgeIdleTeammate",null),D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],sW.prototype,"nudgeFailedTeammate",null),D$([Y$("message_start"),Y$("message_update"),Y$("message_end"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",Promise)],sW.prototype,"handleAgentFail",null),D$([Y$("tool_call"),Y$("tool_result"),Y$("tool_execution_start"),Y$("tool_execution_update"),Y$("tool_execution_end"),h("design:type",Function),h("design:paramtypes",[]),h("design:returntype",void 0)],sW.prototype,"handleIdleActivityEvent",null),D$([Y$("session_shutdown"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],sW.prototype,"clearReminders",null);class rW{clearStoppingContext($,q){if(!s.find(q.sessionId)?.isStopping)return;return{messages:[]}}}D$([Y$("context"),h("design:type",Function),h("design:paramtypes",[typeof ContextEvent==="undefined"?Object:ContextEvent,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",Object)],rW.prototype,"clearStoppingContext",null);var nj=b$(x0(),1),ij=b$(f6(),1);import{truncateToWidth as vJ$}from"@earendil-works/pi-tui";class b4{constructor($){Object.assign(this,$)}id;sessionId;text;status;get isPending(){return this.status==="pending"}get isInProgress(){return this.status==="in_progress"}get isCompleted(){return this.status==="completed"}}class t0{static get store(){let $=E0.get("TODO_STORE");if(!$)$=E0.set("TODO_STORE",new Map);return $}static load($,q){let X=new e0($).read("todo.json")??[];t0.clear(q),X.forEach((Z)=>t0.add(new b4({...Z,sessionId:q})))}static add($){return this.store.set($.id,$),$}static update($,q){let J=this.store.get($);if(!J)return;let X=Object.assign(new b4({}),J,q);return this.store.set($,X),X}static delete($){this.store.delete($)}static clear($){let q=this.list($);for(let J of q)this.delete(J.id)}static list($){return Array.from(this.store.values()).filter((q)=>q.sessionId===$)}static get($){return this.store.get($)}}var aW={update:{code:"todo.update",get failed(){return[this.code,"Falha durante atualização"]}},remove:{code:"todo.remove",get failed(){return[this.code,"Falha durante remoção"]}}};class j5{canUpdate($,q){let J=t0.get(q);if(J?.sessionId!==$)throw new O$(...aW.update.failed,`Item com ID "${q}" não encontrado na lista de afazeres.`);return J}canRemove($,q){let J=t0.get(q);if(J?.sessionId!==$)throw new O$(...aW.remove.failed,`Item com ID "${q}" não encontrado na lista de afazeres.`);return J}}class eW extends j5{pipa;fileManager;constructor($){super();this.pipa=$;let q=s.get($.sessionId);this.fileManager=new e0(q.workspaceDir)}get sessionId(){return this.pipa.sessionId}persist(){this.fileManager.save("todo.json",t0.list(this.sessionId),($)=>$)}update({id:$,action:q,...J}){let X=this.canUpdate(this.sessionId,$),Z=t0.update($,J);return this.persist(),this.pipa.events.emit("todo_updated",Z??X),Z??X}remove({id:$}){let q=this.canRemove(this.sessionId,$);t0.delete($),this.persist(),this.pipa.events.emit("todo_removed",q)}clear(){t0.clear(this.sessionId),this.persist(),this.pipa.events.emit("todo_cleared",{sessionId:this.sessionId})}list(){return t0.list(this.sessionId)}}class tW{step=0;animationInterval;startAnimation($,q=80){if(this.animationInterval)clearInterval(this.animationInterval);this.animationInterval=setInterval(()=>{this.step++,$.requestRender()},q)}stopAnimation(){if(this.animationInterval)clearInterval(this.animationInterval),this.animationInterval=void 0}}class $w extends ij.Mixin(w5,tW){tui;getTeammates;theme;constructor($,q,J){super();this.tui=$;this.getTeammates=q;this.theme=J}start(){this.startAnimation(this.tui,120)}stop(){this.stopAnimation()}render($){let q=this.getTeammates(),J=BQ({items:q,getId:(Z)=>Z.sessionId,getParentId:(Z)=>Z.parentSessionId,sortNodes:(Z)=>nj.sortBy(Z,[(U)=>U.startedAt??0])}).flatMap((Z)=>Z.role==="main"?Z.children:[Z]);if(!J.length)return[this.theme.fg("accent","Colegas"),this.theme.fg("dim","○ nenhum colega ativo")];return[this.theme.fg("accent","Colegas"),...J.flatMap((Z,U)=>this.renderNode(Z,"",U===J.length-1))].map((Z)=>vJ$(Z,$))}invalidate(){return}renderLabel($){let q=this.theme.fg("text",$.name),J={name:q,tool:"",tokens:"",model:"",todos:""};if($.status==="idle")J.name=this.theme.fg("dim",$.name);else J.name=this.theme.bold(q);let X=this.colorStatus($),Z=this.theme.fg("dim",this.elapsedLabel($));if(!k6.teammate.hideModelName)J.model=this.theme.fg("dim",`(${$.session?.model?.id})`);if($.lastTool&&!k6.teammate.hideTools)J.tool=this.theme.fg("dim",$.lastTool);let U=t0.list($.sessionId);if(U.length)J.todos=this.theme.fg("dim",`passos: ${U.filter((K)=>K.isCompleted).length}/${U.length}`);let W=$.session?.getSessionStats();if(W?.tokens)J.tokens=this.theme.fg("dim",`${G4(W.tokens.input)}↑ ${G4(W.tokens.output)}↓`);let H=PM(this.theme,"·",J.name,J.model,X,Z,J.todos,J.tokens,J.tool);return`${this.statusIcon($)} ${H}`}statusIcon($){switch($.status){case"failed":return this.theme.fg("error","×");case"running":return this.theme.fg("accent","●");default:return this.theme.fg("dim","○")}}colorStatus($){let q=$.status,J=hj[q];switch(q){case"failed":return this.theme.fg("error",J);case"running":return cM({step:this.step,seedString:$.sessionId});case"idle":return this.theme.fg("accent",J);case"stopping":return this.theme.fg("warning",J);default:return this.theme.fg("dim",J)}}elapsedLabel($){if($.status==="idle")return"aguardando início";if($.status==="failed")return"erro \uD83D\uDE35";if($.isStopping)return"";let q=$.lastActiveAt;if(!q)return"";let J=Date.now(),X=Math.max(0,J-q),Z=Math.floor(X/1000),U=Math.floor(Z/60),W=Z%60;return`última ação há ${U>0?`${U}m ${W}s`:`${W}s`}`}}class qw{captureMain($,q){if(s.get(q.sessionId).role!=="main")return;Y9().context.ui.setWidget("pipa.teammates",(X,Z)=>{let U=new $w(X,s.list,Z);return U.start(),{render:(W)=>U.render(W),invalidate:()=>U.invalidate(),dispose:()=>U.stop()}},{placement:"aboveEditor"})}}D$([Y$("before_agent_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],qw.prototype,"captureMain",null);var oj=b$(f6(),1);import gJ$ from"node:path";class e9 extends oj.Mixin(mU,V5){pipa;folder;constructor($,q){super($);this.pipa=$;this.folder=q}instantiate($){let q=$.task;this.canCreate(q.name,q.blockedBy);let J=B0.get(this.pipa.sessionId),X=this.getParentSquadTask(q.squad)??o.getActiveTask(J.parentSessionId??""),Z=this.pipa.sessionId,U=Date.now(),W=m9(),H={...q,id:W,status:"pending",role:J.name,blockedBy:q.blockedBy||[],directory:gJ$.join(W8,W),parentTaskId:X?.id??q.parentTaskId,squad:X?.squad??q.squad,creatorId:Z,createdAt:U};if(o.add(H),H.parentTaskId)o.update(H.parentTaskId,{status:"in-progress"});return this.pipa.events.emit("task_created",H),this.notifyEligibleIdleTeammates(),H}}var Jw=30000,hJ$=120000,Xw=120000;class Zw extends C8{lastCreatorNudge=new Map;lastTeammateNudge=new Map;nudgeCreatorAboutUnownedTasks(){this.sessionIntervals.every(Jw,()=>{let $=Date.now();e9.listAvailable().forEach((J)=>{let X=s.find(J.creatorId);if(!X?.pipa||X.isStopping)return;if($-J.createdAt<hJ$)return;let U=this.lastCreatorNudge.get(J.id)||0;if($-U<Xw)return;this.lastCreatorNudge.set(J.id,$),X.pipa.nudge("task.reminder","Lembrete: Existem tarefas pendentes prontas para execução.",{action:"task.reminder",message:"As seguintes tarefas estão pendentes, sem proprietário e com todos os bloqueios resolvidos.",tasks:[v4.pick(J,["id","name"])],instructions:["Você deve reivindicar essas tarefas para começar a trabalhar.","Execute: 'task claim ID_DA_TAREFA'"]})})})}nudgeIdleTeammatesAboutAvailableTasks(){this.sessionIntervals.every(Jw,()=>{let $=Date.now(),q=e9.listAvailable();if(q.length===0)return;s.list().filter(({status:X,role:Z})=>X==="idle"&&Z==="subagent").forEach((X)=>{if(!X.pipa||X.isStopping)return;let Z=q.filter((W)=>e9.isEligibleForTask(W,X));if(Z.length===0)return;let U=this.lastTeammateNudge.get(X.sessionId)||0;if($-U<Xw)return;this.lastTeammateNudge.set(X.sessionId,$),X.pipa.nudge("task.available",`Tarefa disponível para o colega ${X.name}.`,{action:"task.available",message:"As seguintes tarefas estão livres, sem bloqueios e prontas para o seu papel.",tasks:v4.map(Z,["id","name"]),instructions:["Você está ocioso no momento.","Você deve reivindicar uma dessas tarefas para começar a trabalhar nela.","Execute: 'task claim ID_DA_TAREFA'"]})})})}nudgeIdleTeammatesWithActiveTasks(){this.sessionIntervals.every(Jw,()=>{let $=s.list().filter(({status:J,role:X})=>J==="idle"&&X==="subagent");if($.length===0)return;let q=v4.keyBy(e9.listActive().filter((J)=>J.owner),(J)=>J.owner.sessionId);$.forEach((J)=>{if(!J.pipa||J.isStopping)return;let X=q[J.sessionId];if(!X)return;let Z=Date.now(),U=this.lastTeammateNudge.get(J.sessionId)||0;if(Z-U<Xw)return;if(s.listSubordinates(J.sessionId).some((W)=>W.isRunning))return;this.lastTeammateNudge.set(J.sessionId,Z),J.pipa.nudge("task.reminder",`Aviso de inatividade com tarefa pendente: ${X.name}.`,{action:"task.reminder",message:`Você está ocioso mas possui a tarefa [${X.id}] ${X.name} em andamento.`,instructions:["Se você já concluiu seu trabalho, você DEVE finalizá-la.",`Execute: 'task complete ${X.id}'`,"Caso contrário, retome o trabalho informando seu supervisor."]})})})}shutdown($,q){this.sessionIntervals.clearAll(q.sessionId)}}D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[]),h("design:returntype",void 0)],Zw.prototype,"nudgeCreatorAboutUnownedTasks",null),D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[]),h("design:returntype",void 0)],Zw.prototype,"nudgeIdleTeammatesAboutAvailableTasks",null),D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[]),h("design:returntype",void 0)],Zw.prototype,"nudgeIdleTeammatesWithActiveTasks",null),D$([Y$("session_shutdown"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],Zw.prototype,"shutdown",null);var sj=b$(x0(),1);import{truncateToWidth as yJ$}from"@earendil-works/pi-tui";var cJ$={"in-progress":0,pending:1,stopped:2,completed:3};class Qw extends w5{getTasks;theme;constructor($,q){super();this.getTasks=$;this.theme=q}expanded=!1;render($){let q=this.getTasks(),J=BQ({items:q.filter((K)=>!K.isSetup),getId:(K)=>K.id,getParentId:(K)=>K.parentTaskId,sortNodes:(K)=>sj.orderBy(K,[(F)=>cJ$[F.status]??1,"completedAt"],["asc","desc"])}),X=J.flatMap((K,F)=>this.renderNode(K,"",F===J.length-1)),Z=this.expanded?X:X.slice(0,k6.tasks.maxVisible),U=X.length-Z.length;if(!Z.length)return[this.theme.fg("accent","Tarefas"),this.theme.fg("dim","○ nenhuma tarefa ativa")];let W=[this.theme.fg("accent","Tarefas"),...Z],H={[String(!1)]:`ver mais ${U} tarefa${U>1?"s":""} (ctrl+t)`,[String(!0)]:"recolher (ctrl+t)"};if(U||this.expanded&&X.length>k6.tasks.maxVisible)W.push(this.theme.fg("dim",H[String(this.expanded)]));return W.map((K)=>yJ$(K,$))}invalidate(){return}toggle(){this.expanded=!this.expanded}renderLabel($){return`${this.statusIcon($)} ${this.label($)}`}statusIcon($){if(o.hasUncompletedHardDependency($))return this.theme.fg("warning","⚠");switch($.status){case"in-progress":return this.theme.fg("accent","●");case"completed":return this.theme.fg("success","✓");case"stopped":return this.theme.fg("error","×");default:return this.theme.fg("dim","○")}}label($){let q=this.theme.fg("text",nM($.name,50)),J=$.parentTaskId?"":iM($.squad,this.theme),X=this.colorStatus($),Z=$.owner?` · ${$.owner.name}`:" · não atribuído";return`${q}${J} ${X}${this.theme.fg("dim",Z)}`}colorStatus($){if(o.hasUncompletedHardDependency($))return this.theme.fg("warning","(bloqueada)");let q=gL[$.status];switch($.status){case"in-progress":return this.theme.fg("accent",`(${q})`);case"completed":return this.theme.fg("success",`(${q})`);case"stopped":return this.theme.fg("error",`(${q})`);default:return this.theme.fg("dim",`(${q})`)}}}import{Key as dJ$,matchesKey as uJ$}from"@earendil-works/pi-tui";class Yw{captureMain($,q){if(B0.get(q.sessionId).role!=="main")return;Y9().context.ui.setWidget("pipa.tasks",(X,Z)=>{let U=new Qw(o.list,Z),W=setInterval(X.requestRender.bind(X),1000),H=Y9().context.ui.onTerminalInput((K)=>{if(uJ$(K,dJ$.ctrl("t")))return U.toggle(),X.requestRender(),{consume:!0}});return{render:(K)=>U.render(K),invalidate:()=>U.invalidate(),dispose:()=>{clearInterval(W),H()}}},{placement:"aboveEditor"})}}D$([Y$("before_agent_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],Yw.prototype,"captureMain",null);var Ww=b$(x0(),1);var lJ$=["pending","in-progress","completed","stopped"],pJ$=["hard","soft"],Uw=A.Object({name:A.String({description:p("Máximo 50 caracteres",'Ex: "Criar schema de usuário", não frases longas')}),description:A.String({description:p("Descrição detalhada da tarefa em português","Inclua contexto, critérios de aceite e restrições")}),blockedBy:A.Array(A.Object({id:A.String({description:"ID da tarefa dependente. Ex: a1b2c3d4."}),type:A.Union(Ww.map(pJ$,A.Literal),{description:"hard: bloqueio total | soft: alerta informativo"})}),{description:p("Dependências da tarefa","Use hard para bloqueio total e soft para alertas","Garante a ordem correta de execução")}),parentTaskId:A.Optional(A.String({description:p("Se esta tarefa for uma sub-tarefa, informe o ID da tarefa pai (épico)","Omita para criar sem pai")})),squad:A.Optional(A.String({description:p("Nome do squad para agrupar tarefas","Herdado automaticamente no instantiate")}))}),ww={instantiate:A.Object({action:A.Literal("instantiate",{description:"instantiate: nova tarefa"}),task:A.Object(Uw.properties,{description:p("Propriedades da nova tarefa","Campos opcionais (blockedBy, parentTaskId, squad) podem ser omitidos")})},{description:p("Cria uma nova tarefa operacional","Use task.instantiate para delegar trabalho a um colega"),examples:[{action:"instantiate",task:{name:"Criar schema de usuário",description:"Criar o schema de usuário com campos nome, email e role.",blockedBy:[{id:"a1b2c3d4",type:"hard"}],squad:"backend"}}]}),get:A.Object({action:A.Literal("get",{description:"get: obter detalhes de uma tarefa"}),id:A.String({description:"ID da tarefa a ser consultada. Ex: a1b2c3d4."})}),setup:A.Object({action:A.Literal("setup",{description:"setup: definir nome, dependências ou tarefa pai da tarefa pré-gerada"}),id:A.String({description:"ID da tarefa a ser configurada. Ex: a1b2c3d4."}),updates:A.Partial(A.Pick(Uw,["name","blockedBy","parentTaskId"]),{description:p("Campos que deseja configurar","Omita os que não mudarem")})}),update:A.Object({action:A.Literal("update",{description:"update: editar uma tarefa existente"}),id:A.String({description:"ID da tarefa a ser atualizada. Ex: a1b2c3d4."}),updates:A.Partial(Uw,{description:p("Campos que deseja atualizar","Apenas inclua o que mudou; omita o restante")})}),list:A.Object({action:A.Literal("list",{description:"list: tarefas criadas"}),status:A.Optional(A.Union(Ww.map(lJ$,A.Literal),{description:p("Filtrar tarefas por status","Omita para listar todas")}))}),remove:A.Object({action:A.Literal("remove",{description:"remove: exclusão de tarefa"}),id:A.String({description:"ID da tarefa a ser removida. Ex: a1b2c3d4."}),force:A.Optional(A.Boolean({description:p("Forçar remoção de tarefa em andamento","Somente criador ou main"),default:!1}))}),claim:A.Object({action:A.Literal("claim",{description:"claim: reivindicar tarefa para si mesmo"}),id:A.String({description:"ID da tarefa a ser reivindicada. Ex: a1b2c3d4."})}),complete:A.Object({action:A.Literal("complete",{description:"complete: marcar tarefa como concluída"}),id:A.String({description:"ID da tarefa concluída. Ex: a1b2c3d4."}),artifactFile:A.String({description:"Caminho absoluto ou relativo do artefato que comprova o resultado da tarefa. Ex: .artifacts/minha-tarefa/relatorio.md"}),force:A.Optional(A.Boolean({description:p("Forçar conclusão da tarefa","Somente main (supervisor) pode usar force"),default:!1}))}),"list-by-squad":A.Object({action:A.Literal("list-by-squad",{description:"list-by-squad: listar tarefas de um squad"}),squad:A.String({description:"Nome do squad para filtrar. Ex: backend."})}),"squad-status":A.Object({action:A.Literal("squad-status",{description:"squad-status: status de progresso de um squad"}),squad:A.String({description:"Nome do squad para consultar. Ex: backend."})})},rj={get:"Buscando tarefa...",setup:"Configurando tarefa...",list:"Listando tarefas ([status])...",instantiate:"Criando nova tarefa [name]...",update:"Atualizando tarefa...",remove:"Removendo tarefa...",claim:"Reivindicando tarefa...",complete:"Concluindo tarefa...","list-by-squad":"Listando tarefas do squad...","squad-status":"Verificando status do squad..."};class ej extends aj.Mixin(R6,Zw,Yw,pW){loadTasks(){o.load()}initialize($){$.registerTool({name:"task",label:"Gerenciar tarefas",description:p("Gerencia tarefas operacionais criadas por agentes durante a execução","Use para delegar trabalho a colegas, reivindicar, atualizar ou concluir tarefas de um squad","Não use para itens persistentes do projeto (use backlog) nem para seus próprios passos de execução (use todo)"),promptSnippet:"task: tarefas operacionais delegadas a colegas (squad). Para itens do projeto use backlog; para seus passos use todo.",promptGuidelines:['Use "task" para trabalho delegado a colegas: criar, reivindicar, atualizar, concluir ou remover tarefas operacionais.','Não use "task" para itens persistentes do projeto (use "backlog") nem para a sua lista de passos (use "todo").'],parameters:Kq.Union(Object.values(ww),{type:"object",unevaluatedProperties:!1}),execute:async(q,J)=>{let X=new e9(this.pipa,W8),U=j9(X,ww,J)[J.action]();if(U)this.pipa.nudge(`task.${J.action}`,void 0,U);return{content:[{type:"text",text:Q9(rj[J.action],{id:J.id??"",name:J.updates?.name||J.task?.name||"",status:J.status??"all"})}],details:U}}})}}D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[]),h("design:returntype",void 0)],ej.prototype,"loadTasks",null);var $m=b$(f6(),1);var Hw={instantiate:A.Object({action:A.Literal("instantiate",{description:"instantiate: usar quando quiser delegar uma tarefa clara para outro colega."}),name:A.String({description:"Nome do colega, em letra minúscula, que deve receber a tarefa. Ex: giulia, ella, edu."}),goal:A.String({description:p("Objetivo concreto que o colega deve alcançar ao executar a tarefa","Inclua contexto e critérios de aceite")})}),list:A.Object({action:A.Literal("list",{description:p("list: usar para descobrir quais colegas existem antes de escolher um.","Retorna nome, papel e ID de cada colega")})}),online:A.Object({action:A.Literal("online",{description:p("online: usar quando precisar saber quais colegas estão disponíveis agora.","Retorna os IDs dos colegas com sessão ativa")})}),"send-inbox":A.Object({action:A.Literal("send-inbox",{description:p("send-inbox: EXCEÇÃO — use apenas quando o colega está comprovadamente ocupado em outra task e você não quer interromper o fluxo dele.","Se houver dúvida, prefira chat")}),teammateId:A.String({description:p("ID do colega que deve receber a mensagem na inbox","Recupere com list ou online")}),message:A.String({description:"Texto objetivo com contexto, pedido e próximo passo esperado."})}),chat:A.Object({action:A.Literal("chat",{description:p("chat: PADRÃO para comunicação entre colegas.","Use para 99% das interações: pedir status, reportar resultado, solicitar ajuste, validar entrega","Resposta imediata = menos latência no ciclo","Quando em dúvida, prefira chat","Não use para comunicação assíncrona quando o colega estiver ocupado (use send-inbox)")}),teammateId:A.String({description:p("ID do colega com quem você quer falar em tempo real","Recupere com list ou online")}),message:A.String({description:"Mensagem curta e direta para a conversa síncrona."})}),"read-inbox":A.Object({action:A.Literal("read-inbox",{description:p("read-inbox: usar para revisar mensagens pendentes recebidas na inbox.","Retorna as mensagens não lidas")})}),dismiss:A.Object({action:A.Literal("dismiss",{description:"dismiss: usar para encerrar a sessão de um colega que já concluiu suas tarefas."}),teammateId:A.String({description:p("ID do colega que deve ser dispensado","Recupere com list ou online")}),reason:A.String({description:"Motivo objetivo da dispensa (ex: tarefas concluídas, não será mais necessário nas próximas etapas)."})})},tj={instantiate:"Invocando colegas...",list:"Listando colegas...",online:"Listando colegas online...",chat:"Enviando mensagem instantânea ao colega...","send-inbox":"Enviando mensagem assíncrona à inbox do colega...","read-inbox":"Lendo mensagens da inbox...",dismiss:"Dispensando colega..."};class qm extends $m.Mixin(R6,nW,iW,sW,rW,oW,qw){initialize($){$.registerTool({name:"teammates",label:"Gerenciar colegas",description:p("Gerencia colegas (subagentes) que executam tarefas específicas","Use para invocar, listar, conversar, enviar mensagem assíncrona, ler inbox ou dispensar colegas","Não use para gerenciar trabalho do projeto (use backlog, task ou todo)"),promptSnippet:"teammates: colegas (subagentes) que executam tarefas. Use para invocar, listar, conversar (chat) ou dispensar.",promptGuidelines:['Use "teammates" para interagir com colegas: invocar, listar, conversar (chat), enviar mensagem assíncrona (send-inbox) ou dispensar.','Prefira "chat" para comunicação síncrona; reserve "send-inbox" para quando o colega estiver comprovadamente ocupado.'],parameters:Kq.Union(Object.values(Hw),{type:"object",unevaluatedProperties:!1}),execute:async(q,J)=>{let X=new s(this.pipa),U=await j9(X,Hw,J)[J.action]();if(U)this.pipa.nudge(`teammates.${J.action}`,void 0,U);return{content:[{type:"text",text:tj[J.action]}],details:U}}})}}var Qm=b$(f6(),1);var Jm=b$(x0(),1);var nJ$=["pending","in_progress","completed"],Vw={instantiate:A.Object({action:A.Literal("instantiate",{description:"instantiate: adicionar novo passo"}),item:A.String({description:'O texto do passo a ser adicionado. Ex: "Ler o artefato de planejamento antes de codar".'})}),update:A.Object({action:A.Literal("update",{description:p("Atualizar passo existente","Use para marcar como concluído, editar o texto ou reabrir")}),id:A.String({description:p("ID do passo a ser atualizado","Recupere com list")}),status:A.Optional(A.Union(Jm.map(nJ$,A.Literal),{description:p("Novo status: pending, in_progress ou completed","Omita para manter o status atual")})),text:A.Optional(A.String({description:p("Novo texto do passo","Omita para manter o texto atual")}))}),remove:A.Object({action:A.Literal("remove",{description:"Remover passo da lista de afazeres"}),id:A.String({description:p("ID do passo a ser removido","Recupere com list")})}),list:A.Object({action:A.Literal("list",{description:"Listar os passos atuais da lista de afazeres, com status e ID de cada um"})}),clear:A.Object({action:A.Literal("clear",{description:"Limpar todos os passos da lista de afazeres"})})},Xm={instantiate:"Adicionando item à lista de afazeres...",update:"Atualizando item da lista de afazeres...",remove:"Removendo item da lista de afazeres...",list:"Listando lista de afazeres...",clear:"Limpando lista de afazeres..."};var Zm=b$(f6(),1);class Kw extends Zm.Mixin(j5,eW){pipa;constructor($){super($);this.pipa=$}instantiate($){let q=new b4({id:m9(),sessionId:this.sessionId,text:$.item,status:"pending"});return t0.add(q),this.persist(),this.pipa.events.emit("todo_created",q),q}}class zw{promptTodoCreation($,q){let J=s.find(q.sessionId);if(!J||J.role==="main"||J.isStopping)return;if(t0.list(q.sessionId).length>0)return;q.nudge("todo.empty",`Colega ${J.name} não possui afazeres na lista.`,["Parece que você ainda não tem um plano de execução definido.","Por favor, use a ferramenta de afazeres (todo) para criar e gerenciar seu checklist de execução em passos pequenos e atômicos."])}notifyPendingTodos($,q){let J=s.find(q.sessionId);if(!J||J.role==="main"||J.isStopping)return;let X=t0.list(q.sessionId).filter((Z)=>!Z.isCompleted);if(!X.length)return t0.clear(q.sessionId);if(s.listSubordinates(q.sessionId).some((Z)=>Z.isRunning))return;q.nudge("todo.pending",`Colega ${J.name} possui ${X.length} afazer(es) em aberto.`,["Por favor, retome o trabalho nos seguintes afazeres pendentes ou marque-os como concluídos:",Tq.unorderedList(X,(Z)=>[Z.id,Z.text])])}}D$([Y$("agent_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],zw.prototype,"promptTodoCreation",null),D$([Y$("agent_end"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],zw.prototype,"notifyPendingTodos",null);class Ym extends Qm.Mixin(R6,zw){mountPipa(){t0.load(s.get(this.pipa.sessionId).workspaceDir,this.pipa.sessionId)}initialize($){$.registerTool({name:"todo",label:"Gerenciar Lista de Afazeres",description:p("Mantém a sua própria lista de afazeres (passos atômicos) durante a execução","Use para adicionar, atualizar, listar ou remover os passos do seu plano de execução","Não use para itens do projeto (use backlog) nem para trabalho delegado a colegas (use task)"),promptSnippet:"todo: passos atômicos do seu plano de execução. Para itens do projeto use backlog; para trabalho delegado use task.",promptGuidelines:['Use "todo" para o seu próprio plano de execução: passos atômicos que você está executando.','Não use "todo" para itens do projeto (use "backlog") nem para trabalho delegado a colegas (use "task").'],parameters:Kq.Union(Object.values(Vw),{type:"object",unevaluatedProperties:!1}),execute:async(q,J)=>{let X=new Kw(this.pipa),U=j9(X,Vw,J)[J.action]();if(U)this.pipa.nudge(`todo.${J.action}`,void 0,U);return{content:[{type:"text",text:Xm[J.action]}],details:U}}})}}D$([Y$("before_agent_start"),h("design:type",Function),h("design:paramtypes",[]),h("design:returntype",void 0)],Ym.prototype,"mountPipa",null);var Um=b$(f6(),1);class Bw{async validateTerminal({toolName:$,input:q},J){let{role:X}=s.get(J.sessionId),Z=q.action??q.command;if($==="bash"&&Z){let U=eM(Z);if(U)return{block:!0,reason:p(U)};if(FQ(Z))return{block:!0,reason:p(`O uso do comando "${Z}" é proibido para todos os colegas`,"pois pode causar perda de dados ou demorar muito tempo para ser executado.")}}if(X==="main"&&($==="edit"||$==="write")){if(UQ(J))return;if(!await J.context.ui.confirm("Operação de Escrita (Main)",`O supervisor deseja editar um arquivo via '${$}'. Permitir?`))return{block:!0,reason:p(`A execução de ${$} foi cancelada pelo usuário.`,"Lembre-se do seu papel de coordenador. Se a tarefa exige muitas modificações, delegue-a para um colega especializado.")}}}}D$([Y$("tool_call"),h("design:type",Function),h("design:paramtypes",[typeof ToolCallEvent==="undefined"?Object:ToolCallEvent,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",typeof Promise==="undefined"?Object:Promise)],Bw.prototype,"validateTerminal",null);class Fw{async validateTools({toolName:$,input:q},J){let{depth:X,role:Z}=s.get(J.sessionId),U=q.action??q.command,W=oM[$]||[];if(Z==="main"&&W.includes("*"))return{block:!0,reason:p(`O uso de ${$} não é permitido para o supervisor.`,"Se você precisa executar essa operação, considere criar um colega para isso.")};if(Z==="main"&&U&&(W.includes(U)||FQ(U)))return{block:!0,reason:p(`O uso de ${$}(${U}) não é permitido para o supervisor.`,"Se você precisa executar essa operação no terminal ou gerenciar tarefas, considere delegá-la a um colega.")};if($==="ask_user_question"&&Z==="subagent")return{block:!0,reason:p("O colega atual não tem permissão para fazer perguntas ao usuário.","Se você precisa fazer perguntas ao usuário, considere instruir o supervisor a fazer isso por você","através da sua resposta final.")};if($==="teammates"&&X>1)return{block:!0,reason:p("O colega atual não tem permissão para criar outros colegas.","Se você precisa criar colegas, considere instruir o supervisor a fazer isso por você","através da sua resposta final.")};if($==="backlog"&&U==="remove"){if(Z!=="main")return{block:!0,reason:p("Apenas o supervisor (main) pode remover itens do backlog.","Se você precisa remover um item, peça ao supervisor para executar esta operação.")};if(!await J.context.ui.confirm("Remover Item do Backlog (Main)",`O supervisor deseja remover o item "${q.code}" do backlog. Permitir?`))return{block:!0,reason:p("A remoção do item do backlog foi cancelada pelo usuário.","O item permanece inalterado.")}}}}D$([Y$("tool_call"),h("design:type",Function),h("design:paramtypes",[typeof ToolCallEvent==="undefined"?Object:ToolCallEvent,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",typeof Promise==="undefined"?Object:Promise)],Fw.prototype,"validateTools",null);class Wm extends Um.Mixin(R6,Bw,Fw){}var Im=b$(x0(),1),_m=b$(f6(),1);var m5=["epic","story","task","bugfix"],wm=["triage","in_progress","done","blocked","cancelled"],Hm=["low","medium","high","critical"],Vm=["api","ui","integration"],Km=["updatedAt","order"],zm=["ASC","DESC"],Bm=["title","status","priority","tags","parentCode","domain"],f5={list:{code:"backlog.list",get failed(){return[this.code,"Falha ao listar backlog"]},get success(){return[this.code,"Backlog listado com sucesso"]}},create:{code:"backlog.create",get failed(){return[this.code,"Falha ao criar item no backlog"]},get success(){return[this.code,"Item criado no backlog"]}},"update-frontmatter":{code:"backlog.update-frontmatter",get failed(){return[this.code,"Falha ao atualizar frontmatter"]},get success(){return[this.code,"Frontmatter atualizado"]}},"update-body":{code:"backlog.update-body",get failed(){return[this.code,"Falha ao atualizar corpo markdown"]},get success(){return[this.code,"Corpo markdown atualizado"]}},"update-metadata":{code:"backlog.update-metadata",get failed(){return[this.code,"Falha ao atualizar metadata"]},get success(){return[this.code,"Metadata atualizado"]}},select:{code:"backlog.select",get failed(){return[this.code,"Falha na busca"]},get success(){return[this.code,"Busca concluída"]}}};var Gw={instantiate:A.Object({action:A.Literal("instantiate",{description:"instantiate: novo item no backlog"}),title:A.String({description:'Título descritivo da tarefa. Ex: "Criar schema de usuário".'}),type:jq(m5,{description:"Tipo do item: epic, story, task, bugfix"}),priority:jq(Hm,{description:"Prioridade do item: low, medium, high, critical"}),domain:A.Optional(A.Array(jq(Vm,{description:p("Domínios relacionados","Ex: api, ui, integration","Omita se não houver")}))),parentCode:A.Optional(A.String({description:p("Código do item pai (ex: a1b2c3d4)","Omita se for item raiz")})),tags:A.Optional(A.Array(A.String({description:p("Etiqueta livre",'Ex: ["backend", "urgente"]',"Omita se não houver")}))),metadata:A.Optional(A.Record(A.String(),A.Unknown(),{description:p("Campo livre para dados arbitrários (JSON)","Omita se não houver")})),body:A.String({description:p("Conteúdo markdown do item","Inclua contexto, critérios e restrições")})},{description:p("Cria um novo item no backlog do projeto","Use backlog.instantiate para registrar trabalho persistente (epic, story, task, bugfix)"),examples:[{action:"instantiate",title:"Criar schema de usuário",type:"task",priority:"high",domain:["api"],tags:["backend"],body:"Criar o schema de usuário com campos nome, email e role."}]}),list:A.Object({action:A.Literal("list",{description:"list: tarefas criadas"}),status:A.Optional(jq(wm,{description:p("Status do item","Omita para listar todos os status")})),type:A.Optional(jq(m5,{description:p("Tipo do item: epic, story, task, bugfix","Omita para listar todos os tipos")})),sort:A.Optional(A.Object({field:jq(Km,{description:"Campo para ordenar a listagem. Ex: updatedAt."}),order:jq(zm,{description:p("Ordem de ordenação: ASC ou DESC","Omita para ASC")})})),limit:A.Optional(A.Number({description:p("Limite de itens a serem retornados","Omita para retornar todos")}))}),"update-frontmatter":A.Object({action:A.Literal("update-frontmatter",{description:"update-frontmatter: atualiza metadados YAML de um item do backlog"}),code:A.String({description:"Código do item do backlog a ser atualizado. Ex: a1b2c3d4."}),field:jq(Bm,{description:"Campo do frontmatter a ser atualizado: title, status, priority, tags, parentCode ou domain."}),value:A.String({description:"Novo valor do campo do frontmatter."})}),"update-body":A.Object({action:A.Literal("update-body",{description:"update-body: manipula o corpo markdown de um item do backlog"}),code:A.String({description:"Código do item do backlog a ser atualizado. Ex: a1b2c3d4."}),mode:A.Union([A.Literal("append"),A.Literal("replace"),A.Literal("set")],{description:p("Modo de atualização do corpo markdown","append: adiciona ao final; replace: substitui trecho; set: substitui o corpo inteiro.")}),value:A.String({description:p("Texto a ser manipulado no corpo markdown","Em mode append/set é o novo conteúdo; em mode replace é o trecho a localizar")}),replacement:A.Optional(A.String({description:p("Texto a ser usado como substituição","Obrigatório apenas em mode replace; omita nos demais")}))}),"update-metadata":A.Object({action:A.Literal("update-metadata",{description:"update-metadata: faz merge de dados livres (metadata) em um item do backlog"}),code:A.String({description:"Código do item do backlog a ser atualizado. Ex: a1b2c3d4."}),metadata:A.Record(A.String(),A.Unknown(),{description:p("Dados a mesclar no metadata existente do item","Chaves existentes são sobrescritas; demais são preservadas")})}),select:A.Object({action:A.Literal("select",{description:"select: busca item do backlog por título, código ou tags"}),query:A.Optional(A.String({description:p("Consulta de busca","Omita para listar itens recentes")}))}),remove:A.Object({action:A.Literal("remove",{description:"remove: exclusão de item do backlog"}),code:A.String({description:"Código do item do backlog a ser removido. Ex: a1b2c3d4."})})},Fm={list:"Listando [count] item(s) do backlog...",instantiate:"Criando novo item no backlog [item.code]...","update-frontmatter":"Atualizando frontmatter do item [item.code]...","update-body":"Atualizando corpo markdown do item [item.code]...","update-metadata":"Atualizando metadata do item [item.code]...",select:"Buscando no backlog...",remove:"Removendo item do backlog [item.code]..."};var w3=b$(x0(),1);var xm=b$(f6(),1);class g4{constructor($){Object.assign(this,$)}code;title;type;status;body;createdAt;updatedAt;priority;domain;parentCode;order;tags;metadata}function bJ($){return!Array.isArray?Em($)==="[object Array]":Array.isArray($)}function iJ$($){if(typeof $=="string")return $;if(typeof $==="bigint")return $.toString();let q=$+"";return q=="0"&&1/$==-1/0?"-0":q}function Dw($){return $==null?"":iJ$($)}function n6($){return typeof $==="string"}function X3($){return typeof $==="number"}function oJ$($){return $===!0||$===!1||sJ$($)&&Em($)=="[object Boolean]"}function Rm($){return typeof $==="object"}function sJ$($){return Rm($)&&$!==null}function fq($){return $!==void 0&&$!==null}function J3($){return!$.trim().length}function Em($){return $==null?$===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call($)}var rJ$="Incorrect 'index' type",Pw="Invalid doc index: must be a non-negative integer within the bounds of the docs array",aJ$=($)=>`Invalid value for key ${$}`,eJ$=($)=>`Pattern length exceeds max of ${$}.`,tJ$=($)=>`Missing ${$} property in key`,$8$=($)=>`Property 'weight' in key '${$}' must be a positive integer`,q8$="Fuse.match does not support useTokenSearch: token search requires corpus-level statistics (df, fieldCount) that a one-off string comparison does not have. Use new Fuse(...).search(...) instead.",Gm=Object.prototype.hasOwnProperty,J8$=class{constructor($){this._keys=[],this._keyMap={};let q=0;$.forEach((J)=>{let X=Cm(J);this._keys.push(X),this._keyMap[X.id]=X,q+=X.weight}),this._keys.forEach((J)=>{J.weight/=q})}get($){return this._keyMap[$]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}};function Cm($){let q=null,J=null,X=null,Z=1,U=null;if(n6($)||bJ($))X=$,q=Nm($),J=Z3($);else{if(!Gm.call($,"name"))throw Error(tJ$("name"));let W=$.name;if(X=W,Gm.call($,"weight")&&$.weight!==void 0){if(Z=$.weight,Z<=0)throw Error($8$(Z3(W)))}q=Nm(W),J=Z3(W),U=$.getFn??null}return{path:q,id:J,weight:Z,src:X,getFn:U}}function Nm($){return bJ($)?$:$.split(".")}function Z3($){return bJ($)?$.join("."):$}function X8$($,q){let J=[],X=!1,Z=(U,W,H,K)=>{if(!fq(U))return;if(!W[H])J.push(K!==void 0?{v:U,i:K}:U);else{let F=U[W[H]];if(!fq(F))return;if(H===W.length-1&&(n6(F)||X3(F)||oJ$(F)||typeof F==="bigint"))J.push(K!==void 0?{v:Dw(F),i:K}:Dw(F));else if(bJ(F)){X=!0;for(let B=0,P=F.length;B<P;B+=1)Z(F[B],W,H+1,B)}else if(W.length)Z(F,W,H+1,K)}};return Z($,n6(q)?q.split("."):q,0),X?J:J[0]}var Z8$={includeMatches:!1,findAllMatches:!1,minMatchCharLength:1},Q8$={isCaseSensitive:!1,ignoreDiacritics:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:($,q)=>$.score===q.score?$.idx<q.idx?-1:1:$.score<q.score?-1:1},Y8$={location:0,threshold:0.6,distance:100},U8$={useExtendedSearch:!1,useTokenSearch:!1,tokenize:void 0,tokenMatch:"any",getFn:X8$,ignoreLocation:!1,ignoreFieldNorm:!1,fieldNormWeight:1},I$=Object.freeze({...Q8$,...Z8$,...Y8$,...U8$});function W8$($){return $>=9&&$<=13||$===32||$===160}function w8$($=1,q=3){let J=new Map,X=Math.pow(10,q);return{get(Z){let U=0,W=!1;for(let K=0;K<Z.length;K++)if(!W8$(Z.charCodeAt(K))){if(!W)U++,W=!0}else W=!1;if(U===0)U=1;if(J.has(U))return J.get(U);let H=Math.round(X/Math.pow(U,0.5*$))/X;return J.set(U,H),H},clear(){J.clear()}}}var Aw=class{constructor({getFn:$=I$.getFn,fieldNormWeight:q=I$.fieldNormWeight}={}){this.norm=w8$(q,3),this.getFn=$,this.isCreated=!1,this.docs=[],this.keys=[],this._keysMap={},this.setIndexRecords()}setSources($=[]){this.docs=$}setIndexRecords($=[]){this.records=$}setKeys($=[]){this.keys=$,this._keysMap={},$.forEach((q,J)=>{this._keysMap[q.id]=J})}create(){if(this.isCreated||!this.docs.length)return;this.isCreated=!0;let $=this.docs.length;this.records=Array($);let q=0;if(n6(this.docs[0]))for(let J=0;J<$;J++){let X=this._createStringRecord(this.docs[J],J);if(X)this.records[q++]=X}else for(let J=0;J<$;J++)this.records[q++]=this._createObjectRecord(this.docs[J],J);this.records.length=q,this.norm.clear()}add($,q){if(!Number.isInteger(q)||q<0)throw Error(Pw);if(n6($)){let X=this._createStringRecord($,q);if(X)this.records.push(X);return X}let J=this._createObjectRecord($,q);return this.records.push(J),J}removeAt($){if(!Number.isInteger($)||$<0)throw Error(Pw);for(let q=0,J=this.records.length;q<J;q+=1)if(this.records[q].i===$){this.records.splice(q,1);break}for(let q=0,J=this.records.length;q<J;q+=1)if(this.records[q].i>$)this.records[q].i-=1}removeAll($){let q=new Set;for(let X of $)if(Number.isInteger(X)&&X>=0)q.add(X);if(q.size===0)return;this.records=this.records.filter((X)=>!q.has(X.i));let J=Array.from(q).sort((X,Z)=>X-Z);for(let X of this.records){let Z=0,U=J.length;while(Z<U){let W=Z+U>>>1;if(J[W]<X.i)Z=W+1;else U=W}X.i-=Z}}getValueForItemAtKeyId($,q){return $[this._keysMap[q]]}size(){return this.records.length}_createStringRecord($,q){if(!fq($)||J3($))return null;return{v:$,i:q,n:this.norm.get($)}}_createObjectRecord($,q){let J={i:q,$:{}};for(let X=0,Z=this.keys.length;X<Z;X++){let U=this.keys[X],W=U.getFn?U.getFn($):this.getFn($,U.path);if(!fq(W))continue;if(bJ(W)){let H=[];for(let K=0,F=W.length;K<F;K+=1){let B=W[K];if(!fq(B))continue;if(n6(B)){if(!J3(B)){let P={v:B,i:K,n:this.norm.get(B)};H.push(P)}}else if(fq(B.v)){let P=n6(B.v)?B.v:Dw(B.v);if(!J3(P)){let M={v:P,i:B.i,n:this.norm.get(P)};H.push(M)}}}J.$[X]=H}else if(n6(W)&&!J3(W)){let H={v:W,n:this.norm.get(W)};J.$[X]=H}}return J}toJSON(){return{keys:this.keys.map(({getFn:$,...q})=>q),records:this.records}}};function Am($,q,{getFn:J=I$.getFn,fieldNormWeight:X=I$.fieldNormWeight}={}){let Z=new Aw({getFn:J,fieldNormWeight:X});return Z.setKeys($.map(Cm)),Z.setSources(q),Z.create(),Z}function H8$($,{getFn:q=I$.getFn,fieldNormWeight:J=I$.fieldNormWeight}={}){let{keys:X,records:Z}=$,U=new Aw({getFn:q,fieldNormWeight:J});return U.setKeys(X),U.setIndexRecords(Z),U}function V8$($=[],q=I$.minMatchCharLength){let J=[],X=-1,Z=-1,U=0;for(let W=$.length;U<W;U+=1){let H=$[U];if(H&&X===-1)X=U;else if(!H&&X!==-1){if(Z=U-1,Z-X+1>=q)J.push([X,Z]);X=-1}}if($[U-1]&&U-X>=q)J.push([X,U-1]);return J}function K8$($,q,J,{location:X=I$.location,distance:Z=I$.distance,threshold:U=I$.threshold,findAllMatches:W=I$.findAllMatches,minMatchCharLength:H=I$.minMatchCharLength,includeMatches:K=I$.includeMatches,ignoreLocation:F=I$.ignoreLocation}={}){if(q.length>32)throw Error(eJ$(32));let B=q.length,P=$.length,M=Math.max(0,Math.min(X,P)),R=U,S=M,f=(i,Q$)=>{let x=i/B;if(F)return x;let C$=Math.abs(M-Q$);if(!Z)return C$?1:x;return x+C$/Z},y=H>1||K,q$=y?Array(P):[],L$;while((L$=$.indexOf(q,S))>-1){let i=f(0,L$);if(R=Math.min(i,R),S=L$+B,y){let Q$=0;while(Q$<B)q$[L$+Q$]=1,Q$+=1}}S=-1;let G$=[],q0=1,W0=0,z$=B+P,_$=1<<B-1;for(let i=0;i<B;i+=1){let Q$=0,x=z$;while(Q$<x){if(f(i,M+x)<=R)Q$=x;else z$=x;x=Math.floor((z$-Q$)/2+Q$)}z$=x;let C$=Math.max(1,M-x+1),A$=W?P:Math.min(M+x,P)+B,a$=Array(A$+2);a$[A$+1]=(1<<i)-1;for(let _=A$;_>=C$;_-=1){let b=_-1,P$=J[$[b]];if(a$[_]=(a$[_+1]<<1|1)&P$,i)a$[_]|=(G$[_+1]|G$[_])<<1|1|G$[_+1];if(a$[_]&_$){if(q0=f(i,b),q0<=R){if(R=q0,S=b,W0=i,S<=M)break;C$=Math.max(1,2*M-S)}}}if(f(i+1,M)>R)break;G$=a$}if(y&&S>=0){let i=Math.min(P-1,S+B-1+W0);for(let Q$=S;Q$<=i;Q$+=1)if(J[$[Q$]])q$[Q$]=1}let e={isMatch:S>=0,score:Math.max(0.001,q0)};if(y){let i=V8$(q$,H);if(!i.length)e.isMatch=!1;else if(K)e.indices=i}return e}function z8$($){let q={};for(let J=0,X=$.length;J<X;J+=1){let Z=$.charAt(J);q[Z]=(q[Z]||0)|1<<X-J-1}return q}function Sw($){if($.length<=1)return $;$.sort((J,X)=>J[0]-X[0]||J[1]-X[1]);let q=[$[0]];for(let J=1,X=$.length;J<X;J+=1){let Z=q[q.length-1],U=$[J];if(U[0]<=Z[1]+1)Z[1]=Math.max(Z[1],U[1]);else q.push(U)}return q}var Sm={"ł":"l","Ł":"L","đ":"d","Đ":"D","ø":"o","Ø":"O","ħ":"h","Ħ":"H","ŧ":"t","Ŧ":"T","ı":"i","ß":"ss"},B8$=new RegExp("["+Object.keys(Sm).join("")+"]","g"),x5=typeof String.prototype.normalize==="function"?($)=>$.normalize("NFD").replace(/[\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D3-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u09FE\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0AFA-\u0AFF\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C04\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D00-\u0D03\u0D3B\u0D3C\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF7-\u1CF9\u1DC0-\u1DF9\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F]/g,"").replace(B8$,(q)=>Sm[q]):($)=>$,Tw=class{constructor($,{location:q=I$.location,threshold:J=I$.threshold,distance:X=I$.distance,includeMatches:Z=I$.includeMatches,findAllMatches:U=I$.findAllMatches,minMatchCharLength:W=I$.minMatchCharLength,isCaseSensitive:H=I$.isCaseSensitive,ignoreDiacritics:K=I$.ignoreDiacritics,ignoreLocation:F=I$.ignoreLocation}={}){if(this.options={location:q,threshold:J,distance:X,includeMatches:Z,findAllMatches:U,minMatchCharLength:W,isCaseSensitive:H,ignoreDiacritics:K,ignoreLocation:F},$=H?$:$.toLowerCase(),$=K?x5($):$,this.pattern=$,this.chunks=[],!this.pattern.length)return;let B=(M,R)=>{this.chunks.push({pattern:M,alphabet:z8$(M),startIndex:R})},P=this.pattern.length;if(P>32){let M=0,R=P%32,S=P-R;while(M<S)B(this.pattern.substr(M,32),M),M+=32;if(R){let f=P-32;B(this.pattern.substr(f),f)}}else B(this.pattern,0)}searchIn($){let{isCaseSensitive:q,ignoreDiacritics:J,includeMatches:X}=this.options;if($=q?$:$.toLowerCase(),$=J?x5($):$,this.pattern===$){if($.length<this.options.minMatchCharLength)return{isMatch:!1,score:1};let S={isMatch:!0,score:0};if(X)S.indices=[[0,$.length-1]];return S}let{location:Z,distance:U,threshold:W,findAllMatches:H,minMatchCharLength:K,ignoreLocation:F}=this.options,B=[],P=0,M=!1;this.chunks.forEach(({pattern:S,alphabet:f,startIndex:y})=>{let{isMatch:q$,score:L$,indices:G$}=K8$($,S,f,{location:Z+y,distance:U,threshold:W,findAllMatches:H,minMatchCharLength:K,includeMatches:X,ignoreLocation:F});if(q$)M=!0;if(P+=L$,q$&&G$)B.push(...G$)});let R={isMatch:M,score:M?P/this.chunks.length:1};if(M&&X)R.indices=Sw(B);return R}},F8$=new Set(["fuzzy","include"]);function G8$($){return $.startsWith("inverse")}var Ow=[{type:"exact",multiRegex:/^="(.*)"$/,singleRegex:/^=(.*)$/,create:($)=>({type:"exact",search(q){let J=q===$;return{isMatch:J,score:J?0:1,indices:[0,$.length-1]}}})},{type:"include",multiRegex:/^'"(.*)"$/,singleRegex:/^'(.*)$/,create:($)=>({type:"include",search(q){let J=0,X,Z=[],U=$.length;while((X=q.indexOf($,J))>-1)J=X+U,Z.push([X,J-1]);let W=!!Z.length;return{isMatch:W,score:W?0:1,indices:Z}}})},{type:"prefix-exact",multiRegex:/^\^"(.*)"$/,singleRegex:/^\^(.*)$/,create:($)=>({type:"prefix-exact",search(q){let J=q.startsWith($);return{isMatch:J,score:J?0:1,indices:[0,$.length-1]}}})},{type:"inverse-prefix-exact",multiRegex:/^!\^"(.*)"$/,singleRegex:/^!\^(.*)$/,create:($)=>({type:"inverse-prefix-exact",search(q){let J=!q.startsWith($);return{isMatch:J,score:J?0:1,indices:[0,q.length-1]}}})},{type:"inverse-suffix-exact",multiRegex:/^!"(.*)"\$$/,singleRegex:/^!(.*)\$$/,create:($)=>({type:"inverse-suffix-exact",search(q){let J=!q.endsWith($);return{isMatch:J,score:J?0:1,indices:[0,q.length-1]}}})},{type:"suffix-exact",multiRegex:/^"(.*)"\$$/,singleRegex:/^(.*)\$$/,create:($)=>({type:"suffix-exact",search(q){let J=q.endsWith($);return{isMatch:J,score:J?0:1,indices:[q.length-$.length,q.length-1]}}})},{type:"inverse-exact",multiRegex:/^!"(.*)"$/,singleRegex:/^!(.*)$/,create:($)=>({type:"inverse-exact",search(q){let J=q.indexOf($)===-1;return{isMatch:J,score:J?0:1,indices:[0,q.length-1]}}})},{type:"fuzzy",multiRegex:/^"(.*)"$/,singleRegex:/^(.*)$/,create:($,q={})=>{let J=new Tw($,{location:q.location??I$.location,threshold:q.threshold??I$.threshold,distance:q.distance??I$.distance,includeMatches:q.includeMatches??I$.includeMatches,findAllMatches:q.findAllMatches??I$.findAllMatches,minMatchCharLength:q.minMatchCharLength??I$.minMatchCharLength,isCaseSensitive:q.isCaseSensitive??I$.isCaseSensitive,ignoreDiacritics:q.ignoreDiacritics??I$.ignoreDiacritics,ignoreLocation:q.ignoreLocation??I$.ignoreLocation});return{type:"fuzzy",search(X){return J.searchIn(X)}}}}],Dm=Ow.length,N8$="\x00",D8$="|";function P8$($){let q=[],J=$.length,X=0;while(X<J){while(X<J&&$[X]===" ")X++;if(X>=J)break;let Z=X;while(Z<J&&$[Z]!==" "&&$[Z]!=='"')Z++;if(Z<J&&$[Z]==='"'){Z++;while(Z<J){if($[Z]==='"'){let U=Z+1;if(U>=J||$[U]===" "){Z++;break}if($[U]==="$"&&(U+1>=J||$[U+1]===" ")){Z+=2;break}}Z++}q.push($.substring(X,Z)),X=Z}else{while(Z<J&&$[Z]!==" ")Z++;q.push($.substring(X,Z)),X=Z}}return q}function Pm($,q){let J=$.match(q);return J?J[1]:null}function O8$($,q={}){return $.replace(/\\\|/g,N8$).split(D8$).map((J)=>{let X=P8$(J.replace(/\u0000/g,"|").trim()).filter((U)=>U&&!!U.trim()),Z=[];for(let U=0,W=X.length;U<W;U+=1){let H=X[U],K=!1,F=-1;while(!K&&++F<Dm){let B=Ow[F],P=Pm(H,B.multiRegex);if(P)Z.push(B.create(P,q)),K=!0}if(K)continue;F=-1;while(++F<Dm){let B=Ow[F],P=Pm(H,B.singleRegex);if(P){Z.push(B.create(P,q));break}}}return Z})}var M8$=class{constructor($,{isCaseSensitive:q=I$.isCaseSensitive,ignoreDiacritics:J=I$.ignoreDiacritics,includeMatches:X=I$.includeMatches,minMatchCharLength:Z=I$.minMatchCharLength,ignoreLocation:U=I$.ignoreLocation,findAllMatches:W=I$.findAllMatches,location:H=I$.location,threshold:K=I$.threshold,distance:F=I$.distance}={}){this.query=null,this.options={isCaseSensitive:q,ignoreDiacritics:J,includeMatches:X,minMatchCharLength:Z,findAllMatches:W,ignoreLocation:U,location:H,threshold:K,distance:F},$=q?$:$.toLowerCase(),$=J?x5($):$,this.pattern=$,this.query=O8$(this.pattern,this.options)}static condition($,q){return q.useExtendedSearch}searchIn($){let q=this.query;if(!q)return{isMatch:!1,score:1};let{includeMatches:J,isCaseSensitive:X,ignoreDiacritics:Z}=this.options;$=X?$:$.toLowerCase(),$=Z?x5($):$;let U=0,W=[],H=0,K=!1;for(let F=0,B=q.length;F<B;F+=1){let P=q[F];W.length=0,U=0,K=!1;for(let M=0,R=P.length;M<R;M+=1){let S=P[M],{isMatch:f,indices:y,score:q$}=S.search($);if(f){if(U+=1,H+=q$,G8$(S.type))K=!0;if(J)if(F8$.has(S.type))W.push(...y);else W.push(y)}else{H=0,U=0,W.length=0,K=!1;break}}if(U){let M={isMatch:!0,score:H/U};if(K)M.hasInverse=!0;if(J)M.indices=Sw(W);return M}}return{isMatch:!1,score:1}}},Mw=[];function jw(...$){Mw.push(...$)}function Q3($,q){for(let J=0,X=Mw.length;J<X;J+=1){let Z=Mw[J];if(Z.condition($,q))return new Z($,q)}return new Tw($,q)}var Y3={AND:"$and",OR:"$or"},Lw={PATH:"$path",PATTERN:"$val"},Rw=($)=>!!($[Y3.AND]||$[Y3.OR]),L8$=($)=>!!$[Lw.PATH],R8$=($)=>!bJ($)&&Rm($)&&!Rw($),Om=($)=>({[Y3.AND]:Object.keys($).map((q)=>({[q]:$[q]}))});function Tm($,q,{auto:J=!0}={}){let X=(Z)=>{if(n6(Z)){let K={keyId:null,pattern:Z};if(J)K.searcher=Q3(Z,q);return K}let U=Object.keys(Z),W=L8$(Z);if(!W&&U.length>1&&!Rw(Z))return X(Om(Z));if(R8$(Z)){let K=W?Z[Lw.PATH]:U[0],F=W?Z[Lw.PATTERN]:Z[K];if(!n6(F))throw Error(aJ$(K));let B={keyId:Z3(K),pattern:F};if(J)B.searcher=Q3(F,q);return B}let H={children:[],operator:U[0]};return U.forEach((K)=>{let F=Z[K];if(bJ(F))F.forEach((B)=>{H.children.push(X(B))})}),H};if(!Rw($))$=Om($);return X($)}function Ew($,{ignoreFieldNorm:q=I$.ignoreFieldNorm}){let J=1;return $.forEach(({key:X,norm:Z,score:U})=>{let W=X?X.weight:null;J*=Math.pow(U===0&&W?Number.EPSILON:U,(W||1)*(q?1:Z))}),J}function E8$($,{ignoreFieldNorm:q=I$.ignoreFieldNorm}){$.forEach((J)=>{J.score=Ew(J.matches,{ignoreFieldNorm:q})})}var C8$=class{constructor($,q){this.limit=$,this.heap=[],this.comparator=q}get size(){return this.heap.length}insert($){if(this.size<this.limit)this.heap.push($),this._bubbleUp(this.size-1);else if(this.comparator($,this.heap[0])<0)this.heap[0]=$,this._sinkDown(0)}extractSorted(){return this.heap.sort(this.comparator)}_bubbleUp($){let q=this.heap;while($>0){let J=$-1>>1;if(this.comparator(q[$],q[J])<=0)break;let X=q[$];q[$]=q[J],q[J]=X,$=J}}_sinkDown($){let q=this.heap,J=q.length,X=$;do{$=X;let Z=2*$+1,U=2*$+2;if(Z<J&&this.comparator(q[Z],q[X])>0)X=Z;if(U<J&&this.comparator(q[U],q[X])>0)X=U;if(X!==$){let W=q[$];q[$]=q[X],q[X]=W}}while(X!==$)}};function A8$($){let q=[];return $.matches.forEach((J)=>{if(!fq(J.indices)||!J.indices.length)return;let X={indices:J.indices,value:J.value};if(J.key)X.key=J.key.id;if(J.idx>-1)X.refIndex=J.idx;q.push(X)}),q}function S8$($,q,{includeMatches:J=I$.includeMatches,includeScore:X=I$.includeScore}={}){return $.map((Z)=>{let{idx:U}=Z,W={item:q[U],refIndex:U};if(J)W.matches=A8$(Z);if(X)W.score=Z.score;return W})}var T8$=/[\p{L}\p{M}\p{N}_]+/gu,Mm=new WeakSet;function j8$($){if(!Mm.has($))Mm.add($),console.warn(`[Fuse] tokenize regex ${$} lacks the global flag; only the first match per text will be returned. Add the 'g' flag.`)}function m8$($){if(typeof $==="function"){let q=!1;return(J)=>{let X=$(J);if(!q){if(q=!0,!Array.isArray(X)||X.some((Z)=>typeof Z!=="string"))throw Error(`[Fuse] tokenize function must return string[]; received ${Array.isArray(X)?"array containing non-strings":typeof X}.`)}return X}}if($ instanceof RegExp){if(!$.global)j8$($);return(q)=>q.match($)||[]}return(q)=>q.match(T8$)||[]}function Cw({isCaseSensitive:$=!1,ignoreDiacritics:q=!1,tokenize:J}={}){let X=m8$(J);return{tokenize(Z){if(!$)Z=Z.toLowerCase();if(q)Z=x5(Z);return X(Z)}}}var f8$=class{static condition($,q){return q.useTokenSearch}constructor($,q){this.options=q,this.analyzer=Cw({isCaseSensitive:q.isCaseSensitive,ignoreDiacritics:q.ignoreDiacritics,tokenize:q.tokenize});let J=this.analyzer.tokenize($),{df:X,fieldCount:Z}=q._invertedIndex;this.termSearchers=[],this.idfWeights=[];for(let U of J){this.termSearchers.push(new Tw(U,{location:q.location,threshold:q.threshold,distance:q.distance,includeMatches:q.includeMatches,findAllMatches:q.findAllMatches,minMatchCharLength:q.minMatchCharLength,isCaseSensitive:q.isCaseSensitive,ignoreDiacritics:q.ignoreDiacritics,ignoreLocation:!0}));let W=X.get(U)||0,H=Math.log(1+(Z-W+0.5)/(W+0.5));this.idfWeights.push(H)}this.combineAll=q.tokenMatch==="all",this.numTerms=this.termSearchers.length,this.useMask=this.numTerms<=31}searchIn($){if(!this.termSearchers.length)return{isMatch:!1,score:1};let q=[],J=0,X=0,Z=0,U=0,W=this.combineAll&&!this.useMask?new Set:null;for(let F=0;F<this.termSearchers.length;F++){let B=this.termSearchers[F].searchIn($),P=this.idfWeights[F];if(X+=P,B.isMatch){if(Z++,J+=P*(1-B.score),B.indices)q.push(...B.indices);if(this.combineAll)if(this.useMask)U|=1<<F;else W.add(F)}}if(Z===0)return{isMatch:!1,score:1};let H=X>0?1-J/X:0,K={isMatch:!0,score:Math.max(0.001,H)};if(this.options.includeMatches&&q.length)K.indices=Sw(q);if(this.combineAll){if(this.useMask)K.matchedMask=U;else K.matchedTerms=W;K.termCount=this.numTerms}return K}};function Nw($,q,J,X){let Z=X.tokenize(q);if(!Z.length)return;$.fieldCount++,$.docFieldCount.set(J,($.docFieldCount.get(J)||0)+1);let U=new Set(Z),W=$.docTermFieldHits.get(J);if(!W)W=new Map,$.docTermFieldHits.set(J,W);for(let H of U)W.set(H,(W.get(H)||0)+1),$.df.set(H,($.df.get(H)||0)+1)}function jm($,q,J,X){let{i:Z,v:U,$:W}=q;if(U!==void 0){Nw($,U,Z,X);return}if(!W)return;for(let H=0;H<J;H++){let K=W[H];if(!K)continue;if(Array.isArray(K))for(let F of K)Nw($,F.v,Z,X);else Nw($,K.v,Z,X)}}function x8$($,q,J){let X={fieldCount:0,df:new Map,docFieldCount:new Map,docTermFieldHits:new Map};for(let Z of $)jm(X,Z,q,J);return X}function I8$($,q,J,X){jm($,q,J,X)}function _8$($,q){let J=$.docFieldCount.get(q);if(J===void 0)return;$.fieldCount-=J,$.docFieldCount.delete(q);let X=$.docTermFieldHits.get(q);if(!X)return;for(let[Z,U]of X){let W=($.df.get(Z)||0)-U;if(W<=0)$.df.delete(Z);else $.df.set(Z,W)}$.docTermFieldHits.delete(q)}function Lm($,q){if(q.length===0)return;let J=Array.from(new Set(q)).sort((H,K)=>H-K);for(let H of J)_8$($,H);let X=(H)=>{let K=0,F=J.length;while(K<F){let B=K+F>>>1;if(J[B]<H)K=B+1;else F=B}return H-K},Z=J[0],U=new Map;for(let[H,K]of $.docFieldCount)U.set(H>Z?X(H):H,K);$.docFieldCount=U;let W=new Map;for(let[H,K]of $.docTermFieldHits)W.set(H>Z?X(H):H,K);$.docTermFieldHits=W}var vJ=class{constructor($,q,J){this.options={...I$,...q},this.options.useExtendedSearch,this.options.useTokenSearch,this._keyStore=new J8$(this.options.keys),this._docs=$,this._myIndex=null,this._invertedIndex=null,this.setCollection($,J),this._lastQuery=null,this._lastSearcher=null}_getSearcher($){if(this._lastQuery===$)return this._lastSearcher;let q=Q3($,this._invertedIndex?{...this.options,_invertedIndex:this._invertedIndex}:this.options);return this._lastQuery=$,this._lastSearcher=q,q}setCollection($,q){if(this._docs=$,q&&!(q instanceof Aw))throw Error(rJ$);if(this._myIndex=q||Am(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight}),this.options.useTokenSearch){let J=Cw({isCaseSensitive:this.options.isCaseSensitive,ignoreDiacritics:this.options.ignoreDiacritics,tokenize:this.options.tokenize});this._invertedIndex=x8$(this._myIndex.records,this._myIndex.keys.length,J)}this._invalidateSearcherCache()}add($){if(!fq($))return;this._docs.push($);let q=this._myIndex.add($,this._docs.length-1);if(this._invertedIndex&&q){let J=Cw({isCaseSensitive:this.options.isCaseSensitive,ignoreDiacritics:this.options.ignoreDiacritics,tokenize:this.options.tokenize});I8$(this._invertedIndex,q,this._myIndex.keys.length,J)}this._invalidateSearcherCache()}remove($=()=>!1){let q=[],J=[];for(let X=0,Z=this._docs.length;X<Z;X+=1)if($(this._docs[X],X))q.push(this._docs[X]),J.push(X);if(J.length){if(this._invertedIndex)Lm(this._invertedIndex,J);let X=new Set(J);this._docs=this._docs.filter((Z,U)=>!X.has(U)),this._myIndex.removeAll(J),this._invalidateSearcherCache()}return q}removeAt($){if(!Number.isInteger($)||$<0||$>=this._docs.length)throw Error(Pw);if(this._invertedIndex)Lm(this._invertedIndex,[$]);let q=this._docs.splice($,1)[0];return this._myIndex.removeAt($),this._invalidateSearcherCache(),q}_invalidateSearcherCache(){this._lastQuery=null,this._lastSearcher=null}getIndex(){return this._myIndex}_normalizedKeys(){return this._myIndex.keys.map(($)=>this._keyStore.get($.id)||$)}search($,q){let{limit:J=-1}=q||{},{includeMatches:X,includeScore:Z,shouldSort:U,sortFn:W,ignoreFieldNorm:H}=this.options;if(n6($)&&!$.trim()){let M=this._docs.map((R,S)=>({item:R,refIndex:S}));if(X3(J)&&J>-1)M=M.slice(0,J);return M}let K=U&&X3(J)&&J>0&&n6($),F=W,B=(M,R)=>F(M,R)||M.idx-R.idx,P;if(K){let M=new C8$(J,B);if(n6(this._docs[0]))this._searchStringList($,{heap:M,ignoreFieldNorm:H});else this._searchObjectList($,{heap:M,ignoreFieldNorm:H});P=M.extractSorted()}else{if(P=n6($)?n6(this._docs[0])?this._searchStringList($):this._searchObjectList($):this._searchLogical($),E8$(P,{ignoreFieldNorm:H}),U)P.sort(n6($)?B:F);if(X3(J)&&J>-1)P=P.slice(0,J)}return S8$(P,this._docs,{includeMatches:X,includeScore:Z})}_searchStringList($,{heap:q,ignoreFieldNorm:J}={}){let X=this._getSearcher($),Z=this.options.useTokenSearch&&this.options.tokenMatch==="all",{records:U}=this._myIndex,W=q?null:[];return U.forEach(({v:H,i:K,n:F})=>{if(!fq(H))return;let B=X.searchIn(H);if(B.isMatch){let P={score:B.score,value:H,norm:F,indices:B.indices};if(Z)P.matchedMask=B.matchedMask,P.matchedTerms=B.matchedTerms,P.termCount=B.termCount;let M=[P];if(!Z||this._coversAllTokens(M)){let R={item:H,idx:K,matches:M};if(q)R.score=Ew(R.matches,{ignoreFieldNorm:J}),q.insert(R);else W.push(R)}}}),W}_searchLogical($){let q=Tm($,this.options),J=this._normalizedKeys(),X=(H,K,F)=>{if(!("children"in H)){let{keyId:R,searcher:S}=H,f;if(R===null)f=[],J.forEach((y,q$)=>{f.push(...this._findMatches({key:y,value:K[q$],searcher:S}))});else f=this._findMatches({key:this._keyStore.get(R),value:this._myIndex.getValueForItemAtKeyId(K,R),searcher:S});if(f&&f.length)return[{idx:F,item:K,matches:f}];return[]}let{children:B,operator:P}=H,M=[];for(let R=0,S=B.length;R<S;R+=1){let f=B[R],y=X(f,K,F);if(y.length)M.push(...y);else if(P===Y3.AND)return[]}return M},Z=this._myIndex.records,U=new Map,W=[];return Z.forEach(({$:H,i:K})=>{if(fq(H)){let F=X(q,H,K);if(F.length){if(!U.has(K))U.set(K,{idx:K,item:H,matches:[]}),W.push(U.get(K));F.forEach(({matches:B})=>{U.get(K).matches.push(...B)})}}}),W}_searchObjectList($,{heap:q,ignoreFieldNorm:J}={}){let X=this._getSearcher($),Z=this.options.useTokenSearch&&this.options.tokenMatch==="all",{records:U}=this._myIndex,W=this._normalizedKeys(),H=q?null:[];return U.forEach(({$:K,i:F})=>{if(!fq(K))return;let B=[],P=!1,M=!1;if(W.forEach((R,S)=>{let f=this._findMatches({key:R,value:K[S],searcher:X});if(f.length){if(B.push(...f),f[0].hasInverse)M=!0}else P=!0}),M&&P)return;if(B.length&&(!Z||this._coversAllTokens(B))){let R={idx:F,item:K,matches:B};if(q)R.score=Ew(R.matches,{ignoreFieldNorm:J}),q.insert(R);else H.push(R)}}),H}_findMatches({key:$,value:q,searcher:J}){if(!fq(q))return[];let X=[];if(bJ(q))q.forEach(({v:Z,i:U,n:W})=>{if(!fq(Z))return;let H=J.searchIn(Z);if(H.isMatch){let K={score:H.score,key:$,value:Z,idx:U,norm:W,indices:H.indices,hasInverse:H.hasInverse};if(H.termCount!==void 0)K.matchedMask=H.matchedMask,K.matchedTerms=H.matchedTerms,K.termCount=H.termCount;X.push(K)}});else{let{v:Z,n:U}=q,W=J.searchIn(Z);if(W.isMatch){let H={score:W.score,key:$,value:Z,norm:U,indices:W.indices,hasInverse:W.hasInverse};if(W.termCount!==void 0)H.matchedMask=W.matchedMask,H.matchedTerms=W.matchedTerms,H.termCount=W.termCount;X.push(H)}}return X}_coversAllTokens($){let q=$.length?$[0].termCount:void 0;if(q===void 0)return!0;if(q<=31){let X=0;for(let Z=0;Z<$.length;Z++)X|=$[Z].matchedMask||0;return X===2**q-1}let J=new Set;for(let X=0;X<$.length;X++){let Z=$[X].matchedTerms;if(Z)for(let U of Z)J.add(U)}return J.size===q}};vJ.version="7.5.0";vJ.createIndex=Am;vJ.parseIndex=H8$;vJ.config=I$;vJ.match=function($,q,J){if(J&&J.useTokenSearch)throw Error(q8$);return Q3($,{...I$,...J}).searchIn(q)};vJ.parseQuery=Tm;jw(M8$);jw(f8$);vJ.use=function(...$){$.forEach((q)=>jw(q))};var U3=vJ;var mm=b$(x0(),1),fm=b$(f6(),1);var W3=b$(x0(),1);class U0{pipa;constructor($){this.pipa=$}static get fileManager(){return new e0(cX)}static get store(){let $=E0.get(NQ);if(!$)$=E0.set(NQ,new Map);return $}static load(){let $=new e0(cX);U0.clear(),($.read(dX)??[]).forEach((q)=>U0.add(new g4(q)))}static persist(){U0.fileManager.save(dX,U0.all(),($)=>$)}static listBy($){let q={};if($?.status)q.status=$.status;if($?.type)q.type=$.type;let J=W3.filter([...U0.store.values()],q);if($?.sort){if(J=W3.sortBy(J,$.sort.field),$.sort.order==="DESC")J=J.reverse()}if($?.limit)J=J.slice(0,$.limit);return J}static all(){return[...U0.store.values()]}static get($){return U0.store.get($)}static clear(){U0.store.clear()}static add($){U0.store.set($.code,$),U0.persist()}static update($,q){let J=U0.store.get($);if(!J)return q;return E0.set(NQ,U0.store.set($,Object.assign(new g4({}),J,q))),U0.persist(),U0.get($)}static delete($){return U0.store.delete($),U0.persist(),!0}}class I5{canUpdate($,q="update-frontmatter"){let J=U0.get($);if(!J)throw new O$(...f5[q].failed,`Item com código "${$}" não encontrado no backlog.`);return J}canRemove($){let q=U0.get($);if(!q)throw new O$("backlog.remove",`Item com código "${$}" não encontrado no backlog.`);return q}canSelect($){let q=U0.get($);if(!q)throw new O$(...f5.select.failed,`Item com código "${$}" não encontrado no backlog.`);return q}canCreate({type:$,title:q}){if(!$||!m5.includes($))throw new O$(...f5.create.failed,`Tipo inválido: "${$}". Esperado: epic, story, task, bugfix.`);if(!q?.trim()||q.trim().length<3)throw new O$(...f5.create.failed,"Título deve ter pelo menos 3 caracteres.")}}class mw extends fm.Mixin(I5,U0){pipa;constructor($){super();this.pipa=$}get($){return U0.get($)}list($){return U0.listBy($)}updateFrontmatter({code:$,field:q,value:J}){let X=this.canUpdate($),Z=X.parentCode;if(X[q]=J,X.updatedAt=new Date().toISOString(),U0.update(X.code,X),q==="status"||q==="parentCode")this.recalculateAncestors($);if(q==="parentCode"&&Z&&Z!==X.parentCode)this.recalculateAncestors(Z);return this.pipa.events.emit("backlog_updated",X),X}deriveStatus($,q){if($.length===0)return q;let J=$[0].status;if($.every((Z)=>Z.status===J))return J;return"in_progress"}deriveNodeStatus($){let q=U0.all().filter((X)=>X.parentCode===$.code),J=this.deriveStatus(q,$.status);if(J!==$.status)$.status=J,$.updatedAt=new Date().toISOString(),U0.update($.code,$),this.pipa.events.emit("backlog_updated",$)}recalculateAncestors($){let q=new Set,J=this.get($);while(J?.parentCode&&!q.has(J.parentCode)){q.add(J.parentCode);let X=this.get(J.parentCode);if(!X)break;this.deriveNodeStatus(X),J=X}}normalizeBody($){return $.replaceAll(String.raw`\n`,`
|
|
141
|
+
`);$.systemPrompt+=W,$.systemPrompt+=Tq.unorderedList(U,({name:H,description:K})=>{return[H,p(K,J.frontmatter?.spawnableTeammates?.[H]??"—")]},"Nenhum colega encontrado.")}return $}updateInstanceOnAgentStart($,q){s.update(q.sessionId,{pipa:q})}}D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],nW.prototype,"initializeSession",null),D$([Y$("before_agent_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",Promise)],nW.prototype,"mitigateModelConcurrency",null),D$([Y$("before_agent_start"),h("design:type",Function),h("design:paramtypes",[typeof BeforeAgentStartEvent==="undefined"?Object:BeforeAgentStartEvent,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",typeof BeforeAgentStartEventResult==="undefined"?Object:BeforeAgentStartEventResult)],nW.prototype,"injectExecutionContext",null),D$([Y$("agent_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],nW.prototype,"updateInstanceOnAgentStart",null);class pj{intervals=new Set;every($,q){this.intervals.add(setInterval(q,$))}everyForTeammate($,q,J){this.every(q,()=>{let X=s.find($);if(!X)return;J(X)})}everyWhenTeammateIs($,q,J,X,Z){this.everyForTeammate(q,X,(U)=>{if(U.status!==$)return;let W=U.lastActiveAt??U.startedAt;if(Date.now()-W<J)return;Z(U)})}everyWhenTeammateFailed($,q,J){this.everyForTeammate($,q,(X)=>{if(X.status!=="failed")return;J(X)})}clearAll($){let{role:q}=s.find($)||{};if(q==="main")return;this.intervals.forEach(clearInterval),this.intervals.clear()}}class C8{sessionIntervals=new pj}var jJ$=60000,mJ$=300000,fJ$=3,xJ$=180000,IJ$=30000;class iW extends C8{failCount=0;removeInactiveTeammate($,q){let{role:J}=s.find(q.sessionId)||{};if(J==="main")return;this.sessionIntervals.everyWhenTeammateIs("idle",q.sessionId,mJ$,jJ$,()=>this.shutdown(void 0,q))}abortStuckTeammate($,q){let{role:J}=s.find(q.sessionId)||{};if(J==="main")return;this.sessionIntervals.everyWhenTeammateIs("running",q.sessionId,xJ$,IJ$,async(X)=>{await X.session?.abort(),q.nudge("teammates.stuck","Operação abortada por inatividade",["A sua operação atual estava demorando muito (mais de 3 minutos sem atualizações) e foi abortada para destravar você.","Por favor, verifique se há algo bloqueando a ferramenta e tente novamente ou mude sua abordagem."])})}setRunningStatus($,q){if(s.find(q.sessionId)?.isStopping)return;s.update(q.sessionId,{status:"running",lastActiveAt:Date.now()})}handleAgentEnd($,q){let J=s.find(q.sessionId),{status:X}=J||{};if(X==="failed"||J?.isStopping)return;s.update(q.sessionId,{status:"idle",lastTool:void 0}),q.toast.show("Colega [name] está aguardando instruções.")}async handleAgentFail($,q){if(!mJ($.message))return;if($.message.stopReason!=="error"){this.failCount=0;return}if(s.find(q.sessionId)?.isStopping)return;if(s.update(q.sessionId,{status:"failed"}),$.type!=="message_end")return;this.failCount++;let J=s.get(q.sessionId);if(!J.parentSessionId)return;if(k6.teammate.cycling.events.includes("error")&&this.failCount>=fJ$)this.failCount=0,await q.cycleModel();s.find(J.parentSessionId)?.pipa?.nudge("teammates.failed",[`Colega ${J.name} <${J.sessionId}> encontrou um erro e parou de funcionar.`])}async shutdown($,q){this.sessionIntervals.clearAll(q.sessionId);let J=s.find(q.sessionId);if(!J||J.isStopping||J.role==="main"||!J.parentSessionId||o.hasActiveTask(J.sessionId))return;s.update(J.sessionId,{status:"stopping"}),s.get(J.parentSessionId).pipa?.nudge("teammates.shutdown",`Colega ${J.name} <${J.sessionId}> encerrando...`),await J.session?.abort(),q.context.shutdown(),s.delete(q.sessionId)}}D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],iW.prototype,"removeInactiveTeammate",null),D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],iW.prototype,"abortStuckTeammate",null),D$([Y$("agent_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],iW.prototype,"setRunningStatus",null),D$([Y$("agent_end"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],iW.prototype,"handleAgentEnd",null),D$([Y$("message_start"),Y$("message_update"),Y$("message_end"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",Promise)],iW.prototype,"handleAgentFail",null),D$([Y$("session_shutdown"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",Promise)],iW.prototype,"shutdown",null);class oW{handleActivityEvent($,q){if(!s.find(q.sessionId))return;let X=$.args||$.input;s.update(q.sessionId,{lastActiveAt:Date.now(),lastEvent:$.type,lastTool:`${$.toolName}${X?`(${JSON.stringify(X)})`:""}`})}logTeammateMessages($,q){let J=s.get(q.sessionId);new e0(J.workspaceDir).save("messages.json",[{content:JSON.stringify($.message,null,0),timestamp:Date.now()}])}}D$([Y$("tool_call"),Y$("tool_result"),Y$("tool_execution_start"),Y$("tool_execution_update"),Y$("tool_execution_end"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],oW.prototype,"handleActivityEvent",null),D$([Y$("message_start"),h("design:type",Function),h("design:paramtypes",[typeof MessageEndEvent==="undefined"?Object:MessageEndEvent,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",Object)],oW.prototype,"logTeammateMessages",null);var _J$=300000,kJ$=15000,bJ$=60000;class sW extends C8{lastIdleNudgeAt=0;idleNudgeCount=0;failure={};nudgeInbox($,q){this.sessionIntervals.everyForTeammate(q.sessionId,60000,(J)=>{if(J.isStopping)return;let Z=new e0(J.workspaceDir).read("inbox.json")||[];if(!Z.length)return;q.nudge("teammates.inbox",`Você tem **${Z.length}** nova(s) mensagem(ns) na sua caixa de entrada. Leia quando puder`,{action:"teammates.read-inbox"})})}nudgeIdleTeammate($,q){this.sessionIntervals.everyWhenTeammateIs("idle",q.sessionId,_J$,kJ$,(J)=>{if(J.isStopping||this.idleNudgeCount>=2)return;if(Date.now()-this.lastIdleNudgeAt<bJ$)return;if(J.role==="main")return;if(s.listSubordinates(q.sessionId).some((Z)=>Z.isRunning))return;this.lastIdleNudgeAt=Date.now(),this.idleNudgeCount++,q.nudge("teammates.idle",`Acordando ${J.name}`,["Você está sem executar ações há 1 minuto.","Continue trabalhando no seu objetivo ou reporte um bloqueio ao supervisor."])})}nudgeFailedTeammate($,q){this.sessionIntervals.everyWhenTeammateFailed(q.sessionId,30000,(J)=>{if(J.isStopping||J.session?.isRetrying)return;let X=s.find(J.parentSessionId??"");if(!X?.isStopping)X?.pipa?.nudge("teammates.failed",`Tentando acordar ${J.name}...`);q.nudge("teammates.failed",`Recuperando ${J.name}`,[`Ei, ${J.name}. Parece que você teve um problema na última execução.`,"Detalhes:",Tq.unorderedList([`Último evento: ${J.lastEvent??"nenhum"}.`,`Status code: ${this.failure.code}.`,`Mensagem: ${this.failure.error?.slice(0,100)}.`]),"Tente retomar a tarefa."])})}async handleAgentFail($,q){if(!mJ($.message))return;if($.message.stopReason!=="error")return;let J=$.message.diagnostics?.[0]?.error;this.failure.code=J?.code,this.failure.error=J?.message}handleIdleActivityEvent(){this.lastIdleNudgeAt=0,this.idleNudgeCount=0}clearReminders($,q){this.sessionIntervals.clearAll(q.sessionId),this.lastIdleNudgeAt=0,this.idleNudgeCount=0}}D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],sW.prototype,"nudgeInbox",null),D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],sW.prototype,"nudgeIdleTeammate",null),D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],sW.prototype,"nudgeFailedTeammate",null),D$([Y$("message_start"),Y$("message_update"),Y$("message_end"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",Promise)],sW.prototype,"handleAgentFail",null),D$([Y$("tool_call"),Y$("tool_result"),Y$("tool_execution_start"),Y$("tool_execution_update"),Y$("tool_execution_end"),h("design:type",Function),h("design:paramtypes",[]),h("design:returntype",void 0)],sW.prototype,"handleIdleActivityEvent",null),D$([Y$("session_shutdown"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],sW.prototype,"clearReminders",null);class rW{clearStoppingContext($,q){if(!s.find(q.sessionId)?.isStopping)return;return{messages:[]}}}D$([Y$("context"),h("design:type",Function),h("design:paramtypes",[typeof ContextEvent==="undefined"?Object:ContextEvent,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",Object)],rW.prototype,"clearStoppingContext",null);var nj=b$(x0(),1),ij=b$(f6(),1);import{truncateToWidth as vJ$}from"@earendil-works/pi-tui";class b4{constructor($){Object.assign(this,$)}id;sessionId;text;status;get isPending(){return this.status==="pending"}get isInProgress(){return this.status==="in_progress"}get isCompleted(){return this.status==="completed"}}class t0{static get store(){let $=E0.get("TODO_STORE");if(!$)$=E0.set("TODO_STORE",new Map);return $}static load($,q){let X=new e0($).read("todo.json")??[];t0.clear(q),X.forEach((Z)=>t0.add(new b4({...Z,sessionId:q})))}static add($){return this.store.set($.id,$),$}static update($,q){let J=this.store.get($);if(!J)return;let X=Object.assign(new b4({}),J,q);return this.store.set($,X),X}static delete($){this.store.delete($)}static clear($){let q=this.list($);for(let J of q)this.delete(J.id)}static list($){return Array.from(this.store.values()).filter((q)=>q.sessionId===$)}static get($){return this.store.get($)}}var aW={update:{code:"todo.update",get failed(){return[this.code,"Falha durante atualização"]}},remove:{code:"todo.remove",get failed(){return[this.code,"Falha durante remoção"]}}};class j5{canUpdate($,q){let J=t0.get(q);if(J?.sessionId!==$)throw new O$(...aW.update.failed,`Item com ID "${q}" não encontrado na lista de afazeres.`);return J}canRemove($,q){let J=t0.get(q);if(J?.sessionId!==$)throw new O$(...aW.remove.failed,`Item com ID "${q}" não encontrado na lista de afazeres.`);return J}}class eW extends j5{pipa;fileManager;constructor($){super();this.pipa=$;let q=s.get($.sessionId);this.fileManager=new e0(q.workspaceDir)}get sessionId(){return this.pipa.sessionId}persist(){this.fileManager.save("todo.json",t0.list(this.sessionId),($)=>$)}update({id:$,action:q,...J}){let X=this.canUpdate(this.sessionId,$),Z=t0.update($,J);return this.persist(),this.pipa.events.emit("todo_updated",Z??X),Z??X}remove({id:$}){let q=this.canRemove(this.sessionId,$);t0.delete($),this.persist(),this.pipa.events.emit("todo_removed",q)}clear(){t0.clear(this.sessionId),this.persist(),this.pipa.events.emit("todo_cleared",{sessionId:this.sessionId})}list(){return t0.list(this.sessionId)}}class tW{step=0;animationInterval;startAnimation($,q=80){if(this.animationInterval)clearInterval(this.animationInterval);this.animationInterval=setInterval(()=>{this.step++,$.requestRender()},q)}stopAnimation(){if(this.animationInterval)clearInterval(this.animationInterval),this.animationInterval=void 0}}class $w extends ij.Mixin(w5,tW){tui;getTeammates;theme;constructor($,q,J){super();this.tui=$;this.getTeammates=q;this.theme=J}start(){this.startAnimation(this.tui,120)}stop(){this.stopAnimation()}render($){let q=this.getTeammates(),J=BQ({items:q,getId:(Z)=>Z.sessionId,getParentId:(Z)=>Z.parentSessionId,sortNodes:(Z)=>nj.sortBy(Z,[(U)=>U.startedAt??0])}).flatMap((Z)=>Z.role==="main"?Z.children:[Z]);if(!J.length)return[this.theme.fg("accent","Colegas"),this.theme.fg("dim","○ nenhum colega ativo")];return[this.theme.fg("accent","Colegas"),...J.flatMap((Z,U)=>this.renderNode(Z,"",U===J.length-1))].map((Z)=>vJ$(Z,$))}invalidate(){return}renderLabel($){let q=this.theme.fg("text",$.name),J={name:q,tool:"",tokens:"",model:"",todos:""};if($.status==="idle")J.name=this.theme.fg("dim",$.name);else J.name=this.theme.bold(q);let X=this.colorStatus($),Z=this.elapsedLabel($),U=Z?this.theme.fg("dim",Z):"";if(!k6.teammate.hideModelName)J.model=this.theme.fg("dim",`(${$.session?.model?.id})`);if($.lastTool&&!k6.teammate.hideTools)J.tool=this.theme.fg("dim",$.lastTool);let W=t0.list($.sessionId);if(W.length)J.todos=this.theme.fg("dim",`passos: ${W.filter((F)=>F.isCompleted).length}/${W.length}`);let H=$.session?.getSessionStats();if(H?.tokens)J.tokens=this.theme.fg("dim",`${G4(H.tokens.input)}↑ ${G4(H.tokens.output)}↓`);let K=PM(this.theme,"·",J.name,J.model,X,U,J.todos,J.tokens,J.tool);return`${this.statusIcon($)} ${K}`}statusIcon($){switch($.status){case"failed":return this.theme.fg("error","×");case"running":return this.theme.fg("accent","●");default:return this.theme.fg("dim","○")}}colorStatus($){let q=$.status,J=hj[q];switch(q){case"failed":return this.theme.fg("error",J);case"running":return cM({step:this.step,seedString:$.sessionId});case"idle":return this.theme.fg("accent",J);case"stopping":return this.theme.fg("warning",J);default:return this.theme.fg("dim",J)}}elapsedLabel($){if($.status==="idle")return"aguardando início";if($.status==="failed")return"erro \uD83D\uDE35";if($.isStopping)return;let q=$.lastActiveAt;if(!q)return"";let J=Date.now(),X=Math.max(0,J-q),Z=Math.floor(X/1000),U=Math.floor(Z/60),W=Z%60;return`última ação há ${U>0?`${U}m ${W}s`:`${W}s`}`}}class qw{captureMain($,q){if(s.get(q.sessionId).role!=="main")return;Y9().context.ui.setWidget("pipa.teammates",(X,Z)=>{let U=new $w(X,s.list,Z);return U.start(),{render:(W)=>U.render(W),invalidate:()=>U.invalidate(),dispose:()=>U.stop()}},{placement:"aboveEditor"})}}D$([Y$("before_agent_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],qw.prototype,"captureMain",null);var oj=b$(f6(),1);import gJ$ from"node:path";class e9 extends oj.Mixin(mU,V5){pipa;folder;constructor($,q){super($);this.pipa=$;this.folder=q}instantiate($){let q=$.task;this.canCreate(q.name,q.blockedBy);let J=B0.get(this.pipa.sessionId),X=this.getParentSquadTask(q.squad)??o.getActiveTask(J.parentSessionId??""),Z=this.pipa.sessionId,U=Date.now(),W=m9(),H={...q,id:W,status:"pending",role:J.name,blockedBy:q.blockedBy||[],directory:gJ$.join(W8,W),parentTaskId:X?.id??q.parentTaskId,squad:X?.squad??q.squad,creatorId:Z,createdAt:U};if(o.add(H),H.parentTaskId)o.update(H.parentTaskId,{status:"in-progress"});return this.pipa.events.emit("task_created",H),this.notifyEligibleIdleTeammates(),H}}var Jw=30000,hJ$=120000,Xw=120000;class Zw extends C8{lastCreatorNudge=new Map;lastTeammateNudge=new Map;nudgeCreatorAboutUnownedTasks(){this.sessionIntervals.every(Jw,()=>{let $=Date.now();e9.listAvailable().forEach((J)=>{let X=s.find(J.creatorId);if(!X?.pipa||X.isStopping)return;if($-J.createdAt<hJ$)return;let U=this.lastCreatorNudge.get(J.id)||0;if($-U<Xw)return;this.lastCreatorNudge.set(J.id,$),X.pipa.nudge("task.reminder","Lembrete: Existem tarefas pendentes prontas para execução.",{action:"task.reminder",message:"As seguintes tarefas estão pendentes, sem proprietário e com todos os bloqueios resolvidos.",tasks:[v4.pick(J,["id","name"])],instructions:["Você deve reivindicar essas tarefas para começar a trabalhar.","Execute: 'task claim ID_DA_TAREFA'"]})})})}nudgeIdleTeammatesAboutAvailableTasks(){this.sessionIntervals.every(Jw,()=>{let $=Date.now(),q=e9.listAvailable();if(q.length===0)return;s.list().filter(({status:X,role:Z})=>X==="idle"&&Z==="subagent").forEach((X)=>{if(!X.pipa||X.isStopping)return;let Z=q.filter((W)=>e9.isEligibleForTask(W,X));if(Z.length===0)return;let U=this.lastTeammateNudge.get(X.sessionId)||0;if($-U<Xw)return;this.lastTeammateNudge.set(X.sessionId,$),X.pipa.nudge("task.available",`Tarefa disponível para o colega ${X.name}.`,{action:"task.available",message:"As seguintes tarefas estão livres, sem bloqueios e prontas para o seu papel.",tasks:v4.map(Z,["id","name"]),instructions:["Você está ocioso no momento.","Você deve reivindicar uma dessas tarefas para começar a trabalhar nela.","Execute: 'task claim ID_DA_TAREFA'"]})})})}nudgeIdleTeammatesWithActiveTasks(){this.sessionIntervals.every(Jw,()=>{let $=s.list().filter(({status:J,role:X})=>J==="idle"&&X==="subagent");if($.length===0)return;let q=v4.keyBy(e9.listActive().filter((J)=>J.owner),(J)=>J.owner.sessionId);$.forEach((J)=>{if(!J.pipa||J.isStopping)return;let X=q[J.sessionId];if(!X)return;let Z=Date.now(),U=this.lastTeammateNudge.get(J.sessionId)||0;if(Z-U<Xw)return;if(s.listSubordinates(J.sessionId).some((W)=>W.isRunning))return;this.lastTeammateNudge.set(J.sessionId,Z),J.pipa.nudge("task.reminder",`Aviso de inatividade com tarefa pendente: ${X.name}.`,{action:"task.reminder",message:`Você está ocioso mas possui a tarefa [${X.id}] ${X.name} em andamento.`,instructions:["Se você já concluiu seu trabalho, você DEVE finalizá-la.",`Execute: 'task complete ${X.id}'`,"Caso contrário, retome o trabalho informando seu supervisor."]})})})}shutdown($,q){this.sessionIntervals.clearAll(q.sessionId)}}D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[]),h("design:returntype",void 0)],Zw.prototype,"nudgeCreatorAboutUnownedTasks",null),D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[]),h("design:returntype",void 0)],Zw.prototype,"nudgeIdleTeammatesAboutAvailableTasks",null),D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[]),h("design:returntype",void 0)],Zw.prototype,"nudgeIdleTeammatesWithActiveTasks",null),D$([Y$("session_shutdown"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],Zw.prototype,"shutdown",null);var sj=b$(x0(),1);import{truncateToWidth as yJ$}from"@earendil-works/pi-tui";var cJ$={"in-progress":0,pending:1,stopped:2,completed:3};class Qw extends w5{getTasks;theme;constructor($,q){super();this.getTasks=$;this.theme=q}expanded=!1;render($){let q=this.getTasks(),J=BQ({items:q.filter((K)=>!K.isSetup),getId:(K)=>K.id,getParentId:(K)=>K.parentTaskId,sortNodes:(K)=>sj.orderBy(K,[(F)=>cJ$[F.status]??1,"completedAt"],["asc","desc"])}),X=J.flatMap((K,F)=>this.renderNode(K,"",F===J.length-1)),Z=this.expanded?X:X.slice(0,k6.tasks.maxVisible),U=X.length-Z.length;if(!Z.length)return[this.theme.fg("accent","Tarefas"),this.theme.fg("dim","○ nenhuma tarefa ativa")];let W=[this.theme.fg("accent","Tarefas"),...Z],H={[String(!1)]:`ver mais ${U} tarefa${U>1?"s":""} (ctrl+t)`,[String(!0)]:"recolher (ctrl+t)"};if(U||this.expanded&&X.length>k6.tasks.maxVisible)W.push(this.theme.fg("dim",H[String(this.expanded)]));return W.map((K)=>yJ$(K,$))}invalidate(){return}toggle(){this.expanded=!this.expanded}renderLabel($){return`${this.statusIcon($)} ${this.label($)}`}statusIcon($){if(o.hasUncompletedHardDependency($))return this.theme.fg("warning","⚠");switch($.status){case"in-progress":return this.theme.fg("accent","●");case"completed":return this.theme.fg("success","✓");case"stopped":return this.theme.fg("error","×");default:return this.theme.fg("dim","○")}}label($){let q=this.theme.fg("text",nM($.name,50)),J=$.parentTaskId?"":iM($.squad,this.theme),X=this.colorStatus($),Z=$.owner?` · ${$.owner.name}`:" · não atribuído";return`${q}${J} ${X}${this.theme.fg("dim",Z)}`}colorStatus($){if(o.hasUncompletedHardDependency($))return this.theme.fg("warning","(bloqueada)");let q=gL[$.status];switch($.status){case"in-progress":return this.theme.fg("accent",`(${q})`);case"completed":return this.theme.fg("success",`(${q})`);case"stopped":return this.theme.fg("error",`(${q})`);default:return this.theme.fg("dim",`(${q})`)}}}import{Key as dJ$,matchesKey as uJ$}from"@earendil-works/pi-tui";class Yw{captureMain($,q){if(B0.get(q.sessionId).role!=="main")return;Y9().context.ui.setWidget("pipa.tasks",(X,Z)=>{let U=new Qw(o.list,Z),W=setInterval(X.requestRender.bind(X),1000),H=Y9().context.ui.onTerminalInput((K)=>{if(uJ$(K,dJ$.ctrl("t")))return U.toggle(),X.requestRender(),{consume:!0}});return{render:(K)=>U.render(K),invalidate:()=>U.invalidate(),dispose:()=>{clearInterval(W),H()}}},{placement:"aboveEditor"})}}D$([Y$("before_agent_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],Yw.prototype,"captureMain",null);var Ww=b$(x0(),1);var lJ$=["pending","in-progress","completed","stopped"],pJ$=["hard","soft"],Uw=A.Object({name:A.String({description:p("Máximo 50 caracteres",'Ex: "Criar schema de usuário", não frases longas')}),description:A.String({description:p("Descrição detalhada da tarefa em português","Inclua contexto, critérios de aceite e restrições")}),blockedBy:A.Array(A.Object({id:A.String({description:"ID da tarefa dependente. Ex: a1b2c3d4."}),type:A.Union(Ww.map(pJ$,A.Literal),{description:"hard: bloqueio total | soft: alerta informativo"})}),{description:p("Dependências da tarefa","Use hard para bloqueio total e soft para alertas","Garante a ordem correta de execução")}),parentTaskId:A.Optional(A.String({description:p("Se esta tarefa for uma sub-tarefa, informe o ID da tarefa pai (épico)","Omita para criar sem pai")})),squad:A.Optional(A.String({description:p("Nome do squad para agrupar tarefas","Herdado automaticamente no instantiate")}))}),ww={instantiate:A.Object({action:A.Literal("instantiate",{description:"instantiate: nova tarefa"}),task:A.Object(Uw.properties,{description:p("Propriedades da nova tarefa","Campos opcionais (blockedBy, parentTaskId, squad) podem ser omitidos")})},{description:p("Cria uma nova tarefa operacional","Use task.instantiate para delegar trabalho a um colega"),examples:[{action:"instantiate",task:{name:"Criar schema de usuário",description:"Criar o schema de usuário com campos nome, email e role.",blockedBy:[{id:"a1b2c3d4",type:"hard"}],squad:"backend"}}]}),get:A.Object({action:A.Literal("get",{description:"get: obter detalhes de uma tarefa"}),id:A.String({description:"ID da tarefa a ser consultada. Ex: a1b2c3d4."})}),setup:A.Object({action:A.Literal("setup",{description:"setup: definir nome, dependências ou tarefa pai da tarefa pré-gerada"}),id:A.String({description:"ID da tarefa a ser configurada. Ex: a1b2c3d4."}),updates:A.Partial(A.Pick(Uw,["name","blockedBy","parentTaskId"]),{description:p("Campos que deseja configurar","Omita os que não mudarem")})}),update:A.Object({action:A.Literal("update",{description:"update: editar uma tarefa existente"}),id:A.String({description:"ID da tarefa a ser atualizada. Ex: a1b2c3d4."}),updates:A.Partial(Uw,{description:p("Campos que deseja atualizar","Apenas inclua o que mudou; omita o restante")})}),list:A.Object({action:A.Literal("list",{description:"list: tarefas criadas"}),status:A.Optional(A.Union(Ww.map(lJ$,A.Literal),{description:p("Filtrar tarefas por status","Omita para listar todas")}))}),remove:A.Object({action:A.Literal("remove",{description:"remove: exclusão de tarefa"}),id:A.String({description:"ID da tarefa a ser removida. Ex: a1b2c3d4."}),force:A.Optional(A.Boolean({description:p("Forçar remoção de tarefa em andamento","Somente criador ou main"),default:!1}))}),claim:A.Object({action:A.Literal("claim",{description:"claim: reivindicar tarefa para si mesmo"}),id:A.String({description:"ID da tarefa a ser reivindicada. Ex: a1b2c3d4."})}),complete:A.Object({action:A.Literal("complete",{description:"complete: marcar tarefa como concluída"}),id:A.String({description:"ID da tarefa concluída. Ex: a1b2c3d4."}),artifactFile:A.String({description:"Caminho absoluto ou relativo do artefato que comprova o resultado da tarefa. Ex: .artifacts/minha-tarefa/relatorio.md"}),force:A.Optional(A.Boolean({description:p("Forçar conclusão da tarefa","Somente main (supervisor) pode usar force"),default:!1}))}),"list-by-squad":A.Object({action:A.Literal("list-by-squad",{description:"list-by-squad: listar tarefas de um squad"}),squad:A.String({description:"Nome do squad para filtrar. Ex: backend."})}),"squad-status":A.Object({action:A.Literal("squad-status",{description:"squad-status: status de progresso de um squad"}),squad:A.String({description:"Nome do squad para consultar. Ex: backend."})})},rj={get:"Buscando tarefa...",setup:"Configurando tarefa...",list:"Listando tarefas ([status])...",instantiate:"Criando nova tarefa [name]...",update:"Atualizando tarefa...",remove:"Removendo tarefa...",claim:"Reivindicando tarefa...",complete:"Concluindo tarefa...","list-by-squad":"Listando tarefas do squad...","squad-status":"Verificando status do squad..."};class ej extends aj.Mixin(R6,Zw,Yw,pW){loadTasks(){o.load()}initialize($){$.registerTool({name:"task",label:"Gerenciar tarefas",description:p("Gerencia tarefas operacionais criadas por agentes durante a execução","Use para delegar trabalho a colegas, reivindicar, atualizar ou concluir tarefas de um squad","Não use para itens persistentes do projeto (use backlog) nem para seus próprios passos de execução (use todo)"),promptSnippet:"task: tarefas operacionais delegadas a colegas (squad). Para itens do projeto use backlog; para seus passos use todo.",promptGuidelines:['Use "task" para trabalho delegado a colegas: criar, reivindicar, atualizar, concluir ou remover tarefas operacionais.','Não use "task" para itens persistentes do projeto (use "backlog") nem para a sua lista de passos (use "todo").'],parameters:Kq.Union(Object.values(ww),{type:"object",unevaluatedProperties:!1}),execute:async(q,J)=>{let X=new e9(this.pipa,W8),U=j9(X,ww,J)[J.action]();if(U)this.pipa.nudge(`task.${J.action}`,void 0,U);return{content:[{type:"text",text:Q9(rj[J.action],{id:J.id??"",name:J.updates?.name||J.task?.name||"",status:J.status??"all"})}],details:U}}})}}D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[]),h("design:returntype",void 0)],ej.prototype,"loadTasks",null);var $m=b$(f6(),1);var Hw={instantiate:A.Object({action:A.Literal("instantiate",{description:"instantiate: usar quando quiser delegar uma tarefa clara para outro colega."}),name:A.String({description:"Nome do colega, em letra minúscula, que deve receber a tarefa. Ex: giulia, ella, edu."}),goal:A.String({description:p("Objetivo concreto que o colega deve alcançar ao executar a tarefa","Inclua contexto e critérios de aceite")})}),list:A.Object({action:A.Literal("list",{description:p("list: usar para descobrir quais colegas existem antes de escolher um.","Retorna nome, papel e ID de cada colega")})}),online:A.Object({action:A.Literal("online",{description:p("online: usar quando precisar saber quais colegas estão disponíveis agora.","Retorna os IDs dos colegas com sessão ativa")})}),"send-inbox":A.Object({action:A.Literal("send-inbox",{description:p("send-inbox: EXCEÇÃO — use apenas quando o colega está comprovadamente ocupado em outra task e você não quer interromper o fluxo dele.","Se houver dúvida, prefira chat")}),teammateId:A.String({description:p("ID do colega que deve receber a mensagem na inbox","Recupere com list ou online")}),message:A.String({description:"Texto objetivo com contexto, pedido e próximo passo esperado."})}),chat:A.Object({action:A.Literal("chat",{description:p("chat: PADRÃO para comunicação entre colegas.","Use para 99% das interações: pedir status, reportar resultado, solicitar ajuste, validar entrega","Resposta imediata = menos latência no ciclo","Quando em dúvida, prefira chat","Não use para comunicação assíncrona quando o colega estiver ocupado (use send-inbox)")}),teammateId:A.String({description:p("ID do colega com quem você quer falar em tempo real","Recupere com list ou online")}),message:A.String({description:"Mensagem curta e direta para a conversa síncrona."})}),"read-inbox":A.Object({action:A.Literal("read-inbox",{description:p("read-inbox: usar para revisar mensagens pendentes recebidas na inbox.","Retorna as mensagens não lidas")})}),dismiss:A.Object({action:A.Literal("dismiss",{description:"dismiss: usar para encerrar a sessão de um colega que já concluiu suas tarefas."}),teammateId:A.String({description:p("ID do colega que deve ser dispensado","Recupere com list ou online")}),reason:A.String({description:"Motivo objetivo da dispensa (ex: tarefas concluídas, não será mais necessário nas próximas etapas)."})})},tj={instantiate:"Invocando colegas...",list:"Listando colegas...",online:"Listando colegas online...",chat:"Enviando mensagem instantânea ao colega...","send-inbox":"Enviando mensagem assíncrona à inbox do colega...","read-inbox":"Lendo mensagens da inbox...",dismiss:"Dispensando colega..."};class qm extends $m.Mixin(R6,nW,iW,sW,rW,oW,qw){initialize($){$.registerTool({name:"teammates",label:"Gerenciar colegas",description:p("Gerencia colegas (subagentes) que executam tarefas específicas","Use para invocar, listar, conversar, enviar mensagem assíncrona, ler inbox ou dispensar colegas","Não use para gerenciar trabalho do projeto (use backlog, task ou todo)"),promptSnippet:"teammates: colegas (subagentes) que executam tarefas. Use para invocar, listar, conversar (chat) ou dispensar.",promptGuidelines:['Use "teammates" para interagir com colegas: invocar, listar, conversar (chat), enviar mensagem assíncrona (send-inbox) ou dispensar.','Prefira "chat" para comunicação síncrona; reserve "send-inbox" para quando o colega estiver comprovadamente ocupado.'],parameters:Kq.Union(Object.values(Hw),{type:"object",unevaluatedProperties:!1}),execute:async(q,J)=>{let X=new s(this.pipa),U=await j9(X,Hw,J)[J.action]();if(U)this.pipa.nudge(`teammates.${J.action}`,void 0,U);return{content:[{type:"text",text:tj[J.action]}],details:U}}})}}var Qm=b$(f6(),1);var Jm=b$(x0(),1);var nJ$=["pending","in_progress","completed"],Vw={instantiate:A.Object({action:A.Literal("instantiate",{description:"instantiate: adicionar novo passo"}),item:A.String({description:'O texto do passo a ser adicionado. Ex: "Ler o artefato de planejamento antes de codar".'})}),update:A.Object({action:A.Literal("update",{description:p("Atualizar passo existente","Use para marcar como concluído, editar o texto ou reabrir")}),id:A.String({description:p("ID do passo a ser atualizado","Recupere com list")}),status:A.Optional(A.Union(Jm.map(nJ$,A.Literal),{description:p("Novo status: pending, in_progress ou completed","Omita para manter o status atual")})),text:A.Optional(A.String({description:p("Novo texto do passo","Omita para manter o texto atual")}))}),remove:A.Object({action:A.Literal("remove",{description:"Remover passo da lista de afazeres"}),id:A.String({description:p("ID do passo a ser removido","Recupere com list")})}),list:A.Object({action:A.Literal("list",{description:"Listar os passos atuais da lista de afazeres, com status e ID de cada um"})}),clear:A.Object({action:A.Literal("clear",{description:"Limpar todos os passos da lista de afazeres"})})},Xm={instantiate:"Adicionando item à lista de afazeres...",update:"Atualizando item da lista de afazeres...",remove:"Removendo item da lista de afazeres...",list:"Listando lista de afazeres...",clear:"Limpando lista de afazeres..."};var Zm=b$(f6(),1);class Kw extends Zm.Mixin(j5,eW){pipa;constructor($){super($);this.pipa=$}instantiate($){let q=new b4({id:m9(),sessionId:this.sessionId,text:$.item,status:"pending"});return t0.add(q),this.persist(),this.pipa.events.emit("todo_created",q),q}}class zw{promptTodoCreation($,q){let J=s.find(q.sessionId);if(!J||J.role==="main"||J.isStopping)return;if(t0.list(q.sessionId).length>0)return;q.nudge("todo.empty",`Colega ${J.name} não possui afazeres na lista.`,["Parece que você ainda não tem um plano de execução definido.","Por favor, use a ferramenta de afazeres (todo) para criar e gerenciar seu checklist de execução em passos pequenos e atômicos."])}notifyPendingTodos($,q){let J=s.find(q.sessionId);if(!J||J.role==="main"||J.isStopping)return;let X=t0.list(q.sessionId).filter((Z)=>!Z.isCompleted);if(!X.length)return t0.clear(q.sessionId);if(s.listSubordinates(q.sessionId).some((Z)=>Z.isRunning))return;q.nudge("todo.pending",`Colega ${J.name} possui ${X.length} afazer(es) em aberto.`,["Por favor, retome o trabalho nos seguintes afazeres pendentes ou marque-os como concluídos:",Tq.unorderedList(X,(Z)=>[Z.id,Z.text])])}}D$([Y$("agent_start"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],zw.prototype,"promptTodoCreation",null),D$([Y$("agent_end"),h("design:type",Function),h("design:paramtypes",[Object,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",void 0)],zw.prototype,"notifyPendingTodos",null);class Ym extends Qm.Mixin(R6,zw){mountPipa(){t0.load(s.get(this.pipa.sessionId).workspaceDir,this.pipa.sessionId)}initialize($){$.registerTool({name:"todo",label:"Gerenciar Lista de Afazeres",description:p("Mantém a sua própria lista de afazeres (passos atômicos) durante a execução","Use para adicionar, atualizar, listar ou remover os passos do seu plano de execução","Não use para itens do projeto (use backlog) nem para trabalho delegado a colegas (use task)"),promptSnippet:"todo: passos atômicos do seu plano de execução. Para itens do projeto use backlog; para trabalho delegado use task.",promptGuidelines:['Use "todo" para o seu próprio plano de execução: passos atômicos que você está executando.','Não use "todo" para itens do projeto (use "backlog") nem para trabalho delegado a colegas (use "task").'],parameters:Kq.Union(Object.values(Vw),{type:"object",unevaluatedProperties:!1}),execute:async(q,J)=>{let X=new Kw(this.pipa),U=j9(X,Vw,J)[J.action]();if(U)this.pipa.nudge(`todo.${J.action}`,void 0,U);return{content:[{type:"text",text:Xm[J.action]}],details:U}}})}}D$([Y$("before_agent_start"),h("design:type",Function),h("design:paramtypes",[]),h("design:returntype",void 0)],Ym.prototype,"mountPipa",null);var Um=b$(f6(),1);class Bw{async validateTerminal({toolName:$,input:q},J){let{role:X}=s.get(J.sessionId),Z=q.action??q.command;if($==="bash"&&Z){let U=eM(Z);if(U)return{block:!0,reason:p(U)};if(FQ(Z))return{block:!0,reason:p(`O uso do comando "${Z}" é proibido para todos os colegas`,"pois pode causar perda de dados ou demorar muito tempo para ser executado.")}}if(X==="main"&&($==="edit"||$==="write")){if(UQ(J))return;if(!await J.context.ui.confirm("Operação de Escrita (Main)",`O supervisor deseja editar um arquivo via '${$}'. Permitir?`))return{block:!0,reason:p(`A execução de ${$} foi cancelada pelo usuário.`,"Lembre-se do seu papel de coordenador. Se a tarefa exige muitas modificações, delegue-a para um colega especializado.")}}}}D$([Y$("tool_call"),h("design:type",Function),h("design:paramtypes",[typeof ToolCallEvent==="undefined"?Object:ToolCallEvent,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",typeof Promise==="undefined"?Object:Promise)],Bw.prototype,"validateTerminal",null);class Fw{async validateTools({toolName:$,input:q},J){let{depth:X,role:Z}=s.get(J.sessionId),U=q.action??q.command,W=oM[$]||[];if(Z==="main"&&W.includes("*"))return{block:!0,reason:p(`O uso de ${$} não é permitido para o supervisor.`,"Se você precisa executar essa operação, considere criar um colega para isso.")};if(Z==="main"&&U&&(W.includes(U)||FQ(U)))return{block:!0,reason:p(`O uso de ${$}(${U}) não é permitido para o supervisor.`,"Se você precisa executar essa operação no terminal ou gerenciar tarefas, considere delegá-la a um colega.")};if($==="ask_user_question"&&Z==="subagent")return{block:!0,reason:p("O colega atual não tem permissão para fazer perguntas ao usuário.","Se você precisa fazer perguntas ao usuário, considere instruir o supervisor a fazer isso por você","através da sua resposta final.")};if($==="teammates"&&X>1)return{block:!0,reason:p("O colega atual não tem permissão para criar outros colegas.","Se você precisa criar colegas, considere instruir o supervisor a fazer isso por você","através da sua resposta final.")};if($==="backlog"&&U==="remove"){if(Z!=="main")return{block:!0,reason:p("Apenas o supervisor (main) pode remover itens do backlog.","Se você precisa remover um item, peça ao supervisor para executar esta operação.")};if(!await J.context.ui.confirm("Remover Item do Backlog (Main)",`O supervisor deseja remover o item "${q.code}" do backlog. Permitir?`))return{block:!0,reason:p("A remoção do item do backlog foi cancelada pelo usuário.","O item permanece inalterado.")}}}}D$([Y$("tool_call"),h("design:type",Function),h("design:paramtypes",[typeof ToolCallEvent==="undefined"?Object:ToolCallEvent,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",typeof Promise==="undefined"?Object:Promise)],Fw.prototype,"validateTools",null);class Wm extends Um.Mixin(R6,Bw,Fw){}var Im=b$(x0(),1),_m=b$(f6(),1);var m5=["epic","story","task","bugfix"],wm=["triage","in_progress","done","blocked","cancelled"],Hm=["low","medium","high","critical"],Vm=["api","ui","integration"],Km=["updatedAt","order"],zm=["ASC","DESC"],Bm=["title","status","priority","tags","parentCode","domain"],f5={list:{code:"backlog.list",get failed(){return[this.code,"Falha ao listar backlog"]},get success(){return[this.code,"Backlog listado com sucesso"]}},create:{code:"backlog.create",get failed(){return[this.code,"Falha ao criar item no backlog"]},get success(){return[this.code,"Item criado no backlog"]}},"update-frontmatter":{code:"backlog.update-frontmatter",get failed(){return[this.code,"Falha ao atualizar frontmatter"]},get success(){return[this.code,"Frontmatter atualizado"]}},"update-body":{code:"backlog.update-body",get failed(){return[this.code,"Falha ao atualizar corpo markdown"]},get success(){return[this.code,"Corpo markdown atualizado"]}},"update-metadata":{code:"backlog.update-metadata",get failed(){return[this.code,"Falha ao atualizar metadata"]},get success(){return[this.code,"Metadata atualizado"]}},select:{code:"backlog.select",get failed(){return[this.code,"Falha na busca"]},get success(){return[this.code,"Busca concluída"]}}};var Gw={instantiate:A.Object({action:A.Literal("instantiate",{description:"instantiate: novo item no backlog"}),title:A.String({description:'Título descritivo da tarefa. Ex: "Criar schema de usuário".'}),type:jq(m5,{description:"Tipo do item: epic, story, task, bugfix"}),priority:jq(Hm,{description:"Prioridade do item: low, medium, high, critical"}),domain:A.Optional(A.Array(jq(Vm,{description:p("Domínios relacionados","Ex: api, ui, integration","Omita se não houver")}))),parentCode:A.Optional(A.String({description:p("Código do item pai (ex: a1b2c3d4)","Omita se for item raiz")})),tags:A.Optional(A.Array(A.String({description:p("Etiqueta livre",'Ex: ["backend", "urgente"]',"Omita se não houver")}))),metadata:A.Optional(A.Record(A.String(),A.Unknown(),{description:p("Campo livre para dados arbitrários (JSON)","Omita se não houver")})),body:A.String({description:p("Conteúdo markdown do item","Inclua contexto, critérios e restrições")})},{description:p("Cria um novo item no backlog do projeto","Use backlog.instantiate para registrar trabalho persistente (epic, story, task, bugfix)"),examples:[{action:"instantiate",title:"Criar schema de usuário",type:"task",priority:"high",domain:["api"],tags:["backend"],body:"Criar o schema de usuário com campos nome, email e role."}]}),list:A.Object({action:A.Literal("list",{description:"list: tarefas criadas"}),status:A.Optional(jq(wm,{description:p("Status do item","Omita para listar todos os status")})),type:A.Optional(jq(m5,{description:p("Tipo do item: epic, story, task, bugfix","Omita para listar todos os tipos")})),sort:A.Optional(A.Object({field:jq(Km,{description:"Campo para ordenar a listagem. Ex: updatedAt."}),order:jq(zm,{description:p("Ordem de ordenação: ASC ou DESC","Omita para ASC")})})),limit:A.Optional(A.Number({description:p("Limite de itens a serem retornados","Omita para retornar todos")}))}),"update-frontmatter":A.Object({action:A.Literal("update-frontmatter",{description:"update-frontmatter: atualiza metadados YAML de um item do backlog"}),code:A.String({description:"Código do item do backlog a ser atualizado. Ex: a1b2c3d4."}),field:jq(Bm,{description:"Campo do frontmatter a ser atualizado: title, status, priority, tags, parentCode ou domain."}),value:A.String({description:"Novo valor do campo do frontmatter."})}),"update-body":A.Object({action:A.Literal("update-body",{description:"update-body: manipula o corpo markdown de um item do backlog"}),code:A.String({description:"Código do item do backlog a ser atualizado. Ex: a1b2c3d4."}),mode:A.Union([A.Literal("append"),A.Literal("replace"),A.Literal("set")],{description:p("Modo de atualização do corpo markdown","append: adiciona ao final; replace: substitui trecho; set: substitui o corpo inteiro.")}),value:A.String({description:p("Texto a ser manipulado no corpo markdown","Em mode append/set é o novo conteúdo; em mode replace é o trecho a localizar")}),replacement:A.Optional(A.String({description:p("Texto a ser usado como substituição","Obrigatório apenas em mode replace; omita nos demais")}))}),"update-metadata":A.Object({action:A.Literal("update-metadata",{description:"update-metadata: faz merge de dados livres (metadata) em um item do backlog"}),code:A.String({description:"Código do item do backlog a ser atualizado. Ex: a1b2c3d4."}),metadata:A.Record(A.String(),A.Unknown(),{description:p("Dados a mesclar no metadata existente do item","Chaves existentes são sobrescritas; demais são preservadas")})}),select:A.Object({action:A.Literal("select",{description:"select: busca item do backlog por título, código ou tags"}),query:A.Optional(A.String({description:p("Consulta de busca","Omita para listar itens recentes")}))}),remove:A.Object({action:A.Literal("remove",{description:"remove: exclusão de item do backlog"}),code:A.String({description:"Código do item do backlog a ser removido. Ex: a1b2c3d4."})})},Fm={list:"Listando [count] item(s) do backlog...",instantiate:"Criando novo item no backlog [item.code]...","update-frontmatter":"Atualizando frontmatter do item [item.code]...","update-body":"Atualizando corpo markdown do item [item.code]...","update-metadata":"Atualizando metadata do item [item.code]...",select:"Buscando no backlog...",remove:"Removendo item do backlog [item.code]..."};var w3=b$(x0(),1);var xm=b$(f6(),1);class g4{constructor($){Object.assign(this,$)}code;title;type;status;body;createdAt;updatedAt;priority;domain;parentCode;order;tags;metadata}function bJ($){return!Array.isArray?Em($)==="[object Array]":Array.isArray($)}function iJ$($){if(typeof $=="string")return $;if(typeof $==="bigint")return $.toString();let q=$+"";return q=="0"&&1/$==-1/0?"-0":q}function Dw($){return $==null?"":iJ$($)}function n6($){return typeof $==="string"}function X3($){return typeof $==="number"}function oJ$($){return $===!0||$===!1||sJ$($)&&Em($)=="[object Boolean]"}function Rm($){return typeof $==="object"}function sJ$($){return Rm($)&&$!==null}function fq($){return $!==void 0&&$!==null}function J3($){return!$.trim().length}function Em($){return $==null?$===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call($)}var rJ$="Incorrect 'index' type",Pw="Invalid doc index: must be a non-negative integer within the bounds of the docs array",aJ$=($)=>`Invalid value for key ${$}`,eJ$=($)=>`Pattern length exceeds max of ${$}.`,tJ$=($)=>`Missing ${$} property in key`,$8$=($)=>`Property 'weight' in key '${$}' must be a positive integer`,q8$="Fuse.match does not support useTokenSearch: token search requires corpus-level statistics (df, fieldCount) that a one-off string comparison does not have. Use new Fuse(...).search(...) instead.",Gm=Object.prototype.hasOwnProperty,J8$=class{constructor($){this._keys=[],this._keyMap={};let q=0;$.forEach((J)=>{let X=Cm(J);this._keys.push(X),this._keyMap[X.id]=X,q+=X.weight}),this._keys.forEach((J)=>{J.weight/=q})}get($){return this._keyMap[$]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}};function Cm($){let q=null,J=null,X=null,Z=1,U=null;if(n6($)||bJ($))X=$,q=Nm($),J=Z3($);else{if(!Gm.call($,"name"))throw Error(tJ$("name"));let W=$.name;if(X=W,Gm.call($,"weight")&&$.weight!==void 0){if(Z=$.weight,Z<=0)throw Error($8$(Z3(W)))}q=Nm(W),J=Z3(W),U=$.getFn??null}return{path:q,id:J,weight:Z,src:X,getFn:U}}function Nm($){return bJ($)?$:$.split(".")}function Z3($){return bJ($)?$.join("."):$}function X8$($,q){let J=[],X=!1,Z=(U,W,H,K)=>{if(!fq(U))return;if(!W[H])J.push(K!==void 0?{v:U,i:K}:U);else{let F=U[W[H]];if(!fq(F))return;if(H===W.length-1&&(n6(F)||X3(F)||oJ$(F)||typeof F==="bigint"))J.push(K!==void 0?{v:Dw(F),i:K}:Dw(F));else if(bJ(F)){X=!0;for(let B=0,P=F.length;B<P;B+=1)Z(F[B],W,H+1,B)}else if(W.length)Z(F,W,H+1,K)}};return Z($,n6(q)?q.split("."):q,0),X?J:J[0]}var Z8$={includeMatches:!1,findAllMatches:!1,minMatchCharLength:1},Q8$={isCaseSensitive:!1,ignoreDiacritics:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:($,q)=>$.score===q.score?$.idx<q.idx?-1:1:$.score<q.score?-1:1},Y8$={location:0,threshold:0.6,distance:100},U8$={useExtendedSearch:!1,useTokenSearch:!1,tokenize:void 0,tokenMatch:"any",getFn:X8$,ignoreLocation:!1,ignoreFieldNorm:!1,fieldNormWeight:1},I$=Object.freeze({...Q8$,...Z8$,...Y8$,...U8$});function W8$($){return $>=9&&$<=13||$===32||$===160}function w8$($=1,q=3){let J=new Map,X=Math.pow(10,q);return{get(Z){let U=0,W=!1;for(let K=0;K<Z.length;K++)if(!W8$(Z.charCodeAt(K))){if(!W)U++,W=!0}else W=!1;if(U===0)U=1;if(J.has(U))return J.get(U);let H=Math.round(X/Math.pow(U,0.5*$))/X;return J.set(U,H),H},clear(){J.clear()}}}var Aw=class{constructor({getFn:$=I$.getFn,fieldNormWeight:q=I$.fieldNormWeight}={}){this.norm=w8$(q,3),this.getFn=$,this.isCreated=!1,this.docs=[],this.keys=[],this._keysMap={},this.setIndexRecords()}setSources($=[]){this.docs=$}setIndexRecords($=[]){this.records=$}setKeys($=[]){this.keys=$,this._keysMap={},$.forEach((q,J)=>{this._keysMap[q.id]=J})}create(){if(this.isCreated||!this.docs.length)return;this.isCreated=!0;let $=this.docs.length;this.records=Array($);let q=0;if(n6(this.docs[0]))for(let J=0;J<$;J++){let X=this._createStringRecord(this.docs[J],J);if(X)this.records[q++]=X}else for(let J=0;J<$;J++)this.records[q++]=this._createObjectRecord(this.docs[J],J);this.records.length=q,this.norm.clear()}add($,q){if(!Number.isInteger(q)||q<0)throw Error(Pw);if(n6($)){let X=this._createStringRecord($,q);if(X)this.records.push(X);return X}let J=this._createObjectRecord($,q);return this.records.push(J),J}removeAt($){if(!Number.isInteger($)||$<0)throw Error(Pw);for(let q=0,J=this.records.length;q<J;q+=1)if(this.records[q].i===$){this.records.splice(q,1);break}for(let q=0,J=this.records.length;q<J;q+=1)if(this.records[q].i>$)this.records[q].i-=1}removeAll($){let q=new Set;for(let X of $)if(Number.isInteger(X)&&X>=0)q.add(X);if(q.size===0)return;this.records=this.records.filter((X)=>!q.has(X.i));let J=Array.from(q).sort((X,Z)=>X-Z);for(let X of this.records){let Z=0,U=J.length;while(Z<U){let W=Z+U>>>1;if(J[W]<X.i)Z=W+1;else U=W}X.i-=Z}}getValueForItemAtKeyId($,q){return $[this._keysMap[q]]}size(){return this.records.length}_createStringRecord($,q){if(!fq($)||J3($))return null;return{v:$,i:q,n:this.norm.get($)}}_createObjectRecord($,q){let J={i:q,$:{}};for(let X=0,Z=this.keys.length;X<Z;X++){let U=this.keys[X],W=U.getFn?U.getFn($):this.getFn($,U.path);if(!fq(W))continue;if(bJ(W)){let H=[];for(let K=0,F=W.length;K<F;K+=1){let B=W[K];if(!fq(B))continue;if(n6(B)){if(!J3(B)){let P={v:B,i:K,n:this.norm.get(B)};H.push(P)}}else if(fq(B.v)){let P=n6(B.v)?B.v:Dw(B.v);if(!J3(P)){let M={v:P,i:B.i,n:this.norm.get(P)};H.push(M)}}}J.$[X]=H}else if(n6(W)&&!J3(W)){let H={v:W,n:this.norm.get(W)};J.$[X]=H}}return J}toJSON(){return{keys:this.keys.map(({getFn:$,...q})=>q),records:this.records}}};function Am($,q,{getFn:J=I$.getFn,fieldNormWeight:X=I$.fieldNormWeight}={}){let Z=new Aw({getFn:J,fieldNormWeight:X});return Z.setKeys($.map(Cm)),Z.setSources(q),Z.create(),Z}function H8$($,{getFn:q=I$.getFn,fieldNormWeight:J=I$.fieldNormWeight}={}){let{keys:X,records:Z}=$,U=new Aw({getFn:q,fieldNormWeight:J});return U.setKeys(X),U.setIndexRecords(Z),U}function V8$($=[],q=I$.minMatchCharLength){let J=[],X=-1,Z=-1,U=0;for(let W=$.length;U<W;U+=1){let H=$[U];if(H&&X===-1)X=U;else if(!H&&X!==-1){if(Z=U-1,Z-X+1>=q)J.push([X,Z]);X=-1}}if($[U-1]&&U-X>=q)J.push([X,U-1]);return J}function K8$($,q,J,{location:X=I$.location,distance:Z=I$.distance,threshold:U=I$.threshold,findAllMatches:W=I$.findAllMatches,minMatchCharLength:H=I$.minMatchCharLength,includeMatches:K=I$.includeMatches,ignoreLocation:F=I$.ignoreLocation}={}){if(q.length>32)throw Error(eJ$(32));let B=q.length,P=$.length,M=Math.max(0,Math.min(X,P)),R=U,S=M,f=(i,Q$)=>{let x=i/B;if(F)return x;let C$=Math.abs(M-Q$);if(!Z)return C$?1:x;return x+C$/Z},y=H>1||K,q$=y?Array(P):[],L$;while((L$=$.indexOf(q,S))>-1){let i=f(0,L$);if(R=Math.min(i,R),S=L$+B,y){let Q$=0;while(Q$<B)q$[L$+Q$]=1,Q$+=1}}S=-1;let G$=[],q0=1,W0=0,z$=B+P,_$=1<<B-1;for(let i=0;i<B;i+=1){let Q$=0,x=z$;while(Q$<x){if(f(i,M+x)<=R)Q$=x;else z$=x;x=Math.floor((z$-Q$)/2+Q$)}z$=x;let C$=Math.max(1,M-x+1),A$=W?P:Math.min(M+x,P)+B,a$=Array(A$+2);a$[A$+1]=(1<<i)-1;for(let _=A$;_>=C$;_-=1){let b=_-1,P$=J[$[b]];if(a$[_]=(a$[_+1]<<1|1)&P$,i)a$[_]|=(G$[_+1]|G$[_])<<1|1|G$[_+1];if(a$[_]&_$){if(q0=f(i,b),q0<=R){if(R=q0,S=b,W0=i,S<=M)break;C$=Math.max(1,2*M-S)}}}if(f(i+1,M)>R)break;G$=a$}if(y&&S>=0){let i=Math.min(P-1,S+B-1+W0);for(let Q$=S;Q$<=i;Q$+=1)if(J[$[Q$]])q$[Q$]=1}let e={isMatch:S>=0,score:Math.max(0.001,q0)};if(y){let i=V8$(q$,H);if(!i.length)e.isMatch=!1;else if(K)e.indices=i}return e}function z8$($){let q={};for(let J=0,X=$.length;J<X;J+=1){let Z=$.charAt(J);q[Z]=(q[Z]||0)|1<<X-J-1}return q}function Sw($){if($.length<=1)return $;$.sort((J,X)=>J[0]-X[0]||J[1]-X[1]);let q=[$[0]];for(let J=1,X=$.length;J<X;J+=1){let Z=q[q.length-1],U=$[J];if(U[0]<=Z[1]+1)Z[1]=Math.max(Z[1],U[1]);else q.push(U)}return q}var Sm={"ł":"l","Ł":"L","đ":"d","Đ":"D","ø":"o","Ø":"O","ħ":"h","Ħ":"H","ŧ":"t","Ŧ":"T","ı":"i","ß":"ss"},B8$=new RegExp("["+Object.keys(Sm).join("")+"]","g"),x5=typeof String.prototype.normalize==="function"?($)=>$.normalize("NFD").replace(/[\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D3-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u09FE\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0AFA-\u0AFF\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C04\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D00-\u0D03\u0D3B\u0D3C\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF7-\u1CF9\u1DC0-\u1DF9\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F]/g,"").replace(B8$,(q)=>Sm[q]):($)=>$,Tw=class{constructor($,{location:q=I$.location,threshold:J=I$.threshold,distance:X=I$.distance,includeMatches:Z=I$.includeMatches,findAllMatches:U=I$.findAllMatches,minMatchCharLength:W=I$.minMatchCharLength,isCaseSensitive:H=I$.isCaseSensitive,ignoreDiacritics:K=I$.ignoreDiacritics,ignoreLocation:F=I$.ignoreLocation}={}){if(this.options={location:q,threshold:J,distance:X,includeMatches:Z,findAllMatches:U,minMatchCharLength:W,isCaseSensitive:H,ignoreDiacritics:K,ignoreLocation:F},$=H?$:$.toLowerCase(),$=K?x5($):$,this.pattern=$,this.chunks=[],!this.pattern.length)return;let B=(M,R)=>{this.chunks.push({pattern:M,alphabet:z8$(M),startIndex:R})},P=this.pattern.length;if(P>32){let M=0,R=P%32,S=P-R;while(M<S)B(this.pattern.substr(M,32),M),M+=32;if(R){let f=P-32;B(this.pattern.substr(f),f)}}else B(this.pattern,0)}searchIn($){let{isCaseSensitive:q,ignoreDiacritics:J,includeMatches:X}=this.options;if($=q?$:$.toLowerCase(),$=J?x5($):$,this.pattern===$){if($.length<this.options.minMatchCharLength)return{isMatch:!1,score:1};let S={isMatch:!0,score:0};if(X)S.indices=[[0,$.length-1]];return S}let{location:Z,distance:U,threshold:W,findAllMatches:H,minMatchCharLength:K,ignoreLocation:F}=this.options,B=[],P=0,M=!1;this.chunks.forEach(({pattern:S,alphabet:f,startIndex:y})=>{let{isMatch:q$,score:L$,indices:G$}=K8$($,S,f,{location:Z+y,distance:U,threshold:W,findAllMatches:H,minMatchCharLength:K,includeMatches:X,ignoreLocation:F});if(q$)M=!0;if(P+=L$,q$&&G$)B.push(...G$)});let R={isMatch:M,score:M?P/this.chunks.length:1};if(M&&X)R.indices=Sw(B);return R}},F8$=new Set(["fuzzy","include"]);function G8$($){return $.startsWith("inverse")}var Ow=[{type:"exact",multiRegex:/^="(.*)"$/,singleRegex:/^=(.*)$/,create:($)=>({type:"exact",search(q){let J=q===$;return{isMatch:J,score:J?0:1,indices:[0,$.length-1]}}})},{type:"include",multiRegex:/^'"(.*)"$/,singleRegex:/^'(.*)$/,create:($)=>({type:"include",search(q){let J=0,X,Z=[],U=$.length;while((X=q.indexOf($,J))>-1)J=X+U,Z.push([X,J-1]);let W=!!Z.length;return{isMatch:W,score:W?0:1,indices:Z}}})},{type:"prefix-exact",multiRegex:/^\^"(.*)"$/,singleRegex:/^\^(.*)$/,create:($)=>({type:"prefix-exact",search(q){let J=q.startsWith($);return{isMatch:J,score:J?0:1,indices:[0,$.length-1]}}})},{type:"inverse-prefix-exact",multiRegex:/^!\^"(.*)"$/,singleRegex:/^!\^(.*)$/,create:($)=>({type:"inverse-prefix-exact",search(q){let J=!q.startsWith($);return{isMatch:J,score:J?0:1,indices:[0,q.length-1]}}})},{type:"inverse-suffix-exact",multiRegex:/^!"(.*)"\$$/,singleRegex:/^!(.*)\$$/,create:($)=>({type:"inverse-suffix-exact",search(q){let J=!q.endsWith($);return{isMatch:J,score:J?0:1,indices:[0,q.length-1]}}})},{type:"suffix-exact",multiRegex:/^"(.*)"\$$/,singleRegex:/^(.*)\$$/,create:($)=>({type:"suffix-exact",search(q){let J=q.endsWith($);return{isMatch:J,score:J?0:1,indices:[q.length-$.length,q.length-1]}}})},{type:"inverse-exact",multiRegex:/^!"(.*)"$/,singleRegex:/^!(.*)$/,create:($)=>({type:"inverse-exact",search(q){let J=q.indexOf($)===-1;return{isMatch:J,score:J?0:1,indices:[0,q.length-1]}}})},{type:"fuzzy",multiRegex:/^"(.*)"$/,singleRegex:/^(.*)$/,create:($,q={})=>{let J=new Tw($,{location:q.location??I$.location,threshold:q.threshold??I$.threshold,distance:q.distance??I$.distance,includeMatches:q.includeMatches??I$.includeMatches,findAllMatches:q.findAllMatches??I$.findAllMatches,minMatchCharLength:q.minMatchCharLength??I$.minMatchCharLength,isCaseSensitive:q.isCaseSensitive??I$.isCaseSensitive,ignoreDiacritics:q.ignoreDiacritics??I$.ignoreDiacritics,ignoreLocation:q.ignoreLocation??I$.ignoreLocation});return{type:"fuzzy",search(X){return J.searchIn(X)}}}}],Dm=Ow.length,N8$="\x00",D8$="|";function P8$($){let q=[],J=$.length,X=0;while(X<J){while(X<J&&$[X]===" ")X++;if(X>=J)break;let Z=X;while(Z<J&&$[Z]!==" "&&$[Z]!=='"')Z++;if(Z<J&&$[Z]==='"'){Z++;while(Z<J){if($[Z]==='"'){let U=Z+1;if(U>=J||$[U]===" "){Z++;break}if($[U]==="$"&&(U+1>=J||$[U+1]===" ")){Z+=2;break}}Z++}q.push($.substring(X,Z)),X=Z}else{while(Z<J&&$[Z]!==" ")Z++;q.push($.substring(X,Z)),X=Z}}return q}function Pm($,q){let J=$.match(q);return J?J[1]:null}function O8$($,q={}){return $.replace(/\\\|/g,N8$).split(D8$).map((J)=>{let X=P8$(J.replace(/\u0000/g,"|").trim()).filter((U)=>U&&!!U.trim()),Z=[];for(let U=0,W=X.length;U<W;U+=1){let H=X[U],K=!1,F=-1;while(!K&&++F<Dm){let B=Ow[F],P=Pm(H,B.multiRegex);if(P)Z.push(B.create(P,q)),K=!0}if(K)continue;F=-1;while(++F<Dm){let B=Ow[F],P=Pm(H,B.singleRegex);if(P){Z.push(B.create(P,q));break}}}return Z})}var M8$=class{constructor($,{isCaseSensitive:q=I$.isCaseSensitive,ignoreDiacritics:J=I$.ignoreDiacritics,includeMatches:X=I$.includeMatches,minMatchCharLength:Z=I$.minMatchCharLength,ignoreLocation:U=I$.ignoreLocation,findAllMatches:W=I$.findAllMatches,location:H=I$.location,threshold:K=I$.threshold,distance:F=I$.distance}={}){this.query=null,this.options={isCaseSensitive:q,ignoreDiacritics:J,includeMatches:X,minMatchCharLength:Z,findAllMatches:W,ignoreLocation:U,location:H,threshold:K,distance:F},$=q?$:$.toLowerCase(),$=J?x5($):$,this.pattern=$,this.query=O8$(this.pattern,this.options)}static condition($,q){return q.useExtendedSearch}searchIn($){let q=this.query;if(!q)return{isMatch:!1,score:1};let{includeMatches:J,isCaseSensitive:X,ignoreDiacritics:Z}=this.options;$=X?$:$.toLowerCase(),$=Z?x5($):$;let U=0,W=[],H=0,K=!1;for(let F=0,B=q.length;F<B;F+=1){let P=q[F];W.length=0,U=0,K=!1;for(let M=0,R=P.length;M<R;M+=1){let S=P[M],{isMatch:f,indices:y,score:q$}=S.search($);if(f){if(U+=1,H+=q$,G8$(S.type))K=!0;if(J)if(F8$.has(S.type))W.push(...y);else W.push(y)}else{H=0,U=0,W.length=0,K=!1;break}}if(U){let M={isMatch:!0,score:H/U};if(K)M.hasInverse=!0;if(J)M.indices=Sw(W);return M}}return{isMatch:!1,score:1}}},Mw=[];function jw(...$){Mw.push(...$)}function Q3($,q){for(let J=0,X=Mw.length;J<X;J+=1){let Z=Mw[J];if(Z.condition($,q))return new Z($,q)}return new Tw($,q)}var Y3={AND:"$and",OR:"$or"},Lw={PATH:"$path",PATTERN:"$val"},Rw=($)=>!!($[Y3.AND]||$[Y3.OR]),L8$=($)=>!!$[Lw.PATH],R8$=($)=>!bJ($)&&Rm($)&&!Rw($),Om=($)=>({[Y3.AND]:Object.keys($).map((q)=>({[q]:$[q]}))});function Tm($,q,{auto:J=!0}={}){let X=(Z)=>{if(n6(Z)){let K={keyId:null,pattern:Z};if(J)K.searcher=Q3(Z,q);return K}let U=Object.keys(Z),W=L8$(Z);if(!W&&U.length>1&&!Rw(Z))return X(Om(Z));if(R8$(Z)){let K=W?Z[Lw.PATH]:U[0],F=W?Z[Lw.PATTERN]:Z[K];if(!n6(F))throw Error(aJ$(K));let B={keyId:Z3(K),pattern:F};if(J)B.searcher=Q3(F,q);return B}let H={children:[],operator:U[0]};return U.forEach((K)=>{let F=Z[K];if(bJ(F))F.forEach((B)=>{H.children.push(X(B))})}),H};if(!Rw($))$=Om($);return X($)}function Ew($,{ignoreFieldNorm:q=I$.ignoreFieldNorm}){let J=1;return $.forEach(({key:X,norm:Z,score:U})=>{let W=X?X.weight:null;J*=Math.pow(U===0&&W?Number.EPSILON:U,(W||1)*(q?1:Z))}),J}function E8$($,{ignoreFieldNorm:q=I$.ignoreFieldNorm}){$.forEach((J)=>{J.score=Ew(J.matches,{ignoreFieldNorm:q})})}var C8$=class{constructor($,q){this.limit=$,this.heap=[],this.comparator=q}get size(){return this.heap.length}insert($){if(this.size<this.limit)this.heap.push($),this._bubbleUp(this.size-1);else if(this.comparator($,this.heap[0])<0)this.heap[0]=$,this._sinkDown(0)}extractSorted(){return this.heap.sort(this.comparator)}_bubbleUp($){let q=this.heap;while($>0){let J=$-1>>1;if(this.comparator(q[$],q[J])<=0)break;let X=q[$];q[$]=q[J],q[J]=X,$=J}}_sinkDown($){let q=this.heap,J=q.length,X=$;do{$=X;let Z=2*$+1,U=2*$+2;if(Z<J&&this.comparator(q[Z],q[X])>0)X=Z;if(U<J&&this.comparator(q[U],q[X])>0)X=U;if(X!==$){let W=q[$];q[$]=q[X],q[X]=W}}while(X!==$)}};function A8$($){let q=[];return $.matches.forEach((J)=>{if(!fq(J.indices)||!J.indices.length)return;let X={indices:J.indices,value:J.value};if(J.key)X.key=J.key.id;if(J.idx>-1)X.refIndex=J.idx;q.push(X)}),q}function S8$($,q,{includeMatches:J=I$.includeMatches,includeScore:X=I$.includeScore}={}){return $.map((Z)=>{let{idx:U}=Z,W={item:q[U],refIndex:U};if(J)W.matches=A8$(Z);if(X)W.score=Z.score;return W})}var T8$=/[\p{L}\p{M}\p{N}_]+/gu,Mm=new WeakSet;function j8$($){if(!Mm.has($))Mm.add($),console.warn(`[Fuse] tokenize regex ${$} lacks the global flag; only the first match per text will be returned. Add the 'g' flag.`)}function m8$($){if(typeof $==="function"){let q=!1;return(J)=>{let X=$(J);if(!q){if(q=!0,!Array.isArray(X)||X.some((Z)=>typeof Z!=="string"))throw Error(`[Fuse] tokenize function must return string[]; received ${Array.isArray(X)?"array containing non-strings":typeof X}.`)}return X}}if($ instanceof RegExp){if(!$.global)j8$($);return(q)=>q.match($)||[]}return(q)=>q.match(T8$)||[]}function Cw({isCaseSensitive:$=!1,ignoreDiacritics:q=!1,tokenize:J}={}){let X=m8$(J);return{tokenize(Z){if(!$)Z=Z.toLowerCase();if(q)Z=x5(Z);return X(Z)}}}var f8$=class{static condition($,q){return q.useTokenSearch}constructor($,q){this.options=q,this.analyzer=Cw({isCaseSensitive:q.isCaseSensitive,ignoreDiacritics:q.ignoreDiacritics,tokenize:q.tokenize});let J=this.analyzer.tokenize($),{df:X,fieldCount:Z}=q._invertedIndex;this.termSearchers=[],this.idfWeights=[];for(let U of J){this.termSearchers.push(new Tw(U,{location:q.location,threshold:q.threshold,distance:q.distance,includeMatches:q.includeMatches,findAllMatches:q.findAllMatches,minMatchCharLength:q.minMatchCharLength,isCaseSensitive:q.isCaseSensitive,ignoreDiacritics:q.ignoreDiacritics,ignoreLocation:!0}));let W=X.get(U)||0,H=Math.log(1+(Z-W+0.5)/(W+0.5));this.idfWeights.push(H)}this.combineAll=q.tokenMatch==="all",this.numTerms=this.termSearchers.length,this.useMask=this.numTerms<=31}searchIn($){if(!this.termSearchers.length)return{isMatch:!1,score:1};let q=[],J=0,X=0,Z=0,U=0,W=this.combineAll&&!this.useMask?new Set:null;for(let F=0;F<this.termSearchers.length;F++){let B=this.termSearchers[F].searchIn($),P=this.idfWeights[F];if(X+=P,B.isMatch){if(Z++,J+=P*(1-B.score),B.indices)q.push(...B.indices);if(this.combineAll)if(this.useMask)U|=1<<F;else W.add(F)}}if(Z===0)return{isMatch:!1,score:1};let H=X>0?1-J/X:0,K={isMatch:!0,score:Math.max(0.001,H)};if(this.options.includeMatches&&q.length)K.indices=Sw(q);if(this.combineAll){if(this.useMask)K.matchedMask=U;else K.matchedTerms=W;K.termCount=this.numTerms}return K}};function Nw($,q,J,X){let Z=X.tokenize(q);if(!Z.length)return;$.fieldCount++,$.docFieldCount.set(J,($.docFieldCount.get(J)||0)+1);let U=new Set(Z),W=$.docTermFieldHits.get(J);if(!W)W=new Map,$.docTermFieldHits.set(J,W);for(let H of U)W.set(H,(W.get(H)||0)+1),$.df.set(H,($.df.get(H)||0)+1)}function jm($,q,J,X){let{i:Z,v:U,$:W}=q;if(U!==void 0){Nw($,U,Z,X);return}if(!W)return;for(let H=0;H<J;H++){let K=W[H];if(!K)continue;if(Array.isArray(K))for(let F of K)Nw($,F.v,Z,X);else Nw($,K.v,Z,X)}}function x8$($,q,J){let X={fieldCount:0,df:new Map,docFieldCount:new Map,docTermFieldHits:new Map};for(let Z of $)jm(X,Z,q,J);return X}function I8$($,q,J,X){jm($,q,J,X)}function _8$($,q){let J=$.docFieldCount.get(q);if(J===void 0)return;$.fieldCount-=J,$.docFieldCount.delete(q);let X=$.docTermFieldHits.get(q);if(!X)return;for(let[Z,U]of X){let W=($.df.get(Z)||0)-U;if(W<=0)$.df.delete(Z);else $.df.set(Z,W)}$.docTermFieldHits.delete(q)}function Lm($,q){if(q.length===0)return;let J=Array.from(new Set(q)).sort((H,K)=>H-K);for(let H of J)_8$($,H);let X=(H)=>{let K=0,F=J.length;while(K<F){let B=K+F>>>1;if(J[B]<H)K=B+1;else F=B}return H-K},Z=J[0],U=new Map;for(let[H,K]of $.docFieldCount)U.set(H>Z?X(H):H,K);$.docFieldCount=U;let W=new Map;for(let[H,K]of $.docTermFieldHits)W.set(H>Z?X(H):H,K);$.docTermFieldHits=W}var vJ=class{constructor($,q,J){this.options={...I$,...q},this.options.useExtendedSearch,this.options.useTokenSearch,this._keyStore=new J8$(this.options.keys),this._docs=$,this._myIndex=null,this._invertedIndex=null,this.setCollection($,J),this._lastQuery=null,this._lastSearcher=null}_getSearcher($){if(this._lastQuery===$)return this._lastSearcher;let q=Q3($,this._invertedIndex?{...this.options,_invertedIndex:this._invertedIndex}:this.options);return this._lastQuery=$,this._lastSearcher=q,q}setCollection($,q){if(this._docs=$,q&&!(q instanceof Aw))throw Error(rJ$);if(this._myIndex=q||Am(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight}),this.options.useTokenSearch){let J=Cw({isCaseSensitive:this.options.isCaseSensitive,ignoreDiacritics:this.options.ignoreDiacritics,tokenize:this.options.tokenize});this._invertedIndex=x8$(this._myIndex.records,this._myIndex.keys.length,J)}this._invalidateSearcherCache()}add($){if(!fq($))return;this._docs.push($);let q=this._myIndex.add($,this._docs.length-1);if(this._invertedIndex&&q){let J=Cw({isCaseSensitive:this.options.isCaseSensitive,ignoreDiacritics:this.options.ignoreDiacritics,tokenize:this.options.tokenize});I8$(this._invertedIndex,q,this._myIndex.keys.length,J)}this._invalidateSearcherCache()}remove($=()=>!1){let q=[],J=[];for(let X=0,Z=this._docs.length;X<Z;X+=1)if($(this._docs[X],X))q.push(this._docs[X]),J.push(X);if(J.length){if(this._invertedIndex)Lm(this._invertedIndex,J);let X=new Set(J);this._docs=this._docs.filter((Z,U)=>!X.has(U)),this._myIndex.removeAll(J),this._invalidateSearcherCache()}return q}removeAt($){if(!Number.isInteger($)||$<0||$>=this._docs.length)throw Error(Pw);if(this._invertedIndex)Lm(this._invertedIndex,[$]);let q=this._docs.splice($,1)[0];return this._myIndex.removeAt($),this._invalidateSearcherCache(),q}_invalidateSearcherCache(){this._lastQuery=null,this._lastSearcher=null}getIndex(){return this._myIndex}_normalizedKeys(){return this._myIndex.keys.map(($)=>this._keyStore.get($.id)||$)}search($,q){let{limit:J=-1}=q||{},{includeMatches:X,includeScore:Z,shouldSort:U,sortFn:W,ignoreFieldNorm:H}=this.options;if(n6($)&&!$.trim()){let M=this._docs.map((R,S)=>({item:R,refIndex:S}));if(X3(J)&&J>-1)M=M.slice(0,J);return M}let K=U&&X3(J)&&J>0&&n6($),F=W,B=(M,R)=>F(M,R)||M.idx-R.idx,P;if(K){let M=new C8$(J,B);if(n6(this._docs[0]))this._searchStringList($,{heap:M,ignoreFieldNorm:H});else this._searchObjectList($,{heap:M,ignoreFieldNorm:H});P=M.extractSorted()}else{if(P=n6($)?n6(this._docs[0])?this._searchStringList($):this._searchObjectList($):this._searchLogical($),E8$(P,{ignoreFieldNorm:H}),U)P.sort(n6($)?B:F);if(X3(J)&&J>-1)P=P.slice(0,J)}return S8$(P,this._docs,{includeMatches:X,includeScore:Z})}_searchStringList($,{heap:q,ignoreFieldNorm:J}={}){let X=this._getSearcher($),Z=this.options.useTokenSearch&&this.options.tokenMatch==="all",{records:U}=this._myIndex,W=q?null:[];return U.forEach(({v:H,i:K,n:F})=>{if(!fq(H))return;let B=X.searchIn(H);if(B.isMatch){let P={score:B.score,value:H,norm:F,indices:B.indices};if(Z)P.matchedMask=B.matchedMask,P.matchedTerms=B.matchedTerms,P.termCount=B.termCount;let M=[P];if(!Z||this._coversAllTokens(M)){let R={item:H,idx:K,matches:M};if(q)R.score=Ew(R.matches,{ignoreFieldNorm:J}),q.insert(R);else W.push(R)}}}),W}_searchLogical($){let q=Tm($,this.options),J=this._normalizedKeys(),X=(H,K,F)=>{if(!("children"in H)){let{keyId:R,searcher:S}=H,f;if(R===null)f=[],J.forEach((y,q$)=>{f.push(...this._findMatches({key:y,value:K[q$],searcher:S}))});else f=this._findMatches({key:this._keyStore.get(R),value:this._myIndex.getValueForItemAtKeyId(K,R),searcher:S});if(f&&f.length)return[{idx:F,item:K,matches:f}];return[]}let{children:B,operator:P}=H,M=[];for(let R=0,S=B.length;R<S;R+=1){let f=B[R],y=X(f,K,F);if(y.length)M.push(...y);else if(P===Y3.AND)return[]}return M},Z=this._myIndex.records,U=new Map,W=[];return Z.forEach(({$:H,i:K})=>{if(fq(H)){let F=X(q,H,K);if(F.length){if(!U.has(K))U.set(K,{idx:K,item:H,matches:[]}),W.push(U.get(K));F.forEach(({matches:B})=>{U.get(K).matches.push(...B)})}}}),W}_searchObjectList($,{heap:q,ignoreFieldNorm:J}={}){let X=this._getSearcher($),Z=this.options.useTokenSearch&&this.options.tokenMatch==="all",{records:U}=this._myIndex,W=this._normalizedKeys(),H=q?null:[];return U.forEach(({$:K,i:F})=>{if(!fq(K))return;let B=[],P=!1,M=!1;if(W.forEach((R,S)=>{let f=this._findMatches({key:R,value:K[S],searcher:X});if(f.length){if(B.push(...f),f[0].hasInverse)M=!0}else P=!0}),M&&P)return;if(B.length&&(!Z||this._coversAllTokens(B))){let R={idx:F,item:K,matches:B};if(q)R.score=Ew(R.matches,{ignoreFieldNorm:J}),q.insert(R);else H.push(R)}}),H}_findMatches({key:$,value:q,searcher:J}){if(!fq(q))return[];let X=[];if(bJ(q))q.forEach(({v:Z,i:U,n:W})=>{if(!fq(Z))return;let H=J.searchIn(Z);if(H.isMatch){let K={score:H.score,key:$,value:Z,idx:U,norm:W,indices:H.indices,hasInverse:H.hasInverse};if(H.termCount!==void 0)K.matchedMask=H.matchedMask,K.matchedTerms=H.matchedTerms,K.termCount=H.termCount;X.push(K)}});else{let{v:Z,n:U}=q,W=J.searchIn(Z);if(W.isMatch){let H={score:W.score,key:$,value:Z,norm:U,indices:W.indices,hasInverse:W.hasInverse};if(W.termCount!==void 0)H.matchedMask=W.matchedMask,H.matchedTerms=W.matchedTerms,H.termCount=W.termCount;X.push(H)}}return X}_coversAllTokens($){let q=$.length?$[0].termCount:void 0;if(q===void 0)return!0;if(q<=31){let X=0;for(let Z=0;Z<$.length;Z++)X|=$[Z].matchedMask||0;return X===2**q-1}let J=new Set;for(let X=0;X<$.length;X++){let Z=$[X].matchedTerms;if(Z)for(let U of Z)J.add(U)}return J.size===q}};vJ.version="7.5.0";vJ.createIndex=Am;vJ.parseIndex=H8$;vJ.config=I$;vJ.match=function($,q,J){if(J&&J.useTokenSearch)throw Error(q8$);return Q3($,{...I$,...J}).searchIn(q)};vJ.parseQuery=Tm;jw(M8$);jw(f8$);vJ.use=function(...$){$.forEach((q)=>jw(q))};var U3=vJ;var mm=b$(x0(),1),fm=b$(f6(),1);var W3=b$(x0(),1);class U0{pipa;constructor($){this.pipa=$}static get fileManager(){return new e0(cX)}static get store(){let $=E0.get(NQ);if(!$)$=E0.set(NQ,new Map);return $}static load(){let $=new e0(cX);U0.clear(),($.read(dX)??[]).forEach((q)=>U0.add(new g4(q)))}static persist(){U0.fileManager.save(dX,U0.all(),($)=>$)}static listBy($){let q={};if($?.status)q.status=$.status;if($?.type)q.type=$.type;let J=W3.filter([...U0.store.values()],q);if($?.sort){if(J=W3.sortBy(J,$.sort.field),$.sort.order==="DESC")J=J.reverse()}if($?.limit)J=J.slice(0,$.limit);return J}static all(){return[...U0.store.values()]}static get($){return U0.store.get($)}static clear(){U0.store.clear()}static add($){U0.store.set($.code,$),U0.persist()}static update($,q){let J=U0.store.get($);if(!J)return q;return E0.set(NQ,U0.store.set($,Object.assign(new g4({}),J,q))),U0.persist(),U0.get($)}static delete($){return U0.store.delete($),U0.persist(),!0}}class I5{canUpdate($,q="update-frontmatter"){let J=U0.get($);if(!J)throw new O$(...f5[q].failed,`Item com código "${$}" não encontrado no backlog.`);return J}canRemove($){let q=U0.get($);if(!q)throw new O$("backlog.remove",`Item com código "${$}" não encontrado no backlog.`);return q}canSelect($){let q=U0.get($);if(!q)throw new O$(...f5.select.failed,`Item com código "${$}" não encontrado no backlog.`);return q}canCreate({type:$,title:q}){if(!$||!m5.includes($))throw new O$(...f5.create.failed,`Tipo inválido: "${$}". Esperado: epic, story, task, bugfix.`);if(!q?.trim()||q.trim().length<3)throw new O$(...f5.create.failed,"Título deve ter pelo menos 3 caracteres.")}}class mw extends fm.Mixin(I5,U0){pipa;constructor($){super();this.pipa=$}get($){return U0.get($)}list($){return U0.listBy($)}updateFrontmatter({code:$,field:q,value:J}){let X=this.canUpdate($),Z=X.parentCode;if(X[q]=J,X.updatedAt=new Date().toISOString(),U0.update(X.code,X),q==="status"||q==="parentCode")this.recalculateAncestors($);if(q==="parentCode"&&Z&&Z!==X.parentCode)this.recalculateAncestors(Z);return this.pipa.events.emit("backlog_updated",X),X}deriveStatus($,q){if($.length===0)return q;let J=$[0].status;if($.every((Z)=>Z.status===J))return J;return"in_progress"}deriveNodeStatus($){let q=U0.all().filter((X)=>X.parentCode===$.code),J=this.deriveStatus(q,$.status);if(J!==$.status)$.status=J,$.updatedAt=new Date().toISOString(),U0.update($.code,$),this.pipa.events.emit("backlog_updated",$)}recalculateAncestors($){let q=new Set,J=this.get($);while(J?.parentCode&&!q.has(J.parentCode)){q.add(J.parentCode);let X=this.get(J.parentCode);if(!X)break;this.deriveNodeStatus(X),J=X}}normalizeBody($){return $.replaceAll(String.raw`\n`,`
|
|
142
142
|
`)}updateBody({code:$,mode:q,value:J,replacement:X=""}){let Z=this.canUpdate($);return Z.body=XQ(Z.body,{mode:q,value:J,replacement:X}),Z.updatedAt=new Date().toISOString(),U0.update(Z.code,Z),this.pipa.events.emit("backlog_updated",Z),Z}updateMetadata({code:$,metadata:q}){let J=this.canUpdate($,"update-metadata");return J.metadata=mm.merge({},J.metadata,q),J.updatedAt=new Date().toISOString(),U0.update(J.code,J),this.pipa.events.emit("backlog_updated",J),J}select({query:$}){let q=U0.listBy();return new U3(q,{keys:["title","code","tags"],threshold:0.4}).search($).map((X)=>X.item)}remove({code:$}){let q=this.canRemove($),J=q.parentCode;if(U0.delete($),J){let X=this.get(J);if(X)this.deriveNodeStatus(X),this.recalculateAncestors(J)}return this.pipa.events.emit("backlog_removed",q),q}}class fw extends xm.Mixin(I5,mw){pipa;constructor($){super($);this.pipa=$}instantiate($){this.canCreate($);let q=new Date().toISOString(),J=new g4({...w3.omit($,["action"]),code:m9(8),status:"triage",createdAt:q,updatedAt:q});if(U0.add(J),J.parentCode)this.recalculateAncestors(J.code);return this.pipa.events.emit("backlog_created",J),this.pipa.nudge("backlog.create",`Item criado: ${J.code}`),w3.merge({},$,J)}}var k8$=new Set(["write","edit","read","find"]);class xw{blockedToolCallIds=new Set;guardBacklogWrite($,q){let{toolName:J,toolCallId:X}=$;if(!J||!k8$.has(J))return;if(!pM($))return;let Z=$.input.path??"";if(!Z.includes(dX)||!Z.includes(cX))return;return this.blockedToolCallIds.add(X),{block:!0,reason:p(`O uso de "${J}" em arquivos do backlog não é permitido.`,'Utilize a tool backlog com action "update-body" ou "update-frontmatter" para manipular tarefas.',`Path bloqueado: ${Z}`)}}collapseBlockedLoop($,q){if(!this.blockedToolCallIds.size)return;let J=this.blockedToolCallIds,X=$.messages.filter((W)=>{if(mJ(W))return!KQ(W.content,J);if(VQ(W))return!zQ(W,J);return!0}),Z=$.messages.length-X.length;if(this.blockedToolCallIds.clear(),!Z)return;let U={role:"user",content:[{type:"text",text:p(`${Z} tentativa(s) de write/edit/read em backlog.json foram removidas do contexto.`,"Arquivos do backlog devem ser manipulados exclusivamente via a tool backlog.",'Use backlog com action "update-body" ou "update-frontmatter".')}],timestamp:Date.now()};return $.messages=[...X,U],$}}D$([Y$("tool_call"),h("design:type",Function),h("design:paramtypes",[typeof ToolCallEvent==="undefined"?Object:ToolCallEvent,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",Object)],xw.prototype,"guardBacklogWrite",null),D$([Y$("context"),h("design:type",Function),h("design:paramtypes",[typeof ContextEvent==="undefined"?Object:ContextEvent,typeof PipaApi==="undefined"?Object:PipaApi]),h("design:returntype",Object)],xw.prototype,"collapseBlockedLoop",null);class km extends _m.Mixin(R6,xw){loadBacklog(){U0.load()}initialize($){$.registerTool({name:"backlog",label:"Gerenciar Backlog",description:p("Gerencia o backlog local do projeto: itens de trabalho persistentes (epics, stories, tasks, bugfixes) em backlog.json","Use para criar, listar, atualizar ou remover itens de trabalho do projeto","Não use para tarefas operacionais de execução (use task) nem para seus próprios passos (use todo)"),promptSnippet:"backlog: itens de trabalho persistentes do projeto (epics, stories, tasks, bugfixes). Para tarefas operacionais use task; para seus passos use todo.",promptGuidelines:['Use "backlog" para o backlog persistente do projeto: epics, stories, tasks e bugfixes em backlog.json.','Não use "backlog" para trabalho delegado a colegas (use "task") nem para a sua lista de passos (use "todo").'],parameters:Kq.Union(Object.values(Gw),{type:"object",unevaluatedProperties:!1}),execute:async(q,J)=>{let X=new fw(this.pipa),U=j9(X,Gw,J)[J.action]();if(U)this.pipa.nudge(`backlog.${J.action}`,void 0,U);return{content:[{type:"text",text:Q9(Fm[J.action],{...J,item:U,count:Im.size(U)})}],details:U}}})}}D$([Y$("session_start"),h("design:type",Function),h("design:paramtypes",[]),h("design:returntype",void 0)],km.prototype,"loadBacklog",null);var b8$="https://router.espresso.ia.br",bm=process.env.ESPRESSO_AUTH_TOKEN||process.env.ANTHROPIC_AUTH_TOKEN,Iw={input:0,output:0,cacheRead:0,cacheWrite:0};class vm extends R6{initialize($){$.registerProvider("espresso",{baseUrl:b8$,...bm?{apiKey:bm}:{},headers:{"User-Agent":"pi-espresso/1.0"},api:"openai-responses",models:[{id:"claude-haiku",name:"Espresso Light",reasoning:!0,input:["text","image"],cost:Iw,contextWindow:200000,maxTokens:16384},{id:"claude-sonnet",name:"Espresso Medium",reasoning:!0,input:["text","image"],cost:Iw,contextWindow:200000,maxTokens:16384},{id:"claude-opus",name:"Espresso Heavy",reasoning:!0,input:["text","image"],cost:Iw,contextWindow:200000,maxTokens:16384}]})}addToolsDefinition($,q){if(q.context.model?.provider!=="espresso")return;if(!s.find(q.sessionId))return;let Z=q.getAllTools().filter((U)=>["teammates","task","backlog","docs","todo","project-search"].includes(U.name));return $.systemPrompt+=`
|
|
143
143
|
|
|
144
144
|
Custom Tools
|
package/package.json
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aelinrezende/pipa-core",
|
|
3
|
-
"version": "1.0.3",
|
|
4
3
|
"type": "module",
|
|
5
4
|
"description": "SDK de features e utilitários da Pipa para construir extensões Pi customizadas",
|
|
6
5
|
"main": "./index.js",
|
|
@@ -65,5 +64,6 @@
|
|
|
65
64
|
"protobufjs",
|
|
66
65
|
"@google/genai"
|
|
67
66
|
]
|
|
68
|
-
}
|
|
67
|
+
},
|
|
68
|
+
"version": "1.0.5"
|
|
69
69
|
}
|