shennian 0.5.50 → 0.5.51
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.
|
@@ -291,8 +291,8 @@
|
|
|
291
291
|
},
|
|
292
292
|
{
|
|
293
293
|
"file": "src/agents/model-registry/service.js",
|
|
294
|
-
"beforeBytes":
|
|
295
|
-
"afterBytes":
|
|
294
|
+
"beforeBytes": 9852,
|
|
295
|
+
"afterBytes": 3804
|
|
296
296
|
},
|
|
297
297
|
{
|
|
298
298
|
"file": "src/agents/model-registry/types.js",
|
|
@@ -951,8 +951,8 @@
|
|
|
951
951
|
},
|
|
952
952
|
{
|
|
953
953
|
"file": "src/personal-agent/sdk-session.js",
|
|
954
|
-
"beforeBytes":
|
|
955
|
-
"afterBytes":
|
|
954
|
+
"beforeBytes": 7526,
|
|
955
|
+
"afterBytes": 4100
|
|
956
956
|
},
|
|
957
957
|
{
|
|
958
958
|
"file": "src/personal-agent/system-prompt.js",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getAgentConfigSummary as g}from"../config-status.js";import{isCacheFresh as x,readCache as f,writeCache as v}from"./cache.js";import{discoverModelsForAgent as b}from"./discovery.js";import{ModelDiscoveryFallbackError as
|
|
1
|
+
import{getAgentConfigSummary as g}from"../config-status.js";import{isCacheFresh as x,readCache as f,writeCache as v}from"./cache.js";import{discoverModelsForAgent as b}from"./discovery.js";import{ModelDiscoveryFallbackError as F}from"./types.js";import{getAgentRuntimeSummary as A}from"../runtime-compatibility.js";import{isRestrictedRoomChatUnsupported as E,resolveManagedAgentRuntimeProtection as k}from"../../security/managed-agent-runtime.js";const M={claude:"claude-alias-v2",codex:"codex-app-server-v2",opencode:"opencode-connected-v1","pi-coding-agent":"pi-configured-v1"};function w(t,s,e){console.warn(`[model-discovery] agent=${t} source=fallback reason=${s} usedCache=${e}`)}function C(t){const s=new Set,e=[];for(const r of t)!r.id||s.has(r.id)||(s.add(r.id),e.push(r));return e}function S(t){if(t.type==="shennian")return{supportsFreshPersonalContext:!0,supportsStandardSession:!0,supportsAgent:!0,supportsManagedAgent:!1,supportsManagedNativeFull:!0,supportsRoomTools:!0,supportsWorker:!1,supportsManagerMode:!1,supportsExternalWorkerTarget:!0,supportedAgentExecutionModes:["native-full"]};const s=t.type!=="manager"&&t.type!=="pi"&&t.type!=="openclaw",e=s,r=e&&!t.type.startsWith("acp:"),n=e?k({agentType:t.type,runtimeVersion:t.version,platform:t.runtimePlatform,isWsl:t.runtimeIsWsl,executableFingerprint:t.executableFingerprint,requireExecutableFingerprint:!0}):null,c=r&&!E(t.type)&&(n?.level==="hard"||n?.level==="partial"),o=e,i=e,p=[...o?["native-full"]:[],...c?["restricted"]:[]],u=i,a=s;return{supportsStandardSession:s,supportsAgent:i,supportedAgentExecutionModes:p,supportsManagedAgent:c,supportsManagedNativeFull:o,supportsRoomTools:u,supportsWorker:a,supportsManagerMode:u&&a,supportsExternalWorkerTarget:a,...n?{managedAgentProtection:n}:{}}}function R(t,s){return t.type==="opencode"&&(!t.authState||t.authState==="unknown")&&s.length>0?{authState:"ready"}:t.authState?{authState:t.authState}:{}}function q(t,s){if(!t.startsWith("acp:"))return!1;const e=C(s);if(e.length===0)return!1;const r=f(),n=r.agents[t];return JSON.stringify(n?.models)===JSON.stringify(e)?!1:(r.agents[t]={refreshedAt:Date.now(),models:e},v(r),!0)}function T(t){const s=f();return t.map(e=>{const r=s.agents[e.type],n=M[e.type],c=r&&(!n||r.sourceRevision===n)?r.models:e.models??[],o=g(e.type),i=A(e);return{type:e.type,models:c,...e.integration?{integration:e.integration}:{},...e.display?{display:e.display}:{},...e.acpCapabilities?{acpCapabilities:e.acpCapabilities}:{},...R(e,c),...e.acpAuthMethods?{acpAuthMethods:e.acpAuthMethods}:{},...e.catalogRevision?{catalogRevision:e.catalogRevision}:{},...S(e),...o?{config:o}:{},...i?{runtime:i}:{}}})}async function V(t,s){return O(t,s,{forceRefresh:!0})}async function O(t,s,e={}){const r=f();let n=!1;const c=[];for(const o of t){const i=r.agents[o.type],p=M[o.type],u=i&&(!p||i.sourceRevision===p)?i:void 0;let a;if(!e.forceRefresh&&x(i,o.version,p))a=i.models;else{let d=null;try{d=C(await b(o,s)),a=d.length>0?d:u?.models??o.models??[]}catch(l){if(l instanceof F){const y=!!u?.models.length;a=y?u.models:l.fallbackModels,w(o.type,l.failureCode,y)}else a=u?.models??o.models??[]}if(d&&d.length>0){const l={version:o.version,...p?{sourceRevision:p}:{},refreshedAt:Date.now(),models:a};JSON.stringify(i)!==JSON.stringify(l)&&(r.agents[o.type]=l,n=!0)}}const h=g(o.type),m=A(o);c.push({type:o.type,models:a,...o.integration?{integration:o.integration}:{},...o.display?{display:o.display}:{},...o.acpCapabilities?{acpCapabilities:o.acpCapabilities}:{},...R(o,a),...o.acpAuthMethods?{acpAuthMethods:o.acpAuthMethods}:{},...o.catalogRevision?{catalogRevision:o.catalogRevision}:{},...S(o),...h?{config:h}:{},...m?{runtime:m}:{}})}return n&&v(r),c}export{T as getCachedAgentInfos,q as recordAcpAgentModels,V as refreshAgentInfos,O as resolveAgentInfos};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{builtinPersonalSystemPrompt as O}from"./system-prompt.js";import
|
|
2
|
-
`),
|
|
1
|
+
import{builtinPersonalSystemPrompt as O}from"./system-prompt.js";import o from"node:fs";import p from"node:path";import{getShennianDir as C}from"../config/index.js";import{readPersonalModel as E,OFFICIAL_MODEL as F,personalCompactionSettings as D}from"./model-settings.js";import{OfficialModelCredential as T,personalModelServerUrl as W}from"./official-credential.js";const w=a=>/^[\w-]{1,191}$/.test(a);function L(a,r,m){return a==="project-coordination"?m.map(f=>f.name):a==="validation"?[]:["read","edit","write",r]}async function H(a,r,m,f,_,t="personal",M=[]){const s=await import("@earendil-works/pi-coding-agent");if(!w(a)||m&&!w(m))throw new Error("personal_agent_session_invalid");const l=p.join(C(),"runtime",t==="personal"?"personal-agent":t==="validation"?"builtin-agent-validation":t==="project-coordination"?"project-coordination":"builtin-managed-agent",a);try{o.mkdirSync(l,{recursive:!0,mode:448});const c=p.join(l,"sessions"),u=p.join(l,"session.json");let i;if(o.existsSync(u)){const e=JSON.parse(o.readFileSync(u,"utf8"));if(!w(e.id)||p.basename(e.file)!==e.file||!e.file.endsWith(".jsonl")||m&&e.id!==m)throw new Error("personal_agent_session_mismatch");if(!o.existsSync(p.join(c,e.file)))throw new Error("personal_agent_session_missing");if(i=s.SessionManager.open(p.join(c,e.file),c,r),i.getSessionId()!==e.id)throw new Error("personal_agent_session_mismatch")}else{if(m)throw new Error("personal_agent_session_missing");i=s.SessionManager.create(r,c),o.mkdirSync(c,{recursive:!0,mode:448});const e=i.getSessionFile(),d=o.openSync(e,"wx",384);try{o.writeFileSync(d,JSON.stringify(i.getHeader())+`
|
|
2
|
+
`),o.fsyncSync(d)}finally{o.closeSync(d)}i=s.SessionManager.open(e,c,r),i.appendCustomEntry("shennian-owner",{sessionId:a})}const P=new T;let n=E();const g=await s.ModelRuntime.create({modelsPath:null,refreshOnCreate:!1,allowModelNetwork:!1,modelsStorePath:p.join(l,"models-cache.json"),credentials:{read:async e=>e==="shennian-personal"?{type:"api_key",key:n.mode==="official"?await P.get():n.apiKey}:void 0,list:async()=>[],modify:async()=>{throw new Error("personal_model_credentials_read_only")},delete:async()=>{throw new Error("personal_model_credentials_read_only")}}}),v=()=>(n=E(),g.registerProvider("shennian-personal",{api:"openai-completions",baseUrl:n.mode==="official"?`${W()}/api/personal-model/v1`:n.baseUrl,models:[{id:n.mode==="official"?F:n.model,name:n.mode==="official"?"DeepSeek V4.1 Flash":n.model,reasoning:!1,input:["text","image"],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:n.contextWindow??1e6,maxTokens:Math.min(4096,Math.floor((n.contextWindow??1e6)/4)),compat:{supportsDeveloperRole:!1,supportsStore:!1,maxTokensField:"max_tokens"}}]}),g.getModel("shennian-personal",n.mode==="official"?F:n.model)),b=v(),y=s.SettingsManager.inMemory({compaction:D(n.contextWindow),retry:{enabled:!1}}),x=new s.DefaultResourceLoader({cwd:r,agentDir:l,settingsManager:y,noContextFiles:t==="validation"||t==="project-coordination",noExtensions:!0,noSkills:!0,noPromptTemplates:!0,noThemes:!0,appendSystemPrompt:[t==="personal"?O(_):_]});await x.reload();const j=e=>({...e,env:t==="personal"?{...e.env,...f()}:{...f()}}),k=process.platform==="win32"?s.createPowerShellToolDefinition(r,{spawnHook:j}):s.createBashToolDefinition(r,{spawnHook:j}),{session:S}=await s.createAgentSession({cwd:r,agentDir:l,modelRuntime:g,model:b,thinkingLevel:"off",sessionManager:i,settingsManager:y,resourceLoader:x,tools:L(t,k.name,M),customTools:t==="project-coordination"?M:t==="validation"?[]:[k]});S.setAutoCompactionEnabled(!0);const h=()=>{const e=i.getSessionFile();if(e){const d=`${u}.${process.pid}.tmp`;o.writeFileSync(d,JSON.stringify({id:i.getSessionId(),file:p.basename(e)}),{mode:384}),o.renameSync(d,u)}};return h(),{session:S,runtime:g,refreshModel:async()=>{await S.setModel(v()),y.applyOverrides({compaction:D(n.contextWindow)}),h()},persist:h,cleanup:t==="validation"?()=>o.rmSync(l,{recursive:!0,force:!0}):void 0}}catch(c){throw t==="validation"&&o.rmSync(l,{recursive:!0,force:!0}),c}}export{H as openPersonalAgent,L as personalSessionToolNames};
|