aws-runtime-bridge 1.9.169 → 1.9.171

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 (92) hide show
  1. package/CHANGELOG.md +71 -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 +24 -34
  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/agent-startup-memory.d.ts +11 -0
  21. package/dist/services/agent-startup-memory.js +8 -0
  22. package/dist/services/debug-mount.d.ts +122 -0
  23. package/dist/services/debug-mount.js +2 -0
  24. package/dist/services/desktop-mcp-manager.js +1 -1
  25. package/dist/services/instance-ai-config-service.js +1 -1
  26. package/dist/services/instance-features.d.ts +4 -0
  27. package/dist/services/instance-features.js +1 -1
  28. package/dist/services/instance-init-service.js +1 -1
  29. package/dist/services/log-retention.d.ts +37 -0
  30. package/dist/services/log-retention.js +2 -0
  31. package/dist/services/mcp-deploy.d.ts +31 -0
  32. package/dist/services/mcp-deploy.js +4 -3
  33. package/dist/services/mcp-env-injector.d.ts +24 -0
  34. package/dist/services/mcp-env-injector.js +1 -1
  35. package/dist/services/mcp-package.d.ts +35 -0
  36. package/dist/services/mcp-package.js +2 -0
  37. package/dist/services/mcp-probe-client.d.ts +25 -0
  38. package/dist/services/mcp-probe-client.js +2 -0
  39. package/dist/services/panel-env.d.ts +5 -0
  40. package/dist/services/panel-env.js +1 -1
  41. package/dist/services/plugin-deployment.d.ts +36 -0
  42. package/dist/services/plugin-deployment.js +3 -0
  43. package/dist/services/plugin-event-buffer.js +2 -1
  44. package/dist/services/plugin-fs.d.ts +5 -0
  45. package/dist/services/plugin-fs.js +2 -0
  46. package/dist/services/plugin-handler-adapter.d.ts +7 -0
  47. package/dist/services/plugin-handler-adapter.js +3 -0
  48. package/dist/services/plugin-listener-runner.d.ts +18 -0
  49. package/dist/services/plugin-listener-runner.js +8 -0
  50. package/dist/services/plugin-loader.d.ts +32 -0
  51. package/dist/services/plugin-loader.js +2 -0
  52. package/dist/services/plugin-manager.d.ts +17 -136
  53. package/dist/services/plugin-manager.js +4 -15
  54. package/dist/services/plugin-manifest.d.ts +83 -0
  55. package/dist/services/plugin-manifest.js +2 -0
  56. package/dist/services/plugin-runtime.d.ts +67 -0
  57. package/dist/services/plugin-runtime.js +1 -0
  58. package/dist/services/request-invalid-dump.d.ts +21 -0
  59. package/dist/services/request-invalid-dump.js +2 -0
  60. package/dist/services/skill-manager.d.ts +15 -0
  61. package/dist/services/skill-manager.js +3 -2
  62. package/dist/types.d.ts +6 -0
  63. package/dist/utils/lifecycle-log.d.ts +2 -0
  64. package/dist/utils/lifecycle-log.js +2 -2
  65. package/dist/utils/mcp-utils.js +1 -1
  66. package/package/acode/dist/compaction.d.ts +35 -1
  67. package/package/acode/dist/compaction.js +6 -6
  68. package/package/acode/dist/image-utils.js +1 -1
  69. package/package/acode/dist/plugin-types.d.ts +6 -27
  70. package/package/acode/dist/runtime.d.ts +37 -0
  71. package/package/acode/dist/runtime.js +31 -30
  72. package/package/acode/dist/tool-group-manager.d.ts +10 -0
  73. package/package/acode/dist/tool-group-manager.js +5 -10
  74. package/package/acode/dist/types.d.ts +2 -0
  75. package/package/aws-client-agent-mcp/dist/ability-market-tools.d.ts +18 -0
  76. package/package/aws-client-agent-mcp/dist/ability-market-tools.js +2 -0
  77. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +15 -4
  78. package/package/aws-client-agent-mcp/dist/agent-client.js +1 -1
  79. package/package/aws-client-agent-mcp/dist/http-client.d.ts +2 -0
  80. package/package/aws-client-agent-mcp/dist/http-client.js +1 -1
  81. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +0 -7
  82. package/package/aws-client-agent-mcp/dist/mcp-server.js +12 -12
  83. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +5 -0
  84. package/package/aws-client-agent-mcp/dist/mcp-tools.js +34 -20
  85. package/package/aws-client-agent-mcp/dist/memory-store.d.ts +1 -1
  86. package/package/aws-client-agent-mcp/dist/memory-store.js +2 -2
  87. package/package/aws-client-agent-mcp/dist/memory-tools.js +7 -7
  88. package/package/aws-client-agent-mcp/dist/status-reporter.js +1 -1
  89. package/package/aws-client-agent-mcp/dist/tool-groups.js +2 -2
  90. package/package/aws-client-agent-mcp/dist/types.d.ts +15 -22
  91. package/package.json +3 -2
  92. package/dist/services/builtin-commands/create-plugin.md +0 -44
@@ -1,52 +1,42 @@
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 It}from"node:child_process";import{promises as ne}from"node:fs";import St from"node:os";import re 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 Le,redactTransientClipboardPastePaths as v,registerSdkProviders as Tt,resolveSdkProviderIdByCommand as _t}from"../adapter/index.js";import{MESSAGE_POLLING_IDLE_PROMPT as Me}from"../adapter/prompts.js";import{getActiveBridgeHttpPort as bt,getAcodeDataHome as xe}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{loadAgentStartupMemories as Ct}from"../services/agent-startup-memory.js";import{createAiConfigService as Et}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 $t,startHeartbeatScheduler as Rt}from"../services/event-delta-pusher.js";import{prepareAcodeInstanceConfig as Dt,redactForLog as ie}from"../services/instance-ai-config-service.js";import{setLogRetentionDays as Pt}from"../services/log-retention.js";import{setAgentFeatures as Ot,setAgentCapabilities as Lt,setAgentInheritedFeatures as Mt,setAgentCapabilitiesInherited as xt,getAgentFeatures as Ut,getAgentInheritedFeatures as Nt,getFeatureState as I,LAUNCH_ITEM_FEATURE_KEY as Ne,HIRE_FEATURE_KEY as je,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 jt}from"../services/mcp-launch-binding-queue.js";import{setPanelEnvVars as Bt,setAgentMeta as vt}from"../services/panel-env.js";import{findClaudeCodeProcesses as Ft,isProcessRunning as Kt}from"../services/process-detector.js";import{forgetSession as F,onSdkToolUseEnd as Ht,onSdkToolUseStart as qt}from"../services/sdk-tool-file-change-recorder.js";import{bridgeEventBuffer as Xe,sendOutput as Y,sendQuestionRequest as zt,sendToolAuthRequest as Wt,sendStatus as $}from"../services/session-output.js";import{findPersistedSessionByAgentId as Gt,removePersistedSession as K,savePersistedSessions as Yt,updatePersistedSessionAutoCommands as Xt,updatePersistedSessionRuntimeState as Vt,upsertPersistedSession as Jt}from"../services/terminal-persistence.js";import{getInstanceAiConfigDebugLogger as Qt}from"../utils/instance-ai-config-debug-logger.js";import{logger as l}from"../utils/logger.js";const S=ht();function Ve(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 f=new Map,Zt=45e3,ae=new Map;function en(e){if(ae.has(e))return;const n=setInterval(()=>{const t=f.get(e);if(!t){M(e);return}const r=t.currentRuntimeStatus;if(r!=="thinking"&&r!=="tool_using"&&r!=="compacting"){M(e);return}$(t.agentId,e,r,void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl}).catch(()=>{})},Zt);ae.set(e,n)}function M(e){const n=ae.get(e);n&&(clearInterval(n),ae.delete(e))}const Je=4e3,tn=200,nn=2e3,Qe=24e3,Ze=200,et=8e3;function rn(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,nn)}`),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 m=String(d.toolName||"").trim()||"\u672A\u77E5\u5DE5\u5177";if(on(m))continue;if(u==="tool_use"){const g=an(String(d.content||""));n.push(`\u3010\u5DE5\u5177\u8C03\u7528\u3011${m}${g?` ${g}`:""}`)}else{const g=ce(String(d.content||"").trim(),tn);n.push(`\u3010\u5DE5\u5177\u7ED3\u679C\u3011${m}${d.isError?"\uFF08\u5931\u8D25\uFF09":""}${g?`\uFF1A${g}`:""}`)}continue}const p=String(d.content||"");p.trim()&&(t===u||(s(),t=u),r.push(p))}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(`
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(`
13
-
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,`
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 on(e){const n=e.toLowerCase();return n.includes("poll_message")||n.includes("get_message")||n.includes("await_complete")}function sn(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 an(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 H=new Set;function cn(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 dn(e){return e!=="acode"}function un(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 ln(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 fn(e){return e.restoredActionInfo?.actionType==="idle"||e.currentRuntimeActionType==="idle"&&e.shouldPreservePrevAction||e.status==="waiting_input"&&!e.actionInfo?.actionType}const X=new Map,pn="utf-8",nt="utf-8",rt=300,ot=6e4;function V(e){return String(e).padStart(2,"0")}function mn(e,n=new Date){const t=n.getFullYear(),r=V(n.getMonth()+1),s=V(n.getDate()),o=V(n.getHours()),i=V(n.getMinutes()),a=`${t}${r}${s}-${o}${i}${V(n.getSeconds())}-${String(n.getMilliseconds()).padStart(3,"0")}`;return re.join(xe(),"cmd-dist",e,`${t}-${r}-${s}`,o,i,`${a}-cmd.out`)}function gn(e){if(!e)return 0;const n=e.replace(/\r\n/g,`
17
7
  `).replace(/\r/g,`
18
8
  `),t=n.endsWith(`
19
9
  `)?n.slice(0,-1):n;return t?t.split(`
20
- `).length:1}function ln(e,n=et){return`\r
10
+ `).length:1}function yn(e,n=rt){return`\r
21
11
  [ACode] \u547D\u4EE4\u8F93\u51FA\u8D85\u8FC7 ${n} \u884C\uFF0C\u5B8C\u6574\u8F93\u51FA\u5DF2\u5199\u5165: ${e}\r
22
12
  [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
13
+ `}function In(e=ot){return`\r
24
14
  [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
15
+ `}async function st(e){const n=e.outputPath||mn(e.agentId,e.startedAt);return e.outputPath=n,await ne.mkdir(re.dirname(n),{recursive:!0}),await ne.writeFile(n,e.chunks.join(""),"utf-8"),n}function Sn(e){return String(e??"").replace(/\r/g,`
16
+ `).trim()}function hn(e=process.platform,n=process.env){const t=n.AWS_TERMINAL_OUTPUT_ENCODING?.trim();return t||(e==="win32"?pn:nt)}function it(e=hn()){if(e!=="utf-8")try{return new oe(e,{fatal:!1})}catch{return new oe(nt,{fatal:!1})}return An()}function An(){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 Tn(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 _n(e){const n=X.get(e.sessionId);if(n)return n;const t={currentDirectory:e.workspacePath,runningProcess:null};return X.set(e.sessionId,t),t}function at(e){for(const n of f.values())if(n.agentId===e)return n}async function bn(e){const n=h.get(e.providerId||"claude-code"),t=J(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 J(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 kn(e,n=Kt){return e.pid?await n(e.pid)?pt(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}`),M(t),f.delete(t),F(t),le(t),K(t).catch(r=>{l.warn(`[cleanupSdkSessionByAgentId] Failed to remove persisted session for agentId=${e}: ${r}`)}),t}H.has(e)&&(H.delete(e),l.info(`[cleanupSdkSessionByAgentId] Released startingAgents lock for agentId=${e}`))}function le(e){const n=X.get(e);if(!n?.runningProcess){X.delete(e);return}try{n.runningProcess.kill()}catch{}finally{n.runningProcess=null,X.delete(e)}}function C(e,n){n&&(e.seq+=1,Y(e.agentId,n,e.sessionId,e.seq,void 0,{runtimeAccessToken:e.runtimeAccessToken,schedulerBaseUrl:e.schedulerBaseUrl}).catch(()=>{}))}function Ee(e){return`\x1B[36m${e}>\x1B[0m `}function Cn(e,n){return n==="~"?St.homedir():re.resolve(e,n)}async function En(e,n,t){const r=Tn(t);if(r===void 0)return!1;if(r===null)return C(e,`${n.currentDirectory}\r
17
+ `),!0;const s=Cn(n.currentDirectory,r);try{return(await ne.stat(s)).isDirectory()?(n.currentDirectory=s,C(e,`${n.currentDirectory}\r
28
18
  `),!0):(C(e,`cd: not a directory: ${s}\r
29
19
  `),!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
20
+ `),!0}}async function wn(e,n){const t=f.get(e);if(!t)throw new Error("SDK session not found");const r=Sn(n),s=_n(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=v(r);if(C(t,`${Ee(s.currentDirectory)}${o}\r
21
+ `),Le(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
22
+ `),C(t,Ee(s.currentDirectory)),{started:!1,cwd:s.currentDirectory};if(await En(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=It(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",p={agentId:t.agentId,startedAt:new Date,chunks:[],spilled:!1};let m;const g=()=>{m&&(clearTimeout(m),m=void 0)},k=()=>{g(),m=setTimeout(()=>{s.runningProcess===a&&(C(t,In()),a.kill())},ot)},A=(T,E=!0)=>{if(T&&(u&&p.chunks.push(T),u&&E&&k(),!(u&&p.spilled))){if(u&&gn(p.chunks.join(""))>rt){p.spilled=!0,st(p).then(R=>{C(t,yn(R))}).catch(R=>{const D=R instanceof Error?R.message:String(R);C(t,`\r
33
23
  [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
24
+ `)});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
25
+ [Terminal Error] ${T.message}\r
26
+ `)}),a.on("close",(T,E)=>{g(),s.runningProcess=null,A(ue(c,void 0,!0),!1),A(ue(d,void 0,!0),!1),p.spilled&&st(p).catch(R=>{const D=R instanceof Error?R.message:String(R);C(t,`\r
37
27
  [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
28
+ `)}),T&&T!==0?C(t,`\r
29
+ [exit ${T}]\r
30
+ `):E&&C(t,`\r
31
+ [signal ${E}]\r
32
+ `),C(t,Ee(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=xe()),I(e,Ne)!=="disabled"&&(o.AWS_LAUNCH_CONFIG_TOOLS=I(e,Ne)),I(e,je)!=="disabled"&&(o.AWS_HIRE_TOOLS=I(e,je)),I(e,Be)!=="disabled"&&(o.AWS_PENCIL_TOOLS=I(e,Be)),I(e,ve)!=="disabled"&&(o.AWS_DRAW_TOOLS=I(e,ve)),I(e,Fe)!=="disabled"&&(o.AWS_OFFICE_TOOLS=I(e,Fe)),I(e,Ke)!=="disabled"&&(o.AWS_COLLABORATION_TASK_TOOLS=I(e,Ke)),I(e,He)!=="disabled"&&(o.AWS_COLLABORATION_MEETING_TOOLS=I(e,He)),I(e,qe)!=="disabled"&&(o.AWS_COLLABORATION_DEBUG_TOOLS=I(e,qe)),I(e,ze)!=="disabled"&&(o.AWS_COLLABORATION_FILE_HISTORY_TOOLS=I(e,ze)),I(e,We)!=="disabled"&&(o.AWS_EMAIL_TOOLS=I(e,We)),I(e,Ge)!=="disabled"&&(o.AWS_ABILITY_MARKET_TOOLS=I(e,Ge)),I(e,Ye)!=="disabled"&&(o.AWS_ABILITY_DEV_TOOLS=I(e,Ye)),o}function $n(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 Rn(e){const n=String(e);if(!Le(n))return n;const t=$n(n);return re.isAbsolute(t)?ne.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 Dn(){try{return await Et().readClaudeCodeConfig()}catch(e){return console.warn(`[Runtime] Failed to read saved ClaudeCode AI config: ${e.message}`),{}}}function Pn(e){if(e==null)return;const t=(typeof e=="string"?e:JSON.stringify(e,null,2)).trim();if(t)return t.length<=Je?t:`${t.slice(0,Je)}
33
+ ...\uFF08\u7ED3\u679C\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`}function On(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 Ln(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=Pn(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"))&&!On(n))return}return r==="mcp"&&Ln(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 xn(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
34
  [ACode] \u6B63\u5728\u8BF7\u6C42\u6A21\u578B${n}${t}\r
45
35
  `}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
36
  [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(`
37
+ `:void 0}function Un(e){const n=Bn(e);return{sourceEventType:e.type,logCategory:"acode",...jn(e),...n?{logLevel:Nn(e),logMessage:n}:{}}}function Nn(e){return e.type==="error"?"error":e.type==="command_output"&&e.data.stream==="stderr"?"warn":"info"}function jn(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 Bn(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 Kn(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 vn=/\x1b\[[0-9;?]*[a-zA-Z]/g;function Fn(e){return e.replace(vn,"")}function Kn(e){const n=typeof e.data.stream=="string"?e.data.stream:"mixed",t=typeof e.data.sequence=="number"?` #${e.data.sequence}`:"",r=Fn(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"?Hn(t)||e.data.actionDetail||n.actionDetail:n.actionType==="read_file"||n.actionType==="edit_file"||n.actionType==="write_file"?qn(t)||e.data.actionDetail||n.actionDetail:e.data.actionDetail||n.actionDetail}function Hn(e){const n=we(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?v(t):void 0}return we(e?.args)}function qn(e){const n=ft(e?.paths);return n.length>0?n.length===1?n[0]:`${n.length}\u4E2A\u6587\u4EF6: ${n.join(", ")}`:we(e?.file_path,e?.filePath,e?.path,e?.target_file,e?.targetFile)}function we(...e){for(const n of e){if(typeof n=="string"&&n.trim())return v(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=>v(n)):[]}function zn(e){if(!(!e||Object.keys(e).length===0))try{const n=v(JSON.stringify(e,null,2));return n.length>8e3?`${n.slice(0,8e3)}
38
+ ...\uFF08\u8F93\u5165\u53C2\u6570\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`:n}catch{return}}function Wn(e,n){return String(n||"").trim().toLowerCase()!=="waiting_input"?!1:e.type==="thinking"||e.type==="text_delta"}function Gn(e,n){if(!Wn(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=zn(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 x=new Map,fe=new Map,pe=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(m=>setTimeout(m,i*(u+1)))}l.warn(`[Runtime] ${a} tool_result sendStatus retry exhausted (result may be lost): agentId=${n.agentId}`)}const Q=new Map,Yn=20,Xn=500,Vn=3e4;async function me(e,n=Vn,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=Q.get(t),s=t;else{const g=[];for(const[k,A]of Q)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&&Q.delete(s);const d={sourceEventType:c,logCategory:"acode"},u={runtimeAccessToken:a.runtimeAccessToken,schedulerBaseUrl:a.schedulerBaseUrl},m=(x.get(e)??Promise.resolve()).then(()=>me(g=>Y(a.agentId,o,e,i,d,u,g)),()=>me(g=>Y(a.agentId,o,e,i,d,u,g)));x.set(e,m),m.finally(()=>{x.get(e)===m&&x.delete(e)})}function Jn(e,n){const t=xn(e);if(!t)return;n.seq+=1;const r=n.seq,s=Un(e),o={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl};if((e.type==="command_output"||e.type==="text_delta"||e.type==="thinking")&&t.length<Yn){const c=`${e.sessionId}:${e.type}`;let d=Q.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,p=e.type;d.timer=setTimeout(()=>ge(u,p),Xn)}Q.set(c,d);return}ge(e.sessionId);const a=(x.get(e.sessionId)??Promise.resolve()).then(()=>me(c=>Y(n.agentId,t,e.sessionId,r,s,o,c)),()=>me(c=>Y(n.agentId,t,e.sessionId,r,s,o,c)));x.set(e.sessionId,a),a.finally(()=>{x.get(e.sessionId)===a&&x.delete(e.sessionId)})}function pt(e){return _t(e)}let mt=!1;function Qn(){mt||(Tt(h,Zn),Rt(),mt=!0)}function Zn(e,n){e.on("event",t=>{const r=f.get(t.sessionId);if(r){if(t.type==="tool_use_start"?qt(r.sessionId,t.data.toolUseId||t.data.actionId,t.data.toolInput,t.data.toolName,r.workspacePath):t.type==="tool_use_end"&&Ht(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=Gn(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=f.get(t);if(o){ge(t),r==="thinking"||r==="tool_using"||r==="compacting"?en(t):M(t);const i=ln(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||""),Vt(t,{runtimeStatus:i.status,runtimeActionType:o.currentRuntimeActionType,runtimeActionLabel:o.currentRuntimeActionLabel,runtimeActionDetail:o.currentRuntimeActionDetail});const p=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,p,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(E=>setTimeout(E,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 m=u&&!i.actionInfo?.actionType;if(fn({status:i.status,actionInfo:i.actionInfo,restoredActionInfo:p,currentRuntimeActionType:o.currentRuntimeActionType,shouldPreservePrevAction:u})){const A=(pe.get(t)??Promise.resolve()).then(async()=>{for(let E=0;E<=2;E++){if(await $(o.agentId,t,i.status,m?void 0:p,de(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})!==void 0)return;E<2&&await new Promise(D=>setTimeout(D,1e3*(E+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)});pe.set(t,A),A.finally(()=>{pe.get(t)===A&&pe.delete(t)})}else $(o.agentId,t,i.status,m?void 0:p,de(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})}if(i.status==="waiting_input"&&o.cachedCapabilitiesActionDetail){const m=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:m},void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})}}}),e.on("ask-user-question",t=>{const r=f.get(t.sessionId);r&&(l.info(`[${n.displayName} Adapter] AskUserQuestion for agent ${r.agentId}`),zt(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=f.get(t.sessionId);r&&t.requestId&&(l.info(`[${n.displayName} Adapter] Tool permission request (${t.capability}) for agent ${r.agentId}`),Wt(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=f.get(t.sessionId);if(r){l.info(`[${n.displayName} Adapter] Permission request: ${t.toolName} for agent ${r.agentId}`);const s=t.toolInput?v(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})}})}S.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(Ve(e))||void 0;if(jt({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&&(Ot(String(t),e.body.runtimeFeatures),l.info(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u80FD\u529B\u5F00\u5173: ${JSON.stringify(Ut(String(t)))}`)),e.body?.inheritedFeatures!==null&&e.body?.inheritedFeatures!==void 0&&(Mt(String(t),e.body.inheritedFeatures),l.info(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u7EE7\u627F\u4E09\u6001\u5C42: ${JSON.stringify(Nt(String(t)))}`)),e.body?.capabilities!==void 0&&Lt(String(t),e.body.capabilities),e.body?.capabilitiesInherited!==void 0&&xt(String(t),e.body.capabilitiesInherited),e.body?.envVars!==null&&e.body?.envVars!==void 0&&typeof e.body.envVars=="object"&&(Bt(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&&(vt(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"}`)),e.body?.logRetentionDays!==void 0){const i=Math.min(Number(e.body.logRetentionDays)||0,7);i>0&&(Pt(i),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u65E5\u5FD7\u4FDD\u7559\u5929\u6570: ${i}`))}s&&s!=="sdk"&&console.warn(`[Runtime] Unsupported runtime mode "${s}" requested for agent ${t}; starting SDK session instead.`),await er(e,n)});async function er(e,n){const{agentId:t,workspacePath:r,command:s,projectRoot:o,autoAccept:i=!0,initialPrompt:a,systemPrompt:c,globalPrompt:d,rolePrompt:u,memory:p,resumeContext:m,resumeTranscript:g,mcpConfigPath:k,extraMcpServers:A,envOverrides:T,idleInputAutoCommand:E,nonInputAutoCommand:R,model:D,instanceAiConfig:ye,subAgentModel:Ie,subAgentEffort:Se,scopeKey:Re,browserAllowPrivate:De}=e.body||{},q=sn(g);l.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 g=="string"?`${g.length}\u5B57`:typeof g} \u89E3\u6790\u7ED3\u679C=${q?`${q.length}\u6761`:"null"}`);const z=Qt();z.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 w=null;const _=String(t||"").trim(),he=String(e.body?.runtimeAccessToken||"").trim()||void 0,j=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||Ue(Ve(e))||void 0;j?l.info(`[startSdkSession] \u56DE\u8C03\u76EE\u6807 server: ${j} (agentId=${_})`):l.warn(`[startSdkSession] \u672A\u89E3\u6790\u5230 schedulerBaseUrl\uFF0C\u5C06\u56DE\u9000\u5230\u9ED8\u8BA4\u5730\u5740 (agentId=${_})`);try{if(Qn(),!_){n.status(400).json({error:"agentId is required"});return}const B=at(_);if(B){n.json(await bn(B));return}const b=await Gt(_);if(b){const O=await kn(b);if(!O.reusable)console.warn(`[Runtime] Ignoring stale persisted SDK session for agentId=${_}, sessionId=${b.sessionId}, reason=${O.reason}`),await K(b.sessionId);else{const L=J(b.runtimeStatus,b.runtimeStatus,b.runtimeActionType);n.json({sessionId:b.sessionId,status:L,runtimeStatus:L,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(H.has(_)){n.status(409).json({error:"SDK session is already starting for this agent"});return}H.add(_);const P=pt(s),gt=h.get(P);w=At();const yt=P==="claude-code"?await Dn():null,Z=dt(P==="claude-code"?yt:null,T),W=P==="acode"?D?String(D).trim():void 0:(()=>{const O=D?String(D).trim():void 0,L=Z.model?String(Z.model).trim():void 0;return O||L})();z.log({level:"info",category:"resolve",message:"\u6A21\u578B\u89E3\u6790\u7ED3\u679C",source:"bridge",agentId:_,sessionId:w??void 0,details:{perAgentModel:D??null,globalModel:Z.model??null,resolvedModel:W??null,providerId:P,note:P==="acode"?"adapter handles full priority":"request > global"}});const Ae={...Z.envOverrides};W&&(Ae.ANTHROPIC_MODEL=W,Ae.CODEX_MODEL=W);let G,Te=k;if(P==="acode"){const O=ye||{},L=await Dt({apiOverrides:tt(O)??void 0,agentId:_,sessionId:w??void 0,runtimeBridgeBaseUrl:j});G=L.instanceConfig.config,Te=L.perInstanceConfigPath,z.log({level:"info",category:"apply",message:"prepareAcodeInstanceConfig \u5B8C\u6210",source:"bridge",agentId:_,sessionId:w??void 0,details:{sanitizedApiOverrides:(()=>{const N=tt(O);return N?ie(N):null})(),resolvedInstanceAiConfig:G?ie(G):null,perInstanceConfigPath:Te,instanceConfigSources:L.instanceConfig.source??null}})}let Pe=c||void 0,_e,be,ee;const te=typeof m=="string"&&m.trim()?kt(m):void 0;if(P==="acode")if(_e=typeof d=="string"&&d.trim()||void 0,be=typeof u=="string"&&u.trim()||void 0,typeof p=="string"&&p.trim())ee=p.trim();else{const O=await Ct(r,{schedulerBaseUrl:j,runtimeAccessToken:he,agentId:_});O&&(ee=O,l.info(`[startSdkSession] Auto-loaded memories for ACode agent ${_}`))}else if(typeof d=="string"&&d.trim()||typeof u=="string"&&u.trim()||typeof p=="string"&&p.trim()||te!==void 0){const L=[d,u,p,te,c].filter(N=>typeof N=="string"&&N.trim().length>0).map(N=>N.trim());Pe=L.length>0?L.join(`
49
39
 
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};
40
+ `):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}:{},...ee!==void 0?{memory:ee}:{},...te!==void 0?{resumeContext:te}:{},...P==="acode"&&Array.isArray(q)&&q.length>0?{resumeTranscript:q}:{},model:W,mcpConfigPath:Te,...G?{instanceAiConfig:G}:{},...typeof Ie=="string"&&Ie.trim()?{subAgentModel:Ie.trim()}:{},...typeof Se=="string"&&Se.trim()?{subAgentEffort:Se.trim()}:{},extraMcpServers:A||{},envOverrides:ct(String(t),String(r),process.env,Ae,typeof o=="string"?o:void 0)};z.log({level:"info",category:"launch",message:"\u4F20\u9012\u7ED9 Adapter \u7684\u5B8C\u6574 AdapterSessionConfig",source:"bridge",agentId:_,sessionId:w,details:{adapterModel:U.model??null,adapterInstanceAiConfig:U.instanceAiConfig?ie(U.instanceAiConfig):null,adapterMcpConfigPath:U.mcpConfigPath??null}}),await z.flush(),f.set(w,{agentId:_,workspacePath:r,sessionId:w,config:U,providerId:P,seq:0,runtimeAccessToken:he,schedulerBaseUrl:j}),n.json({sessionId:w,status:"starting",runtimeStatus:"starting",agentId:_,workspacePath:r,command:U.command,mode:"sdk"}),tr({sessionId:w,agentId:_,config:U,adapter:gt,providerId:P,idleInputAutoCommand:E,nonInputAutoCommand:R,runtimeAccessToken:he,requestedSchedulerBaseUrl:j})}catch(B){if(w&&(M(w),f.delete(w),F(w)),_&&H.delete(_),!n.headersSent){const b=B instanceof Error?B.message:String(B);n.status(500).json({error:`Failed to start SDK session: ${b}`})}}}async function tr(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||Me,nonInputCommand:a||""});let u;if(dn(o))try{if(await new Promise(m=>setTimeout(m,500)),u=s.getSessionPid?.(n),!u){const g=(await Ft()).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(m){console.warn(`[Runtime] Failed to get SDK PID for agentId=${t}:`,m)}const p=J(s.getSessionStatus(n),f.get(n)?.currentRuntimeStatus,f.get(n)?.currentRuntimeActionType);await Jt({sessionId:n,agentId:t,workspacePath:r.workingDirectory,command:r.command,startedAt:new Date().toISOString(),status:"running",runtimeStatus:p,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 nr({agentId:t,sessionId:n,sdkPid:u,status:p,schedulerBaseUrl:d,runtimeAccessToken:c})}catch(u){M(n),f.delete(n),F(n),await K(n);const p=u instanceof Error?u.message:String(u);console.error(`[Runtime] Background SDK session startup failed for agentId=${t}: ${p}`),await rr({agentId:t,sessionId:n,schedulerBaseUrl:d,runtimeAccessToken:c,errorMessage:p})}finally{H.delete(t)}}async function nr(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 rr(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}`)}}S.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=f.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})}}),S.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=f.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})}}),S.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=f.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})}}),S.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=f.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})}}),S.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=f.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})}}),S.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=f.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})}}),S.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=f.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),M(t),f.delete(t),F(t),le(t),se(r.agentId),await K(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})}}),S.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=f.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=rn(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})}}),S.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=f.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})}}),S.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=f.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})}}),S.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=f.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})}}),S.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 or(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
41
+ ${e}`}S.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=f.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,or(await Rn(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",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=[...f.values()].find(c=>c.agentId===o),a={idleInputCommand:String(r||"").trim()||Me,nonInputCommand:String(s||"")};try{let c=!1;i&&(h.get(i.providerId||"claude-code").setIdleCommands?.(i.sessionId,a),c=!0);const d=await Xt(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})}}),S.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(!f.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",y,async(e,n)=>{const{sessionId:t,reason:r}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const s=f.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=cn(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=J(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})}}),S.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=f.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=sr(r),d=a(String(t),c??void 0),u=J(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 sr(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=>ir.has(r))),typeof n.summarize=="boolean"&&(t.summarize=n.summarize),Object.keys(t).length>0?t:null}const ir=new Set(["fileReads","fileEdits","otherTools","commands","browser"]);S.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=f.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})}}),S.post("/stop",y,async(e,n)=>{const{sessionId:t}=e.body||{},r=un(e.body);if(!t){n.status(400).json({error:"sessionId is required"});return}const s=f.get(t);if(!s){await K(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),M(t),f.delete(t),F(t),le(t),se(o),await K(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})}}),S.post("/stop-all",y,async(e,n)=>{const t=[],r=[];for(const[s,o]of f.entries())try{const i=o.providerId||"claude-code",a=h.get(i);a.abortCurrentTurn(s).catch(()=>{}),await a.terminateSession(s),M(s),f.delete(s),F(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 Yt([]),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})}),S.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})}),S.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})}),S.get("/events/push-stats",y,(e,n)=>{const t=$t();n.json({ok:!0,count:t.length,agents:t})});export{mn as buildAcodeCommandOutputPath,dt as buildClaudeCodeLaunchConfig,ct as buildRuntimeEnv,Un as buildSdkOutputMetadata,Mn as buildToolResultTimelineActionInfo,jr as cleanupSdkSessionByAgentId,gn as countTerminalOutputLines,it as createTerminalOutputDecoder,ue as decodeTerminalOutputChunk,kn as evaluatePersistedSessionReuse,In as formatCommandInactivityTimeoutNotice,yn as formatCommandOutputSpilloverNotice,xn as formatSdkOutputEvent,Ee as formatTerminalPrompt,fn as isIdleStatusChangeRetryable,Sn as normalizeTerminalCommandInput,sn as parseResumeTranscript,un as parseRuntimeStopOptions,Tn as parseTerminalDirectoryChangeTarget,me as raceSendOutputWithRetry,rn as renderSessionSnapshot,cn as resolveRuntimeContextResetSupport,Gn as resolveRuntimeStatusFromProviderEvent,Rn as resolveSdkInputMessage,pt as resolveSdkProviderId,J as resolveSdkSessionDisplayStatus,ln as resolveStatusChangeRuntimeState,de as resolveStatusChangeUsage,hn as resolveTerminalOutputEncoding,f as sdkSessions,dn as shouldProbeSdkProcessPid,S as terminalRouter,or as withSenderSignature};
52
42
 
@@ -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,11 @@
1
+
2
+
3
+ export interface AgentStartupMemoryOptions {
4
+ schedulerBaseUrl?: string;
5
+ runtimeAccessToken?: string;
6
+ agentId?: string;
7
+ }
8
+
9
+ export declare function loadAgentStartupMemories(workspacePath: string, options?: AgentStartupMemoryOptions): Promise<string | undefined>;
10
+
11
+ export declare function buildAgentStartupMemorySnapshot(workspacePath: string, agentId: string | undefined): () => Promise<string | null>;
@@ -0,0 +1,8 @@
1
+ import{promises as y}from"node:fs";import f from"node:path";import{resolveSchedulerBaseUrl as h}from"../config.js";import{getRuntimeAccessToken as d}from"./runtime-binding.js";import{createLogger as A}from"../utils/logger.js";const m=A("agent-startup-memory"),p=10;async function S(u,n){const e=[],i=f.join(u,".agentswork","memory");try{const s=(await y.readdir(i)).filter(r=>r.endsWith(".json")),t=await Promise.all(s.map(async r=>{try{const o=await y.readFile(f.join(i,r),"utf-8");return JSON.parse(o)}catch{return m.warn("[loadAgentStartupMemories] Failed to parse memory file: %s",f.join(i,r)),null}}));for(const r of t)if(r?.by_uri)for(const o of Object.values(r.by_uri)){const l=o.memory_type||"memory",g=(o.content||"").trim();g&&l==="instance_memory"&&e.push({title:o.title,content:g,uri:o.uri||""})}}catch{m.debug("[loadAgentStartupMemories] \u65E0\u6CD5\u8BFB\u53D6\u8BB0\u5FC6\u76EE\u5F55: %s",i)}if(e.length===0&&n?.schedulerBaseUrl&&n?.runtimeAccessToken&&n?.agentId){const c=`${n.schedulerBaseUrl.replace(/\/+$/,"")}/mcp/call`,s={"Content-Type":"application/json","X-Runtime-Token":n.runtimeAccessToken,Authorization:`Bearer ${n.runtimeAccessToken}`};try{const t=await fetch(c,{method:"POST",headers:s,body:JSON.stringify({tool:"list_memories",arguments:{agentId:n.agentId,memory_type:"instance_memory"}})});if(!t.ok)throw new Error(`Server returned ${t.status}`);const r=await t.json();if(Array.isArray(r))for(const o of r){const l=(o.content||"").trim();l&&e.push({title:o.title,content:l,uri:o.uri||""})}e.length>0&&m.info(`[loadAgentStartupMemories] Loaded ${e.length} instance memory(s) from server for ${n.agentId}`)}catch(t){m.warn("[loadAgentStartupMemories] \u4ECE server \u52A0\u8F7D instance_memory \u5931\u8D25: %s",t instanceof Error?t.message:String(t))}}e.sort((c,s)=>s.uri.localeCompare(c.uri));const a=[];if(e.length>0){const s=e.slice(0,p).map((t,r)=>`${t.title?`\u3010${t.title}\u3011`:`\u6761\u76EE ${r+1}`}
2
+ ${t.content}`);a.push(`\u3010\u5B9E\u4F8B\u5373\u65F6\u8BB0\u5FC6\u3011
3
+ ${s.join(`
4
+
5
+ `)}`),e.length>p&&a.push(`... \u53CA\u53E6\u5916 ${e.length-p} \u6761\u5B9E\u4F8B\u5373\u65F6\u8BB0\u5FC6`)}if(a.length!==0)return a.join(`
6
+
7
+ `)}function M(u,n){return async()=>{try{const{url:e}=h(),i=e?d(e)||d():d();return await S(u,{schedulerBaseUrl:e,runtimeAccessToken:i,agentId:n})??null}catch(e){return m.warn(`buildAgentStartupMemorySnapshot failed (memory refresh skipped): agentId=${n??"?"}, error=${e?.message}`),null}}}export{M as buildAgentStartupMemorySnapshot,S as loadAgentStartupMemories};
8
+
@@ -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
+