@sylphx/flow 0.2.3 → 0.2.4
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/dist/chunk-057m762a.js +4 -0
- package/dist/{chunk-7nht27vs.js.map → chunk-057m762a.js.map} +1 -1
- package/dist/chunk-2j2gmjg5.js +107 -0
- package/dist/{chunk-wnaa55wn.js.map → chunk-2j2gmjg5.js.map} +6 -5
- package/dist/{chunk-asr22mbn.js → chunk-2nfq57ym.js} +1 -1
- package/dist/{chunk-cs1s5c3g.js → chunk-372bgp30.js} +3 -3
- package/dist/{chunk-cs1s5c3g.js.map → chunk-372bgp30.js.map} +1 -1
- package/dist/{chunk-m9nt0bj3.js → chunk-51kpynby.js} +3 -3
- package/dist/{chunk-m9nt0bj3.js.map → chunk-51kpynby.js.map} +1 -1
- package/dist/{chunk-1rptg3yg.js → chunk-585jp0rg.js} +1 -1
- package/dist/{chunk-hj6r7703.js → chunk-66qzap9m.js} +2 -2
- package/dist/{chunk-hj6r7703.js.map → chunk-66qzap9m.js.map} +1 -1
- package/dist/{chunk-z2rtyk3d.js → chunk-6eb5a8kv.js} +4 -4
- package/dist/{chunk-z2rtyk3d.js.map → chunk-6eb5a8kv.js.map} +1 -1
- package/dist/chunk-7h737bp8.js +4 -0
- package/dist/{chunk-fs3f7acb.js.map → chunk-7h737bp8.js.map} +2 -2
- package/dist/chunk-8ep9gk6d.js +4 -0
- package/dist/{chunk-5szm4n3x.js.map → chunk-8ep9gk6d.js.map} +2 -2
- package/dist/{chunk-bnxtqetr.js → chunk-9qzv4trv.js} +3 -3
- package/dist/{chunk-bnxtqetr.js.map → chunk-9qzv4trv.js.map} +2 -2
- package/dist/chunk-b0047ggx.js +3 -0
- package/dist/{chunk-w2vbmr93.js.map → chunk-b0047ggx.js.map} +2 -2
- package/dist/{chunk-gyq335sw.js → chunk-ceyg2zjg.js} +3 -3
- package/dist/{chunk-gyq335sw.js.map → chunk-ceyg2zjg.js.map} +1 -1
- package/dist/chunk-cjy100rr.js +6 -0
- package/dist/{chunk-d4hj6d4t.js.map → chunk-cjy100rr.js.map} +2 -2
- package/dist/{chunk-gh83x9ya.js → chunk-d6k94684.js} +1 -1
- package/dist/chunk-e74zv5ct.js +19 -0
- package/dist/chunk-e74zv5ct.js.map +10 -0
- package/dist/{chunk-hxj4eapp.js → chunk-etqfkn4f.js} +3 -3
- package/dist/{chunk-hxj4eapp.js.map → chunk-etqfkn4f.js.map} +1 -1
- package/dist/{chunk-8z1sf25t.js → chunk-f676awyz.js} +3 -3
- package/dist/{chunk-8z1sf25t.js.map → chunk-f676awyz.js.map} +1 -1
- package/dist/{chunk-sxy6vp20.js → chunk-f9yb2zk3.js} +2 -2
- package/dist/{chunk-sxy6vp20.js.map → chunk-f9yb2zk3.js.map} +1 -1
- package/dist/{chunk-hft1735c.js → chunk-fyvtp08n.js} +2 -2
- package/dist/{chunk-hft1735c.js.map → chunk-fyvtp08n.js.map} +1 -1
- package/dist/chunk-gmmm7xpw.js +23 -0
- package/dist/{chunk-jgsq3xax.js.map → chunk-gmmm7xpw.js.map} +4 -4
- package/dist/{chunk-xata5rw6.js → chunk-mtrcdhzn.js} +3 -3
- package/dist/{chunk-xata5rw6.js.map → chunk-mtrcdhzn.js.map} +1 -1
- package/dist/{chunk-8krxe10w.js → chunk-ny1s8fnh.js} +2 -2
- package/dist/{chunk-8krxe10w.js.map → chunk-ny1s8fnh.js.map} +1 -1
- package/dist/{chunk-4fr8q0jy.js → chunk-rsagxdqj.js} +71 -71
- package/dist/{chunk-4fr8q0jy.js.map → chunk-rsagxdqj.js.map} +3 -3
- package/dist/{chunk-vjf57v4h.js → chunk-rvx8bgqk.js} +3 -3
- package/dist/{chunk-vjf57v4h.js.map → chunk-rvx8bgqk.js.map} +1 -1
- package/dist/{chunk-9c2nr2fz.js → chunk-sgafqzer.js} +3 -3
- package/dist/{chunk-9c2nr2fz.js.map → chunk-sgafqzer.js.map} +2 -2
- package/dist/{chunk-s6g21d1g.js → chunk-vc4xy6dm.js} +3 -3
- package/dist/{chunk-s6g21d1g.js.map → chunk-vc4xy6dm.js.map} +1 -1
- package/dist/chunk-weshapwk.js +27 -0
- package/dist/{chunk-wrx1n6q6.js.map → chunk-weshapwk.js.map} +11 -4
- package/dist/{chunk-ndah8mn9.js → chunk-z61qdct1.js} +2 -2
- package/dist/{chunk-ndah8mn9.js.map → chunk-z61qdct1.js.map} +1 -1
- package/dist/index.js +332 -331
- package/dist/index.js.map +14 -11
- package/package.json +1 -1
- package/dist/chunk-5szm4n3x.js +0 -4
- package/dist/chunk-7nht27vs.js +0 -4
- package/dist/chunk-d4hj6d4t.js +0 -6
- package/dist/chunk-f06ma45b.js +0 -15
- package/dist/chunk-f06ma45b.js.map +0 -16
- package/dist/chunk-fs3f7acb.js +0 -4
- package/dist/chunk-jgsq3xax.js +0 -23
- package/dist/chunk-w2vbmr93.js +0 -3
- package/dist/chunk-wd9qbbe5.js +0 -5
- package/dist/chunk-wd9qbbe5.js.map +0 -10
- package/dist/chunk-wnaa55wn.js +0 -108
- package/dist/chunk-wrx1n6q6.js +0 -16
- /package/dist/{chunk-asr22mbn.js.map → chunk-2nfq57ym.js.map} +0 -0
- /package/dist/{chunk-1rptg3yg.js.map → chunk-585jp0rg.js.map} +0 -0
- /package/dist/{chunk-gh83x9ya.js.map → chunk-d6k94684.js.map} +0 -0
package/package.json
CHANGED
package/dist/chunk-5szm4n3x.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{X as J}from"./chunk-8z1sf25t.js";import{Mb as C,Ob as W}from"./chunk-sxy6vp20.js";var V=C((zq,u)=>{var{create:x,defineProperty:X,getOwnPropertyDescriptor:D,getOwnPropertyNames:S,getPrototypeOf:I}=Object,M=Object.prototype.hasOwnProperty,y=(q,z)=>{for(var B in z)X(q,B,{get:z[B],enumerable:!0})},w=(q,z,B,F)=>{if(z&&typeof z==="object"||typeof z==="function"){for(let G of S(z))if(!M.call(q,G)&&G!==B)X(q,G,{get:()=>z[G],enumerable:!(F=D(z,G))||F.enumerable})}return q},v=(q,z,B)=>(B=q!=null?x(I(q)):{},w(z||!q||!q.__esModule?X(B,"default",{value:q,enumerable:!0}):B,q)),g=(q)=>w(X({},"__esModule",{value:!0}),q),R={};y(R,{findRootDir:()=>l,getUserDataDir:()=>P});u.exports=g(R);var Q=v(W("path")),h=v(W("fs")),$=v(W("os")),b=J();function l(){try{let q=process.cwd();while(q!==Q.default.dirname(q)){let z=Q.default.join(q,".vercel");if(h.default.existsSync(z))return q;q=Q.default.dirname(q)}}catch(q){throw new b.VercelOidcTokenError("Token refresh only supported in node server environments")}throw new b.VercelOidcTokenError("Unable to find root directory")}function P(){if(process.env.XDG_DATA_HOME)return process.env.XDG_DATA_HOME;switch($.default.platform()){case"darwin":return Q.default.join($.default.homedir(),"Library/Application Support");case"linux":return Q.default.join($.default.homedir(),".local/share");case"win32":if(process.env.LOCALAPPDATA)return process.env.LOCALAPPDATA;return null;default:return null}}});var qq=C((Bq,j)=>{var{create:c,defineProperty:Y,getOwnPropertyDescriptor:f,getOwnPropertyNames:k,getPrototypeOf:i}=Object,s=Object.prototype.hasOwnProperty,n=(q,z)=>{for(var B in z)Y(q,B,{get:z[B],enumerable:!0})},N=(q,z,B,F)=>{if(z&&typeof z==="object"||typeof z==="function"){for(let G of k(z))if(!s.call(q,G)&&G!==B)Y(q,G,{get:()=>z[G],enumerable:!(F=f(z,G))||F.enumerable})}return q},E=(q,z,B)=>(B=q!=null?c(i(q)):{},N(z||!q||!q.__esModule?Y(B,"default",{value:q,enumerable:!0}):B,q)),p=(q)=>N(Y({},"__esModule",{value:!0}),q),O={};n(O,{assertVercelOidcTokenResponse:()=>A,findProjectInfo:()=>m,getTokenPayload:()=>t,getVercelCliToken:()=>d,getVercelDataDir:()=>T,getVercelOidcToken:()=>a,isExpired:()=>o,loadToken:()=>r,saveToken:()=>_});j.exports=p(O);var L=E(W("path")),H=E(W("fs")),K=J(),Z=V();function T(){let z=(0,Z.getUserDataDir)();if(!z)return null;return L.join(z,"com.vercel.cli")}function d(){let q=T();if(!q)return null;let z=L.join(q,"auth.json");if(!H.existsSync(z))return null;let B=H.readFileSync(z,"utf8");if(!B)return null;return JSON.parse(B).token}async function a(q,z,B){try{let F=`https://api.vercel.com/v1/projects/${z}/token?source=vercel-oidc-refresh${B?`&teamId=${B}`:""}`,G=await fetch(F,{method:"POST",headers:{Authorization:`Bearer ${q}`}});if(!G.ok)throw new K.VercelOidcTokenError(`Failed to refresh OIDC token: ${G.statusText}`);let U=await G.json();return A(U),U}catch(F){throw new K.VercelOidcTokenError("Failed to refresh OIDC token",F)}}function A(q){if(!q||typeof q!=="object")throw TypeError("Expected an object");if(!("token"in q)||typeof q.token!=="string")throw TypeError("Expected a string-valued token property")}function m(){let q=(0,Z.findRootDir)();if(!q)throw new K.VercelOidcTokenError("Unable to find root directory");try{let z=L.join(q,".vercel","project.json");if(!H.existsSync(z))throw new K.VercelOidcTokenError("project.json not found");let B=JSON.parse(H.readFileSync(z,"utf8"));if(typeof B.projectId!=="string"&&typeof B.orgId!=="string")throw TypeError("Expected a string-valued projectId property");return{projectId:B.projectId,teamId:B.orgId}}catch(z){throw new K.VercelOidcTokenError("Unable to find project ID",z)}}function _(q,z){try{let B=(0,Z.getUserDataDir)();if(!B)throw new K.VercelOidcTokenError("Unable to find user data directory");let F=L.join(B,"com.vercel.token",`${z}.json`),G=JSON.stringify(q);H.mkdirSync(L.dirname(F),{mode:432,recursive:!0}),H.writeFileSync(F,G),H.chmodSync(F,432);return}catch(B){throw new K.VercelOidcTokenError("Failed to save token",B)}}function r(q){try{let z=(0,Z.getUserDataDir)();if(!z)return null;let B=L.join(z,"com.vercel.token",`${q}.json`);if(!H.existsSync(B))return null;let F=JSON.parse(H.readFileSync(B,"utf8"));return A(F),F}catch(z){throw new K.VercelOidcTokenError("Failed to load token",z)}}function t(q){let z=q.split(".");if(z.length!==3)throw new K.VercelOidcTokenError("Invalid token");let B=z[1].replace(/-/g,"+").replace(/_/g,"/"),F=B.padEnd(B.length+(4-B.length%4)%4,"=");return JSON.parse(Buffer.from(F,"base64").toString("utf8"))}var e=900000;function o(q){return q.exp*1000<Date.now()+e}});export default qq();
|
|
2
|
-
export{qq as W};
|
|
3
|
-
|
|
4
|
-
//# debugId=1E88FA67CD4A1EDF64756E2164756E21
|
package/dist/chunk-7nht27vs.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{Ba as b}from"./chunk-xata5rw6.js";import"./chunk-hxj4eapp.js";import"./chunk-cv1nhr27.js";import"./chunk-gyq335sw.js";import"./chunk-sxy6vp20.js";async function A(k,q={}){return b(k).fetchModels(q)}export{A as fetchModels};
|
|
2
|
-
export{A as Aa};
|
|
3
|
-
|
|
4
|
-
//# debugId=E6E3B03DCE59A8FA64756E2164756E21
|
package/dist/chunk-d4hj6d4t.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{U as _}from"./chunk-cs1s5c3g.js";import{Lb as Z}from"./chunk-sxy6vp20.js";var W=Z(_(),1);import{readFile as $,readdir as z,access as C}from"node:fs/promises";import{join as U,parse as G,relative as B}from"node:path";import{homedir as D}from"node:os";async function v(k,q=!1,x){try{let H=await $(k,"utf-8"),{data:N,content:K}=W.default(H);if(!N.name||typeof N.name!=="string")return console.error(`Rule file ${k} missing required 'name' field`),null;let O={name:N.name,description:N.description||"",enabled:N.enabled!==void 0?Boolean(N.enabled):!0};return{id:x||G(k).name,metadata:O,content:K.trim(),isBuiltin:q,filePath:k}}catch(H){return console.error(`Failed to load rule from ${k}:`,H),null}}async function V(k,q=!1){try{let H=(await z(k,{recursive:!0,withFileTypes:!0})).filter((K)=>K.isFile()&&K.name.endsWith(".md")).map((K)=>{let O=U(K.parentPath||K.path,K.name),T=B(k,O).replace(/\.md$/,"");return{fullPath:O,ruleId:T}});return(await Promise.all(H.map(({fullPath:K,ruleId:O})=>v(K,q,O)))).filter((K)=>K!==null)}catch(x){return[]}}async function F(){let k=new URL(".",import.meta.url).pathname,q=U(k,"..","assets","rules"),x=U(k,"..","..","assets","rules");try{return await C(q),q}catch{return x}}function M(k){let q=U(D(),".sylphx-flow","rules"),x=U(k,".sylphx-flow","rules");return[q,x]}async function X(k){let q=await F(),[x,H]=M(k),[N,K,O]=await Promise.all([V(q,!0),V(x,!1),V(H,!1)]),T=new Map;for(let Q of N)T.set(Q.id,Q);for(let Q of K)T.set(Q.id,Q);for(let Q of O)T.set(Q.id,Q);return Array.from(T.values())}var J=null,L=null;function b(k){L=k}async function y(k){let q=await X(k),x=new Map;for(let H of q)x.set(H.id,H);if(J={rules:x,cwd:k},L){let H=L();if(H.getState){if((H.getState().enabledRuleIds||[]).length===0){let K=q.filter((O)=>O.metadata.enabled!==!1).map((O)=>O.id);if(K.length>0)H.getState().setEnabledRuleIds(K)}}}}function R(){if(!J)return[];return Array.from(J.rules.values())}function I(k){if(!J)return null;return J.rules.get(k)||null}function Y(){if(L){let k=L();if(k.getState)return k.getState().enabledRuleIds||[]}return[]}function w(){if(!J)return[];return Y().map((q)=>J.rules.get(q)).filter((q)=>q!==null)}function g(k){if(!J||!J.rules.has(k))return!1;if(L){let q=L();if(q.getState){let x=q.getState().enabledRuleIds||[];if(x.includes(k))q.getState().setEnabledRuleIds(x.filter((H)=>H!==k));else q.getState().setEnabledRuleIds([...x,k]);return!0}}return!1}function f(k){if(!J||!J.rules.has(k))return!1;if(L){let q=L();if(q.getState){let x=q.getState().enabledRuleIds||[];if(!x.includes(k))q.getState().setEnabledRuleIds([...x,k]);return!0}}return!1}function P(k){if(!J||!J.rules.has(k))return!1;if(L){let q=L();if(q.getState){let x=q.getState().enabledRuleIds||[];return q.getState().setEnabledRuleIds(x.filter((H)=>H!==k)),!0}}return!1}async function c(){if(!J)return;let k=J.cwd,q=Y();if(await y(k),J&&L){let x=L();if(x.getState){let H=q.filter((N)=>J.rules.has(N));x.getState().setEnabledRuleIds(H)}}}function h(k){if(!J)return!1;let q=k.filter((x)=>J.rules.has(x));if(L){let x=L();if(x.getState)return x.getState().setEnabledRuleIds(q),!0}return!1}function p(){let k=w();if(k.length===0)return"";return k.map((q)=>q.content).join(`
|
|
2
|
-
|
|
3
|
-
`)}export{g as toggleRule,b as setRuleAppStoreGetter,h as setEnabledRules,c as reloadRules,y as initializeRuleManager,I as getRuleById,p as getEnabledRulesContent,w as getEnabledRules,Y as getEnabledRuleIds,R as getAllRules,f as enableRule,P as disableRule};
|
|
4
|
-
export{b as N,y as O,p as P};
|
|
5
|
-
|
|
6
|
-
//# debugId=41BCE5C735DC020964756E2164756E21
|
package/dist/chunk-f06ma45b.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import"./chunk-9c2nr2fz.js";import{M as r}from"./chunk-wrx1n6q6.js";import{V as L}from"./chunk-vjf57v4h.js";import"./chunk-8z1sf25t.js";import"./chunk-jgsq3xax.js";import"./chunk-m9nt0bj3.js";import{pb as K}from"./chunk-hxj4eapp.js";import"./chunk-cv1nhr27.js";import{Kb as V}from"./chunk-gyq335sw.js";import{Lb as s,Ob as e}from"./chunk-sxy6vp20.js";import{readFile as p,writeFile as u,mkdir as t}from"node:fs/promises";import{dirname as JJ}from"node:path";var VJ=K({description:"Read contents of a file from the filesystem",inputSchema:V.object({file_path:V.string().describe("Path to file"),offset:V.number().optional().describe("Start line number (1-based)"),limit:V.number().optional().describe("Number of lines to read")}),execute:async({file_path:J,offset:X,limit:Y})=>{try{let{stat:O}=await import("node:fs/promises"),E=await O(J);if(E.size>10485760)return{path:J,error:`File too large (${Math.round(E.size/1024/1024)}MB). Maximum size is 10MB. Use offset and limit parameters to read specific sections.`,encoding:"utf8"}}catch(O){return{path:J,error:`Failed to check file size: ${O instanceof Error?O.message:String(O)}`,encoding:"utf8"}}let Z=await p(J,"utf8");if(X!==void 0||Y!==void 0){let O=Z.split(`
|
|
2
|
-
`),E=X?X-1:0,H=Y?E+Y:O.length,U=O.slice(E,H);return{path:J,content:U.join(`
|
|
3
|
-
`),encoding:"utf8"}}return{path:J,content:Z,encoding:"utf8"}}}),XJ=K({description:"Write content to a file",inputSchema:V.object({file_path:V.string().describe("Path to file (overwrites if exists)"),content:V.string().describe("Content to write")}),execute:async({file_path:J,content:X})=>{let Y=JJ(J);await t(Y,{recursive:!0}),await u(J,X,"utf8");let $=J.split("/").pop()||"",Z=X.split(`
|
|
4
|
-
`);return{path:J,bytes:Buffer.byteLength(X,"utf8"),fileName:$,lineCount:Z.length,preview:Z.slice(0,5)}}}),YJ=K({description:"Perform exact string replacements in files",inputSchema:V.object({file_path:V.string().describe("Path to file"),old_string:V.string().describe("Text to replace (must be exact and unique unless replace_all=true)"),new_string:V.string().describe("Replacement text"),replace_all:V.boolean().default(!1).optional().describe("Replace all occurrences. If false, old_string must be unique")}),execute:async({file_path:J,old_string:X,new_string:Y,replace_all:$=!1})=>{if(X===Y)throw Error("old_string and new_string must be different");let Z=await p(J,"utf8");if(!Z.includes(X))throw Error(`old_string not found in file: ${J}`);if(!$){let M=Z.indexOf(X),Q=Z.lastIndexOf(X);if(M!==Q)throw Error("old_string appears multiple times in the file. Either provide more context to make it unique or use replace_all=true")}let O=Z.split(`
|
|
5
|
-
`),H=Z.substring(0,Z.indexOf(X)).split(`
|
|
6
|
-
`).length,U=2,W=Math.max(0,H-U-1),B=Math.min(O.length,H+U),v=$?Z.split(X).join(Y):Z.replace(X,Y);await u(J,v,"utf8");let G=$?Z.split(X).length-1:1,D=O.slice(W,B),j=[];for(let M=0;M<D.length;M++){let Q=W+M+1,A=D[M];if(Q===H){let w=X.split(`
|
|
7
|
-
`),P=Y.split(`
|
|
8
|
-
`);w.forEach((N)=>{j.push(`${Q.toString().padStart(6)} - ${N}`)}),P.forEach((N)=>{j.push(`${Q.toString().padStart(6)} + ${N}`)})}else j.push(`${Q.toString().padStart(6)} ${A}`)}return{path:J,replacements:G,old_length:X.length,new_length:Y.length,diff:j,old_string:X,new_string:Y}}}),b={read:VJ,write:XJ,edit:YJ};import{exec as ZJ}from"node:child_process";import{promisify as $J}from"node:util";var OJ=$J(ZJ),BJ=K({description:"Execute a bash command and return its output",inputSchema:V.object({command:V.string().describe("Bash command to execute"),cwd:V.string().optional().describe("Working directory"),timeout:V.number().default(30000).optional().describe("Timeout in milliseconds (foreground mode only)"),run_in_background:V.boolean().default(!1).optional().describe("Run in background. Returns bash_id for bash-output tool")}),execute:async({command:J,cwd:X,timeout:Y=30000,run_in_background:$=!1})=>{if($){let Z=L.spawn(J,X);return{bash_id:Z,command:J,mode:"background",message:`Started in background. Use bash-output tool with bash_id: ${Z}`}}try{let{stdout:Z,stderr:O}=await OJ(J,{cwd:X||process.cwd(),timeout:Y,maxBuffer:10485760});return{command:J,stdout:Z.trim(),stderr:O.trim(),exitCode:0}}catch(Z){if(Z.code!==void 0)return{command:J,stdout:Z.stdout?.trim()||"",stderr:Z.stderr?.trim()||"",exitCode:Z.code};throw Error(`Command execution failed: ${Z.message}`)}}}),EJ=K({description:"Get output from a background bash process",inputSchema:V.object({bash_id:V.string().describe("bash_id from background bash command"),filter:V.string().optional().describe("Regex to filter output lines")}),execute:async({bash_id:J,filter:X})=>{let Y=L.getOutput(J);if(!Y)throw Error(`Bash process not found: ${J}`);let{stdout:$,stderr:Z}=Y;if(X)try{let O=new RegExp(X);$=$.split(`
|
|
9
|
-
`).filter((E)=>O.test(E)).join(`
|
|
10
|
-
`),Z=Z.split(`
|
|
11
|
-
`).filter((E)=>O.test(E)).join(`
|
|
12
|
-
`)}catch(O){throw Error(`Invalid regex filter: ${O instanceof Error?O.message:String(O)}`)}return{bash_id:J,command:Y.command,stdout:$,stderr:Z,exitCode:Y.exitCode,isRunning:Y.isRunning,duration:Y.duration}}}),KJ=K({description:"Kill a background bash process",inputSchema:V.object({bash_id:V.string().describe("bash_id of process to kill")}),execute:async({bash_id:J})=>{if(!L.kill(J))throw Error(`Bash process not found: ${J}`);return{bash_id:J,status:"killed",message:`Sent termination signal to bash process ${J}`}}}),z={bash:BJ,"bash-output":EJ,"kill-bash":KJ};import{readdir as WJ,readFile as GJ,stat as HJ}from"node:fs/promises";import{join as vJ}from"node:path";function d(J,X){let Y=J.replace(/\./g,"\\.").replace(/\*\*/g,".*").replace(/\*/g,"[^/]*").replace(/\?/g,".");return new RegExp(`^${Y}$`).test(X)}async function g(J,X,Y,$=[]){if($.length>=Y)return $;try{let Z=await WJ(J,{withFileTypes:!0});for(let O of Z){if($.length>=Y)break;let E=vJ(J,O.name);if(O.isDirectory()&&["node_modules",".git","dist","build",".next"].includes(O.name))continue;if(O.isDirectory())await g(E,X,Y,$);else if(d(X,E)||d(X,O.name))$.push(E)}return $}catch(Z){return $}}var UJ=K({description:"Search for files matching a glob pattern",inputSchema:V.object({pattern:V.string().describe('Glob pattern: * (any except /), ** (any), ? (single). Examples: "*.ts", "src/**/*.tsx"'),path:V.string().optional().describe("Directory to search")}),execute:async({pattern:J,path:X})=>{let Y=X||process.cwd(),$=await g(Y,J,1000);return{pattern:J,directory:Y,files:$,count:$.length}}}),DJ=K({description:"Search for text content within files using regex patterns",inputSchema:V.object({pattern:V.string().describe("Regex pattern to search"),path:V.string().optional().describe("File or directory to search"),output_mode:V.enum(["content","files_with_matches","count"]).default("files_with_matches").optional().describe("content: show lines | files_with_matches: show paths | count: show counts"),type:V.string().optional().describe("File type: js, ts, py, rust, go, java, c, cpp, html, css, json, yaml, md"),glob:V.string().optional().describe('Glob filter: "*.js", "*.{ts,tsx}"'),"-i":V.boolean().optional().describe("Case insensitive"),"-n":V.boolean().optional().describe("Show line numbers (content mode only)"),"-A":V.number().optional().describe("Lines after match (content mode only)"),"-B":V.number().optional().describe("Lines before match (content mode only)"),"-C":V.number().optional().describe("Lines before and after match (content mode only)"),multiline:V.boolean().optional().describe("Multiline mode: . matches newlines"),head_limit:V.number().optional().describe("Limit output to first N entries")}),execute:async({pattern:J,path:X,output_mode:Y="files_with_matches",type:$,glob:Z,"-i":O=!1,"-n":E=!1,"-A":H=0,"-B":U=0,"-C":W,multiline:B=!1,head_limit:v})=>{let G=X||process.cwd(),D="**/*";if(Z)D=Z;else if($)D={js:"*.{js,jsx}",ts:"*.{ts,tsx}",py:"*.py",rust:"*.rs",go:"*.go",java:"*.java",c:"*.{c,h}",cpp:"*.{cpp,hpp,cc,cxx}",html:"*.{html,htm}",css:"*.{css,scss,sass}",json:"*.json",yaml:"*.{yaml,yml}",md:"*.md"}[$]||`*.${$}`;let j=await g(G,D,1000),M=W!==void 0?W:U||0,Q=W!==void 0?W:H||0,A="g";if(O)A+="i";if(B)A+="s";let w=new RegExp(J,A),P=[],N=new Set,k=0;for(let R of j)try{if((await HJ(R)).size>1048576)continue;let c=await GJ(R,"utf8");if(B){if(w.test(c))N.add(R),k++}else{let S=c.split(`
|
|
13
|
-
`);for(let C=0;C<S.length;C++)if(w.test(S[C])){if(N.add(R),k++,Y==="content"){let n=Math.max(0,C-M),a=Math.min(S.length-1,C+Q);for(let F=n;F<=a;F++){let o=E?`${F+1}: ${S[F]}`:S[F];P.push({file:R,line:F+1,content:o})}}}}}catch{continue}let h=(R)=>{return v?R.slice(0,v):R};if(Y==="content")return{pattern:J,directory:G,matches:h(P),count:P.length};else if(Y==="files_with_matches")return{pattern:J,directory:G,files:h(Array.from(N)),count:N.size};else return{pattern:J,directory:G,count:k}}}),m={glob:UJ,grep:DJ};var x=null,q=[],I=!1,y=null;function l(){if(y)y(q.length)}function _J(J){y=J}function fJ(){return q.length}function hJ(J){x=J}function cJ(){x=null,q=[],I=!1,y=null}async function i(){if(I||q.length===0||!x)return;I=!0;let J=q.shift();l(),console.error("[processAsk] Processing:",{id:J.id,question:J.question.substring(0,50),queueRemaining:q.length});try{let X=await x({type:"selection",questions:[{id:J.id,question:J.question,options:J.options,multiSelect:J.multiSelect}]}),Y=typeof X==="string"?X:X[J.id],$=Array.isArray(Y)?Y.join(", "):Y||"";console.error("[processAsk] Got answer:",$),J.resolve($)}catch(X){console.error("[processAsk] Error:",X),J.resolve("")}finally{if(I=!1,q.length>0)console.error("[processAsk] Processing next in queue..."),i()}}var RJ=K({description:"Ask the user a multiple choice question and wait for their selection",inputSchema:V.object({question:V.string().describe("Question to ask. Use only when you have specific options, not for free-form text"),options:V.array(V.object({label:V.string().describe("Display text"),value:V.string().optional().describe("Return value")})).min(2).describe("Options to choose from"),multiSelect:V.boolean().optional().describe("Allow multiple selections. Returns comma-separated. Call multiple times in same response to batch questions")}),execute:async({question:J,options:X,multiSelect:Y})=>{if(!x)throw Error("User input handler not available. This tool can only be used in interactive mode.");return new Promise(($)=>{let Z=`ask_${Date.now()}_${Math.random()}`;if(console.error("[ask execute] Adding to queue:",{id:Z,question:J.substring(0,50),optionsCount:X?.length||0,multiSelect:Y||!1,queueLength:q.length,isProcessing:I}),q.push({id:Z,question:J,options:X,multiSelect:Y,resolve:$}),l(),!I)console.error("[ask execute] Starting queue processing..."),i();else console.error("[ask execute] Already processing, will queue")})}}),_={ask:RJ};var uJ=(J)=>{switch(J){case"in_progress":return"▶";case"pending":return"○";case"completed":return"✓";case"removed":return"✗"}},dJ=(J)=>{switch(J){case"in_progress":return"#00FF88";case"pending":return"gray";case"completed":return"green";case"removed":return"red"}},lJ=(J)=>{return J.status==="in_progress"?J.activeForm:J.content},iJ=(J)=>{return J==="pending"||J==="completed"},rJ=(J)=>{return J==="in_progress"},nJ=(J)=>{return J==="completed"},T=(J,X,Y,$)=>{if(J==="added")return`+ ${X.content}`;if(J==="reordered"&&$)return`[${X.id}] reordered to ${$}`;if(J==="updated"&&Y&&Y!==X.status)return`[${X.id}] ${Y} → ${X.status}`;return`[${X.id}] updated`};var qJ=K({description:"Update task list to track work progress",inputSchema:V.object({todos:V.array(V.object({id:V.number().optional().describe("ID to update existing, omit to add new"),content:V.string().optional().describe('Imperative form: "Build feature"'),activeForm:V.string().optional().describe('Present continuous: "Building feature"'),status:V.enum(["pending","in_progress","completed","removed"]).optional().describe("pending | in_progress (keep ONE only) | completed | removed"),reorder:V.object({type:V.enum(["top","last","before","after"]).describe("top | last | before | after"),id:V.number().optional().describe("Target ID (for before/after)")}).optional().describe("Change order")})).describe('Add/update todos. Examples: [{ content: "Build login", activeForm: "Building login", status: "pending" }] | [{ id: 1, status: "completed" }]')}),execute:({todos:J})=>{let X=r.getState(),Y=X.currentSessionId;if(!Y)return{error:"No active session",summary:"Failed: no active session",changes:[],total:0};let $=X.sessions.find((B)=>B.id===Y);if(!$)return{error:"Session not found",summary:"Failed: session not found",changes:[],total:0};let Z=$.todos;X.updateTodos(Y,J);let E=X.sessions.find((B)=>B.id===Y)?.todos||[],H=J.filter((B)=>B.id===void 0),U=J.filter((B)=>B.id!==void 0),W=[];if(H.length>0)H.forEach((B)=>{let v=E.find((G)=>G.content===B.content);if(v)W.push(T("added",v))});if(U.length>0)U.forEach((B)=>{let v=Z.find((D)=>D.id===B.id),G=E.find((D)=>D.id===B.id);if(v&&G){if(B.status&&B.status!==v.status)W.push(T("updated",G,v.status));else if(B.reorder)W.push(T("reordered",G,void 0,B.reorder.type))}});return{summary:`${H.length} added, ${U.length} updated`,changes:W.length>0?W:["No changes"],total:E.filter((B)=>B.status!=="removed").length}}}),f={updateTodos:qJ};function MJ(){return{...b,...z,...m,..._,...f}}function OV(){return{filesystem:Object.keys(b),shell:Object.keys(z),search:Object.keys(m),interaction:Object.keys(_),todo:Object.keys(f)}}function BV(){return Object.keys(MJ())}export{XJ as writeFileTool,z as shellTools,hJ as setUserInputHandler,_J as setQueueUpdateCallback,m as searchTools,VJ as readFileTool,KJ as killBashTool,_ as interactionTools,DJ as grepTool,UJ as globTool,OV as getToolCategories,fJ as getQueueLength,BV as getAllToolNames,MJ as getAISDKTools,b as filesystemTools,BJ as executeBashTool,YJ as editFileTool,cJ as clearUserInputHandler,EJ as bashOutputTool,RJ as askUserSelectionTool};export{_J as A,hJ as B,cJ as C,uJ as D,dJ as E,lJ as F,iJ as G,rJ as H,nJ as I,MJ as J};
|
|
14
|
-
|
|
15
|
-
//# debugId=EE784603412EE20F64756E2164756E21
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/tools/filesystem.ts", "../src/tools/shell.ts", "../src/tools/search.ts", "../src/tools/interaction.ts", "../src/ui/utils/todo-formatters.ts", "../src/tools/todo.ts", "../src/tools/registry.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * Filesystem Tools\n * Tools for reading and writing files\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport { tool } from 'ai';\nimport { z } from 'zod';\n\n/**\n * Read file tool with size limits to prevent crashes\n */\nexport const readFileTool = tool({\n description: 'Read contents of a file from the filesystem',\n inputSchema: z.object({\n file_path: z.string().describe('Path to file'),\n offset: z\n .number()\n .optional()\n .describe('Start line number (1-based)'),\n limit: z\n .number()\n .optional()\n .describe('Number of lines to read'),\n }),\n execute: async ({ file_path, offset, limit }) => {\n // Check file size before reading to prevent memory exhaustion\n const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB limit\n try {\n const { stat } = await import('node:fs/promises');\n const stats = await stat(file_path);\n\n if (stats.size > MAX_FILE_SIZE) {\n return {\n path: file_path,\n error: `File too large (${Math.round(stats.size / 1024 / 1024)}MB). Maximum size is ${MAX_FILE_SIZE / 1024 / 1024}MB. Use offset and limit parameters to read specific sections.`,\n encoding: 'utf8',\n };\n }\n } catch (error) {\n return {\n path: file_path,\n error: `Failed to check file size: ${error instanceof Error ? error.message : String(error)}`,\n encoding: 'utf8',\n };\n }\n\n const content = await readFile(file_path, 'utf8');\n\n // Apply line filtering if offset/limit specified\n if (offset !== undefined || limit !== undefined) {\n const lines = content.split('\\n');\n const start = offset ? offset - 1 : 0; // Convert to 0-based index\n const end = limit ? start + limit : lines.length;\n const filteredLines = lines.slice(start, end);\n\n return {\n path: file_path,\n content: filteredLines.join('\\n'),\n encoding: 'utf8',\n };\n }\n\n return {\n path: file_path,\n content,\n encoding: 'utf8',\n };\n },\n});\n\n/**\n * Write file tool\n */\nexport const writeFileTool = tool({\n description: 'Write content to a file',\n inputSchema: z.object({\n file_path: z.string().describe('Path to file (overwrites if exists)'),\n content: z.string().describe('Content to write'),\n }),\n execute: async ({ file_path, content }) => {\n // Create parent directories if they don't exist\n const dir = dirname(file_path);\n await mkdir(dir, { recursive: true });\n\n await writeFile(file_path, content, 'utf8');\n\n // Get file name and line preview\n const fileName = file_path.split('/').pop() || '';\n const lines = content.split('\\n');\n\n return {\n path: file_path,\n bytes: Buffer.byteLength(content, 'utf8'),\n fileName,\n lineCount: lines.length,\n preview: lines.slice(0, 5), // First 5 lines for preview\n };\n },\n});\n\n/**\n * Edit file tool\n */\nexport const editFileTool = tool({\n description: 'Perform exact string replacements in files',\n inputSchema: z.object({\n file_path: z.string().describe('Path to file'),\n old_string: z.string().describe('Text to replace (must be exact and unique unless replace_all=true)'),\n new_string: z.string().describe('Replacement text'),\n replace_all: z\n .boolean()\n .default(false)\n .optional()\n .describe('Replace all occurrences. If false, old_string must be unique'),\n }),\n execute: async ({ file_path, old_string, new_string, replace_all = false }) => {\n // Validate strings are different\n if (old_string === new_string) {\n throw new Error('old_string and new_string must be different');\n }\n\n // Read file\n const content = await readFile(file_path, 'utf8');\n\n // Check if old_string exists\n if (!content.includes(old_string)) {\n throw new Error(`old_string not found in file: ${file_path}`);\n }\n\n // Check for multiple occurrences if not replace_all\n if (!replace_all) {\n const firstIndex = content.indexOf(old_string);\n const lastIndex = content.lastIndexOf(old_string);\n if (firstIndex !== lastIndex) {\n throw new Error(\n 'old_string appears multiple times in the file. Either provide more context to make it unique or use replace_all=true'\n );\n }\n }\n\n // Find line number where replacement occurs\n const lines = content.split('\\n');\n const beforeContent = content.substring(0, content.indexOf(old_string));\n const lineNumber = beforeContent.split('\\n').length;\n\n // Get context lines (few lines before and after)\n const contextSize = 2;\n const startLine = Math.max(0, lineNumber - contextSize - 1);\n const endLine = Math.min(lines.length, lineNumber + contextSize);\n\n // Perform replacement\n const newContent = replace_all\n ? content.split(old_string).join(new_string)\n : content.replace(old_string, new_string);\n\n // Write back\n await writeFile(file_path, newContent, 'utf8');\n\n // Count replacements\n const occurrences = replace_all\n ? content.split(old_string).length - 1\n : 1;\n\n // Generate diff lines for display\n const contextLines = lines.slice(startLine, endLine);\n const diffLines: string[] = [];\n\n for (let i = 0; i < contextLines.length; i++) {\n const currentLineNum = startLine + i + 1;\n const line = contextLines[i];\n\n if (currentLineNum === lineNumber) {\n // This is the changed line\n const oldLines = old_string.split('\\n');\n const newLines = new_string.split('\\n');\n\n // Show removed lines\n oldLines.forEach((oldLine) => {\n diffLines.push(`${currentLineNum.toString().padStart(6)} - ${oldLine}`);\n });\n\n // Show added lines\n newLines.forEach((newLine) => {\n diffLines.push(`${currentLineNum.toString().padStart(6)} + ${newLine}`);\n });\n } else {\n // Context line\n diffLines.push(`${currentLineNum.toString().padStart(6)} ${line}`);\n }\n }\n\n return {\n path: file_path,\n replacements: occurrences,\n old_length: old_string.length,\n new_length: new_string.length,\n diff: diffLines,\n old_string,\n new_string,\n };\n },\n});\n\n/**\n * All filesystem tools\n */\nexport const filesystemTools = {\n read: readFileTool,\n write: writeFileTool,\n edit: editFileTool,\n};\n",
|
|
6
|
-
"/**\n * Shell Tools\n * Tools for executing shell commands\n */\n\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { tool } from 'ai';\nimport { z } from 'zod';\nimport { bashManager } from './bash-manager.js';\n\nconst execAsync = promisify(exec);\n\n/**\n * Execute bash command tool\n */\nexport const executeBashTool = tool({\n description: 'Execute a bash command and return its output',\n inputSchema: z.object({\n command: z.string().describe('Bash command to execute'),\n cwd: z.string().optional().describe('Working directory'),\n timeout: z\n .number()\n .default(30000)\n .optional()\n .describe('Timeout in milliseconds (foreground mode only)'),\n run_in_background: z\n .boolean()\n .default(false)\n .optional()\n .describe('Run in background. Returns bash_id for bash-output tool'),\n }),\n execute: async ({ command, cwd, timeout = 30000, run_in_background = false }) => {\n // Background mode - spawn and return immediately\n if (run_in_background) {\n const bashId = bashManager.spawn(command, cwd);\n return {\n bash_id: bashId,\n command,\n mode: 'background',\n message: `Started in background. Use bash-output tool with bash_id: ${bashId}`,\n };\n }\n\n // Foreground mode - wait for completion\n try {\n const { stdout, stderr } = await execAsync(command, {\n cwd: cwd || process.cwd(),\n timeout,\n maxBuffer: 10 * 1024 * 1024, // 10MB buffer\n });\n\n return {\n command,\n stdout: stdout.trim(),\n stderr: stderr.trim(),\n exitCode: 0,\n };\n } catch (error: any) {\n // exec throws error on non-zero exit code\n if (error.code !== undefined) {\n return {\n command,\n stdout: error.stdout?.trim() || '',\n stderr: error.stderr?.trim() || '',\n exitCode: error.code,\n };\n }\n\n throw new Error(`Command execution failed: ${error.message}`);\n }\n },\n});\n\n/**\n * Get output from background bash process\n */\nexport const bashOutputTool = tool({\n description: 'Get output from a background bash process',\n inputSchema: z.object({\n bash_id: z.string().describe('bash_id from background bash command'),\n filter: z.string().optional().describe('Regex to filter output lines'),\n }),\n execute: async ({ bash_id, filter }) => {\n const output = bashManager.getOutput(bash_id);\n\n if (!output) {\n throw new Error(`Bash process not found: ${bash_id}`);\n }\n\n let stdout = output.stdout;\n let stderr = output.stderr;\n\n // Apply filter if provided\n if (filter) {\n try {\n const regex = new RegExp(filter);\n stdout = stdout.split('\\n').filter(line => regex.test(line)).join('\\n');\n stderr = stderr.split('\\n').filter(line => regex.test(line)).join('\\n');\n } catch (error) {\n throw new Error(`Invalid regex filter: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n return {\n bash_id,\n command: output.command,\n stdout,\n stderr,\n exitCode: output.exitCode,\n isRunning: output.isRunning,\n duration: output.duration,\n };\n },\n});\n\n/**\n * Kill a background bash process\n */\nexport const killBashTool = tool({\n description: 'Kill a background bash process',\n inputSchema: z.object({\n bash_id: z.string().describe('bash_id of process to kill'),\n }),\n execute: async ({ bash_id }) => {\n const success = bashManager.kill(bash_id);\n\n if (!success) {\n throw new Error(`Bash process not found: ${bash_id}`);\n }\n\n return {\n bash_id,\n status: 'killed',\n message: `Sent termination signal to bash process ${bash_id}`,\n };\n },\n});\n\n/**\n * All shell tools\n */\nexport const shellTools = {\n bash: executeBashTool,\n 'bash-output': bashOutputTool,\n 'kill-bash': killBashTool,\n};\n",
|
|
7
|
-
"/**\n * Search Tools\n * Tools for searching files and content\n */\n\nimport { readdir, readFile, stat } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { tool } from 'ai';\nimport { z } from 'zod';\n\n/**\n * Match a glob pattern\n */\nfunction matchGlob(pattern: string, path: string): boolean {\n // Simple glob matching - supports *, **, and ?\n const regexPattern = pattern\n .replace(/\\./g, '\\\\.')\n .replace(/\\*\\*/g, '.*')\n .replace(/\\*/g, '[^/]*')\n .replace(/\\?/g, '.');\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(path);\n}\n\n/**\n * Recursively search files matching pattern\n */\nasync function searchFiles(\n dir: string,\n pattern: string,\n maxResults: number,\n results: string[] = []\n): Promise<string[]> {\n if (results.length >= maxResults) return results;\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (results.length >= maxResults) break;\n\n const fullPath = join(dir, entry.name);\n\n // Skip common directories\n if (\n entry.isDirectory() &&\n ['node_modules', '.git', 'dist', 'build', '.next'].includes(entry.name)\n ) {\n continue;\n }\n\n if (entry.isDirectory()) {\n await searchFiles(fullPath, pattern, maxResults, results);\n } else if (matchGlob(pattern, fullPath) || matchGlob(pattern, entry.name)) {\n results.push(fullPath);\n }\n }\n\n return results;\n } catch (error) {\n // Skip directories we can't read\n return results;\n }\n}\n\n/**\n * Glob file search tool\n */\nexport const globTool = tool({\n description: 'Search for files matching a glob pattern',\n inputSchema: z.object({\n pattern: z.string().describe('Glob pattern: * (any except /), ** (any), ? (single). Examples: \"*.ts\", \"src/**/*.tsx\"'),\n path: z\n .string()\n .optional()\n .describe('Directory to search'),\n }),\n execute: async ({ pattern, path }) => {\n const searchDir = path || process.cwd();\n const results = await searchFiles(searchDir, pattern, 1000); // Internal limit of 1000\n\n return {\n pattern,\n directory: searchDir,\n files: results,\n count: results.length,\n };\n },\n});\n\n/**\n * Grep content search tool\n */\nexport const grepTool = tool({\n description: 'Search for text content within files using regex patterns',\n inputSchema: z.object({\n pattern: z.string().describe('Regex pattern to search'),\n path: z.string().optional().describe('File or directory to search'),\n output_mode: z\n .enum(['content', 'files_with_matches', 'count'])\n .default('files_with_matches')\n .optional()\n .describe('content: show lines | files_with_matches: show paths | count: show counts'),\n type: z.string().optional().describe('File type: js, ts, py, rust, go, java, c, cpp, html, css, json, yaml, md'),\n glob: z.string().optional().describe('Glob filter: \"*.js\", \"*.{ts,tsx}\"'),\n '-i': z.boolean().optional().describe('Case insensitive'),\n '-n': z.boolean().optional().describe('Show line numbers (content mode only)'),\n '-A': z.number().optional().describe('Lines after match (content mode only)'),\n '-B': z.number().optional().describe('Lines before match (content mode only)'),\n '-C': z.number().optional().describe('Lines before and after match (content mode only)'),\n multiline: z.boolean().optional().describe('Multiline mode: . matches newlines'),\n head_limit: z.number().optional().describe('Limit output to first N entries'),\n }),\n execute: async ({\n pattern,\n path,\n output_mode = 'files_with_matches',\n type,\n glob: globPattern,\n '-i': caseInsensitive = false,\n '-n': showLineNumbers = false,\n '-A': afterContext = 0,\n '-B': beforeContext = 0,\n '-C': aroundContext,\n multiline = false,\n head_limit,\n }) => {\n const searchDir = path || process.cwd();\n\n // Determine file pattern based on type or glob\n let filePattern = '**/*';\n if (globPattern) {\n filePattern = globPattern;\n } else if (type) {\n // Map common file types to extensions\n const typeMap: Record<string, string> = {\n js: '*.{js,jsx}',\n ts: '*.{ts,tsx}',\n py: '*.py',\n rust: '*.rs',\n go: '*.go',\n java: '*.java',\n c: '*.{c,h}',\n cpp: '*.{cpp,hpp,cc,cxx}',\n html: '*.{html,htm}',\n css: '*.{css,scss,sass}',\n json: '*.json',\n yaml: '*.{yaml,yml}',\n md: '*.md',\n };\n filePattern = typeMap[type] || `*.${type}`;\n }\n\n const files = await searchFiles(searchDir, filePattern, 1000);\n\n // Determine context lines\n const before = aroundContext !== undefined ? aroundContext : beforeContext || 0;\n const after = aroundContext !== undefined ? aroundContext : afterContext || 0;\n\n // Build regex flags\n let regexFlags = 'g';\n if (caseInsensitive) regexFlags += 'i';\n if (multiline) regexFlags += 's'; // 's' flag makes . match newlines\n\n const regex = new RegExp(pattern, regexFlags);\n\n const matches: Array<{ file: string; line: number; content: string }> = [];\n const filesWithMatches = new Set<string>();\n let matchCount = 0;\n\n for (const file of files) {\n try {\n const stats = await stat(file);\n if (stats.size > 1024 * 1024) continue; // Skip files > 1MB\n\n const content = await readFile(file, 'utf8');\n\n if (multiline) {\n // Multiline matching - check if file contains pattern\n if (regex.test(content)) {\n filesWithMatches.add(file);\n matchCount++;\n }\n } else {\n // Line-by-line matching\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n if (regex.test(lines[i])) {\n filesWithMatches.add(file);\n matchCount++;\n\n if (output_mode === 'content') {\n // Collect context lines\n const startLine = Math.max(0, i - before);\n const endLine = Math.min(lines.length - 1, i + after);\n\n for (let j = startLine; j <= endLine; j++) {\n const lineContent = showLineNumbers\n ? `${j + 1}: ${lines[j]}`\n : lines[j];\n\n matches.push({\n file,\n line: j + 1,\n content: lineContent,\n });\n }\n }\n }\n }\n }\n } catch {\n // Skip files we can't read\n continue;\n }\n }\n\n // Apply head_limit\n const applyLimit = <T>(arr: T[]): T[] => {\n return head_limit ? arr.slice(0, head_limit) : arr;\n };\n\n // Return based on output mode\n if (output_mode === 'content') {\n return {\n pattern,\n directory: searchDir,\n matches: applyLimit(matches),\n count: matches.length,\n };\n } else if (output_mode === 'files_with_matches') {\n return {\n pattern,\n directory: searchDir,\n files: applyLimit(Array.from(filesWithMatches)),\n count: filesWithMatches.size,\n };\n } else {\n // count mode\n return {\n pattern,\n directory: searchDir,\n count: matchCount,\n };\n }\n },\n});\n\n/**\n * All search tools\n */\nexport const searchTools = {\n glob: globTool,\n grep: grepTool,\n};\n",
|
|
8
|
-
"/**\n * User Interaction Tools\n * Tools for the AI to ask questions and get user input\n */\n\nimport { tool } from 'ai';\nimport { z } from 'zod';\nimport type { Question } from '../ui/commands/types.js';\n\nexport interface SelectOption {\n label: string;\n value?: string;\n}\n\n/**\n * User input request - matches WaitForInputOptions from command system\n * This allows the ask tool to use the same selection UI as commands\n */\nexport type UserInputRequest = {\n type: 'selection';\n questions: Question[];\n};\n\n/**\n * Global user input request handler\n * This will be set by the Chat component to handle user input requests\n * Returns: string for single question, Record<questionId, answer | answer[]> for multiple questions\n * - Single-select: answer is string\n * - Multi-select: answer is string[]\n */\nlet userInputHandler: ((request: UserInputRequest) => Promise<string | Record<string, string | string[]>>) | null = null;\n\n/**\n * Ask call queue\n */\ninterface AskCall {\n id: string;\n question: string;\n options: SelectOption[];\n multiSelect?: boolean;\n resolve: (answer: string) => void;\n}\n\nlet askQueue: AskCall[] = [];\nlet isProcessingAsk = false;\nlet queueUpdateCallback: ((count: number) => void) | null = null;\n\n/**\n * Notify queue update\n */\nfunction notifyQueueUpdate() {\n if (queueUpdateCallback) {\n queueUpdateCallback(askQueue.length);\n }\n}\n\n/**\n * Set queue update callback\n * Called by Chat component to receive queue length updates\n */\nexport function setQueueUpdateCallback(callback: (count: number) => void) {\n queueUpdateCallback = callback;\n}\n\n/**\n * Get current queue length\n */\nexport function getQueueLength() {\n return askQueue.length;\n}\n\n/**\n * Set the user input handler\n * Called by the Chat component to register the handler\n */\nexport function setUserInputHandler(handler: (request: UserInputRequest) => Promise<string | Record<string, string | string[]>>) {\n userInputHandler = handler;\n}\n\n/**\n * Clear the user input handler\n */\nexport function clearUserInputHandler() {\n userInputHandler = null;\n askQueue = [];\n isProcessingAsk = false;\n queueUpdateCallback = null;\n}\n\n/**\n * Process next ask in queue\n */\nasync function processNextAsk() {\n // If already processing or queue empty, do nothing\n if (isProcessingAsk || askQueue.length === 0 || !userInputHandler) {\n return;\n }\n\n isProcessingAsk = true;\n const ask = askQueue.shift()!; // Take first from queue\n notifyQueueUpdate(); // Notify queue changed\n\n console.error('[processAsk] Processing:', {\n id: ask.id,\n question: ask.question.substring(0, 50),\n queueRemaining: askQueue.length,\n });\n\n try {\n // Show single question to user\n const result = await userInputHandler({\n type: 'selection',\n questions: [{\n id: ask.id,\n question: ask.question,\n options: ask.options,\n multiSelect: ask.multiSelect,\n }],\n });\n\n // Extract answer (handle both string and string[] for multi-select)\n const rawAnswer = typeof result === 'string' ? result : result[ask.id];\n const answer = Array.isArray(rawAnswer) ? rawAnswer.join(', ') : (rawAnswer || '');\n console.error('[processAsk] Got answer:', answer);\n\n // Resolve this ask's promise\n ask.resolve(answer);\n } catch (error) {\n console.error('[processAsk] Error:', error);\n ask.resolve(''); // Resolve with empty on error\n } finally {\n isProcessingAsk = false;\n\n // Process next ask in queue if any\n if (askQueue.length > 0) {\n console.error('[processAsk] Processing next in queue...');\n processNextAsk();\n }\n }\n}\n\n/**\n * Ask user a multiple choice question\n */\nexport const askUserSelectionTool = tool({\n description: 'Ask the user a multiple choice question and wait for their selection',\n inputSchema: z.object({\n question: z.string().describe('Question to ask. Use only when you have specific options, not for free-form text'),\n options: z.array(z.object({\n label: z.string().describe('Display text'),\n value: z.string().optional().describe('Return value'),\n })).min(2).describe('Options to choose from'),\n multiSelect: z.boolean().optional().describe('Allow multiple selections. Returns comma-separated. Call multiple times in same response to batch questions'),\n }),\n execute: async ({ question, options, multiSelect }) => {\n if (!userInputHandler) {\n throw new Error('User input handler not available. This tool can only be used in interactive mode.');\n }\n\n // Create a promise that will be resolved when this ask is processed\n return new Promise<string>((resolve) => {\n const callId = `ask_${Date.now()}_${Math.random()}`;\n\n console.error('[ask execute] Adding to queue:', {\n id: callId,\n question: question.substring(0, 50),\n optionsCount: options?.length || 0,\n multiSelect: multiSelect || false,\n queueLength: askQueue.length,\n isProcessing: isProcessingAsk,\n });\n\n // Add to queue\n askQueue.push({\n id: callId,\n question,\n options,\n multiSelect,\n resolve,\n });\n\n // Notify queue changed\n notifyQueueUpdate();\n\n // Start processing if not already processing\n if (!isProcessingAsk) {\n console.error('[ask execute] Starting queue processing...');\n processNextAsk();\n } else {\n console.error('[ask execute] Already processing, will queue');\n }\n });\n },\n});\n\n/**\n * Export all interaction tools\n */\nexport const interactionTools = {\n ask: askUserSelectionTool,\n};\n",
|
|
9
|
-
"/**\n * Todo Formatters\n * Centralized todo display logic - single source of truth\n */\n\nimport type { Todo } from '../../types/todo.types.js';\n\n/**\n * Get icon for todo status\n */\nexport const getTodoIcon = (status: Todo['status']): string => {\n switch (status) {\n case 'in_progress':\n return '▶';\n case 'pending':\n return '○';\n case 'completed':\n return '✓';\n case 'removed':\n return '✗';\n }\n};\n\n/**\n * Get color for todo status\n */\nexport const getTodoColor = (status: Todo['status']): string => {\n switch (status) {\n case 'in_progress':\n return '#00FF88';\n case 'pending':\n return 'gray';\n case 'completed':\n return 'green';\n case 'removed':\n return 'red';\n }\n};\n\n/**\n * Get display text for todo (activeForm for in_progress, content otherwise)\n */\nexport const getTodoDisplayText = (todo: Todo): string => {\n return todo.status === 'in_progress' ? todo.activeForm : todo.content;\n};\n\n/**\n * Check if todo text should be dimmed\n */\nexport const isTodoDimmed = (status: Todo['status']): boolean => {\n return status === 'pending' || status === 'completed';\n};\n\n/**\n * Check if todo text should be bold\n */\nexport const isTodoBold = (status: Todo['status']): boolean => {\n return status === 'in_progress';\n};\n\n/**\n * Check if todo text should have strikethrough\n */\nexport const isTodoStrikethrough = (status: Todo['status']): boolean => {\n return status === 'completed';\n};\n\n/**\n * Format todo for tool result display\n */\nexport const formatTodoChange = (\n type: 'added' | 'updated' | 'reordered',\n todo: Todo,\n beforeStatus?: Todo['status'],\n reorderType?: string\n): string => {\n if (type === 'added') {\n return `+ ${todo.content}`;\n }\n\n if (type === 'reordered' && reorderType) {\n return `[${todo.id}] reordered to ${reorderType}`;\n }\n\n if (type === 'updated' && beforeStatus && beforeStatus !== todo.status) {\n return `[${todo.id}] ${beforeStatus} → ${todo.status}`;\n }\n\n return `[${todo.id}] updated`;\n};\n\n/**\n * Format todo count for summary\n */\nexport const formatTodoCount = (todos: Todo[]): string => {\n const active = todos.filter((t) => t.status !== 'removed');\n const completed = todos.filter((t) => t.status === 'completed');\n const inProgress = todos.filter((t) => t.status === 'in_progress');\n const pending = todos.filter((t) => t.status === 'pending');\n\n return `${completed.length}/${active.length} (${inProgress.length} in progress, ${pending.length} pending)`;\n};\n",
|
|
10
|
-
"/**\n * Todo Management Tools\n * Tools for LLM to track and manage work progress\n *\n * Design: Per-session todo lists\n * ===============================\n *\n * Todos are scoped to sessions (not global) to prevent cross-contamination:\n * - Each session has independent todos\n * - updateTodos tool operates on current session\n * - New sessions start with empty todo list\n *\n * Why per-session?\n * - Context isolation: Session A's todos don't interfere with Session B\n * - LLM clarity: AI only sees tasks relevant to current conversation\n * - Prevents bug: Starting new session and seeing old session's todos\n *\n * Implementation:\n * - Tool gets current sessionId from store\n * - Calls store.updateTodos(sessionId, updates)\n * - Returns error if no active session\n */\n\nimport { tool } from 'ai';\nimport { z } from 'zod';\nimport { useAppStore } from '../ui/stores/app-store.js';\nimport { formatTodoChange } from '../ui/utils/todo-formatters.js';\n\n/**\n * Update todos - Batch add/update todos\n *\n * ⚠️ IMPORTANT: This tool operates on the CURRENT session's todos only.\n * It does not affect other sessions' todos.\n */\nexport const updateTodosTool = tool({\n description: 'Update task list to track work progress',\n inputSchema: z.object({\n todos: z.array(z.object({\n id: z.number().optional().describe('ID to update existing, omit to add new'),\n content: z.string().optional().describe('Imperative form: \"Build feature\"'),\n activeForm: z.string().optional().describe('Present continuous: \"Building feature\"'),\n status: z.enum(['pending', 'in_progress', 'completed', 'removed']).optional().describe('pending | in_progress (keep ONE only) | completed | removed'),\n reorder: z.object({\n type: z.enum(['top', 'last', 'before', 'after']).describe('top | last | before | after'),\n id: z.number().optional().describe('Target ID (for before/after)'),\n }).optional().describe('Change order'),\n })).describe('Add/update todos. Examples: [{ content: \"Build login\", activeForm: \"Building login\", status: \"pending\" }] | [{ id: 1, status: \"completed\" }]'),\n }),\n execute: ({ todos }) => {\n const store = useAppStore.getState();\n const sessionId = store.currentSessionId;\n\n if (!sessionId) {\n return {\n error: 'No active session',\n summary: 'Failed: no active session',\n changes: [],\n total: 0,\n };\n }\n\n // Get current session's todos before update\n const session = store.sessions.find((s) => s.id === sessionId);\n if (!session) {\n return {\n error: 'Session not found',\n summary: 'Failed: session not found',\n changes: [],\n total: 0,\n };\n }\n\n const beforeState = session.todos;\n\n // Update todos for this session\n store.updateTodos(sessionId, todos);\n\n // Get updated session todos\n const updatedSession = store.sessions.find((s) => s.id === sessionId);\n const afterState = updatedSession?.todos || [];\n\n // Categorize changes\n const addedTodos = todos.filter((t) => t.id === undefined);\n const updatedTodos = todos.filter((t) => t.id !== undefined);\n\n // Build result using centralized formatters\n const changes: string[] = [];\n\n if (addedTodos.length > 0) {\n addedTodos.forEach((t) => {\n const addedTodo = afterState.find((todo) => todo.content === t.content);\n if (addedTodo) {\n changes.push(formatTodoChange('added', addedTodo));\n }\n });\n }\n\n if (updatedTodos.length > 0) {\n updatedTodos.forEach((t) => {\n const before = beforeState.find((todo) => todo.id === t.id);\n const after = afterState.find((todo) => todo.id === t.id);\n if (before && after) {\n if (t.status && t.status !== before.status) {\n changes.push(formatTodoChange('updated', after, before.status));\n } else if (t.reorder) {\n changes.push(formatTodoChange('reordered', after, undefined, t.reorder.type));\n }\n }\n });\n }\n\n return {\n summary: `${addedTodos.length} added, ${updatedTodos.length} updated`,\n changes: changes.length > 0 ? changes : ['No changes'],\n total: afterState.filter((t) => t.status !== 'removed').length,\n };\n },\n});\n\n/**\n * Export all todo tools\n */\nexport const todoTools = {\n updateTodos: updateTodosTool,\n};\n",
|
|
11
|
-
"/**\n * Tool Registry\n * Central registry for all AI SDK tools\n */\n\nimport { filesystemTools } from './filesystem.js';\nimport { shellTools } from './shell.js';\nimport { searchTools } from './search.js';\nimport { interactionTools } from './interaction.js';\nimport { todoTools } from './todo.js';\n\n/**\n * Get all tools in AI SDK Tool format\n */\nexport function getAISDKTools() {\n return {\n ...filesystemTools,\n ...shellTools,\n ...searchTools,\n ...interactionTools,\n ...todoTools,\n };\n}\n\n/**\n * Get tool names grouped by category\n */\nexport function getToolCategories() {\n return {\n filesystem: Object.keys(filesystemTools),\n shell: Object.keys(shellTools),\n search: Object.keys(searchTools),\n interaction: Object.keys(interactionTools),\n todo: Object.keys(todoTools),\n };\n}\n\n/**\n * Get all tool names\n */\nexport function getAllToolNames(): string[] {\n return Object.keys(getAISDKTools());\n}\n"
|
|
12
|
-
],
|
|
13
|
-
"mappings": "qZAKA,aAAS,SAAU,KAAW,mBAC9B,YAAS,aAOF,FAAM,HAAe,JAAK,CAC/B,YAAa,8CACb,YAAa,EAAE,OAAO,CACpB,UAAW,EAAE,OAAO,EAAE,SAAS,cAAc,EAC7C,OAAQ,EACL,OAAO,EACP,SAAS,EACT,SAAS,6BAA6B,EACzC,MAAO,EACJ,OAAO,EACP,SAAS,EACT,SAAS,yBAAyB,CACvC,CAAC,EACD,QAAS,OAAS,YAAW,SAAQ,WAAY,CAG/C,GAAI,CACF,IAAQ,QAAS,KAAa,4BACxB,EAAQ,MAAM,EAAK,CAAS,EAElC,GAAI,EAAM,KALU,SAMlB,MAAO,CACL,KAAM,EACN,MAAO,mBAAmB,KAAK,MAAM,EAAM,KAAO,KAAO,IAAI,yFAC7D,SAAU,MACZ,EAEF,MAAO,EAAO,CACd,MAAO,CACL,KAAM,EACN,MAAO,8BAA8B,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,IAC1F,SAAU,MACZ,EAGF,IAAM,EAAU,MAAM,EAAS,EAAW,MAAM,EAGhD,GAAI,IAAW,QAAa,IAAU,OAAW,CAC/C,IAAM,EAAQ,EAAQ,MAAM;AAAA,CAAI,EAC1B,EAAQ,EAAS,EAAS,EAAI,EAC9B,EAAM,EAAQ,EAAQ,EAAQ,EAAM,OACpC,EAAgB,EAAM,MAAM,EAAO,CAAG,EAE5C,MAAO,CACL,KAAM,EACN,QAAS,EAAc,KAAK;AAAA,CAAI,EAChC,SAAU,MACZ,EAGF,MAAO,CACL,KAAM,EACN,UACA,SAAU,MACZ,EAEJ,CAAC,EAKY,GAAgB,EAAK,CAChC,YAAa,0BACb,YAAa,EAAE,OAAO,CACpB,UAAW,EAAE,OAAO,EAAE,SAAS,qCAAqC,EACpE,QAAS,EAAE,OAAO,EAAE,SAAS,kBAAkB,CACjD,CAAC,EACD,QAAS,OAAS,YAAW,aAAc,CAEzC,IAAM,EAAM,GAAQ,CAAS,EAC7B,MAAM,EAAM,EAAK,CAAE,UAAW,EAAK,CAAC,EAEpC,MAAM,EAAU,EAAW,EAAS,MAAM,EAG1C,IAAM,EAAW,EAAU,MAAM,GAAG,EAAE,IAAI,GAAK,GACzC,EAAQ,EAAQ,MAAM;AAAA,CAAI,EAEhC,MAAO,CACL,KAAM,EACN,MAAO,OAAO,WAAW,EAAS,MAAM,EACxC,WACA,UAAW,EAAM,OACjB,QAAS,EAAM,MAAM,EAAG,CAAC,CAC3B,EAEJ,CAAC,EAKY,GAAe,EAAK,CAC/B,YAAa,6CACb,YAAa,EAAE,OAAO,CACpB,UAAW,EAAE,OAAO,EAAE,SAAS,cAAc,EAC7C,WAAY,EAAE,OAAO,EAAE,SAAS,oEAAoE,EACpG,WAAY,EAAE,OAAO,EAAE,SAAS,kBAAkB,EAClD,YAAa,EACV,QAAQ,EACR,QAAQ,EAAK,EACb,SAAS,EACT,SAAS,8DAA8D,CAC5E,CAAC,EACD,QAAS,OAAS,YAAW,aAAY,aAAY,cAAc,MAAY,CAE7E,GAAI,IAAe,EACjB,MAAU,MAAM,6CAA6C,EAI/D,IAAM,EAAU,MAAM,EAAS,EAAW,MAAM,EAGhD,GAAI,CAAC,EAAQ,SAAS,CAAU,EAC9B,MAAU,MAAM,iCAAiC,GAAW,EAI9D,GAAI,CAAC,EAAa,CAChB,IAAM,EAAa,EAAQ,QAAQ,CAAU,EACvC,EAAY,EAAQ,YAAY,CAAU,EAChD,GAAI,IAAe,EACjB,MAAU,MACR,sHACF,EAKJ,IAAM,EAAQ,EAAQ,MAAM;AAAA,CAAI,EAE1B,EADgB,EAAQ,UAAU,EAAG,EAAQ,QAAQ,CAAU,CAAC,EACrC,MAAM;AAAA,CAAI,EAAE,OAGvC,EAAc,EACd,EAAY,KAAK,IAAI,EAAG,EAAa,EAAc,CAAC,EACpD,EAAU,KAAK,IAAI,EAAM,OAAQ,EAAa,CAAW,EAGzD,EAAa,EACf,EAAQ,MAAM,CAAU,EAAE,KAAK,CAAU,EACzC,EAAQ,QAAQ,EAAY,CAAU,EAG1C,MAAM,EAAU,EAAW,EAAY,MAAM,EAG7C,IAAM,EAAc,EAChB,EAAQ,MAAM,CAAU,EAAE,OAAS,EACnC,EAGE,EAAe,EAAM,MAAM,EAAW,CAAO,EAC7C,EAAsB,CAAC,EAE7B,QAAS,EAAI,EAAG,EAAI,EAAa,OAAQ,IAAK,CAC5C,IAAM,EAAiB,EAAY,EAAI,EACjC,EAAO,EAAa,GAE1B,GAAI,IAAmB,EAAY,CAEjC,IAAM,EAAW,EAAW,MAAM;AAAA,CAAI,EAChC,EAAW,EAAW,MAAM;AAAA,CAAI,EAGtC,EAAS,QAAQ,CAAC,IAAY,CAC5B,EAAU,KAAK,GAAG,EAAe,SAAS,EAAE,SAAS,CAAC,OAAO,GAAS,EACvE,EAGD,EAAS,QAAQ,CAAC,IAAY,CAC5B,EAAU,KAAK,GAAG,EAAe,SAAS,EAAE,SAAS,CAAC,OAAO,GAAS,EACvE,EAGD,OAAU,KAAK,GAAG,EAAe,SAAS,EAAE,SAAS,CAAC,OAAO,GAAM,EAIvE,MAAO,CACL,KAAM,EACN,aAAc,EACd,WAAY,EAAW,OACvB,WAAY,EAAW,OACvB,KAAM,EACN,aACA,YACF,EAEJ,CAAC,EAKY,EAAkB,CAC7B,KAAM,GACN,MAAO,GACP,KAAM,EACR,EC/MA,eAAS,4BACT,oBAAS,mBAKT,IAAM,GAAY,GAAU,EAAI,EAKnB,GAAkB,EAAK,CAClC,YAAa,+CACb,YAAa,EAAE,OAAO,CACpB,QAAS,EAAE,OAAO,EAAE,SAAS,yBAAyB,EACtD,IAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB,EACvD,QAAS,EACN,OAAO,EACP,QAAQ,KAAK,EACb,SAAS,EACT,SAAS,gDAAgD,EAC5D,kBAAmB,EAChB,QAAQ,EACR,QAAQ,EAAK,EACb,SAAS,EACT,SAAS,yDAAyD,CACvE,CAAC,EACD,QAAS,OAAS,UAAS,MAAK,UAAU,MAAO,oBAAoB,MAAY,CAE/E,GAAI,EAAmB,CACrB,IAAM,EAAS,EAAY,MAAM,EAAS,CAAG,EAC7C,MAAO,CACL,QAAS,EACT,UACA,KAAM,aACN,QAAS,6DAA6D,GACxE,EAIF,GAAI,CACF,IAAQ,SAAQ,UAAW,MAAM,GAAU,EAAS,CAClD,IAAK,GAAO,QAAQ,IAAI,EACxB,UACA,UAAW,QACb,CAAC,EAED,MAAO,CACL,UACA,OAAQ,EAAO,KAAK,EACpB,OAAQ,EAAO,KAAK,EACpB,SAAU,CACZ,EACA,MAAO,EAAY,CAEnB,GAAI,EAAM,OAAS,OACjB,MAAO,CACL,UACA,OAAQ,EAAM,QAAQ,KAAK,GAAK,GAChC,OAAQ,EAAM,QAAQ,KAAK,GAAK,GAChC,SAAU,EAAM,IAClB,EAGF,MAAU,MAAM,6BAA6B,EAAM,SAAS,GAGlE,CAAC,EAKY,GAAiB,EAAK,CACjC,YAAa,4CACb,YAAa,EAAE,OAAO,CACpB,QAAS,EAAE,OAAO,EAAE,SAAS,sCAAsC,EACnE,OAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,8BAA8B,CACvE,CAAC,EACD,QAAS,OAAS,UAAS,YAAa,CACtC,IAAM,EAAS,EAAY,UAAU,CAAO,EAE5C,GAAI,CAAC,EACH,MAAU,MAAM,2BAA2B,GAAS,EAGtD,IAAoB,OAAhB,EACgB,OAAhB,GAAS,EAGb,GAAI,EACF,GAAI,CACF,IAAM,EAAQ,IAAI,OAAO,CAAM,EAC/B,EAAS,EAAO,MAAM;AAAA,CAAI,EAAE,OAAO,KAAQ,EAAM,KAAK,CAAI,CAAC,EAAE,KAAK;AAAA,CAAI,EACtE,EAAS,EAAO,MAAM;AAAA,CAAI,EAAE,OAAO,KAAQ,EAAM,KAAK,CAAI,CAAC,EAAE,KAAK;AAAA,CAAI,EACtE,MAAO,EAAO,CACd,MAAU,MAAM,yBAAyB,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,GAAG,EAIrG,MAAO,CACL,UACA,QAAS,EAAO,QAChB,SACA,SACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,QACnB,EAEJ,CAAC,EAKY,GAAe,EAAK,CAC/B,YAAa,iCACb,YAAa,EAAE,OAAO,CACpB,QAAS,EAAE,OAAO,EAAE,SAAS,4BAA4B,CAC3D,CAAC,EACD,QAAS,OAAS,aAAc,CAG9B,GAAI,CAFY,EAAY,KAAK,CAAO,EAGtC,MAAU,MAAM,2BAA2B,GAAS,EAGtD,MAAO,CACL,UACA,OAAQ,SACR,QAAS,2CAA2C,GACtD,EAEJ,CAAC,EAKY,EAAa,CACxB,KAAM,GACN,cAAe,GACf,YAAa,EACf,EC7IA,kBAAS,eAAS,WAAU,0BAC5B,eAAS,mBAOT,SAAS,CAAS,CAAC,EAAiB,EAAuB,CAEzD,IAAM,EAAe,EAClB,QAAQ,MAAO,KAAK,EACpB,QAAQ,QAAS,IAAI,EACrB,QAAQ,MAAO,OAAO,EACtB,QAAQ,MAAO,GAAG,EAGrB,OADc,IAAI,OAAO,IAAI,IAAe,EAC/B,KAAK,CAAI,EAMxB,eAAe,CAAW,CACxB,EACA,EACA,EACA,EAAoB,CAAC,EACF,CACnB,GAAI,EAAQ,QAAU,EAAY,OAAO,EAEzC,GAAI,CACF,IAAM,EAAU,MAAM,GAAQ,EAAK,CAAE,cAAe,EAAK,CAAC,EAE1D,QAAW,KAAS,EAAS,CAC3B,GAAI,EAAQ,QAAU,EAAY,MAElC,IAAM,EAAW,GAAK,EAAK,EAAM,IAAI,EAGrC,GACE,EAAM,YAAY,GAClB,CAAC,eAAgB,OAAQ,OAAQ,QAAS,OAAO,EAAE,SAAS,EAAM,IAAI,EAEtE,SAGF,GAAI,EAAM,YAAY,EACpB,MAAM,EAAY,EAAU,EAAS,EAAY,CAAO,EACnD,QAAI,EAAU,EAAS,CAAQ,GAAK,EAAU,EAAS,EAAM,IAAI,EACtE,EAAQ,KAAK,CAAQ,EAIzB,OAAO,EACP,MAAO,EAAO,CAEd,OAAO,GAOJ,IAAM,GAAW,EAAK,CAC3B,YAAa,2CACb,YAAa,EAAE,OAAO,CACpB,QAAS,EAAE,OAAO,EAAE,SAAS,wFAAwF,EACrH,KAAM,EACH,OAAO,EACP,SAAS,EACT,SAAS,qBAAqB,CACnC,CAAC,EACD,QAAS,OAAS,UAAS,UAAW,CACpC,IAAM,EAAY,GAAQ,QAAQ,IAAI,EAChC,EAAU,MAAM,EAAY,EAAW,EAAS,IAAI,EAE1D,MAAO,CACL,UACA,UAAW,EACX,MAAO,EACP,MAAO,EAAQ,MACjB,EAEJ,CAAC,EAKY,GAAW,EAAK,CAC3B,YAAa,4DACb,YAAa,EAAE,OAAO,CACpB,QAAS,EAAE,OAAO,EAAE,SAAS,yBAAyB,EACtD,KAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6BAA6B,EAClE,YAAa,EACV,KAAK,CAAC,UAAW,qBAAsB,OAAO,CAAC,EAC/C,QAAQ,oBAAoB,EAC5B,SAAS,EACT,SAAS,2EAA2E,EACvF,KAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0EAA0E,EAC/G,KAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mCAAmC,EACxE,KAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,kBAAkB,EACxD,KAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uCAAuC,EAC7E,KAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uCAAuC,EAC5E,KAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wCAAwC,EAC7E,KAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kDAAkD,EACvF,UAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,oCAAoC,EAC/E,WAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iCAAiC,CAC9E,CAAC,EACD,QAAS,OACP,UACA,OACA,cAAc,qBACd,OACA,KAAM,EACN,KAAM,EAAkB,GACxB,KAAM,EAAkB,GACxB,KAAM,EAAe,EACrB,KAAM,EAAgB,EACtB,KAAM,EACN,YAAY,GACZ,gBACI,CACJ,IAAM,EAAY,GAAQ,QAAQ,IAAI,EAGlC,EAAc,OAClB,GAAI,EACF,EAAc,EACT,QAAI,EAiBT,EAfwC,CACtC,GAAI,aACJ,GAAI,aACJ,GAAI,OACJ,KAAM,OACN,GAAI,OACJ,KAAM,SACN,EAAG,UACH,IAAK,qBACL,KAAM,eACN,IAAK,oBACL,KAAM,SACN,KAAM,eACN,GAAI,MACN,EACsB,IAAS,KAAK,IAGtC,IAAM,EAAQ,MAAM,EAAY,EAAW,EAAa,IAAI,EAGtD,EAAS,IAAkB,OAAY,EAAgB,GAAiB,EACxE,EAAQ,IAAkB,OAAY,EAAgB,GAAgB,EAGxE,EAAa,IACjB,GAAI,EAAiB,GAAc,IACnC,GAAI,EAAW,GAAc,IAE7B,IAAM,EAAQ,IAAI,OAAO,EAAS,CAAU,EAEtC,EAAkE,CAAC,EACnE,EAAmB,IAAI,IACzB,EAAa,EAEjB,QAAW,KAAQ,EACjB,GAAI,CAEF,IADc,MAAM,GAAK,CAAI,GACnB,KAAO,QAAa,SAE9B,IAAM,EAAU,MAAM,GAAS,EAAM,MAAM,EAE3C,GAAI,GAEF,GAAI,EAAM,KAAK,CAAO,EACpB,EAAiB,IAAI,CAAI,EACzB,IAEG,KAEL,IAAM,EAAQ,EAAQ,MAAM;AAAA,CAAI,EAEhC,QAAS,EAAI,EAAG,EAAI,EAAM,OAAQ,IAChC,GAAI,EAAM,KAAK,EAAM,EAAE,GAIrB,GAHA,EAAiB,IAAI,CAAI,EACzB,IAEI,IAAgB,UAAW,CAE7B,IAAM,EAAY,KAAK,IAAI,EAAG,EAAI,CAAM,EAClC,EAAU,KAAK,IAAI,EAAM,OAAS,EAAG,EAAI,CAAK,EAEpD,QAAS,EAAI,EAAW,GAAK,EAAS,IAAK,CACzC,IAAM,EAAc,EAChB,GAAG,EAAI,MAAM,EAAM,KACnB,EAAM,GAEV,EAAQ,KAAK,CACX,OACA,KAAM,EAAI,EACV,QAAS,CACX,CAAC,MAMX,KAAM,CAEN,SAKJ,IAAM,EAAa,CAAI,IAAkB,CACvC,OAAO,EAAa,EAAI,MAAM,EAAG,CAAU,EAAI,GAIjD,GAAI,IAAgB,UAClB,MAAO,CACL,UACA,UAAW,EACX,QAAS,EAAW,CAAO,EAC3B,MAAO,EAAQ,MACjB,EACK,QAAI,IAAgB,qBACzB,MAAO,CACL,UACA,UAAW,EACX,MAAO,EAAW,MAAM,KAAK,CAAgB,CAAC,EAC9C,MAAO,EAAiB,IAC1B,EAGA,WAAO,CACL,UACA,UAAW,EACX,MAAO,CACT,EAGN,CAAC,EAKY,EAAc,CACzB,KAAM,GACN,KAAM,EACR,EClOA,IAAI,EAAgH,KAahH,EAAsB,CAAC,EACvB,EAAkB,GAClB,EAAwD,KAK5D,SAAS,CAAiB,EAAG,CAC3B,GAAI,EACF,EAAoB,EAAS,MAAM,EAQhC,SAAS,EAAsB,CAAC,EAAmC,CACxE,EAAsB,EAMjB,SAAS,EAAc,EAAG,CAC/B,OAAO,EAAS,OAOX,SAAS,EAAmB,CAAC,EAA6F,CAC/H,EAAmB,EAMd,SAAS,EAAqB,EAAG,CACtC,EAAmB,KACnB,EAAW,CAAC,EACZ,EAAkB,GAClB,EAAsB,KAMxB,eAAe,CAAc,EAAG,CAE9B,GAAI,GAAmB,EAAS,SAAW,GAAK,CAAC,EAC/C,OAGF,EAAkB,GAClB,IAAM,EAAM,EAAS,MAAM,EAC3B,EAAkB,EAElB,QAAQ,MAAM,2BAA4B,CACxC,GAAI,EAAI,GACR,SAAU,EAAI,SAAS,UAAU,EAAG,EAAE,EACtC,eAAgB,EAAS,MAC3B,CAAC,EAED,GAAI,CAEF,IAAM,EAAS,MAAM,EAAiB,CACpC,KAAM,YACN,UAAW,CAAC,CACV,GAAI,EAAI,GACR,SAAU,EAAI,SACd,QAAS,EAAI,QACb,YAAa,EAAI,WACnB,CAAC,CACH,CAAC,EAGK,EAAY,OAAO,IAAW,SAAW,EAAS,EAAO,EAAI,IAC7D,EAAS,MAAM,QAAQ,CAAS,EAAI,EAAU,KAAK,IAAI,EAAK,GAAa,GAC/E,QAAQ,MAAM,2BAA4B,CAAM,EAGhD,EAAI,QAAQ,CAAM,EAClB,MAAO,EAAO,CACd,QAAQ,MAAM,sBAAuB,CAAK,EAC1C,EAAI,QAAQ,EAAE,SACd,CAIA,GAHA,EAAkB,GAGd,EAAS,OAAS,EACpB,QAAQ,MAAM,0CAA0C,EACxD,EAAe,GAQd,IAAM,GAAuB,EAAK,CACvC,YAAa,uEACb,YAAa,EAAE,OAAO,CACpB,SAAU,EAAE,OAAO,EAAE,SAAS,kFAAkF,EAChH,QAAS,EAAE,MAAM,EAAE,OAAO,CACxB,MAAO,EAAE,OAAO,EAAE,SAAS,cAAc,EACzC,MAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,cAAc,CACtD,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,wBAAwB,EAC5C,YAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,6GAA6G,CAC5J,CAAC,EACD,QAAS,OAAS,WAAU,UAAS,iBAAkB,CACrD,GAAI,CAAC,EACH,MAAU,MAAM,mFAAmF,EAIrG,OAAO,IAAI,QAAgB,CAAC,IAAY,CACtC,IAAM,EAAS,OAAO,KAAK,IAAI,KAAK,KAAK,OAAO,IAwBhD,GAtBA,QAAQ,MAAM,iCAAkC,CAC9C,GAAI,EACJ,SAAU,EAAS,UAAU,EAAG,EAAE,EAClC,aAAc,GAAS,QAAU,EACjC,YAAa,GAAe,GAC5B,YAAa,EAAS,OACtB,aAAc,CAChB,CAAC,EAGD,EAAS,KAAK,CACZ,GAAI,EACJ,WACA,UACA,cACA,SACF,CAAC,EAGD,EAAkB,EAGd,CAAC,EACH,QAAQ,MAAM,4CAA4C,EAC1D,EAAe,EAEf,aAAQ,MAAM,8CAA8C,EAE/D,EAEL,CAAC,EAKY,EAAmB,CAC9B,IAAK,EACP,EC9LO,IAAM,GAAc,CAAC,IAAmC,CAC7D,OAAQ,OACD,cACH,MAAO,QACJ,UACH,MAAO,QACJ,YACH,MAAO,QACJ,UACH,MAAO,MAOA,GAAe,CAAC,IAAmC,CAC9D,OAAQ,OACD,cACH,MAAO,cACJ,UACH,MAAO,WACJ,YACH,MAAO,YACJ,UACH,MAAO,QAOA,GAAqB,CAAC,IAAuB,CACxD,OAAO,EAAK,SAAW,cAAgB,EAAK,WAAa,EAAK,SAMnD,GAAe,CAAC,IAAoC,CAC/D,OAAO,IAAW,WAAa,IAAW,aAM/B,GAAa,CAAC,IAAoC,CAC7D,OAAO,IAAW,eAMP,GAAsB,CAAC,IAAoC,CACtE,OAAO,IAAW,aAMP,EAAmB,CAC9B,EACA,EACA,EACA,IACW,CACX,GAAI,IAAS,QACX,MAAO,KAAK,EAAK,UAGnB,GAAI,IAAS,aAAe,EAC1B,MAAO,IAAI,EAAK,oBAAoB,IAGtC,GAAI,IAAS,WAAa,GAAgB,IAAiB,EAAK,OAC9D,MAAO,IAAI,EAAK,OAAO,OAAiB,EAAK,SAG/C,MAAO,IAAI,EAAK,eCtDX,IAAM,GAAkB,EAAK,CAClC,YAAa,0CACb,YAAa,EAAE,OAAO,CACpB,MAAO,EAAE,MAAM,EAAE,OAAO,CACtB,GAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wCAAwC,EAC3E,QAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kCAAkC,EAC1E,WAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wCAAwC,EACnF,OAAQ,EAAE,KAAK,CAAC,UAAW,cAAe,YAAa,SAAS,CAAC,EAAE,SAAS,EAAE,SAAS,6DAA6D,EACpJ,QAAS,EAAE,OAAO,CAChB,KAAM,EAAE,KAAK,CAAC,MAAO,OAAQ,SAAU,OAAO,CAAC,EAAE,SAAS,6BAA6B,EACvF,GAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,8BAA8B,CACnE,CAAC,EAAE,SAAS,EAAE,SAAS,cAAc,CACvC,CAAC,CAAC,EAAE,SAAS,8IAA8I,CAC7J,CAAC,EACD,QAAS,EAAG,WAAY,CACtB,IAAM,EAAQ,EAAY,SAAS,EAC7B,EAAY,EAAM,iBAExB,GAAI,CAAC,EACH,MAAO,CACL,MAAO,oBACP,QAAS,4BACT,QAAS,CAAC,EACV,MAAO,CACT,EAIF,IAAM,EAAU,EAAM,SAAS,KAAK,CAAC,IAAM,EAAE,KAAO,CAAS,EAC7D,GAAI,CAAC,EACH,MAAO,CACL,MAAO,oBACP,QAAS,4BACT,QAAS,CAAC,EACV,MAAO,CACT,EAGF,IAAM,EAAc,EAAQ,MAG5B,EAAM,YAAY,EAAW,CAAK,EAIlC,IAAM,EADiB,EAAM,SAAS,KAAK,CAAC,IAAM,EAAE,KAAO,CAAS,GACjC,OAAS,CAAC,EAGvC,EAAa,EAAM,OAAO,CAAC,IAAM,EAAE,KAAO,MAAS,EACnD,EAAe,EAAM,OAAO,CAAC,IAAM,EAAE,KAAO,MAAS,EAGrD,EAAoB,CAAC,EAE3B,GAAI,EAAW,OAAS,EACtB,EAAW,QAAQ,CAAC,IAAM,CACxB,IAAM,EAAY,EAAW,KAAK,CAAC,IAAS,EAAK,UAAY,EAAE,OAAO,EACtE,GAAI,EACF,EAAQ,KAAK,EAAiB,QAAS,CAAS,CAAC,EAEpD,EAGH,GAAI,EAAa,OAAS,EACxB,EAAa,QAAQ,CAAC,IAAM,CAC1B,IAAM,EAAS,EAAY,KAAK,CAAC,IAAS,EAAK,KAAO,EAAE,EAAE,EACpD,EAAQ,EAAW,KAAK,CAAC,IAAS,EAAK,KAAO,EAAE,EAAE,EACxD,GAAI,GAAU,GACZ,GAAI,EAAE,QAAU,EAAE,SAAW,EAAO,OAClC,EAAQ,KAAK,EAAiB,UAAW,EAAO,EAAO,MAAM,CAAC,EACzD,QAAI,EAAE,QACX,EAAQ,KAAK,EAAiB,YAAa,EAAO,OAAW,EAAE,QAAQ,IAAI,CAAC,GAGjF,EAGH,MAAO,CACL,QAAS,GAAG,EAAW,iBAAiB,EAAa,iBACrD,QAAS,EAAQ,OAAS,EAAI,EAAU,CAAC,YAAY,EACrD,MAAO,EAAW,OAAO,CAAC,IAAM,EAAE,SAAW,SAAS,EAAE,MAC1D,EAEJ,CAAC,EAKY,EAAY,CACvB,YAAa,EACf,EC9GO,SAAS,EAAa,EAAG,CAC9B,MAAO,IACF,KACA,KACA,KACA,KACA,CACL,EAMK,SAAS,EAAiB,EAAG,CAClC,MAAO,CACL,WAAY,OAAO,KAAK,CAAe,EACvC,MAAO,OAAO,KAAK,CAAU,EAC7B,OAAQ,OAAO,KAAK,CAAW,EAC/B,YAAa,OAAO,KAAK,CAAgB,EACzC,KAAM,OAAO,KAAK,CAAS,CAC7B,EAMK,SAAS,EAAe,EAAa,CAC1C,OAAO,OAAO,KAAK,GAAc,CAAC",
|
|
14
|
-
"debugId": "EE784603412EE20F64756E2164756E21",
|
|
15
|
-
"names": []
|
|
16
|
-
}
|
package/dist/chunk-fs3f7acb.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{U}from"./chunk-cs1s5c3g.js";import{Lb as C}from"./chunk-sxy6vp20.js";var b=C(U(),1);import{readFile as B,readdir as M,access as w}from"node:fs/promises";import{join as Z,parse as y,relative as N}from"node:path";import{homedir as j}from"node:os";async function G(k,q=!1,x){try{let H=await B(k,"utf-8"),{data:Q,content:J}=b.default(H);if(!Q.name||typeof Q.name!=="string")return console.error(`Agent file ${k} missing required 'name' field`),null;let V={name:Q.name,description:Q.description||""};return{id:x||y(k).name,metadata:V,systemPrompt:J.trim(),isBuiltin:q,filePath:k}}catch(H){return console.error(`Failed to load agent from ${k}:`,H),null}}async function z(k,q=!1){try{let H=(await M(k,{recursive:!0,withFileTypes:!0})).filter((J)=>J.isFile()&&J.name.endsWith(".md")).map((J)=>{let V=Z(J.parentPath||J.path,J.name),Y=N(k,V).replace(/\.md$/,"");return{fullPath:V,agentId:Y}});return(await Promise.all(H.map(({fullPath:J,agentId:V})=>G(J,q,V)))).filter((J)=>J!==null)}catch(x){return[]}}async function S(){let k=new URL(".",import.meta.url).pathname,q=Z(k,"..","assets","agents"),x=Z(k,"..","..","assets","agents");try{return await w(q),q}catch{return x}}function D(k){let q=Z(j(),".sylphx-flow","agents"),x=Z(k,".sylphx-flow","agents");return[q,x]}async function v(k){let q=await S(),[x,H]=D(k),[Q,J,V]=await Promise.all([z(q,!0),z(x,!1),z(H,!1)]),Y=new Map;for(let W of Q)Y.set(W.id,W);for(let W of J)Y.set(W.id,W);for(let W of V)Y.set(W.id,W);return Array.from(Y.values())}var X="coder";var O=null,R=null,$={id:X,metadata:{name:"Coder",description:"Fallback agent (agent manager not initialized)"},systemPrompt:"You are a helpful coding assistant.",isBuiltin:!0};function f(k){R=k}async function u(k){let q=await v(k),x=new Map;for(let H of q)x.set(H.id,H);if(O={agents:x,cwd:k},R){let H=R();if(H.getState){let Q=H.getState().currentAgentId||X;if(!x.has(Q))H.getState().setCurrentAgentId(X)}}}function P(){if(!O)return[$];return Array.from(O.agents.values())}function h(k){if(!O)return k===X?$:null;return O.agents.get(k)||null}function L(){let k=K();if(!O)return $;return O.agents.get(k)||$}function K(){if(R){let k=R();if(k.getState)return k.getState().currentAgentId||X}return X}function p(k){if(!O)return!1;if(!O.agents.get(k))return!1;if(R){let x=R();if(x.getState)x.getState().setCurrentAgentId(k)}return!0}async function l(){if(!O)return;let k=O.cwd,q=K();if(await u(k),O&&!O.agents.has(q)){if(R){let x=R();if(x.getState)x.getState().setCurrentAgentId(X)}}}function o(){return L().systemPrompt}export{p as switchAgent,f as setAppStoreGetter,l as reloadAgents,u as initializeAgentManager,o as getCurrentSystemPrompt,K as getCurrentAgentId,L as getCurrentAgent,P as getAllAgents,h as getAgentById};
|
|
2
|
-
export{f as Q,u as R,h as S,o as T};
|
|
3
|
-
|
|
4
|
-
//# debugId=932F635DE10488EC64756E2164756E21
|