UNPKG

warp-task-master

Version:

BETA: Experimental Task Master fork with Warp AI integration and human-readable profile names. For production use, see task-master-ai.

1 lines 10.3 kB
import{findProjectRoot as e,getAzureBaseURL as t,getBaseUrlForRole as n,getBedrockBaseURL as r,getCurrentTag as i,getDebugFlag as a,getFallbackModelId as o,getFallbackProvider as s,getMainModelId as c,getMainProvider as l,getOllamaBaseURL as u,getParametersForRole as d,getResearchModelId as f,getResearchProvider as p,getResponseLanguage as m,getUserId as h,getVertexLocation as g,getVertexProjectId as _,isApiKeySet as ee,log as v,providersWithoutApiKeys as y,resolveEnvVariable as b,supported_models_default as x}from"./utils-Can7ymw4.js";import{AnthropicAIProvider as S,AzureProvider as C,BedrockAIProvider as w,ClaudeCodeProvider as T,GeminiCliProvider as E,GoogleAIProvider as D,GrokCliProvider as O,GroqProvider as k,OllamaAIProvider as A,OpenAIProvider as j,OpenRouterAIProvider as M,PerplexityAIProvider as N,VertexAIProvider as P,WarpProvider as F,XAIProvider as I}from"./ai-providers-DH3IjRav.js";import{createRequire as L}from"node:module";var te=Object.defineProperty,ne=e=>{let t={};for(var n in e)te(t,n,{get:e[n],enumerable:!0});return t},R=L(import.meta.url);let z=null;var B=class e{constructor(){this._providers=new Map,this._initialized=!1}static getInstance(){return z||(z=new e),z}initialize(){return this._initialized||(this._initialized=!0),this}registerProvider(e,t,n={}){if(!e||typeof e!=`string`)throw Error(`Provider name must be a non-empty string`);if(!t)throw Error(`Provider instance is required`);if(typeof t.generateText!=`function`||typeof t.streamText!=`function`||typeof t.generateObject!=`function`)throw Error(`Provider must implement BaseAIProvider interface`);return this._providers.set(e,{instance:t,options:n,registeredAt:new Date}),this}hasProvider(e){return this._providers.has(e)}getProvider(e){let t=this._providers.get(e);return t?t.instance:null}getAllProviders(){return new Map(this._providers)}unregisterProvider(e){return this._providers.has(e)?(this._providers.delete(e),!0):!1}reset(){this._providers.clear(),this._initialized=!1}};B.getInstance().initialize();var V=B;const H={anthropic:new S,perplexity:new N,google:new D,openai:new j,xai:new I,groq:new k,openrouter:new M,ollama:new A,bedrock:new w,azure:new C,vertex:new P,"claude-code":new T,"gemini-cli":new E,"grok-cli":new O,warp:new F};function U(e){if(H[e])return H[e];let t=V.getInstance();return t.hasProvider(e)?(v(`debug`,`Provider "${e}" found in dynamic registry`),t.getProvider(e)):null}function W(e,t){let n={inputCost:0,outputCost:0,currency:`USD`};if(!x||!x[e])return v(`warn`,`Provider "${e}" not found in MODEL_MAP. Cannot determine cost for model ${t}.`),n;let r=x[e].find(e=>e.id===t);if(!r?.cost_per_1m_tokens)return v(`debug`,`Cost data not found for model "${t}" under provider "${e}". Assuming zero cost.`),n;let i=r.cost_per_1m_tokens;return{inputCost:i.input||0,outputCost:i.output||0,currency:i.currency||`USD`}}function G(e,t,n,r){let i=(e||0)/1e6*n+(t||0)/1e6*r;return parseFloat(i.toFixed(6))}function K(e){let t={currentTag:`master`,availableTags:[`master`]};try{if(!e)return t;let n=i(e)||`master`,r=q(e);return{currentTag:n,availableTags:r}}catch(e){return a()&&v(`debug`,`Error getting tag information: ${e.message}`),t}}function q(e){let t=[`master`];try{let n=R(`path`),r=R(`fs`),i=n.join(e,`.taskmaster`,`tasks`,`tasks.json`);if(!r.existsSync(i))return t;let a=JSON.parse(r.readFileSync(i,`utf8`));if(!a||typeof a!=`object`)return t;let o=Object.keys(a).filter(e=>J(a[e]));return o.length>0?o:t}catch(e){return a()&&v(`debug`,`Could not read tasks file for available tags: ${e.message}`),t}}function J(e){return e&&typeof e==`object`&&Array.isArray(e.tasks)}function Y(e){let t=e.message?.toLowerCase()||``;return t.includes(`rate limit`)||t.includes(`overloaded`)||t.includes(`service temporarily unavailable`)||t.includes(`timeout`)||t.includes(`network error`)||e.status===429||e.status>=500}function X(e){try{if(e?.data?.error?.message)return e.data.error.message;if(e?.error?.message)return e.error.message;if(typeof e?.responseBody==`string`)try{let t=JSON.parse(e.responseBody);if(t?.error?.message)return t.error.message}catch(e){}return typeof e?.message==`string`&&e.message?e.message:typeof e==`string`?e:`An unknown AI service error occurred.`}catch(e){return`Failed to extract error message.`}}function re(e,t){return{main:{provider:l(t),modelId:c(t)},research:{provider:p(t),modelId:f(t)},fallback:{provider:s(t),modelId:o(t)}}[e]||null}function ie(e,t){let n=_(e)||b(`VERTEX_PROJECT_ID`,t,e),r=g(e)||b(`VERTEX_LOCATION`,t,e)||`us-central1`,i=b(`GOOGLE_APPLICATION_CREDENTIALS`,t,e);return v(`debug`,`Using Vertex AI configuration: Project ID=${n}, Location=${r}`),{projectId:n,location:r,...i&&{credentials:{credentialsFromEnv:!0}}}}function ae(e,t,n=null){let r=U(e);if(!r)throw Error(`Unknown provider '${e}' for API key resolution.`);let i=r.getRequiredApiKeyName();if(i===null)return null;let a=b(i,t,n);if(!r.isRequiredApiKey())return a||null;if(!a)throw Error(`Required API key ${i} for provider '${e}' is not set in environment, session, or .env file.`);return a}async function Z(e,t,n,r,i,o){let s=0,c=t;for(;s<=2;)try{a()&&v(`info`,`Attempt ${s+1}/3 calling ${c} (Provider: ${r}, Model: ${i}, Role: ${o})`);let l=await e[t](n);return a()&&v(`info`,`${c} succeeded for role ${o} (Provider: ${r}) on attempt ${s+1}`),l}catch(e){if(v(`warn`,`Attempt ${s+1} failed for role ${o} (${c} / ${r}): ${e.message}`),Y(e)&&s<2){s++;let e=1e3*2**(s-1);v(`info`,`Something went wrong on the provider side. Retrying in ${e/1e3}s...`),await new Promise(t=>setTimeout(t,e))}else throw v(`error`,`Something went wrong on the provider side. Max retries reached for role ${o} (${c} / ${r}).`),e}throw Error(`Exhausted all retries for role ${o} (${c} / ${r})`)}async function Q(i,o){let{role:s,session:c,projectRoot:l,systemPrompt:f,prompt:p,schema:g,objectName:_,commandName:b,outputType:x,...S}=o;a()&&v(`info`,`${i}Service called`,{role:s,commandName:b,outputType:x,projectRoot:l});let C=l||e(),w=h(C),T;s===`main`?T=[`main`,`fallback`,`research`]:s===`research`?T=[`research`,`fallback`,`main`]:s===`fallback`?T=[`fallback`,`main`,`research`]:(v(`warn`,`Unknown initial role: ${s}. Defaulting to main -> fallback -> research sequence.`),T=[`main`,`fallback`,`research`]);let E=null,D=`AI service call failed for all configured roles.`;for(let e of T){let a,o,s,l,h,T,O,k=null;try{v(`debug`,`New AI service call with role: ${e}`);let D=re(e,C);if(!D){v(`error`,`Unknown role encountered in _unifiedServiceRunner: ${e}`),E=E||Error(`Unknown AI role specified: ${e}`);continue}if(a=D.provider,o=D.modelId,!a||!o){v(`warn`,`Skipping role '${e}': Provider or Model ID not configured.`),E=E||Error(`Configuration missing for role '${e}'. Provider: ${a}, Model: ${o}`);continue}if(h=U(a?.toLowerCase()),!h){v(`warn`,`Skipping role '${e}': Provider '${a}' not supported.`),E=E||Error(`Unsupported provider configured: ${a}`);continue}if(!y.includes(a?.toLowerCase())&&!ee(a,c,C)){v(`warn`,`Skipping role '${e}' (Provider: ${a}): API key not set or invalid.`),E=E||Error(`API key for provider '${a}' (role: ${e}) is not set.`);continue}T=n(e,C),a?.toLowerCase()===`azure`&&!T?(T=t(C),v(`debug`,`Using global Azure base URL: ${T}`)):a?.toLowerCase()===`ollama`&&!T?(T=u(C),v(`debug`,`Using global Ollama base URL: ${T}`)):a?.toLowerCase()===`bedrock`&&!T&&(T=r(C),v(`debug`,`Using global Bedrock base URL: ${T}`)),l=d(e,C),s=ae(a?.toLowerCase(),c,C);let A={};a?.toLowerCase()===`vertex`&&(A=ie(C,c));let j=[],M=m(C),N=`${f} \n\n Always respond in ${M}.`;if(j.push({role:`system`,content:N.trim()}),p)j.push({role:`user`,content:p});else throw Error(`User prompt content is missing.`);let P={apiKey:s,modelId:o,maxTokens:l.maxTokens,temperature:l.temperature,messages:j,...T&&{baseURL:T},...(i===`generateObject`||i===`streamObject`)&&{schema:g,objectName:_},...A,...S};if(O=await Z(h,i,P,a,o,e),w&&O&&O.usage)try{k=await $({userId:w,commandName:b,providerName:a,modelId:o,inputTokens:O.usage.inputTokens,outputTokens:O.usage.outputTokens,outputType:x})}catch(e){}else w&&O&&!O.usage&&v(`warn`,`Cannot log telemetry for ${b} (${a}/${o}): AI result missing 'usage' data. (May be expected for streams)`);let F;i===`generateText`?F=O.text:i===`generateObject`?F=O.object:(i===`streamText`||i===`streamObject`||v(`error`,`Unknown serviceType in _unifiedServiceRunner: ${i}`),F=O);let I=K(C);return{mainResult:F,telemetryData:k,tagInfo:I,providerName:a,modelId:o}}catch(t){let n=X(t);if(v(`error`,`Service call failed for role ${e} (Provider: ${a||`unknown`}, Model: ${o||`unknown`}): ${n}`),E=t,D=n,i===`generateObject`){let t=n.toLowerCase();if(t.includes(`no endpoints found that support tool use`)||t.includes(`does not support tool_use`)||t.includes(`tool use is not supported`)||t.includes(`tools are not supported`)||t.includes(`function calling is not supported`)||t.includes(`tool use is not supported`)){let t=`Model '${o||`unknown`}' via provider '${a||`unknown`}' does not support the 'tool use' required by generateObjectService. Please configure a model that supports tool/function calling for the '${e}' role, or use generateTextService if structured output is not strictly required.`;throw v(`error`,`[Tool Support Error] ${t}`),Error(t)}}}}throw v(`error`,`All roles in the sequence [${T.join(`, `)}] failed.`),Error(D)}async function oe(e){let t={outputType:`cli`,...e};return Q(`generateText`,t)}async function se(e){let t={outputType:`cli`,...e};if(!t.schema)throw Error(`streamObjectService requires a schema parameter`);return Q(`streamObject`,t)}async function ce(e){let t={objectName:`generated_object`,maxRetries:3,outputType:`cli`,...e};return Q(`generateObject`,t)}async function $({userId:e,commandName:t,providerName:n,modelId:r,inputTokens:i,outputTokens:o,outputType:s}){try{let s=new Date().toISOString(),c=(i||0)+(o||0),{inputCost:l,outputCost:u,currency:d}=W(n,r),f=G(i,o,l,u),p={timestamp:s,userId:e,commandName:t,modelUsed:r,providerName:n,inputTokens:i||0,outputTokens:o||0,totalTokens:c,totalCost:f,currency:d};return a()&&v(`info`,`AI Usage Telemetry:`,p),p}catch(e){return v(`error`,`Failed to log AI usage telemetry: ${e.message}`,{error:e}),null}}export{ne as __export,ce as generateObjectService,oe as generateTextService,$ as logAiUsage,V as provider_registry_default,se as streamObjectService};