qlogicagent 2.11.9 → 2.11.10
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/dist/agent.js +6 -6
- package/dist/cli.js +297 -273
- package/dist/index.js +296 -272
- package/dist/protocol.js +1 -1
- package/dist/types/agent/tool-loop/tool-result-events.d.ts +4 -0
- package/dist/types/agent/types.d.ts +1 -1
- package/dist/types/cli/acp-extended-handlers.d.ts +16 -0
- package/dist/types/cli/acp-extended-host-adapter.d.ts +1 -0
- package/dist/types/cli/acp-session-host.d.ts +8 -0
- package/dist/types/cli/agent-config-coordinator.d.ts +1 -0
- package/dist/types/cli/handlers/product-handler.d.ts +2 -0
- package/dist/types/cli/skills-query-service.d.ts +7 -4
- package/dist/types/cli/stdio-server.d.ts +1 -0
- package/dist/types/cli/turn-ask-user-setup.d.ts +15 -0
- package/dist/types/orchestration/solo-evaluator.d.ts +28 -1
- package/dist/types/orchestration/solo-persistence.d.ts +2 -1
- package/dist/types/orchestration/solo-spec-builder.d.ts +48 -0
- package/dist/types/protocol/wire/acp-agent-management.d.ts +39 -0
- package/dist/types/protocol/wire/acp-protocol.d.ts +2 -0
- package/dist/types/runtime/infra/acp-detector.d.ts +9 -0
- package/dist/types/runtime/infra/agent-paths.d.ts +2 -19
- package/dist/types/runtime/infra/default-path-service.d.ts +0 -3
- package/dist/types/runtime/infra/index.d.ts +1 -1
- package/dist/types/runtime/infra/llmrouter-catalog.d.ts +18 -5
- package/dist/types/runtime/infra/migrate-project-skills.d.ts +21 -0
- package/dist/types/runtime/infra/model-registry.d.ts +7 -12
- package/dist/types/runtime/infra/project-skill-manifest.d.ts +28 -0
- package/dist/types/runtime/infra/skill-resolver.d.ts +51 -0
- package/dist/types/runtime/ports/agent-execution-contracts.d.ts +1 -1
- package/dist/types/runtime/ports/path-service.d.ts +0 -3
- package/dist/types/skills/index.d.ts +1 -2
- package/dist/types/skills/skill-system/skill-types.d.ts +0 -59
- package/dist/types/transport/acp-server.d.ts +2 -0
- package/package.json +2 -2
- package/dist/types/runtime/infra/provider-catalog-adapter.d.ts +0 -69
- package/dist/types/skills/skill-system/skill-loader.d.ts +0 -16
package/dist/protocol.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var q=["idle","running-right","running-left","waving","jumping","failed","waiting","running","review"];var Y="1.0.0",d={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},H={REQUEST:"tool.approval.request"};function P(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 I(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&typeof t.method=="string"&&!("id"in t)}function G(e){let t;try{t=JSON.parse(e)}catch{return null}return C(t)||P(t)||I(t)?t:null}import{randomUUID as z}from"node:crypto";var X=["settings.list","settings.get","settings.validate","provider.list","config.get","config.tunables","tools.list","todos.list","tasks.list","agents.list","agents.get","agents.processes","agents.scan","assistants.list","assistants.resolve","session.list","session.get","session.resolve","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"],J=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"]),Q=["memory.","pet.","usage."],$=new Set(["memory.atlas","memory.activity","memory.list","memory.read","memory.search","memory.attachment.locate","memory.attachment.adopt","pet.status"]);function f(e){return J.has(e)?{channel:"task",mutability:"write",defaultTimeoutMs:12e4}:X.some(t=>e===t||e.startsWith(`${t}.`)||e.startsWith(t))?{channel:"query",mutability:"read",defaultTimeoutMs:1e4}:{channel:"task",mutability:"write",defaultTimeoutMs:3e4}}function h(e){return $.has(e)||f(e).mutability==="read"?!1:Q.some(t=>e.startsWith(t))}function Z(e,t={}){let r=t.now??Date.now(),n=f(e),o=t.timeoutMs??n.defaultTimeoutMs;return{requestId:t.requestId??z(),createdAt:r,deadlineAt:r+o,channel:t.channel??n.channel,idempotencyKey:t.idempotencyKey,traceId:t.traceId}}function v(e,t=Date.now()){let r=e.meta;if(!r||typeof r!="object")return{ok:!1,error:{code:d.INVALID_REQUEST,message:"RPC request meta is required."}};if(typeof r.requestId!="string"||r.requestId.length===0)return{ok:!1,error:{code:d.INVALID_REQUEST,message:"RPC request meta.requestId is required."}};if(r.channel!=="query"&&r.channel!=="task")return{ok:!1,error:{code:d.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:d.INVALID_REQUEST,message:"RPC request meta.createdAt is required."}};if(typeof r.deadlineAt!="number"||!Number.isFinite(r.deadlineAt))return{ok:!1,error:{code:d.INVALID_REQUEST,message:"RPC request meta.deadlineAt is required."}};if(r.deadlineAt<=t)return{ok:!1,error:{code:d.REQUEST_DEADLINE_EXCEEDED,message:"RPC request deadline has already expired."}};let n=f(e.method).channel;return r.channel!==n?{ok:!1,error:{code:d.INVALID_REQUEST,message:`RPC request channel mismatch: expected ${n}, got ${r.channel}.`}}:h(e.method)&&(typeof r.idempotencyKey!="string"||r.idempotencyKey.length===0)?{ok:!1,error:{code:d.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=v({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 ee=["agent.health","agent.metrics","agent.cancel","session.list","session.get","session.create","session.update","session.delete","session.deleteAll","session.archive","session.moveToProject","session.getState","session.switchProject","session.getMessages","project.list","project.create","project.delete","project.rename","project.archive","project.unarchive","project.update","project.archiveByGroup","project.purgeAll","instructions.list","instructions.read","instructions.write","instructions.delete","files.list","files.read","files.create","files.rename","files.delete","files.gitStatus","skills.list","assistants.list","assistants.resolve","assistants.cloneBuiltin","assistants.upsert","assistants.create","assistants.update","assistants.delete","assistants.setState","memory.list-files","memory.atlas","memory.activity","memory.observe","memory.propose","memory.consolidate","memory.update","memory.attachment.adopt","memory.attachment.locate"];var M=["turn.start","turn.delta","turn.end","turn.error","turn.recovery","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.plan_update","turn.suggestions","turn.sidechain_started","turn.subagent_delta","turn.sidechain_completed","turn.task_updated","turn.todos_updated","turn.exec_progress","turn.usage_update","team.member.notification","session.info","memory.updated","skills.updated","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"],k=["solo.progress","solo.agentDelta","solo.agentUsage","solo.agentDiff","solo.evaluation","product.taskStarted","product.taskOutput","product.taskCompleted","product.taskFailed","product.budgetUpdate","product.checkpointed","product.dagTopology","plan.interrupted"],te=[...M,...k];var re=1,ne={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"},ie={ABORT:"x/abort",DREAM:"x/dream",AGENTS_LIST:"x/agents.list",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_STATUS:"x/product.status",SOLO_SUBSCRIBE:"x/solo.subscribe",SOLO_MESSAGE:"x/solo.message",SOLO_EVALUATE:"x/solo.evaluate",PRODUCT_SUBSCRIBE:"x/product.subscribe",TEAM_DELEGATE:"x/team.delegate"},x={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"},oe={X_SKILL_INSTRUCTION:"x_skill_instruction",X_SESSION_INFO:"x_session_info",X_RELAY:"x_relay"};function O(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&typeof t.method=="string"&&"id"in t}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 w(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&"id"in t&&!("method"in t)}function se(e){let t;try{t=JSON.parse(e)}catch{return null}return w(t)||O(t)||N(t)?t:null}function ae(e){return Object.values(x).includes(e)}function pe(e){return e.startsWith("x_")}var E=["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 S(e){return e?e.map(t=>({...t})):void 0}function ce(e){return e?[...e]:void 0}function D(e){return[...new Set(e.map(t=>t.trim()).filter(Boolean))].sort((t,r)=>t.localeCompare(r))}function m(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:S(e.workspaceSummaries)}:{}}}function le(e){let{previous:t,update:r}=e;return!(r.syncMode==="diff"&&t&&(!r.baseSnapshotVersion||t.snapshotVersion===r.baseSnapshotVersion))||!t?m(r):{...m(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:S(r.workspaceSummaries)}:{}}}function de(e){return D(e.map(t=>t.name.split(".")[0]??"").filter(Boolean))}function ue(e){return D(e.map(t=>t.id))}function ge(e){let{previous:t,current:r}=e;if(!t)return{...m(r),syncMode:"full"};if(t.snapshotVersion===r.snapshotVersion)return null;let n=E.filter(s=>JSON.stringify(t[s])!==JSON.stringify(r[s]));if(n.length===E.length)return{...m(r),syncMode:"full"};let o={snapshotVersion:r.snapshotVersion,updatedAt:r.updatedAt,syncMode:"diff",baseSnapshotVersion:t.snapshotVersion,changedSections:n,toolNamespaces:[...r.toolNamespaces],workspaceIds:[...r.workspaceIds]},c=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":c[s]=ce(i);break;case"approvalPolicy":c[s]={...i};break;case"workspaceSummaries":c[s]=S(i);break;case"toolManifests":case"skillManifests":case"pluginManifests":case"mcpManifests":c[s]=g(i);break;default:c[s]=i;break}}return o}var me=["web_search","web_fetch","deep_research","browser_execution"],ye=["web-intelligence","browser-execution"],fe=["discovery","read-url","multi-source-research","interactive-browser"],Ae=["stateless","render-backend","interactive-session"],Re=["stateless","stateless-single-step","stateful-session-required"],Ee=["required","conditional","none"],Se=["browser-read","browser-authenticated-read","browser-state-changing"];var _e=["read-page","read-authenticated-page","fill-form","submit-form","download-file","reuse-session"],be=["web_search","web_fetch","deep_research","blocked"],Te=["requires-interaction","requires-login-state","requires-rendered-dom","requires-persistent-session","requires-state-changing-action"],Pe=["none","same-capability-once","degrade-only"];var Ce=["prefetch","sync_turn","on_pre_compress","on_session_end","on_delegation","on_memory_write"],Ie=["turn","sidechain","compress","session-end","agent-remember","auto-extract","implicit-extract","profile-extraction","dream"],he=["observe-only","parent-write","deny"];var ve=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 Me(e){return{...e,assetIds:[...e.assetIds]}}function W(){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 K(e,t){return e.assets[t]}function V(e,t){return e.profiles[t]}function ke(e,t){let r=V(e,t);return r?r.assetIds.map(n=>K(e,n)).filter(n=>!!n):[]}function xe(e,t){return e.assets[t.id]=U(t),F(e)}function _(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 F(e){let t=_(e.assets[a.gatewayImage]),r=_(e.assets[a.whisperModelTiny]);return{...e,gateway:t,whisperModel:r}}function L(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 Oe(e){let t=e&&typeof e=="object"?e:{},r={},n=t.assets&&typeof t.assets=="object"?t.assets:{};for(let[i,p]of Object.entries(n)){if(!p||typeof p!="object")continue;let u=p;!u.id||!Array.isArray(u.artifacts)||(r[i]=U(u))}if(!r[a.gatewayImage]&&t.gateway&&typeof t.gateway=="object"){let i=L(t.gateway,{id:a.gatewayImage,title:"OpenClaw 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=L(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 c={...W()},s=t.profiles&&typeof t.profiles=="object"?t.profiles:{};for(let[i,p]of Object.entries(s)){if(!p||typeof p!="object")continue;let u=p;!u.id||!Array.isArray(u.assetIds)||(c[i]=Me(u))}return F({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:c})}var Ne=["pending","captured","failed","restored"],we=["file","directory","missing"],De=["metadata-only","workspace-copy","shadow-git"];var Le=["api-key","oauth","token","aws-sdk"],Ue=["rate_limit","auth","server_error","timeout","network","unknown"],We=["requiresOpenAiAnthropicToolPayload"];function Ke(e,t){return!e||typeof e!="object"||Array.isArray(e)?!1:e[t]===!0}var j="openai-codex";function A(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=A(e);return t==="volcengine-plan"?"volcengine":t==="qwen-coding"?"qwen":t==="byteplus-plan"?"byteplus":t}var Ve=B,Fe={anthropicToolSchemaMode:"native",anthropicToolChoiceMode:"native",providerFamily:"default",preserveAnthropicThinkingSignatures:!0,openAiCompatTurnValidation:!0,providerThoughtSignatureSanitization:!1,transcriptToolCallIdMode:"default",transcriptToolCallIdModelHints:[],providerThoughtSignatureModelHints:[],dropThinkingBlockModelHints:[]},je={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"},[j]:{providerFamily:"openai"},openrouter:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},opencode:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},kilocode:{providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]}};function b(e,t){let r=(e??"").toLowerCase();return!!r&&t.some(n=>r.includes(n))}function l(e){let t=A(e??"");return{...Fe,...je[t]}}function Be(e){return l(e).preserveAnthropicThinkingSignatures}function qe(e){let t=l(e);return t.anthropicToolSchemaMode!=="native"||t.anthropicToolChoiceMode!=="native"}function Ye(e){return l(e).anthropicToolSchemaMode==="openai-functions"}function He(e){return l(e).anthropicToolChoiceMode==="openai-string-modes"}function Ge(e){return l(e).openAiCompatTurnValidation}function ze(e){return l(e).providerFamily==="openai"}function Xe(e){return l(e).providerFamily==="anthropic"}function Je(e){return b(e.modelId,l(e.provider).dropThinkingBlockModelHints)}function Qe(e){let t=l(e.provider);return t.providerThoughtSignatureSanitization&&b(e.modelId,t.providerThoughtSignatureModelHints)}function $e(e,t){let r=l(e),n=r.transcriptToolCallIdMode;if(n==="strict9")return n;if(b(t,r.transcriptToolCallIdModelHints))return"strict9"}var T={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 Ze(){return[...new Set(Object.values(T).flat())]}function et(e){let t=A(e.provider),r=e.env??process.env,n=new Set(e.appliedEnvKeys??[]),o=i=>{let p=r[i]?.trim();if(!p)return null;let u=n.has(i)?`shell env: ${i}`:`env: ${i}`;return{apiKey:p,source:u}},c=e.resolveSpecialApiKey?.(t,r,n);if(c)return c;let s=T[t];if(!s||s.length===0)return null;for(let i of s){let p=o(i);if(p)return p}return null}export{ie as ACP_EXTENDED_METHODS,oe as ACP_EXTENDED_SESSION_UPDATE_TYPES,ne as ACP_METHODS,re as ACP_PROTOCOL_VERSION,x as ACP_SESSION_UPDATE_TYPES,H as AGENT_RPC_APPROVAL_METHODS,d as AGENT_RPC_ERROR_CODES,Y as AGENT_RPC_PROTOCOL_VERSION,k as AGENT_TEAM_WS_EVENT_NAMES,M as AGENT_WS_EVENT_NAMES,te as ALL_AGENT_WS_EVENT_NAMES,E as CAPABILITY_MANIFEST_DIFF_SECTIONS,ee as GATEWAY_RPC_METHODS,R as GatewayRpcContract,Ce as MEMORY_OBSERVATION_HOOK_VALUES,Ie as MEMORY_OBSERVATION_SOURCE_VALUES,he as MEMORY_WRITE_ACCESS_VALUES,De as MUTATION_CHECKPOINT_BACKEND_VALUES,we as MUTATION_CHECKPOINT_ENTRY_KIND_VALUES,Ne as MUTATION_CHECKPOINT_PHASE_VALUES,q as PETDEX_ANIMATION_IDS,Le as PROVIDER_RUNTIME_AUTH_MODE_VALUES,We as PROVIDER_RUNTIME_COMPAT_FLAG_VALUES,T as PROVIDER_RUNTIME_ENV_API_KEY_CANDIDATES,j as PROVIDER_RUNTIME_OPENAI_CODEX_PROVIDER_ID,Ue as PROVIDER_RUNTIME_VAULT_ERROR_TYPE_VALUES,ve as RESOURCE_MANIFEST_SCHEMA_VERSION,a as RUNTIME_ASSET_IDS,y as RUNTIME_PROFILE_IDS,_e as WEB_ACTION_SCOPE_VALUES,Ee as WEB_APPROVAL_DEFAULT_VALUES,ye as WEB_CAPABILITY_FAMILY_VALUES,me as WEB_CAPABILITY_ID_VALUES,be as WEB_DEGRADATION_TARGET_VALUES,Te as WEB_ESCALATION_REASON_VALUES,Ae as WEB_EXECUTION_MODE_VALUES,Se as WEB_POLICY_RISK_CLASS_VALUES,Pe as WEB_RETRY_POLICY_VALUES,Re as WEB_STATEFULNESS_VALUES,fe as WEB_TASK_MODE_VALUES,Z as buildAgentRpcMeta,f as classifyGatewayRpcMethod,m as cloneCapabilityManifestSnapshot,ge as createCapabilityManifestDiffPayload,W as createDefaultRuntimeResourceProfiles,de as deriveCapabilityToolNamespaces,ue as deriveCapabilityWorkspaceIds,_ as getManifestShortcutEntry,K as getRuntimeResourceAsset,V as getRuntimeResourceProfile,ke as getRuntimeResourceProfileAssets,N as isAcpJsonRpcNotification,O as isAcpJsonRpcRequest,w as isAcpJsonRpcResponse,I as isAgentRpcNotification,P as isAgentRpcRequest,C as isAgentRpcResponse,Xe as isAnthropicProviderRuntimeFamily,pe as isExtendedSessionUpdateType,ze as isOpenAiProviderRuntimeFamily,ae as isStandardSessionUpdateType,Ze as listProviderRuntimeEnvApiKeyNames,le as mergeCapabilityManifestSnapshot,A as normalizeProviderRuntimeId,B as normalizeProviderRuntimeIdForAuth,Oe as normalizeRuntimeResourceManifest,se as parseAcpMessage,G as parseAgentRpcMessage,Be as preservesProviderRuntimeAnthropicThinkingSignatures,Ke as readProviderRuntimeCompatFlag,v as requireGatewayRpcMeta,h as requiresIdempotencyKey,qe as requiresOpenAiCompatibleAnthropicToolPayloadForProviderRuntime,l as resolveProviderRuntimeCapabilities,et as resolveProviderRuntimeEnvApiKey,Ve as resolveProviderRuntimeKeyFamily,$e as resolveProviderRuntimeTranscriptToolCallIdMode,Je as shouldDropThinkingBlocksForProviderRuntimeModel,Qe as shouldSanitizeProviderRuntimeThoughtSignaturesForModel,Ge as supportsOpenAiCompatTurnValidationForProviderRuntime,xe as upsertRuntimeResourceAsset,Ye as usesOpenAiFunctionAnthropicToolSchemaForProviderRuntime,He as usesOpenAiStringModeAnthropicToolChoiceForProviderRuntime};
|
|
1
|
+
var q=["idle","running-right","running-left","waving","jumping","failed","waiting","running","review"];var Y="1.0.0",d={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},H={REQUEST:"tool.approval.request"};function P(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 I(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&typeof t.method=="string"&&!("id"in t)}function G(e){let t;try{t=JSON.parse(e)}catch{return null}return C(t)||P(t)||I(t)?t:null}import{randomUUID as z}from"node:crypto";var X=["settings.list","settings.get","settings.validate","provider.list","config.get","config.tunables","tools.list","todos.list","tasks.list","agents.list","agents.get","agents.processes","agents.scan","assistants.list","assistants.resolve","session.list","session.get","session.resolve","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"],J=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"]),Q=["memory.","pet.","usage."],$=new Set(["memory.atlas","memory.activity","memory.list","memory.read","memory.search","memory.attachment.locate","memory.attachment.adopt","pet.status"]);function f(e){return J.has(e)?{channel:"task",mutability:"write",defaultTimeoutMs:12e4}:X.some(t=>e===t||e.startsWith(`${t}.`)||e.startsWith(t))?{channel:"query",mutability:"read",defaultTimeoutMs:1e4}:{channel:"task",mutability:"write",defaultTimeoutMs:3e4}}function h(e){return $.has(e)||f(e).mutability==="read"?!1:Q.some(t=>e.startsWith(t))}function Z(e,t={}){let r=t.now??Date.now(),n=f(e),o=t.timeoutMs??n.defaultTimeoutMs;return{requestId:t.requestId??z(),createdAt:r,deadlineAt:r+o,channel:t.channel??n.channel,idempotencyKey:t.idempotencyKey,traceId:t.traceId}}function v(e,t=Date.now()){let r=e.meta;if(!r||typeof r!="object")return{ok:!1,error:{code:d.INVALID_REQUEST,message:"RPC request meta is required."}};if(typeof r.requestId!="string"||r.requestId.length===0)return{ok:!1,error:{code:d.INVALID_REQUEST,message:"RPC request meta.requestId is required."}};if(r.channel!=="query"&&r.channel!=="task")return{ok:!1,error:{code:d.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:d.INVALID_REQUEST,message:"RPC request meta.createdAt is required."}};if(typeof r.deadlineAt!="number"||!Number.isFinite(r.deadlineAt))return{ok:!1,error:{code:d.INVALID_REQUEST,message:"RPC request meta.deadlineAt is required."}};if(r.deadlineAt<=t)return{ok:!1,error:{code:d.REQUEST_DEADLINE_EXCEEDED,message:"RPC request deadline has already expired."}};let n=f(e.method).channel;return r.channel!==n?{ok:!1,error:{code:d.INVALID_REQUEST,message:`RPC request channel mismatch: expected ${n}, got ${r.channel}.`}}:h(e.method)&&(typeof r.idempotencyKey!="string"||r.idempotencyKey.length===0)?{ok:!1,error:{code:d.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=v({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 ee=["agent.health","agent.metrics","agent.cancel","session.list","session.get","session.create","session.update","session.delete","session.deleteAll","session.archive","session.moveToProject","session.getState","session.switchProject","session.getMessages","project.list","project.create","project.delete","project.rename","project.archive","project.unarchive","project.update","project.archiveByGroup","project.purgeAll","instructions.list","instructions.read","instructions.write","instructions.delete","files.list","files.read","files.create","files.rename","files.delete","files.gitStatus","skills.list","assistants.list","assistants.resolve","assistants.cloneBuiltin","assistants.upsert","assistants.create","assistants.update","assistants.delete","assistants.setState","memory.list-files","memory.atlas","memory.activity","memory.observe","memory.propose","memory.consolidate","memory.update","memory.attachment.adopt","memory.attachment.locate"];var M=["turn.start","turn.delta","turn.end","turn.error","turn.recovery","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.plan_update","turn.suggestions","turn.sidechain_started","turn.subagent_delta","turn.sidechain_completed","turn.task_updated","turn.todos_updated","turn.exec_progress","turn.usage_update","team.member.notification","session.info","memory.updated","skills.updated","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"],k=["solo.progress","solo.agentDelta","solo.agentUsage","solo.agentDiff","solo.evaluation","product.taskStarted","product.taskOutput","product.taskCompleted","product.taskFailed","product.budgetUpdate","product.checkpointed","product.dagTopology","plan.interrupted"],te=[...M,...k];var re=1,ne={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"},ie={ABORT:"x/abort",DREAM:"x/dream",AGENTS_LIST:"x/agents.list",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_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",PRODUCT_SUBSCRIBE:"x/product.subscribe",TEAM_DELEGATE:"x/team.delegate"},x={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"},oe={X_SKILL_INSTRUCTION:"x_skill_instruction",X_SESSION_INFO:"x_session_info",X_RELAY:"x_relay"};function O(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&typeof t.method=="string"&&"id"in t}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 w(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&"id"in t&&!("method"in t)}function se(e){let t;try{t=JSON.parse(e)}catch{return null}return w(t)||O(t)||N(t)?t:null}function ae(e){return Object.values(x).includes(e)}function pe(e){return e.startsWith("x_")}var E=["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 S(e){return e?e.map(t=>({...t})):void 0}function ce(e){return e?[...e]:void 0}function D(e){return[...new Set(e.map(t=>t.trim()).filter(Boolean))].sort((t,r)=>t.localeCompare(r))}function m(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:S(e.workspaceSummaries)}:{}}}function le(e){let{previous:t,update:r}=e;return!(r.syncMode==="diff"&&t&&(!r.baseSnapshotVersion||t.snapshotVersion===r.baseSnapshotVersion))||!t?m(r):{...m(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:S(r.workspaceSummaries)}:{}}}function de(e){return D(e.map(t=>t.name.split(".")[0]??"").filter(Boolean))}function ue(e){return D(e.map(t=>t.id))}function ge(e){let{previous:t,current:r}=e;if(!t)return{...m(r),syncMode:"full"};if(t.snapshotVersion===r.snapshotVersion)return null;let n=E.filter(s=>JSON.stringify(t[s])!==JSON.stringify(r[s]));if(n.length===E.length)return{...m(r),syncMode:"full"};let o={snapshotVersion:r.snapshotVersion,updatedAt:r.updatedAt,syncMode:"diff",baseSnapshotVersion:t.snapshotVersion,changedSections:n,toolNamespaces:[...r.toolNamespaces],workspaceIds:[...r.workspaceIds]},c=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":c[s]=ce(i);break;case"approvalPolicy":c[s]={...i};break;case"workspaceSummaries":c[s]=S(i);break;case"toolManifests":case"skillManifests":case"pluginManifests":case"mcpManifests":c[s]=g(i);break;default:c[s]=i;break}}return o}var me=["web_search","web_fetch","deep_research","browser_execution"],ye=["web-intelligence","browser-execution"],fe=["discovery","read-url","multi-source-research","interactive-browser"],Ae=["stateless","render-backend","interactive-session"],Re=["stateless","stateless-single-step","stateful-session-required"],Ee=["required","conditional","none"],Se=["browser-read","browser-authenticated-read","browser-state-changing"];var _e=["read-page","read-authenticated-page","fill-form","submit-form","download-file","reuse-session"],be=["web_search","web_fetch","deep_research","blocked"],Te=["requires-interaction","requires-login-state","requires-rendered-dom","requires-persistent-session","requires-state-changing-action"],Pe=["none","same-capability-once","degrade-only"];var Ce=["prefetch","sync_turn","on_pre_compress","on_session_end","on_delegation","on_memory_write"],Ie=["turn","sidechain","compress","session-end","agent-remember","auto-extract","implicit-extract","profile-extraction","dream"],he=["observe-only","parent-write","deny"];var ve=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 Me(e){return{...e,assetIds:[...e.assetIds]}}function W(){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 K(e,t){return e.assets[t]}function V(e,t){return e.profiles[t]}function ke(e,t){let r=V(e,t);return r?r.assetIds.map(n=>K(e,n)).filter(n=>!!n):[]}function xe(e,t){return e.assets[t.id]=U(t),F(e)}function _(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 F(e){let t=_(e.assets[a.gatewayImage]),r=_(e.assets[a.whisperModelTiny]);return{...e,gateway:t,whisperModel:r}}function L(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 Oe(e){let t=e&&typeof e=="object"?e:{},r={},n=t.assets&&typeof t.assets=="object"?t.assets:{};for(let[i,p]of Object.entries(n)){if(!p||typeof p!="object")continue;let u=p;!u.id||!Array.isArray(u.artifacts)||(r[i]=U(u))}if(!r[a.gatewayImage]&&t.gateway&&typeof t.gateway=="object"){let i=L(t.gateway,{id:a.gatewayImage,title:"OpenClaw 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=L(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 c={...W()},s=t.profiles&&typeof t.profiles=="object"?t.profiles:{};for(let[i,p]of Object.entries(s)){if(!p||typeof p!="object")continue;let u=p;!u.id||!Array.isArray(u.assetIds)||(c[i]=Me(u))}return F({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:c})}var Ne=["pending","captured","failed","restored"],we=["file","directory","missing"],De=["metadata-only","workspace-copy","shadow-git"];var Le=["api-key","oauth","token","aws-sdk"],Ue=["rate_limit","auth","server_error","timeout","network","unknown"],We=["requiresOpenAiAnthropicToolPayload"];function Ke(e,t){return!e||typeof e!="object"||Array.isArray(e)?!1:e[t]===!0}var j="openai-codex";function A(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=A(e);return t==="volcengine-plan"?"volcengine":t==="qwen-coding"?"qwen":t==="byteplus-plan"?"byteplus":t}var Ve=B,Fe={anthropicToolSchemaMode:"native",anthropicToolChoiceMode:"native",providerFamily:"default",preserveAnthropicThinkingSignatures:!0,openAiCompatTurnValidation:!0,providerThoughtSignatureSanitization:!1,transcriptToolCallIdMode:"default",transcriptToolCallIdModelHints:[],providerThoughtSignatureModelHints:[],dropThinkingBlockModelHints:[]},je={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"},[j]:{providerFamily:"openai"},openrouter:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},opencode:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},kilocode:{providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]}};function b(e,t){let r=(e??"").toLowerCase();return!!r&&t.some(n=>r.includes(n))}function l(e){let t=A(e??"");return{...Fe,...je[t]}}function Be(e){return l(e).preserveAnthropicThinkingSignatures}function qe(e){let t=l(e);return t.anthropicToolSchemaMode!=="native"||t.anthropicToolChoiceMode!=="native"}function Ye(e){return l(e).anthropicToolSchemaMode==="openai-functions"}function He(e){return l(e).anthropicToolChoiceMode==="openai-string-modes"}function Ge(e){return l(e).openAiCompatTurnValidation}function ze(e){return l(e).providerFamily==="openai"}function Xe(e){return l(e).providerFamily==="anthropic"}function Je(e){return b(e.modelId,l(e.provider).dropThinkingBlockModelHints)}function Qe(e){let t=l(e.provider);return t.providerThoughtSignatureSanitization&&b(e.modelId,t.providerThoughtSignatureModelHints)}function $e(e,t){let r=l(e),n=r.transcriptToolCallIdMode;if(n==="strict9")return n;if(b(t,r.transcriptToolCallIdModelHints))return"strict9"}var T={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 Ze(){return[...new Set(Object.values(T).flat())]}function et(e){let t=A(e.provider),r=e.env??process.env,n=new Set(e.appliedEnvKeys??[]),o=i=>{let p=r[i]?.trim();if(!p)return null;let u=n.has(i)?`shell env: ${i}`:`env: ${i}`;return{apiKey:p,source:u}},c=e.resolveSpecialApiKey?.(t,r,n);if(c)return c;let s=T[t];if(!s||s.length===0)return null;for(let i of s){let p=o(i);if(p)return p}return null}export{ie as ACP_EXTENDED_METHODS,oe as ACP_EXTENDED_SESSION_UPDATE_TYPES,ne as ACP_METHODS,re as ACP_PROTOCOL_VERSION,x as ACP_SESSION_UPDATE_TYPES,H as AGENT_RPC_APPROVAL_METHODS,d as AGENT_RPC_ERROR_CODES,Y as AGENT_RPC_PROTOCOL_VERSION,k as AGENT_TEAM_WS_EVENT_NAMES,M as AGENT_WS_EVENT_NAMES,te as ALL_AGENT_WS_EVENT_NAMES,E as CAPABILITY_MANIFEST_DIFF_SECTIONS,ee as GATEWAY_RPC_METHODS,R as GatewayRpcContract,Ce as MEMORY_OBSERVATION_HOOK_VALUES,Ie as MEMORY_OBSERVATION_SOURCE_VALUES,he as MEMORY_WRITE_ACCESS_VALUES,De as MUTATION_CHECKPOINT_BACKEND_VALUES,we as MUTATION_CHECKPOINT_ENTRY_KIND_VALUES,Ne as MUTATION_CHECKPOINT_PHASE_VALUES,q as PETDEX_ANIMATION_IDS,Le as PROVIDER_RUNTIME_AUTH_MODE_VALUES,We as PROVIDER_RUNTIME_COMPAT_FLAG_VALUES,T as PROVIDER_RUNTIME_ENV_API_KEY_CANDIDATES,j as PROVIDER_RUNTIME_OPENAI_CODEX_PROVIDER_ID,Ue as PROVIDER_RUNTIME_VAULT_ERROR_TYPE_VALUES,ve as RESOURCE_MANIFEST_SCHEMA_VERSION,a as RUNTIME_ASSET_IDS,y as RUNTIME_PROFILE_IDS,_e as WEB_ACTION_SCOPE_VALUES,Ee as WEB_APPROVAL_DEFAULT_VALUES,ye as WEB_CAPABILITY_FAMILY_VALUES,me as WEB_CAPABILITY_ID_VALUES,be as WEB_DEGRADATION_TARGET_VALUES,Te as WEB_ESCALATION_REASON_VALUES,Ae as WEB_EXECUTION_MODE_VALUES,Se as WEB_POLICY_RISK_CLASS_VALUES,Pe as WEB_RETRY_POLICY_VALUES,Re as WEB_STATEFULNESS_VALUES,fe as WEB_TASK_MODE_VALUES,Z as buildAgentRpcMeta,f as classifyGatewayRpcMethod,m as cloneCapabilityManifestSnapshot,ge as createCapabilityManifestDiffPayload,W as createDefaultRuntimeResourceProfiles,de as deriveCapabilityToolNamespaces,ue as deriveCapabilityWorkspaceIds,_ as getManifestShortcutEntry,K as getRuntimeResourceAsset,V as getRuntimeResourceProfile,ke as getRuntimeResourceProfileAssets,N as isAcpJsonRpcNotification,O as isAcpJsonRpcRequest,w as isAcpJsonRpcResponse,I as isAgentRpcNotification,P as isAgentRpcRequest,C as isAgentRpcResponse,Xe as isAnthropicProviderRuntimeFamily,pe as isExtendedSessionUpdateType,ze as isOpenAiProviderRuntimeFamily,ae as isStandardSessionUpdateType,Ze as listProviderRuntimeEnvApiKeyNames,le as mergeCapabilityManifestSnapshot,A as normalizeProviderRuntimeId,B as normalizeProviderRuntimeIdForAuth,Oe as normalizeRuntimeResourceManifest,se as parseAcpMessage,G as parseAgentRpcMessage,Be as preservesProviderRuntimeAnthropicThinkingSignatures,Ke as readProviderRuntimeCompatFlag,v as requireGatewayRpcMeta,h as requiresIdempotencyKey,qe as requiresOpenAiCompatibleAnthropicToolPayloadForProviderRuntime,l as resolveProviderRuntimeCapabilities,et as resolveProviderRuntimeEnvApiKey,Ve as resolveProviderRuntimeKeyFamily,$e as resolveProviderRuntimeTranscriptToolCallIdMode,Je as shouldDropThinkingBlocksForProviderRuntimeModel,Qe as shouldSanitizeProviderRuntimeThoughtSignaturesForModel,Ge as supportsOpenAiCompatTurnValidationForProviderRuntime,xe as upsertRuntimeResourceAsset,Ye as usesOpenAiFunctionAnthropicToolSchemaForProviderRuntime,He as usesOpenAiStringModeAnthropicToolChoiceForProviderRuntime};
|
|
@@ -3,5 +3,9 @@ import type { ToolExecutionResultPort } from "../../runtime/ports/index.js";
|
|
|
3
3
|
type ToolResultEvent = Extract<TurnEvent, {
|
|
4
4
|
type: "tool_result";
|
|
5
5
|
}>;
|
|
6
|
+
type ToolMediaResultEvent = Extract<TurnEvent, {
|
|
7
|
+
type: "media_result";
|
|
8
|
+
}>;
|
|
6
9
|
export declare function createToolResultEvent(turnId: string, result: ToolExecutionResultPort): ToolResultEvent;
|
|
10
|
+
export declare function createToolMediaResultEvents(turnId: string, result: ToolExecutionResultPort): ToolMediaResultEvent[];
|
|
7
11
|
export {};
|
|
@@ -236,7 +236,7 @@ export type TurnEvent = {
|
|
|
236
236
|
} | {
|
|
237
237
|
type: "media_result";
|
|
238
238
|
turnId: string;
|
|
239
|
-
mediaType: "image" | "tts" | "video" | "music";
|
|
239
|
+
mediaType: "image" | "tts" | "video" | "music" | "3d";
|
|
240
240
|
url: string;
|
|
241
241
|
model?: string;
|
|
242
242
|
provider?: string;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SoloSpecChatResult, SoloSpecJudgeResult } from "../protocol/wire/acp-agent-management.js";
|
|
1
2
|
import { type DreamHandlerHost } from "./handlers/dream-handler.js";
|
|
2
3
|
import { type ProductCoordinatorHost } from "./handlers/product-handler.js";
|
|
3
4
|
import { type SoloHandlerHost } from "./handlers/solo-handler.js";
|
|
@@ -12,6 +13,10 @@ export interface AcpExtendedHost extends DreamHandlerHost, SoloHandlerHost, Prod
|
|
|
12
13
|
apiKey: string;
|
|
13
14
|
model: string;
|
|
14
15
|
} | null;
|
|
16
|
+
/** Parked ask_user resolvers, keyed by requestId; resolved by thread.user_response. */
|
|
17
|
+
pendingAskUser: Map<string, {
|
|
18
|
+
resolve: (answers: Record<string, string> | null) => void;
|
|
19
|
+
}>;
|
|
15
20
|
}
|
|
16
21
|
export declare function handleAcpDream(host: AcpExtendedHost, params: {
|
|
17
22
|
sessionId: string;
|
|
@@ -27,6 +32,17 @@ export declare function handleAcpSoloCancel(host: AcpExtendedHost, params: Recor
|
|
|
27
32
|
export declare function handleAcpSoloSubscribe(host: AcpExtendedHost, params: Record<string, unknown>): Promise<unknown>;
|
|
28
33
|
export declare function handleAcpSoloMessage(host: AcpExtendedHost, params: Record<string, unknown>): Promise<unknown>;
|
|
29
34
|
export declare function handleAcpSoloEvaluate(host: AcpExtendedHost, params: Record<string, unknown>): Promise<unknown>;
|
|
35
|
+
/**
|
|
36
|
+
* R3 多轮对话式 spec(x/solo.specChat):每轮带全量 history 跑一次 runSpecChatRound(受限工具
|
|
37
|
+
* ask_user + set_spec,纯推理不改文件)。澄清走 Cut6 的 turn.ask_user/thread.user_response 往返。
|
|
38
|
+
* 成功返回 { reply, spec };LLM/连接级失败降级 { error }(不抛,前端可重发)。
|
|
39
|
+
*/
|
|
40
|
+
export declare function handleAcpSoloSpecChat(host: AcpExtendedHost, params: Record<string, unknown>): Promise<SoloSpecChatResult>;
|
|
41
|
+
/**
|
|
42
|
+
* R3 启动软门防呆(x/solo.specJudge):用 host LLM 一次性评判 spec 是否达可开赛标准。
|
|
43
|
+
* 无 LLM → 降级放行({ ok:true })(软门本就"警告可走")。返回 { ok, issues[] }。
|
|
44
|
+
*/
|
|
45
|
+
export declare function handleAcpSoloSpecJudge(host: AcpExtendedHost, params: Record<string, unknown>): Promise<SoloSpecJudgeResult>;
|
|
30
46
|
export declare function handleAcpAgentsList(host: AcpExtendedHost): Promise<unknown>;
|
|
31
47
|
export declare function handleAcpProductCreate(host: AcpExtendedHost, params: Record<string, unknown>): Promise<unknown>;
|
|
32
48
|
export declare function handleAcpProductPlan(host: AcpExtendedHost, params: Record<string, unknown>): Promise<unknown>;
|
|
@@ -23,6 +23,7 @@ export interface AcpExtendedHostAdapterDeps {
|
|
|
23
23
|
emitAgentStatus(agentId: string, state: string, extra?: AgentStatusExtra): void;
|
|
24
24
|
handleMcpToolCall(memberId: string, toolName: string, args: Record<string, unknown>): Promise<unknown>;
|
|
25
25
|
resolveClientForPurpose: AcpExtendedHost["resolveClientForPurpose"];
|
|
26
|
+
pendingAskUser: AcpExtendedHost["pendingAskUser"];
|
|
26
27
|
}
|
|
27
28
|
export declare function createAcpExtendedHostAdapter(deps: AcpExtendedHostAdapterDeps): AcpExtendedHost;
|
|
28
29
|
export {};
|
|
@@ -18,6 +18,14 @@ export interface AcpSessionHost {
|
|
|
18
18
|
disposeSessionRuntime?(): void;
|
|
19
19
|
enableIdleDream(): void;
|
|
20
20
|
ensureDefaultProject(): void;
|
|
21
|
+
/**
|
|
22
|
+
* Ensure the model-registry catalog (this.models) is hydrated from the owner profile +
|
|
23
|
+
* built-in/llmrouter catalog. A spawned/headless qlogicagent only runs load() (bindings +
|
|
24
|
+
* enabled-overrides) — its catalog is empty, so getActiveModel() returns null and the turn fails
|
|
25
|
+
* "No LLM provider". Awaiting this before a turn resolves the model lets the agent self-resolve its
|
|
26
|
+
* own configured model (idempotent; the promise is cached).
|
|
27
|
+
*/
|
|
28
|
+
ensureModelRegistryHydrated?(): Promise<void>;
|
|
21
29
|
getActiveProjectRoot(): string;
|
|
22
30
|
log(message: string): void;
|
|
23
31
|
setActiveWorkdir(dir: string): void;
|
|
@@ -9,6 +9,8 @@ export interface ProductHandlerHost extends ProductCoordinatorHost {
|
|
|
9
9
|
getActiveProjectRoot(): string;
|
|
10
10
|
sendResponse(id: string | number, result?: unknown, error?: AgentRpcError): void;
|
|
11
11
|
}
|
|
12
|
+
/** productId → 容器项目 id(R2 容器优先,与 solo-handler.soloProjectMap 对称)。终态回写用。 */
|
|
13
|
+
export declare const productProjectMap: Map<string, string>;
|
|
12
14
|
export declare function ensureProductOrchestrator(this: ProductCoordinatorHost): import("../../orchestration/agent-instance.js").ProductOrchestrator;
|
|
13
15
|
export declare function ensureProductPlanner(this: ProductCoordinatorHost): import("../../orchestration/product-planner.js").ProductPlanner;
|
|
14
16
|
/** `product.plan` - Start interactive planning with leader agent. */
|
|
@@ -2,7 +2,9 @@ export interface SkillListEntry {
|
|
|
2
2
|
id: string;
|
|
3
3
|
name: string;
|
|
4
4
|
path: string;
|
|
5
|
+
/** Effective in this project: globally-scoped, or enabled via the project manifest. */
|
|
5
6
|
active: boolean;
|
|
7
|
+
/** Enablement scope (= lifecycle enabledScope). "global" is active everywhere. */
|
|
6
8
|
scope: "project" | "global";
|
|
7
9
|
category: "automation";
|
|
8
10
|
displayName: {
|
|
@@ -19,8 +21,9 @@ export interface SkillListEntry {
|
|
|
19
21
|
version?: string;
|
|
20
22
|
description?: string;
|
|
21
23
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
/**
|
|
25
|
+
* List every skill in the single global store, annotated with its enablement
|
|
26
|
+
* scope and whether it is active in the given project. Name-collisions cannot
|
|
27
|
+
* occur (one directory per name in the store), so each skill appears once.
|
|
28
|
+
*/
|
|
26
29
|
export declare function listSkillsForProject(projectRoot?: string): SkillListEntry[];
|
|
@@ -133,6 +133,7 @@ export declare class StdioServer {
|
|
|
133
133
|
*/
|
|
134
134
|
private ensureMemoryProvider;
|
|
135
135
|
private resolveAgent;
|
|
136
|
+
private invalidateResolvedLlmCache;
|
|
136
137
|
/**
|
|
137
138
|
* Load LLM config from ModelRegistry (textGeneration binding).
|
|
138
139
|
* Returns provider/model/apiKey if found, undefined otherwise.
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { AskUserQuestion } from "../skills/tools/ask-user-tool.js";
|
|
1
2
|
interface PendingAskUserRequest {
|
|
2
3
|
resolve(answers: Record<string, string> | null): void;
|
|
3
4
|
}
|
|
@@ -5,5 +6,19 @@ export interface TurnAskUserSetupHost {
|
|
|
5
6
|
pendingAskUser: Map<string, PendingAskUserRequest>;
|
|
6
7
|
sendNotification(method: string, params: Record<string, unknown>): void;
|
|
7
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* Build the ask_user backend closure: mint a requestId, park its resolver in
|
|
11
|
+
* `host.pendingAskUser`, and emit `turn.ask_user`. The answer is delivered later via
|
|
12
|
+
* `thread.user_response` (handleUserResponse), which resolves the same map entry by requestId.
|
|
13
|
+
*
|
|
14
|
+
* Shared by the turn pipeline (configureTurnAskUser) and the Solo Spec phase
|
|
15
|
+
* (handleAcpSoloSpecChat) so both drive the SAME UI channel. requestId isolation (full UUID) lets a
|
|
16
|
+
* concurrent chat-turn ask and a spec-phase ask coexist in the one shared map without collision.
|
|
17
|
+
*
|
|
18
|
+
* The optional `signal` makes an unanswered ask abortable + self-cleaning: on abort we drop the
|
|
19
|
+
* parked resolver from the map and resolve to null (caller degrades to a best-effort result), so a
|
|
20
|
+
* cancelled/abandoned turn can't leak a map entry or hang the awaiting fork forever.
|
|
21
|
+
*/
|
|
22
|
+
export declare function makeAskUserBackend(host: TurnAskUserSetupHost): (questions: AskUserQuestion[], signal?: AbortSignal) => Promise<Record<string, string> | null>;
|
|
8
23
|
export declare function configureTurnAskUser(host: TurnAskUserSetupHost): void;
|
|
9
24
|
export {};
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
import type { AgentProcessManager } from "../runtime/infra/agent-process.js";
|
|
22
22
|
import type { AcpDetector } from "../runtime/infra/acp-detector.js";
|
|
23
23
|
import type { AgentConfigStore } from "../runtime/infra/agent-config-store.js";
|
|
24
|
-
import type { SoloAgentState, SoloEvaluation, SoloStatus, SoloStartParams, SoloSelectParams } from "../protocol/wire/acp-agent-management.js";
|
|
24
|
+
import type { SoloState, SoloAgentState, SoloEvaluation, SoloStatus, SoloStartParams, SoloSelectParams, SoloSpec } from "../protocol/wire/acp-agent-management.js";
|
|
25
25
|
export interface SoloCallbacks {
|
|
26
26
|
log?: {
|
|
27
27
|
info(msg: string): void;
|
|
@@ -39,7 +39,34 @@ export interface SoloCallbacks {
|
|
|
39
39
|
}[]) => void;
|
|
40
40
|
/** Token usage report after agent completes. */
|
|
41
41
|
onAgentUsage?: (soloId: string, agentId: string, inputTokens: number, outputTokens: number) => void;
|
|
42
|
+
/**
|
|
43
|
+
* Race reached a terminal state WITHOUT an evaluation winner (all agents failed, or cancelled).
|
|
44
|
+
* The success path uses onEvaluation; this lets the host write back the plan project's planStatus
|
|
45
|
+
* (failed/cancelled) so 历史方案 is correct and recovery doesn't restore a dead run.
|
|
46
|
+
*/
|
|
47
|
+
onTerminal?: (soloId: string, state: SoloState) => void;
|
|
42
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Assemble the prompt every competitor receives (Cut4). Shared context (rules/memory) + optional
|
|
51
|
+
* <spec> block, then the body. Body = spec.rawTask when a Spec was built (the task captured during
|
|
52
|
+
* specBuild), else the raw task. With neither sharedConfig nor spec the result is exactly `task`
|
|
53
|
+
* (regression-safe vs the pre-Spec path).
|
|
54
|
+
*/
|
|
55
|
+
export declare function buildEnrichedTask(task: string, sharedConfig: {
|
|
56
|
+
memory?: string[];
|
|
57
|
+
rules?: string[];
|
|
58
|
+
model?: string;
|
|
59
|
+
} | undefined, spec: SoloSpec | undefined): string;
|
|
60
|
+
/**
|
|
61
|
+
* Build the judge prompt (Cut4). When the Spec defines acceptance criteria, the judge scores
|
|
62
|
+
* per-criterion (满足/部分/不满足) instead of a subjective compare. The WINNER:/REASONING: output
|
|
63
|
+
* markers are unchanged so parseEvaluationResponse still works — only the basis of REASONING upgrades.
|
|
64
|
+
*/
|
|
65
|
+
export declare function buildEvaluationPrompt(originalTask: string, spec: SoloSpec | undefined, succeeded: ReadonlyArray<{
|
|
66
|
+
displayId: string;
|
|
67
|
+
resultText?: string;
|
|
68
|
+
diff?: string;
|
|
69
|
+
}>): string;
|
|
43
70
|
export declare class SoloEvaluator {
|
|
44
71
|
private processManager;
|
|
45
72
|
private acpDetector;
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Mirrors the product-persistence.ts pattern.
|
|
6
6
|
*/
|
|
7
7
|
import type { PathService } from "../runtime/ports/index.js";
|
|
8
|
-
import type { SoloState, SoloAgentState, SoloEvaluation } from "../protocol/wire/acp-agent-management.js";
|
|
8
|
+
import type { SoloState, SoloAgentState, SoloEvaluation, SoloSpec } from "../protocol/wire/acp-agent-management.js";
|
|
9
9
|
export interface PersistedSoloState {
|
|
10
10
|
soloId: string;
|
|
11
11
|
state: SoloState;
|
|
@@ -32,6 +32,7 @@ export interface PersistedSoloState {
|
|
|
32
32
|
}>;
|
|
33
33
|
}>;
|
|
34
34
|
evaluation?: SoloEvaluation;
|
|
35
|
+
spec?: SoloSpec;
|
|
35
36
|
createdAt: number;
|
|
36
37
|
}
|
|
37
38
|
export interface SoloPersistenceOptions {
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solo Spec Builder — 小智(qlogicagent)主持的「一轮澄清 + 轻量 spec」过程。
|
|
3
|
+
*
|
|
4
|
+
* 路径选择:走 runForkedAgent(进程内推理 agent,同 team-delegate/dream),而非 solo 竞赛的
|
|
5
|
+
* processManager.spawn(ACP 子进程)。理由:spec 阶段是交互式推理(分析→ask-user 澄清→产 spec),
|
|
6
|
+
* 不改文件、不需 worktree,且需要 ask-user 交互 —— 这正是 runForkedAgent 的场景。
|
|
7
|
+
*
|
|
8
|
+
* 本模块是纯编排:askUser 后端 + ask_user 工具定义由调用方(Cut3 RPC handler)注入,
|
|
9
|
+
* 这样模块本身不依赖全局 ask-user 回调或 toolCatalog。
|
|
10
|
+
*/
|
|
11
|
+
import type { ForkedAgentRunnerFactory } from "../runtime/ports/agent-execution-contracts.js";
|
|
12
|
+
import type { LLMTransport } from "../runtime/ports/index.js";
|
|
13
|
+
import type { ToolDefinition, AgentLogger } from "../agent/types.js";
|
|
14
|
+
import type { SoloSpec } from "../protocol/wire/acp-agent-management.js";
|
|
15
|
+
import { type AskUserQuestion } from "../skills/tools/ask-user-tool.js";
|
|
16
|
+
/** R3 多轮对话式 spec 的单轮入参。history 含到本轮为止的完整对话(末条为用户最新消息)。 */
|
|
17
|
+
export interface SpecChatDeps {
|
|
18
|
+
rawTask: string;
|
|
19
|
+
history: {
|
|
20
|
+
role: "user" | "assistant";
|
|
21
|
+
content: string;
|
|
22
|
+
}[];
|
|
23
|
+
transport: LLMTransport;
|
|
24
|
+
apiKey: string;
|
|
25
|
+
model: string;
|
|
26
|
+
createAgentRunner: ForkedAgentRunnerFactory;
|
|
27
|
+
askUserToolDef: ToolDefinition;
|
|
28
|
+
askUser: (questions: AskUserQuestion[], signal?: AbortSignal) => Promise<Record<string, string> | null>;
|
|
29
|
+
log: AgentLogger;
|
|
30
|
+
parentSignal?: AbortSignal;
|
|
31
|
+
}
|
|
32
|
+
/** R3 多轮对话式 spec:agent 通过此工具产出/更新结构化规格(类比 plan_mode 的 plan 入参)。 */
|
|
33
|
+
export declare const SET_SPEC_TOOL_NAME = "set_spec";
|
|
34
|
+
export declare const SET_SPEC_TOOL_DEF: ToolDefinition;
|
|
35
|
+
/**
|
|
36
|
+
* R3 单轮对话式 spec(无状态:每轮带全量 history 重跑 forked agent)。受限工具 = ask_user + set_spec,
|
|
37
|
+
* 纯推理不改文件(plan-mode 式)。返回本轮自然语言 reply + 最新 SoloSpec(set_spec 未调时回退解析文本)。
|
|
38
|
+
* 失败(LLM/连接级)会抛 —— 由调用方降级。
|
|
39
|
+
*/
|
|
40
|
+
export declare function runSpecChatRound(deps: SpecChatDeps): Promise<{
|
|
41
|
+
reply: string;
|
|
42
|
+
spec: SoloSpec;
|
|
43
|
+
}>;
|
|
44
|
+
/** 解析小智的标记块文本 → SoloSpec。带兜底,绝不抛(降级:goal=rawTask、acceptance 可空)。 */
|
|
45
|
+
export declare function parseSpecResponse(text: string, rawTask: string, clarifications?: {
|
|
46
|
+
question: string;
|
|
47
|
+
answer: string;
|
|
48
|
+
}[]): SoloSpec;
|
|
@@ -180,6 +180,43 @@ export interface SoloEvaluation {
|
|
|
180
180
|
winnerId: string;
|
|
181
181
|
reasoning: string;
|
|
182
182
|
}
|
|
183
|
+
/** Lightweight Spec (design D3): goal + constraints + acceptance, fits one screen. */
|
|
184
|
+
export interface SoloSpec {
|
|
185
|
+
goal: string;
|
|
186
|
+
constraints: string[];
|
|
187
|
+
/** 3-5 checkable acceptance criteria — the evaluate scoring rubric. */
|
|
188
|
+
acceptance: string[];
|
|
189
|
+
/** Original raw task, kept for reference. */
|
|
190
|
+
rawTask: string;
|
|
191
|
+
/** Clarification Q&A trail (optional). */
|
|
192
|
+
clarifications?: {
|
|
193
|
+
question: string;
|
|
194
|
+
answer: string;
|
|
195
|
+
}[];
|
|
196
|
+
}
|
|
197
|
+
/** x/solo.specChat RPC params (R3 多轮对话式 spec)。history 含到本轮为止的完整对话(末条为用户最新消息)。 */
|
|
198
|
+
export interface SoloSpecChatParams {
|
|
199
|
+
rawTask: string;
|
|
200
|
+
history: {
|
|
201
|
+
role: "user" | "assistant";
|
|
202
|
+
content: string;
|
|
203
|
+
}[];
|
|
204
|
+
projectId?: string;
|
|
205
|
+
}
|
|
206
|
+
/** x/solo.specChat RPC result. */
|
|
207
|
+
export interface SoloSpecChatResult {
|
|
208
|
+
reply?: string;
|
|
209
|
+
spec?: SoloSpec;
|
|
210
|
+
error?: string;
|
|
211
|
+
}
|
|
212
|
+
/** x/solo.specJudge RPC params/result(启动软门防呆:judge 最终 spec 质量)。 */
|
|
213
|
+
export interface SoloSpecJudgeParams {
|
|
214
|
+
spec: SoloSpec;
|
|
215
|
+
}
|
|
216
|
+
export interface SoloSpecJudgeResult {
|
|
217
|
+
ok: boolean;
|
|
218
|
+
issues: string[];
|
|
219
|
+
}
|
|
183
220
|
/** solo.start RPC params. */
|
|
184
221
|
export interface SoloStartParams {
|
|
185
222
|
task: string;
|
|
@@ -196,6 +233,8 @@ export interface SoloStartParams {
|
|
|
196
233
|
/** Model override for all agents. */
|
|
197
234
|
model?: string;
|
|
198
235
|
};
|
|
236
|
+
/** Spec from the Spec phase; when present, injected into enrichedTask + persisted + used as evaluate rubric. */
|
|
237
|
+
spec?: SoloSpec;
|
|
199
238
|
}
|
|
200
239
|
/** solo.status / solo.cancel / solo.select RPC params. */
|
|
201
240
|
export interface SoloIdParams {
|
|
@@ -35,6 +35,8 @@ export declare const ACP_EXTENDED_METHODS: {
|
|
|
35
35
|
readonly SOLO_SUBSCRIBE: "x/solo.subscribe";
|
|
36
36
|
readonly SOLO_MESSAGE: "x/solo.message";
|
|
37
37
|
readonly SOLO_EVALUATE: "x/solo.evaluate";
|
|
38
|
+
readonly SOLO_SPEC_CHAT: "x/solo.specChat";
|
|
39
|
+
readonly SOLO_SPEC_JUDGE: "x/solo.specJudge";
|
|
38
40
|
readonly PRODUCT_SUBSCRIBE: "x/product.subscribe";
|
|
39
41
|
readonly TEAM_DELEGATE: "x/team.delegate";
|
|
40
42
|
};
|
|
@@ -105,4 +105,13 @@ export declare class AcpDetector {
|
|
|
105
105
|
* Returns null if the agent is not available.
|
|
106
106
|
*/
|
|
107
107
|
buildExternalDescriptor(agentId: string): import("../../protocol/wire/acp-agent-management.js").ExternalAgentDescriptor | null;
|
|
108
|
+
/**
|
|
109
|
+
* Whether an agent is ready to compete in Solo/Product: installed/available AND configured.
|
|
110
|
+
* qlogicagent self-resolves from the owner profile (always ready). External agents need a usable
|
|
111
|
+
* ACP descriptor (installed) and, for key-auth backends, the key env resolved (configured by the
|
|
112
|
+
* user on the welcome page). Used by the 启动 pre-check so a race never starts with an agent that
|
|
113
|
+
* would fail its turn ("No LLM provider"/auth). Does NOT verify the key is *valid* — that's only
|
|
114
|
+
* known at runtime.
|
|
115
|
+
*/
|
|
116
|
+
isAgentReady(agentId: string): boolean;
|
|
108
117
|
}
|
|
@@ -51,8 +51,8 @@ export declare function getProjectAgentDir(cwd: string): string;
|
|
|
51
51
|
export declare function getProjectWorkflowsDir(cwd: string): string;
|
|
52
52
|
/** `<cwd>/.qlogicagent/plugins/` */
|
|
53
53
|
export declare function getProjectPluginsDir(cwd: string): string;
|
|
54
|
-
/** `<cwd>/.qlogicagent/skills
|
|
55
|
-
export declare function
|
|
54
|
+
/** `<cwd>/.qlogicagent/skills-enabled.json` — per-project skill enablement manifest. */
|
|
55
|
+
export declare function getProjectSkillManifestPath(cwd: string): string;
|
|
56
56
|
/** `<cwd>/.qlogicagent/settings.json` */
|
|
57
57
|
export declare function getProjectSettingsPath(cwd: string): string;
|
|
58
58
|
/** `<cwd>/.qlogicagent/INSTRUCTIONS.md` */
|
|
@@ -67,20 +67,3 @@ export declare function getProjectSessionDir(cwd: string, sessionId: string): st
|
|
|
67
67
|
export declare function getProjectCheckpointsDir(cwd: string, sessionId?: string): string;
|
|
68
68
|
/** `<gitRoot>/.qlogicagent/hooks/` */
|
|
69
69
|
export declare function getGitRootHooksDir(gitRoot: string): string;
|
|
70
|
-
/**
|
|
71
|
-
* Discover all known project directories from the project store.
|
|
72
|
-
* Used for cross-project skill recall (read-only, never writes to foreign projects).
|
|
73
|
-
*
|
|
74
|
-
* NOTE: Does NOT import project-store directly to avoid circular deps.
|
|
75
|
-
* Caller must pass the project list.
|
|
76
|
-
*
|
|
77
|
-
* @param projectDirs - All known project workspace directories
|
|
78
|
-
* @param excludeCwd - Current project cwd to exclude from results
|
|
79
|
-
* @returns Array of absolute paths to project roots that have skill directories
|
|
80
|
-
*/
|
|
81
|
-
export declare function getKnownProjectDirs(projectDirs: string[], excludeCwd?: string): string[];
|
|
82
|
-
/**
|
|
83
|
-
* Get skill directories from all known projects (excluding current).
|
|
84
|
-
* Returns paths to `<project>/.qlogicagent/skills/` for recall-only access.
|
|
85
|
-
*/
|
|
86
|
-
export declare function getAllProjectSkillDirs(projectDirs: string[], excludeCwd?: string): string[];
|
|
@@ -27,11 +27,8 @@ export declare class DefaultPathService implements PathService {
|
|
|
27
27
|
getProjectAgentDir(projectRoot?: string): string;
|
|
28
28
|
getProjectSettingsPath(projectRoot?: string): string;
|
|
29
29
|
getProjectInstructionsPath(projectRoot?: string): string;
|
|
30
|
-
getProjectSkillsDir(projectRoot?: string): string;
|
|
31
30
|
getProjectPluginsDir(projectRoot?: string): string;
|
|
32
31
|
getProjectRulesDir(projectRoot?: string): string;
|
|
33
32
|
getProjectSessionsRoot(projectRoot?: string): string;
|
|
34
|
-
getKnownProjectDirs(projectDirs: string[], excludeCwd?: string): string[];
|
|
35
|
-
getAllProjectSkillDirs(projectDirs: string[], excludeCwd?: string): string[];
|
|
36
33
|
}
|
|
37
34
|
export declare function getDefaultPathService(): PathService;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { AGENT_DOT_DIR, getUserAgentHome, getUserCredentialsPath, getUserPluginsDir, getUserSkillsDir, getUserSettingsPath, getUserCacheDir, getUserDebugLogsDir, getUserPluginCacheDir, getUserMcpConfigPath, getUserMarketplaceConfigPath, getUserAssistantPresetsPath, getUserWorkflowsDir, getProjectAgentDir, getProjectWorkflowsDir, getProjectPluginsDir,
|
|
1
|
+
export { AGENT_DOT_DIR, getUserAgentHome, getUserCredentialsPath, getUserPluginsDir, getUserSkillsDir, getUserSettingsPath, getUserCacheDir, getUserDebugLogsDir, getUserPluginCacheDir, getUserMcpConfigPath, getUserMarketplaceConfigPath, getUserAssistantPresetsPath, getUserWorkflowsDir, getProjectAgentDir, getProjectWorkflowsDir, getProjectPluginsDir, getProjectSkillManifestPath, getProjectSettingsPath, getProjectInstructionsPath, getProjectRulesDir, getGitRootHooksDir, } from "./agent-paths.js";
|
|
2
2
|
export { getBudgetContinuationMessage } from "./token-budget.js";
|
|
3
3
|
export { type SecureStorage, saveApiKey, loadApiKey } from "./secure-storage.js";
|
|
4
4
|
export { ProjectInstructionsStore, type InstructionFile } from "./project-instructions-store.js";
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import type { ModelEntry, ModelRegistry } from "./model-registry.js";
|
|
1
|
+
import type { ModelEntry, ModelRegistry, ReasoningMode } from "./model-registry.js";
|
|
2
2
|
import type { ConfigPort } from "../ports/index.js";
|
|
3
3
|
export declare const LLMROUTER_CATALOG_UNAVAILABLE_MESSAGE = "\u65E0\u6CD5\u8FDE\u63A5 llmrouter \u6A21\u578B\u76EE\u5F55";
|
|
4
4
|
export declare const LLMROUTER_PROVIDER_ID = "llmrouter";
|
|
5
5
|
export declare const LLMROUTER_PROVIDER_NAME = "LLMRouter";
|
|
6
|
+
interface CatalogFetchOptions {
|
|
7
|
+
force?: boolean;
|
|
8
|
+
}
|
|
6
9
|
export declare class LlmrouterCatalogUnavailableError extends Error {
|
|
7
10
|
constructor(message?: string);
|
|
8
11
|
}
|
|
@@ -43,21 +46,31 @@ export interface LlmrouterCatalogModel {
|
|
|
43
46
|
maxOutput?: number;
|
|
44
47
|
stream_required?: boolean;
|
|
45
48
|
streamRequired?: boolean;
|
|
49
|
+
tool_call?: boolean;
|
|
50
|
+
toolCall?: boolean;
|
|
51
|
+
reasoning_mode?: ReasoningMode;
|
|
52
|
+
reasoningMode?: ReasoningMode;
|
|
53
|
+
media_type?: string | null;
|
|
54
|
+
mediaType?: string | null;
|
|
46
55
|
capabilities?: string[];
|
|
47
56
|
pricing?: Record<string, unknown>;
|
|
48
57
|
}
|
|
49
58
|
export declare function getLlmrouterBaseUrl(configPort?: ConfigPort): string;
|
|
50
59
|
export declare function getLlmrouterModelsUrl(baseUrl: string): string;
|
|
51
|
-
export declare function listLlmrouterCatalogProviders(configPort?: ConfigPort): Promise<LlmrouterCatalogProvider[]>;
|
|
52
|
-
export declare function listLlmrouterCatalogModels(configPort?: ConfigPort): Promise<LlmrouterCatalogModel[]>;
|
|
60
|
+
export declare function listLlmrouterCatalogProviders(configPort?: ConfigPort, options?: CatalogFetchOptions): Promise<LlmrouterCatalogProvider[]>;
|
|
61
|
+
export declare function listLlmrouterCatalogModels(configPort?: ConfigPort, options?: CatalogFetchOptions): Promise<LlmrouterCatalogModel[]>;
|
|
53
62
|
export declare function listLlmrouterModelsByApiKey(baseUrl: string, apiKey: string): Promise<LlmrouterCatalogModel[]>;
|
|
54
63
|
export declare function providerDisplayName(provider: LlmrouterCatalogProvider): string;
|
|
55
64
|
export declare function providerBaseUrl(provider: LlmrouterCatalogProvider): string | undefined;
|
|
56
|
-
export declare function getLlmrouterCatalogProvider(providerId: string, configPort?: ConfigPort): Promise<LlmrouterCatalogProvider | null>;
|
|
57
|
-
export declare function refreshRegistryFromLlmrouterCatalog(registry: ModelRegistry, configPort?: ConfigPort): Promise<ModelEntry[]>;
|
|
65
|
+
export declare function getLlmrouterCatalogProvider(providerId: string, configPort?: ConfigPort, options?: CatalogFetchOptions): Promise<LlmrouterCatalogProvider | null>;
|
|
66
|
+
export declare function refreshRegistryFromLlmrouterCatalog(registry: ModelRegistry, configPort?: ConfigPort, options?: CatalogFetchOptions): Promise<ModelEntry[]>;
|
|
58
67
|
export declare function refreshRegistryFromLlmrouterApiKey(registry: ModelRegistry, options: {
|
|
59
68
|
baseUrl: string;
|
|
60
69
|
apiKey: string;
|
|
70
|
+
configPort?: ConfigPort;
|
|
71
|
+
forceCatalog?: boolean;
|
|
61
72
|
}): Promise<ModelEntry[]>;
|
|
73
|
+
export declare function resetLlmrouterCatalogClientCache(): void;
|
|
62
74
|
export declare function toModelEntry(model: LlmrouterCatalogModel): ModelEntry | null;
|
|
63
75
|
export declare function toModelEntries(model: LlmrouterCatalogModel): ModelEntry[];
|
|
76
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One-shot migration: fold legacy per-project skill directories
|
|
3
|
+
* (`<projectRoot>/.qlogicagent/skills/<name>/`) into the single global store,
|
|
4
|
+
* marking them project-scoped and enabling them in the originating project.
|
|
5
|
+
*
|
|
6
|
+
* Idempotent — a no-op once the legacy directory is gone, so it is safe to call
|
|
7
|
+
* on every project activation. Conflict-safe — if a DIFFERENT skill of the same
|
|
8
|
+
* name already exists in the store, the legacy copy is LEFT IN PLACE with a loud
|
|
9
|
+
* warning and never silently overwritten.
|
|
10
|
+
*/
|
|
11
|
+
export interface SkillMigrationResult {
|
|
12
|
+
migrated: string[];
|
|
13
|
+
conflicts: string[];
|
|
14
|
+
/** Already present in the store with identical content; legacy copy reconciled. */
|
|
15
|
+
reconciled: string[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Migrate one project's legacy skills into the global store. Best-effort and
|
|
19
|
+
* idempotent. Returns a summary of what happened.
|
|
20
|
+
*/
|
|
21
|
+
export declare function migrateProjectSkills(projectRoot: string): SkillMigrationResult;
|