aws-runtime-bridge 1.9.169 → 1.9.170
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/CHANGELOG.md +33 -0
- package/dist/adapter/AcodeSdkAdapter.d.ts +46 -0
- package/dist/adapter/AcodeSdkAdapter.js +4 -4
- package/dist/adapter/ClaudeSdkAdapter.js +2 -2
- package/dist/adapter/types.d.ts +7 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.js +2 -2
- package/dist/index.js +1 -1
- package/dist/routes/agent-state.d.ts +2 -0
- package/dist/routes/agent-state.js +2 -0
- package/dist/routes/capabilities.js +1 -1
- package/dist/routes/debug-mount.d.ts +2 -0
- package/dist/routes/debug-mount.js +2 -0
- package/dist/routes/mcp.js +1 -1
- package/dist/routes/plugins.js +1 -1
- package/dist/routes/skills.js +1 -1
- package/dist/routes/terminal.js +28 -32
- package/dist/services/acode-bg-manager.d.ts +2 -0
- package/dist/services/agent-capability-sync.js +1 -1
- package/dist/services/debug-mount.d.ts +122 -0
- package/dist/services/debug-mount.js +2 -0
- package/dist/services/desktop-mcp-manager.js +1 -1
- package/dist/services/instance-ai-config-service.js +1 -1
- package/dist/services/instance-features.d.ts +4 -0
- package/dist/services/instance-features.js +1 -1
- package/dist/services/instance-init-service.js +1 -1
- package/dist/services/mcp-deploy.d.ts +31 -0
- package/dist/services/mcp-deploy.js +4 -3
- package/dist/services/mcp-env-injector.d.ts +24 -0
- package/dist/services/mcp-env-injector.js +1 -1
- package/dist/services/mcp-package.d.ts +35 -0
- package/dist/services/mcp-package.js +2 -0
- package/dist/services/mcp-probe-client.d.ts +25 -0
- package/dist/services/mcp-probe-client.js +2 -0
- package/dist/services/panel-env.d.ts +5 -0
- package/dist/services/panel-env.js +1 -1
- package/dist/services/plugin-deployment.d.ts +36 -0
- package/dist/services/plugin-deployment.js +3 -0
- package/dist/services/plugin-event-buffer.js +2 -1
- package/dist/services/plugin-fs.d.ts +5 -0
- package/dist/services/plugin-fs.js +2 -0
- package/dist/services/plugin-handler-adapter.d.ts +7 -0
- package/dist/services/plugin-handler-adapter.js +3 -0
- package/dist/services/plugin-listener-runner.d.ts +18 -0
- package/dist/services/plugin-listener-runner.js +8 -0
- package/dist/services/plugin-loader.d.ts +32 -0
- package/dist/services/plugin-loader.js +2 -0
- package/dist/services/plugin-manager.d.ts +17 -136
- package/dist/services/plugin-manager.js +4 -15
- package/dist/services/plugin-manifest.d.ts +83 -0
- package/dist/services/plugin-manifest.js +2 -0
- package/dist/services/plugin-runtime.d.ts +67 -0
- package/dist/services/plugin-runtime.js +1 -0
- package/dist/services/skill-manager.d.ts +15 -0
- package/dist/services/skill-manager.js +3 -2
- package/dist/types.d.ts +6 -0
- package/dist/utils/mcp-utils.js +1 -1
- package/package/acode/dist/compaction.d.ts +35 -1
- package/package/acode/dist/compaction.js +6 -6
- package/package/acode/dist/plugin-types.d.ts +6 -27
- package/package/acode/dist/runtime.d.ts +37 -0
- package/package/acode/dist/runtime.js +31 -30
- package/package/acode/dist/tool-group-manager.d.ts +10 -0
- package/package/acode/dist/tool-group-manager.js +5 -10
- package/package/acode/dist/types.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/ability-market-tools.d.ts +18 -0
- package/package/aws-client-agent-mcp/dist/ability-market-tools.js +2 -0
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +13 -4
- package/package/aws-client-agent-mcp/dist/agent-client.js +1 -1
- package/package/aws-client-agent-mcp/dist/http-client.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/http-client.js +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +0 -7
- package/package/aws-client-agent-mcp/dist/mcp-server.js +12 -12
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +20 -20
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.js +2 -2
- package/package/aws-client-agent-mcp/dist/memory-tools.js +7 -7
- package/package/aws-client-agent-mcp/dist/tool-groups.js +2 -2
- package/package/aws-client-agent-mcp/dist/types.d.ts +0 -21
- package/package.json +3 -2
- package/dist/services/builtin-commands/create-plugin.md +0 -44
package/dist/routes/terminal.js
CHANGED
|
@@ -1,52 +1,48 @@
|
|
|
1
|
-
import{spawn as
|
|
2
|
-
`);if(o.length<=
|
|
1
|
+
import{spawn as St}from"node:child_process";import{promises as F}from"node:fs";import It from"node:os";import N from"node:path";import{TextDecoder as oe}from"node:util";import Oe from"axios";import{Router as ht}from"express";import{v4 as At}from"uuid";import{adapterRegistry as h,getToolActionInfo as ke,isTransientClipboardPasteFilePath as Me,redactTransientClipboardPastePaths as K,registerSdkProviders as Tt,resolveSdkProviderIdByCommand as _t}from"../adapter/index.js";import{MESSAGE_POLLING_IDLE_PROMPT as Le}from"../adapter/prompts.js";import{getActiveBridgeHttpPort as bt,getAcodeDataHome as je}from"../config.js";import{buildResumeContextBlock as kt}from"@agentswork/acode";import{validateToken as y}from"../middleware/auth.js";import{getAgentProcessManager as Ce}from"../services/agent-process-manager.js";import{createAiConfigService as Ct}from"../services/ai-config-service.js";import{resolveSchedulerBaseUrlFromToken as Ue}from"../services/auto-register.js";import{setChangeCacheRetentionDays as wt}from"../services/change-cache-retention.js";import{clearDebugMounts as se}from"../services/debug-mount.js";import{getAllPushStats as Et,startHeartbeatScheduler as $t}from"../services/event-delta-pusher.js";import{prepareAcodeInstanceConfig as Rt,redactForLog as ie}from"../services/instance-ai-config-service.js";import{setAgentFeatures as Dt,setAgentCapabilities as Pt,setAgentInheritedFeatures as Ot,setAgentCapabilitiesInherited as Mt,getAgentFeatures as Lt,getAgentInheritedFeatures as jt,getFeatureState as S,LAUNCH_ITEM_FEATURE_KEY as xe,HIRE_FEATURE_KEY as Ne,PENCIL_FEATURE_KEY as Be,DRAW_FEATURE_KEY as ve,OFFICE_FEATURE_KEY as Fe,COLLABORATION_TASK_FEATURE_KEY as Ke,COLLABORATION_MEETING_FEATURE_KEY as He,COLLABORATION_DEBUG_FEATURE_KEY as qe,COLLABORATION_FILE_HISTORY_FEATURE_KEY as ze,EMAIL_FEATURE_KEY as We,SKILL_INSTALL_FEATURE_KEY as Ge,ABILITY_DEV_FEATURE_KEY as Ye}from"../services/instance-features.js";import{enqueueMcpLaunchBinding as Ut}from"../services/mcp-launch-binding-queue.js";import{setPanelEnvVars as xt,setAgentMeta as Nt}from"../services/panel-env.js";import{findClaudeCodeProcesses as Bt,isProcessRunning as vt}from"../services/process-detector.js";import{forgetSession as H,onSdkToolUseEnd as Ft,onSdkToolUseStart as Kt}from"../services/sdk-tool-file-change-recorder.js";import{bridgeEventBuffer as Xe,sendOutput as J,sendQuestionRequest as Ht,sendToolAuthRequest as qt,sendStatus as $}from"../services/session-output.js";import{findPersistedSessionByAgentId as zt,removePersistedSession as q,savePersistedSessions as Wt,updatePersistedSessionAutoCommands as Gt,updatePersistedSessionRuntimeState as Yt,upsertPersistedSession as Xt}from"../services/terminal-persistence.js";import{getInstanceAiConfigDebugLogger as Jt}from"../utils/instance-ai-config-debug-logger.js";import{logger as l}from"../utils/logger.js";const I=ht();function Je(e){const n=e.header("X-Runtime-Token");return n&&n.trim()?n.trim():(e.header("Authorization")||"").match(/^Bearer\s+(.+)$/i)?.[1]?.trim()||void 0}const m=new Map,Vt=45e3,ae=new Map;function Qt(e){if(ae.has(e))return;const n=setInterval(()=>{const t=m.get(e);if(!t){L(e);return}const r=t.currentRuntimeStatus;if(r!=="thinking"&&r!=="tool_using"&&r!=="compacting"){L(e);return}$(t.agentId,e,r,void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl}).catch(()=>{})},Vt);ae.set(e,n)}function L(e){const n=ae.get(e);n&&(clearInterval(n),ae.delete(e))}const Ve=4e3,Zt=200,en=2e3,Qe=24e3,Ze=200,et=8e3;function tn(e){if(!Array.isArray(e)||e.length===0)return{snapshot:"",truncated:!1};const n=[];let t=null,r=[];const s=()=>{if(t===null)return;const d=r.join("").trim();if(r=[],!d){t=null;return}const u=t==="user"?"\u7528\u6237":t==="assistant"?"\u52A9\u624B":t;n.push(`\u3010${u}\u3011${ce(d,en)}`),t=null};for(const d of e){const u=String(d?.role||"").trim();if(!u||u==="system")continue;if(u==="tool_use"||u==="tool_result"){s();const p=String(d.toolName||"").trim()||"\u672A\u77E5\u5DE5\u5177";if(nn(p))continue;if(u==="tool_use"){const g=on(String(d.content||""));n.push(`\u3010\u5DE5\u5177\u8C03\u7528\u3011${p}${g?` ${g}`:""}`)}else{const g=ce(String(d.content||"").trim(),Zt);n.push(`\u3010\u5DE5\u5177\u7ED3\u679C\u3011${p}${d.isError?"\uFF08\u5931\u8D25\uFF09":""}${g?`\uFF1A${g}`:""}`)}continue}const f=String(d.content||"");f.trim()&&(t===u||(s(),t=u),r.push(f))}if(s(),n.length===0)return{snapshot:"",truncated:!1};const o=n.join(`
|
|
2
|
+
`);if(o.length<=Qe)return{snapshot:o,truncated:!1};const i=Qe-et,a=o.slice(0,et),c=o.slice(o.length-i);return{snapshot:`${a}
|
|
3
3
|
|
|
4
4
|
...\uFF08\u6B64\u5904\u7701\u7565\u4E2D\u6BB5 ${o.length-a.length-c.length} \u5B57\u7B26\u5386\u53F2\uFF09...
|
|
5
5
|
|
|
6
|
-
${c}`,truncated:!0}}function
|
|
7
|
-
${
|
|
8
|
-
${
|
|
6
|
+
${c}`,truncated:!0}}function ce(e,n){const t=String(e??"");return t.length<=n?t:`${t.slice(0,n)}...\uFF08\u622A\u65AD ${t.length-n} \u5B57\u7B26\uFF09`}function nn(e){const n=e.toLowerCase();return n.includes("poll_message")||n.includes("get_message")||n.includes("await_complete")}function rn(e){if(typeof e!="string"||!e.trim())return Array.isArray(e)&&e.length>0?e:void 0;try{const n=JSON.parse(e);if(!Array.isArray(n)||n.length===0)return;const t=new Set(["system","user","assistant","tool"]),r=1e6,o=n.filter(i=>!!i&&typeof i=="object"&&t.has(String(i.role))).filter(i=>JSON.stringify(i).length<=r).slice(0,5e3);return o.length>0?o:void 0}catch{return}}function on(e){const n=String(e??"").trim();if(!n)return"";let t;try{const s=JSON.parse(n);if(!s||typeof s!="object"||Array.isArray(s))return"";t=s}catch{return ce(n,Ze)}const r=[];for(const s of["file_path","path","filePath","pattern","query","command","cmd","url"]){const o=t[s];if(typeof o=="string"&&o.trim()&&r.push(`${s}=${o.trim()}`),r.length>=3)break}if(r.length===0){const s=Object.keys(t).slice(0,5);return s.length>0?`(${s.join(", ")})`:""}return ce(r.join(" "),Ze)}function tt(e){if(e==null||typeof e!="object"||Array.isArray(e))return;const n=e,t={};return typeof n.model=="string"&&n.model.trim()&&(t.model=n.model.trim()),typeof n.baseURL=="string"&&n.baseURL.trim()&&(t.baseURL=n.baseURL.trim()),typeof n.apiKey=="string"&&n.apiKey.trim()&&(t.apiKey=n.apiKey.trim()),typeof n.effort=="string"&&n.effort.trim()&&(t.effort=n.effort.trim()),t}const z=new Set;async function sn(e,n){const t=[],r=N.join(e,".agentswork","memory");try{const a=(await F.readdir(r)).filter(d=>d.endsWith(".json")),c=await Promise.all(a.map(async d=>{try{const u=await F.readFile(N.join(r,d),"utf-8");return JSON.parse(u)}catch{return l.warn("[loadAgentStartupMemories] Failed to parse memory file: %s",N.join(r,d)),null}}));for(const d of c)if(d?.by_uri)for(const u of Object.values(d.by_uri)){const f=u.memory_type||"memory",p=(u.content||"").trim();p&&f==="instance_memory"&&t.push({title:u.title,content:p,uri:u.uri||""})}}catch{l.debug("[loadAgentStartupMemories] \u65E0\u6CD5\u8BFB\u53D6\u8BB0\u5FC6\u76EE\u5F55: %s",r)}if(t.length===0&&n?.schedulerBaseUrl&&n?.runtimeAccessToken&&n?.agentId){const i=`${n.schedulerBaseUrl.replace(/\/+$/,"")}/mcp/call`,a={"Content-Type":"application/json","X-Runtime-Token":n.runtimeAccessToken,Authorization:`Bearer ${n.runtimeAccessToken}`};try{const c=await fetch(i,{method:"POST",headers:a,body:JSON.stringify({tool:"list_memories",arguments:{agentId:n.agentId,memory_type:"instance_memory"}})});if(!c.ok)throw new Error(`Server returned ${c.status}`);const d=await c.json();if(Array.isArray(d))for(const u of d){const f=(u.content||"").trim();f&&t.push({title:u.title,content:f,uri:u.uri||""})}t.length>0&&l.info(`[loadAgentStartupMemories] Loaded ${t.length} instance memory(s) from server for ${n.agentId}`)}catch(c){l.warn("[loadAgentStartupMemories] \u4ECE server \u52A0\u8F7D instance_memory \u5931\u8D25: %s",c instanceof Error?c.message:String(c))}}const s=10;t.sort((i,a)=>a.uri.localeCompare(i.uri));const o=[];if(t.length>0){const a=t.slice(0,s).map((c,d)=>`${c.title?`\u3010${c.title}\u3011`:`\u6761\u76EE ${d+1}`}
|
|
7
|
+
${c.content}`);o.push(`\u3010\u5B9E\u4F8B\u5373\u65F6\u8BB0\u5FC6\u3011
|
|
8
|
+
${a.join(`
|
|
9
9
|
|
|
10
|
-
`)}`),t.length>o
|
|
11
|
-
${u.content}`:u.content});i.push(`\u3010agent\u8BA4\u77E5\u3011
|
|
12
|
-
${c.join(`
|
|
10
|
+
`)}`),t.length>s&&o.push(`... \u53CA\u53E6\u5916 ${t.length-s} \u6761\u5B9E\u4F8B\u5373\u65F6\u8BB0\u5FC6`)}if(o.length!==0)return o.join(`
|
|
13
11
|
|
|
14
|
-
`)}
|
|
15
|
-
|
|
16
|
-
`)}function nn(e,n){return e!=="acode"?{supported:!1,statusCode:400,error:"context reset without restart is only supported by ACode"}:n?{supported:!0}:{supported:!1,statusCode:500,error:"ACode adapter does not expose resetContext"}}function rn(e){return e!=="acode"}function on(e){const n=typeof e=="object"&&e!==null&&"suppressStatus"in e&&e.suppressStatus===!0,t=typeof e=="object"&&e!==null&&"reason"in e&&typeof e.reason=="string"&&e.reason.trim()?e.reason.trim():void 0;return{statusNotified:!n,reason:t}}function ae(e){const n=e?.usage;if(!n)return;const t=Number.isFinite(n.inputTokens)?n.inputTokens:0,r=Number.isFinite(n.outputTokens)?n.outputTokens:0;if(t<=0&&r<=0&&!n.contextLimit&&!n.maxOutput&&!n.inputLimit&&!n.compactionThreshold)return;const s={inputTokens:t,outputTokens:r,...n.contextLimit?{contextLimit:n.contextLimit}:{},...n.maxOutput?{maxOutput:n.maxOutput}:{},...n.inputLimit?{inputLimit:n.inputLimit}:{},...n.compactionThreshold?{compactionThreshold:n.compactionThreshold}:{},...n.cacheHitTokens!==void 0?{cacheHitTokens:n.cacheHitTokens}:{},...n.cacheMissTokens!==void 0?{cacheMissTokens:n.cacheMissTokens}:{}};return process.env.ACODE_TOKEN_DEBUG==="1"&&(s.inputTokens>0||s.outputTokens>0||s.cacheHitTokens!==void 0||s.cacheMissTokens!==void 0)&&f.info(`[TokenDebug][Terminal] resolveStatusChangeUsage: input=${s.inputTokens} output=${s.outputTokens} cacheHit=${s.cacheHitTokens??"(none)"} cacheMiss=${s.cacheMissTokens??"(none)"} actionType=${e?.actionType??"(none)"}`),s}function sn(e,n){const t=String(e||"").trim().toLowerCase(),r=String(n?.actionType||"").trim().toLowerCase();return t==="tool_using"&&r==="idle"?n?{status:"waiting_input",actionInfo:n}:{status:"waiting_input"}:n?{status:e,actionInfo:n}:{status:e}}function an(e){return e.restoredActionInfo?.actionType==="idle"||e.currentRuntimeActionType==="idle"&&e.shouldPreservePrevAction||e.status==="waiting_input"&&!e.actionInfo?.actionType}const V=new Map,cn="utf-8",Ze="utf-8",et=300,tt=6e4;function Q(e){return String(e).padStart(2,"0")}function un(e,n=new Date){const t=n.getFullYear(),r=Q(n.getMonth()+1),s=Q(n.getDate()),o=Q(n.getHours()),i=Q(n.getMinutes()),a=`${t}${r}${s}-${o}${i}${Q(n.getSeconds())}-${String(n.getMilliseconds()).padStart(3,"0")}`;return j.join(Me(),"cmd-dist",e,`${t}-${r}-${s}`,o,i,`${a}-cmd.out`)}function dn(e){if(!e)return 0;const n=e.replace(/\r\n/g,`
|
|
12
|
+
`)}function an(e,n){return e!=="acode"?{supported:!1,statusCode:400,error:"context reset without restart is only supported by ACode"}:n?{supported:!0}:{supported:!1,statusCode:500,error:"ACode adapter does not expose resetContext"}}function cn(e){return e!=="acode"}function dn(e){const n=typeof e=="object"&&e!==null&&"suppressStatus"in e&&e.suppressStatus===!0,t=typeof e=="object"&&e!==null&&"reason"in e&&typeof e.reason=="string"&&e.reason.trim()?e.reason.trim():void 0;return{statusNotified:!n,reason:t}}function de(e){const n=e?.usage;if(!n)return;const t=Number.isFinite(n.inputTokens)?n.inputTokens:0,r=Number.isFinite(n.outputTokens)?n.outputTokens:0;if(t<=0&&r<=0&&!n.contextLimit&&!n.maxOutput&&!n.inputLimit&&!n.compactionThreshold)return;const s={inputTokens:t,outputTokens:r,...n.contextLimit?{contextLimit:n.contextLimit}:{},...n.maxOutput?{maxOutput:n.maxOutput}:{},...n.inputLimit?{inputLimit:n.inputLimit}:{},...n.compactionThreshold?{compactionThreshold:n.compactionThreshold}:{},...n.cacheHitTokens!==void 0?{cacheHitTokens:n.cacheHitTokens}:{},...n.cacheMissTokens!==void 0?{cacheMissTokens:n.cacheMissTokens}:{}};return process.env.ACODE_TOKEN_DEBUG==="1"&&(s.inputTokens>0||s.outputTokens>0||s.cacheHitTokens!==void 0||s.cacheMissTokens!==void 0)&&l.info(`[TokenDebug][Terminal] resolveStatusChangeUsage: input=${s.inputTokens} output=${s.outputTokens} cacheHit=${s.cacheHitTokens??"(none)"} cacheMiss=${s.cacheMissTokens??"(none)"} actionType=${e?.actionType??"(none)"}`),s}function un(e,n){const t=String(e||"").trim().toLowerCase(),r=String(n?.actionType||"").trim().toLowerCase();return t==="tool_using"&&r==="idle"?n?{status:"waiting_input",actionInfo:n}:{status:"waiting_input"}:n?{status:e,actionInfo:n}:{status:e}}function ln(e){return e.restoredActionInfo?.actionType==="idle"||e.currentRuntimeActionType==="idle"&&e.shouldPreservePrevAction||e.status==="waiting_input"&&!e.actionInfo?.actionType}const V=new Map,fn="utf-8",nt="utf-8",rt=300,ot=6e4;function Q(e){return String(e).padStart(2,"0")}function mn(e,n=new Date){const t=n.getFullYear(),r=Q(n.getMonth()+1),s=Q(n.getDate()),o=Q(n.getHours()),i=Q(n.getMinutes()),a=`${t}${r}${s}-${o}${i}${Q(n.getSeconds())}-${String(n.getMilliseconds()).padStart(3,"0")}`;return N.join(je(),"cmd-dist",e,`${t}-${r}-${s}`,o,i,`${a}-cmd.out`)}function pn(e){if(!e)return 0;const n=e.replace(/\r\n/g,`
|
|
17
13
|
`).replace(/\r/g,`
|
|
18
14
|
`),t=n.endsWith(`
|
|
19
15
|
`)?n.slice(0,-1):n;return t?t.split(`
|
|
20
|
-
`).length:1}function
|
|
16
|
+
`).length:1}function gn(e,n=rt){return`\r
|
|
21
17
|
[ACode] \u547D\u4EE4\u8F93\u51FA\u8D85\u8FC7 ${n} \u884C\uFF0C\u5B8C\u6574\u8F93\u51FA\u5DF2\u5199\u5165: ${e}\r
|
|
22
18
|
[ACode] Agent \u53EF\u81EA\u884C\u8BFB\u53D6\u8BE5\u6587\u4EF6\uFF0C\u6216\u5728\u8BE5\u6587\u4EF6\u4E2D\u641C\u7D22\u9700\u8981\u7684\u5185\u5BB9\u3002\r
|
|
23
|
-
`}function
|
|
19
|
+
`}function yn(e=ot){return`\r
|
|
24
20
|
[ACode] \u547D\u4EE4\u8D85\u8FC7 ${Math.round(e/1e3)} \u79D2\u6CA1\u6709\u65B0\u7684\u8F93\u51FA\uFF0C\u5DF2\u505C\u6B62\u6267\u884C\u5E76\u4FDD\u7559\u6B64\u524D\u8F93\u51FA\u3002\r
|
|
25
|
-
`}async function
|
|
26
|
-
`).trim()}function
|
|
27
|
-
`),!0;const s=
|
|
21
|
+
`}async function st(e){const n=e.outputPath||mn(e.agentId,e.startedAt);return e.outputPath=n,await F.mkdir(N.dirname(n),{recursive:!0}),await F.writeFile(n,e.chunks.join(""),"utf-8"),n}function Sn(e){return String(e??"").replace(/\r/g,`
|
|
22
|
+
`).trim()}function In(e=process.platform,n=process.env){const t=n.AWS_TERMINAL_OUTPUT_ENCODING?.trim();return t||(e==="win32"?fn:nt)}function it(e=In()){if(e!=="utf-8")try{return new oe(e,{fatal:!1})}catch{return new oe(nt,{fatal:!1})}return hn()}function hn(){let e=null,n=null,t=null;const r=[];function s(o){try{return new oe(o,{fatal:!1})}catch{return new oe("utf-8",{fatal:!1})}}return{decode(o,i){if(o!=null&&r.push(o instanceof ArrayBuffer?Buffer.from(o):Buffer.isBuffer(o)?o:Buffer.from(o.buffer,o.byteOffset,o.byteLength)),t==="gb18030")return n||(n=s("gb18030")),n.decode(o,i);e||(e=s("utf-8"));const a=e.decode(o,i);if(t===null&&a.includes("\uFFFD")){t="gb18030",n=s("gb18030");const c=Buffer.concat(r);return n.decode(c)}return t===null&&!i?.stream&&(t="utf-8"),a}}}function ue(e,n,t=!1){return t?e.decode():!n||n.length===0?"":e.decode(n,{stream:!0})}function An(e){const n=e.trim().match(/^cd(?:\s+(.*))?$/i);if(!n)return;const t=n[1]?.trim();if(!t)return null;const r=t.replace(/^\/d\s+/i,"").trim();return r.startsWith('"')&&r.endsWith('"')||r.startsWith("'")&&r.endsWith("'")?r.slice(1,-1):r}function Tn(e){const n=V.get(e.sessionId);if(n)return n;const t={currentDirectory:e.workspacePath,runningProcess:null};return V.set(e.sessionId,t),t}function at(e){for(const n of m.values())if(n.agentId===e)return n}async function _n(e){const n=h.get(e.providerId||"claude-code"),t=Z(n.getSessionStatus(e.sessionId),e.currentRuntimeStatus,e.currentRuntimeActionType);return{sessionId:e.sessionId,status:t,runtimeStatus:t,runtimeActionType:e.currentRuntimeActionType,runtimeActionLabel:e.currentRuntimeActionLabel,runtimeActionDetail:e.currentRuntimeActionDetail,agentId:e.agentId,workspacePath:e.workspacePath,command:e.config.command,mode:"sdk",providerSessionId:n.getProviderSessionId(e.sessionId),reused:!0}}function Z(e,n,t){const r=String(e||"").trim();if(r){const o=String(n||"").trim(),i=String(t||"").trim().toLowerCase();return r.toLowerCase()==="tool_using"&&o.toLowerCase()==="waiting_input"&&i==="idle"?o:r}return String(n||"").trim()||"running"}async function bn(e,n=vt){return e.pid?await n(e.pid)?mt(e.command)==="acode"?{reusable:!1,reason:"in-process-provider"}:{reusable:!0,reason:"active-pid"}:{reusable:!1,reason:"dead-pid"}:{reusable:!1,reason:"missing-pid"}}function jr(e){try{se(e)}catch(t){l.warn(`[cleanupSdkSessionByAgentId] clear debug mounts failed for agentId=${e}: ${t}`)}const n=at(e);if(!n)l.info(`[cleanupSdkSessionByAgentId] No active SDK session found for agentId=${e}, cleaning residual state anyway`);else{const t=n.sessionId;return l.info(`[cleanupSdkSessionByAgentId] Cleaning up SDK session for agentId=${e}, sessionId=${t}`),L(t),m.delete(t),H(t),le(t),q(t).catch(r=>{l.warn(`[cleanupSdkSessionByAgentId] Failed to remove persisted session for agentId=${e}: ${r}`)}),t}z.has(e)&&(z.delete(e),l.info(`[cleanupSdkSessionByAgentId] Released startingAgents lock for agentId=${e}`))}function le(e){const n=V.get(e);if(!n?.runningProcess){V.delete(e);return}try{n.runningProcess.kill()}catch{}finally{n.runningProcess=null,V.delete(e)}}function C(e,n){n&&(e.seq+=1,J(e.agentId,n,e.sessionId,e.seq,void 0,{runtimeAccessToken:e.runtimeAccessToken,schedulerBaseUrl:e.schedulerBaseUrl}).catch(()=>{}))}function we(e){return`\x1B[36m${e}>\x1B[0m `}function kn(e,n){return n==="~"?It.homedir():N.resolve(e,n)}async function Cn(e,n,t){const r=An(t);if(r===void 0)return!1;if(r===null)return C(e,`${n.currentDirectory}\r
|
|
23
|
+
`),!0;const s=kn(n.currentDirectory,r);try{return(await F.stat(s)).isDirectory()?(n.currentDirectory=s,C(e,`${n.currentDirectory}\r
|
|
28
24
|
`),!0):(C(e,`cd: not a directory: ${s}\r
|
|
29
25
|
`),!0)}catch(o){const i=o instanceof Error?o.message:String(o);return C(e,`cd: ${i}\r
|
|
30
|
-
`),!0}}async function
|
|
31
|
-
`),
|
|
32
|
-
`),C(t,
|
|
26
|
+
`),!0}}async function wn(e,n){const t=m.get(e);if(!t)throw new Error("SDK session not found");const r=Sn(n),s=Tn(t);if(!r)return{started:!1,cwd:s.currentDirectory};if(s.runningProcess)throw new Error("A terminal command is already running for this session");const o=K(r);if(C(t,`${we(s.currentDirectory)}${o}\r
|
|
27
|
+
`),Me(r))return C(t,`[Terminal Warning] \u68C0\u6D4B\u5230\u526A\u8D34\u677F\u4E34\u65F6 paste \u6587\u4EF6\u8DEF\u5F84\uFF0C\u5DF2\u8DF3\u8FC7\u6267\u884C\u3002\u8BF7\u7C98\u8D34\u6587\u4EF6\u5185\u5BB9\u6216\u4F7F\u7528\u663E\u5F0F\u8BFB\u53D6\u547D\u4EE4\u3002\r
|
|
28
|
+
`),C(t,we(s.currentDirectory)),{started:!1,cwd:s.currentDirectory};if(await Cn(t,s,r))return{started:!1,cwd:s.currentDirectory};await $(t.agentId,e,"tool_using",{actionType:"bash",actionLabel:"\u7EC8\u7AEF\u547D\u4EE4",actionDetail:o},void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl});const a=St(r,{cwd:s.currentDirectory,shell:!0,env:ct(t.agentId,t.workspacePath,process.env,t.config.envOverrides)});s.runningProcess=a;const c=it(),d=it(),u=t.providerId==="acode",f={agentId:t.agentId,startedAt:new Date,chunks:[],spilled:!1};let p;const g=()=>{p&&(clearTimeout(p),p=void 0)},k=()=>{g(),p=setTimeout(()=>{s.runningProcess===a&&(C(t,yn()),a.kill())},ot)},A=(T,w=!0)=>{if(T&&(u&&f.chunks.push(T),u&&w&&k(),!(u&&f.spilled))){if(u&&pn(f.chunks.join(""))>rt){f.spilled=!0,st(f).then(R=>{C(t,gn(R))}).catch(R=>{const D=R instanceof Error?R.message:String(R);C(t,`\r
|
|
33
29
|
[ACode] \u547D\u4EE4\u8F93\u51FA\u843D\u76D8\u5931\u8D25: ${D}\r
|
|
34
|
-
`)});return}C(t,
|
|
35
|
-
[Terminal Error] ${
|
|
36
|
-
`)}),a.on("close",(
|
|
30
|
+
`)});return}C(t,T)}};return u&&k(),a.stdout.on("data",T=>{A(ue(c,T))}),a.stderr.on("data",T=>{A(ue(d,T))}),a.on("error",T=>{C(t,`\r
|
|
31
|
+
[Terminal Error] ${T.message}\r
|
|
32
|
+
`)}),a.on("close",(T,w)=>{g(),s.runningProcess=null,A(ue(c,void 0,!0),!1),A(ue(d,void 0,!0),!1),f.spilled&&st(f).catch(R=>{const D=R instanceof Error?R.message:String(R);C(t,`\r
|
|
37
33
|
[ACode] \u547D\u4EE4\u8F93\u51FA\u6700\u7EC8\u843D\u76D8\u5931\u8D25: ${D}\r
|
|
38
|
-
`)}),
|
|
39
|
-
[exit ${
|
|
40
|
-
`)
|
|
41
|
-
[signal ${
|
|
42
|
-
`),C(t,
|
|
43
|
-
...\uFF08\u7ED3\u679C\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`}function
|
|
34
|
+
`)}),T&&T!==0?C(t,`\r
|
|
35
|
+
[exit ${T}]\r
|
|
36
|
+
`):w&&C(t,`\r
|
|
37
|
+
[signal ${w}]\r
|
|
38
|
+
`),C(t,we(s.currentDirectory)),$(t.agentId,e,"waiting_input",void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl})}),{started:!0,cwd:s.currentDirectory}}function ct(e,n,t,r,s){const o={};for(const[i,a]of Object.entries(t))a!==void 0&&(o[i]=a);if(n&&(o.AWS_WORKSPACE_PATH=String(n)),s&&String(s).trim()&&(o.AWS_PROJECT_ROOT=String(s).trim()),r)for(const[i,a]of Object.entries(r)){const c=i.trim();if(!c||a===void 0||a===null)continue;const d=String(a).trim();d&&(o[c]=d)}return o.AWS_AGENT_ID=String(e),o.AWS_MCP_CLAIM_LAUNCH_BINDING="true",o.AWS_RUNTIME_BRIDGE_BASE_URL=`http://127.0.0.1:${bt()}`,String(o.ACODE_HOME||"").trim()||(o.ACODE_HOME=je()),S(e,xe)!=="disabled"&&(o.AWS_LAUNCH_CONFIG_TOOLS=S(e,xe)),S(e,Ne)!=="disabled"&&(o.AWS_HIRE_TOOLS=S(e,Ne)),S(e,Be)!=="disabled"&&(o.AWS_PENCIL_TOOLS=S(e,Be)),S(e,ve)!=="disabled"&&(o.AWS_DRAW_TOOLS=S(e,ve)),S(e,Fe)!=="disabled"&&(o.AWS_OFFICE_TOOLS=S(e,Fe)),S(e,Ke)!=="disabled"&&(o.AWS_COLLABORATION_TASK_TOOLS=S(e,Ke)),S(e,He)!=="disabled"&&(o.AWS_COLLABORATION_MEETING_TOOLS=S(e,He)),S(e,qe)!=="disabled"&&(o.AWS_COLLABORATION_DEBUG_TOOLS=S(e,qe)),S(e,ze)!=="disabled"&&(o.AWS_COLLABORATION_FILE_HISTORY_TOOLS=S(e,ze)),S(e,We)!=="disabled"&&(o.AWS_EMAIL_TOOLS=S(e,We)),S(e,Ge)!=="disabled"&&(o.AWS_ABILITY_MARKET_TOOLS=S(e,Ge)),S(e,Ye)!=="disabled"&&(o.AWS_ABILITY_DEV_TOOLS=S(e,Ye)),o}function En(e){const n=e.trim(),t=n[0],r=n[n.length-1];return(t==='"'||t==="'")&&t===r?n.slice(1,-1):n}async function $n(e){const n=String(e);if(!Me(n))return n;const t=En(n);return N.isAbsolute(t)?F.readFile(t,"utf-8"):n}function dt(e,n){const t={};for(const s of[e?.env,n])if(s)for(const[o,i]of Object.entries(s)){const a=o.trim();if(!a||i===void 0||i===null)continue;const c=String(i).trim();c&&(t[a]=c)}const r=t.ANTHROPIC_MODEL?.trim()||t.CODEX_MODEL?.trim()||void 0;return{envOverrides:t,model:r}}async function Rn(){try{return await Ct().readClaudeCodeConfig()}catch(e){return console.warn(`[Runtime] Failed to read saved ClaudeCode AI config: ${e.message}`),{}}}function Dn(e){if(e==null)return;const t=(typeof e=="string"?e:JSON.stringify(e,null,2)).trim();if(t)return t.length<=Ve?t:`${t.slice(0,Ve)}
|
|
39
|
+
...\uFF08\u7ED3\u679C\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`}function Pn(e){try{const n=JSON.parse(e);if(n&&typeof n=="object"&&!Array.isArray(n))return["directMessages","groupMessages","messages"].some(t=>Array.isArray(n[t])&&n[t].length>0)}catch{}return e.trim().length>0}function On(e){if(e.data.actionType==="mcp")return!0;const t=String(e.data.toolName||"").toLowerCase();return t.startsWith("mcp__")||t.includes("-mcp__")||t.includes("mcp_")}function Mn(e){if(e.type!=="tool_use_end")return;const n=Dn(e.data.toolResult??e.data.actionResult);if(!n)return;const t=ke(e.data.toolName,e.data.toolInput),r=e.data.actionType||t.actionType;if(r==="idle"){const s=String(e.data.rawToolName||e.data.toolName||"").toLowerCase();if((s.includes("poll_message")||s.includes("get_message"))&&!Pn(n))return}return r==="mcp"&&On(e)?{actionType:"mcp",actionLabel:"MCP\u8FD4\u56DE",actionDetail:e.data.actionDetail||e.data.toolName,actionId:e.data.actionId||e.data.toolUseId,actionResult:n,...e.data.parentId?{parentId:e.data.parentId}:{}}:{actionType:r,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:e.data.actionDetail||t.actionDetail||e.data.toolName,actionId:e.data.actionId||e.data.toolUseId,actionResult:n,...e.data.parentId?{parentId:e.data.parentId}:{}}}function Ln(e){if(e.type==="ai_request"){const n=e.data.model?` ${e.data.model}`:"",t=e.data.lastUserMessagePreview?`\uFF1A${e.data.lastUserMessagePreview}`:"";return`\r
|
|
44
40
|
[ACode] \u6B63\u5728\u8BF7\u6C42\u6A21\u578B${n}${t}\r
|
|
45
41
|
`}if(e.type==="text_delta"||e.type==="thinking"||e.type==="command_output")return e.data.text||void 0;if(e.type==="error")return e.data.text?`\r
|
|
46
42
|
[SDK Error] ${e.data.text}\r
|
|
47
|
-
`:void 0}function
|
|
48
|
-
...\uFF08\u8F93\u5165\u53C2\u6570\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`:n}catch{return}}function vn(e,n){return String(n||"").trim().toLowerCase()!=="waiting_input"?!1:e.type==="thinking"||e.type==="text_delta"}function Kn(e,n){if(!vn(e,n)){if(e.type==="background_command_completed")return{status:"tool_result",actionInfo:{actionType:"background_command",actionLabel:"\u540E\u53F0\u547D\u4EE4",actionDetail:"background_command_completed"}};if(e.type==="thinking"||e.type==="text_delta")return{status:"thinking"};if(e.type==="tool_use_start"){const t=be(e.data.toolName,e.data.toolInput),r=ct(e,t),s=Fn(e.data.toolInput);return e.data.actionType==="idle"||t.actionType==="idle"?{status:"waiting_input",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:r||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:s,actionId:e.data.actionId||e.data.toolUseId}}:{status:"tool_using",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:r||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:s,actionId:e.data.actionId||e.data.toolUseId,...e.data.batchId?{parentId:e.data.batchId}:{}}}}if(e.type==="turn_complete")return{status:"waiting_input",actionInfo:e.data.usage?{usage:e.data.usage}:void 0};if(e.type==="error")return{status:"error"};if(e.type==="context_compaction")return{status:"compacting",actionInfo:{actionType:"context_compaction",actionLabel:e.data.actionLabel,actionDetail:e.data.actionDetail,...e.data.actionId?{actionId:e.data.actionId}:{},...e.data.parentId?{parentId:e.data.parentId}:{}}};if(e.type==="runtime_capabilities")return{status:n||"waiting_input",actionInfo:{actionType:"runtime_capabilities",actionLabel:e.data.actionLabel||"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:e.data.actionDetail}};if(e.type==="tool_batch_start"){const t=e.data.batchId;return t?{status:"tool_result",actionInfo:{actionType:"tool_batch",actionLabel:"\u5E76\u884C\u6267\u884C\u5DE5\u5177",actionDetail:e.data.actionDetail,actionId:t}}:void 0}if(e.type==="tool_batch_metrics"){const t=e.data.batchId;return t?{status:"tool_result",actionInfo:{actionType:"tool_batch",actionLabel:"\u5E76\u884C\u6267\u884C\u5DE5\u5177",actionId:t,batchId:t,...e.data.batchMetrics?{batchMetrics:e.data.batchMetrics}:{}}}:void 0}}}const U=new Map,le=new Map,fe=new Map;async function we(e){const{entry:n,sessionId:t,actionInfo:r,timestamp:s,sourceEventType:o,backoffBaseMs:i,label:a}=e,c={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl},u=3;for(let d=0;d<u;d++){if(await E(n.agentId,t,"tool_result",r,void 0,c,s,o)!==void 0)return;d<u-1&&await new Promise(m=>setTimeout(m,i*(d+1)))}f.warn(`[Runtime] ${a} tool_result sendStatus retry exhausted (result may be lost): agentId=${n.agentId}`)}const Z=new Map,Hn=20,qn=500,zn=3e4;async function me(e,n=zn,t=2){for(let r=0;r<=t;r++){const s=new AbortController;let o;try{const i=e(s.signal);i.catch(()=>{}),await Promise.race([i,new Promise((a,c)=>{o=setTimeout(()=>{s.abort(),c(new Error(`sendOutput timeout after ${n}ms`))},n)})]),o&&clearTimeout(o);return}catch(i){o&&clearTimeout(o);const a=i instanceof Error?i.message:String(i);if(r<t){const c=1e3*(r+1);f.warn(`sendOutput attempt ${r+1}/${t+1} failed (${a}), retrying in ${c}ms...`),await new Promise(u=>setTimeout(u,c));continue}f.warn(`sendOutput failed after ${t+1} attempts (${a}), giving up to unblock serial queue`)}}}function pe(e,n){const t=n?`${e}:${n}`:void 0;let r,s;if(t)r=Z.get(t),s=t;else{const p=[];for(const[b,y]of Z)b.startsWith(e+":")&&y.buffer&&p.push(y.sourceEventType);for(const b of p)pe(e,b);return}if(!r||!r.buffer)return;r.timer=null;const o=r.buffer,i=r.seq,a=r.entry,c=r.sourceEventType;r.buffer="",s&&Z.delete(s);const u={sourceEventType:c,logCategory:"acode"},d={runtimeAccessToken:a.runtimeAccessToken,schedulerBaseUrl:a.schedulerBaseUrl},m=(U.get(e)??Promise.resolve()).then(()=>me(p=>J(a.agentId,o,e,i,u,d,p)),()=>me(p=>J(a.agentId,o,e,i,u,d,p)));U.set(e,m),m.finally(()=>{U.get(e)===m&&U.delete(e)})}function Wn(e,n){const t=Dn(e);if(!t)return;n.seq+=1;const r=n.seq,s=Pn(e),o={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl};if((e.type==="command_output"||e.type==="text_delta"||e.type==="thinking")&&t.length<Hn){const c=`${e.sessionId}:${e.type}`;let u=Z.get(c);if(u||(u={buffer:"",seq:0,timer:null,entry:n,sourceEventType:e.type}),u.buffer+=t,u.seq=r,u.entry=n,!u.timer){const d=e.sessionId,l=e.type;u.timer=setTimeout(()=>pe(d,l),qn)}Z.set(c,u);return}pe(e.sessionId);const a=(U.get(e.sessionId)??Promise.resolve()).then(()=>me(c=>J(n.agentId,t,e.sessionId,r,s,o,c)),()=>me(c=>J(n.agentId,t,e.sessionId,r,s,o,c)));U.set(e.sessionId,a),a.finally(()=>{U.get(e.sessionId)===a&&U.delete(e.sessionId)})}function dt(e){return St(e)}let lt=!1;function Gn(){lt||(It(_,Xn),Ct(),lt=!0)}function Xn(e,n){e.on("event",t=>{const r=g.get(t.sessionId);if(r){if(t.type==="tool_use_start"?jt(r.sessionId,t.data.toolUseId||t.data.actionId,t.data.toolInput,t.data.toolName,r.workspacePath):t.type==="tool_use_end"&&Nt(t,{sessionId:r.sessionId,agentId:r.agentId,workspacePath:r.workspacePath,providerId:r.providerId}),f.info(`[${n.displayName} Adapter] Event: ${t.type} for session ${t.sessionId}`),!(t.type==="thinking"||t.type==="text_delta"||t.type==="tool_use_start"||t.type==="context_compaction"||t.type==="ai_request"||t.type==="error")){t.type==="runtime_capabilities"&&t.data.actionDetail&&(r.cachedCapabilitiesActionDetail=t.data.actionDetail);const i=Kn(t,r.currentRuntimeStatus);i&&E(r.agentId,t.sessionId,i.status,i.actionInfo,ae(i.actionInfo),{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl},t.timestamp?new Date(t.timestamp).getTime():void 0,t.type)}Wn(t,r);const o=Rn(t);if(o){const i=t.timestamp?new Date(t.timestamp).getTime():void 0,a=String(t.data?.toolName||"").toLowerCase()==="browser_launch",c=t.type==="tool_use_end"&&String(t.data?.rawToolName||t.data?.toolName||"").toLowerCase().replace(/[_-]/g,"").includes("todowrite");we(a?{entry:r,sessionId:t.sessionId,actionInfo:o,timestamp:i,sourceEventType:t.type,backoffBaseMs:3e3,label:"browser_launch"}:c?{entry:r,sessionId:t.sessionId,actionInfo:o,timestamp:i,sourceEventType:t.type,backoffBaseMs:1e3,label:"todo_write"}:{entry:r,sessionId:t.sessionId,actionInfo:o,timestamp:i,sourceEventType:t.type,backoffBaseMs:1e3,label:"tool_result"})}}}),e.on("status-change",(t,r,s)=>{const o=g.get(t);if(o){pe(t),r==="thinking"||r==="tool_using"||r==="compacting"?Xt(t):M(t);const i=sn(r,s);o.currentRuntimeStatus=i.status;const a=o.currentRuntimeActionDetail??"",c=a.includes("poll_message")||a.includes("get_message"),d=!(i.actionInfo?.actionType==="ai_request")&&(i.status==="thinking"||i.status==="waiting_input")&&(o.currentRuntimeActionType==="idle"||o.currentRuntimeActionType==="mcp")&&c;(i.actionInfo?.actionType||!d)&&(o.currentRuntimeActionType=i.actionInfo?.actionType,o.currentRuntimeActionLabel=i.actionInfo?.actionLabel,o.currentRuntimeActionDetail=i.actionInfo?.actionDetail,o.currentRuntimeActionInput=i.actionInfo?.actionInput),f.info(`[${n.displayName} Adapter] Status changed: ${i.status} for agent ${o.agentId}`,i.actionInfo||""),qt(t,{runtimeStatus:i.status,runtimeActionType:o.currentRuntimeActionType,runtimeActionLabel:o.currentRuntimeActionLabel,runtimeActionDetail:o.currentRuntimeActionDetail});const l=i.actionInfo?.actionType?i.actionInfo:o.currentRuntimeActionType?{actionType:o.currentRuntimeActionType,actionLabel:o.currentRuntimeActionLabel??"",actionDetail:o.currentRuntimeActionDetail,actionInput:o.currentRuntimeActionInput}:void 0;if(i.status==="compacting"){const p=(le.get(t)??Promise.resolve()).then(async()=>{for(let y=0;y<=2;y++){if(await E(o.agentId,t,i.status,l,ae(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})!==void 0)return;y<2&&(f.warn(`[${n.displayName}] compaction sendStatus attempt ${y+1} failed (HTTP), retrying in ${1e3*(y+1)}ms...`),await new Promise($=>setTimeout($,1e3*(y+1))))}f.warn(`[${n.displayName}] compaction sendStatus failed after 3 attempts, event may be lost`)}).catch(b=>{f.warn(`[${n.displayName}] compaction status chain error:`,b)});le.set(t,p),p.finally(()=>{le.get(t)===p&&le.delete(t)})}else{const m=d&&!i.actionInfo?.actionType;if(an({status:i.status,actionInfo:i.actionInfo,restoredActionInfo:l,currentRuntimeActionType:o.currentRuntimeActionType,shouldPreservePrevAction:d})){const y=(fe.get(t)??Promise.resolve()).then(async()=>{for(let $=0;$<=2;$++){if(await E(o.agentId,t,i.status,m?void 0:l,ae(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})!==void 0)return;$<2&&await new Promise(D=>setTimeout(D,1e3*($+1)))}f.warn(`[${n.displayName}] idle tool sendStatus failed after 3 attempts, status may be stale (frontend will fall back to timeline tool_use event)`)}).catch(h=>{f.warn(`[${n.displayName}] idle status chain error:`,h)});fe.set(t,y),y.finally(()=>{fe.get(t)===y&&fe.delete(t)})}else E(o.agentId,t,i.status,m?void 0:l,ae(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})}if(i.status==="waiting_input"&&o.cachedCapabilitiesActionDetail){const m=o.cachedCapabilitiesActionDetail;o.cachedCapabilitiesActionDetail=void 0,f.info(`[${n.displayName} Adapter] Re-sending cached runtime_capabilities for agent ${o.agentId} (session stabilized to waiting_input)`),E(o.agentId,t,"waiting_input",{actionType:"runtime_capabilities",actionLabel:"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:m},void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})}}}),e.on("ask-user-question",t=>{const r=g.get(t.sessionId);r&&(f.info(`[${n.displayName} Adapter] AskUserQuestion for agent ${r.agentId}`),Bt(r.agentId,t.sessionId,Array.isArray(t.questions)?t.questions:[],{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl},t.toolCallId))}),e.on("tool-permission-request",t=>{const r=g.get(t.sessionId);r&&t.requestId&&(f.info(`[${n.displayName} Adapter] Tool permission request (${t.capability}) for agent ${r.agentId}`),Ft(r.agentId,t.sessionId,{requestId:t.requestId,capability:t.capability,...t.detail||{}},{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl}))}),e.on("permission-request",t=>{const r=g.get(t.sessionId);if(r){f.info(`[${n.displayName} Adapter] Permission request: ${t.toolName} for agent ${r.agentId}`);const s=t.toolInput?K(JSON.stringify(t.toolInput).slice(0,400)):void 0;E(r.agentId,t.sessionId,"waiting_input",{actionType:"other",actionLabel:"\u6743\u9650\u786E\u8BA4",actionDetail:s||t.toolName},void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl})}})}S.post("/start",I,async(e,n)=>{const{agentId:t,workspacePath:r,mode:s="sdk"}=e.body||{};if(!t||!r){n.status(400).json({error:"agentId and workspacePath are required"});return}const o=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||Ue(Ge(e))||void 0;Lt({agentId:String(t),workspacePath:String(r),serverUrl:e.body?.serverUrl||o,runtimeAccessToken:e.body?.runtimeAccessToken,userId:e.body?.userId,schedulerBaseUrl:o}),e.body?.runtimeFeatures!==null&&e.body?.runtimeFeatures!==void 0&&(wt(String(t),e.body.runtimeFeatures),f.info(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u80FD\u529B\u5F00\u5173: ${JSON.stringify(Pt(String(t)))}`)),e.body?.inheritedFeatures!==null&&e.body?.inheritedFeatures!==void 0&&(Rt(String(t),e.body.inheritedFeatures),f.info(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u7EE7\u627F\u4E09\u6001\u5C42: ${JSON.stringify(Ot(String(t)))}`)),e.body?.capabilities!==void 0&&Et(String(t),e.body.capabilities),e.body?.capabilitiesInherited!==void 0&&Dt(String(t),e.body.capabilitiesInherited),e.body?.envVars!==null&&e.body?.envVars!==void 0&&typeof e.body.envVars=="object"&&(Mt(String(t),e.body.envVars),f.info(`[Runtime] agent ${t} \u4E0B\u53D1\u6709\u6548\u73AF\u5883\u53D8\u91CF: ${Object.keys(e.body.envVars).length} \u9879 \u2192 \u5DE5\u5177\u5B50\u8FDB\u7A0B + MCP spec`)),e.body?.changeCacheRetentionDays!==void 0&&(bt(e.body.changeCacheRetentionDays),f.info(`[Runtime] agent ${t} \u4E0B\u53D1\u53D8\u66F4\u7F13\u5B58\u4FDD\u7559\u5929\u6570: ${e.body.changeCacheRetentionDays??"\u4E0D\u6E05\u7406"}`)),s&&s!=="sdk"&&console.warn(`[Runtime] Unsupported runtime mode "${s}" requested for agent ${t}; starting SDK session instead.`),await Yn(e,n)});async function Yn(e,n){const{agentId:t,workspacePath:r,command:s,projectRoot:o,autoAccept:i=!0,initialPrompt:a,systemPrompt:c,globalPrompt:u,rolePrompt:d,memory:l,resumeContext:m,resumeTranscript:p,mcpConfigPath:b,extraMcpServers:y,envOverrides:h,idleInputAutoCommand:$,nonInputAutoCommand:R,model:D,instanceAiConfig:ge,subAgentModel:ye,subAgentEffort:he,scopeKey:Ee,browserAllowPrivate:Re}=e.body||{},W=Zt(p);f.info(`[HIBERNATE-IMPORT] \u542F\u52A8\u8BF7\u6C42\u643A\u5E26\u4F11\u7720\u6062\u590D: agentId=${String(t||"").trim()||"?"} resumeContext=${typeof m=="string"?`${m.length}\u5B57`:"\u65E0"} resumeTranscript\u539F\u59CB=${typeof p=="string"?`${p.length}\u5B57`:typeof p} \u89E3\u6790\u7ED3\u679C=${W?`${W.length}\u6761`:"null"}`);const G=Wt();G.log({level:"info",category:"launch",message:"startSdkSession: \u6536\u5230\u542F\u52A8\u8BF7\u6C42",source:"bridge",agentId:String(t||"").trim()||void 0,details:{reqBodyKeys:Object.keys(e.body||{}),perInstanceAiConfig:ge?oe(ge):null,perAgentModel:D??null}});let w=null;const A=String(t||"").trim(),Ie=String(e.body?.runtimeAccessToken||"").trim()||void 0,B=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||Ue(Ge(e))||void 0;B?f.info(`[startSdkSession] \u56DE\u8C03\u76EE\u6807 server: ${B} (agentId=${A})`):f.warn(`[startSdkSession] \u672A\u89E3\u6790\u5230 schedulerBaseUrl\uFF0C\u5C06\u56DE\u9000\u5230\u9ED8\u8BA4\u5730\u5740 (agentId=${A})`);try{if(Gn(),!A){n.status(400).json({error:"agentId is required"});return}const F=ot(A);if(F){n.json(await In(F));return}const k=await vt(A);if(k){const O=await Sn(k);if(!O.reusable)console.warn(`[Runtime] Ignoring stale persisted SDK session for agentId=${A}, sessionId=${k.sessionId}, reason=${O.reason}`),await q(k.sessionId);else{const L=ue(k.runtimeStatus,k.runtimeStatus,k.runtimeActionType);n.json({sessionId:k.sessionId,status:L,runtimeStatus:L,runtimeActionType:k.runtimeActionType,runtimeActionLabel:k.runtimeActionLabel,runtimeActionDetail:k.runtimeActionDetail,agentId:k.agentId,workspacePath:k.workspacePath,command:k.command,mode:k.mode||"sdk",pid:k.pid,reused:!0,persistedOnly:!0});return}}if(z.has(A)){n.status(409).json({error:"SDK session is already starting for this agent"});return}z.add(A);const P=dt(s),ft=_.get(P);w=ht();const mt=P==="claude-code"?await Cn():null,ee=it(P==="claude-code"?mt:null,h),X=P==="acode"?D?String(D).trim():void 0:(()=>{const O=D?String(D).trim():void 0,L=ee.model?String(ee.model).trim():void 0;return O||L})();G.log({level:"info",category:"resolve",message:"\u6A21\u578B\u89E3\u6790\u7ED3\u679C",source:"bridge",agentId:A,sessionId:w??void 0,details:{perAgentModel:D??null,globalModel:ee.model??null,resolvedModel:X??null,providerId:P,note:P==="acode"?"adapter handles full priority":"request > global"}});const Se={...ee.envOverrides};X&&(Se.ANTHROPIC_MODEL=X,Se.CODEX_MODEL=X);let Y,Ae=b;if(P==="acode"){const O=ge||{},L=await $t({apiOverrides:Qe(O)??void 0,agentId:A,sessionId:w??void 0,runtimeBridgeBaseUrl:B});Y=L.instanceConfig.config,Ae=L.perInstanceConfigPath,G.log({level:"info",category:"apply",message:"prepareAcodeInstanceConfig \u5B8C\u6210",source:"bridge",agentId:A,sessionId:w??void 0,details:{sanitizedApiOverrides:(()=>{const N=Qe(O);return N?oe(N):null})(),resolvedInstanceAiConfig:Y?oe(Y):null,perInstanceConfigPath:Ae,instanceConfigSources:L.instanceConfig.source??null}})}let De=c||void 0,Te,_e,te;const ne=typeof m=="string"&&m.trim()?Tt(m):void 0;if(P==="acode")if(Te=typeof u=="string"&&u.trim()||void 0,_e=typeof d=="string"&&d.trim()||void 0,typeof l=="string"&&l.trim())te=l.trim();else{const O=await tn(r,{schedulerBaseUrl:B,runtimeAccessToken:Ie,agentId:A});O&&(te=O,f.info(`[startSdkSession] Auto-loaded memories for ACode agent ${A}`))}else if(typeof u=="string"&&u.trim()||typeof d=="string"&&d.trim()||typeof l=="string"&&l.trim()||ne!==void 0){const L=[u,d,l,ne,c].filter(N=>typeof N=="string"&&N.trim().length>0).map(N=>N.trim());De=L.length>0?L.join(`
|
|
43
|
+
`:void 0}function jn(e){const n=Nn(e);return{sourceEventType:e.type,logCategory:"acode",...xn(e),...n?{logLevel:Un(e),logMessage:n}:{}}}function Un(e){return e.type==="error"?"error":e.type==="command_output"&&e.data.stream==="stderr"?"warn":"info"}function xn(e){return e.type!=="command_output"?{}:{...typeof e.data.stream=="string"?{stream:e.data.stream}:{},...typeof e.data.sequence=="number"?{sequence:e.data.sequence}:{},...typeof e.data.cwd=="string"?{cwd:e.data.cwd}:{},...typeof e.data.commandFilePath=="string"?{commandFilePath:e.data.commandFilePath}:{},...typeof e.data.commandLineCount=="number"?{commandLineCount:e.data.commandLineCount}:{}}}function Nn(e){if(e.type==="ai_request"){const n=e.data.model||"unknown-model",t=e.data.endpoint?` @ ${e.data.endpoint}`:"",r=typeof e.data.toolCount=="number"?`, tools=${e.data.toolCount}`:"";return`AI request started: ${n}${t}${r}`}if(e.type==="tool_use_start")return ut(e,"\u5F00\u59CB");if(e.type==="tool_use_end")return ut(e,"\u5B8C\u6210");if(e.type==="command_output")return Fn(e);if(e.type==="turn_complete")return`Turn completed${e.data.finishReason?`, finish=${e.data.finishReason}`:""}`;if(e.type==="session_complete")return`Session completed: exitCode=${e.data.exitCode??0}`;if(e.type==="error")return e.data.text||"ACode runtime error"}const Bn=/\x1b\[[0-9;?]*[a-zA-Z]/g;function vn(e){return e.replace(Bn,"")}function Fn(e){const n=typeof e.data.stream=="string"?e.data.stream:"mixed",t=typeof e.data.sequence=="number"?` #${e.data.sequence}`:"",r=vn(String(e.data.text||"")).replace(/\s+/g," ").trim(),s=r.length>240?`${r.slice(0,240)}...`:r;return`\u547D\u4EE4\u8F93\u51FA(${n}${t}): ${s||"(empty)"}`}function ut(e,n){const t=ke(e.data.toolName,e.data.toolInput),r=e.data.actionLabel||t.actionLabel||"\u8C03\u7528\u5DE5\u5177",s=lt(e,t);return s?`${n}${r}: ${s}`:`${n}${r}: ${e.data.actionDetail||e.data.toolName||"tool"}`}function lt(e,n){const t=e.data.toolInput;return n.actionType==="bash"?Kn(t)||e.data.actionDetail||n.actionDetail:n.actionType==="read_file"||n.actionType==="edit_file"||n.actionType==="write_file"?Hn(t)||e.data.actionDetail||n.actionDetail:e.data.actionDetail||n.actionDetail}function Kn(e){const n=Ee(e?.command,e?.cmd);if(n)return n;if(Array.isArray(e?.argv)){const t=e.argv.map(r=>String(r??"").trim()).filter(Boolean).join(" ");return t?K(t):void 0}return Ee(e?.args)}function Hn(e){const n=ft(e?.paths);return n.length>0?n.length===1?n[0]:`${n.length}\u4E2A\u6587\u4EF6: ${n.join(", ")}`:Ee(e?.file_path,e?.filePath,e?.path,e?.target_file,e?.targetFile)}function Ee(...e){for(const n of e){if(typeof n=="string"&&n.trim())return K(n.trim());if(Array.isArray(n)){const t=ft(n)[0];if(t)return t}}}function ft(e){return Array.isArray(e)?e.map(n=>typeof n=="string"?n.trim():"").filter(Boolean).map(n=>K(n)):[]}function qn(e){if(!(!e||Object.keys(e).length===0))try{const n=K(JSON.stringify(e,null,2));return n.length>8e3?`${n.slice(0,8e3)}
|
|
44
|
+
...\uFF08\u8F93\u5165\u53C2\u6570\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`:n}catch{return}}function zn(e,n){return String(n||"").trim().toLowerCase()!=="waiting_input"?!1:e.type==="thinking"||e.type==="text_delta"}function Wn(e,n){if(!zn(e,n)){if(e.type==="background_command_completed")return{status:"tool_result",actionInfo:{actionType:"background_command",actionLabel:"\u540E\u53F0\u547D\u4EE4",actionDetail:"background_command_completed"}};if(e.type==="thinking"||e.type==="text_delta")return{status:"thinking"};if(e.type==="tool_use_start"){const t=ke(e.data.toolName,e.data.toolInput),r=lt(e,t),s=qn(e.data.toolInput);return e.data.actionType==="idle"||t.actionType==="idle"?{status:"waiting_input",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:r||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:s,actionId:e.data.actionId||e.data.toolUseId}}:{status:"tool_using",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:r||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:s,actionId:e.data.actionId||e.data.toolUseId,...e.data.batchId?{parentId:e.data.batchId}:{}}}}if(e.type==="turn_complete")return{status:"waiting_input",actionInfo:e.data.usage?{usage:e.data.usage}:void 0};if(e.type==="error")return{status:"error"};if(e.type==="context_compaction")return{status:"compacting",actionInfo:{actionType:"context_compaction",actionLabel:e.data.actionLabel,actionDetail:e.data.actionDetail,...e.data.actionId?{actionId:e.data.actionId}:{},...e.data.parentId?{parentId:e.data.parentId}:{}}};if(e.type==="runtime_capabilities")return{status:n||"waiting_input",actionInfo:{actionType:"runtime_capabilities",actionLabel:e.data.actionLabel||"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:e.data.actionDetail}};if(e.type==="tool_batch_start"){const t=e.data.batchId;return t?{status:"tool_result",actionInfo:{actionType:"tool_batch",actionLabel:"\u5E76\u884C\u6267\u884C\u5DE5\u5177",actionDetail:e.data.actionDetail,actionId:t}}:void 0}if(e.type==="tool_batch_metrics"){const t=e.data.batchId;return t?{status:"tool_result",actionInfo:{actionType:"tool_batch",actionLabel:"\u5E76\u884C\u6267\u884C\u5DE5\u5177",actionId:t,batchId:t,...e.data.batchMetrics?{batchMetrics:e.data.batchMetrics}:{}}}:void 0}}}const j=new Map,fe=new Map,me=new Map;async function $e(e){const{entry:n,sessionId:t,actionInfo:r,timestamp:s,sourceEventType:o,backoffBaseMs:i,label:a}=e,c={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl},d=3;for(let u=0;u<d;u++){if(await $(n.agentId,t,"tool_result",r,void 0,c,s,o)!==void 0)return;u<d-1&&await new Promise(p=>setTimeout(p,i*(u+1)))}l.warn(`[Runtime] ${a} tool_result sendStatus retry exhausted (result may be lost): agentId=${n.agentId}`)}const ee=new Map,Gn=20,Yn=500,Xn=3e4;async function pe(e,n=Xn,t=2){for(let r=0;r<=t;r++){const s=new AbortController;let o;try{const i=e(s.signal);i.catch(()=>{}),await Promise.race([i,new Promise((a,c)=>{o=setTimeout(()=>{s.abort(),c(new Error(`sendOutput timeout after ${n}ms`))},n)})]),o&&clearTimeout(o);return}catch(i){o&&clearTimeout(o);const a=i instanceof Error?i.message:String(i);if(r<t){const c=1e3*(r+1);l.warn(`sendOutput attempt ${r+1}/${t+1} failed (${a}), retrying in ${c}ms...`),await new Promise(d=>setTimeout(d,c));continue}l.warn(`sendOutput failed after ${t+1} attempts (${a}), giving up to unblock serial queue`)}}}function ge(e,n){const t=n?`${e}:${n}`:void 0;let r,s;if(t)r=ee.get(t),s=t;else{const g=[];for(const[k,A]of ee)k.startsWith(e+":")&&A.buffer&&g.push(A.sourceEventType);for(const k of g)ge(e,k);return}if(!r||!r.buffer)return;r.timer=null;const o=r.buffer,i=r.seq,a=r.entry,c=r.sourceEventType;r.buffer="",s&&ee.delete(s);const d={sourceEventType:c,logCategory:"acode"},u={runtimeAccessToken:a.runtimeAccessToken,schedulerBaseUrl:a.schedulerBaseUrl},p=(j.get(e)??Promise.resolve()).then(()=>pe(g=>J(a.agentId,o,e,i,d,u,g)),()=>pe(g=>J(a.agentId,o,e,i,d,u,g)));j.set(e,p),p.finally(()=>{j.get(e)===p&&j.delete(e)})}function Jn(e,n){const t=Ln(e);if(!t)return;n.seq+=1;const r=n.seq,s=jn(e),o={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl};if((e.type==="command_output"||e.type==="text_delta"||e.type==="thinking")&&t.length<Gn){const c=`${e.sessionId}:${e.type}`;let d=ee.get(c);if(d||(d={buffer:"",seq:0,timer:null,entry:n,sourceEventType:e.type}),d.buffer+=t,d.seq=r,d.entry=n,!d.timer){const u=e.sessionId,f=e.type;d.timer=setTimeout(()=>ge(u,f),Yn)}ee.set(c,d);return}ge(e.sessionId);const a=(j.get(e.sessionId)??Promise.resolve()).then(()=>pe(c=>J(n.agentId,t,e.sessionId,r,s,o,c)),()=>pe(c=>J(n.agentId,t,e.sessionId,r,s,o,c)));j.set(e.sessionId,a),a.finally(()=>{j.get(e.sessionId)===a&&j.delete(e.sessionId)})}function mt(e){return _t(e)}let pt=!1;function Vn(){pt||(Tt(h,Qn),$t(),pt=!0)}function Qn(e,n){e.on("event",t=>{const r=m.get(t.sessionId);if(r){if(t.type==="tool_use_start"?Kt(r.sessionId,t.data.toolUseId||t.data.actionId,t.data.toolInput,t.data.toolName,r.workspacePath):t.type==="tool_use_end"&&Ft(t,{sessionId:r.sessionId,agentId:r.agentId,workspacePath:r.workspacePath,providerId:r.providerId}),l.info(`[${n.displayName} Adapter] Event: ${t.type} for session ${t.sessionId}`),!(t.type==="thinking"||t.type==="text_delta"||t.type==="tool_use_start"||t.type==="context_compaction"||t.type==="ai_request"||t.type==="error")){t.type==="runtime_capabilities"&&t.data.actionDetail&&(r.cachedCapabilitiesActionDetail=t.data.actionDetail);const i=Wn(t,r.currentRuntimeStatus);i&&$(r.agentId,t.sessionId,i.status,i.actionInfo,de(i.actionInfo),{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl},t.timestamp?new Date(t.timestamp).getTime():void 0,t.type)}Jn(t,r);const o=Mn(t);if(o){const i=t.timestamp?new Date(t.timestamp).getTime():void 0,a=String(t.data?.toolName||"").toLowerCase()==="browser_launch",c=t.type==="tool_use_end"&&String(t.data?.rawToolName||t.data?.toolName||"").toLowerCase().replace(/[_-]/g,"").includes("todowrite");$e(a?{entry:r,sessionId:t.sessionId,actionInfo:o,timestamp:i,sourceEventType:t.type,backoffBaseMs:3e3,label:"browser_launch"}:c?{entry:r,sessionId:t.sessionId,actionInfo:o,timestamp:i,sourceEventType:t.type,backoffBaseMs:1e3,label:"todo_write"}:{entry:r,sessionId:t.sessionId,actionInfo:o,timestamp:i,sourceEventType:t.type,backoffBaseMs:1e3,label:"tool_result"})}}}),e.on("status-change",(t,r,s)=>{const o=m.get(t);if(o){ge(t),r==="thinking"||r==="tool_using"||r==="compacting"?Qt(t):L(t);const i=un(r,s);o.currentRuntimeStatus=i.status;const a=o.currentRuntimeActionDetail??"",c=a.includes("poll_message")||a.includes("get_message"),u=!(i.actionInfo?.actionType==="ai_request")&&(i.status==="thinking"||i.status==="waiting_input")&&(o.currentRuntimeActionType==="idle"||o.currentRuntimeActionType==="mcp")&&c;(i.actionInfo?.actionType||!u)&&(o.currentRuntimeActionType=i.actionInfo?.actionType,o.currentRuntimeActionLabel=i.actionInfo?.actionLabel,o.currentRuntimeActionDetail=i.actionInfo?.actionDetail,o.currentRuntimeActionInput=i.actionInfo?.actionInput),l.info(`[${n.displayName} Adapter] Status changed: ${i.status} for agent ${o.agentId}`,i.actionInfo||""),Yt(t,{runtimeStatus:i.status,runtimeActionType:o.currentRuntimeActionType,runtimeActionLabel:o.currentRuntimeActionLabel,runtimeActionDetail:o.currentRuntimeActionDetail});const f=i.actionInfo?.actionType?i.actionInfo:o.currentRuntimeActionType?{actionType:o.currentRuntimeActionType,actionLabel:o.currentRuntimeActionLabel??"",actionDetail:o.currentRuntimeActionDetail,actionInput:o.currentRuntimeActionInput}:void 0;if(i.status==="compacting"){const g=(fe.get(t)??Promise.resolve()).then(async()=>{for(let A=0;A<=2;A++){if(await $(o.agentId,t,i.status,f,de(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})!==void 0)return;A<2&&(l.warn(`[${n.displayName}] compaction sendStatus attempt ${A+1} failed (HTTP), retrying in ${1e3*(A+1)}ms...`),await new Promise(w=>setTimeout(w,1e3*(A+1))))}l.warn(`[${n.displayName}] compaction sendStatus failed after 3 attempts, event may be lost`)}).catch(k=>{l.warn(`[${n.displayName}] compaction status chain error:`,k)});fe.set(t,g),g.finally(()=>{fe.get(t)===g&&fe.delete(t)})}else{const p=u&&!i.actionInfo?.actionType;if(ln({status:i.status,actionInfo:i.actionInfo,restoredActionInfo:f,currentRuntimeActionType:o.currentRuntimeActionType,shouldPreservePrevAction:u})){const A=(me.get(t)??Promise.resolve()).then(async()=>{for(let w=0;w<=2;w++){if(await $(o.agentId,t,i.status,p?void 0:f,de(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})!==void 0)return;w<2&&await new Promise(D=>setTimeout(D,1e3*(w+1)))}l.warn(`[${n.displayName}] idle tool sendStatus failed after 3 attempts, status may be stale (frontend will fall back to timeline tool_use event)`)}).catch(T=>{l.warn(`[${n.displayName}] idle status chain error:`,T)});me.set(t,A),A.finally(()=>{me.get(t)===A&&me.delete(t)})}else $(o.agentId,t,i.status,p?void 0:f,de(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})}if(i.status==="waiting_input"&&o.cachedCapabilitiesActionDetail){const p=o.cachedCapabilitiesActionDetail;o.cachedCapabilitiesActionDetail=void 0,l.info(`[${n.displayName} Adapter] Re-sending cached runtime_capabilities for agent ${o.agentId} (session stabilized to waiting_input)`),$(o.agentId,t,"waiting_input",{actionType:"runtime_capabilities",actionLabel:"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:p},void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})}}}),e.on("ask-user-question",t=>{const r=m.get(t.sessionId);r&&(l.info(`[${n.displayName} Adapter] AskUserQuestion for agent ${r.agentId}`),Ht(r.agentId,t.sessionId,Array.isArray(t.questions)?t.questions:[],{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl},t.toolCallId))}),e.on("tool-permission-request",t=>{const r=m.get(t.sessionId);r&&t.requestId&&(l.info(`[${n.displayName} Adapter] Tool permission request (${t.capability}) for agent ${r.agentId}`),qt(r.agentId,t.sessionId,{requestId:t.requestId,capability:t.capability,...t.detail||{}},{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl}))}),e.on("permission-request",t=>{const r=m.get(t.sessionId);if(r){l.info(`[${n.displayName} Adapter] Permission request: ${t.toolName} for agent ${r.agentId}`);const s=t.toolInput?K(JSON.stringify(t.toolInput).slice(0,400)):void 0;$(r.agentId,t.sessionId,"waiting_input",{actionType:"other",actionLabel:"\u6743\u9650\u786E\u8BA4",actionDetail:s||t.toolName},void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl})}})}I.post("/start",y,async(e,n)=>{const{agentId:t,workspacePath:r,mode:s="sdk"}=e.body||{};if(!t||!r){n.status(400).json({error:"agentId and workspacePath are required"});return}const o=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||Ue(Je(e))||void 0;Ut({agentId:String(t),workspacePath:String(r),serverUrl:e.body?.serverUrl||o,runtimeAccessToken:e.body?.runtimeAccessToken,userId:e.body?.userId,schedulerBaseUrl:o}),e.body?.runtimeFeatures!==null&&e.body?.runtimeFeatures!==void 0&&(Dt(String(t),e.body.runtimeFeatures),l.info(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u80FD\u529B\u5F00\u5173: ${JSON.stringify(Lt(String(t)))}`)),e.body?.inheritedFeatures!==null&&e.body?.inheritedFeatures!==void 0&&(Ot(String(t),e.body.inheritedFeatures),l.info(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u7EE7\u627F\u4E09\u6001\u5C42: ${JSON.stringify(jt(String(t)))}`)),e.body?.capabilities!==void 0&&Pt(String(t),e.body.capabilities),e.body?.capabilitiesInherited!==void 0&&Mt(String(t),e.body.capabilitiesInherited),e.body?.envVars!==null&&e.body?.envVars!==void 0&&typeof e.body.envVars=="object"&&(xt(String(t),e.body.envVars),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u6709\u6548\u73AF\u5883\u53D8\u91CF: ${Object.keys(e.body.envVars).length} \u9879 \u2192 \u5DE5\u5177\u5B50\u8FDB\u7A0B + MCP spec`)),e.body?.agentMeta!==void 0&&(Nt(String(t),e.body.agentMeta),l.info(`[Runtime] agent ${t} \u4E0B\u53D1 agent \u5143\u4FE1\u606F: ${JSON.stringify(e.body.agentMeta)} \u2192 MCP \u4FDD\u7559\u952E\u6CE8\u5165`)),e.body?.changeCacheRetentionDays!==void 0&&(wt(e.body.changeCacheRetentionDays),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u53D8\u66F4\u7F13\u5B58\u4FDD\u7559\u5929\u6570: ${e.body.changeCacheRetentionDays??"\u4E0D\u6E05\u7406"}`)),s&&s!=="sdk"&&console.warn(`[Runtime] Unsupported runtime mode "${s}" requested for agent ${t}; starting SDK session instead.`),await Zn(e,n)});async function Zn(e,n){const{agentId:t,workspacePath:r,command:s,projectRoot:o,autoAccept:i=!0,initialPrompt:a,systemPrompt:c,globalPrompt:d,rolePrompt:u,memory:f,resumeContext:p,resumeTranscript:g,mcpConfigPath:k,extraMcpServers:A,envOverrides:T,idleInputAutoCommand:w,nonInputAutoCommand:R,model:D,instanceAiConfig:ye,subAgentModel:Se,subAgentEffort:Ie,scopeKey:Re,browserAllowPrivate:De}=e.body||{},W=rn(g);l.info(`[HIBERNATE-IMPORT] \u542F\u52A8\u8BF7\u6C42\u643A\u5E26\u4F11\u7720\u6062\u590D: agentId=${String(t||"").trim()||"?"} resumeContext=${typeof p=="string"?`${p.length}\u5B57`:"\u65E0"} resumeTranscript\u539F\u59CB=${typeof g=="string"?`${g.length}\u5B57`:typeof g} \u89E3\u6790\u7ED3\u679C=${W?`${W.length}\u6761`:"null"}`);const G=Jt();G.log({level:"info",category:"launch",message:"startSdkSession: \u6536\u5230\u542F\u52A8\u8BF7\u6C42",source:"bridge",agentId:String(t||"").trim()||void 0,details:{reqBodyKeys:Object.keys(e.body||{}),perInstanceAiConfig:ye?ie(ye):null,perAgentModel:D??null}});let E=null;const _=String(t||"").trim(),he=String(e.body?.runtimeAccessToken||"").trim()||void 0,B=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||Ue(Je(e))||void 0;B?l.info(`[startSdkSession] \u56DE\u8C03\u76EE\u6807 server: ${B} (agentId=${_})`):l.warn(`[startSdkSession] \u672A\u89E3\u6790\u5230 schedulerBaseUrl\uFF0C\u5C06\u56DE\u9000\u5230\u9ED8\u8BA4\u5730\u5740 (agentId=${_})`);try{if(Vn(),!_){n.status(400).json({error:"agentId is required"});return}const v=at(_);if(v){n.json(await _n(v));return}const b=await zt(_);if(b){const O=await bn(b);if(!O.reusable)console.warn(`[Runtime] Ignoring stale persisted SDK session for agentId=${_}, sessionId=${b.sessionId}, reason=${O.reason}`),await q(b.sessionId);else{const M=Z(b.runtimeStatus,b.runtimeStatus,b.runtimeActionType);n.json({sessionId:b.sessionId,status:M,runtimeStatus:M,runtimeActionType:b.runtimeActionType,runtimeActionLabel:b.runtimeActionLabel,runtimeActionDetail:b.runtimeActionDetail,agentId:b.agentId,workspacePath:b.workspacePath,command:b.command,mode:b.mode||"sdk",pid:b.pid,reused:!0,persistedOnly:!0});return}}if(z.has(_)){n.status(409).json({error:"SDK session is already starting for this agent"});return}z.add(_);const P=mt(s),gt=h.get(P);E=At();const yt=P==="claude-code"?await Rn():null,te=dt(P==="claude-code"?yt:null,T),Y=P==="acode"?D?String(D).trim():void 0:(()=>{const O=D?String(D).trim():void 0,M=te.model?String(te.model).trim():void 0;return O||M})();G.log({level:"info",category:"resolve",message:"\u6A21\u578B\u89E3\u6790\u7ED3\u679C",source:"bridge",agentId:_,sessionId:E??void 0,details:{perAgentModel:D??null,globalModel:te.model??null,resolvedModel:Y??null,providerId:P,note:P==="acode"?"adapter handles full priority":"request > global"}});const Ae={...te.envOverrides};Y&&(Ae.ANTHROPIC_MODEL=Y,Ae.CODEX_MODEL=Y);let X,Te=k;if(P==="acode"){const O=ye||{},M=await Rt({apiOverrides:tt(O)??void 0,agentId:_,sessionId:E??void 0,runtimeBridgeBaseUrl:B});X=M.instanceConfig.config,Te=M.perInstanceConfigPath,G.log({level:"info",category:"apply",message:"prepareAcodeInstanceConfig \u5B8C\u6210",source:"bridge",agentId:_,sessionId:E??void 0,details:{sanitizedApiOverrides:(()=>{const x=tt(O);return x?ie(x):null})(),resolvedInstanceAiConfig:X?ie(X):null,perInstanceConfigPath:Te,instanceConfigSources:M.instanceConfig.source??null}})}let Pe=c||void 0,_e,be,ne;const re=typeof p=="string"&&p.trim()?kt(p):void 0;if(P==="acode")if(_e=typeof d=="string"&&d.trim()||void 0,be=typeof u=="string"&&u.trim()||void 0,typeof f=="string"&&f.trim())ne=f.trim();else{const O=await sn(r,{schedulerBaseUrl:B,runtimeAccessToken:he,agentId:_});O&&(ne=O,l.info(`[startSdkSession] Auto-loaded memories for ACode agent ${_}`))}else if(typeof d=="string"&&d.trim()||typeof u=="string"&&u.trim()||typeof f=="string"&&f.trim()||re!==void 0){const M=[d,u,f,re,c].filter(x=>typeof x=="string"&&x.trim().length>0).map(x=>x.trim());Pe=M.length>0?M.join(`
|
|
49
45
|
|
|
50
|
-
`):void 0}const x={command:s||"acode",workingDirectory:r,agentId:A,...Ee?{scopeKey:Ee}:{},...typeof Re=="boolean"?{browserAllowPrivate:Re}:{},autoAccept:!!i,initialPrompt:a,systemPrompt:De,...Te!==void 0?{globalPrompt:Te}:{},..._e!==void 0?{rolePrompt:_e}:{},...te!==void 0?{memory:te}:{},...ne!==void 0?{resumeContext:ne}:{},...P==="acode"&&Array.isArray(W)&&W.length>0?{resumeTranscript:W}:{},model:X,mcpConfigPath:Ae,...Y?{instanceAiConfig:Y}:{},...typeof ye=="string"&&ye.trim()?{subAgentModel:ye.trim()}:{},...typeof he=="string"&&he.trim()?{subAgentEffort:he.trim()}:{},extraMcpServers:y||{},envOverrides:st(String(t),String(r),process.env,Se,typeof o=="string"?o:void 0)};G.log({level:"info",category:"launch",message:"\u4F20\u9012\u7ED9 Adapter \u7684\u5B8C\u6574 AdapterSessionConfig",source:"bridge",agentId:A,sessionId:w,details:{adapterModel:x.model??null,adapterInstanceAiConfig:x.instanceAiConfig?oe(x.instanceAiConfig):null,adapterMcpConfigPath:x.mcpConfigPath??null}}),await G.flush(),g.set(w,{agentId:A,workspacePath:r,sessionId:w,config:x,providerId:P,seq:0,runtimeAccessToken:Ie,schedulerBaseUrl:B}),n.json({sessionId:w,status:"starting",runtimeStatus:"starting",agentId:A,workspacePath:r,command:x.command,mode:"sdk"}),Jn({sessionId:w,agentId:A,config:x,adapter:ft,providerId:P,idleInputAutoCommand:$,nonInputAutoCommand:R,runtimeAccessToken:Ie,requestedSchedulerBaseUrl:B})}catch(F){if(w&&(M(w),g.delete(w),H(w)),A&&z.delete(A),!n.headersSent){const k=F instanceof Error?F.message:String(F);n.status(500).json({error:`Failed to start SDK session: ${k}`})}}}async function Jn(e){const{sessionId:n,agentId:t,config:r,adapter:s,providerId:o,idleInputAutoCommand:i,nonInputAutoCommand:a,runtimeAccessToken:c,requestedSchedulerBaseUrl:u}=e;try{await s.startSession(n,r),s.setIdleCommands?.(n,{idleInputCommand:i||Le,nonInputCommand:a||""});let d;if(rn(o))try{if(await new Promise(m=>setTimeout(m,500)),d=s.getSessionPid?.(n),!d){const p=(await Ut()).find(b=>b.agentId===t||b.cwd===r.workingDirectory||b.command.includes(r.workingDirectory));p&&(d=p.pid,f.info(`[Runtime] Found SDK process PID: ${d} for agentId=${t}`))}}catch(m){console.warn(`[Runtime] Failed to get SDK PID for agentId=${t}:`,m)}const l=ue(s.getSessionStatus(n),g.get(n)?.currentRuntimeStatus,g.get(n)?.currentRuntimeActionType);await zt({sessionId:n,agentId:t,workspacePath:r.workingDirectory,command:r.command,startedAt:new Date().toISOString(),status:"running",runtimeStatus:l,mode:"sdk",pid:d,providerSessionId:s.getProviderSessionId(n)}),d&&await ke().startProcess({agentId:t,sessionId:n,pid:d,mode:"sdk",workspacePath:r.workingDirectory,command:r.command}),await Vn({agentId:t,sessionId:n,sdkPid:d,status:l,schedulerBaseUrl:u,runtimeAccessToken:c})}catch(d){M(n),g.delete(n),H(n),await q(n);const l=d instanceof Error?d.message:String(d);console.error(`[Runtime] Background SDK session startup failed for agentId=${t}: ${l}`),await Qn({agentId:t,sessionId:n,schedulerBaseUrl:u,runtimeAccessToken:c,errorMessage:l})}finally{z.delete(t)}}async function Vn(e){const{agentId:n,sessionId:t,sdkPid:r,status:s,schedulerBaseUrl:o,runtimeAccessToken:i}=e;if(!o||!i){f.debug(`[Runtime] notifyServerSessionReady skipped: missing schedulerBaseUrl or runtimeAccessToken for agentId=${n}`);return}const a=`${o.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Pe.post(a,{agentId:n,sessionId:t,status:s,pid:r},{headers:{"X-Runtime-Token":i,"Content-Type":"application/json"},timeout:5e3}),f.debug(`[Runtime] Notified server session ready: agentId=${n}, sessionId=${t}, status=${s}`)}catch(c){const u=c instanceof Error?c.message:String(c);f.warn(`[Runtime] Failed to notify server session ready: agentId=${n}, error=${u}`)}}async function Qn(e){const{agentId:n,sessionId:t,schedulerBaseUrl:r,runtimeAccessToken:s}=e;if(!r||!s)return;const o=`${r.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Pe.post(o,{agentId:n,sessionId:t,status:"stopped"},{headers:{"X-Runtime-Token":s,"Content-Type":"application/json"},timeout:5e3}),f.debug(`[Runtime] Notified server session failed: agentId=${n}, sessionId=${t}`)}catch(i){const a=i instanceof Error?i.message:String(i);f.warn(`[Runtime] Failed to notify server session failed: agentId=${n}, error=${a}`)}}S.post("/sdk/message",I,async(e,n)=>{const{sessionId:t,message:r}=e.body||{};if(!t||!r){n.status(400).json({error:"sessionId and message are required"});return}const s=g.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const o=s.providerId||"claude-code";await _.get(o).sendMessage(t,r),n.json({ok:!0})}catch(o){const i=o instanceof Error?o.message:String(o);n.status(500).json({error:i})}}),S.post("/sdk/answer",I,async(e,n)=>{const{sessionId:t,answers:r}=e.body||{};if(!t||!r){n.status(400).json({error:"sessionId and answers are required"});return}const s=g.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const o=s.providerId||"claude-code",i=_.get(o);i.sendQuestionAnswer&&await i.sendQuestionAnswer(t,r),n.json({ok:!0})}catch(o){const i=o instanceof Error?o.message:String(o);n.status(500).json({error:i})}}),S.post("/tool-auth/answer",I,async(e,n)=>{const{sessionId:t,requestId:r,allowed:s}=e.body||{};if(!t||!r){n.status(400).json({error:"sessionId and requestId are required"});return}const o=g.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const i=o.providerId||"claude-code",a=_.get(i);if(!a.submitToolPermissionDecision){n.status(400).json({error:"adapter does not support tool authorization"});return}const c=a.submitToolPermissionDecision(t,String(r),!!s);n.json({ok:!0,existed:c})}catch(i){const a=i instanceof Error?i.message:String(i);n.status(500).json({error:a})}}),S.get("/tool-auth/pending/:sessionId",I,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const r=g.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",i=_.get(s).getPendingToolAuthRequests?.(t)??[];n.json({ok:!0,sessionId:t,agentId:r.agentId,pendingRequests:i,fetchedAt:Date.now()})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),S.post("/sdk/confirm",I,async(e,n)=>{const{sessionId:t,accept:r}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const s=g.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const o=s.providerId||"claude-code";await _.get(o).sendConfirmation(t,!!r),n.json({ok:!0})}catch(o){const i=o instanceof Error?o.message:String(o);n.status(500).json({error:i})}}),S.post("/sdk/abort",I,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const r=g.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code";await _.get(s).abortCurrentTurn(t),n.json({ok:!0})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),S.post("/sdk/stop",I,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const r=g.get(t);if(!r){n.json({ok:!0,status:"stopped"});return}try{const s=r.providerId||"claude-code",o=_.get(s);o.abortCurrentTurn(t).catch(()=>{}),await o.terminateSession(t),M(t),g.delete(t),H(t),de(t),await q(t),await ke().removeProcess(r.agentId),await E(r.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl}),n.json({ok:!0,status:"stopped"})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),S.get("/sdk/snapshot/:sessionId",I,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const r=g.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",o=_.get(s),i=o.getConversation(t),a=Vt(i);let c=null;if(s==="acode"){const d=o;typeof d.exportRawTranscript!="function"?f.warn(`[HIBERNATE-EXPORT] adapter \u65E0 exportRawTranscript \u65B9\u6CD5 \u2014 bridge \u8FDB\u7A0B\u53EF\u80FD\u8FD0\u884C\u7684\u662F\u65E7\u6784\u5EFA\uFF08\u8BF7\u91CD\u542F bridge\uFF09\u3002providerId=${s}`):(c=d.exportRawTranscript?.(t)??null,c===null&&f.warn(`[HIBERNATE-EXPORT] exportRawTranscript \u8FD4\u56DE\u7A7A \u2014 runtime \u53EF\u80FD\u672A\u5B8C\u6210 start() \u6216\u4E0D\u652F\u6301\u3002providerId=${s}`))}else f.info(`[HIBERNATE-EXPORT] provider=${s} \u4E0D\u652F\u6301\u5B8C\u6574\u91CD\u653E\uFF0C\u6309\u4EC5\u6458\u8981\u4F11\u7720`);const u=o.getTotalUsage?.(t);f.info(`[HIBERNATE-EXPORT] \u5FEB\u7167\u5BFC\u51FA: sessionId=${t} agentId=${r.agentId} providerId=${s} messages=${i.length} summaryChars=${a.snapshot.length} truncated=${a.truncated} transcript=${c?`${c.length}\u6761`:"null"} usage=${u?`in=${u.inputTokens??"?"}/out=${u.outputTokens??"?"}`:"null"}`),n.json({sessionId:t,agentId:r.agentId,workspacePath:r.workspacePath,messageCount:i.length,truncated:a.truncated,snapshot:a.snapshot,transcript:c,tokenUsage:u?{inputTokens:u.inputTokens??null,outputTokens:u.outputTokens??null}:null,providerId:s})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),S.get("/sdk/status/:sessionId",I,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const r=g.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",o=_.get(s),i=o.getSessionStatus(t),a=o.getConversation(t);n.json({sessionId:t,status:i,agentId:r.agentId,workspacePath:r.workspacePath,messageCount:a.length})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),S.get("/sdk/capabilities/:sessionId",I,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const r=g.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",i=_.get(s).getCapabilities?.(t)??null;n.json({ok:!0,sessionId:t,agentId:r.agentId,capabilities:i,fetchedAt:Date.now()})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),S.get("/sdk/pending-questions/:sessionId",I,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const r=g.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",i=_.get(s).getPendingQuestion?.(t)??null;n.json({ok:!0,sessionId:t,agentId:r.agentId,pendingQuestion:i?{toolCallId:i.toolCallId,questions:i.questions}:null,fetchedAt:Date.now()})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),S.post("/command",I,async(e,n)=>{const{sessionId:t,command:r}=e.body||{};if(!t||r===void 0||r===null){n.status(400).json({error:"sessionId and command are required"});return}try{const s=await _n(String(t),r);n.json({ok:!0,mode:"terminal",...s})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}});function Zn(e,n){if(typeof e!="string"||!e||!n||typeof n!="object")return e;const{userId:t,name:r,type:s}=n,o=typeof t=="string"&&t.trim()?t.trim():"",i=typeof r=="string"&&r.trim()?r.trim():o;if(!o&&!i)return e;const a=typeof s=="string"&&s.trim()?s.trim().toUpperCase():"HUMAN",c=i||o,u=o?`, userId: ${o}`:"";return`\u3010${c}\uFF08${a}${u}\uFF09\u53D1\u6765\u3011
|
|
51
|
-
${e}`}
|
|
46
|
+
`):void 0}const U={command:s||"acode",workingDirectory:r,agentId:_,...Re?{scopeKey:Re}:{},...typeof De=="boolean"?{browserAllowPrivate:De}:{},autoAccept:!!i,initialPrompt:a,systemPrompt:Pe,..._e!==void 0?{globalPrompt:_e}:{},...be!==void 0?{rolePrompt:be}:{},...ne!==void 0?{memory:ne}:{},...re!==void 0?{resumeContext:re}:{},...P==="acode"&&Array.isArray(W)&&W.length>0?{resumeTranscript:W}:{},model:Y,mcpConfigPath:Te,...X?{instanceAiConfig:X}:{},...typeof Se=="string"&&Se.trim()?{subAgentModel:Se.trim()}:{},...typeof Ie=="string"&&Ie.trim()?{subAgentEffort:Ie.trim()}:{},extraMcpServers:A||{},envOverrides:ct(String(t),String(r),process.env,Ae,typeof o=="string"?o:void 0)};G.log({level:"info",category:"launch",message:"\u4F20\u9012\u7ED9 Adapter \u7684\u5B8C\u6574 AdapterSessionConfig",source:"bridge",agentId:_,sessionId:E,details:{adapterModel:U.model??null,adapterInstanceAiConfig:U.instanceAiConfig?ie(U.instanceAiConfig):null,adapterMcpConfigPath:U.mcpConfigPath??null}}),await G.flush(),m.set(E,{agentId:_,workspacePath:r,sessionId:E,config:U,providerId:P,seq:0,runtimeAccessToken:he,schedulerBaseUrl:B}),n.json({sessionId:E,status:"starting",runtimeStatus:"starting",agentId:_,workspacePath:r,command:U.command,mode:"sdk"}),er({sessionId:E,agentId:_,config:U,adapter:gt,providerId:P,idleInputAutoCommand:w,nonInputAutoCommand:R,runtimeAccessToken:he,requestedSchedulerBaseUrl:B})}catch(v){if(E&&(L(E),m.delete(E),H(E)),_&&z.delete(_),!n.headersSent){const b=v instanceof Error?v.message:String(v);n.status(500).json({error:`Failed to start SDK session: ${b}`})}}}async function er(e){const{sessionId:n,agentId:t,config:r,adapter:s,providerId:o,idleInputAutoCommand:i,nonInputAutoCommand:a,runtimeAccessToken:c,requestedSchedulerBaseUrl:d}=e;try{await s.startSession(n,r),s.setIdleCommands?.(n,{idleInputCommand:i||Le,nonInputCommand:a||""});let u;if(cn(o))try{if(await new Promise(p=>setTimeout(p,500)),u=s.getSessionPid?.(n),!u){const g=(await Bt()).find(k=>k.agentId===t||k.cwd===r.workingDirectory||k.command.includes(r.workingDirectory));g&&(u=g.pid,l.info(`[Runtime] Found SDK process PID: ${u} for agentId=${t}`))}}catch(p){console.warn(`[Runtime] Failed to get SDK PID for agentId=${t}:`,p)}const f=Z(s.getSessionStatus(n),m.get(n)?.currentRuntimeStatus,m.get(n)?.currentRuntimeActionType);await Xt({sessionId:n,agentId:t,workspacePath:r.workingDirectory,command:r.command,startedAt:new Date().toISOString(),status:"running",runtimeStatus:f,mode:"sdk",pid:u,providerSessionId:s.getProviderSessionId(n)}),u&&await Ce().startProcess({agentId:t,sessionId:n,pid:u,mode:"sdk",workspacePath:r.workingDirectory,command:r.command}),await tr({agentId:t,sessionId:n,sdkPid:u,status:f,schedulerBaseUrl:d,runtimeAccessToken:c})}catch(u){L(n),m.delete(n),H(n),await q(n);const f=u instanceof Error?u.message:String(u);console.error(`[Runtime] Background SDK session startup failed for agentId=${t}: ${f}`),await nr({agentId:t,sessionId:n,schedulerBaseUrl:d,runtimeAccessToken:c,errorMessage:f})}finally{z.delete(t)}}async function tr(e){const{agentId:n,sessionId:t,sdkPid:r,status:s,schedulerBaseUrl:o,runtimeAccessToken:i}=e;if(!o||!i){l.debug(`[Runtime] notifyServerSessionReady skipped: missing schedulerBaseUrl or runtimeAccessToken for agentId=${n}`);return}const a=`${o.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Oe.post(a,{agentId:n,sessionId:t,status:s,pid:r},{headers:{"X-Runtime-Token":i,"Content-Type":"application/json"},timeout:5e3}),l.debug(`[Runtime] Notified server session ready: agentId=${n}, sessionId=${t}, status=${s}`)}catch(c){const d=c instanceof Error?c.message:String(c);l.warn(`[Runtime] Failed to notify server session ready: agentId=${n}, error=${d}`)}}async function nr(e){const{agentId:n,sessionId:t,schedulerBaseUrl:r,runtimeAccessToken:s}=e;if(!r||!s)return;const o=`${r.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Oe.post(o,{agentId:n,sessionId:t,status:"stopped"},{headers:{"X-Runtime-Token":s,"Content-Type":"application/json"},timeout:5e3}),l.debug(`[Runtime] Notified server session failed: agentId=${n}, sessionId=${t}`)}catch(i){const a=i instanceof Error?i.message:String(i);l.warn(`[Runtime] Failed to notify server session failed: agentId=${n}, error=${a}`)}}I.post("/sdk/message",y,async(e,n)=>{const{sessionId:t,message:r}=e.body||{};if(!t||!r){n.status(400).json({error:"sessionId and message are required"});return}const s=m.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const o=s.providerId||"claude-code";await h.get(o).sendMessage(t,r),n.json({ok:!0})}catch(o){const i=o instanceof Error?o.message:String(o);n.status(500).json({error:i})}}),I.post("/sdk/answer",y,async(e,n)=>{const{sessionId:t,answers:r}=e.body||{};if(!t||!r){n.status(400).json({error:"sessionId and answers are required"});return}const s=m.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const o=s.providerId||"claude-code",i=h.get(o);i.sendQuestionAnswer&&await i.sendQuestionAnswer(t,r),n.json({ok:!0})}catch(o){const i=o instanceof Error?o.message:String(o);n.status(500).json({error:i})}}),I.post("/tool-auth/answer",y,async(e,n)=>{const{sessionId:t,requestId:r,allowed:s}=e.body||{};if(!t||!r){n.status(400).json({error:"sessionId and requestId are required"});return}const o=m.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const i=o.providerId||"claude-code",a=h.get(i);if(!a.submitToolPermissionDecision){n.status(400).json({error:"adapter does not support tool authorization"});return}const c=a.submitToolPermissionDecision(t,String(r),!!s);n.json({ok:!0,existed:c})}catch(i){const a=i instanceof Error?i.message:String(i);n.status(500).json({error:a})}}),I.get("/tool-auth/pending/:sessionId",y,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const r=m.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",i=h.get(s).getPendingToolAuthRequests?.(t)??[];n.json({ok:!0,sessionId:t,agentId:r.agentId,pendingRequests:i,fetchedAt:Date.now()})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),I.post("/sdk/confirm",y,async(e,n)=>{const{sessionId:t,accept:r}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const s=m.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const o=s.providerId||"claude-code";await h.get(o).sendConfirmation(t,!!r),n.json({ok:!0})}catch(o){const i=o instanceof Error?o.message:String(o);n.status(500).json({error:i})}}),I.post("/sdk/abort",y,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const r=m.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code";await h.get(s).abortCurrentTurn(t),n.json({ok:!0})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),I.post("/sdk/stop",y,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const r=m.get(t);if(!r){n.json({ok:!0,status:"stopped"});return}try{const s=r.providerId||"claude-code",o=h.get(s);o.abortCurrentTurn(t).catch(()=>{}),await o.terminateSession(t),L(t),m.delete(t),H(t),le(t),se(r.agentId),await q(t),await Ce().removeProcess(r.agentId),await $(r.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl}),n.json({ok:!0,status:"stopped"})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),I.get("/sdk/snapshot/:sessionId",y,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const r=m.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",o=h.get(s),i=o.getConversation(t),a=tn(i);let c=null;if(s==="acode"){const u=o;typeof u.exportRawTranscript!="function"?l.warn(`[HIBERNATE-EXPORT] adapter \u65E0 exportRawTranscript \u65B9\u6CD5 \u2014 bridge \u8FDB\u7A0B\u53EF\u80FD\u8FD0\u884C\u7684\u662F\u65E7\u6784\u5EFA\uFF08\u8BF7\u91CD\u542F bridge\uFF09\u3002providerId=${s}`):(c=u.exportRawTranscript?.(t)??null,c===null&&l.warn(`[HIBERNATE-EXPORT] exportRawTranscript \u8FD4\u56DE\u7A7A \u2014 runtime \u53EF\u80FD\u672A\u5B8C\u6210 start() \u6216\u4E0D\u652F\u6301\u3002providerId=${s}`))}else l.info(`[HIBERNATE-EXPORT] provider=${s} \u4E0D\u652F\u6301\u5B8C\u6574\u91CD\u653E\uFF0C\u6309\u4EC5\u6458\u8981\u4F11\u7720`);const d=o.getTotalUsage?.(t);l.info(`[HIBERNATE-EXPORT] \u5FEB\u7167\u5BFC\u51FA: sessionId=${t} agentId=${r.agentId} providerId=${s} messages=${i.length} summaryChars=${a.snapshot.length} truncated=${a.truncated} transcript=${c?`${c.length}\u6761`:"null"} usage=${d?`in=${d.inputTokens??"?"}/out=${d.outputTokens??"?"}`:"null"}`),n.json({sessionId:t,agentId:r.agentId,workspacePath:r.workspacePath,messageCount:i.length,truncated:a.truncated,snapshot:a.snapshot,transcript:c,tokenUsage:d?{inputTokens:d.inputTokens??null,outputTokens:d.outputTokens??null}:null,providerId:s})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),I.get("/sdk/status/:sessionId",y,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const r=m.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",o=h.get(s),i=o.getSessionStatus(t),a=o.getConversation(t);n.json({sessionId:t,status:i,agentId:r.agentId,workspacePath:r.workspacePath,messageCount:a.length})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),I.get("/sdk/capabilities/:sessionId",y,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const r=m.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",i=h.get(s).getCapabilities?.(t)??null;n.json({ok:!0,sessionId:t,agentId:r.agentId,capabilities:i,fetchedAt:Date.now()})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),I.get("/sdk/pending-questions/:sessionId",y,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const r=m.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",i=h.get(s).getPendingQuestion?.(t)??null;n.json({ok:!0,sessionId:t,agentId:r.agentId,pendingQuestion:i?{toolCallId:i.toolCallId,questions:i.questions}:null,fetchedAt:Date.now()})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),I.post("/command",y,async(e,n)=>{const{sessionId:t,command:r}=e.body||{};if(!t||r===void 0||r===null){n.status(400).json({error:"sessionId and command are required"});return}try{const s=await wn(String(t),r);n.json({ok:!0,mode:"terminal",...s})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}});function rr(e,n){if(typeof e!="string"||!e||!n||typeof n!="object")return e;const{userId:t,name:r,type:s}=n,o=typeof t=="string"&&t.trim()?t.trim():"",i=typeof r=="string"&&r.trim()?r.trim():o;if(!o&&!i)return e;const a=typeof s=="string"&&s.trim()?s.trim().toUpperCase():"HUMAN",c=i||o,d=o?`, userId: ${o}`:"";return`\u3010${c}\uFF08${a}${d}\uFF09\u53D1\u6765\u3011
|
|
47
|
+
${e}`}I.post("/input",y,async(e,n)=>{const{sessionId:t,input:r,mode:s,sender:o}=e.body||{};if(!t||r===void 0||r===null){n.status(400).json({error:"sessionId and input are required"});return}const i=m.get(t);if(!i){n.status(404).json({error:"SDK session not found"});return}try{const a=i.providerId||"claude-code",c=h.get(a);if(s==="shortcut"){if(!c.sendShortcutInput){n.status(400).json({error:"shortcut input is not supported by this SDK provider"});return}await c.sendShortcutInput(t,String(r)),n.json({ok:!0,mode:"shortcut"});return}await c.sendMessage(t,rr(await $n(r),o)),n.json({ok:!0,mode:"sdk"})}catch(a){const c=a instanceof Error?a.message:String(a);n.status(500).json({error:c})}}),I.post("/update-auto-commands",y,async(e,n)=>{const{agentId:t,idleInputAutoCommand:r="",nonInputAutoCommand:s=""}=e.body||{},o=String(t||"").trim();if(!o){n.status(400).json({error:"agentId is required"});return}const i=[...m.values()].find(c=>c.agentId===o),a={idleInputCommand:String(r||"").trim()||Le,nonInputCommand:String(s||"")};try{let c=!1;i&&(h.get(i.providerId||"claude-code").setIdleCommands?.(i.sessionId,a),c=!0);const d=await Gt(o,{idleInputAutoCommand:a.idleInputCommand,nonInputAutoCommand:a.nonInputCommand});n.json({ok:!0,mode:"sdk",sessionUpdated:c,persistedUpdated:d})}catch(c){const d=c instanceof Error?c.message:String(c);n.status(500).json({ok:!1,mode:"sdk",error:d})}}),I.post("/resize",y,(e,n)=>{const{sessionId:t,cols:r,rows:s}=e.body||{};if(!t||!r||!s){n.status(400).json({error:"sessionId, cols, rows are required"});return}if(!m.has(t)){n.status(404).json({error:"SDK session not found"});return}n.json({ok:!0,mode:"sdk",noop:!0,cols:Number(r),rows:Number(s)})}),I.post("/reset-context",y,async(e,n)=>{const{sessionId:t,reason:r}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const s=m.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}const o=s.providerId||"claude-code",i=h.get(o),a=i.resetContext?.bind(i),c=an(o,!!a);if(!c.supported){n.status(c.statusCode).json({error:c.error});return}if(!a){n.status(500).json({error:"ACode adapter does not expose resetContext"});return}try{await a(String(t));const d=Z(i.getSessionStatus(String(t)),s.currentRuntimeStatus,s.currentRuntimeActionType);n.json({ok:!0,contextReset:!0,sessionId:t,status:d,runtimeStatus:d,agentId:s.agentId,mode:"sdk",providerId:o,reason:typeof r=="string"&&r.trim()?r.trim():void 0})}catch(d){const u=d instanceof Error?d.message:String(d);n.status(500).json({ok:!1,contextReset:!1,mode:"sdk",error:u})}}),I.post("/compact-context",y,async(e,n)=>{const{sessionId:t,plan:r}=e.body||{};if(!t){n.status(400).json({ok:!1,error:"sessionId is required"});return}const s=m.get(t);if(!s){n.status(404).json({ok:!1,error:"SDK session not found"});return}const o=s.providerId||"claude-code",i=h.get(o),a=i.compactContext?.bind(i);if(!a){n.status(400).json({ok:!1,error:`context compaction is not supported by provider: ${o}`});return}try{const c=or(r),d=a(String(t),c??void 0),u=Z(i.getSessionStatus(String(t)),s.currentRuntimeStatus,s.currentRuntimeActionType);n.json({ok:!0,requested:!0,compacted:!0,sessionId:t,agentId:s.agentId,mode:"sdk",providerId:o,plan:c??null,status:u,runtimeStatus:u,result:d??null})}catch(c){const d=c instanceof Error?c.message:String(c);l.warn(`[Runtime] compact-context failed: sessionId=${t}, error=${d}`),n.status(500).json({ok:!1,compacted:!1,mode:"sdk",error:d})}});function or(e){if(!e||typeof e!="object")return null;const n=e,t={};return Array.isArray(n.pruneCategories)&&(t.pruneCategories=n.pruneCategories.filter(r=>typeof r=="string").filter(r=>sr.has(r))),typeof n.summarize=="boolean"&&(t.summarize=n.summarize),Object.keys(t).length>0?t:null}const sr=new Set(["fileReads","fileEdits","otherTools","commands","browser"]);I.post("/compaction-preview",y,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({ok:!1,error:"sessionId is required"});return}const r=m.get(t);if(!r){n.status(404).json({ok:!1,error:"SDK session not found"});return}const s=r.providerId||"claude-code",o=h.get(s),i=o.getCompactionPreview?.bind(o);if(!i){n.status(400).json({ok:!1,error:`compaction preview is not supported by provider: ${s}`});return}try{const a=i(String(t));n.json({ok:!0,sessionId:t,mode:"sdk",providerId:s,preview:a??null})}catch(a){const c=a instanceof Error?a.message:String(a);l.warn(`[Runtime] compaction-preview failed: sessionId=${t}, error=${c}`),n.status(500).json({ok:!1,mode:"sdk",error:c})}}),I.post("/stop",y,async(e,n)=>{const{sessionId:t}=e.body||{},r=dn(e.body);if(!t){n.status(400).json({error:"sessionId is required"});return}const s=m.get(t);if(!s){await q(t),n.json({ok:!0,status:"stopped",mode:"none",statusNotified:!1,reason:r.reason});return}const o=s.agentId;try{l.info(`[Runtime] Stopping SDK session ${t}; suppressStatus=${!r.statusNotified}, reason=${r.reason||"unspecified"}`);const i=s.providerId||"claude-code",a=h.get(i);a.abortCurrentTurn(t).catch(()=>{}),await a.terminateSession(t),L(t),m.delete(t),H(t),le(t),se(o),await q(t),await Ce().removeProcess(o),r.statusNotified?await $(o,null,"stopped",void 0,void 0,{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl}):l.info(`[Runtime] Stopped status notification suppressed for SDK session ${t}; reason=${r.reason||"unspecified"}`),n.json({ok:!0,status:"stopped",mode:"sdk",statusNotified:r.statusNotified,reason:r.reason})}catch(i){const a=i instanceof Error?i.message:String(i);console.error(`[Runtime] Failed to terminate SDK session ${t}:`,a),n.status(500).json({ok:!1,status:"stop_failed",mode:"sdk",error:a})}}),I.post("/stop-all",y,async(e,n)=>{const t=[],r=[];for(const[s,o]of m.entries())try{const i=o.providerId||"claude-code",a=h.get(i);a.abortCurrentTurn(s).catch(()=>{}),await a.terminateSession(s),L(s),m.delete(s),H(s),le(s),se(o.agentId),t.push(s),await $(o.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})}catch(i){const a=i instanceof Error?i.message:String(i);r.push(`SDK ${s}: ${a}`)}try{await Wt([]),l.info("[Runtime] \u5DF2\u6E05\u7A7A\u6240\u6709\u6301\u4E45\u5316\u4F1A\u8BDD")}catch(s){const o=s instanceof Error?s.message:String(s);r.push(`Persistence: ${o}`)}n.json({ok:!0,stopped:{sdk:t.length},errors:r.length>0?r:void 0})}),I.get("/events/last/:n",y,(e,n)=>{const t=parseInt(e.params.n,10);if(!Number.isFinite(t)||t<1){n.status(400).json({error:":n must be a positive integer"});return}const r=Xe.getLastN(t);n.json({ok:!0,count:r.length,entries:r})}),I.get("/events/since/:index",y,(e,n)=>{const t=parseInt(e.params.index,10);if(!Number.isFinite(t)||t<0){n.status(400).json({error:":index must be a non-negative integer"});return}const r=Xe.getSinceIndex(t);n.json({ok:!0,entries:r.entries,nextIndex:r.nextIndex,oldestIndex:r.oldestIndex,dataLoss:r.oldestIndex>t+1})}),I.get("/events/push-stats",y,(e,n)=>{const t=Et();n.json({ok:!0,count:t.length,agents:t})});export{mn as buildAcodeCommandOutputPath,dt as buildClaudeCodeLaunchConfig,ct as buildRuntimeEnv,jn as buildSdkOutputMetadata,Mn as buildToolResultTimelineActionInfo,jr as cleanupSdkSessionByAgentId,pn as countTerminalOutputLines,it as createTerminalOutputDecoder,ue as decodeTerminalOutputChunk,bn as evaluatePersistedSessionReuse,yn as formatCommandInactivityTimeoutNotice,gn as formatCommandOutputSpilloverNotice,Ln as formatSdkOutputEvent,we as formatTerminalPrompt,ln as isIdleStatusChangeRetryable,Sn as normalizeTerminalCommandInput,rn as parseResumeTranscript,dn as parseRuntimeStopOptions,An as parseTerminalDirectoryChangeTarget,pe as raceSendOutputWithRetry,tn as renderSessionSnapshot,an as resolveRuntimeContextResetSupport,Wn as resolveRuntimeStatusFromProviderEvent,$n as resolveSdkInputMessage,mt as resolveSdkProviderId,Z as resolveSdkSessionDisplayStatus,un as resolveStatusChangeRuntimeState,de as resolveStatusChangeUsage,In as resolveTerminalOutputEncoding,m as sdkSessions,cn as shouldProbeSdkProcessPid,I as terminalRouter,rr as withSenderSignature};
|
|
52
48
|
|
|
@@ -48,6 +48,8 @@ export interface BgManagerLike {
|
|
|
48
48
|
subscribeTaskOutput(agentId: string, taskId: string, subscriber: BgTaskOutputSubscriber): (() => void) | null;
|
|
49
49
|
|
|
50
50
|
listTasksWithReconcile?(agentId: string, statusFilter?: string): Promise<BgTaskSummary[]>;
|
|
51
|
+
|
|
52
|
+
killTask?(agentId: string, taskId: string): Promise<unknown>;
|
|
51
53
|
}
|
|
52
54
|
|
|
53
55
|
export declare function getAcodeBgManager(): Promise<BgManagerLike | null>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{cpSync as
|
|
1
|
+
import{cpSync as k,existsSync as y,lstatSync as g,mkdirSync as b,readdirSync as d,realpathSync as p,rmSync as S,symlinkSync as v}from"node:fs";import s from"node:path";import{getBridgeDataHome as L,getBridgeInstancePrivateSkillsDir as E,getBridgeInstanceSkillsDir as w,getBridgeTemplateSkillsDir as h}from"../config.js";import{createLogger as x}from"../utils/logger.js";import{isCapabilityEnabled as B}from"./instance-features.js";const f=x("agent-capability-sync"),D=process.platform==="win32"?"junction":"dir";function G(){return s.join(L(),"instance-runtime")}function T(e){return w(e)}function F(){return s.join(h(),"deployed")}function K(){return h()}function N(e){return E(e)}function A(e){const r=new Map,i=[K(),F()].filter(n=>n&&n.length>0);for(const n of i){if(!y(n))continue;let o=[];try{o=d(n)}catch{continue}for(const a of o){if(a.startsWith("."))continue;const c=s.join(n,a);try{if(!y(s.join(c,"SKILL.md")))continue;r.set(a,c)}catch{continue}}}const u=new Set,t=e?N(e):"";if(t&&y(t)){let n=[];try{n=d(t)}catch{n=[]}for(const o of n){if(o.startsWith("."))continue;const a=s.join(t,o);try{if(!y(s.join(a,"SKILL.md")))continue;r.set(o,a),u.add(o)}catch{continue}}}return{sources:r,privateNames:u}}function j(e,r){try{v(e,r,D)}catch(i){if(i.code==="EEXIST")try{if(g(r).isSymbolicLink()){S(r,{recursive:!0,force:!0}),v(e,r,D);return}f.warn("[farm] \u6280\u80FD\u540D %s \u4E0E\u519C\u573A\u4E2D\u771F\u5B9E\u76EE\u5F55\u51B2\u7A81\uFF0C\u8DF3\u8FC7\uFF08\u4FDD\u7559\u7528\u6237\u76EE\u5F55\uFF09: %s",s.basename(r),r);return}catch{}f.warn("[farm] junction \u5931\u8D25\uFF0C\u56DE\u9000\u590D\u5236 %s \u2192 %s: %s",e,r,i instanceof Error?i.message:String(i));try{let t=!1;try{t=g(r).isSymbolicLink()}catch{t=!1}const n=y(r);if(n&&!t){f.warn("[farm] \u56DE\u9000\u590D\u5236\u76EE\u6807\u4E3A\u771F\u5B9E\u76EE\u5F55\uFF0C\u8DF3\u8FC7\uFF08\u4FDD\u7559\u7528\u6237\u76EE\u5F55\uFF09: %s",r);return}n&&t&&S(r,{recursive:!0,force:!0}),k(e,r,{recursive:!0})}catch(t){f.error("[farm] \u590D\u5236\u56DE\u9000\u4E5F\u5931\u8D25 %s: %s",r,t instanceof Error?t.message:String(t))}}}function C(e,r){try{return s.resolve(p(e))===s.resolve(p(r))}catch{return!1}}function H(e){if(!e)return null;const r=T(e);try{const{sources:i,privateNames:u}=A(e);b(r,{recursive:!0});const t=new Set;let n=[];try{n=d(r)}catch{n=[]}for(const c of n){const l=s.join(r,c);try{g(l).isSymbolicLink()&&t.add(c)}catch{continue}}let o=0,a=0;for(const[c,l]of i){const m=s.join(r,c);if(u.has(c)||B(e,"skills",c))t.has(c)?C(m,l)||(S(m,{recursive:!0,force:!0}),j(l,m),o++):(j(l,m),o++);else if(t.has(c))try{S(m,{recursive:!0,force:!0}),a++}catch{}}for(const c of t)if(!i.has(c))try{S(s.join(r,c),{recursive:!0,force:!0}),a++}catch{}return(o>0||a>0)&&f.info("[farm] agent=%s \u6280\u80FD\u519C\u573A\u5DF2\u540C\u6B65: +%d \u94FE\u63A5, -%d \u53D6\u6D88\u94FE\u63A5 (\u5171 %d \u9879)",e,o,a,i.size),r}catch(i){return f.warn("[farm] agent=%s \u6280\u80FD\u519C\u573A\u540C\u6B65\u5931\u8D25\uFF08\u56DE\u9000\u5168\u5C40\u6280\u80FD\u76EE\u5F55\uFF09: %s",e,i instanceof Error?i.message:String(i)),null}}export{T as getAgentSkillsFarmDir,G as getSkillFarmRoot,H as syncAgentSkillFarm};
|
|
2
2
|
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
|
|
2
|
+
import type { FSWatcher } from "node:fs";
|
|
3
|
+
import { RingBuffer } from "./ring-buffer.js";
|
|
4
|
+
export type DebugItemKind = "mcp" | "plugin";
|
|
5
|
+
|
|
6
|
+
export type WorkspaceResolver = (agentId: string) => string | undefined;
|
|
7
|
+
|
|
8
|
+
export interface McpHotMounter {
|
|
9
|
+
debugMountMcpServer(agentId: string, name: string, spec: Record<string, unknown>): Promise<{
|
|
10
|
+
ok: boolean;
|
|
11
|
+
mounted: boolean;
|
|
12
|
+
sessions: number;
|
|
13
|
+
tools: number;
|
|
14
|
+
|
|
15
|
+
toolNames?: string[];
|
|
16
|
+
error?: string;
|
|
17
|
+
}>;
|
|
18
|
+
debugUnmountMcpServer(agentId: string, name: string): Promise<{
|
|
19
|
+
ok: boolean;
|
|
20
|
+
sessions: number;
|
|
21
|
+
}>;
|
|
22
|
+
|
|
23
|
+
getMcpServerStderr?(agentId: string, name: string, tail: number): string[];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface DebugMountEntry {
|
|
27
|
+
kind: DebugItemKind;
|
|
28
|
+
name: string;
|
|
29
|
+
|
|
30
|
+
path: string;
|
|
31
|
+
|
|
32
|
+
mounted: boolean;
|
|
33
|
+
toolCount: number;
|
|
34
|
+
|
|
35
|
+
tools: string[];
|
|
36
|
+
|
|
37
|
+
error?: string;
|
|
38
|
+
|
|
39
|
+
logSink: RingBuffer<string>;
|
|
40
|
+
watcher?: FSWatcher;
|
|
41
|
+
reloadTimer?: NodeJS.Timeout;
|
|
42
|
+
reloading?: boolean;
|
|
43
|
+
|
|
44
|
+
pendingReload?: boolean;
|
|
45
|
+
mountedAt: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export declare function forgetDebugMount(agentId: string, kind: DebugItemKind, name: string): void;
|
|
49
|
+
|
|
50
|
+
export declare function clearDebugMounts(agentId: string): void;
|
|
51
|
+
export interface DebugMountResult {
|
|
52
|
+
ok: boolean;
|
|
53
|
+
kind: DebugItemKind;
|
|
54
|
+
name?: string;
|
|
55
|
+
path?: string;
|
|
56
|
+
|
|
57
|
+
mounted?: boolean;
|
|
58
|
+
|
|
59
|
+
toolCount?: number;
|
|
60
|
+
|
|
61
|
+
sessions?: number;
|
|
62
|
+
|
|
63
|
+
note?: string;
|
|
64
|
+
error?: string;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export declare function assertWithinWorkspace(workspacePath: string | undefined, targetPath: string): {
|
|
68
|
+
ok: true;
|
|
69
|
+
resolved: string;
|
|
70
|
+
} | {
|
|
71
|
+
ok: false;
|
|
72
|
+
error: string;
|
|
73
|
+
};
|
|
74
|
+
export declare function isValidDebugName(name: string): boolean;
|
|
75
|
+
|
|
76
|
+
export declare function debugMountPlugin(agentId: string, workspacePath: string | undefined, pluginPath: string, hotMounter?: McpHotMounter): Promise<DebugMountResult>;
|
|
77
|
+
|
|
78
|
+
export declare function debugUnmountPlugin(agentId: string, name: string): Promise<DebugMountResult>;
|
|
79
|
+
|
|
80
|
+
export declare function debugMountMcp(agentId: string, workspacePath: string | undefined, mcpPath: string, hotMounter: McpHotMounter, nameOverride?: string): Promise<DebugMountResult>;
|
|
81
|
+
|
|
82
|
+
export declare function debugUnmountMcp(agentId: string, name: string, hotMounter: McpHotMounter): Promise<DebugMountResult>;
|
|
83
|
+
|
|
84
|
+
export interface DebugMountListItem {
|
|
85
|
+
name: string;
|
|
86
|
+
path: string;
|
|
87
|
+
mounted: boolean;
|
|
88
|
+
toolCount: number;
|
|
89
|
+
|
|
90
|
+
tools: string[];
|
|
91
|
+
error?: string;
|
|
92
|
+
mountedAt: number;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export declare function listDebugMounts(agentId: string): {
|
|
96
|
+
mcp: DebugMountListItem[];
|
|
97
|
+
plugin: DebugMountListItem[];
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
export declare function getDebugItemLogs(agentId: string, kind: DebugItemKind, name: string, tail?: number, hotMounter?: McpHotMounter): Promise<{
|
|
101
|
+
ok: boolean;
|
|
102
|
+
kind: DebugItemKind;
|
|
103
|
+
name: string;
|
|
104
|
+
mounted?: boolean;
|
|
105
|
+
lines: string[];
|
|
106
|
+
error?: string;
|
|
107
|
+
}>;
|
|
108
|
+
export interface DebugPackageResult {
|
|
109
|
+
ok: boolean;
|
|
110
|
+
kind: DebugItemKind | "skill";
|
|
111
|
+
|
|
112
|
+
name?: string;
|
|
113
|
+
|
|
114
|
+
size?: number;
|
|
115
|
+
|
|
116
|
+
sha256?: string;
|
|
117
|
+
|
|
118
|
+
bytes?: Buffer;
|
|
119
|
+
error?: string;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export declare function packageDebugItem(workspacePath: string | undefined, itemPath: string, kind: DebugItemKind | "skill"): Promise<DebugPackageResult>;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createHash as O}from"node:crypto";import{existsSync as w,readFileSync as M,realpathSync as v,statSync as h,watch as R}from"node:fs";import{readFile as F,rm as W}from"node:fs/promises";import f from"node:path";import{createLogger as G}from"../utils/logger.js";import{readMcpPackageManifest as A}from"./mcp-package.js";import{pluginManager as $}from"./plugin-manager.js";import{RingBuffer as N}from"./ring-buffer.js";import{zipWorkspaceDirectoryToTemp as K}from"./workspace-files.js";const b=G("debug-mount"),_=500,U=800,E=2048,d=new Map;function z(t){let e=d.get(t);return e||(e=new Map,d.set(t,e)),e}function B(t,e,r){return d.get(t)?.get(e)?.get(r)}function p(t,e){const r=String(e??"");t.logSink.append(r.length>E?r.slice(0,E)+"\u2026":r)}function L(t,e){const r=z(t);let s=r.get(e.kind);s||(s=new Map,r.set(e.kind,s)),s.set(e.name,e)}function C(t,e,r){const s=d.get(t)?.get(e)?.get(r);D(s),d.get(t)?.get(e)?.delete(r)}function oe(t,e,r){C(t,e,r)}function D(t){t&&(t.reloadTimer&&(clearTimeout(t.reloadTimer),t.reloadTimer=void 0),t.watcher&&(t.watcher.close(),t.watcher=void 0))}function ne(t){const e=d.get(t);if(e)for(const r of e.values())for(const s of r.values())D(s);d.delete(t)}function P(t,e){const r=String(t??"").trim();if(!r)return{ok:!1,error:"\u65E0\u6CD5\u89E3\u6790\u8BE5\u5B9E\u4F8B\u7684\u5DE5\u4F5C\u533A\u8DEF\u5F84\uFF08\u8C03\u8BD5\u6302\u8F7D\u4EC5\u652F\u6301\u8FD0\u884C\u4E2D\u7684\u4F1A\u8BDD\uFF09"};const s=String(e??"").trim();if(!s)return{ok:!1,error:"path \u4E0D\u80FD\u4E3A\u7A7A"};let o,n;try{o=v(r)}catch{return{ok:!1,error:`\u5DE5\u4F5C\u533A\u8DEF\u5F84\u4E0D\u53EF\u89E3\u6790: ${r}`}}const i=f.isAbsolute(s)?s:f.resolve(o,s);try{n=v(i)}catch{return{ok:!1,error:`\u6302\u8F7D\u8DEF\u5F84\u4E0D\u5B58\u5728\u6216\u4E0D\u53EF\u89E3\u6790: ${i}`}}const c=f.relative(o,n);return!c||c===""||c.startsWith("..")||f.isAbsolute(c)?{ok:!1,error:`\u6302\u8F7D\u8DEF\u5F84\u5FC5\u987B\u4F4D\u4E8E\u8BE5\u5B9E\u4F8B\u5DE5\u4F5C\u533A\u5185: ${n}`}:{ok:!0,resolved:n}}const J=/^[a-zA-Z0-9_.-]+$/;function j(t){return t!=="__proto__"&&J.test(t)}const H=/(node_modules|[/\\]\.git([/\\]|$)|~$|\.sw[a-p]$|\.tmp$)/;function x(t,e,r){const s=e.path;let o=!1;try{o=h(s).isDirectory()}catch{return}const n=o?s:f.dirname(s),i=o?null:f.basename(s),c=l=>{let a;try{a=R(n,{recursive:l},(u,m)=>{H.test(String(m??""))||i&&String(m??"")!==i||T(t,e,r)})}catch{return}a.on("error",()=>{D(e),e.mounted=!1,e.error="\u5DE5\u4F5C\u533A\u76EE\u5F55\u5DF2\u4E0D\u53EF\u8BFB\uFF08\u53EF\u80FD\u88AB\u5220\u9664\uFF09\uFF0C\u81EA\u52A8\u91CD\u8F7D\u5DF2\u505C\u6B62",p(e,`[reload] ${e.error}`)}),e.watcher=a};try{c(!0),e.watcher||c(!1)}catch{p(e,"[watch] \u65E0\u6CD5\u76D1\u542C\u5DE5\u4F5C\u533A\u53D8\u66F4\uFF0C\u81EA\u52A8\u91CD\u8F7D\u4E0D\u53EF\u7528\uFF08\u53EF\u624B\u52A8\u91CD\u65B0\u6302\u8F7D\uFF09")}}function T(t,e,r){if(e.reloading){e.pendingReload=!0;return}e.reloadTimer&&clearTimeout(e.reloadTimer),e.reloadTimer=setTimeout(()=>{e.reloadTimer=void 0,V(t,e,r)},U)}async function V(t,e,r){if(!e.reloading){e.reloading=!0;try{if(e.kind==="mcp"){if(!r){e.error="\u7F3A\u5C11\u70ED\u6302\u8F7D\u5668\uFF0C\u65E0\u6CD5\u81EA\u52A8\u91CD\u8F7D",p(e,`[reload] ${e.error}`);return}const s=y(e.path,e.name);if(!s.ok){e.error=`spec \u89E3\u6790\u5931\u8D25: ${s.error}`,p(e,`[reload] ${e.error}\uFF08\u4FDD\u6301\u65E7\u5B9E\u4F8B\uFF09`);return}const o=await r.debugMountMcpServer(t,e.name,s.spec);if(!o.mounted){e.mounted=!1,e.error=o.error??"\u81EA\u52A8\u91CD\u8F7D\u5931\u8D25\uFF08\u65E0\u6D3B\u8DC3\u4F1A\u8BDD\uFF09",p(e,`[reload] ${e.error}\uFF08\u4FDD\u6301\u65E7\u5B9E\u4F8B\uFF09`);return}e.mounted=!0,e.toolCount=o.tools,e.tools=o.toolNames??[],e.error=void 0,e.mountedAt=Date.now(),p(e,`[reload] \u5DF2\u81EA\u52A8\u91CD\u8F7D\uFF08tools=${o.tools}\uFF09`),b.info("[agent:%s] MCP \u8C03\u8BD5\u6302\u8F7D\u81EA\u52A8\u91CD\u8F7D: %s\uFF08tools=%d\uFF09",t,e.name,o.tools)}else{const s=await $.manage(t,{action:"reload",name:e.name});if(!s.ok){e.error=s.error??"\u63D2\u4EF6\u81EA\u52A8\u91CD\u8F7D\u5931\u8D25",p(e,`[reload] ${e.error}\uFF08\u4FDD\u6301\u65E7\u5B9E\u4F8B\uFF09`);return}e.error=void 0,e.mountedAt=Date.now(),p(e,"[reload] \u63D2\u4EF6\u5DF2\u81EA\u52A8\u91CD\u8F7D"),b.info("[agent:%s] \u63D2\u4EF6\u8C03\u8BD5\u6302\u8F7D\u81EA\u52A8\u91CD\u8F7D: %s",t,e.name)}}catch(s){e.error=s instanceof Error?s.message:String(s),p(e,`[reload] \u5F02\u5E38: ${e.error}`)}finally{e.reloading=!1,e.pendingReload&&(e.pendingReload=!1,T(t,e,r))}}}async function se(t,e,r,s){const o=P(e,r);if(!o.ok)return{ok:!1,kind:"plugin",error:o.error};const n=o.resolved;try{if(!h(n).isDirectory())return{ok:!1,kind:"plugin",error:`\u63D2\u4EF6\u8DEF\u5F84\u987B\u4E3A\u76EE\u5F55: ${n}`}}catch(l){return{ok:!1,kind:"plugin",error:`\u63D2\u4EF6\u8DEF\u5F84\u4E0D\u53EF\u8BFB: ${l instanceof Error?l.message:String(l)}`}}const i=await $.debugMountPlugin(t,n);if(!i.ok||!i.summary)return{ok:!1,kind:"plugin",path:n,error:i.error??"\u8C03\u8BD5\u6302\u8F7D\u5931\u8D25"};const c={kind:"plugin",name:i.summary.name,path:n,mounted:!0,toolCount:i.summary.toolCount,tools:[],logSink:new N(_),mountedAt:Date.now()};return L(t,c),x(t,c,s),b.info("[agent:%s] \u63D2\u4EF6\u8C03\u8BD5\u6302\u8F7D: %s \u2190 %s",t,i.summary.name,n),{ok:!0,kind:"plugin",name:i.summary.name,path:n,mounted:!0,toolCount:i.summary.toolCount,note:"\u8C03\u8BD5\u6302\u8F7D\uFF1A\u4EC5\u5F53\u524D\u8FD0\u884C\u4F1A\u8BDD\u751F\u6548\uFF0Cbridge \u91CD\u542F\u540E\u81EA\u52A8\u5931\u6548\uFF1B\u6539\u4EE3\u7801\u81EA\u52A8\u91CD\u8F7D\u3002\u51FA\u95EE\u9898\u53EF\u7528 ability_dev_ide(action=logs) \u770B\u5B50\u8FDB\u7A0B stderr\u3002"}}async function ie(t,e){const r=String(e??"").trim();if(!r)return{ok:!1,kind:"plugin",error:"name \u4E0D\u80FD\u4E3A\u7A7A"};if(!(await $.debugPluginNames(t)).includes(r)){const i=(await $.list(t)).find(l=>l.name===r),c=i?`\u300C${r}\u300D\u662F\u6301\u4E45\u5316\u5B89\u88C5\uFF08source=${i.source??"\u672A\u77E5"}\uFF09\uFF0C\u4E0D\u662F\u8C03\u8BD5\u6302\u8F7D\u9879\uFF0C\u4E0D\u80FD\u5728\u6B64\u6458\u9664\uFF1B\u8C03\u8BD5\u6302\u8F7D\u9879\u4EC5\u7531 ability_dev_ide(action=mount) \u5EFA\u7ACB\u3002\u8981\u79FB\u9664\u6301\u4E45\u5316\u5B89\u88C5\u8BF7\u7528 uninstall_ability_market_item\uFF0C\u6216\u8BA9\u7528\u6237\u5728\u9762\u677F\u64CD\u4F5C\u3002`:`\u672A\u627E\u5230\u540D\u4E3A\u300C${r}\u300D\u7684\u8C03\u8BD5\u6302\u8F7D\u63D2\u4EF6\uFF1B\u8BF7\u5148\u7528 ability_dev_ide(action=list) \u786E\u8BA4\u5F53\u524D\u6302\u8F7D\u9879\uFF08\u6302\u8F7D\u5931\u8D25\u7684\u9879\u4E0D\u4F1A\u51FA\u73B0\u5728\u5217\u8868\u91CC\uFF0C\u4EE5 mount \u54CD\u5E94\u4E3A\u51C6\uFF09\u3002`;return{ok:!1,kind:"plugin",name:r,error:c}}const o=await $.manage(t,{action:"uninstall",name:r});return C(t,"plugin",r),o.ok?{ok:!0,kind:"plugin",name:r,note:"\u5DF2\u6458\u9664\u8C03\u8BD5\u6302\u8F7D\uFF08\u6E90\u76EE\u5F55\u4FDD\u7559\uFF0C\u53EF\u7EE7\u7EED\u5F00\u53D1\u6216\u8F6C\u6B63\u4E3A\u5B9E\u4F8B\u6A21\u677F\u6280\u80FD\uFF09\u3002"}:{ok:!1,kind:"plugin",name:r,error:o.error}}function y(t,e){let r,s=null,o=!1;try{o=h(t).isDirectory()}catch{return{ok:!1,error:`\u8DEF\u5F84\u4E0D\u53EF\u8BFB: ${t}`}}if(o?(r=f.join(t,"mcp.json"),s=t):r=t,!w(r))return{ok:!1,error:`\u672A\u627E\u5230 mcp.json: ${r}`};let n;try{n=JSON.parse(M(r,"utf8"))}catch(u){return{ok:!1,error:`mcp.json \u89E3\u6790\u5931\u8D25: ${u instanceof Error?u.message:String(u)}`}}if(s&&(n.runtime!==void 0||n.entry!==void 0)){let u;try{u=A(s)}catch(k){return{ok:!1,error:k instanceof Error?k.message:String(k)}}const m={type:"stdio",command:"${MCP_NODE}",args:["${MCP_PACKAGE_DIR}/"+u.entry,...Array.isArray(u.args)?u.args:[]],collapsed:n.collapsed===!0,debugStderr:!0,description:u.description??`\u8C03\u8BD5\u6302\u8F7D\u7684 MCP\uFF1A${e}`},g=m,S=s;return g.command=String(g.command).split("${MCP_PACKAGE_DIR}").join(S).split("${MCP_NODE}").join(process.execPath),g.args=g.args.map(k=>k.split("${MCP_PACKAGE_DIR}").join(S).split("${MCP_NODE}").join(process.execPath)),{ok:!0,spec:m}}const i=typeof n.command=="string"?n.command.trim():"",c=typeof n.url=="string"?n.url.trim():"",l=String(n.type??n.transport??(c?"http":"stdio")).trim().toLowerCase();if(!i&&!c)return{ok:!1,error:"mcp.json \u987B\u5305\u542B command\uFF08stdio\uFF09\u6216 url\uFF08\u8FDC\u7A0B\uFF09"};const a={type:l==="sse"||l==="http"?l:"stdio",collapsed:n.collapsed===!0,debugStderr:!0,description:typeof n.description=="string"&&n.description.trim()?n.description.trim():`\u8C03\u8BD5\u6302\u8F7D\u7684 MCP\uFF1A${e}`};return i&&(a.command=i),c&&(a.url=c),Array.isArray(n.args)&&(a.args=n.args.map(u=>String(u))),n.env&&typeof n.env=="object"&&(a.env=n.env),n.headers&&typeof n.headers=="object"&&(a.headers=n.headers),o&&(a.cwd=t),{ok:!0,spec:a}}async function ae(t,e,r,s,o){const n=P(e,r);if(!n.ok)return{ok:!1,kind:"mcp",error:n.error};const i=n.resolved,c=String(o??"").trim()||f.basename(i).replace(/\.json$/i,"");if(!j(c))return{ok:!1,kind:"mcp",error:`MCP \u540D\u975E\u6CD5\uFF08\u4EC5\u5141\u8BB8\u5B57\u6BCD\u6570\u5B57 _ . -\uFF09: ${c}`};const l=y(i,c);if(!l.ok)return{ok:!1,kind:"mcp",name:c,path:i,error:l.error};const a=await s.debugMountMcpServer(t,c,l.spec);if(!a.mounted)return{ok:!1,kind:"mcp",name:c,path:i,mounted:!1,error:a.error??"\u65E0\u6D3B\u8DC3\u4F1A\u8BDD\uFF0C\u65E0\u6CD5\u70ED\u6302\u8F7D MCP"};const u={kind:"mcp",name:c,path:i,mounted:!0,toolCount:a.tools,tools:a.toolNames??[],logSink:new N(_),mountedAt:Date.now()};return L(t,u),x(t,u,s),b.info("[agent:%s] MCP \u8C03\u8BD5\u6302\u8F7D: %s \u2190 %s\uFF08tools=%d\uFF09",t,c,i,a.tools),{ok:!0,kind:"mcp",name:c,path:i,mounted:!0,toolCount:a.tools,sessions:a.sessions,note:"\u8C03\u8BD5\u6302\u8F7D\uFF1A\u4EC5\u5F53\u524D\u8FD0\u884C\u4F1A\u8BDD\u751F\u6548\uFF0Cbridge \u91CD\u542F\u540E\u81EA\u52A8\u5931\u6548\uFF1B\u6539\u4EE3\u7801\u81EA\u52A8\u91CD\u8F7D\u3002\u51FA\u95EE\u9898\u53EF\u7528 ability_dev_ide(action=logs) \u770B\u5B50\u8FDB\u7A0B stderr\u3002"}}async function ce(t,e,r){const s=String(e??"").trim();if(!s)return{ok:!1,kind:"mcp",error:"name \u4E0D\u80FD\u4E3A\u7A7A"};const o=await r.debugUnmountMcpServer(t,s);return C(t,"mcp",s),{ok:!0,kind:"mcp",name:s,mounted:!1,sessions:o.sessions,note:o.sessions===0?"\u5DF2\u4ECE\u8C03\u8BD5\u6302\u8F7D\u767B\u8BB0\u79FB\u9664\uFF08\u5F53\u524D\u65E0\u6D3B\u8DC3\u4F1A\u8BDD\uFF09":"\u5DF2\u6458\u9664\u8C03\u8BD5\u6302\u8F7D\u7684 MCP"}}function ue(t){const e=d.get(t),r=s=>[...e?.get(s)?.values()??[]].map(o=>({name:o.name,path:o.path,mounted:o.mounted,toolCount:o.toolCount,tools:o.tools,...o.error?{error:o.error}:{},mountedAt:o.mountedAt}));return{mcp:r("mcp"),plugin:r("plugin")}}async function le(t,e,r,s,o){const n=String(r??"").trim();if(!n)return{ok:!1,kind:e,name:"",lines:[],error:"name \u4E0D\u80FD\u4E3A\u7A7A"};const i=B(t,e,n);if(!i)return{ok:!1,kind:e,name:n,lines:[],error:`\u672A\u627E\u5230\u8C03\u8BD5\u6302\u8F7D\u9879\u300C${n}\u300D\uFF08kind=${e}\uFF09\uFF1B\u8BF7\u5148\u7528 ability_dev_ide(action=list) \u786E\u8BA4`};const c=Math.max(1,Math.min(Number(s??100)||100,_));if(e==="plugin"){const u=await $.getLogs(t,n);if(!u.ok)return{ok:!1,kind:e,name:n,mounted:i.mounted,lines:[],error:u.error};const m=u.logs.map(String);return{ok:!0,kind:e,name:n,mounted:i.mounted,lines:m.slice(Math.max(0,m.length-c))}}const l=o?.getMcpServerStderr?.(t,n,c),a=l&&l.length>0?l:i.logSink.getLastN(c).map(u=>u.data);return{ok:!0,kind:e,name:n,mounted:i.mounted,lines:a,...i.error?{error:i.error}:{}}}async function me(t,e,r){const s=P(t,e);if(!s.ok)return{ok:!1,kind:r,error:s.error};const o=s.resolved;let n,i;if(r==="skill"){let a=!1;try{a=h(o).isDirectory()}catch{return{ok:!1,kind:r,error:`\u8DEF\u5F84\u4E0D\u53EF\u8BFB: ${o}`}}if(!a)return{ok:!1,kind:r,error:`Skill \u5236\u54C1\u987B\u4E3A\u76EE\u5F55\uFF08\u5185\u542B SKILL.md\uFF09: ${o}`};const u=f.join(o,"SKILL.md");if(!w(u))return{ok:!1,kind:r,error:`Skill \u76EE\u5F55\u7F3A\u5C11 SKILL.md: ${o}`};n=o;try{const m=M(u,"utf8"),S=/^---\r?\n([\s\S]*?)\r?\n---/.exec(m)?.[1]??"";i=/^name:\s*(.+)$/m.exec(S)?.[1]?.trim()||void 0}catch{i=void 0}}else if(r==="mcp"){let a=!1;try{a=h(o).isDirectory()}catch{return{ok:!1,kind:r,error:`\u8DEF\u5F84\u4E0D\u53EF\u8BFB: ${o}`}}if(a){n=o;const u=f.join(o,"mcp.json");if(!w(u))return{ok:!1,kind:r,error:`MCP \u5305\u76EE\u5F55\u7F3A\u5C11 mcp.json: ${o}`};try{i=A(o).name}catch(m){return{ok:!1,kind:r,error:m instanceof Error?m.message:String(m)}}}else{if(f.basename(o).toLowerCase()!=="mcp.json")return{ok:!1,kind:r,error:`MCP \u5236\u54C1\u987B\u4E3A mcp.json \u6587\u4EF6\u6216\u5176\u6240\u5728\u5305\u76EE\u5F55: ${o}`};n=f.dirname(o);try{const u=JSON.parse(M(o,"utf8"));i=(typeof u.name=="string"?u.name.trim():"")||f.basename(n)}catch{i=f.basename(n)}}}else{let a=!1;try{a=h(o).isDirectory()}catch{return{ok:!1,kind:r,error:`\u8DEF\u5F84\u4E0D\u53EF\u8BFB: ${o}`}}if(!a)return{ok:!1,kind:r,error:`\u63D2\u4EF6\u5236\u54C1\u987B\u4E3A\u76EE\u5F55: ${o}`};n=o;const u=f.join(o,"plugin.json");if(!w(u))return{ok:!1,kind:r,error:`\u63D2\u4EF6\u76EE\u5F55\u7F3A\u5C11 plugin.json: ${o}`};try{const m=JSON.parse(M(u,"utf8"));i=(typeof m.name=="string"?m.name.trim():"")||f.basename(o)}catch{i=f.basename(o)}}const c=String(i??"").trim()||f.basename(n);if(!j(c))return{ok:!1,kind:r,error:`\u5236\u54C1\u540D\u975E\u6CD5\uFF08\u4EC5\u5141\u8BB8\u5B57\u6BCD\u6570\u5B57 _ . -\uFF09: ${c}`};let l=null;try{l=await K(n,`${r}-${c}.zip`);const a=await F(l),u=O("sha256").update(a).digest("hex");return b.info("[debug-mount] \u6253\u5305\u8C03\u8BD5\u5236\u54C1: kind=%s, name=%s, dir=%s, bytes=%d",r,c,n,a.length),{ok:!0,kind:r,name:c,size:a.length,sha256:u,bytes:a}}catch(a){return{ok:!1,kind:r,name:c,error:`\u6253\u5305\u5931\u8D25: ${a instanceof Error?a.message:String(a)}`}}finally{l&&await W(l,{force:!0}).catch(()=>{})}}export{P as assertWithinWorkspace,ne as clearDebugMounts,ae as debugMountMcp,se as debugMountPlugin,ce as debugUnmountMcp,ie as debugUnmountPlugin,oe as forgetDebugMount,le as getDebugItemLogs,j as isValidDebugName,ue as listDebugMounts,me as packageDebugItem};
|
|
2
|
+
|