shennian 0.4.24 → 0.4.25

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.
@@ -46,8 +46,8 @@
46
46
  },
47
47
  {
48
48
  "file": "src/agents/acp/discovery.js",
49
- "beforeBytes": 9047,
50
- "afterBytes": 4281
49
+ "beforeBytes": 9533,
50
+ "afterBytes": 4336
51
51
  },
52
52
  {
53
53
  "file": "src/agents/acp/events.js",
@@ -1 +1 @@
1
- import{RequestError as B}from"@agentclientprotocol/sdk";import{buildCommandStringLaunchSpec as k,commandExists as x,resolveCommandFileIdentity as M}from"../command-spec.js";import{registerAcpAgent as v}from"./adapter.js";import{getRegisteredAgents as R,unregisterAgent as T}from"../adapter.js";import{readAcpManifests as E}from"./manifests.js";import{AcpProcessClient as L}from"./process-client.js";import{acpAgentType as h}from"./types.js";import{loadAcpCatalog as D}from"./catalog.js";import{buildAcpCapabilityCacheKey as F,readAcpCapabilityCache as N,writeAcpCapabilityCache as P}from"./capability-cache.js";import{getAcpRuntimeAuthState as S,setAcpRuntimeAuthState as _}from"./auth-state.js";import{recordAcpScan as q}from"./metrics.js";const K=[{id:"qwen-code",name:"Qwen Code",source:"registry",launch:{command:"qwen",args:["--acp"]}},{id:"kimi",name:"Kimi CLI",source:"registry",launch:{command:"kimi",args:["acp"]}}],O=new Set(["claude","codex","codebuddy","cursor","opencode","pi"]);async function ne(t={}){const i=Date.now();let r=0,n=0;const c={};for(const e of R())e.startsWith("acp:")&&T(e);const s=t.candidates?{candidates:t.candidates,revision:void 0}:await D(t),y=$([...s.candidates.length?s.candidates:K,...E()]),b=y.filter(e=>{const f=e.launch.command;return O.has(f)?!1:x(f)}).filter((e,f,o)=>o.findIndex(m=>m.id===e.id)===f),C=(await H(b,3,async e=>{const o={...k(e.launch.command,e.launch.args??[],t.cwd??process.cwd()),...e.launch.env?{env:e.launch.env}:{}},m=F({manifest:e,platform:process.platform,catalogRevision:s.revision,executableIdentity:M(e.launch.command)}),d=m?N(m):null;if(d?.type===h(e.id)&&d.integration==="acp"&&d.acpCapabilities?.protocolVersion===1)return r+=1,v({...e,launch:o,authLaunch:e.launch}),{...d,authState:S(h(e.id))??d.authState,command:o.command,args:o.args??[],display:{...d.display,name:e.name},...s.revision?{catalogRevision:s.revision}:{}};const g=new L(o,{onSessionUpdate:()=>{},onPermission:async()=>({outcome:{outcome:"cancelled"}})},process.env,{terminalAuth:!0});try{const l=await g.start(t.cwd??process.cwd()),a=l.agentCapabilities??{},I={protocolVersion:1,listSessions:!!a.sessionCapabilities?.list,loadSession:!!a.loadSession,resumeSession:!!a.sessionCapabilities?.resume,closeSession:!!a.sessionCapabilities?.close,deleteSession:!!a.sessionCapabilities?.delete,terminal:!!e.clientCapabilities?.terminal,fileRead:!!e.clientCapabilities?.readTextFile,fileWrite:!!e.clientCapabilities?.writeTextFile,permission:!0,modelConfig:!1};let p=l.authMethods?.length?"unknown":"ready";if(a.sessionCapabilities?.list)try{await g.listSessions(t.cwd??process.cwd()),p=l.authMethods?.length?"unknown":"ready"}catch(u){p=u instanceof B&&u.code===-32e3?"required":"unknown"}const A=S(h(e.id));A?p=A:p==="required"&&_(h(e.id),p),v({...e,launch:o,authLaunch:e.launch});const w={type:h(e.id),command:o.command,args:o.args??[],version:l.agentInfo?.version??void 0,runtimePlatform:process.platform,integration:"acp",display:{name:e.name,version:l.agentInfo?.version??void 0},acpCapabilities:I,authState:p,acpAuthMethods:(l.authMethods??[]).slice(0,8).map(u=>({id:u.id.slice(0,128),name:u.name.slice(0,80),type:"type"in u&&u.type==="terminal"?"terminal":"agent"})),...s.revision?{catalogRevision:s.revision}:{}};return m&&P(m,w),w}catch(l){n+=1;const a=W(l);return c[a]=(c[a]??0)+1,null}finally{await g.close()}})).filter(e=>!!e);return q({durationMs:Date.now()-i,candidateCount:y.length,installedCount:C.length,cacheHits:r,handshakeFailures:n,handshakeFailuresByKind:c}),C}function W(t){const i=t instanceof Error?t.message:"";return/timed out/i.test(i)?"timeout":/protocol version/i.test(i)?"version":/safety limit|exceeded/i.test(i)?"output_limit":/json|parse/i.test(i)?"invalid_protocol":/enoent|not found/i.test(i)?"launch":"other"}function $(t){const i=new Set(t.filter(n=>n.source==="local").map(n=>n.id)),r=new Map;for(const n of t){if(n.source!=="local"&&i.has(n.id))continue;const c=`${n.id}\0${n.launch.command}\0${JSON.stringify(n.launch.args??[])}`;r.has(c)||r.set(c,n)}return[...r.values()]}async function H(t,i,r){const n=new Array(t.length);let c=0;return await Promise.all(Array.from({length:Math.min(i,t.length)},async()=>{for(;;){const s=c++;if(s>=t.length)return;n[s]=await r(t[s])}})),n}export{ne as discoverAcpAgents};
1
+ import{RequestError as x}from"@agentclientprotocol/sdk";import{buildCommandStringLaunchSpec as M,commandExists as R,resolveCommandFileIdentity as T}from"../command-spec.js";import{registerAcpAgent as S}from"./adapter.js";import{getRegisteredAgents as E,unregisterAgent as L}from"../adapter.js";import{readAcpManifests as D}from"./manifests.js";import{AcpProcessClient as F}from"./process-client.js";import{acpAgentType as g}from"./types.js";import{loadAcpCatalog as N}from"./catalog.js";import{buildAcpCapabilityCacheKey as P,readAcpCapabilityCache as _,writeAcpCapabilityCache as q}from"./capability-cache.js";import{getAcpRuntimeAuthState as b,setAcpRuntimeAuthState as K}from"./auth-state.js";import{recordAcpScan as O}from"./metrics.js";const W=[{id:"qwen-code",name:"Qwen Code",source:"registry",launch:{command:"qwen",args:["--acp"]}},{id:"kimi",name:"Kimi CLI",source:"registry",launch:{command:"kimi",args:["acp"]}}],$=new Set(["claude","codex","codebuddy","cursor","opencode","pi"]);async function se(t={}){const i=Date.now();let a=0,n=0;const r={},f=new Set(E().filter(e=>e.startsWith("acp:"))),l=t.candidates?{candidates:t.candidates,revision:void 0}:await N(t),w=U([...l.candidates.length?l.candidates:W,...D()]),I=w.filter(e=>{const h=e.launch.command;return $.has(h)?!1:R(h)}).filter((e,h,s)=>s.findIndex(m=>m.id===e.id)===h),y=(await V(I,3,async e=>{const s={...M(e.launch.command,e.launch.args??[],t.cwd??process.cwd()),...e.launch.env?{env:e.launch.env}:{}},m=P({manifest:e,platform:process.platform,catalogRevision:l.revision,executableIdentity:T(e.launch.command)}),d=m?_(m):null;if(d?.type===g(e.id)&&d.integration==="acp"&&d.acpCapabilities?.protocolVersion===1)return a+=1,S({...e,launch:s,authLaunch:e.launch}),{...d,authState:b(g(e.id))??d.authState,command:s.command,args:s.args??[],display:{...d.display,name:e.name},...l.revision?{catalogRevision:l.revision}:{}};const C=new F(s,{onSessionUpdate:()=>{},onPermission:async()=>({outcome:{outcome:"cancelled"}})},process.env,{terminalAuth:!0});try{const c=await C.start(t.cwd??process.cwd()),o=c.agentCapabilities??{},k={protocolVersion:1,listSessions:!!o.sessionCapabilities?.list,loadSession:!!o.loadSession,resumeSession:!!o.sessionCapabilities?.resume,closeSession:!!o.sessionCapabilities?.close,deleteSession:!!o.sessionCapabilities?.delete,terminal:!!e.clientCapabilities?.terminal,fileRead:!!e.clientCapabilities?.readTextFile,fileWrite:!!e.clientCapabilities?.writeTextFile,permission:!0,modelConfig:!1};let p=c.authMethods?.length?"unknown":"ready";if(o.sessionCapabilities?.list)try{await C.listSessions(t.cwd??process.cwd()),p=c.authMethods?.length?"unknown":"ready"}catch(u){p=u instanceof x&&u.code===-32e3?"required":"unknown"}const A=b(g(e.id));A?p=A:p==="required"&&K(g(e.id),p),S({...e,launch:s,authLaunch:e.launch});const v={type:g(e.id),command:s.command,args:s.args??[],version:c.agentInfo?.version??void 0,runtimePlatform:process.platform,integration:"acp",display:{name:e.name,version:c.agentInfo?.version??void 0},acpCapabilities:k,authState:p,acpAuthMethods:(c.authMethods??[]).slice(0,8).map(u=>({id:u.id.slice(0,128),name:u.name.slice(0,80),type:"type"in u&&u.type==="terminal"?"terminal":"agent"})),...l.revision?{catalogRevision:l.revision}:{}};return m&&q(m,v),v}catch(c){n+=1;const o=H(c);return r[o]=(r[o]??0)+1,null}finally{await C.close()}})).filter(e=>!!e),B=new Set(y.map(e=>e.type));for(const e of f)B.has(e)||L(e);return O({durationMs:Date.now()-i,candidateCount:w.length,installedCount:y.length,cacheHits:a,handshakeFailures:n,handshakeFailuresByKind:r}),y}function H(t){const i=t instanceof Error?t.message:"";return/timed out/i.test(i)?"timeout":/protocol version/i.test(i)?"version":/safety limit|exceeded/i.test(i)?"output_limit":/json|parse/i.test(i)?"invalid_protocol":/enoent|not found/i.test(i)?"launch":"other"}function U(t){const i=new Set(t.filter(n=>n.source==="local").map(n=>n.id)),a=new Map;for(const n of t){if(n.source!=="local"&&i.has(n.id))continue;const r=`${n.id}\0${n.launch.command}\0${JSON.stringify(n.launch.args??[])}`;a.has(r)||a.set(r,n)}return[...a.values()]}async function V(t,i,a){const n=new Array(t.length);let r=0;return await Promise.all(Array.from({length:Math.min(i,t.length)},async()=>{for(;;){const f=r++;if(f>=t.length)return;n[f]=await a(t[f])}})),n}export{se as discoverAcpAgents};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shennian",
3
- "version": "0.4.24",
3
+ "version": "0.4.25",
4
4
  "description": "Shennian — AI Agent Control Plane CLI",
5
5
  "type": "module",
6
6
  "bin": {