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.
Files changed (82) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/adapter/AcodeSdkAdapter.d.ts +46 -0
  3. package/dist/adapter/AcodeSdkAdapter.js +4 -4
  4. package/dist/adapter/ClaudeSdkAdapter.js +2 -2
  5. package/dist/adapter/types.d.ts +7 -0
  6. package/dist/config.d.ts +6 -0
  7. package/dist/config.js +2 -2
  8. package/dist/index.js +1 -1
  9. package/dist/routes/agent-state.d.ts +2 -0
  10. package/dist/routes/agent-state.js +2 -0
  11. package/dist/routes/capabilities.js +1 -1
  12. package/dist/routes/debug-mount.d.ts +2 -0
  13. package/dist/routes/debug-mount.js +2 -0
  14. package/dist/routes/mcp.js +1 -1
  15. package/dist/routes/plugins.js +1 -1
  16. package/dist/routes/skills.js +1 -1
  17. package/dist/routes/terminal.js +28 -32
  18. package/dist/services/acode-bg-manager.d.ts +2 -0
  19. package/dist/services/agent-capability-sync.js +1 -1
  20. package/dist/services/debug-mount.d.ts +122 -0
  21. package/dist/services/debug-mount.js +2 -0
  22. package/dist/services/desktop-mcp-manager.js +1 -1
  23. package/dist/services/instance-ai-config-service.js +1 -1
  24. package/dist/services/instance-features.d.ts +4 -0
  25. package/dist/services/instance-features.js +1 -1
  26. package/dist/services/instance-init-service.js +1 -1
  27. package/dist/services/mcp-deploy.d.ts +31 -0
  28. package/dist/services/mcp-deploy.js +4 -3
  29. package/dist/services/mcp-env-injector.d.ts +24 -0
  30. package/dist/services/mcp-env-injector.js +1 -1
  31. package/dist/services/mcp-package.d.ts +35 -0
  32. package/dist/services/mcp-package.js +2 -0
  33. package/dist/services/mcp-probe-client.d.ts +25 -0
  34. package/dist/services/mcp-probe-client.js +2 -0
  35. package/dist/services/panel-env.d.ts +5 -0
  36. package/dist/services/panel-env.js +1 -1
  37. package/dist/services/plugin-deployment.d.ts +36 -0
  38. package/dist/services/plugin-deployment.js +3 -0
  39. package/dist/services/plugin-event-buffer.js +2 -1
  40. package/dist/services/plugin-fs.d.ts +5 -0
  41. package/dist/services/plugin-fs.js +2 -0
  42. package/dist/services/plugin-handler-adapter.d.ts +7 -0
  43. package/dist/services/plugin-handler-adapter.js +3 -0
  44. package/dist/services/plugin-listener-runner.d.ts +18 -0
  45. package/dist/services/plugin-listener-runner.js +8 -0
  46. package/dist/services/plugin-loader.d.ts +32 -0
  47. package/dist/services/plugin-loader.js +2 -0
  48. package/dist/services/plugin-manager.d.ts +17 -136
  49. package/dist/services/plugin-manager.js +4 -15
  50. package/dist/services/plugin-manifest.d.ts +83 -0
  51. package/dist/services/plugin-manifest.js +2 -0
  52. package/dist/services/plugin-runtime.d.ts +67 -0
  53. package/dist/services/plugin-runtime.js +1 -0
  54. package/dist/services/skill-manager.d.ts +15 -0
  55. package/dist/services/skill-manager.js +3 -2
  56. package/dist/types.d.ts +6 -0
  57. package/dist/utils/mcp-utils.js +1 -1
  58. package/package/acode/dist/compaction.d.ts +35 -1
  59. package/package/acode/dist/compaction.js +6 -6
  60. package/package/acode/dist/plugin-types.d.ts +6 -27
  61. package/package/acode/dist/runtime.d.ts +37 -0
  62. package/package/acode/dist/runtime.js +31 -30
  63. package/package/acode/dist/tool-group-manager.d.ts +10 -0
  64. package/package/acode/dist/tool-group-manager.js +5 -10
  65. package/package/acode/dist/types.d.ts +2 -0
  66. package/package/aws-client-agent-mcp/dist/ability-market-tools.d.ts +18 -0
  67. package/package/aws-client-agent-mcp/dist/ability-market-tools.js +2 -0
  68. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +13 -4
  69. package/package/aws-client-agent-mcp/dist/agent-client.js +1 -1
  70. package/package/aws-client-agent-mcp/dist/http-client.d.ts +2 -0
  71. package/package/aws-client-agent-mcp/dist/http-client.js +1 -1
  72. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +0 -7
  73. package/package/aws-client-agent-mcp/dist/mcp-server.js +12 -12
  74. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +1 -0
  75. package/package/aws-client-agent-mcp/dist/mcp-tools.js +20 -20
  76. package/package/aws-client-agent-mcp/dist/memory-store.d.ts +1 -1
  77. package/package/aws-client-agent-mcp/dist/memory-store.js +2 -2
  78. package/package/aws-client-agent-mcp/dist/memory-tools.js +7 -7
  79. package/package/aws-client-agent-mcp/dist/tool-groups.js +2 -2
  80. package/package/aws-client-agent-mcp/dist/types.d.ts +0 -21
  81. package/package.json +3 -2
  82. package/dist/services/builtin-commands/create-plugin.md +0 -44
@@ -1,52 +1,48 @@
1
- import{spawn as pt}from"node:child_process";import{promises as v}from"node:fs";import gt from"node:os";import j from"node:path";import{TextDecoder as re}from"node:util";import Pe from"axios";import{Router as yt}from"express";import{v4 as ht}from"uuid";import{adapterRegistry as _,getToolActionInfo as be,isTransientClipboardPasteFilePath as Oe,redactTransientClipboardPastePaths as K,registerSdkProviders as It,resolveSdkProviderIdByCommand as St}from"../adapter/index.js";import{MESSAGE_POLLING_IDLE_PROMPT as Le}from"../adapter/prompts.js";import{getActiveBridgeHttpPort as At,getAcodeDataHome as Me}from"../config.js";import{buildResumeContextBlock as Tt}from"@agentswork/acode";import{validateToken as I}from"../middleware/auth.js";import{getAgentProcessManager as ke}from"../services/agent-process-manager.js";import{createAiConfigService as _t}from"../services/ai-config-service.js";import{resolveSchedulerBaseUrlFromToken as Ue}from"../services/auto-register.js";import{setChangeCacheRetentionDays as bt}from"../services/change-cache-retention.js";import{getAllPushStats as kt,startHeartbeatScheduler as Ct}from"../services/event-delta-pusher.js";import{prepareAcodeInstanceConfig as $t,redactForLog as oe}from"../services/instance-ai-config-service.js";import{setAgentFeatures as wt,setAgentCapabilities as Et,setAgentInheritedFeatures as Rt,setAgentCapabilitiesInherited as Dt,getAgentFeatures as Pt,getAgentInheritedFeatures as Ot,getFeatureState as T,LAUNCH_ITEM_FEATURE_KEY as xe,HIRE_FEATURE_KEY as Ne,PENCIL_FEATURE_KEY as je,DRAW_FEATURE_KEY as Be,OFFICE_FEATURE_KEY as Fe,COLLABORATION_TASK_FEATURE_KEY as ve,COLLABORATION_MEETING_FEATURE_KEY as Ke,COLLABORATION_DEBUG_FEATURE_KEY as He,COLLABORATION_FILE_HISTORY_FEATURE_KEY as qe,EMAIL_FEATURE_KEY as ze}from"../services/instance-features.js";import{enqueueMcpLaunchBinding as Lt}from"../services/mcp-launch-binding-queue.js";import{setPanelEnvVars as Mt}from"../services/panel-env.js";import{findClaudeCodeProcesses as Ut,isProcessRunning as xt}from"../services/process-detector.js";import{forgetSession as H,onSdkToolUseEnd as Nt,onSdkToolUseStart as jt}from"../services/sdk-tool-file-change-recorder.js";import{bridgeEventBuffer as We,sendOutput as J,sendQuestionRequest as Bt,sendToolAuthRequest as Ft,sendStatus as E}from"../services/session-output.js";import{findPersistedSessionByAgentId as vt,removePersistedSession as q,savePersistedSessions as Kt,updatePersistedSessionAutoCommands as Ht,updatePersistedSessionRuntimeState as qt,upsertPersistedSession as zt}from"../services/terminal-persistence.js";import{getInstanceAiConfigDebugLogger as Wt}from"../utils/instance-ai-config-debug-logger.js";import{logger as f}from"../utils/logger.js";const S=yt();function Ge(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 g=new Map,Gt=45e3,se=new Map;function Xt(e){if(se.has(e))return;const n=setInterval(()=>{const t=g.get(e);if(!t){M(e);return}const r=t.currentRuntimeStatus;if(r!=="thinking"&&r!=="tool_using"&&r!=="compacting"){M(e);return}E(t.agentId,e,r,void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl}).catch(()=>{})},Gt);se.set(e,n)}function M(e){const n=se.get(e);n&&(clearInterval(n),se.delete(e))}const Xe=4e3,Yt=200,Jt=2e3,Ye=24e3,Je=200,Ve=8e3;function Vt(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 u=r.join("").trim();if(r=[],!u){t=null;return}const d=t==="user"?"\u7528\u6237":t==="assistant"?"\u52A9\u624B":t;n.push(`\u3010${d}\u3011${ie(u,Jt)}`),t=null};for(const u of e){const d=String(u?.role||"").trim();if(!d||d==="system")continue;if(d==="tool_use"||d==="tool_result"){s();const m=String(u.toolName||"").trim()||"\u672A\u77E5\u5DE5\u5177";if(Qt(m))continue;if(d==="tool_use"){const p=en(String(u.content||""));n.push(`\u3010\u5DE5\u5177\u8C03\u7528\u3011${m}${p?` ${p}`:""}`)}else{const p=ie(String(u.content||"").trim(),Yt);n.push(`\u3010\u5DE5\u5177\u7ED3\u679C\u3011${m}${u.isError?"\uFF08\u5931\u8D25\uFF09":""}${p?`\uFF1A${p}`:""}`)}continue}const l=String(u.content||"");l.trim()&&(t===d||(s(),t=d),r.push(l))}if(s(),n.length===0)return{snapshot:"",truncated:!1};const o=n.join(`
2
- `);if(o.length<=Ye)return{snapshot:o,truncated:!1};const i=Ye-Ve,a=o.slice(0,Ve),c=o.slice(o.length-i);return{snapshot:`${a}
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 ie(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 Qt(e){const n=e.toLowerCase();return n.includes("poll_message")||n.includes("get_message")||n.includes("await_complete")}function Zt(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 en(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 ie(n,Je)}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 ie(r.join(" "),Je)}function Qe(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 tn(e,n){const t=[],r=[],s=j.join(e,".agentswork","memory");try{const c=(await v.readdir(s)).filter(d=>d.endsWith(".json")),u=await Promise.all(c.map(async d=>{try{const l=await v.readFile(j.join(s,d),"utf-8");return JSON.parse(l)}catch{return f.warn("[loadAgentStartupMemories] Failed to parse memory file: %s",j.join(s,d)),null}}));for(const d of u)if(d?.by_uri)for(const l of Object.values(d.by_uri)){const m=l.memory_type||"memory",p=(l.content||"").trim();p&&(m==="recently_memory"?t.push({title:l.title,content:p,uri:l.uri||""}):m==="agent_memory"&&r.push({title:l.title,content:p,uri:l.uri||""}))}}catch{f.debug("[loadAgentStartupMemories] \u65E0\u6CD5\u8BFB\u53D6\u8BB0\u5FC6\u76EE\u5F55: %s",s)}if(t.length===0&&r.length===0&&n?.schedulerBaseUrl&&n?.runtimeAccessToken&&n?.agentId){const a=`${n.schedulerBaseUrl.replace(/\/+$/,"")}/mcp/call`,c={"Content-Type":"application/json","X-Runtime-Token":n.runtimeAccessToken,Authorization:`Bearer ${n.runtimeAccessToken}`},u=["recently_memory","agent_memory"],d=await Promise.allSettled(u.map(l=>fetch(a,{method:"POST",headers:c,body:JSON.stringify({tool:"list_memories",arguments:{agentId:n.agentId,memory_type:l}})}).then(m=>{if(!m.ok)throw new Error(`Server returned ${m.status}`);return m.json()})));for(let l=0;l<d.length;l++){const m=d[l];if(m.status!=="fulfilled")continue;const p=m.value;if(!Array.isArray(p))continue;const b=u[l]==="recently_memory"?t:r;for(const y of p){const h=(y.content||"").trim();h&&b.push({title:y.title,content:h,uri:y.uri||""})}}(t.length>0||r.length>0)&&f.info(`[loadAgentStartupMemories] Loaded ${t.length} task(s) and ${r.length} memory(s) from server for ${n.agentId}`)}const o=10;t.sort((a,c)=>c.uri.localeCompare(a.uri)),r.sort((a,c)=>c.uri.localeCompare(a.uri));const i=[];if(t.length>0){const c=t.slice(0,o).map((u,d)=>`${u.title?`\u3010${u.title}\u3011`:`\u6761\u76EE ${d+1}`}
7
- ${u.content}`);i.push(`\u3010\u77ED\u671F\u8BB0\u5FC6\u3011
8
- ${c.join(`
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&&i.push(`... \u53CA\u53E6\u5916 ${t.length-o} \u6761\u77ED\u671F\u8BB0\u5FC6`)}if(r.length>0){const c=r.slice(0,o).map(u=>{const d=u.title?`\u3010${u.title}\u3011`:"";return d?`${d}
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
- `)}`),r.length>o&&i.push(`... \u53CA\u53E6\u5916 ${r.length-o} \u6761 agent \u8BA4\u77E5`)}if(i.length!==0)return i.join(`
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 ln(e,n=et){return`\r
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 fn(e=tt){return`\r
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 nt(e){const n=e.outputPath||un(e.agentId,e.startedAt);return e.outputPath=n,await v.mkdir(j.dirname(n),{recursive:!0}),await v.writeFile(n,e.chunks.join(""),"utf-8"),n}function mn(e){return String(e??"").replace(/\r/g,`
26
- `).trim()}function pn(e=process.platform,n=process.env){const t=n.AWS_TERMINAL_OUTPUT_ENCODING?.trim();return t||(e==="win32"?cn:Ze)}function rt(e=pn()){if(e!=="utf-8")try{return new re(e,{fatal:!1})}catch{return new re(Ze,{fatal:!1})}return gn()}function gn(){let e=null,n=null,t=null;const r=[];function s(o){try{return new re(o,{fatal:!1})}catch{return new re("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 ce(e,n,t=!1){return t?e.decode():!n||n.length===0?"":e.decode(n,{stream:!0})}function yn(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 hn(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 ot(e){for(const n of g.values())if(n.agentId===e)return n}async function In(e){const n=_.get(e.providerId||"claude-code"),t=ue(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 ue(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 Sn(e,n=xt){return e.pid?await n(e.pid)?dt(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 Er(e){const n=ot(e);if(!n)f.info(`[cleanupSdkSessionByAgentId] No active SDK session found for agentId=${e}, cleaning residual state anyway`);else{const t=n.sessionId;return f.info(`[cleanupSdkSessionByAgentId] Cleaning up SDK session for agentId=${e}, sessionId=${t}`),M(t),g.delete(t),H(t),de(t),q(t).catch(r=>{f.warn(`[cleanupSdkSessionByAgentId] Failed to remove persisted session for agentId=${e}: ${r}`)}),t}z.has(e)&&(z.delete(e),f.info(`[cleanupSdkSessionByAgentId] Released startingAgents lock for agentId=${e}`))}function de(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 Ce(e){return`\x1B[36m${e}>\x1B[0m `}function An(e,n){return n==="~"?gt.homedir():j.resolve(e,n)}async function Tn(e,n,t){const r=yn(t);if(r===void 0)return!1;if(r===null)return C(e,`${n.currentDirectory}\r
27
- `),!0;const s=An(n.currentDirectory,r);try{return(await v.stat(s)).isDirectory()?(n.currentDirectory=s,C(e,`${n.currentDirectory}\r
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 _n(e,n){const t=g.get(e);if(!t)throw new Error("SDK session not found");const r=mn(n),s=hn(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,`${Ce(s.currentDirectory)}${o}\r
31
- `),Oe(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
32
- `),C(t,Ce(s.currentDirectory)),{started:!1,cwd:s.currentDirectory};if(await Tn(t,s,r))return{started:!1,cwd:s.currentDirectory};await E(t.agentId,e,"tool_using",{actionType:"bash",actionLabel:"\u7EC8\u7AEF\u547D\u4EE4",actionDetail:o},void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl});const a=pt(r,{cwd:s.currentDirectory,shell:!0,env:st(t.agentId,t.workspacePath,process.env,t.config.envOverrides)});s.runningProcess=a;const c=rt(),u=rt(),d=t.providerId==="acode",l={agentId:t.agentId,startedAt:new Date,chunks:[],spilled:!1};let m;const p=()=>{m&&(clearTimeout(m),m=void 0)},b=()=>{p(),m=setTimeout(()=>{s.runningProcess===a&&(C(t,fn()),a.kill())},tt)},y=(h,$=!0)=>{if(h&&(d&&l.chunks.push(h),d&&$&&b(),!(d&&l.spilled))){if(d&&dn(l.chunks.join(""))>et){l.spilled=!0,nt(l).then(R=>{C(t,ln(R))}).catch(R=>{const D=R instanceof Error?R.message:String(R);C(t,`\r
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,h)}};return d&&b(),a.stdout.on("data",h=>{y(ce(c,h))}),a.stderr.on("data",h=>{y(ce(u,h))}),a.on("error",h=>{C(t,`\r
35
- [Terminal Error] ${h.message}\r
36
- `)}),a.on("close",(h,$)=>{p(),s.runningProcess=null,y(ce(c,void 0,!0),!1),y(ce(u,void 0,!0),!1),l.spilled&&nt(l).catch(R=>{const D=R instanceof Error?R.message:String(R);C(t,`\r
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
- `)}),h&&h!==0?C(t,`\r
39
- [exit ${h}]\r
40
- `):$&&C(t,`\r
41
- [signal ${$}]\r
42
- `),C(t,Ce(s.currentDirectory)),E(t.agentId,e,"waiting_input",void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl})}),{started:!0,cwd:s.currentDirectory}}function st(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 u=String(a).trim();u&&(o[c]=u)}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:${At()}`,String(o.ACODE_HOME||"").trim()||(o.ACODE_HOME=Me()),T(e,xe)!=="disabled"&&(o.AWS_LAUNCH_CONFIG_TOOLS=T(e,xe)),T(e,Ne)!=="disabled"&&(o.AWS_HIRE_TOOLS=T(e,Ne)),T(e,je)!=="disabled"&&(o.AWS_PENCIL_TOOLS=T(e,je)),T(e,Be)!=="disabled"&&(o.AWS_DRAW_TOOLS=T(e,Be)),T(e,Fe)!=="disabled"&&(o.AWS_OFFICE_TOOLS=T(e,Fe)),T(e,ve)!=="disabled"&&(o.AWS_COLLABORATION_TASK_TOOLS=T(e,ve)),T(e,Ke)!=="disabled"&&(o.AWS_COLLABORATION_MEETING_TOOLS=T(e,Ke)),T(e,He)!=="disabled"&&(o.AWS_COLLABORATION_DEBUG_TOOLS=T(e,He)),T(e,qe)!=="disabled"&&(o.AWS_COLLABORATION_FILE_HISTORY_TOOLS=T(e,qe)),T(e,ze)!=="disabled"&&(o.AWS_EMAIL_TOOLS=T(e,ze)),o}function bn(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 kn(e){const n=String(e);if(!Oe(n))return n;const t=bn(n);return j.isAbsolute(t)?v.readFile(t,"utf-8"):n}function it(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 Cn(){try{return await _t().readClaudeCodeConfig()}catch(e){return console.warn(`[Runtime] Failed to read saved ClaudeCode AI config: ${e.message}`),{}}}function $n(e){if(e==null)return;const t=(typeof e=="string"?e:JSON.stringify(e,null,2)).trim();if(t)return t.length<=Xe?t:`${t.slice(0,Xe)}
43
- ...\uFF08\u7ED3\u679C\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`}function wn(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 En(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 Rn(e){if(e.type!=="tool_use_end")return;const n=$n(e.data.toolResult??e.data.actionResult);if(!n)return;const t=be(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"))&&!wn(n))return}return r==="mcp"&&En(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 Dn(e){if(e.type==="ai_request"){const n=e.data.model?` ${e.data.model}`:"",t=e.data.lastUserMessagePreview?`\uFF1A${e.data.lastUserMessagePreview}`:"";return`\r
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 Pn(e){const n=Mn(e);return{sourceEventType:e.type,logCategory:"acode",...Ln(e),...n?{logLevel:On(e),logMessage:n}:{}}}function On(e){return e.type==="error"?"error":e.type==="command_output"&&e.data.stream==="stderr"?"warn":"info"}function Ln(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 Mn(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 at(e,"\u5F00\u59CB");if(e.type==="tool_use_end")return at(e,"\u5B8C\u6210");if(e.type==="command_output")return Nn(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 Un=/\x1b\[[0-9;?]*[a-zA-Z]/g;function xn(e){return e.replace(Un,"")}function Nn(e){const n=typeof e.data.stream=="string"?e.data.stream:"mixed",t=typeof e.data.sequence=="number"?` #${e.data.sequence}`:"",r=xn(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 at(e,n){const t=be(e.data.toolName,e.data.toolInput),r=e.data.actionLabel||t.actionLabel||"\u8C03\u7528\u5DE5\u5177",s=ct(e,t);return s?`${n}${r}: ${s}`:`${n}${r}: ${e.data.actionDetail||e.data.toolName||"tool"}`}function ct(e,n){const t=e.data.toolInput;return n.actionType==="bash"?jn(t)||e.data.actionDetail||n.actionDetail:n.actionType==="read_file"||n.actionType==="edit_file"||n.actionType==="write_file"?Bn(t)||e.data.actionDetail||n.actionDetail:e.data.actionDetail||n.actionDetail}function jn(e){const n=$e(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 $e(e?.args)}function Bn(e){const n=ut(e?.paths);return n.length>0?n.length===1?n[0]:`${n.length}\u4E2A\u6587\u4EF6: ${n.join(", ")}`:$e(e?.file_path,e?.filePath,e?.path,e?.target_file,e?.targetFile)}function $e(...e){for(const n of e){if(typeof n=="string"&&n.trim())return K(n.trim());if(Array.isArray(n)){const t=ut(n)[0];if(t)return t}}}function ut(e){return Array.isArray(e)?e.map(n=>typeof n=="string"?n.trim():"").filter(Boolean).map(n=>K(n)):[]}function Fn(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)}
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}`}S.post("/input",I,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=g.get(t);if(!i){n.status(404).json({error:"SDK session not found"});return}try{const a=i.providerId||"claude-code",c=_.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,Zn(await kn(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})}}),S.post("/update-auto-commands",I,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=[...g.values()].find(c=>c.agentId===o),a={idleInputCommand:String(r||"").trim()||Le,nonInputCommand:String(s||"")};try{let c=!1;i&&(_.get(i.providerId||"claude-code").setIdleCommands?.(i.sessionId,a),c=!0);const u=await Ht(o,{idleInputAutoCommand:a.idleInputCommand,nonInputAutoCommand:a.nonInputCommand});n.json({ok:!0,mode:"sdk",sessionUpdated:c,persistedUpdated:u})}catch(c){const u=c instanceof Error?c.message:String(c);n.status(500).json({ok:!1,mode:"sdk",error:u})}}),S.post("/resize",I,(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(!g.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)})}),S.post("/reset-context",I,async(e,n)=>{const{sessionId:t,reason: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}const o=s.providerId||"claude-code",i=_.get(o),a=i.resetContext?.bind(i),c=nn(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 u=ue(i.getSessionStatus(String(t)),s.currentRuntimeStatus,s.currentRuntimeActionType);n.json({ok:!0,contextReset:!0,sessionId:t,status:u,runtimeStatus:u,agentId:s.agentId,mode:"sdk",providerId:o,reason:typeof r=="string"&&r.trim()?r.trim():void 0})}catch(u){const d=u instanceof Error?u.message:String(u);n.status(500).json({ok:!1,contextReset:!1,mode:"sdk",error:d})}}),S.post("/stop",I,async(e,n)=>{const{sessionId:t}=e.body||{},r=on(e.body);if(!t){n.status(400).json({error:"sessionId is required"});return}const s=g.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{f.info(`[Runtime] Stopping SDK session ${t}; suppressStatus=${!r.statusNotified}, reason=${r.reason||"unspecified"}`);const i=s.providerId||"claude-code",a=_.get(i);a.abortCurrentTurn(t).catch(()=>{}),await a.terminateSession(t),M(t),g.delete(t),H(t),de(t),await q(t),await ke().removeProcess(o),r.statusNotified?await E(o,null,"stopped",void 0,void 0,{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl}):f.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})}}),S.post("/stop-all",I,async(e,n)=>{const t=[],r=[];for(const[s,o]of g.entries())try{const i=o.providerId||"claude-code",a=_.get(i);a.abortCurrentTurn(s).catch(()=>{}),await a.terminateSession(s),M(s),g.delete(s),H(s),de(s),t.push(s),await E(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 Kt([]),f.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})}),S.get("/events/last/:n",I,(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=We.getLastN(t);n.json({ok:!0,count:r.length,entries:r})}),S.get("/events/since/:index",I,(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=We.getSinceIndex(t);n.json({ok:!0,entries:r.entries,nextIndex:r.nextIndex,oldestIndex:r.oldestIndex,dataLoss:r.oldestIndex>t+1})}),S.get("/events/push-stats",I,(e,n)=>{const t=kt();n.json({ok:!0,count:t.length,agents:t})});export{un as buildAcodeCommandOutputPath,it as buildClaudeCodeLaunchConfig,st as buildRuntimeEnv,Pn as buildSdkOutputMetadata,Rn as buildToolResultTimelineActionInfo,Er as cleanupSdkSessionByAgentId,dn as countTerminalOutputLines,rt as createTerminalOutputDecoder,ce as decodeTerminalOutputChunk,Sn as evaluatePersistedSessionReuse,fn as formatCommandInactivityTimeoutNotice,ln as formatCommandOutputSpilloverNotice,Dn as formatSdkOutputEvent,Ce as formatTerminalPrompt,an as isIdleStatusChangeRetryable,mn as normalizeTerminalCommandInput,Zt as parseResumeTranscript,on as parseRuntimeStopOptions,yn as parseTerminalDirectoryChangeTarget,me as raceSendOutputWithRetry,Vt as renderSessionSnapshot,nn as resolveRuntimeContextResetSupport,Kn as resolveRuntimeStatusFromProviderEvent,kn as resolveSdkInputMessage,dt as resolveSdkProviderId,ue as resolveSdkSessionDisplayStatus,sn as resolveStatusChangeRuntimeState,ae as resolveStatusChangeUsage,pn as resolveTerminalOutputEncoding,g as sdkSessions,rn as shouldProbeSdkProcessPid,S as terminalRouter,Zn as withSenderSignature};
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 v,existsSync as y,lstatSync as S,mkdirSync as D,readdirSync as g,realpathSync as d,rmSync as l,symlinkSync as p}from"node:fs";import o from"node:path";import{getBridgeDataHome as E,getBridgeInstanceSkillsDir as h,getBridgeTemplateSkillsDir as b}from"../config.js";import{createLogger as L}from"../utils/logger.js";import{isCapabilityEnabled as w}from"./instance-features.js";const f=L("agent-capability-sync"),j=process.platform==="win32"?"junction":"dir";function z(){return o.join(E(),"instance-runtime")}function x(t){return h(t)}function T(){return o.join(b(),"deployed")}function B(){return b()}function F(){const t=new Map,r=[B(),T()].filter(e=>e&&e.length>0);for(const e of r){if(!y(e))continue;let s=[];try{s=g(e)}catch{continue}for(const n of s){if(n.startsWith("."))continue;const i=o.join(e,n);try{if(!y(o.join(i,"SKILL.md")))continue;t.set(n,i)}catch{continue}}}return{sources:t}}function k(t,r){try{p(t,r,j)}catch(e){if(e.code==="EEXIST")try{if(S(r).isSymbolicLink()){l(r,{recursive:!0,force:!0}),p(t,r,j);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",o.basename(r),r);return}catch{}f.warn("[farm] junction \u5931\u8D25\uFF0C\u56DE\u9000\u590D\u5236 %s \u2192 %s: %s",t,r,e instanceof Error?e.message:String(e));try{let n=!1;try{n=S(r).isSymbolicLink()}catch{n=!1}const i=y(r);if(i&&!n){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}i&&n&&l(r,{recursive:!0,force:!0}),v(t,r,{recursive:!0})}catch(n){f.error("[farm] \u590D\u5236\u56DE\u9000\u4E5F\u5931\u8D25 %s: %s",r,n instanceof Error?n.message:String(n))}}}function A(t,r){try{return o.resolve(d(t))===o.resolve(d(r))}catch{return!1}}function G(t){if(!t)return null;const r=x(t);try{const{sources:e}=F();D(r,{recursive:!0});const s=new Set;let n=[];try{n=g(r)}catch{n=[]}for(const c of n){const a=o.join(r,c);try{S(a).isSymbolicLink()&&s.add(c)}catch{continue}}let i=0,m=0;for(const[c,a]of e){const u=o.join(r,c);if(w(t,"skills",c))s.has(c)?A(u,a)||(l(u,{recursive:!0,force:!0}),k(a,u),i++):(k(a,u),i++);else if(s.has(c))try{l(u,{recursive:!0,force:!0}),m++}catch{}}for(const c of s)if(!e.has(c))try{l(o.join(r,c),{recursive:!0,force:!0}),m++}catch{}return(i>0||m>0)&&f.info("[farm] agent=%s \u6280\u80FD\u519C\u573A\u5DF2\u540C\u6B65: +%d \u94FE\u63A5, -%d \u53D6\u6D88\u94FE\u63A5 (\u5171 %d \u9879)",t,i,m,e.size),r}catch(e){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",t,e instanceof Error?e.message:String(e)),null}}export{x as getAgentSkillsFarmDir,z as getSkillFarmRoot,G as syncAgentSkillFarm};
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
+