qlogicagent 2.19.7 → 2.19.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.
- package/README.md +16 -5
- package/dist/cli.js +1 -1
- package/dist/host-contract.js +1 -1
- package/dist/index.js +335 -334
- package/dist/protocol.js +1 -1
- package/dist/skills/mcp/astraclaw-native-mcp-server.js +3 -3
- package/dist/types/cli/acp-session-host.d.ts +4 -0
- package/dist/types/cli/agent-runtime-bootstrap.d.ts +3 -0
- package/dist/types/cli/agent-runtime-session-state.d.ts +12 -4
- package/dist/types/cli/industrial-runtime-archive.d.ts +14 -0
- package/dist/types/cli/industrial-runtime-store.d.ts +29 -0
- package/dist/types/cli/mcp-bootstrap.d.ts +11 -1
- package/dist/types/cli/resolved-agent-cache.d.ts +7 -0
- package/dist/types/cli/runtime-dependency-catalog.d.ts +35 -5
- package/dist/types/cli/stdio-acp-request-host.d.ts +2 -2
- package/dist/types/cli/stdio-agent-session-bootstrap.d.ts +4 -1
- package/dist/types/cli/stdio-server.d.ts +6 -1
- package/dist/types/cli/tool-bootstrap-core-registration.d.ts +1 -0
- package/dist/types/cli/tool-registry-adapter.d.ts +9 -1
- package/dist/types/cli/windows-authenticode.d.ts +18 -0
- package/dist/types/host-contract/index.d.ts +2 -6
- package/dist/types/protocol/wire/acp-protocol.d.ts +6 -5
- package/dist/types/runtime/community/community-consent-client.d.ts +3 -0
- package/dist/types/runtime/community/ranged-download.d.ts +6 -0
- package/dist/types/runtime/infra/industrial-runtime-session-server.d.ts +15 -0
- package/dist/types/runtime/infra/llmrouter-access-token.d.ts +13 -0
- package/dist/types/skills/tools/exec-tool.d.ts +4 -2
- package/dist/types/skills/tools/shell/shell-exec.d.ts +3 -0
- package/dist/types/skills/tools/shell/subprocess-env.d.ts +1 -1
- package/dist/types/test-support/project-store-fixture.d.ts +11 -0
- package/package.json +8 -2
package/dist/protocol.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var G=["idle","running-right","running-left","waving","jumping","failed","waiting","running","review"];var Y="1.0.0",l={PARSE_ERROR:-32700,INVALID_REQUEST:-32600,METHOD_NOT_FOUND:-32601,INVALID_PARAMS:-32602,INTERNAL_ERROR:-32603,TURN_ABORTED:-32e3,TURN_TIMEOUT:-32001,LLM_ERROR:-32010,LLM_AUTH_ERROR:-32011,LLM_RATE_LIMIT:-32012,LLM_QUOTA_EXHAUSTED:-32013,LLM_MODEL_NOT_FOUND:-32014,TOOL_INVOKE_FAILED:-32020,TOOL_TIMEOUT:-32021,PROTOCOL_MISMATCH:-32030,REQUEST_DEADLINE_EXCEEDED:-32040,REQUEST_CANCELLED:-32041,REQUEST_DEDUPED:-32042,REQUEST_IDEMPOTENCY_REQUIRED:-32043},z={REQUEST:"tool.approval.request"};function _(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&typeof t.method=="string"&&t.method.length>0}function C(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&(typeof t.id=="string"||typeof t.id=="number")&&!("method"in t)}function x(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&typeof t.method=="string"&&!("id"in t)}function X(e){let t;try{t=JSON.parse(e)}catch{return null}return C(t)||_(t)||x(t)?t:null}import{randomUUID as $}from"node:crypto";var J=["settings.list","settings.get","settings.validate","provider.list","tools.list","todos.list","tasks.list","session.list","session.get","session.resolve","session.loadNativeTranscript","thread.list","project.list","files.list","files.gitStatus","instructions.list","instructions.read","skills.list","skills.stats","memory.atlas","memory.activity","memory.list","memory.read","memory.search","media.listModels","media.status","pet.status","agent.health","agent.metrics"],Q=new Set(["memory.dream","memory.propose","memory.consolidate","media.stt","pet.forge","pet.asset.import","solo.start","solo.evaluate","product.plan","product.create","product.message"]),Z=["memory.","pet.","usage."],ee=new Set(["memory.atlas","memory.activity","memory.list","memory.read","memory.search","memory.attachment.locate","memory.attachment.adopt","pet.status"]);function A(e){return Q.has(e)?{channel:"task",mutability:"write",defaultTimeoutMs:12e4}:J.some(t=>e===t||e.startsWith(`${t}.`)||e.startsWith(t))?{channel:"query",mutability:"read",defaultTimeoutMs:1e4}:{channel:"task",mutability:"write",defaultTimeoutMs:3e4}}function v(e){return ee.has(e)||A(e).mutability==="read"?!1:Z.some(t=>e.startsWith(t))}function te(e,t={}){let r=t.now??Date.now(),n=A(e),o=t.timeoutMs??n.defaultTimeoutMs;return{requestId:t.requestId??$(),createdAt:r,deadlineAt:r+o,channel:t.channel??n.channel,idempotencyKey:t.idempotencyKey,traceId:t.traceId}}function M(e,t=Date.now()){let r=e.meta;if(!r||typeof r!="object")return{ok:!1,error:{code:l.INVALID_REQUEST,message:"RPC request meta is required."}};if(typeof r.requestId!="string"||r.requestId.length===0)return{ok:!1,error:{code:l.INVALID_REQUEST,message:"RPC request meta.requestId is required."}};if(r.channel!=="query"&&r.channel!=="task")return{ok:!1,error:{code:l.INVALID_REQUEST,message:"RPC request meta.channel must be query or task."}};if(typeof r.createdAt!="number"||!Number.isFinite(r.createdAt))return{ok:!1,error:{code:l.INVALID_REQUEST,message:"RPC request meta.createdAt is required."}};if(typeof r.deadlineAt!="number"||!Number.isFinite(r.deadlineAt))return{ok:!1,error:{code:l.INVALID_REQUEST,message:"RPC request meta.deadlineAt is required."}};if(r.deadlineAt<=t)return{ok:!1,error:{code:l.REQUEST_DEADLINE_EXCEEDED,message:"RPC request deadline has already expired."}};let n=A(e.method).channel;return r.channel!==n?{ok:!1,error:{code:l.INVALID_REQUEST,message:`RPC request channel mismatch: expected ${n}, got ${r.channel}.`}}:v(e.method)&&(typeof r.idempotencyKey!="string"||r.idempotencyKey.length===0)?{ok:!1,error:{code:l.REQUEST_IDEMPOTENCY_REQUIRED,message:`RPC method ${e.method} requires meta.idempotencyKey.`}}:{ok:!0,meta:r}}var R=class{now;active=new Map;idempotency=new Map;counters={completedRequests:0,cancelledRequests:0,deadlineExceededRequests:0,dedupedRequests:0,lateResponsesDropped:0,invalidRequests:0};constructor(t={}){this.now=t.now??(()=>Date.now())}begin(t,r){let n=M({method:t,meta:r},this.now());if(!n.ok)return this.counters.invalidRequests+=1,{status:"rejected",error:n.error};if(r.idempotencyKey){let o=this.idempotency.get(r.idempotencyKey);if(o)return this.counters.dedupedRequests+=1,o.error?{status:"deduped",error:o.error}:{status:"deduped",result:o.result}}return this.active.set(r.requestId,{method:t,meta:r,cancelled:!1,startedAt:this.now()}),{status:"started"}}cancel(t,r="cancelled"){let n=this.active.get(t);return!n||n.cancelled?!1:(n.cancelled=!0,n.cancelReason=r,this.counters.cancelledRequests+=1,!0)}expire(t){return this.active.get(t)?(this.active.delete(t),this.counters.deadlineExceededRequests+=1,!0):!1}settle(t,r,n){let o=this.active.get(t);return o?(this.active.delete(t),o.cancelled?(this.counters.lateResponsesDropped+=1,{accepted:!1,reason:"cancelled"}):o.meta.deadlineAt<=this.now()?(this.counters.deadlineExceededRequests+=1,this.counters.lateResponsesDropped+=1,{accepted:!1,reason:"deadline_exceeded"}):(this.counters.completedRequests+=1,o.meta.idempotencyKey&&this.idempotency.set(o.meta.idempotencyKey,{result:r,error:n,settledAt:this.now()}),{accepted:!0})):{accepted:!1,reason:"unknown"}}metrics(){return{activeRequests:this.active.size,...this.counters}}};var re=["agent.health","agent.metrics","agent.cancel","provider.catalog","provider.list","provider.get","provider.install","provider.install.cancel","provider.update","provider.uninstall","provider.enable","provider.disable","provider.diagnose","provider.auth.status","provider.auth.setPreference","provider.auth.setUserKey","provider.auth.methods","provider.auth.start","provider.auth.attach","provider.auth.input","provider.auth.resize","provider.auth.cancel","provider.auth.logout","provider.models.list","provider.nativeSessions.list","provider.nativeSessions.load","provider.nativeSessions.resume","delegation.cancel","delegation.reset","session.list","session.get","session.create","session.update","session.delete","session.deleteAll","session.archive","session.loadNativeTranscript","session.adoptNative","session.moveToProject","session.getState","session.switchProject","session.getMessages","project.list","project.create","project.detach","project.delete","project.rename","project.archive","project.unarchive","project.update","instructions.list","instructions.read","instructions.write","instructions.delete","files.list","files.read","files.create","files.rename","files.move","files.copy","files.delete","files.search","files.undoOperation","files.gitStatus","turnBaseline.getSummary","turnBaseline.getFileDiff","turnBaseline.listRecent","turnBaseline.getFileBaseline","workingMaterials.get","workingMaterials.replace","workingMaterials.upsert","workingMaterials.remove","workingMaterials.reorder","skills.list","memory.list-files","memory.atlas","memory.activity","memory.propose","memory.consolidate","memory.update","memory.attachment.adopt","memory.attachment.locate"];var I=["turn.start","turn.delta","turn.end","turn.error","turn.recovery","turn.file_changes","turn.tool_call","turn.tool_result","turn.tool_blocked","turn.reasoning_delta","turn.approval_request","turn.skill_instruction","turn.ask_user","turn.media_result","turn.media_progress","turn.media_usage","turn.media_capability_check","turn.plan_update","turn.suggestions","turn.sidechain_started","turn.subagent_started","turn.subagent_delta","turn.subagent_ended","turn.sidechain_completed","turn.task_updated","turn.todos_updated","turn.exec_progress","turn.progress","turn.tool_use_summary","turn.tool_selection_policy","turn.lifecycle","turn.document_maintenance","turn.artifact_contract","turn.usage_update","team.member.notification","session.info","session.recovery_pending","memory.updated","skills.updated","turn.memory_recall","turn.memory_written","pet.soul_ready","pet.reaction","pet.growth","pet.state","pet.confirm","pet.asset.updated","system.activity","workflow.created","workflow.updated","workflow.deleted","workflow.runStarted","workflow.runCompleted","workflow.runFailed","workflow.nodeStatus","workflow.triggerDropped","workflow.alert","workflow.approvalRequested","workflow.approvalTimedOut"],b=["solo.progress","solo.specProgress","solo.agentDelta","solo.agentActivity","solo.agentUsage","solo.evaluation","product.taskStarted","product.taskOutput","product.members","product.agentActivity","product.taskCompleted","product.taskFailed","product.budgetUpdate","product.budgetWarning","product.checkpointed","product.completed","product.dagTopology","plan.interrupted","product.planReady","product.planningDelta","product.leaderMessage","product.planFailed","product.planningAsk","goal.run_state_changed","goal.phase_boundary","goal.goal_edited","goal.message_queued","goal.acceptance_updated","goal.round_message","mention.delegate_started","mention.delegate_activity","mention.delegate_settled"],ne=[...I,...b],w=ne;import{createHash as kt}from"node:crypto";import{resolve as Ct}from"node:path";var m={request:"x/delegate",update:"x/delegate.update",respond:"x/delegate.respond",cancel:"x/delegate.cancel"},ie=["search","addText","embedText","ingestExtracted","proposeExtracted","consumePendingProposals","feedback","findRelatedEvents","synthesizeTimeline","getActivitySummary","getAllProfiles","setProfile","getAtlas","setMemoryArchived","triggerDecay","resolveConflicts"],oe=["initialize","getIndex","addToIndex","replaceInIndex","removeFromIndex","createFile","writeFile","readFile","deleteFile","listFiles","searchLocal"],se=["getSkillSnapshot","readSkillFile","recordSkillInvocation","commitSkillMutation","applyCuratorPlan","prepareSkillInstall","finalizeSkillInstall"],ae=["loadForResume","appendTranscript","updateTitle","saveState","saveTaskSummary","groupSplit"],de=["commitTurnTelemetry","listDistillableFeedback","markFeedbackDistilled","runUploadSweep"],pe=["getSnapshot","create","switch","update"],Lt=1024*1024,ce=["list","get","diagnose"],le=["navigate","snapshot","click","type","screenshot","console","network"];var ue=["open","recordEvent","checkpoint","get","list","delete","getCheckpoint","listCheckpoints","restoreCheckpoint"],ge=["isActive","getSoul","awardXp","journeyCatchUp"],me=["getTunables","updateTunable","clearTunable","appendDirectoryAllowRule"];var Ut=new Set(ie),jt=new Set(oe),Kt=new Set(me),Ft=new Set(se),Vt=new Set(ae),Wt=new Set(de),qt=new Set(pe),Bt=new Set(ue),Gt=new Set(ge),Yt=new Set(ce),zt=new Set(le);var fe=1,ye={INITIALIZE:"initialize",SESSION_NEW:"session/new",SESSION_PROMPT:"session/prompt",SESSION_CLOSE:"session/close",SESSION_SET_CONFIG:"session/set_config_option",SESSION_SET_MODEL:"session/set_model",SESSION_SET_MODE:"session/set_mode",SESSION_LOAD:"session/load",SESSION_CANCEL:"session/cancel",SESSION_UPDATE:"session/update",SESSION_REQUEST_PERMISSION:"session/request_permission",FS_READ_TEXT_FILE:"fs/read_text_file",FS_WRITE_TEXT_FILE:"fs/write_text_file"},Ae={ABORT:"x/abort",DREAM:"x/dream",SOLO_START:"x/solo.start",SOLO_STATUS:"x/solo.status",SOLO_SELECT:"x/solo.select",SOLO_CANCEL:"x/solo.cancel",PRODUCT_CREATE:"x/product.create",PRODUCT_PLAN:"x/product.plan",PRODUCT_CONFIRM:"x/product.confirm",PRODUCT_MESSAGE:"x/product.message",PRODUCT_RESUME:"x/product.resume",PRODUCT_PAUSE:"x/product.pause",PRODUCT_CANCEL:"x/product.cancel",PRODUCT_ROLLBACK:"x/product.rollback",PRODUCT_REPLAY:"x/product.replay",PRODUCT_STATUS:"x/product.status",SOLO_SUBSCRIBE:"x/solo.subscribe",SOLO_MESSAGE:"x/solo.message",SOLO_EVALUATE:"x/solo.evaluate",SOLO_SPEC_CHAT:"x/solo.specChat",SOLO_SPEC_JUDGE:"x/solo.specJudge",WORKFLOW_CHAT:"x/workflow.chat",WORKFLOW_MATCH_INTENT:"x/workflow.matchIntent",PRODUCT_SUBSCRIBE:"x/product.subscribe",GOAL_START:"x/goal.start",GOAL_STATUS:"x/goal.status",GOAL_PAUSE:"x/goal.pause",GOAL_RESUME:"x/goal.resume",GOAL_UPDATE_GOAL:"x/goal.updateGoal",GOAL_STOP:"x/goal.stop",GOAL_MESSAGE:"x/goal.message",GOAL_SUBSCRIBE:"x/goal.subscribe",GOAL_EVENTS:"x/goal.events",DELEGATE:m.request,DELEGATE_UPDATE:m.update,DELEGATE_RESPOND:m.respond,DELEGATE_CANCEL:m.cancel},O={USER_MESSAGE_CHUNK:"user_message_chunk",AGENT_MESSAGE_CHUNK:"agent_message_chunk",AGENT_THOUGHT_CHUNK:"agent_thought_chunk",TOOL_CALL:"tool_call",TOOL_CALL_UPDATE:"tool_call_update",PLAN:"plan",USAGE_UPDATE:"usage_update",CONFIG_OPTION_UPDATE:"config_option_update",SESSION_INFO_UPDATE:"session_info_update",AVAILABLE_COMMANDS_UPDATE:"available_commands_update",CURRENT_MODE_UPDATE:"current_mode_update"},Se={X_SKILL_INSTRUCTION:"x_skill_instruction",X_SESSION_INFO:"x_session_info",X_RELAY:"x_relay"};function N(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&typeof t.method=="string"&&"id"in t}function D(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&typeof t.method=="string"&&!("id"in t)}function H(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&"id"in t&&!("method"in t)}function Re(e){let t;try{t=JSON.parse(e)}catch{return null}return H(t)||N(t)||D(t)?t:null}function Ie(e){return Object.values(O).includes(e)}function be(e){return e.startsWith("x_")}var P=["gatewayVersion","toolNamespaces","workspaceIds","installedCapabilities","enabledCapabilities","features","approvalMode","toolManifests","skillManifests","pluginManifests","mcpManifests","approvalPolicy","workspaceSummaries"];function g(e){return e?e.map(t=>({...t})):void 0}function E(e){return e?e.map(t=>({...t})):void 0}function Pe(e){return e?[...e]:void 0}function L(e){return[...new Set(e.map(t=>t.trim()).filter(Boolean))].sort((t,r)=>t.localeCompare(r))}function f(e){return{...e,toolNamespaces:[...e.toolNamespaces],workspaceIds:[...e.workspaceIds],...e.changedSections?{changedSections:[...e.changedSections]}:{},...e.installedCapabilities?{installedCapabilities:[...e.installedCapabilities]}:{},...e.enabledCapabilities?{enabledCapabilities:[...e.enabledCapabilities]}:{},...e.features?{features:[...e.features]}:{},...e.toolManifests?{toolManifests:g(e.toolManifests)}:{},...e.skillManifests?{skillManifests:g(e.skillManifests)}:{},...e.pluginManifests?{pluginManifests:g(e.pluginManifests)}:{},...e.mcpManifests?{mcpManifests:g(e.mcpManifests)}:{},...e.approvalPolicy?{approvalPolicy:{...e.approvalPolicy}}:{},...e.workspaceSummaries?{workspaceSummaries:E(e.workspaceSummaries)}:{}}}function Ee(e){let{previous:t,update:r}=e;return!(r.syncMode==="diff"&&t&&(!r.baseSnapshotVersion||t.snapshotVersion===r.baseSnapshotVersion))||!t?f(r):{...f(t),snapshotVersion:r.snapshotVersion,updatedAt:r.updatedAt,...r.gatewayVersion!==void 0?{gatewayVersion:r.gatewayVersion}:{},...r.syncMode?{syncMode:r.syncMode}:{},...r.baseSnapshotVersion?{baseSnapshotVersion:r.baseSnapshotVersion}:{},...r.changedSections?{changedSections:[...r.changedSections]}:{},...r.toolNamespaces?{toolNamespaces:[...r.toolNamespaces]}:{},...r.workspaceIds?{workspaceIds:[...r.workspaceIds]}:{},...r.installedCapabilities?{installedCapabilities:[...r.installedCapabilities]}:{},...r.enabledCapabilities?{enabledCapabilities:[...r.enabledCapabilities]}:{},...r.features?{features:[...r.features]}:{},...r.approvalMode?{approvalMode:r.approvalMode}:{},...r.toolManifests?{toolManifests:g(r.toolManifests)}:{},...r.skillManifests?{skillManifests:g(r.skillManifests)}:{},...r.pluginManifests?{pluginManifests:g(r.pluginManifests)}:{},...r.mcpManifests?{mcpManifests:g(r.mcpManifests)}:{},...r.approvalPolicy?{approvalPolicy:{...r.approvalPolicy}}:{},...r.workspaceSummaries?{workspaceSummaries:E(r.workspaceSummaries)}:{}}}function he(e){return L(e.map(t=>t.name.split(".")[0]??"").filter(Boolean))}function Te(e){return L(e.map(t=>t.id))}function ke(e){let{previous:t,current:r}=e;if(!t)return{...f(r),syncMode:"full"};if(t.snapshotVersion===r.snapshotVersion)return null;let n=P.filter(s=>JSON.stringify(t[s])!==JSON.stringify(r[s]));if(n.length===P.length)return{...f(r),syncMode:"full"};let o={snapshotVersion:r.snapshotVersion,updatedAt:r.updatedAt,syncMode:"diff",baseSnapshotVersion:t.snapshotVersion,changedSections:n,toolNamespaces:[...r.toolNamespaces],workspaceIds:[...r.workspaceIds]},p=o;for(let s of n){let i=r[s];if(i!==void 0)switch(s){case"toolNamespaces":case"workspaceIds":case"installedCapabilities":case"enabledCapabilities":case"features":p[s]=Pe(i);break;case"approvalPolicy":p[s]={...i};break;case"workspaceSummaries":p[s]=E(i);break;case"toolManifests":case"skillManifests":case"pluginManifests":case"mcpManifests":p[s]=g(i);break;default:p[s]=i;break}}return o}var _e=["web_search","web_fetch","deep_research","browser_execution"],Ce=["web-intelligence","browser-execution"],xe=["discovery","read-url","multi-source-research","interactive-browser"],ve=["stateless","render-backend","interactive-session"],Me=["stateless","stateless-single-step","stateful-session-required"],we=["required","conditional","none"],Oe=["browser-read","browser-authenticated-read","browser-state-changing"];var Ne=["read-page","read-authenticated-page","fill-form","submit-form","download-file","reuse-session"],De=["web_search","web_fetch","deep_research","blocked"],He=["requires-interaction","requires-login-state","requires-rendered-dom","requires-persistent-session","requires-state-changing-action"],Le=["none","same-capability-once","degrade-only"];var Ue=["prefetch","sync_turn","on_pre_compress","on_session_end","on_delegation","on_memory_write"],je=["turn","sidechain","compress","session-end","agent-remember","auto-extract","implicit-extract","profile-extraction","dream"],Ke=["observe-only","parent-write","deny"];var Fe=2,a={gatewayImage:"gateway.image.desktop-slim",whisperModelTiny:"speech.whisper.model.tiny",ffmpegWin32X64:"runtime.ffmpeg.win32-x64",nodeWin32X64:"runtime.node.win32-x64",dockerDesktopWin32X64:"runtime.docker-desktop.win32-x64",dockerDesktopDarwinX64:"runtime.docker-desktop.darwin-x64",dockerDesktopDarwinArm64:"runtime.docker-desktop.darwin-arm64"},y={desktopDockerBridge:"desktop.docker-bridge",desktopEmbeddedWin32X64:"desktop.embedded.win32-x64"};function j(e){return{...e,artifacts:e.artifacts.map(t=>({...t}))}}function Ve(e){return{...e,assetIds:[...e.assetIds]}}function K(){return{[y.desktopDockerBridge]:{id:y.desktopDockerBridge,title:"Desktop Docker Bridge",platform:"any",assetIds:[a.gatewayImage,a.dockerDesktopWin32X64,a.dockerDesktopDarwinX64,a.dockerDesktopDarwinArm64],description:"Docker bridge mode downloads the desktop slim gateway image on demand."},[y.desktopEmbeddedWin32X64]:{id:y.desktopEmbeddedWin32X64,title:"Desktop Embedded Win32 x64",platform:"win32-x64",assetIds:[a.nodeWin32X64,a.ffmpegWin32X64,a.whisperModelTiny],description:"Embedded desktop mode requires the bundled Node/FFmpeg runtimes and the whisper model asset."}}}function F(e,t){return e.assets[t]}function V(e,t){return e.profiles[t]}function We(e,t){let r=V(e,t);return r?r.assetIds.map(n=>F(e,n)).filter(n=>!!n):[]}function qe(e,t){return e.assets[t.id]=j(t),W(e)}function h(e){if(!e)return;let t=e.artifacts[0];if(!(!t?.url||!t.sha256||typeof t.size!="number"))return{version:e.version,sha256:t.sha256,size:t.size,url:t.url}}function W(e){let t=h(e.assets[a.gatewayImage]),r=h(e.assets[a.whisperModelTiny]);return{...e,gateway:t,whisperModel:r}}function U(e,t){if(!(typeof e.version!="string"||typeof e.url!="string"))return{...t,version:e.version,artifacts:[{fileName:e.url.split("/").pop()||`${t.id}.bin`,url:e.url,sha256:typeof e.sha256=="string"?e.sha256:void 0,size:typeof e.size=="number"?e.size:void 0}]}}function Be(e){let t=e&&typeof e=="object"?e:{},r={},n=t.assets&&typeof t.assets=="object"?t.assets:{};for(let[i,d]of Object.entries(n)){if(!d||typeof d!="object")continue;let u=d;!u.id||!Array.isArray(u.artifacts)||(r[i]=j(u))}if(!r[a.gatewayImage]&&t.gateway&&typeof t.gateway=="object"){let i=U(t.gateway,{id:a.gatewayImage,title:"XiaoZhiClaw Gateway Image (Desktop Slim)",kind:"container-image",delivery:"remote",platform:"any",description:"Desktop Docker mode gateway image."});i&&(r[i.id]=i)}if(!r[a.whisperModelTiny]&&t.whisperModel&&typeof t.whisperModel=="object"){let i=U(t.whisperModel,{id:a.whisperModelTiny,title:"Whisper Tiny Model",kind:"model",delivery:"remote",platform:"any",description:"Shared whisper.cpp tiny model asset for embedded desktop speech recognition."});i&&(r[i.id]=i)}let p={...K()},s=t.profiles&&typeof t.profiles=="object"?t.profiles:{};for(let[i,d]of Object.entries(s)){if(!d||typeof d!="object")continue;let u=d;!u.id||!Array.isArray(u.assetIds)||(p[i]=Ve(u))}return W({schemaVersion:typeof t.schemaVersion=="number"?t.schemaVersion:2,channel:typeof t.channel=="string"?t.channel:void 0,publishedAt:typeof t.publishedAt=="string"?t.publishedAt:void 0,minElectronVersion:typeof t.minElectronVersion=="string"?t.minElectronVersion:void 0,releaseNotes:typeof t.releaseNotes=="string"?t.releaseNotes:void 0,assets:r,profiles:p})}var Ge=["pending","captured","failed","restored"],Ye=["file","directory","missing"],ze=["metadata-only","workspace-copy","shadow-git"];var Xe=["api-key","oauth","token","aws-sdk"],$e=["rate_limit","auth","server_error","timeout","network","unknown"],Je=["requiresOpenAiAnthropicToolPayload"];function Qe(e,t){return!e||typeof e!="object"||Array.isArray(e)?!1:e[t]===!0}var q="openai-codex";function S(e){let t=e.trim().toLowerCase();return t==="z.ai"||t==="z-ai"?"zai":t==="opencode-zen"?"opencode":t==="kimi-code"?"kimi-coding":t==="bedrock"||t==="aws-bedrock"?"amazon-bedrock":t==="bytedance"||t==="doubao"?"volcengine":t}function B(e){let t=S(e);return t==="volcengine-plan"?"volcengine":t==="qwen-coding"?"qwen":t==="byteplus-plan"?"byteplus":t}var Ze=B,et={anthropicToolSchemaMode:"native",anthropicToolChoiceMode:"native",providerFamily:"default",preserveAnthropicThinkingSignatures:!0,openAiCompatTurnValidation:!0,providerThoughtSignatureSanitization:!1,transcriptToolCallIdMode:"default",transcriptToolCallIdModelHints:[],providerThoughtSignatureModelHints:[],dropThinkingBlockModelHints:[]},tt={anthropic:{providerFamily:"anthropic"},"amazon-bedrock":{providerFamily:"anthropic"},"kimi-coding":{anthropicToolSchemaMode:"openai-functions",anthropicToolChoiceMode:"openai-string-modes",preserveAnthropicThinkingSignatures:!1},mistral:{transcriptToolCallIdMode:"strict9",transcriptToolCallIdModelHints:["mistral","mixtral","codestral","pixtral","devstral","ministral","mistralai"]},openai:{providerFamily:"openai"},[q]:{providerFamily:"openai"},openrouter:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},opencode:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},kilocode:{providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]}};function T(e,t){let r=(e??"").toLowerCase();return!!r&&t.some(n=>r.includes(n))}function c(e){let t=S(e??"");return{...et,...tt[t]}}function rt(e){return c(e).preserveAnthropicThinkingSignatures}function nt(e){let t=c(e);return t.anthropicToolSchemaMode!=="native"||t.anthropicToolChoiceMode!=="native"}function it(e){return c(e).anthropicToolSchemaMode==="openai-functions"}function ot(e){return c(e).anthropicToolChoiceMode==="openai-string-modes"}function st(e){return c(e).openAiCompatTurnValidation}function at(e){return c(e).providerFamily==="openai"}function dt(e){return c(e).providerFamily==="anthropic"}function pt(e){return T(e.modelId,c(e.provider).dropThinkingBlockModelHints)}function ct(e){let t=c(e.provider);return t.providerThoughtSignatureSanitization&&T(e.modelId,t.providerThoughtSignatureModelHints)}function lt(e,t){let r=c(e),n=r.transcriptToolCallIdMode;if(n==="strict9")return n;if(T(t,r.transcriptToolCallIdModelHints))return"strict9"}var k={anthropic:["ANTHROPIC_OAUTH_TOKEN","ANTHROPIC_API_KEY"],chutes:["CHUTES_OAUTH_TOKEN","CHUTES_API_KEY"],zai:["ZAI_API_KEY","Z_AI_API_KEY"],opencode:["OPENCODE_API_KEY","OPENCODE_ZEN_API_KEY"],qwen:["DASHSCOPE_API_KEY","QWEN_API_KEY"],"qwen-coding":["DASHSCOPE_API_KEY","QWEN_API_KEY"],volcengine:["VOLCANO_ENGINE_API_KEY","ARK_API_KEY","DOUBAO_API_KEY"],"volcengine-plan":["VOLCANO_ENGINE_API_KEY","ARK_API_KEY","DOUBAO_API_KEY"],byteplus:["BYTEPLUS_API_KEY"],"byteplus-plan":["BYTEPLUS_API_KEY"],"kimi-coding":["KIMI_API_KEY","KIMICODE_API_KEY"],huggingface:["HUGGINGFACE_HUB_TOKEN","HF_TOKEN"],openai:["OPENAI_API_KEY"],voyage:["VOYAGE_API_KEY"],groq:["GROQ_API_KEY"],deepgram:["DEEPGRAM_API_KEY"],cerebras:["CEREBRAS_API_KEY"],xai:["XAI_API_KEY"],openrouter:["OPENROUTER_API_KEY"],litellm:["LITELLM_API_KEY"],"vercel-ai-gateway":["AI_GATEWAY_API_KEY"],"cloudflare-ai-gateway":["CLOUDFLARE_AI_GATEWAY_API_KEY"],moonshot:["MOONSHOT_API_KEY"],minimax:["MINIMAX_API_KEY"],"minimax-cn":["MINIMAX_CN_API_KEY","MINIMAX_API_KEY"],nvidia:["NVIDIA_API_KEY"],xiaomi:["XIAOMI_API_KEY"],synthetic:["SYNTHETIC_API_KEY"],venice:["VENICE_API_KEY"],mistral:["MISTRAL_API_KEY"],together:["TOGETHER_API_KEY"],qianfan:["QIANFAN_API_KEY"],ollama:["OLLAMA_API_KEY"],vllm:["VLLM_API_KEY"],kilocode:["KILOCODE_API_KEY"]};function ut(){return[...new Set(Object.values(k).flat())]}function gt(e){let t=S(e.provider),r=e.env??process.env,n=new Set(e.appliedEnvKeys??[]),o=i=>{let d=r[i]?.trim();if(!d)return null;let u=n.has(i)?`shell env: ${i}`:`env: ${i}`;return{apiKey:d,source:u}},p=e.resolveSpecialApiKey?.(t,r,n);if(p)return p;let s=k[t];if(!s||s.length===0)return null;for(let i of s){let d=o(i);if(d)return d}return null}export{Ae as ACP_EXTENDED_METHODS,Se as ACP_EXTENDED_SESSION_UPDATE_TYPES,ye as ACP_METHODS,fe as ACP_PROTOCOL_VERSION,O as ACP_SESSION_UPDATE_TYPES,z as AGENT_RPC_APPROVAL_METHODS,l as AGENT_RPC_ERROR_CODES,Y as AGENT_RPC_PROTOCOL_VERSION,b as AGENT_TEAM_WS_EVENT_NAMES,I as AGENT_WS_EVENT_NAMES,w as ALL_AGENT_WS_EVENT_NAMES,P as CAPABILITY_MANIFEST_DIFF_SECTIONS,re as GATEWAY_RPC_METHODS,R as GatewayRpcContract,Ue as MEMORY_OBSERVATION_HOOK_VALUES,je as MEMORY_OBSERVATION_SOURCE_VALUES,Ke as MEMORY_WRITE_ACCESS_VALUES,ze as MUTATION_CHECKPOINT_BACKEND_VALUES,Ye as MUTATION_CHECKPOINT_ENTRY_KIND_VALUES,Ge as MUTATION_CHECKPOINT_PHASE_VALUES,G as PETDEX_ANIMATION_IDS,Xe as PROVIDER_RUNTIME_AUTH_MODE_VALUES,Je as PROVIDER_RUNTIME_COMPAT_FLAG_VALUES,k as PROVIDER_RUNTIME_ENV_API_KEY_CANDIDATES,q as PROVIDER_RUNTIME_OPENAI_CODEX_PROVIDER_ID,$e as PROVIDER_RUNTIME_VAULT_ERROR_TYPE_VALUES,Fe as RESOURCE_MANIFEST_SCHEMA_VERSION,a as RUNTIME_ASSET_IDS,y as RUNTIME_PROFILE_IDS,Ne as WEB_ACTION_SCOPE_VALUES,we as WEB_APPROVAL_DEFAULT_VALUES,Ce as WEB_CAPABILITY_FAMILY_VALUES,_e as WEB_CAPABILITY_ID_VALUES,De as WEB_DEGRADATION_TARGET_VALUES,He as WEB_ESCALATION_REASON_VALUES,ve as WEB_EXECUTION_MODE_VALUES,Oe as WEB_POLICY_RISK_CLASS_VALUES,Le as WEB_RETRY_POLICY_VALUES,Me as WEB_STATEFULNESS_VALUES,xe as WEB_TASK_MODE_VALUES,te as buildAgentRpcMeta,A as classifyGatewayRpcMethod,f as cloneCapabilityManifestSnapshot,ke as createCapabilityManifestDiffPayload,K as createDefaultRuntimeResourceProfiles,he as deriveCapabilityToolNamespaces,Te as deriveCapabilityWorkspaceIds,h as getManifestShortcutEntry,F as getRuntimeResourceAsset,V as getRuntimeResourceProfile,We as getRuntimeResourceProfileAssets,D as isAcpJsonRpcNotification,N as isAcpJsonRpcRequest,H as isAcpJsonRpcResponse,x as isAgentRpcNotification,_ as isAgentRpcRequest,C as isAgentRpcResponse,dt as isAnthropicProviderRuntimeFamily,be as isExtendedSessionUpdateType,at as isOpenAiProviderRuntimeFamily,Ie as isStandardSessionUpdateType,ut as listProviderRuntimeEnvApiKeyNames,Ee as mergeCapabilityManifestSnapshot,S as normalizeProviderRuntimeId,B as normalizeProviderRuntimeIdForAuth,Be as normalizeRuntimeResourceManifest,Re as parseAcpMessage,X as parseAgentRpcMessage,rt as preservesProviderRuntimeAnthropicThinkingSignatures,Qe as readProviderRuntimeCompatFlag,M as requireGatewayRpcMeta,v as requiresIdempotencyKey,nt as requiresOpenAiCompatibleAnthropicToolPayloadForProviderRuntime,c as resolveProviderRuntimeCapabilities,gt as resolveProviderRuntimeEnvApiKey,Ze as resolveProviderRuntimeKeyFamily,lt as resolveProviderRuntimeTranscriptToolCallIdMode,pt as shouldDropThinkingBlocksForProviderRuntimeModel,ct as shouldSanitizeProviderRuntimeThoughtSignaturesForModel,st as supportsOpenAiCompatTurnValidationForProviderRuntime,qe as upsertRuntimeResourceAsset,it as usesOpenAiFunctionAnthropicToolSchemaForProviderRuntime,ot as usesOpenAiStringModeAnthropicToolChoiceForProviderRuntime};
|
|
1
|
+
var Y=["idle","running-right","running-left","waving","jumping","failed","waiting","running","review"];var G="1.0.0",l={PARSE_ERROR:-32700,INVALID_REQUEST:-32600,METHOD_NOT_FOUND:-32601,INVALID_PARAMS:-32602,INTERNAL_ERROR:-32603,TURN_ABORTED:-32e3,TURN_TIMEOUT:-32001,LLM_ERROR:-32010,LLM_AUTH_ERROR:-32011,LLM_RATE_LIMIT:-32012,LLM_QUOTA_EXHAUSTED:-32013,LLM_MODEL_NOT_FOUND:-32014,TOOL_INVOKE_FAILED:-32020,TOOL_TIMEOUT:-32021,PROTOCOL_MISMATCH:-32030,REQUEST_DEADLINE_EXCEEDED:-32040,REQUEST_CANCELLED:-32041,REQUEST_DEDUPED:-32042,REQUEST_IDEMPOTENCY_REQUIRED:-32043},z={REQUEST:"tool.approval.request"};function _(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&typeof t.method=="string"&&t.method.length>0}function C(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&(typeof t.id=="string"||typeof t.id=="number")&&!("method"in t)}function x(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&typeof t.method=="string"&&!("id"in t)}function X(e){let t;try{t=JSON.parse(e)}catch{return null}return C(t)||_(t)||x(t)?t:null}import{randomUUID as $}from"node:crypto";var J=["settings.list","settings.get","settings.validate","provider.list","tools.list","todos.list","tasks.list","session.list","session.get","session.resolve","session.loadNativeTranscript","thread.list","project.list","files.list","files.gitStatus","instructions.list","instructions.read","skills.list","skills.stats","memory.atlas","memory.activity","memory.list","memory.read","memory.search","media.listModels","media.status","pet.status","agent.health","agent.metrics"],Q=new Set(["memory.dream","memory.propose","memory.consolidate","media.stt","pet.forge","pet.asset.import","solo.start","solo.evaluate","product.plan","product.create","product.message"]),Z=["memory.","pet.","usage."],ee=new Set(["memory.atlas","memory.activity","memory.list","memory.read","memory.search","memory.attachment.locate","memory.attachment.adopt","pet.status"]);function A(e){return Q.has(e)?{channel:"task",mutability:"write",defaultTimeoutMs:12e4}:J.some(t=>e===t||e.startsWith(`${t}.`)||e.startsWith(t))?{channel:"query",mutability:"read",defaultTimeoutMs:1e4}:{channel:"task",mutability:"write",defaultTimeoutMs:3e4}}function v(e){return ee.has(e)||A(e).mutability==="read"?!1:Z.some(t=>e.startsWith(t))}function te(e,t={}){let r=t.now??Date.now(),n=A(e),o=t.timeoutMs??n.defaultTimeoutMs;return{requestId:t.requestId??$(),createdAt:r,deadlineAt:r+o,channel:t.channel??n.channel,idempotencyKey:t.idempotencyKey,traceId:t.traceId}}function M(e,t=Date.now()){let r=e.meta;if(!r||typeof r!="object")return{ok:!1,error:{code:l.INVALID_REQUEST,message:"RPC request meta is required."}};if(typeof r.requestId!="string"||r.requestId.length===0)return{ok:!1,error:{code:l.INVALID_REQUEST,message:"RPC request meta.requestId is required."}};if(r.channel!=="query"&&r.channel!=="task")return{ok:!1,error:{code:l.INVALID_REQUEST,message:"RPC request meta.channel must be query or task."}};if(typeof r.createdAt!="number"||!Number.isFinite(r.createdAt))return{ok:!1,error:{code:l.INVALID_REQUEST,message:"RPC request meta.createdAt is required."}};if(typeof r.deadlineAt!="number"||!Number.isFinite(r.deadlineAt))return{ok:!1,error:{code:l.INVALID_REQUEST,message:"RPC request meta.deadlineAt is required."}};if(r.deadlineAt<=t)return{ok:!1,error:{code:l.REQUEST_DEADLINE_EXCEEDED,message:"RPC request deadline has already expired."}};let n=A(e.method).channel;return r.channel!==n?{ok:!1,error:{code:l.INVALID_REQUEST,message:`RPC request channel mismatch: expected ${n}, got ${r.channel}.`}}:v(e.method)&&(typeof r.idempotencyKey!="string"||r.idempotencyKey.length===0)?{ok:!1,error:{code:l.REQUEST_IDEMPOTENCY_REQUIRED,message:`RPC method ${e.method} requires meta.idempotencyKey.`}}:{ok:!0,meta:r}}var R=class{now;active=new Map;idempotency=new Map;counters={completedRequests:0,cancelledRequests:0,deadlineExceededRequests:0,dedupedRequests:0,lateResponsesDropped:0,invalidRequests:0};constructor(t={}){this.now=t.now??(()=>Date.now())}begin(t,r){let n=M({method:t,meta:r},this.now());if(!n.ok)return this.counters.invalidRequests+=1,{status:"rejected",error:n.error};if(r.idempotencyKey){let o=this.idempotency.get(r.idempotencyKey);if(o)return this.counters.dedupedRequests+=1,o.error?{status:"deduped",error:o.error}:{status:"deduped",result:o.result}}return this.active.set(r.requestId,{method:t,meta:r,cancelled:!1,startedAt:this.now()}),{status:"started"}}cancel(t,r="cancelled"){let n=this.active.get(t);return!n||n.cancelled?!1:(n.cancelled=!0,n.cancelReason=r,this.counters.cancelledRequests+=1,!0)}expire(t){return this.active.get(t)?(this.active.delete(t),this.counters.deadlineExceededRequests+=1,!0):!1}settle(t,r,n){let o=this.active.get(t);return o?(this.active.delete(t),o.cancelled?(this.counters.lateResponsesDropped+=1,{accepted:!1,reason:"cancelled"}):o.meta.deadlineAt<=this.now()?(this.counters.deadlineExceededRequests+=1,this.counters.lateResponsesDropped+=1,{accepted:!1,reason:"deadline_exceeded"}):(this.counters.completedRequests+=1,o.meta.idempotencyKey&&this.idempotency.set(o.meta.idempotencyKey,{result:r,error:n,settledAt:this.now()}),{accepted:!0})):{accepted:!1,reason:"unknown"}}metrics(){return{activeRequests:this.active.size,...this.counters}}};var re=["agent.health","agent.metrics","agent.cancel","provider.catalog","provider.list","provider.get","provider.install","provider.install.cancel","provider.update","provider.uninstall","provider.enable","provider.disable","provider.diagnose","provider.auth.status","provider.auth.setPreference","provider.auth.setUserKey","provider.auth.methods","provider.auth.start","provider.auth.attach","provider.auth.input","provider.auth.resize","provider.auth.cancel","provider.auth.logout","provider.models.list","provider.nativeSessions.list","provider.nativeSessions.load","provider.nativeSessions.resume","delegation.cancel","delegation.reset","session.list","session.get","session.create","session.update","session.delete","session.deleteAll","session.archive","session.loadNativeTranscript","session.adoptNative","session.moveToProject","session.getState","session.switchProject","session.getMessages","project.list","project.create","project.detach","project.delete","project.rename","project.archive","project.unarchive","project.update","instructions.list","instructions.read","instructions.write","instructions.delete","files.list","files.read","files.create","files.rename","files.move","files.copy","files.delete","files.search","files.undoOperation","files.gitStatus","turnBaseline.getSummary","turnBaseline.getFileDiff","turnBaseline.listRecent","turnBaseline.getFileBaseline","workingMaterials.get","workingMaterials.replace","workingMaterials.upsert","workingMaterials.remove","workingMaterials.reorder","skills.list","memory.list-files","memory.atlas","memory.activity","memory.propose","memory.consolidate","memory.update","memory.attachment.adopt","memory.attachment.locate"];var I=["turn.start","turn.delta","turn.end","turn.error","turn.recovery","turn.file_changes","turn.tool_call","turn.tool_result","turn.tool_blocked","turn.reasoning_delta","turn.approval_request","turn.skill_instruction","turn.ask_user","turn.media_result","turn.media_progress","turn.media_usage","turn.media_capability_check","turn.plan_update","turn.suggestions","turn.sidechain_started","turn.subagent_started","turn.subagent_delta","turn.subagent_ended","turn.sidechain_completed","turn.task_updated","turn.todos_updated","turn.exec_progress","turn.progress","turn.tool_use_summary","turn.tool_selection_policy","turn.lifecycle","turn.document_maintenance","turn.artifact_contract","turn.usage_update","team.member.notification","session.info","session.recovery_pending","memory.updated","skills.updated","turn.memory_recall","turn.memory_written","pet.soul_ready","pet.reaction","pet.growth","pet.state","pet.confirm","pet.asset.updated","system.activity","workflow.created","workflow.updated","workflow.deleted","workflow.runStarted","workflow.runCompleted","workflow.runFailed","workflow.nodeStatus","workflow.triggerDropped","workflow.alert","workflow.approvalRequested","workflow.approvalTimedOut"],b=["solo.progress","solo.specProgress","solo.agentDelta","solo.agentActivity","solo.agentUsage","solo.evaluation","product.taskStarted","product.taskOutput","product.members","product.agentActivity","product.taskCompleted","product.taskFailed","product.budgetUpdate","product.budgetWarning","product.checkpointed","product.completed","product.dagTopology","plan.interrupted","product.planReady","product.planningDelta","product.leaderMessage","product.planFailed","product.planningAsk","goal.run_state_changed","goal.phase_boundary","goal.goal_edited","goal.message_queued","goal.acceptance_updated","goal.round_message","mention.delegate_started","mention.delegate_activity","mention.delegate_settled"],ne=[...I,...b],w=ne;import{createHash as kt}from"node:crypto";import{resolve as Ct}from"node:path";var m={request:"x/delegate",update:"x/delegate.update",respond:"x/delegate.respond",cancel:"x/delegate.cancel"},ie=["search","addText","embedText","ingestExtracted","proposeExtracted","consumePendingProposals","feedback","findRelatedEvents","synthesizeTimeline","getActivitySummary","getAllProfiles","setProfile","getAtlas","setMemoryArchived","triggerDecay","resolveConflicts"],oe=["initialize","getIndex","addToIndex","replaceInIndex","removeFromIndex","createFile","writeFile","readFile","deleteFile","listFiles","searchLocal"],se=["getSkillSnapshot","readSkillFile","recordSkillInvocation","commitSkillMutation","applyCuratorPlan","prepareSkillInstall","finalizeSkillInstall"],ae=["loadForResume","appendTranscript","updateTitle","saveState","saveTaskSummary","groupSplit"],de=["commitTurnTelemetry","listDistillableFeedback","markFeedbackDistilled","runUploadSweep"],pe=["getSnapshot","create","switch","update"],Lt=1024*1024,ce=["list","get","diagnose"],le=["navigate","snapshot","click","type","screenshot","console","network"];var ue=["open","recordEvent","checkpoint","get","list","delete","getCheckpoint","listCheckpoints","restoreCheckpoint"],ge=["isActive","getSoul","awardXp","journeyCatchUp"],me=["getTunables","updateTunable","clearTunable","appendDirectoryAllowRule"];var jt=new Set(ie),Ut=new Set(oe),Kt=new Set(me),Ft=new Set(se),Vt=new Set(ae),Wt=new Set(de),qt=new Set(pe),Bt=new Set(ue),Yt=new Set(ge),Gt=new Set(ce),zt=new Set(le);var fe=1,ye={INITIALIZE:"initialize",SESSION_NEW:"session/new",SESSION_PROMPT:"session/prompt",SESSION_CLOSE:"session/close",SESSION_SET_CONFIG:"session/set_config_option",SESSION_SET_MODEL:"session/set_model",SESSION_SET_MODE:"session/set_mode",SESSION_LOAD:"session/load",SESSION_CANCEL:"session/cancel",SESSION_UPDATE:"session/update",SESSION_REQUEST_PERMISSION:"session/request_permission",FS_READ_TEXT_FILE:"fs/read_text_file",FS_WRITE_TEXT_FILE:"fs/write_text_file"},Ae={ABORT:"x/abort",DREAM:"x/dream",SOLO_START:"x/solo.start",SOLO_STATUS:"x/solo.status",SOLO_SELECT:"x/solo.select",SOLO_CANCEL:"x/solo.cancel",PRODUCT_CREATE:"x/product.create",PRODUCT_PLAN:"x/product.plan",PRODUCT_CONFIRM:"x/product.confirm",PRODUCT_MESSAGE:"x/product.message",PRODUCT_RESUME:"x/product.resume",PRODUCT_PAUSE:"x/product.pause",PRODUCT_CANCEL:"x/product.cancel",PRODUCT_ROLLBACK:"x/product.rollback",PRODUCT_REPLAY:"x/product.replay",PRODUCT_STATUS:"x/product.status",SOLO_SUBSCRIBE:"x/solo.subscribe",SOLO_MESSAGE:"x/solo.message",SOLO_EVALUATE:"x/solo.evaluate",SOLO_SPEC_CHAT:"x/solo.specChat",SOLO_SPEC_JUDGE:"x/solo.specJudge",WORKFLOW_CHAT:"x/workflow.chat",WORKFLOW_MATCH_INTENT:"x/workflow.matchIntent",PRODUCT_SUBSCRIBE:"x/product.subscribe",GOAL_START:"x/goal.start",GOAL_STATUS:"x/goal.status",GOAL_PAUSE:"x/goal.pause",GOAL_RESUME:"x/goal.resume",GOAL_UPDATE_GOAL:"x/goal.updateGoal",GOAL_STOP:"x/goal.stop",GOAL_MESSAGE:"x/goal.message",GOAL_SUBSCRIBE:"x/goal.subscribe",GOAL_EVENTS:"x/goal.events",DELEGATE:m.request,DELEGATE_UPDATE:m.update,DELEGATE_RESPOND:m.respond,DELEGATE_CANCEL:m.cancel},O={USER_MESSAGE_CHUNK:"user_message_chunk",AGENT_MESSAGE_CHUNK:"agent_message_chunk",AGENT_THOUGHT_CHUNK:"agent_thought_chunk",TOOL_CALL:"tool_call",TOOL_CALL_UPDATE:"tool_call_update",PLAN:"plan",USAGE_UPDATE:"usage_update",CONFIG_OPTION_UPDATE:"config_option_update",SESSION_INFO_UPDATE:"session_info_update",AVAILABLE_COMMANDS_UPDATE:"available_commands_update",CURRENT_MODE_UPDATE:"current_mode_update"},Se={X_SKILL_INSTRUCTION:"x_skill_instruction",X_SESSION_INFO:"x_session_info",X_RELAY:"x_relay"};function N(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&typeof t.method=="string"&&"id"in t}function D(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&typeof t.method=="string"&&!("id"in t)}function H(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&"id"in t&&!("method"in t)}function Re(e){let t;try{t=JSON.parse(e)}catch{return null}return H(t)||N(t)||D(t)?t:null}function Ie(e){return Object.values(O).includes(e)}function be(e){return e.startsWith("x_")}var P=["gatewayVersion","toolNamespaces","workspaceIds","installedCapabilities","enabledCapabilities","features","approvalMode","toolManifests","skillManifests","pluginManifests","mcpManifests","approvalPolicy","workspaceSummaries"];function g(e){return e?e.map(t=>({...t})):void 0}function E(e){return e?e.map(t=>({...t})):void 0}function Pe(e){return e?[...e]:void 0}function L(e){return[...new Set(e.map(t=>t.trim()).filter(Boolean))].sort((t,r)=>t.localeCompare(r))}function f(e){return{...e,toolNamespaces:[...e.toolNamespaces],workspaceIds:[...e.workspaceIds],...e.changedSections?{changedSections:[...e.changedSections]}:{},...e.installedCapabilities?{installedCapabilities:[...e.installedCapabilities]}:{},...e.enabledCapabilities?{enabledCapabilities:[...e.enabledCapabilities]}:{},...e.features?{features:[...e.features]}:{},...e.toolManifests?{toolManifests:g(e.toolManifests)}:{},...e.skillManifests?{skillManifests:g(e.skillManifests)}:{},...e.pluginManifests?{pluginManifests:g(e.pluginManifests)}:{},...e.mcpManifests?{mcpManifests:g(e.mcpManifests)}:{},...e.approvalPolicy?{approvalPolicy:{...e.approvalPolicy}}:{},...e.workspaceSummaries?{workspaceSummaries:E(e.workspaceSummaries)}:{}}}function Ee(e){let{previous:t,update:r}=e;return!(r.syncMode==="diff"&&t&&(!r.baseSnapshotVersion||t.snapshotVersion===r.baseSnapshotVersion))||!t?f(r):{...f(t),snapshotVersion:r.snapshotVersion,updatedAt:r.updatedAt,...r.gatewayVersion!==void 0?{gatewayVersion:r.gatewayVersion}:{},...r.syncMode?{syncMode:r.syncMode}:{},...r.baseSnapshotVersion?{baseSnapshotVersion:r.baseSnapshotVersion}:{},...r.changedSections?{changedSections:[...r.changedSections]}:{},...r.toolNamespaces?{toolNamespaces:[...r.toolNamespaces]}:{},...r.workspaceIds?{workspaceIds:[...r.workspaceIds]}:{},...r.installedCapabilities?{installedCapabilities:[...r.installedCapabilities]}:{},...r.enabledCapabilities?{enabledCapabilities:[...r.enabledCapabilities]}:{},...r.features?{features:[...r.features]}:{},...r.approvalMode?{approvalMode:r.approvalMode}:{},...r.toolManifests?{toolManifests:g(r.toolManifests)}:{},...r.skillManifests?{skillManifests:g(r.skillManifests)}:{},...r.pluginManifests?{pluginManifests:g(r.pluginManifests)}:{},...r.mcpManifests?{mcpManifests:g(r.mcpManifests)}:{},...r.approvalPolicy?{approvalPolicy:{...r.approvalPolicy}}:{},...r.workspaceSummaries?{workspaceSummaries:E(r.workspaceSummaries)}:{}}}function he(e){return L(e.map(t=>t.name.split(".")[0]??"").filter(Boolean))}function Te(e){return L(e.map(t=>t.id))}function ke(e){let{previous:t,current:r}=e;if(!t)return{...f(r),syncMode:"full"};if(t.snapshotVersion===r.snapshotVersion)return null;let n=P.filter(s=>JSON.stringify(t[s])!==JSON.stringify(r[s]));if(n.length===P.length)return{...f(r),syncMode:"full"};let o={snapshotVersion:r.snapshotVersion,updatedAt:r.updatedAt,syncMode:"diff",baseSnapshotVersion:t.snapshotVersion,changedSections:n,toolNamespaces:[...r.toolNamespaces],workspaceIds:[...r.workspaceIds]},p=o;for(let s of n){let i=r[s];if(i!==void 0)switch(s){case"toolNamespaces":case"workspaceIds":case"installedCapabilities":case"enabledCapabilities":case"features":p[s]=Pe(i);break;case"approvalPolicy":p[s]={...i};break;case"workspaceSummaries":p[s]=E(i);break;case"toolManifests":case"skillManifests":case"pluginManifests":case"mcpManifests":p[s]=g(i);break;default:p[s]=i;break}}return o}var _e=["web_search","web_fetch","deep_research","browser_execution"],Ce=["web-intelligence","browser-execution"],xe=["discovery","read-url","multi-source-research","interactive-browser"],ve=["stateless","render-backend","interactive-session"],Me=["stateless","stateless-single-step","stateful-session-required"],we=["required","conditional","none"],Oe=["browser-read","browser-authenticated-read","browser-state-changing"];var Ne=["read-page","read-authenticated-page","fill-form","submit-form","download-file","reuse-session"],De=["web_search","web_fetch","deep_research","blocked"],He=["requires-interaction","requires-login-state","requires-rendered-dom","requires-persistent-session","requires-state-changing-action"],Le=["none","same-capability-once","degrade-only"];var je=["prefetch","sync_turn","on_pre_compress","on_session_end","on_delegation","on_memory_write"],Ue=["turn","sidechain","compress","session-end","agent-remember","auto-extract","implicit-extract","profile-extraction","dream"],Ke=["observe-only","parent-write","deny"];var Fe=2,a={gatewayImage:"gateway.image.desktop-slim",whisperModelTiny:"speech.whisper.model.tiny",ffmpegWin32X64:"runtime.ffmpeg.win32-x64",nodeWin32X64:"runtime.node.win32-x64",dockerDesktopWin32X64:"runtime.docker-desktop.win32-x64",dockerDesktopDarwinX64:"runtime.docker-desktop.darwin-x64",dockerDesktopDarwinArm64:"runtime.docker-desktop.darwin-arm64"},y={desktopDockerBridge:"desktop.docker-bridge",desktopEmbeddedWin32X64:"desktop.embedded.win32-x64"};function U(e){return{...e,artifacts:e.artifacts.map(t=>({...t}))}}function Ve(e){return{...e,assetIds:[...e.assetIds]}}function K(){return{[y.desktopDockerBridge]:{id:y.desktopDockerBridge,title:"Desktop Docker Bridge",platform:"any",assetIds:[a.gatewayImage,a.dockerDesktopWin32X64,a.dockerDesktopDarwinX64,a.dockerDesktopDarwinArm64],description:"Docker bridge mode downloads the desktop slim gateway image on demand."},[y.desktopEmbeddedWin32X64]:{id:y.desktopEmbeddedWin32X64,title:"Desktop Embedded Win32 x64",platform:"win32-x64",assetIds:[a.nodeWin32X64,a.ffmpegWin32X64,a.whisperModelTiny],description:"Embedded desktop mode requires the bundled Node/FFmpeg runtimes and the whisper model asset."}}}function F(e,t){return e.assets[t]}function V(e,t){return e.profiles[t]}function We(e,t){let r=V(e,t);return r?r.assetIds.map(n=>F(e,n)).filter(n=>!!n):[]}function qe(e,t){return e.assets[t.id]=U(t),W(e)}function h(e){if(!e)return;let t=e.artifacts[0];if(!(!t?.url||!t.sha256||typeof t.size!="number"))return{version:e.version,sha256:t.sha256,size:t.size,url:t.url}}function W(e){let t=h(e.assets[a.gatewayImage]),r=h(e.assets[a.whisperModelTiny]);return{...e,gateway:t,whisperModel:r}}function j(e,t){if(!(typeof e.version!="string"||typeof e.url!="string"))return{...t,version:e.version,artifacts:[{fileName:e.url.split("/").pop()||`${t.id}.bin`,url:e.url,sha256:typeof e.sha256=="string"?e.sha256:void 0,size:typeof e.size=="number"?e.size:void 0}]}}function Be(e){let t=e&&typeof e=="object"?e:{},r={},n=t.assets&&typeof t.assets=="object"?t.assets:{};for(let[i,d]of Object.entries(n)){if(!d||typeof d!="object")continue;let u=d;!u.id||!Array.isArray(u.artifacts)||(r[i]=U(u))}if(!r[a.gatewayImage]&&t.gateway&&typeof t.gateway=="object"){let i=j(t.gateway,{id:a.gatewayImage,title:"XiaoZhiClaw Gateway Image (Desktop Slim)",kind:"container-image",delivery:"remote",platform:"any",description:"Desktop Docker mode gateway image."});i&&(r[i.id]=i)}if(!r[a.whisperModelTiny]&&t.whisperModel&&typeof t.whisperModel=="object"){let i=j(t.whisperModel,{id:a.whisperModelTiny,title:"Whisper Tiny Model",kind:"model",delivery:"remote",platform:"any",description:"Shared whisper.cpp tiny model asset for embedded desktop speech recognition."});i&&(r[i.id]=i)}let p={...K()},s=t.profiles&&typeof t.profiles=="object"?t.profiles:{};for(let[i,d]of Object.entries(s)){if(!d||typeof d!="object")continue;let u=d;!u.id||!Array.isArray(u.assetIds)||(p[i]=Ve(u))}return W({schemaVersion:typeof t.schemaVersion=="number"?t.schemaVersion:2,channel:typeof t.channel=="string"?t.channel:void 0,publishedAt:typeof t.publishedAt=="string"?t.publishedAt:void 0,minElectronVersion:typeof t.minElectronVersion=="string"?t.minElectronVersion:void 0,releaseNotes:typeof t.releaseNotes=="string"?t.releaseNotes:void 0,assets:r,profiles:p})}var Ye=["pending","captured","failed","restored"],Ge=["file","directory","missing"],ze=["metadata-only","workspace-copy","shadow-git"];var Xe=["api-key","oauth","token","aws-sdk"],$e=["rate_limit","auth","server_error","timeout","network","unknown"],Je=["requiresOpenAiAnthropicToolPayload"];function Qe(e,t){return!e||typeof e!="object"||Array.isArray(e)?!1:e[t]===!0}var q="openai-codex";function S(e){let t=e.trim().toLowerCase();return t==="z.ai"||t==="z-ai"?"zai":t==="opencode-zen"?"opencode":t==="kimi-code"?"kimi-coding":t==="bedrock"||t==="aws-bedrock"?"amazon-bedrock":t==="bytedance"||t==="doubao"?"volcengine":t}function B(e){let t=S(e);return t==="volcengine-plan"?"volcengine":t==="qwen-coding"?"qwen":t==="byteplus-plan"?"byteplus":t}var Ze=B,et={anthropicToolSchemaMode:"native",anthropicToolChoiceMode:"native",providerFamily:"default",preserveAnthropicThinkingSignatures:!0,openAiCompatTurnValidation:!0,providerThoughtSignatureSanitization:!1,transcriptToolCallIdMode:"default",transcriptToolCallIdModelHints:[],providerThoughtSignatureModelHints:[],dropThinkingBlockModelHints:[]},tt={anthropic:{providerFamily:"anthropic"},"amazon-bedrock":{providerFamily:"anthropic"},"kimi-coding":{anthropicToolSchemaMode:"openai-functions",anthropicToolChoiceMode:"openai-string-modes",preserveAnthropicThinkingSignatures:!1},mistral:{transcriptToolCallIdMode:"strict9",transcriptToolCallIdModelHints:["mistral","mixtral","codestral","pixtral","devstral","ministral","mistralai"]},openai:{providerFamily:"openai"},[q]:{providerFamily:"openai"},openrouter:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},opencode:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},kilocode:{providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]}};function T(e,t){let r=(e??"").toLowerCase();return!!r&&t.some(n=>r.includes(n))}function c(e){let t=S(e??"");return{...et,...tt[t]}}function rt(e){return c(e).preserveAnthropicThinkingSignatures}function nt(e){let t=c(e);return t.anthropicToolSchemaMode!=="native"||t.anthropicToolChoiceMode!=="native"}function it(e){return c(e).anthropicToolSchemaMode==="openai-functions"}function ot(e){return c(e).anthropicToolChoiceMode==="openai-string-modes"}function st(e){return c(e).openAiCompatTurnValidation}function at(e){return c(e).providerFamily==="openai"}function dt(e){return c(e).providerFamily==="anthropic"}function pt(e){return T(e.modelId,c(e.provider).dropThinkingBlockModelHints)}function ct(e){let t=c(e.provider);return t.providerThoughtSignatureSanitization&&T(e.modelId,t.providerThoughtSignatureModelHints)}function lt(e,t){let r=c(e),n=r.transcriptToolCallIdMode;if(n==="strict9")return n;if(T(t,r.transcriptToolCallIdModelHints))return"strict9"}var k={anthropic:["ANTHROPIC_OAUTH_TOKEN","ANTHROPIC_API_KEY"],chutes:["CHUTES_OAUTH_TOKEN","CHUTES_API_KEY"],zai:["ZAI_API_KEY","Z_AI_API_KEY"],opencode:["OPENCODE_API_KEY","OPENCODE_ZEN_API_KEY"],qwen:["DASHSCOPE_API_KEY","QWEN_API_KEY"],"qwen-coding":["DASHSCOPE_API_KEY","QWEN_API_KEY"],volcengine:["VOLCANO_ENGINE_API_KEY","ARK_API_KEY","DOUBAO_API_KEY"],"volcengine-plan":["VOLCANO_ENGINE_API_KEY","ARK_API_KEY","DOUBAO_API_KEY"],byteplus:["BYTEPLUS_API_KEY"],"byteplus-plan":["BYTEPLUS_API_KEY"],"kimi-coding":["KIMI_API_KEY","KIMICODE_API_KEY"],huggingface:["HUGGINGFACE_HUB_TOKEN","HF_TOKEN"],openai:["OPENAI_API_KEY"],voyage:["VOYAGE_API_KEY"],groq:["GROQ_API_KEY"],deepgram:["DEEPGRAM_API_KEY"],cerebras:["CEREBRAS_API_KEY"],xai:["XAI_API_KEY"],openrouter:["OPENROUTER_API_KEY"],litellm:["LITELLM_API_KEY"],"vercel-ai-gateway":["AI_GATEWAY_API_KEY"],"cloudflare-ai-gateway":["CLOUDFLARE_AI_GATEWAY_API_KEY"],moonshot:["MOONSHOT_API_KEY"],minimax:["MINIMAX_API_KEY"],"minimax-cn":["MINIMAX_CN_API_KEY","MINIMAX_API_KEY"],nvidia:["NVIDIA_API_KEY"],xiaomi:["XIAOMI_API_KEY"],synthetic:["SYNTHETIC_API_KEY"],venice:["VENICE_API_KEY"],mistral:["MISTRAL_API_KEY"],together:["TOGETHER_API_KEY"],qianfan:["QIANFAN_API_KEY"],ollama:["OLLAMA_API_KEY"],vllm:["VLLM_API_KEY"],kilocode:["KILOCODE_API_KEY"]};function ut(){return[...new Set(Object.values(k).flat())]}function gt(e){let t=S(e.provider),r=e.env??process.env,n=new Set(e.appliedEnvKeys??[]),o=i=>{let d=r[i]?.trim();if(!d)return null;let u=n.has(i)?`shell env: ${i}`:`env: ${i}`;return{apiKey:d,source:u}},p=e.resolveSpecialApiKey?.(t,r,n);if(p)return p;let s=k[t];if(!s||s.length===0)return null;for(let i of s){let d=o(i);if(d)return d}return null}export{Ae as ACP_EXTENDED_METHODS,Se as ACP_EXTENDED_SESSION_UPDATE_TYPES,ye as ACP_METHODS,fe as ACP_PROTOCOL_VERSION,O as ACP_SESSION_UPDATE_TYPES,z as AGENT_RPC_APPROVAL_METHODS,l as AGENT_RPC_ERROR_CODES,G as AGENT_RPC_PROTOCOL_VERSION,b as AGENT_TEAM_WS_EVENT_NAMES,I as AGENT_WS_EVENT_NAMES,w as ALL_AGENT_WS_EVENT_NAMES,P as CAPABILITY_MANIFEST_DIFF_SECTIONS,re as GATEWAY_RPC_METHODS,R as GatewayRpcContract,je as MEMORY_OBSERVATION_HOOK_VALUES,Ue as MEMORY_OBSERVATION_SOURCE_VALUES,Ke as MEMORY_WRITE_ACCESS_VALUES,ze as MUTATION_CHECKPOINT_BACKEND_VALUES,Ge as MUTATION_CHECKPOINT_ENTRY_KIND_VALUES,Ye as MUTATION_CHECKPOINT_PHASE_VALUES,Y as PETDEX_ANIMATION_IDS,Xe as PROVIDER_RUNTIME_AUTH_MODE_VALUES,Je as PROVIDER_RUNTIME_COMPAT_FLAG_VALUES,k as PROVIDER_RUNTIME_ENV_API_KEY_CANDIDATES,q as PROVIDER_RUNTIME_OPENAI_CODEX_PROVIDER_ID,$e as PROVIDER_RUNTIME_VAULT_ERROR_TYPE_VALUES,Fe as RESOURCE_MANIFEST_SCHEMA_VERSION,a as RUNTIME_ASSET_IDS,y as RUNTIME_PROFILE_IDS,Ne as WEB_ACTION_SCOPE_VALUES,we as WEB_APPROVAL_DEFAULT_VALUES,Ce as WEB_CAPABILITY_FAMILY_VALUES,_e as WEB_CAPABILITY_ID_VALUES,De as WEB_DEGRADATION_TARGET_VALUES,He as WEB_ESCALATION_REASON_VALUES,ve as WEB_EXECUTION_MODE_VALUES,Oe as WEB_POLICY_RISK_CLASS_VALUES,Le as WEB_RETRY_POLICY_VALUES,Me as WEB_STATEFULNESS_VALUES,xe as WEB_TASK_MODE_VALUES,te as buildAgentRpcMeta,A as classifyGatewayRpcMethod,f as cloneCapabilityManifestSnapshot,ke as createCapabilityManifestDiffPayload,K as createDefaultRuntimeResourceProfiles,he as deriveCapabilityToolNamespaces,Te as deriveCapabilityWorkspaceIds,h as getManifestShortcutEntry,F as getRuntimeResourceAsset,V as getRuntimeResourceProfile,We as getRuntimeResourceProfileAssets,D as isAcpJsonRpcNotification,N as isAcpJsonRpcRequest,H as isAcpJsonRpcResponse,x as isAgentRpcNotification,_ as isAgentRpcRequest,C as isAgentRpcResponse,dt as isAnthropicProviderRuntimeFamily,be as isExtendedSessionUpdateType,at as isOpenAiProviderRuntimeFamily,Ie as isStandardSessionUpdateType,ut as listProviderRuntimeEnvApiKeyNames,Ee as mergeCapabilityManifestSnapshot,S as normalizeProviderRuntimeId,B as normalizeProviderRuntimeIdForAuth,Be as normalizeRuntimeResourceManifest,Re as parseAcpMessage,X as parseAgentRpcMessage,rt as preservesProviderRuntimeAnthropicThinkingSignatures,Qe as readProviderRuntimeCompatFlag,M as requireGatewayRpcMeta,v as requiresIdempotencyKey,nt as requiresOpenAiCompatibleAnthropicToolPayloadForProviderRuntime,c as resolveProviderRuntimeCapabilities,gt as resolveProviderRuntimeEnvApiKey,Ze as resolveProviderRuntimeKeyFamily,lt as resolveProviderRuntimeTranscriptToolCallIdMode,pt as shouldDropThinkingBlocksForProviderRuntimeModel,ct as shouldSanitizeProviderRuntimeThoughtSignaturesForModel,st as supportsOpenAiCompatTurnValidationForProviderRuntime,qe as upsertRuntimeResourceAsset,it as usesOpenAiFunctionAnthropicToolSchemaForProviderRuntime,ot as usesOpenAiStringModeAnthropicToolChoiceForProviderRuntime};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{createInterface as Ze}from"node:readline";import{existsSync as Xe,readFileSync as et}from"node:fs";import{readFileSync as Se}from"node:fs";import{randomUUID as Te}from"node:crypto";import{readdirSync as Mt,readFileSync as Rt,statSync as se,writeFileSync as Et}from"node:fs";import{readdir as ie,readFile as ae,stat as le,writeFile as ce}from"node:fs/promises";import{join as d}from"node:path";import{homedir as X}from"node:os";import{join as u}from"node:path";import{existsSync as yt}from"node:fs";import{createHash as ct}from"node:crypto";import{resolve as dt}from"node:path";var
|
|
2
|
+
import{createInterface as Ze}from"node:readline";import{existsSync as Xe,readFileSync as et}from"node:fs";import{readFileSync as Se}from"node:fs";import{randomUUID as Te}from"node:crypto";import{readdirSync as Mt,readFileSync as Rt,statSync as se,writeFileSync as Et}from"node:fs";import{readdir as ie,readFile as ae,stat as le,writeFile as ce}from"node:fs/promises";import{join as d}from"node:path";import{homedir as X}from"node:os";import{join as u}from"node:path";import{existsSync as yt}from"node:fs";import{createHash as ct}from"node:crypto";import{resolve as dt}from"node:path";var P=".qlogicagent";function p(){return process.env.QLOGICAGENT_HOME||u(X(),P)}function v(){return u(p(),"skills")}function C(){return u(p(),"mcp.json")}function ee(t){if(!t)throw new Error("getProjectAgentDir: cwd is required (must not fall back to process.cwd())");return u(t,P)}function x(t){return u(ee(t),"skills-disabled.json")}import{readFileSync as te,writeFileSync as Tt,mkdirSync as wt,renameSync as kt}from"node:fs";import{dirname as Pt,join as re}from"node:path";function f(){return{version:1,disabled:[]}}function oe(t){let e;try{e=te(t,"utf8")}catch(n){return n.code==="ENOENT"?{list:f(),corrupt:!1}:(console.error(`[project-skill-manifest] Cannot read skill mute list at ${t} (${n instanceof Error?n.message:String(n)}); treating it as empty for reads \u2014 muted skills may reactivate.`),{list:f(),corrupt:!0})}let r;try{r=JSON.parse(e)}catch(n){return console.error(`[project-skill-manifest] Skill mute list at ${t} is corrupted (${n instanceof Error?n.message:String(n)}); treating it as empty for reads \u2014 muted skills may reactivate.`),{list:f(),corrupt:!0}}return!r||typeof r!="object"||!Array.isArray(r.disabled)?(console.error(`[project-skill-manifest] Skill mute list at ${t} has an unexpected shape; treating it as empty for reads \u2014 muted skills may reactivate.`),{list:f(),corrupt:!0}):{list:{version:1,disabled:[...new Set(r.disabled.filter(n=>typeof n=="string"&&n.trim().length>0))]},corrupt:!1}}function A(t){return oe(t).list}function ne(){return re(p(),"skills-disabled.json")}function M(){return new Set(A(ne()).disabled)}function R(t){return new Set(A(x(t)).disabled)}var ue=["auto-skill-","test-skill-"],de=".skills_prompt_snapshot.json";function me(t){return ue.some(e=>t.startsWith(e))}function pe(t){let e=t.replace(/\r\n/g,`
|
|
3
3
|
`),r=e.match(/^---\n[\s\S]*?^version:\s*(\S+)/m),o=e.match(/^---\n[\s\S]*?^category:\s*(.+)/m),n=e.match(/^---\n[\s\S]*?^author:\s*(.+)/m),i=e.match(/^---\n[\s\S]*?^requires:\s*(.+)/m),s=e.match(/^---\n[\s\S]*?^environments:\s*(.+)/m),a=e.match(/^---\n([\s\S]*?)\n---/)?.[1]??"";return{version:r?.[1],description:fe(a),category:o?.[1]?.trim()||void 0,author:n?.[1]?.trim()||void 0,requiredTools:D(i?.[1]),environments:D(s?.[1])}}function fe(t){let e=t.split(`
|
|
4
|
-
`),r=e.findIndex(s=>/^description:/.test(s));if(r===-1)return;let o=e[r].replace(/^description:[ \t]*/,"").trim(),n=/^[>|][+-]?$/.test(o),i=[];!n&&o&&i.push(o);for(let s=r+1;s<e.length;s++){let a=e[s];if(!/^[ \t]/.test(a))break;let l=a.trim();l&&i.push(l)}if(i.length!==0)return i.join(" ").replace(/^["']|["']$/g,"").trim()||void 0}var E=new Map,b=new Map;function ge(t,e,r,o){let n=e.has(t.name),i=r.has(t.name),s=!ve(t.meta,o);return{name:t.name,filePath:t.filePath,baseDir:t.baseDir,globallyDisabled:n,projectDisabled:i,active:!n&&!i&&!s,systemGenerated:t.systemGenerated,description:t.meta.description,version:t.meta.version,category:t.meta.category,author:t.meta.author,requiredTools:t.meta.requiredTools,environments:t.meta.environments}}async function he(t){let e;try{e=await ie(t,{withFileTypes:!0})}catch{e=[]}let r=[];for(let s of e){if(!s.isDirectory()||s.name.startsWith("."))continue;let a=d(t,s.name),l=d(a,"SKILL.md");try{let y=await le(l);if(!y.isFile())continue;r.push({name:s.name,filePath:l,baseDir:a,mtimeMs:y.mtimeMs,size:y.size})}catch{continue}}r.sort((s,a)=>s.name.localeCompare(a.name));let o=r.map(s=>`${s.name}:${s.mtimeMs}:${s.size}`).join("|"),n=E.get(t);if(n&&n.fingerprint===o)return n.raw;let i=[];for(let s of r){let a;try{a=await ae(s.filePath,"utf8")}catch{continue}i.push({name:s.name,filePath:s.filePath,baseDir:s.baseDir,systemGenerated:me(s.name),mtimeMs:s.mtimeMs,size:s.size,meta:pe(a)})}return E.set(t,{fingerprint:o,raw:i}),be(t,i),i}async function ye(t,e){let r=v(),o=M(),n=t?R(t):new Set,i=b.get(r);return i||(i=he(r).finally(()=>b.delete(r)),b.set(r,i)),(await i).map(a=>ge(a,o,n,e))}async function I(t,e){return(await ye(t,e)).filter(r=>r.active)}function j(t){let e=v(),r=d(e,t),o=d(r,"SKILL.md");try{if(se(o).isFile())return{baseDir:r,filePath:o}}catch{}return null}function D(t){if(!t)return;let e=t.replace(/^\[|\]$/g,"").split(/[,\s]+/).map(r=>r.replace(/^["']|["']$/g,"").trim()).filter(Boolean);return e.length>0?e:void 0}function ve(t,e){if(t.environments&&e?.currentEnvironment&&!t.environments.includes(e.currentEnvironment))return!1;if(t.requiredTools){if(!e?.availableToolNames)return!1;let r=new Set(e.availableToolNames);return t.requiredTools.every(o=>r.has(o))}return!0}async function be(t,e){try{let o={version:1,entries:e.map(n=>({name:n.name,size:n.size,mtimeMs:n.mtimeMs,description:n.meta.description,version:n.meta.version,requiredTools:n.meta.requiredTools,environments:n.meta.environments}))};await ce(d(t,de),JSON.stringify(o,null,2),"utf8")}catch{}}var L="astraclaw_capabilities";async function O(t){if(t.tool==="skills_list")return{handled:!0,result:{skills:(await I(t.projectRoot,{availableToolNames:t.availableToolNames,currentEnvironment:t.currentEnvironment??process.platform})).map(we)}};if(t.tool==="skill_view"){let e=typeof t.args.name=="string"?t.args.name.trim():"";if(!e)throw new Error("skill_view requires a skill name");let r=j(e);if(!r)throw new Error(`Skill not found: ${e}`);return{handled:!0,result:{name:e,content:Se(r.filePath,"utf8")}}}if(t.tool==="mcp_connectors_list"){let e=t.mcpServerFailures??[],r=e.length>0?{failedServers:e,note:`${e.length} configured MCP server(s) are unavailable this session; their tools are missing from this list.`}:{};if(!t.toolCatalog)return{handled:!0,result:{tools:[],note:"AstraClaw MCP connector catalog is not attached to this capability server instance.",...e.length>0?{failedServers:e}:{}}};let o=t.toolCatalog.getToolManifest().filter(n=>n.function.name.startsWith("mcp__")).map(n=>({toolName:n.function.name,server:Pe(n.function.name),name:_e(n.function.name),description:n.function.description,inputSchema:n.function.parameters}));return{handled:!0,result:{tools:o,count:o.length,...r}}}if(t.tool==="mcp_tool_call"){if(!t.toolCatalog)throw new Error("AstraClaw MCP connector catalog is not attached");let e=typeof t.args.toolName=="string"?t.args.toolName.trim():"";if(!e.startsWith("mcp__"))throw new Error("mcp_tool_call requires a connector toolName returned by mcp_connectors_list");let r=t.toolCatalog.findTool(e);if(!r?.execute)throw new Error(`MCP connector tool not found or not executable: ${e}`);let o=ke(t.args.args),n=`astraclaw_mcp_${Te().slice(0,8)}`,i=await r.execute(n,o);return{handled:!0,result:{toolName:e,content:i.content,details:i.details,imageUrls:i.imageUrls}}}return{handled:!1}}function we(t){return{name:t.name,description:t.description,version:t.version,category:t.category,requiredTools:t.requiredTools,environments:t.environments}}function ke(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)?t:{}}function Pe(t){let e=t.split("__");return e.length>=3?e[1]??"":""}function _e(t){let e=t.split("__");return e.length>=3?e.slice(2).join("__"):t}import m from"node:path";import{fileURLToPath as Re}from"node:url";import{createRuntime as Ee}from"mcporter";var $=new Set(["gateway","agents_list","session_status","sessions_send","sessions_list","sessions_history","sessions_spawn","cron","config","workflow"]),Ce=new Set([...$,"agent"]);function N(t){return t?.riskLevel?t.riskLevel:t?.isDangerous?"system":t?.isReadOnly?"read":t?.isEgress?"external_egress":"write"}var S=class{toolPool=new Map;setTools(e){this.toolPool.clear();for(let r of e)this.toolPool.set(r.name,r)}addTool(e){this.toolPool.set(e.name,e)}addTools(e){for(let r of e)this.addTool(r)}removeTool(e){return this.toolPool.delete(e)}findTool(e){return this.toolPool.get(e)}hasTool(e){return this.toolPool.has(e)}getToolNames(){return Array.from(this.toolPool.keys())}getToolCount(){return this.toolPool.size}async executeTool(e,r,o,n){let i=this.toolPool.get(e);if(!i)throw new Error(`Tool not found: ${e}`);return i.execute(r,o,n)}getTools(){return Array.from(this.toolPool.values()).filter(e=>e.isEnabled?.()!==!1)}getToolManifest(){let e=[];for(let r of this.toolPool.values()){if(r.isEnabled?.()===!1)continue;let o=N(r);e.push({type:"function",function:{name:r.name,description:r.description,parameters:r.parameters},meta:{category:r.category??"other",displayName:r.displayName??{key:`capability.tool.${r.name}.name`,fallback:r.label},displayDescription:r.displayDescription??{key:`capability.tool.${r.name}.description`,fallback:""},parallelSafe:r.isConcurrencySafe??!1,riskLevel:o,isReadOnly:o==="read",isDangerous:o==="system",isDelete:r.isDelete??!1,isEgress:r.isEgress??o==="external_egress",egressCarriesData:r.egressCarriesData??!1,...r.executionTimeoutMs!==void 0?{executionTimeoutMs:r.executionTimeoutMs}:{}}})}return e}},F=new S;function U(t){F.addTools(t)}function q(t){return F.removeTool(t)}var xe=new Set(["describe","fetch","find","get","inspect","list","query","read","search","stat"]),Ae=new Set(["append","copy","create","delete","edit","move","patch","remove","rename","set","update","upload","write"]);function G(t){let e=t.annotations,r=Me(t.name),o=r.some(l=>Ae.has(l)),n=r.some(l=>xe.has(l)),i=e?.destructiveHint===!0||o,s=e?.readOnlyHint===!0||!i&&n,a=s||e?.idempotentHint===!0&&!i;return{isReadOnly:s,isConcurrencySafe:a,isDestructive:i}}function Me(t){return t.replace(/([a-z0-9])([A-Z])/g,"$1_$2").toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)}var w=12e4,z=1e3,W=9e5;function De(t){if(t===void 0)return w;if(!Number.isInteger(t)||t<z||t>W)throw new RangeError(`MCP callTimeoutMs must be an integer between ${z} and ${W}`);return t}var g=3,Ie=1e3;async function je(t,e){let r=e.sleep??(i=>new Promise(s=>setTimeout(s,i))),o=Math.max(1,e.attempts),n;for(let i=1;i<=o;i++)try{return await t()}catch(s){n=s,i<o&&(e.onRetry?.(i,s),await r(e.baseDelayMs*i))}throw n}var h=class{runtime=null;definitions=[];toolsByServer=new Map;injectedNames=new Set;log;workspaceRoot;toolCatalog;serverToolFilters=new Map;serverOAuth=new Map;serverCallTimeouts=new Map;failedServers=new Map;constructor(e){this.log=e.log??{info:()=>{},warn:()=>{}},this.workspaceRoot=e.workspaceRoot?m.resolve(e.workspaceRoot):void 0,this.toolCatalog=e.toolCatalog,this.definitions=e.servers.filter(r=>!r.disabled).filter(r=>{let o=Ve(r);for(let n of o)this.log.warn(`[mcp] rejected server "${r.name}": ${n.message}`);return r.tools&&this.serverToolFilters.set(r.name,r.tools),r.oauth===!0&&this.serverOAuth.set(r.name,!0),this.serverCallTimeouts.set(r.name,De(r.callTimeoutMs)),o.length===0}).map(r=>this.toServerDefinition(r)).filter(r=>r!==null)}markServerFailed(e,r,o){this.failedServers.set(e,{name:e,phase:r,error:o}),console.error(`[mcp] server "${e}" unavailable this session (${r}): ${o}`)}toServerDefinition(e){if((e.type??(e.url?"http":"stdio"))==="http"){if(!e.url)return this.log.warn(`[mcp] server "${e.name}" is type "http" but has no url, skipping`),this.markServerFailed(e.name,"config",'type "http" but no url'),null;let o;try{o=new URL(e.url)}catch{return this.log.warn(`[mcp] server "${e.name}" has an invalid url "${e.url}", skipping`),this.markServerFailed(e.name,"config",`invalid url "${e.url}"`),null}return{name:e.name,command:{kind:"http",url:o,headers:e.headers}}}return e.command?{name:e.name,command:{kind:"stdio",command:e.command,args:e.args??[],cwd:e.cwd??this.workspaceRoot??process.cwd()},env:e.env}:(this.log.warn(`[mcp] server "${e.name}" is type "stdio" but has no command, skipping`),this.markServerFailed(e.name,"config",'type "stdio" but no command'),null)}async connectAll(){this.definitions.length!==0&&(this.runtime=await Ee({servers:this.definitions,clientInfo:{name:"qlogicagent",version:"1.0.0"},logger:{info:e=>this.log.info(`[mcp] ${e}`),warn:e=>this.log.warn(`[mcp] ${e}`),error:(e,r)=>this.log.warn(`[mcp] ${e}${r?` (${r instanceof Error?r.message:String(r)})`:""}`),debug:()=>{}}}),await Promise.allSettled(this.definitions.map(async e=>{try{let r=await je(()=>this.runtime.listTools(e.name,{includeSchema:!0,disableOAuth:this.serverOAuth.get(e.name)!==!0}),{attempts:g,baseDelayMs:Ie,onRetry:(n,i)=>this.log.warn(`[mcp] connect attempt ${n}/${g} for ${e.name} failed, retrying: ${i instanceof Error?i.message:i}`)}),o=J(r,this.serverToolFilters.get(e.name));this.toolsByServer.set(e.name,o),this.failedServers.delete(e.name),this.log.info(`[mcp] connected to ${e.name} (${o.length}/${r.length} tools)`)}catch(r){this.log.warn(`[mcp] failed to connect to ${e.name} after ${g} attempts: ${r instanceof Error?r.message:r}`),this.markServerFailed(e.name,"connect",`${r instanceof Error?r.message:String(r)} (after ${g} attempts)`)}})))}injectTools(){for(let[e,r]of this.toolsByServer){let o=this.injectPortableTools(e,r);this.log.info(`[mcp] injected ${o.length} tools from ${e}`)}}async refreshServerTools(e){if(!this.runtime)throw new Error("MCP runtime is not connected");let r=await this.runtime.listTools(e,{includeSchema:!0,disableOAuth:this.serverOAuth.get(e)!==!0}),o=J(r,this.serverToolFilters.get(e));return this.toolsByServer.set(e,o),this.failedServers.delete(e),this.retractServerTools(e),this.injectPortableTools(e,o),o.length}getConnectedServers(){return Array.from(this.toolsByServer.keys())}getFailedServers(){return Array.from(this.failedServers.values())}getToolCount(){let e=0;for(let r of this.toolsByServer.values())e+=r.length;return e}async disconnectAll(){for(let r of this.injectedNames)this.removeRegisteredTool(r);this.injectedNames.clear(),this.toolsByServer.clear(),this.failedServers.clear();let e=this.runtime;if(this.runtime=null,e)try{await e.close()}catch{}}toPortableTool(e,r){let o=G({name:r.name,description:r.description});return{name:`mcp__${B(e)}__${r.name}`,label:`[${e}] ${r.name}`,category:"mcp",description:r.description??`MCP tool from ${e}`,parameters:r.inputSchema??{type:"object",properties:{}},isConcurrencySafe:o.isConcurrencySafe,isReadOnly:o.isReadOnly,isDestructive:o.isDestructive,searchHint:`mcp ${e} ${r.name.replace(/[_-]+/g," ")}`,executionTimeoutMs:this.serverCallTimeouts.get(e)??w,execute:async(n,i)=>{let s=this.runtime;if(!s)return{content:[{type:"text",text:`MCP server "${e}" is not connected.`}],details:{error:"mcp_not_connected"}};try{let a=await s.callTool(e,r.name,{args:i,timeoutMs:this.serverCallTimeouts.get(e)??w});return Le(a)}catch(a){let l=a instanceof Error?a.message:String(a);return{content:[{type:"text",text:`MCP tool error: ${l}`}],details:{error:l}}}}}}wrapToolsForWorkspaceBoundary(e){return this.workspaceRoot?e.map(r=>{if(!r.execute)return r;let o=r.execute;return{...r,execute:async(n,i,s)=>{let a=$e(r.name,i,this.workspaceRoot);return a?{content:[{type:"text",text:a}],details:{type:"mcp",error:"workspace_boundary"}}:o(n,i,s)}}}):e}injectPortableTools(e,r){let o=this.wrapToolsForWorkspaceBoundary(r.map(n=>this.toPortableTool(e,n)));this.registerTools(o);for(let n of o)this.injectedNames.add(n.name);return o}retractServerTools(e){let r=`mcp__${B(e)}__`;for(let o of[...this.injectedNames])o.startsWith(r)&&(this.removeRegisteredTool(o),this.injectedNames.delete(o))}registerTools(e){this.toolCatalog?this.toolCatalog.addTools(e):U(e)}removeRegisteredTool(e){return this.toolCatalog?.removeTool(e)??q(e)}};function Le(t){let e=t&&typeof t=="object"?t:{},o=(Array.isArray(e.content)?e.content:[]).filter(a=>!!a&&typeof a=="object"),n=o.filter(a=>a.type==="text"&&typeof a.text=="string").map(a=>a.text),i=o.filter(a=>!(a.type==="text"&&typeof a.text=="string")).map(a=>typeof a.type=="string"&&a.type?a.type:"unknown"),s=n.join(`
|
|
4
|
+
`),r=e.findIndex(s=>/^description:/.test(s));if(r===-1)return;let o=e[r].replace(/^description:[ \t]*/,"").trim(),n=/^[>|][+-]?$/.test(o),i=[];!n&&o&&i.push(o);for(let s=r+1;s<e.length;s++){let a=e[s];if(!/^[ \t]/.test(a))break;let l=a.trim();l&&i.push(l)}if(i.length!==0)return i.join(" ").replace(/^["']|["']$/g,"").trim()||void 0}var E=new Map,b=new Map;function ge(t,e,r,o){let n=e.has(t.name),i=r.has(t.name),s=!ve(t.meta,o);return{name:t.name,filePath:t.filePath,baseDir:t.baseDir,globallyDisabled:n,projectDisabled:i,active:!n&&!i&&!s,systemGenerated:t.systemGenerated,description:t.meta.description,version:t.meta.version,category:t.meta.category,author:t.meta.author,requiredTools:t.meta.requiredTools,environments:t.meta.environments}}async function he(t){let e;try{e=await ie(t,{withFileTypes:!0})}catch{e=[]}let r=[];for(let s of e){if(!s.isDirectory()||s.name.startsWith("."))continue;let a=d(t,s.name),l=d(a,"SKILL.md");try{let y=await le(l);if(!y.isFile())continue;r.push({name:s.name,filePath:l,baseDir:a,mtimeMs:y.mtimeMs,size:y.size})}catch{continue}}r.sort((s,a)=>s.name.localeCompare(a.name));let o=r.map(s=>`${s.name}:${s.mtimeMs}:${s.size}`).join("|"),n=E.get(t);if(n&&n.fingerprint===o)return n.raw;let i=[];for(let s of r){let a;try{a=await ae(s.filePath,"utf8")}catch{continue}i.push({name:s.name,filePath:s.filePath,baseDir:s.baseDir,systemGenerated:me(s.name),mtimeMs:s.mtimeMs,size:s.size,meta:pe(a)})}return E.set(t,{fingerprint:o,raw:i}),be(t,i),i}async function ye(t,e){let r=v(),o=M(),n=t?R(t):new Set,i=b.get(r);return i||(i=he(r).finally(()=>b.delete(r)),b.set(r,i)),(await i).map(a=>ge(a,o,n,e))}async function I(t,e){return(await ye(t,e)).filter(r=>r.active)}function j(t){let e=v(),r=d(e,t),o=d(r,"SKILL.md");try{if(se(o).isFile())return{baseDir:r,filePath:o}}catch{}return null}function D(t){if(!t)return;let e=t.replace(/^\[|\]$/g,"").split(/[,\s]+/).map(r=>r.replace(/^["']|["']$/g,"").trim()).filter(Boolean);return e.length>0?e:void 0}function ve(t,e){if(t.environments&&e?.currentEnvironment&&!t.environments.includes(e.currentEnvironment))return!1;if(t.requiredTools){if(!e?.availableToolNames)return!1;let r=new Set(e.availableToolNames);return t.requiredTools.every(o=>r.has(o))}return!0}async function be(t,e){try{let o={version:1,entries:e.map(n=>({name:n.name,size:n.size,mtimeMs:n.mtimeMs,description:n.meta.description,version:n.meta.version,requiredTools:n.meta.requiredTools,environments:n.meta.environments}))};await ce(d(t,de),JSON.stringify(o,null,2),"utf8")}catch{}}var L="astraclaw_capabilities";async function O(t){if(t.tool==="skills_list")return{handled:!0,result:{skills:(await I(t.projectRoot,{availableToolNames:t.availableToolNames,currentEnvironment:t.currentEnvironment??process.platform})).map(we)}};if(t.tool==="skill_view"){let e=typeof t.args.name=="string"?t.args.name.trim():"";if(!e)throw new Error("skill_view requires a skill name");let r=j(e);if(!r)throw new Error(`Skill not found: ${e}`);return{handled:!0,result:{name:e,content:Se(r.filePath,"utf8")}}}if(t.tool==="mcp_connectors_list"){let e=t.mcpServerFailures??[],r=e.length>0?{failedServers:e,note:`${e.length} configured MCP server(s) are unavailable this session; their tools are missing from this list.`}:{};if(!t.toolCatalog)return{handled:!0,result:{tools:[],note:"AstraClaw MCP connector catalog is not attached to this capability server instance.",...e.length>0?{failedServers:e}:{}}};let o=t.toolCatalog.getToolManifest().filter(n=>n.function.name.startsWith("mcp__")).map(n=>({toolName:n.function.name,server:_e(n.function.name),name:Pe(n.function.name),description:n.function.description,inputSchema:n.function.parameters}));return{handled:!0,result:{tools:o,count:o.length,...r}}}if(t.tool==="mcp_tool_call"){if(!t.toolCatalog)throw new Error("AstraClaw MCP connector catalog is not attached");let e=typeof t.args.toolName=="string"?t.args.toolName.trim():"";if(!e.startsWith("mcp__"))throw new Error("mcp_tool_call requires a connector toolName returned by mcp_connectors_list");let r=t.toolCatalog.findTool(e);if(!r?.execute)throw new Error(`MCP connector tool not found or not executable: ${e}`);let o=ke(t.args.args),n=`astraclaw_mcp_${Te().slice(0,8)}`,i=await r.execute(n,o);return{handled:!0,result:{toolName:e,content:i.content,details:i.details,imageUrls:i.imageUrls}}}return{handled:!1}}function we(t){return{name:t.name,description:t.description,version:t.version,category:t.category,requiredTools:t.requiredTools,environments:t.environments}}function ke(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)?t:{}}function _e(t){let e=t.split("__");return e.length>=3?e[1]??"":""}function Pe(t){let e=t.split("__");return e.length>=3?e.slice(2).join("__"):t}import m from"node:path";import{fileURLToPath as Re}from"node:url";import{createRuntime as Ee}from"mcporter";var $=new Set(["gateway","agents_list","session_status","sessions_send","sessions_list","sessions_history","sessions_spawn","cron","config","workflow"]),Ce=new Set([...$,"agent"]);function N(t){return t?.riskLevel?t.riskLevel:t?.isDangerous?"system":t?.isReadOnly?"read":t?.isEgress?"external_egress":"write"}var S=class{toolPool=new Map;setTools(e){this.toolPool.clear();for(let r of e)this.toolPool.set(r.name,r)}addTool(e){this.toolPool.set(e.name,e)}addTools(e){for(let r of e)this.addTool(r)}removeTool(e){return this.toolPool.delete(e)}findTool(e){return this.toolPool.get(e)}hasTool(e){return this.toolPool.has(e)}getToolNames(){return Array.from(this.toolPool.keys())}getToolCount(){return this.toolPool.size}async executeTool(e,r,o,n){let i=this.toolPool.get(e);if(!i)throw new Error(`Tool not found: ${e}`);return i.execute(r,o,n)}getTools(){return Array.from(this.toolPool.values()).filter(e=>e.isEnabled?.()!==!1)}getToolManifest(){let e=[];for(let r of this.toolPool.values()){if(r.isEnabled?.()===!1)continue;let o=N(r);e.push({type:"function",function:{name:r.name,description:r.description,parameters:r.parameters},meta:{category:r.category??"other",displayName:r.displayName??{key:`capability.tool.${r.name}.name`,fallback:r.label},displayDescription:r.displayDescription??{key:`capability.tool.${r.name}.description`,fallback:""},parallelSafe:r.isConcurrencySafe??!1,riskLevel:o,isReadOnly:o==="read",isDangerous:o==="system",isDelete:r.isDelete??!1,isEgress:r.isEgress??o==="external_egress",egressCarriesData:r.egressCarriesData??!1,...r.executionTimeoutMs!==void 0?{executionTimeoutMs:r.executionTimeoutMs}:{}}})}return e}},F=new S;function U(t){F.addTools(t)}function q(t){return F.removeTool(t)}var xe=new Set(["describe","fetch","find","get","inspect","list","query","read","search","stat"]),Ae=new Set(["append","copy","create","delete","edit","move","patch","remove","rename","set","update","upload","write"]);function G(t){let e=t.annotations,r=Me(t.name),o=r.some(l=>Ae.has(l)),n=r.some(l=>xe.has(l)),i=e?.destructiveHint===!0||o,s=e?.readOnlyHint===!0||!i&&n,a=s||e?.idempotentHint===!0&&!i;return{isReadOnly:s,isConcurrencySafe:a,isDestructive:i}}function Me(t){return t.replace(/([a-z0-9])([A-Z])/g,"$1_$2").toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)}var w=12e4,z=1e3,W=9e5;function De(t){if(t===void 0)return w;if(!Number.isInteger(t)||t<z||t>W)throw new RangeError(`MCP callTimeoutMs must be an integer between ${z} and ${W}`);return t}var g=3,Ie=1e3;async function je(t,e){let r=e.sleep??(i=>new Promise(s=>setTimeout(s,i))),o=Math.max(1,e.attempts),n;for(let i=1;i<=o;i++)try{return await t()}catch(s){n=s,i<o&&(e.onRetry?.(i,s),await r(e.baseDelayMs*i))}throw n}var h=class{runtime=null;definitions=[];toolsByServer=new Map;injectedNames=new Set;log;workspaceRoot;toolCatalog;serverToolFilters=new Map;serverOAuth=new Map;serverCallTimeouts=new Map;failedServers=new Map;constructor(e){this.log=e.log??{info:()=>{},warn:()=>{}},this.workspaceRoot=e.workspaceRoot?m.resolve(e.workspaceRoot):void 0,this.toolCatalog=e.toolCatalog,this.definitions=e.servers.filter(r=>!r.disabled).filter(r=>{let o=Ve(r);for(let n of o)this.log.warn(`[mcp] rejected server "${r.name}": ${n.message}`);return r.tools&&this.serverToolFilters.set(r.name,r.tools),r.oauth===!0&&this.serverOAuth.set(r.name,!0),this.serverCallTimeouts.set(r.name,De(r.callTimeoutMs)),o.length===0}).map(r=>this.toServerDefinition(r)).filter(r=>r!==null)}markServerFailed(e,r,o){this.failedServers.set(e,{name:e,phase:r,error:o}),console.error(`[mcp] server "${e}" unavailable this session (${r}): ${o}`)}toServerDefinition(e){if((e.type??(e.url?"http":"stdio"))==="http"){if(!e.url)return this.log.warn(`[mcp] server "${e.name}" is type "http" but has no url, skipping`),this.markServerFailed(e.name,"config",'type "http" but no url'),null;let o;try{o=new URL(e.url)}catch{return this.log.warn(`[mcp] server "${e.name}" has an invalid url "${e.url}", skipping`),this.markServerFailed(e.name,"config",`invalid url "${e.url}"`),null}return{name:e.name,command:{kind:"http",url:o,headers:e.headers}}}return e.command?{name:e.name,command:{kind:"stdio",command:e.command,args:e.args??[],cwd:e.cwd??this.workspaceRoot??process.cwd()},env:e.env}:(this.log.warn(`[mcp] server "${e.name}" is type "stdio" but has no command, skipping`),this.markServerFailed(e.name,"config",'type "stdio" but no command'),null)}async connectAll(){this.definitions.length!==0&&(this.runtime=await Ee({servers:this.definitions,clientInfo:{name:"qlogicagent",version:"1.0.0"},logger:{info:e=>this.log.info(`[mcp] ${e}`),warn:e=>this.log.warn(`[mcp] ${e}`),error:(e,r)=>this.log.warn(`[mcp] ${e}${r?` (${r instanceof Error?r.message:String(r)})`:""}`),debug:()=>{}}}),await Promise.allSettled(this.definitions.map(async e=>{try{let r=await je(()=>this.runtime.listTools(e.name,{includeSchema:!0,disableOAuth:this.serverOAuth.get(e.name)!==!0}),{attempts:g,baseDelayMs:Ie,onRetry:(n,i)=>this.log.warn(`[mcp] connect attempt ${n}/${g} for ${e.name} failed, retrying: ${i instanceof Error?i.message:i}`)}),o=J(r,this.serverToolFilters.get(e.name));this.toolsByServer.set(e.name,o),this.failedServers.delete(e.name),this.log.info(`[mcp] connected to ${e.name} (${o.length}/${r.length} tools)`)}catch(r){this.log.warn(`[mcp] failed to connect to ${e.name} after ${g} attempts: ${r instanceof Error?r.message:r}`),this.markServerFailed(e.name,"connect",`${r instanceof Error?r.message:String(r)} (after ${g} attempts)`)}})))}injectTools(){for(let[e,r]of this.toolsByServer){let o=this.injectPortableTools(e,r);this.log.info(`[mcp] injected ${o.length} tools from ${e}`)}}async refreshServerTools(e){if(!this.runtime)throw new Error("MCP runtime is not connected");let r=await this.runtime.listTools(e,{includeSchema:!0,disableOAuth:this.serverOAuth.get(e)!==!0}),o=J(r,this.serverToolFilters.get(e));return this.toolsByServer.set(e,o),this.failedServers.delete(e),this.retractServerTools(e),this.injectPortableTools(e,o),o.length}getConnectedServers(){return Array.from(this.toolsByServer.keys())}getFailedServers(){return Array.from(this.failedServers.values())}getToolCount(){let e=0;for(let r of this.toolsByServer.values())e+=r.length;return e}async disconnectAll(){for(let r of this.injectedNames)this.removeRegisteredTool(r);this.injectedNames.clear(),this.toolsByServer.clear(),this.failedServers.clear();let e=this.runtime;if(this.runtime=null,e)try{await e.close()}catch{}}toPortableTool(e,r){let o=G({name:r.name,description:r.description});return{name:`mcp__${B(e)}__${r.name}`,label:`[${e}] ${r.name}`,category:"mcp",description:r.description??`MCP tool from ${e}`,parameters:r.inputSchema??{type:"object",properties:{}},isConcurrencySafe:o.isConcurrencySafe,isReadOnly:o.isReadOnly,isDestructive:o.isDestructive,searchHint:`mcp ${e} ${r.name.replace(/[_-]+/g," ")}`,executionTimeoutMs:this.serverCallTimeouts.get(e)??w,execute:async(n,i)=>{let s=this.runtime;if(!s)return{content:[{type:"text",text:`MCP server "${e}" is not connected.`}],details:{error:"mcp_not_connected"}};try{let a=await s.callTool(e,r.name,{args:i,timeoutMs:this.serverCallTimeouts.get(e)??w});return Le(a)}catch(a){let l=a instanceof Error?a.message:String(a);return{content:[{type:"text",text:`MCP tool error: ${l}`}],details:{error:l}}}}}}wrapToolsForWorkspaceBoundary(e){return this.workspaceRoot?e.map(r=>{if(!r.execute)return r;let o=r.execute;return{...r,execute:async(n,i,s)=>{let a=$e(r.name,i,this.workspaceRoot);return a?{content:[{type:"text",text:a}],details:{type:"mcp",error:"workspace_boundary"}}:o(n,i,s)}}}):e}injectPortableTools(e,r){let o=this.wrapToolsForWorkspaceBoundary(r.map(n=>this.toPortableTool(e,n)));this.registerTools(o);for(let n of o)this.injectedNames.add(n.name);return o}retractServerTools(e){let r=`mcp__${B(e)}__`;for(let o of[...this.injectedNames])o.startsWith(r)&&(this.removeRegisteredTool(o),this.injectedNames.delete(o))}registerTools(e){this.toolCatalog?this.toolCatalog.addTools(e):U(e)}removeRegisteredTool(e){return this.toolCatalog?.removeTool(e)??q(e)}};function Le(t){let e=t&&typeof t=="object"?t:{},o=(Array.isArray(e.content)?e.content:[]).filter(a=>!!a&&typeof a=="object"),n=o.filter(a=>a.type==="text"&&typeof a.text=="string").map(a=>a.text),i=o.filter(a=>!(a.type==="text"&&typeof a.text=="string")).map(a=>typeof a.type=="string"&&a.type?a.type:"unknown"),s=n.join(`
|
|
5
5
|
`);if(i.length>0){let a=[...new Set(i)].join(", ");s=s?`${s}
|
|
6
6
|
|
|
7
7
|
[${i.length} non-text blocks omitted: ${a}]`:`[output contains only non-text blocks: ${a}]`}return{content:[{type:"text",text:s||"(no text output)"}],...e.isError?{details:{error:"mcp_tool_error"}}:{}}}function B(t){return t.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}var Oe=/(?:^|_)(path|paths|file|files|filename|filenames|dir|dirs|directory|directories|folder|folders|cwd|root|uri)(?:$|_)/i;function $e(t,e,r){if(!r)return null;for(let o of k(e)){let n=Ue(o.value,r);if(n&&!qe(n.candidate,n.root,n.pathApi))return`Blocked: MCP tool "${t}" path "${o.value}" is outside the workspace boundary "${n.root}"`}return null}function k(t,e="",r=0){if(r>8)return[];if(typeof t=="string")return Ne(e,t)?[{key:e,value:t}]:[];if(Array.isArray(t))return t.flatMap(n=>k(n,e,r+1));if(!t||typeof t!="object")return[];let o=[];for(let[n,i]of Object.entries(t))o.push(...k(i,n,r+1));return o}function Ne(t,e){if(!Oe.test(t))return!1;let r=e.trim();return!r||/^https?:\/\//i.test(r)?!1:Fe(r)}function Fe(t){return m.isAbsolute(t)||/^[A-Za-z]:[\\/]/.test(t)||/^\\\\/.test(t)||/^file:\/\//i.test(t)||t.includes("../")||t.includes("..\\")||t.startsWith(".\\")||t.startsWith("./")||t.includes("/")||t.includes("\\")}function Ue(t,e){let r=t.trim();if(/^file:\/\//i.test(r))try{r=Re(r)}catch{return null}let o=H(r)||H(e)?m.win32:m,n=o.resolve(e);return{candidate:o.isAbsolute(r)?o.resolve(r):o.resolve(n,r),root:n,pathApi:o}}function qe(t,e,r){let o=r.relative(e,t);return o===""||!o.startsWith("..")&&!r.isAbsolute(o)}function H(t){return/^[A-Za-z]:[\\/]/.test(t)||/^\\\\/.test(t)}function Q(t){if(!t||typeof t!="object")return[];let e=t,r=[],o=e.mcpServers??e.servers??e;for(let[n,i]of Object.entries(o)){if(!i||typeof i!="object")continue;let s=i;if(typeof s.url=="string"){r.push({name:n,type:"http",url:s.url,headers:s.headers&&typeof s.headers=="object"?s.headers:void 0,disabled:s.disabled===!0,oauth:s.oauth===!0,tools:V(s.tools),callTimeoutMs:typeof s.callTimeoutMs=="number"?s.callTimeoutMs:void 0});continue}typeof s.command=="string"&&r.push({name:n,type:"stdio",command:s.command,args:Array.isArray(s.args)?s.args:void 0,env:s.env&&typeof s.env=="object"?s.env:void 0,cwd:typeof s.cwd=="string"?s.cwd:void 0,disabled:s.disabled===!0,oauth:s.oauth===!0,tools:V(s.tools),callTimeoutMs:typeof s.callTimeoutMs=="number"?s.callTimeoutMs:void 0})}return r}function J(t,e){let r=new Set(e?.include??[]),o=new Set(e?.exclude??[]);return t.filter(n=>r.size>0&&!r.has(n.name)?!1:!o.has(n.name))}function V(t){if(!t||typeof t!="object")return;let e=t,r=K(e.include),o=K(e.exclude);if(!(!r&&!o))return{...r?{include:r}:{},...o?{exclude:o}:{}}}function K(t){if(!Array.isArray(t))return;let e=t.filter(r=>typeof r=="string"&&r.trim().length>0);return e.length>0?e:void 0}var Ge=new Set(["bash","sh","zsh","fish","cmd","cmd.exe","powershell","powershell.exe","pwsh","pwsh.exe"]),ze=new Set(["-c","/c","-command","-encodedcommand","-e"]),We=["curl","wget","invokewebrequest","invoke-restmethod","iwr","irm","nc","netcat"],Be=["env","processenv","apikey","api_key","token","secret","credential","credentials","awsaccesskey","awssecret"],He=["authorizedkeys","sshknownhosts","crontab","launchctl","schtasks","startup","runkey","runonce","bashrc","profile"],Je=/\bssh-(?:rsa|ed25519|ecdsa-[^\s]+)\s+[A-Za-z0-9+/=]{40,}/i;function Ve(t){let e=[],r=[t.command??"",...t.args??[],...Object.keys(t.env??{}),...Object.values(t.env??{})].join(`
|
|
8
|
-
`);if(Je.test(r)&&e.push({code:"ioc_public_key",message:"configuration contains an inline SSH public key IOC"}),(t.type??(t.url?"http":"stdio"))!=="stdio"||!Ke(t.command))return e;let o=Qe(t.args??[]);if(!o)return e;let n=Ye(o);return T(n,He)&&e.push({code:"persistence",message:"stdio shell command attempts a persistence write"}),T(n,We)&&T(n,Be)&&e.push({code:"dangerous_egress",message:"stdio shell command combines network egress with likely secret access"}),e}function Ke(t){if(!t)return!1;let e=m.basename(t).toLowerCase();return Ge.has(e)}function Qe(t){for(let e=0;e<t.length;e++){let r=t[e]?.toLowerCase();if(r&&ze.has(r))return t.slice(e+1).join(" ")}return""}function Ye(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"")}function T(t,e){return e.some(r=>t.includes(r))}var tt=[{name:"skills_list",description:"List AstraClaw skills active for the current workspace.",inputSchema:{type:"object",properties:{},additionalProperties:!1}},{name:"skill_view",description:"Read the full SKILL.md instructions for one AstraClaw skill.",inputSchema:{type:"object",properties:{name:{type:"string",description:"Skill name from skills_list."}},required:["name"],additionalProperties:!1}},{name:"mcp_connectors_list",description:"List MCP connector tools installed in AstraClaw's Plugins page and shared with this external agent.",inputSchema:{type:"object",properties:{},additionalProperties:!1}},{name:"mcp_tool_call",description:"Call one AstraClaw shared MCP connector tool by toolName from mcp_connectors_list.",inputSchema:{type:"object",properties:{toolName:{type:"string",description:"Connector tool name, for example mcp__filesystem__read_text_file."},args:{type:"object",description:"Arguments for the connector tool."}},required:["toolName"],additionalProperties:!1}}],
|
|
8
|
+
`);if(Je.test(r)&&e.push({code:"ioc_public_key",message:"configuration contains an inline SSH public key IOC"}),(t.type??(t.url?"http":"stdio"))!=="stdio"||!Ke(t.command))return e;let o=Qe(t.args??[]);if(!o)return e;let n=Ye(o);return T(n,He)&&e.push({code:"persistence",message:"stdio shell command attempts a persistence write"}),T(n,We)&&T(n,Be)&&e.push({code:"dangerous_egress",message:"stdio shell command combines network egress with likely secret access"}),e}function Ke(t){if(!t)return!1;let e=m.basename(t).toLowerCase();return Ge.has(e)}function Qe(t){for(let e=0;e<t.length;e++){let r=t[e]?.toLowerCase();if(r&&ze.has(r))return t.slice(e+1).join(" ")}return""}function Ye(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"")}function T(t,e){return e.some(r=>t.includes(r))}var tt=[{name:"skills_list",description:"List AstraClaw skills active for the current workspace.",inputSchema:{type:"object",properties:{},additionalProperties:!1}},{name:"skill_view",description:"Read the full SKILL.md instructions for one AstraClaw skill.",inputSchema:{type:"object",properties:{name:{type:"string",description:"Skill name from skills_list."}},required:["name"],additionalProperties:!1}},{name:"mcp_connectors_list",description:"List MCP connector tools installed in AstraClaw's Plugins page and shared with this external agent.",inputSchema:{type:"object",properties:{},additionalProperties:!1}},{name:"mcp_tool_call",description:"Call one AstraClaw shared MCP connector tool by toolName from mcp_connectors_list.",inputSchema:{type:"object",properties:{toolName:{type:"string",description:"Connector tool name, for example mcp__filesystem__read_text_file."},args:{type:"object",description:"Arguments for the connector tool."}},required:["toolName"],additionalProperties:!1}}],_=class{tools=new Map;findTool(e){return this.tools.get(e)}getToolManifest(){return Array.from(this.tools.values()).map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.parameters}}))}getToolNames(){return Array.from(this.tools.keys())}setTools(e){this.tools.clear(),this.addTools(e)}addTool(e){this.tools.set(e.name,e)}addTools(e){for(let r of e)this.addTool(r)}removeTool(e){return this.tools.delete(e)}},c=null,rt=Ze({input:process.stdin,crlfDelay:Number.POSITIVE_INFINITY});rt.on("line",t=>{ot(t)});async function ot(t){let e=t.trim();if(!e)return;let r;try{r=JSON.parse(e)}catch{return}if(r.id===void 0||r.id===null)return r.method==="notifications/initialized",void 0;try{let o=await nt(r);Z({jsonrpc:"2.0",id:r.id,result:o})}catch(o){Z({jsonrpc:"2.0",id:r.id,error:{code:-32603,message:o instanceof Error?o.message:String(o)}})}}async function nt(t){switch(t.method){case"initialize":return{protocolVersion:"2024-11-05",capabilities:{tools:{}},serverInfo:{name:L,version:"1.0.0"}};case"tools/list":return{tools:tt};case"tools/call":{let e=Y(t.params),r=typeof e.name=="string"?e.name:"",o=Y(e.arguments),n=st(),i=r==="mcp_connectors_list"||r==="mcp_tool_call"?await it(n):void 0,s=await O({tool:r,args:o,projectRoot:n,toolCatalog:i,mcpServerFailures:i?c?.manager?.getFailedServers():void 0});if(!s.handled)throw new Error(`Unknown tool: ${r}`);return{content:[{type:"text",text:JSON.stringify(s.result)}]}}default:throw new Error(`Unknown method: ${t.method}`)}}function st(){return process.env.ASTRACLAW_PROJECT_ROOT||process.env.QLOGICAGENT_PROJECT_ROOT||process.cwd()}async function it(t){if(c?.projectRoot===t)return await c.ready,c.catalog;c?.manager?.disconnectAll().catch(()=>{});let e=new _,r=new h({servers:at(),workspaceRoot:t,toolCatalog:e,log:{info:n=>process.stderr.write(`${n}
|
|
9
9
|
`),warn:n=>process.stderr.write(`${n}
|
|
10
10
|
`)}}),o=r.connectAll().then(()=>r.injectTools());return c={projectRoot:t,catalog:e,manager:r,ready:o},await o,e}function at(){let t=process.env.ASTRACLAW_MCP_CONFIG_PATH||C();if(!Xe(t))return[];try{let e=et(t,"utf8").replace(/^\uFEFF/,"");return Q(JSON.parse(e))}catch(e){return process.stderr.write(`[astraclaw-native-mcp] failed to read MCP config: ${e instanceof Error?e.message:String(e)}
|
|
11
11
|
`),[]}}function Y(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)?t:{}}function Z(t){process.stdout.write(`${JSON.stringify(t)}
|
|
@@ -46,6 +46,10 @@ export interface AcpSessionHost {
|
|
|
46
46
|
sessionState: SessionState | null;
|
|
47
47
|
cancelIdleDreamTimer(): void;
|
|
48
48
|
disposeSessionRuntime?(): void;
|
|
49
|
+
/** Dispose only the named canonical session's MCP manager and tool overlay. */
|
|
50
|
+
disposeSessionMcp?(sessionId: string): Promise<void>;
|
|
51
|
+
/** Bind async turn work to a canonical session without consulting a mutable process-global pointer. */
|
|
52
|
+
runInSessionScope?<T>(sessionId: string, action: () => Promise<T>): Promise<T>;
|
|
49
53
|
enableIdleDream(): void;
|
|
50
54
|
ensureDefaultProject(): void | Promise<void>;
|
|
51
55
|
initializeHostProjectAuthority?(): Promise<void>;
|
|
@@ -36,8 +36,11 @@ export interface AgentRuntimeBootstrapDeps {
|
|
|
36
36
|
agentClient: CliAgentClient;
|
|
37
37
|
toolCatalog: ToolCatalog;
|
|
38
38
|
currentMcpManager: McpManager | null;
|
|
39
|
+
currentMcpReady: Promise<void>;
|
|
40
|
+
currentMcpConfigKey: string;
|
|
39
41
|
setMcpManager(manager: McpManager | null): void;
|
|
40
42
|
setMcpReady(ready: Promise<void>): void;
|
|
43
|
+
setMcpConfigKey(configKey: string): void;
|
|
41
44
|
setPluginLoader(loader: PluginLoader): void;
|
|
42
45
|
getPluginSkills(): ReturnType<PluginLoader["getPluginSkills"]>;
|
|
43
46
|
getAcpPermissionSession(): {
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import type { HookRegistry } from "../contracts/hooks.js";
|
|
2
|
-
import type { MemoryDreamRuntimeProvider, MemoryHandlerProvider, PermissionMetadataResolver } from "../runtime/ports/index.js";
|
|
2
|
+
import type { MemoryDreamRuntimeProvider, MemoryHandlerProvider, PermissionMetadataResolver, ToolCatalog } from "../runtime/ports/index.js";
|
|
3
3
|
import type { McpManager } from "../skills/mcp/mcp-manager.js";
|
|
4
4
|
import type { PluginLoader } from "../skills/plugins/plugin-loader.js";
|
|
5
5
|
import type { AgentRuntimeBootstrapResult, FileWatcher } from "./agent-runtime-bootstrap.js";
|
|
6
6
|
export declare class AgentRuntimeSessionState {
|
|
7
7
|
currentHooks: HookRegistry | null;
|
|
8
|
-
|
|
9
|
-
mcpReady: Promise<void>;
|
|
8
|
+
private readonly mcpBySession;
|
|
10
9
|
pluginLoader: PluginLoader | null;
|
|
11
10
|
permissionChecker: PermissionMetadataResolver | null;
|
|
12
11
|
permissionUnregister: (() => void) | null;
|
|
@@ -18,7 +17,16 @@ export declare class AgentRuntimeSessionState {
|
|
|
18
17
|
applyBootstrap(result: AgentRuntimeBootstrapResult): void;
|
|
19
18
|
resetAfterSessionDispose(): void;
|
|
20
19
|
stopFileWatcher(): void;
|
|
21
|
-
|
|
20
|
+
getMcpToolCatalog(sessionId: string, baseCatalog: ToolCatalog): ToolCatalog;
|
|
21
|
+
getMcpManager(sessionId: string): McpManager | null;
|
|
22
|
+
setMcpManager(sessionId: string, baseCatalog: ToolCatalog, manager: McpManager | null): void;
|
|
23
|
+
getMcpReady(sessionId: string): Promise<void>;
|
|
24
|
+
setMcpReady(sessionId: string, baseCatalog: ToolCatalog, ready: Promise<void>): void;
|
|
25
|
+
getMcpConfigKey(sessionId: string): string;
|
|
26
|
+
setMcpConfigKey(sessionId: string, baseCatalog: ToolCatalog, configKey: string): void;
|
|
27
|
+
disconnectMcp(sessionId: string): Promise<void>;
|
|
28
|
+
disconnectAllMcp(): Promise<void>;
|
|
22
29
|
unregisterPermissions(): void;
|
|
23
30
|
resetMemoryProviders(): void;
|
|
31
|
+
private ensureMcpSession;
|
|
24
32
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface IndustrialRuntimeArchiveInput {
|
|
2
|
+
archivePath: string;
|
|
3
|
+
targetDir: string;
|
|
4
|
+
runtimeId: string;
|
|
5
|
+
version: string;
|
|
6
|
+
entrypoint: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ValidatedIndustrialRuntimePackage {
|
|
9
|
+
runtimeId: string;
|
|
10
|
+
version: string;
|
|
11
|
+
entrypoint: string;
|
|
12
|
+
signedFiles: string[];
|
|
13
|
+
}
|
|
14
|
+
export declare function extractIndustrialRuntimeArchive(input: IndustrialRuntimeArchiveInput): Promise<ValidatedIndustrialRuntimePackage>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
interface ActiveRuntimeEntry {
|
|
2
|
+
version: string;
|
|
3
|
+
entrypoint: string;
|
|
4
|
+
}
|
|
5
|
+
export interface ValidatedActiveIndustrialRuntime extends ActiveRuntimeEntry {
|
|
6
|
+
absoluteEntrypoint: string;
|
|
7
|
+
}
|
|
8
|
+
type ActiveFileWriter = (filePath: string, data: string | Buffer) => Promise<void>;
|
|
9
|
+
export interface IndustrialRuntimeStoreOptions {
|
|
10
|
+
rootDir?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ActivateIndustrialRuntimeInput extends IndustrialRuntimeStoreOptions {
|
|
13
|
+
stagingDir: string;
|
|
14
|
+
runtimeId: string;
|
|
15
|
+
version: string;
|
|
16
|
+
entrypoint: string;
|
|
17
|
+
writeActiveFile?: ActiveFileWriter;
|
|
18
|
+
}
|
|
19
|
+
export declare function industrialRuntimeRoot(): string;
|
|
20
|
+
export declare function createIndustrialRuntimeStaging(options?: IndustrialRuntimeStoreOptions): Promise<string>;
|
|
21
|
+
export declare function activateIndustrialRuntime(input: ActivateIndustrialRuntimeInput): Promise<{
|
|
22
|
+
versionDir: string;
|
|
23
|
+
entrypoint: string;
|
|
24
|
+
}>;
|
|
25
|
+
export declare function runtimeEntrypoint(runtimeId: string, options?: IndustrialRuntimeStoreOptions): Promise<string | undefined>;
|
|
26
|
+
export declare function activeIndustrialRuntime(runtimeId: string, options?: IndustrialRuntimeStoreOptions): Promise<ValidatedActiveIndustrialRuntime | undefined>;
|
|
27
|
+
export declare function runtimePathEntries(options?: IndustrialRuntimeStoreOptions): Promise<string[]>;
|
|
28
|
+
export declare function assertIndustrialRuntimeVersion(version: string): void;
|
|
29
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { McpManager } from "../skills/mcp/mcp-manager.js";
|
|
1
|
+
import { McpManager, type McpManagerConfig } from "../skills/mcp/mcp-manager.js";
|
|
2
2
|
import type { RuntimeLogger } from "../runtime/hooks/hook-registry.js";
|
|
3
3
|
import type { PathService, ToolCatalog } from "../runtime/ports/index.js";
|
|
4
4
|
export interface McpBootstrapDeps {
|
|
@@ -8,8 +8,13 @@ export interface McpBootstrapDeps {
|
|
|
8
8
|
pathService: PathService;
|
|
9
9
|
toolCatalog: ToolCatalog;
|
|
10
10
|
currentManager: McpManager | null;
|
|
11
|
+
currentReady?: Promise<void>;
|
|
12
|
+
currentConfigKey?: string;
|
|
11
13
|
setManager(manager: McpManager | null): void;
|
|
12
14
|
setReady(ready: Promise<void>): void;
|
|
15
|
+
setConfigKey?(configKey: string): void;
|
|
16
|
+
/** Test seam around the concrete mcporter-backed manager; production uses McpManager. */
|
|
17
|
+
createManager?(config: McpManagerConfig): McpManager;
|
|
13
18
|
}
|
|
14
19
|
export declare const mcpToolRegistrationModule: import("../runtime/ports/tool-contracts.js").ToolRegistrationModule<McpBootstrapDeps>;
|
|
15
20
|
export declare function configureMcpBootstrap(deps: McpBootstrapDeps): void;
|
|
@@ -17,3 +22,8 @@ export declare function buildMcpBootstrapEntries(params: {
|
|
|
17
22
|
turnMcpConfig?: unknown;
|
|
18
23
|
projectRoot: string;
|
|
19
24
|
}): import("../skills/mcp/mcp-manager.js").McpServerEntry[];
|
|
25
|
+
/** In-memory-only identity for deciding whether one canonical session can retain its manager. */
|
|
26
|
+
export declare function buildMcpBootstrapConfigKey(params: {
|
|
27
|
+
turnMcpConfig?: unknown;
|
|
28
|
+
projectRoot: string;
|
|
29
|
+
}): string;
|
|
@@ -28,6 +28,11 @@ export interface ResolvedAgentSnapshot {
|
|
|
28
28
|
baseUrl: string;
|
|
29
29
|
configKey: string;
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* ToolInvoker captures a session overlay at Agent construction, so equal provider/model settings
|
|
33
|
+
* are not sufficient for reuse across canonical sessions in one pooled process.
|
|
34
|
+
*/
|
|
35
|
+
export declare function buildSessionAgentConfigKey(sessionId: string, resolvedConfigKey: string, mcpConfigKey?: string): string;
|
|
31
36
|
export declare class ResolvedAgentCache {
|
|
32
37
|
agent: Agent | null;
|
|
33
38
|
transport: LLMTransport | null;
|
|
@@ -42,6 +47,8 @@ export declare class ResolvedAgentCache {
|
|
|
42
47
|
store(snapshot: ResolvedAgentSnapshot): void;
|
|
43
48
|
/** Drop only the Agent + config key — force re-resolve, keep the last snapshot. */
|
|
44
49
|
forgetAgent(): void;
|
|
50
|
+
/** Drop the derived Agent only when it belongs to the retired canonical session. */
|
|
51
|
+
forgetSession(sessionId: string): void;
|
|
45
52
|
/** Wipe ALL derived state — the resolved client is stale (registry change). */
|
|
46
53
|
invalidate(): void;
|
|
47
54
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type VerifyAuthenticodeInput } from "./windows-authenticode.js";
|
|
1
2
|
/**
|
|
2
3
|
* Vetted runtime-dependency catalog for community skills.
|
|
3
4
|
*
|
|
@@ -26,13 +27,13 @@ export interface RuntimeDependencySpec {
|
|
|
26
27
|
*/
|
|
27
28
|
quick: boolean;
|
|
28
29
|
/** Honest size estimate surfaced in the consent card. */
|
|
29
|
-
estSizeMB
|
|
30
|
-
|
|
31
|
-
hubBinary: HubBinaryInstall;
|
|
30
|
+
estSizeMB?: number;
|
|
31
|
+
install: RuntimeInstallMode;
|
|
32
32
|
installTimeoutMs: number;
|
|
33
33
|
docsUrl?: string;
|
|
34
34
|
}
|
|
35
|
-
export interface
|
|
35
|
+
export interface UserBinaryInstall {
|
|
36
|
+
kind: "user-binary";
|
|
36
37
|
/** Resolve id for the Hub (GET /api/v15/runtime/:id/resolve?platform=…). */
|
|
37
38
|
resourceId: string;
|
|
38
39
|
/** Absolute path the per-platform binary is written to (matches upstream layout). */
|
|
@@ -41,7 +42,17 @@ export interface HubBinaryInstall {
|
|
|
41
42
|
pathDir(): string;
|
|
42
43
|
/** chmod 0o755 after writing (POSIX). */
|
|
43
44
|
posixExecutable: boolean;
|
|
45
|
+
/** Verified release archives expose exactly one executable entry per host family. */
|
|
46
|
+
archiveEntries?: {
|
|
47
|
+
win32: string;
|
|
48
|
+
default: string;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export interface AstraClawPrivateZipInstall {
|
|
52
|
+
kind: "astraclaw-private-zip";
|
|
53
|
+
runtimeId: string;
|
|
44
54
|
}
|
|
55
|
+
export type RuntimeInstallMode = UserBinaryInstall | AstraClawPrivateZipInstall;
|
|
45
56
|
export declare const RUNTIME_DEPENDENCIES: Record<string, RuntimeDependencySpec>;
|
|
46
57
|
export interface RuntimeDependencyStatus {
|
|
47
58
|
id: string;
|
|
@@ -58,20 +69,34 @@ export interface RuntimeDependencyStatus {
|
|
|
58
69
|
}
|
|
59
70
|
/** Resolved download for a hub-binary runtime (signed URL + integrity metadata). */
|
|
60
71
|
export interface ResolvedRuntimeBinary {
|
|
72
|
+
id: string;
|
|
73
|
+
platform: string;
|
|
61
74
|
version: string;
|
|
62
75
|
downloadUrl: string;
|
|
63
76
|
/** sha256 hex digest — the integrity anchor verified before placing the file. */
|
|
64
77
|
checksum: string;
|
|
65
78
|
sizeBytes: number;
|
|
79
|
+
format: "executable" | "zip" | "tar.gz";
|
|
80
|
+
entrypoint?: string;
|
|
66
81
|
}
|
|
82
|
+
export type RuntimeExecFile = (file: string, args: string[], options: {
|
|
83
|
+
timeout: number;
|
|
84
|
+
windowsHide: boolean;
|
|
85
|
+
encoding: "utf8";
|
|
86
|
+
}, callback: (error: Error | null, stdout: string, stderr: string) => void) => unknown;
|
|
67
87
|
export interface RuntimeInstallDeps {
|
|
68
88
|
/** Resolve a hub-binary runtime via the Hub (community client). */
|
|
69
89
|
resolveBinary(id: string, platform: string): Promise<ResolvedRuntimeBinary>;
|
|
70
90
|
/** Injectable for tests. */
|
|
71
91
|
fetchFn?: typeof fetch;
|
|
92
|
+
hostPlatform?: string;
|
|
93
|
+
hostArch?: string;
|
|
94
|
+
rootDir?: string;
|
|
95
|
+
verifyAuthenticodeFiles?: (input: VerifyAuthenticodeInput) => Promise<void>;
|
|
96
|
+
execFileFn?: RuntimeExecFile;
|
|
72
97
|
}
|
|
73
98
|
/** Map this host to the officecli asset platform key (`<os>-<arch>`). */
|
|
74
|
-
export declare function runtimePlatformKey(): string;
|
|
99
|
+
export declare function runtimePlatformKey(platform?: string, architecture?: string): string;
|
|
75
100
|
export declare function probeRuntimeDependency(id: string): Promise<RuntimeDependencyStatus>;
|
|
76
101
|
export interface RuntimeInstallResult {
|
|
77
102
|
id: string;
|
|
@@ -80,3 +105,8 @@ export interface RuntimeInstallResult {
|
|
|
80
105
|
binPath?: string;
|
|
81
106
|
}
|
|
82
107
|
export declare function installRuntimeDependency(id: string, deps: RuntimeInstallDeps): Promise<RuntimeInstallResult>;
|
|
108
|
+
/**
|
|
109
|
+
* Read only the allowlisted executable from a checksum-verified release archive. `tar -xOf`
|
|
110
|
+
* streams the named entry without unpacking sibling files or trusting archive paths.
|
|
111
|
+
*/
|
|
112
|
+
export declare function extractRuntimeArchive(archiveBytes: Buffer, executableEntry: string): Buffer;
|
|
@@ -8,7 +8,7 @@ import type { CliAcpRequestHandlerHost } from "./cli-acp-request-handler.js";
|
|
|
8
8
|
* (`this: any`), so members it touches must be forwarded here explicitly;
|
|
9
9
|
* see TURN_PIPELINE_HOST_MEMBERS for the regression-tested list.
|
|
10
10
|
*/
|
|
11
|
-
export type StdioAcpRequestHostSource = Pick<CliAcpRequestHandlerHost, "activeTurn" | "acpSessionMeta" | "acpSessionMetaBySession" | "currentHooks" | "currentSessionId" | "currentTurnId" | "memoryPrefetchState" | "permissionChecker" | "sessionHistory" | "sessionLlmConfigBySession" | "materializedSessionProfiles" | "sessionState" | "cancelIdleDreamTimer" | "disposeSessionRuntime" | "enableIdleDream" | "ensureDefaultProject" | "initializeHostProjectAuthority" | "ensureModelRegistryHydrated" | "getActiveProjectRoot" | "log" | "sendNotification" | "setActiveWorkdir"> & {
|
|
11
|
+
export type StdioAcpRequestHostSource = Pick<CliAcpRequestHandlerHost, "activeTurn" | "acpSessionMeta" | "acpSessionMetaBySession" | "currentHooks" | "currentSessionId" | "currentTurnId" | "memoryPrefetchState" | "permissionChecker" | "sessionHistory" | "sessionLlmConfigBySession" | "materializedSessionProfiles" | "sessionState" | "cancelIdleDreamTimer" | "disposeSessionRuntime" | "disposeSessionMcp" | "runInSessionScope" | "enableIdleDream" | "ensureDefaultProject" | "initializeHostProjectAuthority" | "ensureModelRegistryHydrated" | "getActiveProjectRoot" | "log" | "sendNotification" | "setActiveWorkdir"> & {
|
|
12
12
|
currentModel: string | undefined;
|
|
13
13
|
lastAssistantMessageForExtract: string | undefined;
|
|
14
14
|
lastUserMessageForAutoExtract: string | undefined;
|
|
@@ -29,7 +29,7 @@ export type StdioAcpRequestHostSource = Pick<CliAcpRequestHandlerHost, "activeTu
|
|
|
29
29
|
} | undefined;
|
|
30
30
|
getHostRequestClient(): Pick<HostRequestClient, "request"> | undefined;
|
|
31
31
|
drainPendingTaskNotifications(): string[];
|
|
32
|
-
resolveAgent(config: unknown): unknown;
|
|
32
|
+
resolveAgent(config: unknown, projectRoot?: string): unknown;
|
|
33
33
|
resolveClientForPurpose(purpose: unknown): unknown;
|
|
34
34
|
sendResponse(id: string | number, result?: unknown, error?: unknown): void;
|
|
35
35
|
};
|
|
@@ -42,7 +42,6 @@ export interface StdioAgentSessionBootstrapDeps {
|
|
|
42
42
|
mediaPersistence: MediaPersistence;
|
|
43
43
|
toolCatalog: ToolCatalog;
|
|
44
44
|
runtimeSession: {
|
|
45
|
-
mcpManager: McpManager | null;
|
|
46
45
|
permissionUnregister: (() => void) | null;
|
|
47
46
|
fileWatcher: FileWatcher | null;
|
|
48
47
|
getPluginSkills(): ReturnType<PluginLoader["getPluginSkills"]>;
|
|
@@ -56,8 +55,12 @@ export interface StdioAgentSessionBootstrapDeps {
|
|
|
56
55
|
ruleEngine: PermissionRuleEnginePort;
|
|
57
56
|
}): void;
|
|
58
57
|
};
|
|
58
|
+
currentMcpManager: McpManager | null;
|
|
59
|
+
currentMcpReady: Promise<void>;
|
|
60
|
+
currentMcpConfigKey: string;
|
|
59
61
|
setMcpManager(manager: McpManager | null): void;
|
|
60
62
|
setMcpReady(ready: Promise<void>): void;
|
|
63
|
+
setMcpConfigKey(configKey: string): void;
|
|
61
64
|
setPluginLoader(loader: PluginLoader): void;
|
|
62
65
|
setFileWatcher(watcher: FileWatcher | null): void;
|
|
63
66
|
getAcpPermissionSession(): {
|
|
@@ -50,6 +50,8 @@ export declare class StdioServer {
|
|
|
50
50
|
private transport;
|
|
51
51
|
private readonly runtimeServices;
|
|
52
52
|
private readonly runtimeSession;
|
|
53
|
+
/** Canonical ACP session captured for the full async turn; never inferred from a mutable pointer. */
|
|
54
|
+
private readonly sessionScope;
|
|
53
55
|
/**
|
|
54
56
|
* DERIVED resolved-agent cache (Agent + LLM client snapshot). The invalidation
|
|
55
57
|
* invariant (full wipe on registry change vs forget-agent on session dispose)
|
|
@@ -107,6 +109,8 @@ export declare class StdioServer {
|
|
|
107
109
|
private get currentBaseUrl();
|
|
108
110
|
get currentSessionId(): string;
|
|
109
111
|
set currentSessionId(v: string);
|
|
112
|
+
private activeScopedSessionId;
|
|
113
|
+
runInSessionScope<T>(sessionId: string, action: () => Promise<T>): Promise<T>;
|
|
110
114
|
get currentTurnId(): string;
|
|
111
115
|
set currentTurnId(v: string);
|
|
112
116
|
/**
|
|
@@ -222,7 +226,7 @@ export declare class StdioServer {
|
|
|
222
226
|
private _taskDistillation;
|
|
223
227
|
get taskDistillation(): TaskDistillationCoordinator;
|
|
224
228
|
ensureTaskDistillation(): TaskDistillationCoordinator;
|
|
225
|
-
resolveAgent(config: TurnConfig): Agent | null;
|
|
229
|
+
resolveAgent(config: TurnConfig, routedProjectRoot?: string): Agent | null;
|
|
226
230
|
private invalidateResolvedLlmCache;
|
|
227
231
|
createDreamHandlerHost(): import("./handlers/dream-handler.js").DreamHandlerHost;
|
|
228
232
|
private createAcpExtendedHandlerHost;
|
|
@@ -254,6 +258,7 @@ export declare class StdioServer {
|
|
|
254
258
|
enableIdleDream(minutes?: number): void;
|
|
255
259
|
cancelIdleDreamTimer(): void;
|
|
256
260
|
disposeSessionRuntime(): void;
|
|
261
|
+
disposeSessionMcp(sessionId: string): Promise<void>;
|
|
257
262
|
/**
|
|
258
263
|
* Initialize the ACP server alongside the legacy protocol.
|
|
259
264
|
* Called once when the host is an ACP-compliant client.
|
|
@@ -22,6 +22,7 @@ export interface LocalCoreToolRegistrationContext {
|
|
|
22
22
|
getCwd(): string;
|
|
23
23
|
activeProjectRoot(): string;
|
|
24
24
|
resolveSandboxConfig(): SandboxConfig | undefined;
|
|
25
|
+
runtimePathEntries(): Promise<string[]>;
|
|
25
26
|
isGroupSecurityMode?(): boolean;
|
|
26
27
|
pathService?: PathService;
|
|
27
28
|
log?: {
|