tg-agent 1.2.7 → 1.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli.js +10 -1
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -1,6 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  var H=(e,t)=>()=>(e&&(t=e(e=0)),t);import Ce from"node:fs/promises";import gn from"node:os";import me from"node:path";import{randomUUID as Je}from"node:crypto";function N(){return Date.now()}function B(e){return e.startsWith("~")?me.join(gn.homedir(),e.slice(1)):e}async function z(e){await Ce.mkdir(e,{recursive:!0})}async function Ge(e,t){let n=me.dirname(e),o=`${me.basename(e)}.${Je()}.tmp`,r=me.join(n,o),s=JSON.stringify(t,null,2);await Ce.writeFile(r,s,"utf8"),await Ce.rename(r,e)}function ie(){return Je().split("-")[0]}function Ve(e,t){if(e.length<=t)return[e];let n=[],o=e;for(;o.length>t;){let r=o.slice(0,t),s=r.lastIndexOf(`
3
- `);s>t*.6&&(r=r.slice(0,s)),n.push(r),o=o.slice(r.length)}return o.length>0&&n.push(o),n}function Xe(){let e=new Map;return async function(n,o){let s=(e.get(n)??Promise.resolve()).then(o,o);e.set(n,s);try{return await s}finally{e.get(n)===s&&e.delete(n)}}}function Qe(e){let t=0,n=[],o=()=>{if(t>=e)return;let r=n.shift();r&&(t+=1,r())};return async function(s){await new Promise(i=>{n.push(i),o()});try{return await s()}finally{t=Math.max(0,t-1),o()}}}var Y=H(()=>{"use strict"});import Ye from"node:fs";import pe from"node:path";import*as fe from"@iarna/toml";function tt(){let e=B(Ze);return pe.join(e,pn)}function j(e,t){let n=e[t];return n&&typeof n=="object"&&!Array.isArray(n)?n:{}}function O(e,t){return typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):t}function G(e,t){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let n=Number.parseInt(e,10);return Number.isNaN(n)?t:n}return t}function Ae(e,t){if(typeof e=="boolean")return e;if(typeof e=="string"){let n=e.trim().toLowerCase();if(n==="true"||n==="1"||n==="yes")return!0;if(n==="false"||n==="0"||n==="no")return!1}return t}function fn(e){return Array.isArray(e)?e.map(t=>typeof t=="string"?t:String(t)).map(t=>t.trim()).filter(Boolean):typeof e=="string"?e.split(",").map(t=>t.trim()).filter(Boolean):[]}function yn(e){return new Set(fn(e))}function hn(e){let t=new Map;for(let[n,o]of Object.entries(e))typeof o=="string"&&o.trim()&&t.set(n,pe.resolve(B(o.trim())));return t}function ae(){let e=tt();try{let t=Ye.readFileSync(e,"utf8"),n=fe.parse(t);return{configPath:e,data:n,exists:!0}}catch{return{configPath:e,data:{},exists:!1}}}async function Re(e,t){await z(pe.dirname(e));let n=fe.stringify(t);await Ye.promises.writeFile(e,n,"utf8")}function nt(){return{telegram:{bot_token:"",allowed_user_ids:[],parse_mode:""},model:{provider:"openai-codex",model:"gpt-5.2",openai_api_key:""},paths:{workspace_dir:"",session_dir:"~/.tg-agent/tg-sessions"},workspace_mappings:{},limits:{max_sessions:5,max_concurrent:5,max_history_messages:40,max_output_tokens:0},timeouts:{model_timeout_ms:6e4,model_timeout_stream_ms:3e5,fetch_timeout_ms:6e4},fetch:{max_bytes:2e5,proxy_url:""},proxy:{url:""},auth:{codex_home:"~/.codex"},logging:{agent_events:!0,agent_stream:!0},system:{prompt:et},tls:{extra_ca_certs:"",reject_unauthorized:""}}}function ge(e){return!!(e&&typeof e=="object"&&!Array.isArray(e))}function ot(e,t){let n=!1,o=(r,s)=>{for(let[i,l]of Object.entries(s)){if(!(i in r)){r[i]=l,n=!0;continue}let a=r[i];ge(a)&&ge(l)&&o(a,l)}};return ge(e)&&ge(t)&&o(e,t),n}function rt(e){let t=j(e,"telegram");return O(t.bot_token,"").trim()}function st(e,t){let n=j(e,"telegram");n.bot_token=t.trim(),e.telegram=n}function it(e){let t=j(e,"telegram"),n=j(e,"model"),o=j(e,"paths"),r=j(e,"limits"),s=j(e,"timeouts"),i=j(e,"fetch"),l=j(e,"proxy"),a=j(e,"auth"),u=j(e,"logging"),c=j(e,"system"),d=j(e,"tls"),g=j(e,"workspace_mappings"),p=O(o.workspace_dir,process.cwd()),h=O(o.session_dir,"~/.tg-agent/tg-sessions"),v=hn(g),M=O(d.reject_unauthorized,""),_=M===""?null:Ae(M,!0);return{telegramToken:O(t.bot_token,"").trim(),telegramAllowedUsers:yn(t.allowed_user_ids),telegramParseMode:O(t.parse_mode,"").trim(),modelProvider:O(n.provider,"openai-codex").trim(),modelRef:O(n.model,"gpt-5.2").trim(),openaiApiKey:O(n.openai_api_key,"").trim(),sessionDir:B(h),agentDir:B(Ze),workspaceDir:pe.resolve(B(p)),workspaceMappings:v,maxSessions:G(r.max_sessions,5),maxConcurrent:G(r.max_concurrent,5),maxHistoryMessages:G(r.max_history_messages,40),maxOutputTokens:G(r.max_output_tokens,0),fetchMaxBytes:G(i.max_bytes,2e5),fetchTimeoutMs:G(s.fetch_timeout_ms,6e4),modelTimeoutMs:G(s.model_timeout_ms,6e4),modelTimeoutStreamingMs:G(s.model_timeout_stream_ms,3e5),systemPrompt:O(c.prompt,et),proxyUrl:O(l.url,"").trim(),fetchProxyUrl:O(i.proxy_url,"").trim(),codexHome:B(O(a.codex_home,"~/.codex")),logAgentEvents:Ae(u.agent_events,!0),logAgentStream:Ae(u.agent_stream,!0),tlsExtraCaCerts:O(d.extra_ca_certs,"").trim(),tlsRejectUnauthorized:_}}function at(){let{data:e}=ae();return m=it(e),m}function ct(){let e=[];if(m.telegramToken||e.push("telegram.bot_token"),e.length>0)throw new Error(`Missing config values: ${e.join(", ")} (edit ${tt()})`)}var Ze,pn,et,wn,m,V=H(()=>{"use strict";Y();Ze="~/.tg-agent",pn="config.toml",et="You are running in user's personal computer or VPS, using telegram bot to interact with user. Be concise and practical.";({data:wn}=ae()),m=it(wn)});import{createHash as bn}from"node:crypto";import lt from"node:fs";import xn from"node:path";import{execSync as Sn}from"node:child_process";function kn(){return xn.join(m.codexHome,Mn)}function _n(e){return`cli|${bn("sha256").update(e).digest("hex").slice(0,16)}`}function $n(){if(process.platform!=="darwin")return null;let e=m.codexHome,t=_n(e);try{let n=Sn(`security find-generic-password -s "${vn}" -a "${t}" -w`,{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim(),o=JSON.parse(n),r=o.tokens,s=r?.access_token,i=r?.refresh_token;if(typeof s!="string"||!s||typeof i!="string"||!i)return null;let l=o.last_refresh,a=typeof l=="string"||typeof l=="number"?new Date(l).getTime():Date.now(),u=Number.isFinite(a)?a+3600*1e3:Date.now()+3600*1e3;return{accessToken:s,refreshToken:i,expiresAt:u,source:"keychain"}}catch{return null}}function Tn(){let e=kn();try{let t=lt.readFileSync(e,"utf8"),o=JSON.parse(t).tokens,r=o?.access_token,s=o?.refresh_token;if(typeof r!="string"||!r||typeof s!="string"||!s)return null;let i=Date.now()+3600*1e3;try{i=lt.statSync(e).mtimeMs+3600*1e3}catch{}return{accessToken:r,refreshToken:s,expiresAt:i,source:"file"}}catch{return null}}function Z(){return $n()??Tn()}var Mn,vn,ye=H(()=>{"use strict";V();Mn="auth.json",vn="Codex Auth"});function ut(e){let t=e.trim().toLowerCase();if(t==="openai-codex"||t==="codex"){let n=Z();if(n)return{apiKey:n.accessToken,source:`codex:${n.source}`};throw new Error("No Codex OAuth credentials found. Run `codex login`.")}if(m.openaiApiKey)return{apiKey:m.openaiApiKey,source:"config.model.openai_api_key"};throw new Error(`No API key for provider: ${e}`)}function Pn(){return m.proxyUrl?{url:m.proxyUrl,source:"config.proxy.url"}:m.fetchProxyUrl?{url:m.fetchProxyUrl,source:"config.fetch.proxy_url"}:null}function dt(e){let t=e.toLowerCase();return t.startsWith("socks5://")||t.startsWith("socks4://")||t.startsWith("socks://")?"socks":t.startsWith("https://")?"https":"http"}function mt(){let e=Pn();return e?{url:e.url,kind:dt(e.url),source:e.source}:null}function gt(){let e=[{key:"config.fetch.proxy_url",value:m.fetchProxyUrl},{key:"config.proxy.url",value:m.proxyUrl}];for(let t of e){let n=t.value?.trim();if(!n)continue;let o=dt(n);if(o!=="socks")return{url:n,kind:o,source:t.key}}return null}var De=H(()=>{"use strict";V();ye()});import{ProxyAgent as Cn,setGlobalDispatcher as An}from"undici";function ft(){if(pt)return Ee;pt=!0;let e=gt();if(!e)return Ee=null,null;let t=new Cn(e.url);return An(t),Ee=e,e}var pt,Ee,yt=H(()=>{"use strict";De();pt=!1,Ee=null});import Rn from"node:fs";import Dn from"node:fs/promises";import En from"node:path";import On from"node:readline";import{spawn as jn}from"node:child_process";import*as wt from"@iarna/toml";function St(e){return En.join(e,"config.toml")}function he(e){let t=St(e);try{let n=Rn.readFileSync(t,"utf8");return _t(n)}catch{return[]}}async function ce(e){let t=St(e);try{let n=await Dn.readFile(t,"utf8");return _t(n)}catch{return[]}}async function le(e,t={}){if(ee)return ee;let n=await ce(e);if(n.length===0)return ee="","";let o=t.maxTools??zn,r=t.maxChars??Nn,s=t.timeoutMs??4e3,i=t.maxBytes??bt,l=["MCP catalog (auto-discovered):","Use tool 'mcp' with server=<name> method=<tool> params=<object>."];for(let u of n){let c=await Ln(u,{timeoutMs:s,maxBytes:i});if(l.push(`${u.name} (${u.type})`),c.length===0){l.push(" - tools unavailable");continue}let d=c.slice(0,o);for(let g of d){let p=g.description?`: ${g.description}`:"";l.push(` - ${g.name}${p}`)}c.length>d.length&&l.push(` - ...and ${c.length-d.length} more`)}let a=l.join(`
3
+ `);s>t*.6&&(r=r.slice(0,s)),n.push(r),o=o.slice(r.length)}return o.length>0&&n.push(o),n}function Xe(){let e=new Map;return async function(n,o){let s=(e.get(n)??Promise.resolve()).then(o,o);e.set(n,s);try{return await s}finally{e.get(n)===s&&e.delete(n)}}}function Qe(e){let t=0,n=[],o=()=>{if(t>=e)return;let r=n.shift();r&&(t+=1,r())};return async function(s){await new Promise(i=>{n.push(i),o()});try{return await s()}finally{t=Math.max(0,t-1),o()}}}var Y=H(()=>{"use strict"});import Ye from"node:fs";import pe from"node:path";import*as fe from"@iarna/toml";function tt(){let e=B(Ze);return pe.join(e,pn)}function j(e,t){let n=e[t];return n&&typeof n=="object"&&!Array.isArray(n)?n:{}}function O(e,t){return typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):t}function G(e,t){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let n=Number.parseInt(e,10);return Number.isNaN(n)?t:n}return t}function Ae(e,t){if(typeof e=="boolean")return e;if(typeof e=="string"){let n=e.trim().toLowerCase();if(n==="true"||n==="1"||n==="yes")return!0;if(n==="false"||n==="0"||n==="no")return!1}return t}function fn(e){return Array.isArray(e)?e.map(t=>typeof t=="string"?t:String(t)).map(t=>t.trim()).filter(Boolean):typeof e=="string"?e.split(",").map(t=>t.trim()).filter(Boolean):[]}function yn(e){return new Set(fn(e))}function hn(e){let t=new Map;for(let[n,o]of Object.entries(e))typeof o=="string"&&o.trim()&&t.set(n,pe.resolve(B(o.trim())));return t}function ae(){let e=tt();try{let t=Ye.readFileSync(e,"utf8"),n=fe.parse(t);return{configPath:e,data:n,exists:!0}}catch{return{configPath:e,data:{},exists:!1}}}async function Re(e,t){await z(pe.dirname(e));let n=fe.stringify(t);await Ye.promises.writeFile(e,n,"utf8")}function nt(){return{telegram:{bot_token:"",allowed_user_ids:[],parse_mode:""},model:{provider:"openai-codex",model:"gpt-5.2",openai_api_key:""},paths:{workspace_dir:"",session_dir:"~/.tg-agent/tg-sessions"},workspace_mappings:{},limits:{max_sessions:5,max_concurrent:5,max_history_messages:40,max_output_tokens:0},timeouts:{model_timeout_ms:6e4,model_timeout_stream_ms:3e5,fetch_timeout_ms:6e4},fetch:{max_bytes:2e5,proxy_url:""},proxy:{url:""},auth:{codex_home:"~/.codex"},logging:{agent_events:!0,agent_stream:!0},system:{prompt:et},tls:{extra_ca_certs:"",reject_unauthorized:""}}}function ge(e){return!!(e&&typeof e=="object"&&!Array.isArray(e))}function ot(e,t){let n=!1,o=(r,s)=>{for(let[i,l]of Object.entries(s)){if(!(i in r)){r[i]=l,n=!0;continue}let a=r[i];ge(a)&&ge(l)&&o(a,l)}};return ge(e)&&ge(t)&&o(e,t),n}function rt(e){let t=j(e,"telegram");return O(t.bot_token,"").trim()}function st(e,t){let n=j(e,"telegram");n.bot_token=t.trim(),e.telegram=n}function it(e){let t=j(e,"telegram"),n=j(e,"model"),o=j(e,"paths"),r=j(e,"limits"),s=j(e,"timeouts"),i=j(e,"fetch"),l=j(e,"proxy"),a=j(e,"auth"),u=j(e,"logging"),c=j(e,"system"),d=j(e,"tls"),g=j(e,"workspace_mappings"),p=O(o.workspace_dir,process.cwd()),h=O(o.session_dir,"~/.tg-agent/tg-sessions"),v=hn(g),M=O(d.reject_unauthorized,""),_=M===""?null:Ae(M,!0);return{telegramToken:O(t.bot_token,"").trim(),telegramAllowedUsers:yn(t.allowed_user_ids),telegramParseMode:O(t.parse_mode,"").trim(),modelProvider:O(n.provider,"openai-codex").trim(),modelRef:O(n.model,"gpt-5.2").trim(),openaiApiKey:O(n.openai_api_key,"").trim(),sessionDir:B(h),agentDir:B(Ze),workspaceDir:pe.resolve(B(p)),workspaceMappings:v,maxSessions:G(r.max_sessions,5),maxConcurrent:G(r.max_concurrent,5),maxHistoryMessages:G(r.max_history_messages,40),maxOutputTokens:G(r.max_output_tokens,0),fetchMaxBytes:G(i.max_bytes,2e5),fetchTimeoutMs:G(s.fetch_timeout_ms,6e4),modelTimeoutMs:G(s.model_timeout_ms,6e4),modelTimeoutStreamingMs:G(s.model_timeout_stream_ms,3e5),systemPrompt:O(c.prompt,et),proxyUrl:O(l.url,"").trim(),fetchProxyUrl:O(i.proxy_url,"").trim(),codexHome:B(O(a.codex_home,"~/.codex")),logAgentEvents:Ae(u.agent_events,!0),logAgentStream:Ae(u.agent_stream,!0),tlsExtraCaCerts:O(d.extra_ca_certs,"").trim(),tlsRejectUnauthorized:_}}function at(){let{data:e}=ae();return m=it(e),m}function ct(){let e=[];if(m.telegramToken||e.push("telegram.bot_token"),e.length>0)throw new Error(`Missing config values: ${e.join(", ")} (edit ${tt()})`)}var Ze,pn,et,wn,m,V=H(()=>{"use strict";Y();Ze="~/.tg-agent",pn="config.toml",et=`You are running in user's personal computer or VPS, using telegram bot to interact with user.
4
+
5
+ Important behavioral rules:
6
+ - Do NOT mention the name of your underlying framework, technical implementation, or any package names
7
+ - Do NOT refer to yourself as "pi", "pi-coding-agent", or any other framework/tool name
8
+ - When users ask about your identity or implementation, simply say you are a coding assistant
9
+ - Focus on helping with tasks rather than discussing your technical stack or architecture
10
+ - Do not mention documentation paths or framework-specific resources unless directly relevant to the task
11
+
12
+ Be concise and practical in all responses.`;({data:wn}=ae()),m=it(wn)});import{createHash as bn}from"node:crypto";import lt from"node:fs";import xn from"node:path";import{execSync as Sn}from"node:child_process";function kn(){return xn.join(m.codexHome,Mn)}function _n(e){return`cli|${bn("sha256").update(e).digest("hex").slice(0,16)}`}function $n(){if(process.platform!=="darwin")return null;let e=m.codexHome,t=_n(e);try{let n=Sn(`security find-generic-password -s "${vn}" -a "${t}" -w`,{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim(),o=JSON.parse(n),r=o.tokens,s=r?.access_token,i=r?.refresh_token;if(typeof s!="string"||!s||typeof i!="string"||!i)return null;let l=o.last_refresh,a=typeof l=="string"||typeof l=="number"?new Date(l).getTime():Date.now(),u=Number.isFinite(a)?a+3600*1e3:Date.now()+3600*1e3;return{accessToken:s,refreshToken:i,expiresAt:u,source:"keychain"}}catch{return null}}function Tn(){let e=kn();try{let t=lt.readFileSync(e,"utf8"),o=JSON.parse(t).tokens,r=o?.access_token,s=o?.refresh_token;if(typeof r!="string"||!r||typeof s!="string"||!s)return null;let i=Date.now()+3600*1e3;try{i=lt.statSync(e).mtimeMs+3600*1e3}catch{}return{accessToken:r,refreshToken:s,expiresAt:i,source:"file"}}catch{return null}}function Z(){return $n()??Tn()}var Mn,vn,ye=H(()=>{"use strict";V();Mn="auth.json",vn="Codex Auth"});function ut(e){let t=e.trim().toLowerCase();if(t==="openai-codex"||t==="codex"){let n=Z();if(n)return{apiKey:n.accessToken,source:`codex:${n.source}`};throw new Error("No Codex OAuth credentials found. Run `codex login`.")}if(m.openaiApiKey)return{apiKey:m.openaiApiKey,source:"config.model.openai_api_key"};throw new Error(`No API key for provider: ${e}`)}function Pn(){return m.proxyUrl?{url:m.proxyUrl,source:"config.proxy.url"}:m.fetchProxyUrl?{url:m.fetchProxyUrl,source:"config.fetch.proxy_url"}:null}function dt(e){let t=e.toLowerCase();return t.startsWith("socks5://")||t.startsWith("socks4://")||t.startsWith("socks://")?"socks":t.startsWith("https://")?"https":"http"}function mt(){let e=Pn();return e?{url:e.url,kind:dt(e.url),source:e.source}:null}function gt(){let e=[{key:"config.fetch.proxy_url",value:m.fetchProxyUrl},{key:"config.proxy.url",value:m.proxyUrl}];for(let t of e){let n=t.value?.trim();if(!n)continue;let o=dt(n);if(o!=="socks")return{url:n,kind:o,source:t.key}}return null}var De=H(()=>{"use strict";V();ye()});import{ProxyAgent as Cn,setGlobalDispatcher as An}from"undici";function ft(){if(pt)return Ee;pt=!0;let e=gt();if(!e)return Ee=null,null;let t=new Cn(e.url);return An(t),Ee=e,e}var pt,Ee,yt=H(()=>{"use strict";De();pt=!1,Ee=null});import Rn from"node:fs";import Dn from"node:fs/promises";import En from"node:path";import On from"node:readline";import{spawn as jn}from"node:child_process";import*as wt from"@iarna/toml";function St(e){return En.join(e,"config.toml")}function he(e){let t=St(e);try{let n=Rn.readFileSync(t,"utf8");return _t(n)}catch{return[]}}async function ce(e){let t=St(e);try{let n=await Dn.readFile(t,"utf8");return _t(n)}catch{return[]}}async function le(e,t={}){if(ee)return ee;let n=await ce(e);if(n.length===0)return ee="","";let o=t.maxTools??zn,r=t.maxChars??Nn,s=t.timeoutMs??4e3,i=t.maxBytes??bt,l=["MCP catalog (auto-discovered):","Use tool 'mcp' with server=<name> method=<tool> params=<object>."];for(let u of n){let c=await Ln(u,{timeoutMs:s,maxBytes:i});if(l.push(`${u.name} (${u.type})`),c.length===0){l.push(" - tools unavailable");continue}let d=c.slice(0,o);for(let g of d){let p=g.description?`: ${g.description}`:"";l.push(` - ${g.name}${p}`)}c.length>d.length&&l.push(` - ...and ${c.length-d.length} more`)}let a=l.join(`
4
13
  `);return a.length>r&&(a=`${a.slice(0,r-20)}...
5
14
  (truncated)`),ee=a,a}function je(){ee&&(xt=!0)}function Mt(){ee=null,xt=!1,I.clear()}function Q(e){if(e.type==="http")return e.url?`url=${e.url}`:"url=(missing)";let t=e.args&&e.args.length>0?` ${e.args.join(" ")}`:"";return e.command?`command=${e.command}${t}`:"command=(missing)"}async function vt(e,t=5e3){let n=Date.now();try{return await we(e,"tools/list",{},{timeoutMs:t}),{ok:!0,durationMs:Date.now()-n}}catch(o){let r=o instanceof Error?o.message:String(o);return{ok:!1,durationMs:Date.now()-n,error:r}}}async function we(e,t,n,o={}){let r=ht(o.timeoutMs??Fn,1e3,12e4),s=ht(o.maxBytes??bt,1024,5e6),i=new AbortController,l=()=>i.abort();o.signal?.addEventListener("abort",l,{once:!0});let a=setTimeout(()=>i.abort(),r);try{return e.type==="http"?(t!=="initialize"&&t!=="notifications/initialized"&&await Wn(e,s,i.signal),await Bn(e,t,n,s,i.signal)):await Kn(e,t,n,s,i.signal)}finally{clearTimeout(a),o.signal?.removeEventListener("abort",l)}}function ht(e,t,n){return Number.isNaN(e)?t:Math.min(n,Math.max(t,e))}async function Ln(e,t){try{let n=await we(e,"tools/list",{},t);return Un(n.output)}catch(n){let o=n instanceof Error?n.message:String(n);return console.warn(`[tg-agent] mcp tools/list failed server=${e.name} error=${o}`),[]}}function Un(e){let t;try{t=JSON.parse(e)}catch{return[]}if(!t||typeof t!="object")return[];let n=t,r=(n.result??n).tools??n.tools;if(!Array.isArray(r))return[];let s=[];for(let i of r){if(!i||typeof i!="object")continue;let l=i,a=typeof l.name=="string"?l.name:"";if(!a)continue;let u=typeof l.description=="string"?l.description:void 0,c=l.inputSchema;s.push({name:a,description:u,inputSchema:c})}return s}async function Bn(e,t,n,o,r){if(!e.url)throw new Error("MCP server url is missing.");let s=Date.now(),i=await Oe(e,t,n,o,r),l=kt(i.parsed);if(l)throw new Error(l);let a=i.bodyText;return i.parsed&&(a=JSON.stringify(i.parsed,null,2)),{ok:i.statusCode>=200&&i.statusCode<300,output:a,durationMs:Date.now()-s,bytes:i.bytes,truncated:i.truncated,statusCode:i.statusCode,statusText:i.statusText,contentType:i.contentType}}async function Oe(e,t,n,o,r){if(!e.url)throw new Error("MCP server url is missing.");let s=I.get(e.name),i={jsonrpc:"2.0",id:`tg-agent-${Date.now()}`,method:t,params:n??{}},l={"content-type":"application/json"};e.auth&&(l.authorization=e.auth.startsWith("Bearer ")?e.auth:`Bearer ${e.auth}`),s?.cookie&&(l.cookie=s.cookie),s?.sessionId&&(l["mcp-session-id"]=s.sessionId);let a=await fetch(e.url,{method:"POST",headers:l,body:JSON.stringify(i),signal:r});Hn(e.name,a);let u=await Jn(a,o,r),c;try{c=JSON.parse(u.text)}catch{c=void 0}return qn(e.name,c),{statusCode:a.status,statusText:a.statusText,contentType:a.headers.get("content-type"),bodyText:u.text,parsed:c,bytes:u.bytes,truncated:u.truncated}}function kt(e){if(!e||typeof e!="object")return null;let t=e;if(t.error&&typeof t.error=="object"){let n=t.error;if(typeof n.message=="string")return n.message}return typeof t.error_description=="string"?t.error_description:typeof t.error=="string"?t.error:null}async function Wn(e,t,n){let o=I.get(e.name);if(o?.initializedAt)return;if(o?.inFlight){await o.inFlight;return}let r=(async()=>{let s=await Oe(e,"initialize",{protocolVersion:"2024-11-05",clientInfo:{name:"tg-agent",version:process.env.npm_package_version??"dev"},capabilities:{}},t,n),i=kt(s.parsed);if(i){let u=i.toLowerCase();if(u.includes("method")&&u.includes("not"))return;throw new Error(i)}let l=new AbortController,a=setTimeout(()=>l.abort(),In);try{await Oe(e,"notifications/initialized",{},t,l.signal)}catch{}finally{clearTimeout(a)}})();I.set(e.name,{initializedAt:Date.now(),inFlight:r});try{await r;let s=I.get(e.name);I.set(e.name,{initializedAt:Date.now(),cookie:s?.cookie,sessionId:s?.sessionId})}catch(s){throw I.delete(e.name),s}}function Hn(e,t){let o=I.get(e)??{initializedAt:0},r=t.headers.get("set-cookie"),s=t.headers.getSetCookie?.(),i=s&&s.length>0?s.join("; "):r;i&&I.set(e,{...o,cookie:i});let l=t.headers.get("mcp-session-id")??t.headers.get("x-mcp-session-id");l&&I.set(e,{...o,sessionId:l})}function qn(e,t){if(!t||typeof t!="object")return;let o=t.result;if(!o)return;let r=typeof o.sessionId=="string"&&o.sessionId||typeof o.session_id=="string"&&o.session_id;if(!r)return;let s=I.get(e)??{initializedAt:0};I.set(e,{...s,sessionId:r})}async function Kn(e,t,n,o,r){if(!e.command)throw new Error("MCP server command is missing.");let s=Date.now(),i=jn(e.command,e.args??[],{stdio:["pipe","pipe","pipe"]}),l=()=>{i.killed||i.kill("SIGTERM")};if(r.aborted)throw l(),new Error("MCP request aborted.");let a=new Map,u=!1,c="",d=new Error("MCP request aborted."),g=On.createInterface({input:i.stdout,terminal:!1});g.on("line",b=>{if(b.length>o){u=!0;return}let S=null;try{S=JSON.parse(b)}catch{return}let k=typeof S.id=="string"?S.id:typeof S.id=="number"?String(S.id):"";if(!k)return;let P=a.get(k);P&&(a.delete(k),P.resolve(S))}),i.stderr?.on("data",b=>{let S=b.toString();if(c.length+S.length>o){u=!0;return}c+=S});let p=()=>{for(let b of a.values())b.reject(d);a.clear(),l()};r.addEventListener("abort",p,{once:!0});let h=b=>{let S=b===0?"MCP stdio exited.":c.trim()||"MCP stdio exited with error.";for(let k of a.values())k.reject(new Error(S));a.clear()};i.once("exit",b=>h(b));let v=async(b,S)=>{let k=`tg-agent-${Date.now()}-${Math.random().toString(16).slice(2,8)}`,P={jsonrpc:"2.0",id:k,method:b,params:S??{}};return await new Promise((y,w)=>{a.set(k,{resolve:y,reject:w}),i.stdin?.write(`${JSON.stringify(P)}
6
15
  `)})};fetch("http://127.0.0.1:7243/ingest/9e452bb4-cc67-4519-89fa-8fb51d810231",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({location:"mcp.ts:callStdioMcp:beforeInit",message:"sending initialize request",data:{elapsed:Date.now()-s},timestamp:Date.now(),sessionId:"debug-session",hypothesisId:"B,C"})}).catch(()=>{});let M=await v("initialize",{protocolVersion:"2024-11-05",clientInfo:{name:"tg-agent",version:process.env.npm_package_version??"dev"},capabilities:{}});if(fetch("http://127.0.0.1:7243/ingest/9e452bb4-cc67-4519-89fa-8fb51d810231",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({location:"mcp.ts:callStdioMcp:afterInit",message:"initialize response received",data:{elapsed:Date.now()-s,hasError:!!M.error},timestamp:Date.now(),sessionId:"debug-session",hypothesisId:"B,C"})}).catch(()=>{}),M.error&&typeof M.error=="object"){let b=M.error.message??"MCP initialize failed.";throw l(),new Error(String(b))}let _={jsonrpc:"2.0",method:"notifications/initialized"};i.stdin?.write(`${JSON.stringify(_)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tg-agent",
3
- "version": "1.2.7",
3
+ "version": "1.2.8",
4
4
  "description": "Telegram Agent Bot",
5
5
  "type": "module",
6
6
  "bin": {