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": 9816,
295
- "afterBytes": 3772
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": 7619,
955
- "afterBytes": 4258
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 E}from"./types.js";import{getAgentRuntimeSummary as A}from"../runtime-compatibility.js";import{isRestrictedRoomChatUnsupported as F,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 S(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 C(t){if(t.type==="shennian")return{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&&!F(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 P(t,s){if(!t.startsWith("acp:"))return!1;const e=S(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}:{},...C(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=S(await b(o,s)),a=d.length>0?d:u?.models??o.models??[]}catch(l){if(l instanceof E){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}:{},...C(o),...h?{config:h}:{},...m?{runtime:m}:{}})}return n&&v(r),c}export{T as getCachedAgentInfos,P as recordAcpAgentModels,V as refreshAgentInfos,O as resolveAgentInfos};
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{legacyPersonalContext as T}from"./legacy-context.js";import t from"node:fs";import p from"node:path";import{getShennianDir as W}from"../config/index.js";import{readPersonalModel as E,OFFICIAL_MODEL as F,personalCompactionSettings as P}from"./model-settings.js";import{OfficialModelCredential as L,personalModelServerUrl as N}from"./official-credential.js";const h=i=>/^[\w-]{1,191}$/.test(i);function R(i,s,m){return i==="project-coordination"?m.map(f=>f.name):i==="validation"?[]:["read","edit","write",s]}async function V(i,s,m,f,_,o="personal",M=[]){const a=await import("@earendil-works/pi-coding-agent");if(!h(i)||m&&!h(m))throw new Error("personal_agent_session_invalid");const l=p.join(W(),"runtime",o==="personal"?"personal-agent":o==="validation"?"builtin-agent-validation":o==="project-coordination"?"project-coordination":"builtin-managed-agent",i);try{t.mkdirSync(l,{recursive:!0,mode:448});const c=p.join(l,"sessions"),u=p.join(l,"session.json");let r;if(t.existsSync(u)){const e=JSON.parse(t.readFileSync(u,"utf8"));if(!h(e.id)||p.basename(e.file)!==e.file||!e.file.endsWith(".jsonl")||m&&e.id!==m)throw new Error("personal_agent_session_mismatch");if(!t.existsSync(p.join(c,e.file)))throw new Error("personal_agent_session_missing");if(r=a.SessionManager.open(p.join(c,e.file),c,s),r.getSessionId()!==e.id)throw new Error("personal_agent_session_mismatch")}else{if(m)throw new Error("personal_agent_session_missing");r=a.SessionManager.create(s,c),t.mkdirSync(c,{recursive:!0,mode:448});const e=r.getSessionFile(),d=t.openSync(e,"wx",384);try{t.writeFileSync(d,JSON.stringify(r.getHeader())+`
2
- `),t.fsyncSync(d)}finally{t.closeSync(d)}r=a.SessionManager.open(e,c,s),r.appendCustomEntry("shennian-owner",{sessionId:i});const D=o==="personal"?T(i):null;D&&r.appendMessage({role:"user",content:D,timestamp:Date.now()})}const b=new L;let n=E();const g=await a.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 b.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"?`${N()}/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)),C=v(),y=a.SettingsManager.inMemory({compaction:P(n.contextWindow),retry:{enabled:!1}}),x=new a.DefaultResourceLoader({cwd:s,agentDir:l,settingsManager:y,noContextFiles:o==="validation"||o==="project-coordination",noExtensions:!0,noSkills:!0,noPromptTemplates:!0,noThemes:!0,appendSystemPrompt:[o==="personal"?O(_):_]});await x.reload();const j=e=>({...e,env:o==="personal"?{...e.env,...f()}:{...f()}}),k=process.platform==="win32"?a.createPowerShellToolDefinition(s,{spawnHook:j}):a.createBashToolDefinition(s,{spawnHook:j}),{session:S}=await a.createAgentSession({cwd:s,agentDir:l,modelRuntime:g,model:C,thinkingLevel:"off",sessionManager:r,settingsManager:y,resourceLoader:x,tools:R(o,k.name,M),customTools:o==="project-coordination"?M:o==="validation"?[]:[k]});S.setAutoCompactionEnabled(!0);const w=()=>{const e=r.getSessionFile();if(e){const d=`${u}.${process.pid}.tmp`;t.writeFileSync(d,JSON.stringify({id:r.getSessionId(),file:p.basename(e)}),{mode:384}),t.renameSync(d,u)}};return w(),{session:S,runtime:g,refreshModel:async()=>{await S.setModel(v()),y.applyOverrides({compaction:P(n.contextWindow)}),w()},persist:w,cleanup:o==="validation"?()=>t.rmSync(l,{recursive:!0,force:!0}):void 0}}catch(c){throw o==="validation"&&t.rmSync(l,{recursive:!0,force:!0}),c}}export{V as openPersonalAgent,R as personalSessionToolNames};
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};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shennian",
3
- "version": "0.5.50",
3
+ "version": "0.5.51",
4
4
  "description": "Shennian — AI Agent Control Plane CLI",
5
5
  "type": "module",
6
6
  "bin": {