qlogicagent 2.10.46 → 2.10.47

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/protocol.js CHANGED
@@ -1 +1 @@
1
- var q="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},Y={REQUEST:"tool.approval.request",RESPONSE:"tool.approval.response"};function b(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 H(e){let t;try{t=JSON.parse(e)}catch{return null}return C(t)||b(t)||I(t)?t:null}import{randomUUID as X}from"node:crypto";var G=["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"],z=new Set(["thread.turn","memory.dream","memory.propose","memory.consolidate","media.stt","pet.forge","solo.start","solo.evaluate","product.plan","product.create","product.message"]),J=["memory.","pet.","usage."],Q=new Set(["memory.atlas","memory.activity","memory.list","memory.read","memory.search","pet.status"]);function f(e){return z.has(e)?{channel:"task",mutability:"write",defaultTimeoutMs:e==="thread.turn"?3e5:12e4}:G.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 Q.has(e)||f(e).mutability==="read"?!1:J.some(t=>e.startsWith(t))}function $(e,t={}){let r=t.now??Date.now(),n=f(e),i=t.timeoutMs??n.defaultTimeoutMs;return{requestId:t.requestId??X(),createdAt:r,deadlineAt:r+i,channel:t.channel??n.channel,idempotencyKey:t.idempotencyKey,traceId:t.traceId}}function h(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}.`}}:v(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=h({method:t,meta:r},this.now());if(!n.ok)return this.counters.invalidRequests+=1,{status:"rejected",error:n.error};if(r.idempotencyKey){let i=this.idempotency.get(r.idempotencyKey);if(i)return this.counters.dedupedRequests+=1,i.error?{status:"deduped",error:i.error}:{status:"deduped",result:i.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 i=this.active.get(t);return i?(this.active.delete(t),i.cancelled?(this.counters.lateResponsesDropped+=1,{accepted:!1,reason:"cancelled"}):i.meta.deadlineAt<=this.now()?(this.counters.deadlineExceededRequests+=1,this.counters.lateResponsesDropped+=1,{accepted:!1,reason:"deadline_exceeded"}):(this.counters.completedRequests+=1,i.meta.idempotencyKey&&this.idempotency.set(i.meta.idempotencyKey,{result:r,error:n,settledAt:this.now()}),{accepted:!0})):{accepted:!1,reason:"unknown"}}metrics(){return{activeRequests:this.active.size,...this.counters}}};var Z=["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"];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.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.forged","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"],ee=[...M,...k];var te=1,re={INITIALIZE:"initialize",SESSION_NEW:"session/new",SESSION_PROMPT:"session/prompt",SESSION_END:"session/end",SESSION_SET_CONFIG:"session/set_config_option",SESSION_SET_MODEL:"session/set_model",SESSION_SET_MODE:"session/set_mode",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"},ne={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={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"},oe={X_SUBAGENT_STARTED:"x_subagent_started",X_SUBAGENT_DELTA:"x_subagent_delta",X_SUBAGENT_ENDED:"x_subagent_ended",X_MEDIA_RESULT:"x_media_result",X_MEDIA_PROGRESS:"x_media_progress",X_SKILL_INSTRUCTION:"x_skill_instruction",X_RECOVERY:"x_recovery",X_SIDECHAIN_STARTED:"x_sidechain_started",X_SIDECHAIN_COMPLETED:"x_sidechain_completed",X_SUGGESTIONS:"x_suggestions",X_ASK_USER:"x_ask_user",X_SESSION_INFO:"x_session_info",X_MEMORY_UPDATED:"x_memory_updated",X_TEAM_MEMBER_UPDATE:"x_team_member_update",X_SOLO_STARTED:"x_solo_started",X_SOLO_AGENT_FINISHED:"x_solo_agent_finished",X_SOLO_SELECTED:"x_solo_selected",X_PRODUCT_TASK_STARTED:"x_product_task_started",X_PRODUCT_TASK_COMPLETED:"x_product_task_completed",X_PRODUCT_CHECKPOINT:"x_product_checkpoint"};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 D(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&"id"in t&&!("method"in t)}function ie(e){let t;try{t=JSON.parse(e)}catch{return null}return D(t)||O(t)||N(t)?t:null}function se(e){return Object.values(x).includes(e)}function ae(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 _(e){return e?e.map(t=>({...t})):void 0}function pe(e){return e?[...e]:void 0}function w(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:_(e.workspaceSummaries)}:{}}}function ce(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:_(r.workspaceSummaries)}:{}}}function le(e){return w(e.map(t=>t.name.split(".")[0]??"").filter(Boolean))}function de(e){return w(e.map(t=>t.id))}function ue(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 i={snapshotVersion:r.snapshotVersion,updatedAt:r.updatedAt,syncMode:"diff",baseSnapshotVersion:t.snapshotVersion,changedSections:n,toolNamespaces:[...r.toolNamespaces],workspaceIds:[...r.workspaceIds]},c=i;for(let s of n){let o=r[s];if(o!==void 0)switch(s){case"toolNamespaces":case"workspaceIds":case"installedCapabilities":case"enabledCapabilities":case"features":c[s]=pe(o);break;case"approvalPolicy":c[s]={...o};break;case"workspaceSummaries":c[s]=_(o);break;case"toolManifests":case"skillManifests":case"pluginManifests":case"mcpManifests":c[s]=g(o);break;default:c[s]=o;break}}return i}var ge=["web_search","web_fetch","deep_research","browser_execution"],me=["web-intelligence","browser-execution"],ye=["discovery","read-url","multi-source-research","interactive-browser"],fe=["stateless","render-backend","interactive-session"],Ae=["stateless","stateless-single-step","stateful-session-required"],Re=["required","conditional","none"],Ee=["browser-read","browser-authenticated-read","browser-state-changing"];var _e=["read-page","read-authenticated-page","fill-form","submit-form","download-file","reuse-session"],Se=["web_search","web_fetch","deep_research","blocked"],Pe=["requires-interaction","requires-login-state","requires-rendered-dom","requires-persistent-session","requires-state-changing-action"],Te=["none","same-capability-once","degrade-only"];var be=["prefetch","sync_turn","on_pre_compress","on_session_end","on_delegation","on_memory_write"],Ce=["turn","sidechain","compress","session-end","agent-remember","auto-extract","implicit-extract","profile-extraction","dream"],Ie=["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 L(e){return{...e,artifacts:e.artifacts.map(t=>({...t}))}}function he(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 W(e,t){return e.assets[t]}function V(e,t){return e.profiles[t]}function Me(e,t){let r=V(e,t);return r?r.assetIds.map(n=>W(e,n)).filter(n=>!!n):[]}function ke(e,t){return e.assets[t.id]=L(t),F(e)}function S(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=S(e.assets[a.gatewayImage]),r=S(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 xe(e){let t=e&&typeof e=="object"?e:{},r={},n=t.assets&&typeof t.assets=="object"?t.assets:{};for(let[o,p]of Object.entries(n)){if(!p||typeof p!="object")continue;let u=p;!u.id||!Array.isArray(u.artifacts)||(r[o]=L(u))}if(!r[a.gatewayImage]&&t.gateway&&typeof t.gateway=="object"){let o=U(t.gateway,{id:a.gatewayImage,title:"OpenClaw Gateway Image (Desktop Slim)",kind:"container-image",delivery:"remote",platform:"any",description:"Desktop Docker mode gateway image."});o&&(r[o.id]=o)}if(!r[a.whisperModelTiny]&&t.whisperModel&&typeof t.whisperModel=="object"){let o=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."});o&&(r[o.id]=o)}let c={...K()},s=t.profiles&&typeof t.profiles=="object"?t.profiles:{};for(let[o,p]of Object.entries(s)){if(!p||typeof p!="object")continue;let u=p;!u.id||!Array.isArray(u.assetIds)||(c[o]=he(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 Oe=["pending","captured","failed","restored"],Ne=["file","directory","missing"],De=["metadata-only","workspace-copy","shadow-git"];var we=["api-key","oauth","token","aws-sdk"],Ue=["rate_limit","auth","server_error","timeout","network","unknown"],Le=["requiresOpenAiAnthropicToolPayload"];function Ke(e,t){return!e||typeof e!="object"||Array.isArray(e)?!1:e[t]===!0}var B="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 j(e){let t=A(e);return t==="volcengine-plan"?"volcengine":t==="qwen-coding"?"qwen":t==="byteplus-plan"?"byteplus":t}var We=j,Ve={anthropicToolSchemaMode:"native",anthropicToolChoiceMode:"native",providerFamily:"default",preserveAnthropicThinkingSignatures:!0,openAiCompatTurnValidation:!0,providerThoughtSignatureSanitization:!1,transcriptToolCallIdMode:"default",transcriptToolCallIdModelHints:[],providerThoughtSignatureModelHints:[],dropThinkingBlockModelHints:[]},Fe={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"},[B]:{providerFamily:"openai"},openrouter:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},opencode:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},kilocode:{providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]}};function P(e,t){let r=(e??"").toLowerCase();return!!r&&t.some(n=>r.includes(n))}function l(e){let t=A(e??"");return{...Ve,...Fe[t]}}function Be(e){return l(e).preserveAnthropicThinkingSignatures}function je(e){let t=l(e);return t.anthropicToolSchemaMode!=="native"||t.anthropicToolChoiceMode!=="native"}function qe(e){return l(e).anthropicToolSchemaMode==="openai-functions"}function Ye(e){return l(e).anthropicToolChoiceMode==="openai-string-modes"}function He(e){return l(e).openAiCompatTurnValidation}function Xe(e){return l(e).providerFamily==="openai"}function Ge(e){return l(e).providerFamily==="anthropic"}function ze(e){return P(e.modelId,l(e.provider).dropThinkingBlockModelHints)}function Je(e){let t=l(e.provider);return t.providerThoughtSignatureSanitization&&P(e.modelId,t.providerThoughtSignatureModelHints)}function Qe(e,t){let r=l(e),n=r.transcriptToolCallIdMode;if(n==="strict9")return n;if(P(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 $e(){return[...new Set(Object.values(T).flat())]}function Ze(e){let t=A(e.provider),r=e.env??process.env,n=new Set(e.appliedEnvKeys??[]),i=o=>{let p=r[o]?.trim();if(!p)return null;let u=n.has(o)?`shell env: ${o}`:`env: ${o}`;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 o of s){let p=i(o);if(p)return p}return null}export{ne as ACP_EXTENDED_METHODS,oe as ACP_EXTENDED_SESSION_UPDATE_TYPES,re as ACP_METHODS,te as ACP_PROTOCOL_VERSION,x as ACP_SESSION_UPDATE_TYPES,Y as AGENT_RPC_APPROVAL_METHODS,d as AGENT_RPC_ERROR_CODES,q as AGENT_RPC_PROTOCOL_VERSION,k as AGENT_TEAM_WS_EVENT_NAMES,M as AGENT_WS_EVENT_NAMES,ee as ALL_AGENT_WS_EVENT_NAMES,E as CAPABILITY_MANIFEST_DIFF_SECTIONS,Z as GATEWAY_RPC_METHODS,R as GatewayRpcContract,be as MEMORY_OBSERVATION_HOOK_VALUES,Ce as MEMORY_OBSERVATION_SOURCE_VALUES,Ie as MEMORY_WRITE_ACCESS_VALUES,De as MUTATION_CHECKPOINT_BACKEND_VALUES,Ne as MUTATION_CHECKPOINT_ENTRY_KIND_VALUES,Oe as MUTATION_CHECKPOINT_PHASE_VALUES,we as PROVIDER_RUNTIME_AUTH_MODE_VALUES,Le as PROVIDER_RUNTIME_COMPAT_FLAG_VALUES,T as PROVIDER_RUNTIME_ENV_API_KEY_CANDIDATES,B 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,Re as WEB_APPROVAL_DEFAULT_VALUES,me as WEB_CAPABILITY_FAMILY_VALUES,ge as WEB_CAPABILITY_ID_VALUES,Se as WEB_DEGRADATION_TARGET_VALUES,Pe as WEB_ESCALATION_REASON_VALUES,fe as WEB_EXECUTION_MODE_VALUES,Ee as WEB_POLICY_RISK_CLASS_VALUES,Te as WEB_RETRY_POLICY_VALUES,Ae as WEB_STATEFULNESS_VALUES,ye as WEB_TASK_MODE_VALUES,$ as buildAgentRpcMeta,f as classifyGatewayRpcMethod,m as cloneCapabilityManifestSnapshot,ue as createCapabilityManifestDiffPayload,K as createDefaultRuntimeResourceProfiles,le as deriveCapabilityToolNamespaces,de as deriveCapabilityWorkspaceIds,S as getManifestShortcutEntry,W as getRuntimeResourceAsset,V as getRuntimeResourceProfile,Me as getRuntimeResourceProfileAssets,N as isAcpJsonRpcNotification,O as isAcpJsonRpcRequest,D as isAcpJsonRpcResponse,I as isAgentRpcNotification,b as isAgentRpcRequest,C as isAgentRpcResponse,Ge as isAnthropicProviderRuntimeFamily,ae as isExtendedSessionUpdateType,Xe as isOpenAiProviderRuntimeFamily,se as isStandardSessionUpdateType,$e as listProviderRuntimeEnvApiKeyNames,ce as mergeCapabilityManifestSnapshot,A as normalizeProviderRuntimeId,j as normalizeProviderRuntimeIdForAuth,xe as normalizeRuntimeResourceManifest,ie as parseAcpMessage,H as parseAgentRpcMessage,Be as preservesProviderRuntimeAnthropicThinkingSignatures,Ke as readProviderRuntimeCompatFlag,h as requireGatewayRpcMeta,v as requiresIdempotencyKey,je as requiresOpenAiCompatibleAnthropicToolPayloadForProviderRuntime,l as resolveProviderRuntimeCapabilities,Ze as resolveProviderRuntimeEnvApiKey,We as resolveProviderRuntimeKeyFamily,Qe as resolveProviderRuntimeTranscriptToolCallIdMode,ze as shouldDropThinkingBlocksForProviderRuntimeModel,Je as shouldSanitizeProviderRuntimeThoughtSignaturesForModel,He as supportsOpenAiCompatTurnValidationForProviderRuntime,ke as upsertRuntimeResourceAsset,qe as usesOpenAiFunctionAnthropicToolSchemaForProviderRuntime,Ye as usesOpenAiStringModeAnthropicToolChoiceForProviderRuntime};
1
+ var q="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},Y={REQUEST:"tool.approval.request",RESPONSE:"tool.approval.response"};function b(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 H(e){let t;try{t=JSON.parse(e)}catch{return null}return C(t)||b(t)||I(t)?t:null}import{randomUUID as X}from"node:crypto";var G=["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"],z=new Set(["thread.turn","memory.dream","memory.propose","memory.consolidate","media.stt","pet.forge","solo.start","solo.evaluate","product.plan","product.create","product.message"]),J=["memory.","pet.","usage."],Q=new Set(["memory.atlas","memory.activity","memory.list","memory.read","memory.search","pet.status"]);function f(e){return z.has(e)?{channel:"task",mutability:"write",defaultTimeoutMs:e==="thread.turn"?3e5:12e4}:G.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 Q.has(e)||f(e).mutability==="read"?!1:J.some(t=>e.startsWith(t))}function $(e,t={}){let r=t.now??Date.now(),n=f(e),i=t.timeoutMs??n.defaultTimeoutMs;return{requestId:t.requestId??X(),createdAt:r,deadlineAt:r+i,channel:t.channel??n.channel,idempotencyKey:t.idempotencyKey,traceId:t.traceId}}function h(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}.`}}:v(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=h({method:t,meta:r},this.now());if(!n.ok)return this.counters.invalidRequests+=1,{status:"rejected",error:n.error};if(r.idempotencyKey){let i=this.idempotency.get(r.idempotencyKey);if(i)return this.counters.dedupedRequests+=1,i.error?{status:"deduped",error:i.error}:{status:"deduped",result:i.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 i=this.active.get(t);return i?(this.active.delete(t),i.cancelled?(this.counters.lateResponsesDropped+=1,{accepted:!1,reason:"cancelled"}):i.meta.deadlineAt<=this.now()?(this.counters.deadlineExceededRequests+=1,this.counters.lateResponsesDropped+=1,{accepted:!1,reason:"deadline_exceeded"}):(this.counters.completedRequests+=1,i.meta.idempotencyKey&&this.idempotency.set(i.meta.idempotencyKey,{result:r,error:n,settledAt:this.now()}),{accepted:!0})):{accepted:!1,reason:"unknown"}}metrics(){return{activeRequests:this.active.size,...this.counters}}};var Z=["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"];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.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.forged","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"],ee=[...M,...k];var te=1,re={INITIALIZE:"initialize",SESSION_NEW:"session/new",SESSION_PROMPT:"session/prompt",SESSION_END:"session/end",SESSION_SET_CONFIG:"session/set_config_option",SESSION_SET_MODEL:"session/set_model",SESSION_SET_MODE:"session/set_mode",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"},ne={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={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"},oe={X_SUBAGENT_STARTED:"x_subagent_started",X_SUBAGENT_DELTA:"x_subagent_delta",X_SUBAGENT_ENDED:"x_subagent_ended",X_MEDIA_RESULT:"x_media_result",X_MEDIA_PROGRESS:"x_media_progress",X_SKILL_INSTRUCTION:"x_skill_instruction",X_RECOVERY:"x_recovery",X_SIDECHAIN_STARTED:"x_sidechain_started",X_SIDECHAIN_COMPLETED:"x_sidechain_completed",X_SUGGESTIONS:"x_suggestions",X_ASK_USER:"x_ask_user",X_SESSION_INFO:"x_session_info",X_MEMORY_UPDATED:"x_memory_updated",X_TEAM_MEMBER_UPDATE:"x_team_member_update",X_SOLO_STARTED:"x_solo_started",X_SOLO_AGENT_FINISHED:"x_solo_agent_finished",X_SOLO_SELECTED:"x_solo_selected",X_PRODUCT_TASK_STARTED:"x_product_task_started",X_PRODUCT_TASK_COMPLETED:"x_product_task_completed",X_PRODUCT_CHECKPOINT:"x_product_checkpoint"};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 D(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&"id"in t&&!("method"in t)}function ie(e){let t;try{t=JSON.parse(e)}catch{return null}return D(t)||O(t)||N(t)?t:null}function se(e){return Object.values(x).includes(e)}function ae(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 _(e){return e?e.map(t=>({...t})):void 0}function pe(e){return e?[...e]:void 0}function w(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:_(e.workspaceSummaries)}:{}}}function ce(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:_(r.workspaceSummaries)}:{}}}function le(e){return w(e.map(t=>t.name.split(".")[0]??"").filter(Boolean))}function de(e){return w(e.map(t=>t.id))}function ue(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 i={snapshotVersion:r.snapshotVersion,updatedAt:r.updatedAt,syncMode:"diff",baseSnapshotVersion:t.snapshotVersion,changedSections:n,toolNamespaces:[...r.toolNamespaces],workspaceIds:[...r.workspaceIds]},c=i;for(let s of n){let o=r[s];if(o!==void 0)switch(s){case"toolNamespaces":case"workspaceIds":case"installedCapabilities":case"enabledCapabilities":case"features":c[s]=pe(o);break;case"approvalPolicy":c[s]={...o};break;case"workspaceSummaries":c[s]=_(o);break;case"toolManifests":case"skillManifests":case"pluginManifests":case"mcpManifests":c[s]=g(o);break;default:c[s]=o;break}}return i}var ge=["web_search","web_fetch","deep_research","browser_execution"],me=["web-intelligence","browser-execution"],ye=["discovery","read-url","multi-source-research","interactive-browser"],fe=["stateless","render-backend","interactive-session"],Ae=["stateless","stateless-single-step","stateful-session-required"],Re=["required","conditional","none"],Ee=["browser-read","browser-authenticated-read","browser-state-changing"];var _e=["read-page","read-authenticated-page","fill-form","submit-form","download-file","reuse-session"],Se=["web_search","web_fetch","deep_research","blocked"],Pe=["requires-interaction","requires-login-state","requires-rendered-dom","requires-persistent-session","requires-state-changing-action"],Te=["none","same-capability-once","degrade-only"];var be=["prefetch","sync_turn","on_pre_compress","on_session_end","on_delegation","on_memory_write"],Ce=["turn","sidechain","compress","session-end","agent-remember","auto-extract","implicit-extract","profile-extraction","dream"],Ie=["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 L(e){return{...e,artifacts:e.artifacts.map(t=>({...t}))}}function he(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 W(e,t){return e.assets[t]}function V(e,t){return e.profiles[t]}function Me(e,t){let r=V(e,t);return r?r.assetIds.map(n=>W(e,n)).filter(n=>!!n):[]}function ke(e,t){return e.assets[t.id]=L(t),F(e)}function S(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=S(e.assets[a.gatewayImage]),r=S(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 xe(e){let t=e&&typeof e=="object"?e:{},r={},n=t.assets&&typeof t.assets=="object"?t.assets:{};for(let[o,p]of Object.entries(n)){if(!p||typeof p!="object")continue;let u=p;!u.id||!Array.isArray(u.artifacts)||(r[o]=L(u))}if(!r[a.gatewayImage]&&t.gateway&&typeof t.gateway=="object"){let o=U(t.gateway,{id:a.gatewayImage,title:"OpenClaw Gateway Image (Desktop Slim)",kind:"container-image",delivery:"remote",platform:"any",description:"Desktop Docker mode gateway image."});o&&(r[o.id]=o)}if(!r[a.whisperModelTiny]&&t.whisperModel&&typeof t.whisperModel=="object"){let o=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."});o&&(r[o.id]=o)}let c={...K()},s=t.profiles&&typeof t.profiles=="object"?t.profiles:{};for(let[o,p]of Object.entries(s)){if(!p||typeof p!="object")continue;let u=p;!u.id||!Array.isArray(u.assetIds)||(c[o]=he(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 Oe=["pending","captured","failed","restored"],Ne=["file","directory","missing"],De=["metadata-only","workspace-copy","shadow-git"];var we=["api-key","oauth","token","aws-sdk"],Ue=["rate_limit","auth","server_error","timeout","network","unknown"],Le=["requiresOpenAiAnthropicToolPayload"];function Ke(e,t){return!e||typeof e!="object"||Array.isArray(e)?!1:e[t]===!0}var B="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 j(e){let t=A(e);return t==="volcengine-plan"?"volcengine":t==="qwen-coding"?"qwen":t==="byteplus-plan"?"byteplus":t}var We=j,Ve={anthropicToolSchemaMode:"native",anthropicToolChoiceMode:"native",providerFamily:"default",preserveAnthropicThinkingSignatures:!0,openAiCompatTurnValidation:!0,providerThoughtSignatureSanitization:!1,transcriptToolCallIdMode:"default",transcriptToolCallIdModelHints:[],providerThoughtSignatureModelHints:[],dropThinkingBlockModelHints:[]},Fe={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"},[B]:{providerFamily:"openai"},openrouter:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},opencode:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},kilocode:{providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]}};function P(e,t){let r=(e??"").toLowerCase();return!!r&&t.some(n=>r.includes(n))}function l(e){let t=A(e??"");return{...Ve,...Fe[t]}}function Be(e){return l(e).preserveAnthropicThinkingSignatures}function je(e){let t=l(e);return t.anthropicToolSchemaMode!=="native"||t.anthropicToolChoiceMode!=="native"}function qe(e){return l(e).anthropicToolSchemaMode==="openai-functions"}function Ye(e){return l(e).anthropicToolChoiceMode==="openai-string-modes"}function He(e){return l(e).openAiCompatTurnValidation}function Xe(e){return l(e).providerFamily==="openai"}function Ge(e){return l(e).providerFamily==="anthropic"}function ze(e){return P(e.modelId,l(e.provider).dropThinkingBlockModelHints)}function Je(e){let t=l(e.provider);return t.providerThoughtSignatureSanitization&&P(e.modelId,t.providerThoughtSignatureModelHints)}function Qe(e,t){let r=l(e),n=r.transcriptToolCallIdMode;if(n==="strict9")return n;if(P(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 $e(){return[...new Set(Object.values(T).flat())]}function Ze(e){let t=A(e.provider),r=e.env??process.env,n=new Set(e.appliedEnvKeys??[]),i=o=>{let p=r[o]?.trim();if(!p)return null;let u=n.has(o)?`shell env: ${o}`:`env: ${o}`;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 o of s){let p=i(o);if(p)return p}return null}export{ne as ACP_EXTENDED_METHODS,oe as ACP_EXTENDED_SESSION_UPDATE_TYPES,re as ACP_METHODS,te as ACP_PROTOCOL_VERSION,x as ACP_SESSION_UPDATE_TYPES,Y as AGENT_RPC_APPROVAL_METHODS,d as AGENT_RPC_ERROR_CODES,q as AGENT_RPC_PROTOCOL_VERSION,k as AGENT_TEAM_WS_EVENT_NAMES,M as AGENT_WS_EVENT_NAMES,ee as ALL_AGENT_WS_EVENT_NAMES,E as CAPABILITY_MANIFEST_DIFF_SECTIONS,Z as GATEWAY_RPC_METHODS,R as GatewayRpcContract,be as MEMORY_OBSERVATION_HOOK_VALUES,Ce as MEMORY_OBSERVATION_SOURCE_VALUES,Ie as MEMORY_WRITE_ACCESS_VALUES,De as MUTATION_CHECKPOINT_BACKEND_VALUES,Ne as MUTATION_CHECKPOINT_ENTRY_KIND_VALUES,Oe as MUTATION_CHECKPOINT_PHASE_VALUES,we as PROVIDER_RUNTIME_AUTH_MODE_VALUES,Le as PROVIDER_RUNTIME_COMPAT_FLAG_VALUES,T as PROVIDER_RUNTIME_ENV_API_KEY_CANDIDATES,B 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,Re as WEB_APPROVAL_DEFAULT_VALUES,me as WEB_CAPABILITY_FAMILY_VALUES,ge as WEB_CAPABILITY_ID_VALUES,Se as WEB_DEGRADATION_TARGET_VALUES,Pe as WEB_ESCALATION_REASON_VALUES,fe as WEB_EXECUTION_MODE_VALUES,Ee as WEB_POLICY_RISK_CLASS_VALUES,Te as WEB_RETRY_POLICY_VALUES,Ae as WEB_STATEFULNESS_VALUES,ye as WEB_TASK_MODE_VALUES,$ as buildAgentRpcMeta,f as classifyGatewayRpcMethod,m as cloneCapabilityManifestSnapshot,ue as createCapabilityManifestDiffPayload,K as createDefaultRuntimeResourceProfiles,le as deriveCapabilityToolNamespaces,de as deriveCapabilityWorkspaceIds,S as getManifestShortcutEntry,W as getRuntimeResourceAsset,V as getRuntimeResourceProfile,Me as getRuntimeResourceProfileAssets,N as isAcpJsonRpcNotification,O as isAcpJsonRpcRequest,D as isAcpJsonRpcResponse,I as isAgentRpcNotification,b as isAgentRpcRequest,C as isAgentRpcResponse,Ge as isAnthropicProviderRuntimeFamily,ae as isExtendedSessionUpdateType,Xe as isOpenAiProviderRuntimeFamily,se as isStandardSessionUpdateType,$e as listProviderRuntimeEnvApiKeyNames,ce as mergeCapabilityManifestSnapshot,A as normalizeProviderRuntimeId,j as normalizeProviderRuntimeIdForAuth,xe as normalizeRuntimeResourceManifest,ie as parseAcpMessage,H as parseAgentRpcMessage,Be as preservesProviderRuntimeAnthropicThinkingSignatures,Ke as readProviderRuntimeCompatFlag,h as requireGatewayRpcMeta,v as requiresIdempotencyKey,je as requiresOpenAiCompatibleAnthropicToolPayloadForProviderRuntime,l as resolveProviderRuntimeCapabilities,Ze as resolveProviderRuntimeEnvApiKey,We as resolveProviderRuntimeKeyFamily,Qe as resolveProviderRuntimeTranscriptToolCallIdMode,ze as shouldDropThinkingBlocksForProviderRuntimeModel,Je as shouldSanitizeProviderRuntimeThoughtSignaturesForModel,He as supportsOpenAiCompatTurnValidationForProviderRuntime,ke as upsertRuntimeResourceAsset,qe as usesOpenAiFunctionAnthropicToolSchemaForProviderRuntime,Ye as usesOpenAiStringModeAnthropicToolChoiceForProviderRuntime};
@@ -1,40 +1,29 @@
1
- import type { ChatMessage, TurnConfig } from "../agent/types.js";
2
1
  import type { HookRegistry } from "../contracts/hooks.js";
3
- import type { ToolCatalog } from "../runtime/ports/index.js";
4
- import type { SessionHistoryCoordinator } from "./session-history-coordinator.js";
5
2
  import { createMemoryPrefetchState } from "../runtime/hooks/memory-hooks.js";
6
3
  import { SessionState } from "../runtime/session/session-state.js";
7
- import { type AcpInitializeParams, type AcpInitializeResult, type AcpSessionEndParams, type AcpSessionNewParams, type AcpSessionNewResult, type AcpSessionPromptParams, type AcpSessionPromptResult, type AcpSessionSetConfigParams } from "../protocol/wire/index.js";
4
+ import { type AcpInitializeParams, type AcpInitializeResult, type AcpSessionEndParams, type AcpSessionMeta, type AcpSessionNewParams, type AcpSessionNewResult, type AcpSessionPromptParams, type AcpSessionPromptResult, type AcpSessionSetConfigParams } from "../protocol/wire/index.js";
8
5
  export interface AcpSessionHost {
9
- activeTurn: AbortController | null;
6
+ /** Gateway-supplied per-session context (_meta from session/new); inherited by every prompt. */
7
+ acpSessionMeta: AcpSessionMeta | null;
10
8
  currentApiKey: string;
11
9
  currentBaseUrl: string;
12
10
  currentHooks: HookRegistry | null;
13
11
  currentModel: string;
14
12
  currentProvider: string;
15
13
  currentSessionId: string;
16
- mcpReady: Promise<void>;
17
14
  memoryPrefetchState: ReturnType<typeof createMemoryPrefetchState>;
18
- sessionHistory: Pick<SessionHistoryCoordinator, "appendAcpUserMessage" | "appendAcpAssistantMessage" | "clearAcpSession">;
19
15
  sessionState: SessionState | null;
20
16
  sessionTaskDomain: unknown;
21
- toolCatalog?: ToolCatalog;
22
17
  cancelIdleDreamTimer(): void;
23
18
  disposeSessionRuntime?(): void;
24
19
  enableIdleDream(): void;
25
20
  ensureDefaultProject(): void;
26
- getActiveProjectRoot(): string;
27
21
  log(message: string): void;
28
- resolveAgent(config: TurnConfig): {
29
- run(request: unknown, signal?: AbortSignal): AsyncIterable<any>;
30
- } | null;
31
- sendNotification(method: string, params: unknown): void;
32
22
  setActiveWorkdir(dir: string): void;
33
23
  }
34
24
  export declare function handleAcpInitialize(host: AcpSessionHost, params: AcpInitializeParams, packageVersion: string): Promise<AcpInitializeResult>;
35
25
  export declare function handleAcpSessionNew(host: AcpSessionHost, params: AcpSessionNewParams): Promise<AcpSessionNewResult>;
36
26
  export declare function handleAcpSessionPrompt(host: AcpSessionHost, params: AcpSessionPromptParams): Promise<AcpSessionPromptResult>;
37
- export declare function runAcpTurn(host: AcpSessionHost, turnId: string, sessionId: string, messages: ChatMessage[]): Promise<AcpSessionPromptResult>;
38
27
  export declare function handleAcpSessionEnd(host: AcpSessionHost, params: AcpSessionEndParams): Promise<void>;
39
28
  export declare function handleAcpSessionSetConfig(host: AcpSessionHost, params: AcpSessionSetConfigParams): Promise<void>;
40
29
  export declare function handleAcpSessionSetModel(host: AcpSessionHost, _sessionId: string, model: string): Promise<void>;
@@ -4,6 +4,8 @@ import * as acpExtended from "./acp-extended-handlers.js";
4
4
  import * as acpSession from "./acp-session-handlers.js";
5
5
  export interface CliAcpRequestHandlerHost extends acpSession.AcpSessionHost {
6
6
  activeTurn: AbortController | null;
7
+ /** Id of the turn currently running; used to key cancel requests. */
8
+ currentTurnId?: string;
7
9
  permissionChecker?: PermissionApprovalResolver | null;
8
10
  }
9
11
  export declare function createCliAcpRequestHandler(host: CliAcpRequestHandlerHost, packageVersion: string, extendedHost?: acpExtended.AcpExtendedHost): AcpRequestHandler;
@@ -35,6 +35,11 @@ export interface PetHandlerHost {
35
35
  export declare function handlePetHatch(this: PetHandlerHost, msg: AgentRpcRequest): Promise<void>;
36
36
  export declare function handlePetInteract(this: PetHandlerHost, msg: AgentRpcRequest): Promise<void>;
37
37
  export declare function handlePetStatus(this: PetHandlerHost, msg: AgentRpcRequest): Promise<void>;
38
+ export declare function handlePetPreferencesUpdate(this: PetHandlerHost, msg: AgentRpcRequest): Promise<void>;
39
+ export declare function handlePetJourneySnapshot(this: PetHandlerHost, msg: AgentRpcRequest): Promise<void>;
40
+ export declare function handlePetJourneyList(this: PetHandlerHost, msg: AgentRpcRequest): Promise<void>;
41
+ export declare function handlePetJourneyGet(this: PetHandlerHost, msg: AgentRpcRequest): Promise<void>;
42
+ export declare function handlePetCustomDelete(this: PetHandlerHost, msg: AgentRpcRequest): Promise<void>;
38
43
  /**
39
44
  * P4: Pet Forge — generate a custom .pet file from image/text description.
40
45
  *
@@ -3,7 +3,7 @@
3
3
  * Handles: thread.turn, agent.abort, tool.approval.response, thread.user_response
4
4
  */
5
5
  import type { PermissionMetadataResolver, ToolCatalog } from "../../runtime/ports/index.js";
6
- import type { ToolDefinition } from "../../agent/types.js";
6
+ import type { ChatMessage, TokenUsage, ToolDefinition } from "../../agent/types.js";
7
7
  import type { AgentRpcRequest } from "../../protocol/wire/agent-rpc.js";
8
8
  interface PendingAskUserRequest {
9
9
  resolve(answers: Record<string, string> | null): void;
@@ -21,5 +21,32 @@ export declare function handleAbort(this: TurnControlHandlerHost, msg: AgentRpcR
21
21
  export declare function handleApprovalResponse(this: TurnControlHandlerHost, msg: AgentRpcRequest): void;
22
22
  export declare function refreshPermissionCheckerToolMeta(permissionChecker: PermissionMetadataResolver | null | undefined, tools: ToolDefinition[]): void;
23
23
  export declare function handleUserResponse(this: TurnControlHandlerHost, msg: AgentRpcRequest): void;
24
+ export interface TurnPipelineInput {
25
+ turnId: string;
26
+ sessionId: string;
27
+ messages: ChatMessage[];
28
+ tools: ToolDefinition[];
29
+ config?: Record<string, unknown>;
30
+ previousTurnId?: string;
31
+ }
32
+ export interface TurnPipelineResult {
33
+ content: string;
34
+ usage?: TokenUsage;
35
+ /** Turn error (if any), surfaced in-band for the ACP session/prompt response. The
36
+ * turn.error notification is still emitted for streaming UIs. */
37
+ error?: {
38
+ message: string;
39
+ code?: string;
40
+ recoverable?: boolean;
41
+ };
42
+ }
43
+ /** Legacy `thread.turn` entry: ACK immediately, then run the shared turn pipeline. */
24
44
  export declare function handleTurn(this: any, msg: AgentRpcRequest): Promise<void>;
45
+ /**
46
+ * Shared turn pipeline: project routing, history hydration, system-prompt assembly,
47
+ * agent execution (executeTurnCore), and post-turn persistence/summary/split.
48
+ * Invoked with `.call(host, input)` by both the legacy `thread.turn` handler and the
49
+ * standard-ACP `session/prompt` handler, so both turn entries share one pipeline.
50
+ */
51
+ export declare function runTurnPipeline(this: any, input: TurnPipelineInput): Promise<TurnPipelineResult>;
25
52
  export {};
@@ -28,6 +28,7 @@ export interface PetRuntime {
28
28
  }
29
29
  export interface PetRuntimeDeps {
30
30
  getActiveProjectRoot(): string;
31
+ resolveOwnerUserId?: () => string;
31
32
  resolveClientForPurpose(purpose: ModelPurpose): PetLlmClient | null;
32
33
  sendNotification(method: string, params: Record<string, unknown>): void;
33
34
  }
@@ -1,11 +1,6 @@
1
1
  import type { ChatMessage } from "../agent/types.js";
2
2
  export declare class SessionHistoryCoordinator {
3
- private readonly acpSessionHistories;
4
3
  private readonly resumedSessionHistories;
5
- appendAcpUserMessage(sessionId: string, content: string): ChatMessage[];
6
- appendAcpAssistantMessage(sessionId: string, content: string): void;
7
- clearAcpSession(sessionId: string): void;
8
4
  saveResumedSession(sessionId: string, messages: readonly unknown[]): void;
9
5
  withResumedHistory(sessionId: string, messages: ChatMessage[]): ChatMessage[];
10
- private getOrCreateAcpHistory;
11
6
  }
@@ -55,6 +55,8 @@ export declare class StdioServer {
55
55
  private pendingAskUser;
56
56
  /** Session-level task domain stickiness. Survives across turns within a session. */
57
57
  private sessionTaskDomain;
58
+ /** ACP session-level context supplement (_meta from session/new), inherited by every prompt. */
59
+ private acpSessionMeta;
58
60
  /** Agents/solo/product handler facade. */
59
61
  private readonly multiAgentHandlerHost;
60
62
  /** ACP Server instance — handles ACP protocol alongside legacy protocol. */
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Shared turn-execution core for both turn entry points:
3
+ * - the ACP `session/prompt` path (`acp-session-handlers.ts` → `handleAcpSessionPrompt` → `runTurnPipeline`)
4
+ * - the legacy `thread.turn` path (`handlers/turn-handler.ts` → `handleTurn`)
5
+ *
6
+ * Owns the `agent.run()` event loop: side-event forwarding (`forwardTurnSideEvent`),
7
+ * the `turn.start`/`turn.end`/`turn.error` notification skeleton, and content/usage
8
+ * collection. Path-specific behaviour (transcript persistence, usage tracking,
9
+ * literal-response transforms, skill auto-persist) is supplied via optional hooks so
10
+ * the two callers stay behaviourally identical while sharing one loop implementation.
11
+ *
12
+ * This is the keystone of the turn-path unification: by routing both callers through
13
+ * one loop, the two paths can no longer drift (the class of bug behind the multi-turn
14
+ * continuity regression).
15
+ */
16
+ import type { ChatMessage, TokenUsage, ToolDefinition, TurnConfig, TurnEvent } from "../agent/types.js";
17
+ import { type TurnEventForwardHost } from "./turn-event-forwarder.js";
18
+ export interface TurnCoreRequest {
19
+ turnId: string;
20
+ sessionId: string;
21
+ messages: ChatMessage[];
22
+ tools: ToolDefinition[];
23
+ systemPrompt: string;
24
+ config: TurnConfig;
25
+ }
26
+ export interface TurnCoreAgent {
27
+ run(request: TurnCoreRequest, signal?: AbortSignal): AsyncIterable<TurnEvent>;
28
+ }
29
+ export interface TurnCoreHooks {
30
+ /** Invoked for every side event handled by `forwardTurnSideEvent` (e.g. tool-call accounting). */
31
+ onSideEvent?: (event: TurnEvent) => void;
32
+ /** Transform assistant content before it is emitted in `turn.end` (e.g. literal-response requirements). */
33
+ transformContent?: (content: string) => string;
34
+ /** Extra work after `turn.end` is emitted (usage tracking, `turn.usage_update`, transcript persistence). */
35
+ onEnd?: (event: Extract<TurnEvent, {
36
+ type: "end";
37
+ }>, finalContent: string) => void;
38
+ /** Extra work after `turn.error` is emitted (e.g. usage tracking on the error path). */
39
+ onError?: (event: Extract<TurnEvent, {
40
+ type: "error";
41
+ }>) => void;
42
+ /** Handle a `skill_instruction` event (notify + auto-persist). */
43
+ onSkillInstruction?: (event: Extract<TurnEvent, {
44
+ type: "skill_instruction";
45
+ }>) => void;
46
+ }
47
+ export interface TurnCoreResult {
48
+ content: string;
49
+ usage?: TokenUsage;
50
+ /** Captured mid-turn error event, surfaced in-band by callers (e.g. ACP session/prompt). */
51
+ error?: {
52
+ message: string;
53
+ code?: string;
54
+ recoverable?: boolean;
55
+ };
56
+ }
57
+ /**
58
+ * Drive a single agent turn to completion, emitting the shared notification stream.
59
+ * The caller is responsible for emitting `turn.start` (for the early-lifecycle
60
+ * contract) before invoking this, and for all pre/post-turn pipeline work.
61
+ */
62
+ export declare function executeTurnCore(host: TurnEventForwardHost, agent: TurnCoreAgent, request: TurnCoreRequest, signal: AbortSignal, hooks?: TurnCoreHooks): Promise<TurnCoreResult>;
@@ -7,6 +7,7 @@ export declare const ACP_METHODS: {
7
7
  readonly SESSION_SET_CONFIG: "session/set_config_option";
8
8
  readonly SESSION_SET_MODEL: "session/set_model";
9
9
  readonly SESSION_SET_MODE: "session/set_mode";
10
+ readonly SESSION_CANCEL: "session/cancel";
10
11
  readonly SESSION_UPDATE: "session/update";
11
12
  readonly SESSION_REQUEST_PERMISSION: "session/request_permission";
12
13
  readonly FS_READ_TEXT_FILE: "fs/read_text_file";
@@ -79,6 +80,20 @@ export interface AcpInitializeResult {
79
80
  };
80
81
  agentCapabilities?: AcpAgentCapabilities;
81
82
  }
83
+ export interface AcpSessionMeta {
84
+ projectId?: string;
85
+ sessionType?: string;
86
+ groupKey?: string;
87
+ groupName?: string;
88
+ assistantId?: string;
89
+ permissions?: Record<string, unknown>;
90
+ reasoning?: {
91
+ effort?: string;
92
+ };
93
+ /** Runtime turn-config tweaks applied via session/set_config_option. */
94
+ temperature?: number;
95
+ maxRounds?: number;
96
+ }
82
97
  export interface AcpSessionNewParams {
83
98
  /** Working directory for the session (standard ACP field from host). */
84
99
  cwd?: string;
@@ -94,6 +109,8 @@ export interface AcpSessionNewParams {
94
109
  /** Resume: fork an existing session into a new one */
95
110
  resumeSessionId?: string;
96
111
  forkSession?: boolean;
112
+ /** Per-session context supplement (no standard ACP home). Inherited by every session/prompt. */
113
+ _meta?: AcpSessionMeta;
97
114
  }
98
115
  export interface AcpSessionNewResult {
99
116
  sessionId: string;
@@ -102,8 +119,11 @@ export interface AcpSessionPromptParams {
102
119
  sessionId: string;
103
120
  /** User prompt content blocks (standard ACP field). */
104
121
  prompt: AcpContentBlock[];
105
- /** Optional attached context */
106
- context?: AcpContextItem[];
122
+ }
123
+ export interface AcpTurnError {
124
+ message: string;
125
+ code?: string;
126
+ recoverable?: boolean;
107
127
  }
108
128
  export interface AcpSessionPromptResult {
109
129
  /** Stop reason (required by ACP standard). */
@@ -112,10 +132,17 @@ export interface AcpSessionPromptResult {
112
132
  usage?: AcpUsage;
113
133
  /** Final assistant content (internal, used for history tracking). */
114
134
  content?: string;
135
+ /** Turn error surfaced in-band (turn.error notification is still emitted for streaming UI). */
136
+ error?: AcpTurnError;
115
137
  }
116
138
  export interface AcpSessionEndParams {
117
139
  sessionId: string;
118
140
  }
141
+ export interface AcpSessionCancelParams {
142
+ sessionId: string;
143
+ /** Turn to cancel. If omitted, the agent cancels the active turn. */
144
+ turnId?: string;
145
+ }
119
146
  export interface AcpSessionSetConfigParams {
120
147
  sessionId: string;
121
148
  option: string;
@@ -128,16 +155,20 @@ export type AcpContentBlock = {
128
155
  type: "image";
129
156
  url: string;
130
157
  mimeType?: string;
158
+ } | {
159
+ type: "video";
160
+ url: string;
161
+ mimeType?: string;
162
+ } | {
163
+ type: "audio";
164
+ url: string;
165
+ mimeType?: string;
131
166
  } | {
132
167
  type: "file";
133
- path: string;
134
- content?: string;
168
+ fileId: string;
169
+ mimeType?: string;
170
+ size?: number;
135
171
  };
136
- export interface AcpContextItem {
137
- type: "file" | "url" | "text";
138
- content: string;
139
- metadata?: Record<string, unknown>;
140
- }
141
172
  /**
142
173
  * The `session/update` notification params.
143
174
  * Standard format: { sessionId, update: { sessionUpdate: "<type>", ...payload } }
@@ -6,7 +6,7 @@ export { type AgentCapabilities, type AgentCategory, type AgentConfig, type Agen
6
6
  export type * from "./acp-agent-management.js";
7
7
  export { AGENT_TEAM_WS_EVENT_NAMES, AGENT_WS_EVENT_NAMES, ALL_AGENT_WS_EVENT_NAMES, type AgentTeamWsEventName, type AgentWsEventName, type AllAgentWsEventName, } from "./agent-events.js";
8
8
  export { type AgentSource, type AgentsErrorNotification, type AgentsStatusNotification, type ArtifactType, type MediaResultType, type MemoryDecayCompletedNotification, type MemoryUpdatedNotification, type NotificationMethod, type NotificationMethodMap, type NotificationThreadItem, type PermissionRuleUpdatedNotification, type PlanInterruptedNotification, type PongNotification, type ProductBudgetUpdateNotification, type ProductBudgetWarningNotification, type ProductCheckpointedNotification, type ProductCompletedNotification, type ProductDagTopologyNotification, type ProductTaskCompletedNotification, type ProductTaskFailedNotification, type ProductTaskOutputDeltaNotification, type ProductTaskStartedNotification, type ProjectArchivedNotification, type ProjectCreatedNotification, type ProjectDeletedNotification, type ProjectRenamedNotification, type ProjectSwitchedNotification, type ProjectUnarchivedNotification, type SessionInfoNotification, type SoloAgentDeltaNotification, type SoloAgentDiffNotification, type SoloAgentUsageNotification, type SoloEvaluationNotification, type SoloProgressNotification, type TeamMemberNotification, type ToolApprovalRequestNotification, type TurnAnnotationsNotification, type TurnArtifactNotification, type TurnAskUserNotification, type TurnDeltaNotification, type TurnEndNotification, type TurnErrorNotification, type TurnExecProgressNotification, type TurnHeartbeatNotification, type TurnMediaPersistedNotification, type TurnMediaProgressNotification, type TurnMediaResultNotification, type TurnPlanUpdateNotification, type TurnReasoningDeltaNotification, type TurnRecoveryNotification, type TurnSidechainCompletedNotification, type TurnSidechainStartedNotification, type TurnSkillAcquisitionNeededNotification, type TurnSkillInstructionNotification, type TurnStartNotification, type TurnSubagentDeltaNotification, type TurnSuggestionsNotification, type TurnTaskUpdatedNotification, type TurnTodosUpdatedNotification, type TurnToolBlockedNotification, type TurnToolCallNotification, type TurnToolResultNotification, type TurnToolUseSummaryNotification, type TurnUsageUpdateNotification, type WireTokenUsage, type ProductPlanReadyNotification, type ProductPlanFailedNotification, type ProductPlanningDeltaNotification, type PetSoulReadyNotification, type PetReactionNotification, type PetGrowthNotification, type PetStateNotification, type PetConfirmNotification, type WorkflowDeletedNotification, type WorkflowRecordNotification, type WorkflowRunCompletedNotification, type WorkflowRunFailedNotification, type WorkflowRunStartedNotification, } from "./notification-payloads.js";
9
- export { ACP_EXTENDED_METHODS, ACP_EXTENDED_SESSION_UPDATE_TYPES, ACP_METHODS, ACP_PROTOCOL_VERSION, ACP_SESSION_UPDATE_TYPES, isAcpJsonRpcNotification, isAcpJsonRpcRequest, isAcpJsonRpcResponse, isExtendedSessionUpdateType, isStandardSessionUpdateType, parseAcpMessage, type AcpAgentCapabilities, type AcpAgentMessageChunkPayload, type AcpAgentThoughtChunkPayload, type AcpAvailableCommandsUpdatePayload, type AcpConfigOptionDescriptor, type AcpConfigOptionUpdatePayload, type AcpContentBlock, type AcpContextItem, type AcpEndTurnPayload, type AcpExtendedMethod, type AcpExtendedSessionUpdateType, type AcpFsReadTextFileParams, type AcpFsReadTextFileResult, type AcpFsWriteTextFileParams, type AcpFsWriteTextFileResult, type AcpHostCapabilities, type AcpInitializeParams, type AcpInitializeResult, type AcpJsonRpcError, type AcpJsonRpcMessage, type AcpJsonRpcNotification, type AcpJsonRpcRequest, type AcpJsonRpcResponse, type AcpPermissionOption, type AcpPermissionRequestParams, type AcpPermissionRequestResult, type AcpPlanPayload, type AcpSessionEndParams, type AcpSessionNewParams, type AcpSessionNewResult, type AcpSessionPromptParams, type AcpSessionPromptResult, type AcpSessionSetConfigParams, type AcpSessionUpdateNotification, type AcpSessionUpdateType, type AcpStandardMethod, type AcpStandardSessionUpdateType, type AcpStopReason, type AcpToolCallPayload, type AcpToolCallUpdatePayload, type AcpUsage, type AcpUsageUpdatePayload, type AcpXAskUserPayload, type AcpXMediaProgressPayload, type AcpXMediaResultPayload, type AcpXMemoryUpdatedPayload, type AcpXProductCheckpointPayload, type AcpXProductTaskCompletedPayload, type AcpXProductTaskStartedPayload, type AcpXRecoveryPayload, type AcpXSessionInfoPayload, type AcpXSidechainCompletedPayload, type AcpXSidechainStartedPayload, type AcpXSkillInstructionPayload, type AcpXSoloAgentFinishedPayload, type AcpXSoloSelectedPayload, type AcpXSoloStartedPayload, type AcpXSubagentDeltaPayload, type AcpXSubagentEndedPayload, type AcpXSubagentStartedPayload, type AcpXSuggestionsPayload, type AcpXTeamMemberUpdatePayload, } from "./acp-protocol.js";
9
+ export { ACP_EXTENDED_METHODS, ACP_EXTENDED_SESSION_UPDATE_TYPES, ACP_METHODS, ACP_PROTOCOL_VERSION, ACP_SESSION_UPDATE_TYPES, isAcpJsonRpcNotification, isAcpJsonRpcRequest, isAcpJsonRpcResponse, isExtendedSessionUpdateType, isStandardSessionUpdateType, parseAcpMessage, type AcpAgentCapabilities, type AcpAgentMessageChunkPayload, type AcpAgentThoughtChunkPayload, type AcpAvailableCommandsUpdatePayload, type AcpConfigOptionDescriptor, type AcpConfigOptionUpdatePayload, type AcpContentBlock, type AcpEndTurnPayload, type AcpExtendedMethod, type AcpExtendedSessionUpdateType, type AcpFsReadTextFileParams, type AcpFsReadTextFileResult, type AcpFsWriteTextFileParams, type AcpFsWriteTextFileResult, type AcpHostCapabilities, type AcpInitializeParams, type AcpInitializeResult, type AcpJsonRpcError, type AcpJsonRpcMessage, type AcpJsonRpcNotification, type AcpJsonRpcRequest, type AcpJsonRpcResponse, type AcpPermissionOption, type AcpPermissionRequestParams, type AcpPermissionRequestResult, type AcpPlanPayload, type AcpSessionCancelParams, type AcpSessionEndParams, type AcpSessionMeta, type AcpSessionNewParams, type AcpSessionNewResult, type AcpSessionPromptParams, type AcpSessionPromptResult, type AcpSessionSetConfigParams, type AcpSessionUpdateNotification, type AcpSessionUpdateType, type AcpStandardMethod, type AcpStandardSessionUpdateType, type AcpStopReason, type AcpToolCallPayload, type AcpToolCallUpdatePayload, type AcpTurnError, type AcpUsage, type AcpUsageUpdatePayload, type AcpXAskUserPayload, type AcpXMediaProgressPayload, type AcpXMediaResultPayload, type AcpXMemoryUpdatedPayload, type AcpXProductCheckpointPayload, type AcpXProductTaskCompletedPayload, type AcpXProductTaskStartedPayload, type AcpXRecoveryPayload, type AcpXSessionInfoPayload, type AcpXSidechainCompletedPayload, type AcpXSidechainStartedPayload, type AcpXSkillInstructionPayload, type AcpXSoloAgentFinishedPayload, type AcpXSoloSelectedPayload, type AcpXSoloStartedPayload, type AcpXSubagentDeltaPayload, type AcpXSubagentEndedPayload, type AcpXSubagentStartedPayload, type AcpXSuggestionsPayload, type AcpXTeamMemberUpdatePayload, } from "./acp-protocol.js";
10
10
  export { type ApprovalRequiredToolContract, type ModelSelectionReason, type PendingPromptContract, type RuntimeCapabilitySummaryContract, type RuntimeSessionContract, type SessionIdentityContract, } from "./session.js";
11
11
  export { type GatewayChannelExecutionEgressContract, type GatewayChannelExecutionEgressKind, type GatewayChannelExecutionIngressBindingContract, type GatewayChannelExecutionIngressSource, } from "./channel-ingress.js";
12
12
  export { CAPABILITY_MANIFEST_DIFF_SECTIONS, cloneCapabilityManifestSnapshot, createCapabilityManifestDiffPayload, deriveCapabilityToolNamespaces, deriveCapabilityWorkspaceIds, mergeCapabilityManifestSnapshot, type CapabilityManifestApprovalMode, type CapabilityManifestApprovalPolicyContract, type CapabilityManifestDiffSection, type CapabilityMcpManifestContract, type CapabilityManifestSnapshotContract, type HostCapabilitySnapshotContract, type CapabilityPluginManifestContract, type RuntimeCapabilityViewContract, type RuntimeToolEligibilityContract, type CapabilitySkillManifestContract, type CapabilityToolManifestContract, type CapabilityWorkspaceSummaryContract, type ToolEligibilityResolvedSource, type ToolEligibilityReasonCode, type ToolEligibilityStatus, } from "./capability-manifest.js";
@@ -635,6 +635,7 @@ export interface PetConfirmNotification {
635
635
  timeoutMs?: number;
636
636
  }
637
637
  export interface PetForgedNotification {
638
+ id: string;
638
639
  name: string;
639
640
  svgs: Record<string, string>;
640
641
  }
@@ -1,7 +1,9 @@
1
1
  /**
2
2
  * Pet module — barrel export.
3
3
  */
4
- export { PetSoulService, type PetSoul, type PetStats, type PetBreed } from "./pet-soul-service.js";
4
+ export { PetSoulService } from "./pet-soul-service.js";
5
+ export type { PetSoul, PetStats, PetBreed } from "./pet-types.js";
6
+ export { PetProfileService, type PetProfile, type PetPreferences, type PetCustomPet, type PetCustomPetSummary, type JourneySnapshot } from "./pet-profile-service.js";
5
7
  export { maybeGenerateReaction, generateLLMReaction, type ReactionPool, type LLMReactionContext, type ReactionStyle } from "./pet-reaction-service.js";
6
8
  export { PetGrowthEngine, type GrowthEvent, type MoltResult, type PetDisplayTrait } from "./pet-growth-engine.js";
7
9
  export { loadPetFile, validatePetManifest, sanitizeSvg, type PetManifest, type PetFileBundle } from "./pet-file-loader.js";
@@ -7,7 +7,7 @@
7
7
  * - Display traits: unlocked at specific levels, presentation-only
8
8
  * - Stats growth: each level-up slightly boosts one stat
9
9
  */
10
- import type { PetStats, PetSoul } from "./pet-soul-service.js";
10
+ import type { PetStats, PetSoul } from "./pet-types.js";
11
11
  export interface PetDisplayTrait {
12
12
  id: string;
13
13
  name: string;
@@ -0,0 +1,52 @@
1
+ import type { PetSoul } from "./pet-types.js";
2
+ export interface PetPreferences {
3
+ enabled: boolean;
4
+ selectedBreed: string;
5
+ selectedCustomPetId: string | null;
6
+ }
7
+ export interface PetCustomPetSummary {
8
+ id: string;
9
+ name: string;
10
+ description: string;
11
+ createdAt: string;
12
+ updatedAt: string;
13
+ }
14
+ export interface PetCustomPet extends PetCustomPetSummary {
15
+ svgs: Record<string, string>;
16
+ sourcePrompt?: string;
17
+ }
18
+ export interface JourneySnapshot {
19
+ date: string;
20
+ day: number;
21
+ petName: string;
22
+ stateLabel: string;
23
+ entries: Array<Record<string, unknown>>;
24
+ }
25
+ export interface PetProfile {
26
+ version: 1;
27
+ ownerUserId: string;
28
+ soul: PetSoul | null;
29
+ preferences: PetPreferences;
30
+ customPets: PetCustomPetSummary[];
31
+ journeyDates: string[];
32
+ updatedAt: string;
33
+ }
34
+ export declare class PetProfileService {
35
+ private readonly ownerUserId;
36
+ private readonly petDir;
37
+ private readonly profilePath;
38
+ constructor(ownerUserId: string);
39
+ loadProfile(): PetProfile;
40
+ updateSoul(soul: PetSoul | null): PetProfile;
41
+ updatePreferences(update: Partial<PetPreferences>): PetProfile;
42
+ saveJourneySnapshot(snapshot: JourneySnapshot): PetProfile;
43
+ listJourneyDates(): string[];
44
+ getJourneySnapshot(date: string): JourneySnapshot | null;
45
+ upsertCustomPet(pet: PetCustomPet): PetProfile;
46
+ deleteCustomPet(id: string): PetProfile;
47
+ listCustomPets(): PetCustomPet[];
48
+ getCustomPet(id: string): PetCustomPet | null;
49
+ private defaultProfile;
50
+ private normalizeProfile;
51
+ private writeProfile;
52
+ }
@@ -4,7 +4,7 @@
4
4
  * P0: Local template pools (no LLM).
5
5
  * P1+: LLM-generated personalized reactions via small model.
6
6
  */
7
- import { type PetSoul } from "./pet-soul-service.js";
7
+ import type { PetSoul } from "./pet-types.js";
8
8
  export type ReactionPool = "greeting" | "completion" | "error" | "curiosity" | "bored" | "memory" | "tool_success";
9
9
  export type ReactionStyle = "normal" | "thinking" | "excited" | "sleepy";
10
10
  /**
@@ -1,39 +1,8 @@
1
- export interface PetStats {
2
- grip: number;
3
- patience: number;
4
- curiosity: number;
5
- appetite: number;
6
- humor: number;
7
- }
8
- export interface PetSoul {
9
- name: string;
10
- species: string;
11
- personality: string;
12
- catchphrase: string;
13
- stats: PetStats;
14
- rarity: string;
15
- breed?: string;
16
- breedColors?: {
17
- primary: string;
18
- secondary: string;
19
- };
20
- level: number;
21
- experience: number;
22
- hatchedAt: string;
23
- }
24
- export interface PetBreed {
25
- id: string;
26
- name: string;
27
- colors: {
28
- primary: string;
29
- secondary: string;
30
- };
31
- rarity: string;
32
- }
1
+ import type { PetSoul, PetStats } from "./pet-types.js";
33
2
  export declare function hasPetAgentBoundaryViolationText(value: string): boolean;
34
3
  export declare class PetSoulService {
35
4
  private soul;
36
- private storagePath;
5
+ private profileService;
37
6
  constructor(_workspaceDir: string, ownerUserId?: string);
38
7
  load(): PetSoul | null;
39
8
  hatch(userId: string, generateSoul?: (rarity: string, stats: PetStats) => Promise<{