aws-runtime-bridge 1.9.125 → 1.9.126

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 (39) hide show
  1. package/dist/adapter/AcodeSdkAdapter.js +4 -4
  2. package/dist/adapter/OpencodeSdkAdapter.js +2 -2
  3. package/dist/config.d.ts +8 -2
  4. package/dist/config.js +3 -1
  5. package/dist/index.js +1 -1
  6. package/dist/routes/acode-todos.js +1 -1
  7. package/dist/routes/background-tasks.js +1 -1
  8. package/dist/routes/terminal.js +19 -19
  9. package/dist/services/aws-client-agent-mcp.js +2 -2
  10. package/dist/services/cc-switch-sdk.js +1 -1
  11. package/dist/services/instance-ai-config-service.js +1 -1
  12. package/package/acode/dist/background-command-store.js +1 -1
  13. package/package/acode/dist/builtins/commandArtifacts.js +3 -3
  14. package/package/acode/dist/paths.d.ts +2 -0
  15. package/package/acode/dist/paths.js +2 -0
  16. package/package/acode/dist/runtime.d.ts +2 -0
  17. package/package/acode/dist/runtime.js +20 -20
  18. package/package/acode/dist/sub-agent-manager.d.ts +1 -0
  19. package/package/acode/dist/sub-agent-manager.js +1 -1
  20. package/package/acode/dist/sub-agent-store.js +3 -3
  21. package/package/acode/dist/sub-agent-tools.js +27 -31
  22. package/package/acode/dist/sub-agent-types.d.ts +1 -1
  23. package/package/acode/dist/todo-store.js +1 -1
  24. package/package/acode/dist/tool-allocation.d.ts +18 -4
  25. package/package/acode/dist/tool-allocation.js +1 -1
  26. package/package/acode/dist/types.d.ts +0 -3
  27. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +5 -0
  28. package/package/aws-client-agent-mcp/dist/agent-client.js +1 -1
  29. package/package/aws-client-agent-mcp/dist/agent-client.test.js +72 -0
  30. package/package/aws-client-agent-mcp/dist/config.d.ts +2 -0
  31. package/package/aws-client-agent-mcp/dist/config.js +1 -1
  32. package/package/aws-client-agent-mcp/dist/config.test.js +93 -1
  33. package/package/aws-client-agent-mcp/dist/mcp-server.js +3 -3
  34. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +24 -6
  35. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts +14 -0
  36. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js +1 -1
  37. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js +39 -1
  38. package/package/aws-client-agent-mcp/package.json +1 -1
  39. package/package.json +1 -1
@@ -1,10 +1,10 @@
1
- import{spawn as Xe}from"node:child_process";import{promises as N}from"node:fs";import be from"node:os";import j from"node:path";import{TextDecoder as ee}from"node:util";import{Router as Qe}from"express";import{v4 as Ve}from"uuid";import Ce from"axios";import{adapterRegistry as w,getToolActionInfo as ye,isTransientClipboardPasteFilePath as _e,redactTransientClipboardPastePaths as v,registerSdkProviders as Ge,resolveSdkProviderIdByCommand as Je}from"../adapter/index.js";import{validateToken as S}from"../middleware/auth.js";import{getAgentProcessManager as he}from"../services/agent-process-manager.js";import{setAgentFeatures as Ye,getAgentFeatures as Ze,isFeatureEnabled as $e,LAUNCH_ITEM_FEATURE_KEY as et,HIRE_FEATURE_KEY as tt}from"../services/instance-features.js";import{setPanelEnvVars as nt}from"../services/panel-env.js";import{setChangeCacheRetentionDays as ot}from"../services/change-cache-retention.js";import{getAiConfigService as rt}from"../services/cc-switch-sdk.js";import{prepareAcodeInstanceConfig as st,redactForLog as te}from"../services/instance-ai-config-service.js";import{enqueueMcpLaunchBinding as it}from"../services/mcp-launch-binding-queue.js";import{resolveSchedulerBaseUrlFromToken as De}from"../services/auto-register.js";import{findClaudeCodeProcesses as at,isProcessRunning as ct}from"../services/process-detector.js";import{bridgeEventBuffer as Re,sendOutput as X,sendQuestionRequest as ut,sendStatus as _}from"../services/session-output.js";import{getAllPushStats as dt,startHeartbeatScheduler as lt}from"../services/event-delta-pusher.js";import{forgetSession as q,onSdkToolUseEnd as mt,onSdkToolUseStart as ft}from"../services/sdk-tool-file-change-recorder.js";import{findPersistedSessionByAgentId as pt,removePersistedSession as F,savePersistedSessions as gt,updatePersistedSessionAutoCommands as yt,updatePersistedSessionRuntimeState as ht,upsertPersistedSession as It}from"../services/terminal-persistence.js";import{getInstanceAiConfigDebugLogger as St}from"../utils/instance-ai-config-debug-logger.js";import{logger as h}from"../utils/logger.js";const A=Qe();function Pe(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 p=new Map,At=45e3,ne=new Map;function Tt(e){if(ne.has(e))return;const n=setInterval(()=>{const t=p.get(e);if(!t){L(e);return}const o=t.currentRuntimeStatus;if(o!=="thinking"&&o!=="tool_using"&&o!=="compacting"){L(e);return}_(t.agentId,e,o,void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl}).catch(()=>{})},At);ne.set(e,n)}function L(e){const n=ne.get(e);n&&(clearInterval(n),ne.delete(e))}const Ee=4e3,kt=`
1
+ import{spawn as Xe}from"node:child_process";import{promises as N}from"node:fs";import Qe from"node:os";import j from"node:path";import{TextDecoder as ee}from"node:util";import{Router as Ve}from"express";import{v4 as Ge}from"uuid";import be from"axios";import{adapterRegistry as w,getToolActionInfo as ye,isTransientClipboardPasteFilePath as Ce,redactTransientClipboardPastePaths as v,registerSdkProviders as Je,resolveSdkProviderIdByCommand as Ye}from"../adapter/index.js";import{validateToken as S}from"../middleware/auth.js";import{getActiveBridgeHttpPort as Ze,getAcodeDataHome as _e}from"../config.js";import{getAgentProcessManager as he}from"../services/agent-process-manager.js";import{setAgentFeatures as et,getAgentFeatures as tt,isFeatureEnabled as $e,LAUNCH_ITEM_FEATURE_KEY as nt,HIRE_FEATURE_KEY as ot}from"../services/instance-features.js";import{setPanelEnvVars as rt}from"../services/panel-env.js";import{setChangeCacheRetentionDays as st}from"../services/change-cache-retention.js";import{getAiConfigService as it}from"../services/cc-switch-sdk.js";import{prepareAcodeInstanceConfig as at,redactForLog as te}from"../services/instance-ai-config-service.js";import{enqueueMcpLaunchBinding as ct}from"../services/mcp-launch-binding-queue.js";import{resolveSchedulerBaseUrlFromToken as De}from"../services/auto-register.js";import{findClaudeCodeProcesses as ut,isProcessRunning as dt}from"../services/process-detector.js";import{bridgeEventBuffer as Re,sendOutput as X,sendQuestionRequest as lt,sendStatus as _}from"../services/session-output.js";import{getAllPushStats as mt,startHeartbeatScheduler as ft}from"../services/event-delta-pusher.js";import{forgetSession as q,onSdkToolUseEnd as pt,onSdkToolUseStart as gt}from"../services/sdk-tool-file-change-recorder.js";import{findPersistedSessionByAgentId as yt,removePersistedSession as F,savePersistedSessions as ht,updatePersistedSessionAutoCommands as It,updatePersistedSessionRuntimeState as St,upsertPersistedSession as At}from"../services/terminal-persistence.js";import{getInstanceAiConfigDebugLogger as Tt}from"../utils/instance-ai-config-debug-logger.js";import{logger as h}from"../utils/logger.js";const A=Ve();function Pe(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 p=new Map,kt=45e3,ne=new Map;function wt(e){if(ne.has(e))return;const n=setInterval(()=>{const t=p.get(e);if(!t){L(e);return}const o=t.currentRuntimeStatus;if(o!=="thinking"&&o!=="tool_using"&&o!=="compacting"){L(e);return}_(t.agentId,e,o,void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl}).catch(()=>{})},kt);ne.set(e,n)}function L(e){const n=ne.get(e);n&&(clearInterval(n),ne.delete(e))}const Ee=4e3,bt=`
2
2
 
3
3
  \u8BF7\u6C42\u4F53:
4
- `;function Ie(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 wt=`
4
+ `;function Ie(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 Ct=`
5
5
 
6
6
  \u8BF7\u6C42\u5934:
7
- `,K=new Set;async function bt(e,n){const t=[],o=[],r=j.join(e,".agentswork","memory");try{const c=(await N.readdir(r)).filter(u=>u.endsWith(".json")),d=await Promise.all(c.map(async u=>{try{const l=await N.readFile(j.join(r,u),"utf-8");return JSON.parse(l)}catch{return h.warn("[loadAgentStartupMemories] Failed to parse memory file: %s",j.join(r,u)),null}}));for(const u of d)if(u?.by_uri)for(const l of Object.values(u.by_uri)){const m=l.memory_type||"memory",f=(l.content||"").trim();f&&(m==="recently_memory"?t.push({title:l.title,content:f,uri:l.uri||""}):m==="agent_memory"&&o.push({title:l.title,content:f,uri:l.uri||""}))}}catch{h.debug("[loadAgentStartupMemories] \u65E0\u6CD5\u8BFB\u53D6\u8BB0\u5FC6\u76EE\u5F55: %s",r)}if(t.length===0&&o.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}`},d=["recently_memory","agent_memory"],u=await Promise.allSettled(d.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<u.length;l++){const m=u[l];if(m.status!=="fulfilled")continue;const f=m.value;if(!Array.isArray(f))continue;const T=d[l]==="recently_memory"?t:o;for(const y of f){const g=(y.content||"").trim();g&&T.push({title:y.title,content:g,uri:y.uri||""})}}(t.length>0||o.length>0)&&h.info(`[loadAgentStartupMemories] Loaded ${t.length} task(s) and ${o.length} memory(s) from server for ${n.agentId}`)}const s=10;t.sort((a,c)=>c.uri.localeCompare(a.uri)),o.sort((a,c)=>c.uri.localeCompare(a.uri));const i=[];if(t.length>0){const c=t.slice(0,s).map((d,u)=>`${d.title?`\u3010${d.title}\u3011`:`\u6761\u76EE ${u+1}`}
7
+ `,K=new Set;async function _t(e,n){const t=[],o=[],r=j.join(e,".agentswork","memory");try{const c=(await N.readdir(r)).filter(u=>u.endsWith(".json")),d=await Promise.all(c.map(async u=>{try{const l=await N.readFile(j.join(r,u),"utf-8");return JSON.parse(l)}catch{return h.warn("[loadAgentStartupMemories] Failed to parse memory file: %s",j.join(r,u)),null}}));for(const u of d)if(u?.by_uri)for(const l of Object.values(u.by_uri)){const m=l.memory_type||"memory",f=(l.content||"").trim();f&&(m==="recently_memory"?t.push({title:l.title,content:f,uri:l.uri||""}):m==="agent_memory"&&o.push({title:l.title,content:f,uri:l.uri||""}))}}catch{h.debug("[loadAgentStartupMemories] \u65E0\u6CD5\u8BFB\u53D6\u8BB0\u5FC6\u76EE\u5F55: %s",r)}if(t.length===0&&o.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}`},d=["recently_memory","agent_memory"],u=await Promise.allSettled(d.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<u.length;l++){const m=u[l];if(m.status!=="fulfilled")continue;const f=m.value;if(!Array.isArray(f))continue;const T=d[l]==="recently_memory"?t:o;for(const y of f){const g=(y.content||"").trim();g&&T.push({title:y.title,content:g,uri:y.uri||""})}}(t.length>0||o.length>0)&&h.info(`[loadAgentStartupMemories] Loaded ${t.length} task(s) and ${o.length} memory(s) from server for ${n.agentId}`)}const s=10;t.sort((a,c)=>c.uri.localeCompare(a.uri)),o.sort((a,c)=>c.uri.localeCompare(a.uri));const i=[];if(t.length>0){const c=t.slice(0,s).map((d,u)=>`${d.title?`\u3010${d.title}\u3011`:`\u6761\u76EE ${u+1}`}
8
8
  ${d.content}`);i.push(`\u3010\u77ED\u671F\u8BB0\u5FC6\u3011
9
9
  ${c.join(`
10
10
 
@@ -14,23 +14,23 @@ ${c.join(`
14
14
 
15
15
  `)}`),o.length>s&&i.push(`... \u53CA\u53E6\u5916 ${o.length-s} \u6761 agent \u8BA4\u77E5`)}if(i.length!==0)return i.join(`
16
16
 
17
- `)}function Ct(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 _t(e){return e!=="acode"}function $t(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 oe(e){const n=e?.usage;if(!n)return;const t=Number.isFinite(n.inputTokens)?n.inputTokens:0,o=Number.isFinite(n.outputTokens)?n.outputTokens:0;if(t<=0&&o<=0&&!n.contextLimit&&!n.maxOutput&&!n.inputLimit&&!n.compactionThreshold)return;const r={inputTokens:t,outputTokens:o,...n.contextLimit?{contextLimit:n.contextLimit}:{},...n.maxOutput?{maxOutput:n.maxOutput}:{},...n.inputLimit?{inputLimit:n.inputLimit}:{},...n.compactionThreshold?{compactionThreshold:n.compactionThreshold}:{},...n.cacheHitTokens?{cacheHitTokens:n.cacheHitTokens}:{},...n.cacheMissTokens?{cacheMissTokens:n.cacheMissTokens}:{}};return process.env.ACODE_TOKEN_DEBUG==="1"&&(r.inputTokens>0||r.outputTokens>0||r.cacheHitTokens!==void 0||r.cacheMissTokens!==void 0)&&console.log(`[TokenDebug][Terminal] resolveStatusChangeUsage: input=${r.inputTokens} output=${r.outputTokens} cacheHit=${r.cacheHitTokens??"(none)"} cacheMiss=${r.cacheMissTokens??"(none)"} actionType=${e?.actionType??"(none)"}`),r}function Dt(e,n){const t=String(e||"").trim().toLowerCase(),o=String(n?.actionType||"").trim().toLowerCase();return t==="tool_using"&&o==="idle"?n?{status:"waiting_input",actionInfo:n}:{status:"waiting_input"}:n?{status:e,actionInfo:n}:{status:e}}const Q=new Map,Rt="utf-8",Me="utf-8",Le=300,xe=6e4;function V(e){return String(e).padStart(2,"0")}function Pt(e,n=new Date){const t=n.getFullYear(),o=V(n.getMonth()+1),r=V(n.getDate()),s=V(n.getHours()),i=V(n.getMinutes()),a=`${t}${o}${r}-${s}${i}${V(n.getSeconds())}-${String(n.getMilliseconds()).padStart(3,"0")}`;return j.join(be.homedir(),".acode","cmd-dist",e,`${t}-${o}-${r}`,s,i,`${a}-cmd.out`)}function Et(e){if(!e)return 0;const n=e.replace(/\r\n/g,`
17
+ `)}function $t(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 Dt(e){return e!=="acode"}function Rt(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 oe(e){const n=e?.usage;if(!n)return;const t=Number.isFinite(n.inputTokens)?n.inputTokens:0,o=Number.isFinite(n.outputTokens)?n.outputTokens:0;if(t<=0&&o<=0&&!n.contextLimit&&!n.maxOutput&&!n.inputLimit&&!n.compactionThreshold)return;const r={inputTokens:t,outputTokens:o,...n.contextLimit?{contextLimit:n.contextLimit}:{},...n.maxOutput?{maxOutput:n.maxOutput}:{},...n.inputLimit?{inputLimit:n.inputLimit}:{},...n.compactionThreshold?{compactionThreshold:n.compactionThreshold}:{},...n.cacheHitTokens?{cacheHitTokens:n.cacheHitTokens}:{},...n.cacheMissTokens?{cacheMissTokens:n.cacheMissTokens}:{}};return process.env.ACODE_TOKEN_DEBUG==="1"&&(r.inputTokens>0||r.outputTokens>0||r.cacheHitTokens!==void 0||r.cacheMissTokens!==void 0)&&console.log(`[TokenDebug][Terminal] resolveStatusChangeUsage: input=${r.inputTokens} output=${r.outputTokens} cacheHit=${r.cacheHitTokens??"(none)"} cacheMiss=${r.cacheMissTokens??"(none)"} actionType=${e?.actionType??"(none)"}`),r}function Pt(e,n){const t=String(e||"").trim().toLowerCase(),o=String(n?.actionType||"").trim().toLowerCase();return t==="tool_using"&&o==="idle"?n?{status:"waiting_input",actionInfo:n}:{status:"waiting_input"}:n?{status:e,actionInfo:n}:{status:e}}const Q=new Map,Et="utf-8",Me="utf-8",Le=300,xe=6e4;function V(e){return String(e).padStart(2,"0")}function Mt(e,n=new Date){const t=n.getFullYear(),o=V(n.getMonth()+1),r=V(n.getDate()),s=V(n.getHours()),i=V(n.getMinutes()),a=`${t}${o}${r}-${s}${i}${V(n.getSeconds())}-${String(n.getMilliseconds()).padStart(3,"0")}`;return j.join(_e(),"cmd-dist",e,`${t}-${o}-${r}`,s,i,`${a}-cmd.out`)}function Lt(e){if(!e)return 0;const n=e.replace(/\r\n/g,`
18
18
  `).replace(/\r/g,`
19
19
  `),t=n.endsWith(`
20
20
  `)?n.slice(0,-1):n;return t?t.split(`
21
- `).length:1}function Mt(e,n=Le){return`\r
21
+ `).length:1}function xt(e,n=Le){return`\r
22
22
  [ACode] \u547D\u4EE4\u8F93\u51FA\u8D85\u8FC7 ${n} \u884C\uFF0C\u5B8C\u6574\u8F93\u51FA\u5DF2\u5199\u5165: ${e}\r
23
23
  [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
24
- `}function Lt(e=xe){return`\r
24
+ `}function Ut(e=xe){return`\r
25
25
  [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
26
- `}async function Ue(e){const n=e.outputPath||Pt(e.agentId,e.startedAt);return e.outputPath=n,await N.mkdir(j.dirname(n),{recursive:!0}),await N.writeFile(n,e.chunks.join(""),"utf-8"),n}function xt(e){return String(e??"").replace(/\r/g,`
27
- `).trim()}function Ut(e=process.platform,n=process.env){const t=n.AWS_TERMINAL_OUTPUT_ENCODING?.trim();return t||(e==="win32"?Rt:Me)}function je(e=Ut()){if(e!=="utf-8")try{return new ee(e,{fatal:!1})}catch{return new ee(Me,{fatal:!1})}return jt()}function jt(){let e=null,n=null,t=null;const o=[];function r(s){try{return new ee(s,{fatal:!1})}catch{return new ee("utf-8",{fatal:!1})}}return{decode(s,i){if(s!=null&&o.push(s instanceof ArrayBuffer?Buffer.from(s):Buffer.isBuffer(s)?s:Buffer.from(s.buffer,s.byteOffset,s.byteLength)),t==="gb18030")return n||(n=r("gb18030")),n.decode(s,i);e||(e=r("utf-8"));const a=e.decode(s,i);if(t===null&&a.includes("\uFFFD")){t="gb18030",n=r("gb18030");const c=Buffer.concat(o);return n.decode(c)}return t===null&&!i?.stream&&(t="utf-8"),a}}}function re(e,n,t=!1){return t?e.decode():!n||n.length===0?"":e.decode(n,{stream:!0})}function Bt(e){const n=e.trim().match(/^cd(?:\s+(.*))?$/i);if(!n)return;const t=n[1]?.trim();if(!t)return null;const o=t.replace(/^\/d\s+/i,"").trim();return o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'")?o.slice(1,-1):o}function Ot(e){const n=Q.get(e.sessionId);if(n)return n;const t={currentDirectory:e.workspacePath,runningProcess:null};return Q.set(e.sessionId,t),t}function Be(e){for(const n of p.values())if(n.agentId===e)return n}async function Nt(e){const n=w.get(e.providerId||"claude-code"),t=se(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 se(e,n,t){const o=String(e||"").trim();if(o){const s=String(n||"").trim(),i=String(t||"").trim().toLowerCase();return o.toLowerCase()==="tool_using"&&s.toLowerCase()==="waiting_input"&&i==="idle"?s:o}return String(n||"").trim()||"running"}function vt(e,n=ct){return e.pid?n(e.pid)?Ke(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 Gn(e){const n=Be(e);if(!n)h.info(`[cleanupSdkSessionByAgentId] No active SDK session found for agentId=${e}, cleaning residual state anyway`);else{const t=n.sessionId;return h.info(`[cleanupSdkSessionByAgentId] Cleaning up SDK session for agentId=${e}, sessionId=${t}`),L(t),p.delete(t),q(t),ie(t),F(t).catch(o=>{h.warn(`[cleanupSdkSessionByAgentId] Failed to remove persisted session for agentId=${e}: ${o}`)}),t}K.has(e)&&(K.delete(e),h.info(`[cleanupSdkSessionByAgentId] Released startingAgents lock for agentId=${e}`))}function ie(e){const n=Q.get(e);if(!n?.runningProcess){Q.delete(e);return}try{n.runningProcess.kill()}catch{}finally{n.runningProcess=null,Q.delete(e)}}function b(e,n){n&&(e.seq+=1,X(e.agentId,n,e.sessionId,e.seq,void 0,{runtimeAccessToken:e.runtimeAccessToken,schedulerBaseUrl:e.schedulerBaseUrl}).catch(()=>{}))}function Se(e){return`\x1B[36m${e}>\x1B[0m `}function qt(e,n){return n==="~"?be.homedir():j.resolve(e,n)}async function Ft(e,n,t){const o=Bt(t);if(o===void 0)return!1;if(o===null)return b(e,`${n.currentDirectory}\r
28
- `),!0;const r=qt(n.currentDirectory,o);try{return(await N.stat(r)).isDirectory()?(n.currentDirectory=r,b(e,`${n.currentDirectory}\r
26
+ `}async function Ue(e){const n=e.outputPath||Mt(e.agentId,e.startedAt);return e.outputPath=n,await N.mkdir(j.dirname(n),{recursive:!0}),await N.writeFile(n,e.chunks.join(""),"utf-8"),n}function jt(e){return String(e??"").replace(/\r/g,`
27
+ `).trim()}function Bt(e=process.platform,n=process.env){const t=n.AWS_TERMINAL_OUTPUT_ENCODING?.trim();return t||(e==="win32"?Et:Me)}function je(e=Bt()){if(e!=="utf-8")try{return new ee(e,{fatal:!1})}catch{return new ee(Me,{fatal:!1})}return Ot()}function Ot(){let e=null,n=null,t=null;const o=[];function r(s){try{return new ee(s,{fatal:!1})}catch{return new ee("utf-8",{fatal:!1})}}return{decode(s,i){if(s!=null&&o.push(s instanceof ArrayBuffer?Buffer.from(s):Buffer.isBuffer(s)?s:Buffer.from(s.buffer,s.byteOffset,s.byteLength)),t==="gb18030")return n||(n=r("gb18030")),n.decode(s,i);e||(e=r("utf-8"));const a=e.decode(s,i);if(t===null&&a.includes("\uFFFD")){t="gb18030",n=r("gb18030");const c=Buffer.concat(o);return n.decode(c)}return t===null&&!i?.stream&&(t="utf-8"),a}}}function re(e,n,t=!1){return t?e.decode():!n||n.length===0?"":e.decode(n,{stream:!0})}function Nt(e){const n=e.trim().match(/^cd(?:\s+(.*))?$/i);if(!n)return;const t=n[1]?.trim();if(!t)return null;const o=t.replace(/^\/d\s+/i,"").trim();return o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'")?o.slice(1,-1):o}function vt(e){const n=Q.get(e.sessionId);if(n)return n;const t={currentDirectory:e.workspacePath,runningProcess:null};return Q.set(e.sessionId,t),t}function Be(e){for(const n of p.values())if(n.agentId===e)return n}async function qt(e){const n=w.get(e.providerId||"claude-code"),t=se(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 se(e,n,t){const o=String(e||"").trim();if(o){const s=String(n||"").trim(),i=String(t||"").trim().toLowerCase();return o.toLowerCase()==="tool_using"&&s.toLowerCase()==="waiting_input"&&i==="idle"?s:o}return String(n||"").trim()||"running"}function Ft(e,n=dt){return e.pid?n(e.pid)?Ke(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 Zn(e){const n=Be(e);if(!n)h.info(`[cleanupSdkSessionByAgentId] No active SDK session found for agentId=${e}, cleaning residual state anyway`);else{const t=n.sessionId;return h.info(`[cleanupSdkSessionByAgentId] Cleaning up SDK session for agentId=${e}, sessionId=${t}`),L(t),p.delete(t),q(t),ie(t),F(t).catch(o=>{h.warn(`[cleanupSdkSessionByAgentId] Failed to remove persisted session for agentId=${e}: ${o}`)}),t}K.has(e)&&(K.delete(e),h.info(`[cleanupSdkSessionByAgentId] Released startingAgents lock for agentId=${e}`))}function ie(e){const n=Q.get(e);if(!n?.runningProcess){Q.delete(e);return}try{n.runningProcess.kill()}catch{}finally{n.runningProcess=null,Q.delete(e)}}function b(e,n){n&&(e.seq+=1,X(e.agentId,n,e.sessionId,e.seq,void 0,{runtimeAccessToken:e.runtimeAccessToken,schedulerBaseUrl:e.schedulerBaseUrl}).catch(()=>{}))}function Se(e){return`\x1B[36m${e}>\x1B[0m `}function Kt(e,n){return n==="~"?Qe.homedir():j.resolve(e,n)}async function zt(e,n,t){const o=Nt(t);if(o===void 0)return!1;if(o===null)return b(e,`${n.currentDirectory}\r
28
+ `),!0;const r=Kt(n.currentDirectory,o);try{return(await N.stat(r)).isDirectory()?(n.currentDirectory=r,b(e,`${n.currentDirectory}\r
29
29
  `),!0):(b(e,`cd: not a directory: ${r}\r
30
30
  `),!0)}catch(s){const i=s instanceof Error?s.message:String(s);return b(e,`cd: ${i}\r
31
- `),!0}}async function Kt(e,n){const t=p.get(e);if(!t)throw new Error("SDK session not found");const o=xt(n),r=Ot(t);if(!o)return{started:!1,cwd:r.currentDirectory};if(r.runningProcess)throw new Error("A terminal command is already running for this session");const s=v(o);if(b(t,`${Se(r.currentDirectory)}${s}\r
32
- `),_e(o))return b(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
33
- `),b(t,Se(r.currentDirectory)),{started:!1,cwd:r.currentDirectory};if(await Ft(t,r,o))return{started:!1,cwd:r.currentDirectory};await _(t.agentId,e,"tool_using",{actionType:"bash",actionLabel:"\u7EC8\u7AEF\u547D\u4EE4",actionDetail:s},void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl});const a=Xe(o,{cwd:r.currentDirectory,shell:!0,env:Oe(t.agentId,t.workspacePath,process.env,t.config.envOverrides)});r.runningProcess=a;const c=je(),d=je(),u=t.providerId==="acode",l={agentId:t.agentId,startedAt:new Date,chunks:[],spilled:!1};let m;const f=()=>{m&&(clearTimeout(m),m=void 0)},T=()=>{f(),m=setTimeout(()=>{r.runningProcess===a&&(b(t,Lt()),a.kill())},xe)},y=(g,C=!0)=>{if(g&&(u&&l.chunks.push(g),u&&C&&T(),!(u&&l.spilled))){if(u&&Et(l.chunks.join(""))>Le){l.spilled=!0,Ue(l).then($=>{b(t,Mt($))}).catch($=>{const M=$ instanceof Error?$.message:String($);b(t,`\r
31
+ `),!0}}async function Ht(e,n){const t=p.get(e);if(!t)throw new Error("SDK session not found");const o=jt(n),r=vt(t);if(!o)return{started:!1,cwd:r.currentDirectory};if(r.runningProcess)throw new Error("A terminal command is already running for this session");const s=v(o);if(b(t,`${Se(r.currentDirectory)}${s}\r
32
+ `),Ce(o))return b(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
33
+ `),b(t,Se(r.currentDirectory)),{started:!1,cwd:r.currentDirectory};if(await zt(t,r,o))return{started:!1,cwd:r.currentDirectory};await _(t.agentId,e,"tool_using",{actionType:"bash",actionLabel:"\u7EC8\u7AEF\u547D\u4EE4",actionDetail:s},void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl});const a=Xe(o,{cwd:r.currentDirectory,shell:!0,env:Oe(t.agentId,t.workspacePath,process.env,t.config.envOverrides)});r.runningProcess=a;const c=je(),d=je(),u=t.providerId==="acode",l={agentId:t.agentId,startedAt:new Date,chunks:[],spilled:!1};let m;const f=()=>{m&&(clearTimeout(m),m=void 0)},T=()=>{f(),m=setTimeout(()=>{r.runningProcess===a&&(b(t,Ut()),a.kill())},xe)},y=(g,C=!0)=>{if(g&&(u&&l.chunks.push(g),u&&C&&T(),!(u&&l.spilled))){if(u&&Lt(l.chunks.join(""))>Le){l.spilled=!0,Ue(l).then($=>{b(t,xt($))}).catch($=>{const M=$ instanceof Error?$.message:String($);b(t,`\r
34
34
  [ACode] \u547D\u4EE4\u8F93\u51FA\u843D\u76D8\u5931\u8D25: ${M}\r
35
35
  `)});return}b(t,g)}};return u&&T(),a.stdout.on("data",g=>{y(re(c,g))}),a.stderr.on("data",g=>{y(re(d,g))}),a.on("error",g=>{b(t,`\r
36
36
  [Terminal Error] ${g.message}\r
@@ -40,15 +40,15 @@ ${c.join(`
40
40
  [exit ${g}]\r
41
41
  `):C&&b(t,`\r
42
42
  [signal ${C}]\r
43
- `),b(t,Se(r.currentDirectory)),_(t.agentId,e,"waiting_input",void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl})}),{started:!0,cwd:r.currentDirectory}}function Oe(e,n,t,o){const r={};for(const[s,i]of Object.entries(t))i!==void 0&&(r[s]=i);if(n&&(r.AWS_WORKSPACE_PATH=String(n)),o)for(const[s,i]of Object.entries(o)){const a=s.trim();if(!a||i===void 0||i===null)continue;const c=String(i).trim();c&&(r[a]=c)}return r.AWS_AGENT_ID=String(e),r.AWS_MCP_CLAIM_LAUNCH_BINDING="true",$e(e,et)&&(r.AWS_LAUNCH_CONFIG_TOOLS="1"),$e(e,tt)&&(r.AWS_HIRE_TOOLS="1"),r}function zt(e){const n=e.trim(),t=n[0],o=n[n.length-1];return(t==='"'||t==="'")&&t===o?n.slice(1,-1):n}async function Ht(e){const n=String(e);if(!_e(n))return n;const t=zt(n);return j.isAbsolute(t)?N.readFile(t,"utf-8"):n}function Ne(e,n){const t={};for(const r of[e?.env,n])if(r)for(const[s,i]of Object.entries(r)){const a=s.trim();if(!a||i===void 0||i===null)continue;const c=String(i).trim();c&&(t[a]=c)}const o=t.ANTHROPIC_MODEL?.trim()||t.CODEX_MODEL?.trim()||void 0;return{envOverrides:t,model:o}}async function Wt(){try{return await rt().readClaudeCodeConfig()}catch(e){return console.warn(`[Runtime] Failed to read saved ClaudeCode AI config: ${e.message}`),{}}}function Xt(e){if(e==null)return;const t=(typeof e=="string"?e:JSON.stringify(e,null,2)).trim();if(t)return t.length<=Ee?t:`${t.slice(0,Ee)}
44
- ...\uFF08\u7ED3\u679C\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`}function Qt(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 Vt(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 Gt(e){if(e.type!=="tool_use_end")return;const n=Xt(e.data.toolResult??e.data.actionResult);if(!n)return;const t=ye(e.data.toolName,e.data.toolInput),o=e.data.actionType||t.actionType;if(o==="idle"){const r=String(e.data.rawToolName||e.data.toolName||"").toLowerCase();if((r.includes("poll_message")||r.includes("get_message"))&&!Qt(n))return}return o==="mcp"&&Vt(e)?{actionType:"mcp",actionLabel:"MCP\u8FD4\u56DE",actionDetail:e.data.actionDetail||e.data.toolName,actionId:e.data.actionId||e.data.toolUseId,actionResult:n}:{actionType:o,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:e.data.actionDetail||t.actionDetail||e.data.toolName,actionId:e.data.actionId||e.data.toolUseId,actionResult:n}}function Jt(e){if(e.type==="ai_request"){const n=e.data.model?` ${e.data.model}`:"",t=e.data.lastUserMessagePreview?`\uFF1A${e.data.lastUserMessagePreview}`:"";return`\r
43
+ `),b(t,Se(r.currentDirectory)),_(t.agentId,e,"waiting_input",void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl})}),{started:!0,cwd:r.currentDirectory}}function Oe(e,n,t,o){const r={};for(const[s,i]of Object.entries(t))i!==void 0&&(r[s]=i);if(n&&(r.AWS_WORKSPACE_PATH=String(n)),o)for(const[s,i]of Object.entries(o)){const a=s.trim();if(!a||i===void 0||i===null)continue;const c=String(i).trim();c&&(r[a]=c)}return r.AWS_AGENT_ID=String(e),r.AWS_MCP_CLAIM_LAUNCH_BINDING="true",r.AWS_RUNTIME_BRIDGE_BASE_URL=`http://127.0.0.1:${Ze()}`,String(r.ACODE_HOME||"").trim()||(r.ACODE_HOME=_e()),$e(e,nt)&&(r.AWS_LAUNCH_CONFIG_TOOLS="1"),$e(e,ot)&&(r.AWS_HIRE_TOOLS="1"),r}function Wt(e){const n=e.trim(),t=n[0],o=n[n.length-1];return(t==='"'||t==="'")&&t===o?n.slice(1,-1):n}async function Xt(e){const n=String(e);if(!Ce(n))return n;const t=Wt(n);return j.isAbsolute(t)?N.readFile(t,"utf-8"):n}function Ne(e,n){const t={};for(const r of[e?.env,n])if(r)for(const[s,i]of Object.entries(r)){const a=s.trim();if(!a||i===void 0||i===null)continue;const c=String(i).trim();c&&(t[a]=c)}const o=t.ANTHROPIC_MODEL?.trim()||t.CODEX_MODEL?.trim()||void 0;return{envOverrides:t,model:o}}async function Qt(){try{return await it().readClaudeCodeConfig()}catch(e){return console.warn(`[Runtime] Failed to read saved ClaudeCode AI config: ${e.message}`),{}}}function Vt(e){if(e==null)return;const t=(typeof e=="string"?e:JSON.stringify(e,null,2)).trim();if(t)return t.length<=Ee?t:`${t.slice(0,Ee)}
44
+ ...\uFF08\u7ED3\u679C\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`}function Gt(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 Jt(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 Yt(e){if(e.type!=="tool_use_end")return;const n=Vt(e.data.toolResult??e.data.actionResult);if(!n)return;const t=ye(e.data.toolName,e.data.toolInput),o=e.data.actionType||t.actionType;if(o==="idle"){const r=String(e.data.rawToolName||e.data.toolName||"").toLowerCase();if((r.includes("poll_message")||r.includes("get_message"))&&!Gt(n))return}return o==="mcp"&&Jt(e)?{actionType:"mcp",actionLabel:"MCP\u8FD4\u56DE",actionDetail:e.data.actionDetail||e.data.toolName,actionId:e.data.actionId||e.data.toolUseId,actionResult:n}:{actionType:o,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:e.data.actionDetail||t.actionDetail||e.data.toolName,actionId:e.data.actionId||e.data.toolUseId,actionResult:n}}function Zt(e){if(e.type==="ai_request"){const n=e.data.model?` ${e.data.model}`:"",t=e.data.lastUserMessagePreview?`\uFF1A${e.data.lastUserMessagePreview}`:"";return`\r
45
45
  [ACode] \u6B63\u5728\u8BF7\u6C42\u6A21\u578B${n}${t}\r
46
46
  `}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
47
47
  [SDK Error] ${e.data.text}\r
48
- `:void 0}function Yt(e){const n=tn(e);return{sourceEventType:e.type,logCategory:"acode",...en(e),...n?{logLevel:Zt(e),logMessage:n}:{}}}function Zt(e){return e.type==="error"?"error":e.type==="command_output"&&e.data.stream==="stderr"?"warn":"info"}function en(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 tn(e){if(e.type==="ai_request"){const n=e.data.model||"unknown-model",t=e.data.endpoint?` @ ${e.data.endpoint}`:"",o=typeof e.data.toolCount=="number"?`, tools=${e.data.toolCount}`:"";return`AI request started: ${n}${t}${o}`}if(e.type==="tool_use_start")return ve(e,"\u5F00\u59CB");if(e.type==="tool_use_end")return ve(e,"\u5B8C\u6210");if(e.type==="command_output")return rn(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 nn=/\x1b\[[0-9;?]*[a-zA-Z]/g;function on(e){return e.replace(nn,"")}function rn(e){const n=typeof e.data.stream=="string"?e.data.stream:"mixed",t=typeof e.data.sequence=="number"?` #${e.data.sequence}`:"",o=on(String(e.data.text||"")).replace(/\s+/g," ").trim(),r=o.length>240?`${o.slice(0,240)}...`:o;return`\u547D\u4EE4\u8F93\u51FA(${n}${t}): ${r||"(empty)"}`}function ve(e,n){const t=ye(e.data.toolName,e.data.toolInput),o=e.data.actionLabel||t.actionLabel||"\u8C03\u7528\u5DE5\u5177",r=qe(e,t);return r?`${n}${o}: ${r}`:`${n}${o}: ${e.data.actionDetail||e.data.toolName||"tool"}`}function qe(e,n){const t=e.data.toolInput;return n.actionType==="bash"?sn(t)||e.data.actionDetail||n.actionDetail:n.actionType==="read_file"||n.actionType==="edit_file"||n.actionType==="write_file"?an(t)||e.data.actionDetail||n.actionDetail:e.data.actionDetail||n.actionDetail}function sn(e){const n=Ae(e?.command,e?.cmd);if(n)return n;if(Array.isArray(e?.argv)){const t=e.argv.map(o=>String(o??"").trim()).filter(Boolean).join(" ");return t?v(t):void 0}return Ae(e?.args)}function an(e){const n=Fe(e?.paths);return n.length>0?n.length===1?n[0]:`${n.length}\u4E2A\u6587\u4EF6: ${n.join(", ")}`:Ae(e?.file_path,e?.filePath,e?.path,e?.target_file,e?.targetFile)}function Ae(...e){for(const n of e){if(typeof n=="string"&&n.trim())return v(n.trim());if(Array.isArray(n)){const t=Fe(n)[0];if(t)return t}}}function Fe(e){return Array.isArray(e)?e.map(n=>typeof n=="string"?n.trim():"").filter(Boolean).map(n=>v(n)):[]}function cn(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)}
49
- ...\uFF08\u8F93\u5165\u53C2\u6570\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`:n}catch{return}}function un(e){const n=[e.model?`\u6A21\u578B: ${e.model}`:void 0,e.endpoint||e.requestUrl?`\u63A5\u53E3: ${e.endpoint||e.requestUrl}`:void 0,e.requestMethod?`\u65B9\u6CD5: ${e.requestMethod}`:void 0,typeof e.stream=="boolean"?`\u6D41\u5F0F: ${e.stream?"\u662F":"\u5426"}`:void 0,typeof e.messageCount=="number"?`\u4E0A\u4E0B\u6587\u6D88\u606F: ${e.messageCount}`:void 0,typeof e.toolCount=="number"?`\u53EF\u7528\u5DE5\u5177: ${e.toolCount}`:void 0,e.lastUserMessagePreview?`\u6700\u540E\u8BF7\u6C42: ${e.lastUserMessagePreview}`:void 0].filter(i=>!!i),t=dn(e.requestHeaders),o=n.join(`
50
- `)||"ACode \u6B63\u5728\u53D1\u9001 AI \u8BF7\u6C42",r=t.length>0?`${wt}${t.join(`
51
- `)}`:"",s=e.requestBody?`${kt}${e.requestBody}`:"";return`${o}${r}${s}`}function dn(e){return e?Object.entries(e).map(([n,t])=>`${n}: ${t}`).filter(n=>n.trim().length>0):[]}function ln(e,n){return String(n||"").trim().toLowerCase()!=="waiting_input"?!1:e.type==="thinking"||e.type==="text_delta"}function mn(e){for(const n of["estimatedContextTokens","contextTokens","context_tokens","contextUsedTokens","context_used_tokens"]){const t=e[n],o=Number(t);if(Number.isFinite(o)&&o>0)return o}}function fn(e,n){if(!ln(e,n)){if(e.type==="ai_request"){const t=mn(e.data);return{status:"thinking",actionInfo:{actionType:"ai_request",actionLabel:"AI\u8BF7\u6C42",actionDetail:un(e.data),...t!==void 0?{usage:{inputTokens:t,outputTokens:0}}:{}}}}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=ye(e.data.toolName,e.data.toolInput),o=qe(e,t),r=cn(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:o||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:r,actionId:e.data.actionId||e.data.toolUseId}}:{status:"tool_using",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:o||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:r,actionId:e.data.actionId||e.data.toolUseId}}}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}}}}const x=new Map,ae=new Map,ce=new Map,G=new Map,pn=20,gn=500,yn=3e4;async function ue(e,n=yn,t=2){for(let o=0;o<=t;o++){const r=new AbortController;let s;try{const i=e(r.signal);i.catch(()=>{}),await Promise.race([i,new Promise((a,c)=>{s=setTimeout(()=>{r.abort(),c(new Error(`sendOutput timeout after ${n}ms`))},n)})]),s&&clearTimeout(s);return}catch(i){s&&clearTimeout(s);const a=i instanceof Error?i.message:String(i);if(o<t){const c=1e3*(o+1);h.warn(`sendOutput attempt ${o+1}/${t+1} failed (${a}), retrying in ${c}ms...`),await new Promise(d=>setTimeout(d,c));continue}h.warn(`sendOutput failed after ${t+1} attempts (${a}), giving up to unblock serial queue`)}}}function de(e,n){const t=n?`${e}:${n}`:void 0;let o,r;if(t)o=G.get(t),r=t;else{const f=[];for(const[T,y]of G)T.startsWith(e+":")&&y.buffer&&f.push(y.sourceEventType);for(const T of f)de(e,T);return}if(!o||!o.buffer)return;o.timer=null;const s=o.buffer,i=o.seq,a=o.entry,c=o.sourceEventType;o.buffer="",r&&G.delete(r);const d={sourceEventType:c,logCategory:"acode"},u={runtimeAccessToken:a.runtimeAccessToken,schedulerBaseUrl:a.schedulerBaseUrl},m=(x.get(e)??Promise.resolve()).then(()=>ue(f=>X(a.agentId,s,e,i,d,u,f)),()=>ue(f=>X(a.agentId,s,e,i,d,u,f)));x.set(e,m),m.finally(()=>{x.get(e)===m&&x.delete(e)})}function hn(e,n){const t=Jt(e);if(!t)return;n.seq+=1;const o=n.seq,r=Yt(e),s={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl};if((e.type==="command_output"||e.type==="text_delta"||e.type==="thinking")&&t.length<pn){const c=`${e.sessionId}:${e.type}`;let d=G.get(c);if(d||(d={buffer:"",seq:0,timer:null,entry:n,sourceEventType:e.type}),d.buffer+=t,d.seq=o,d.entry=n,!d.timer){const u=e.sessionId,l=e.type;d.timer=setTimeout(()=>de(u,l),gn)}G.set(c,d);return}de(e.sessionId);const a=(x.get(e.sessionId)??Promise.resolve()).then(()=>ue(c=>X(n.agentId,t,e.sessionId,o,r,s,c)),()=>ue(c=>X(n.agentId,t,e.sessionId,o,r,s,c)));x.set(e.sessionId,a),a.finally(()=>{x.get(e.sessionId)===a&&x.delete(e.sessionId)})}function Ke(e){return Je(e)}let ze=!1;function In(){ze||(Ge(w,Sn),lt(),ze=!0)}function Sn(e,n){e.on("event",t=>{const o=p.get(t.sessionId);if(o){if(t.type==="tool_use_start"?ft(o.sessionId,t.data.toolUseId||t.data.actionId,t.data.toolInput,t.data.toolName,o.workspacePath):t.type==="tool_use_end"&&mt(t,{sessionId:o.sessionId,agentId:o.agentId,workspacePath:o.workspacePath,providerId:o.providerId}),console.log(`[${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==="runtime_capabilities"&&t.data.actionDetail&&(o.cachedCapabilitiesActionDetail=t.data.actionDetail);const i=fn(t,o.currentRuntimeStatus);i&&_(o.agentId,t.sessionId,i.status,i.actionInfo,oe(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl},t.timestamp?new Date(t.timestamp).getTime():void 0,t.type)}hn(t,o);const s=Gt(t);if(s){const i={runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl},a=t.timestamp?new Date(t.timestamp).getTime():void 0,c=String(t.data?.toolName||"").toLowerCase()==="browser_launch",d=t.type==="tool_use_end"&&String(t.data?.rawToolName||t.data?.toolName||"").toLowerCase().replace(/[_-]/g,"").includes("todowrite");c?(async()=>{for(let l=0;l<3;l++){if(await _(o.agentId,t.sessionId,"tool_result",s,void 0,i,a,t.type)!==void 0)return;l<2&&await new Promise(f=>setTimeout(f,3e3*(l+1)))}})().catch(u=>console.warn("[Runtime] browser_launch sendStatus retry exhausted:",u)):d?(async()=>{for(let l=0;l<3;l++){if(await _(o.agentId,t.sessionId,"tool_result",s,void 0,i,a,t.type)!==void 0)return;l<2&&await new Promise(f=>setTimeout(f,1e3*(l+1)))}})().catch(u=>console.warn("[Runtime] todo_write sendStatus retry exhausted:",u)):_(o.agentId,t.sessionId,"tool_result",s,void 0,i,a,t.type)}}}),e.on("status-change",(t,o,r)=>{const s=p.get(t);if(s){de(t),o==="thinking"||o==="tool_using"||o==="compacting"?Tt(t):L(t);const i=Dt(o,r);s.currentRuntimeStatus=i.status;const a=s.currentRuntimeActionDetail??"",c=a.includes("poll_message")||a.includes("get_message"),u=!(i.actionInfo?.actionType==="ai_request")&&(i.status==="thinking"||i.status==="waiting_input")&&(s.currentRuntimeActionType==="idle"||s.currentRuntimeActionType==="mcp")&&c;(i.actionInfo?.actionType||!u)&&(s.currentRuntimeActionType=i.actionInfo?.actionType,s.currentRuntimeActionLabel=i.actionInfo?.actionLabel,s.currentRuntimeActionDetail=i.actionInfo?.actionDetail,s.currentRuntimeActionInput=i.actionInfo?.actionInput),console.log(`[${n.displayName} Adapter] Status changed: ${i.status} for agent ${s.agentId}`,i.actionInfo||""),ht(t,{runtimeStatus:i.status,runtimeActionType:s.currentRuntimeActionType,runtimeActionLabel:s.currentRuntimeActionLabel,runtimeActionDetail:s.currentRuntimeActionDetail});const l=i.actionInfo?.actionType?i.actionInfo:s.currentRuntimeActionType?{actionType:s.currentRuntimeActionType,actionLabel:s.currentRuntimeActionLabel??"",actionDetail:s.currentRuntimeActionDetail,actionInput:s.currentRuntimeActionInput}:void 0;if(i.status==="compacting"){const f=(ae.get(t)??Promise.resolve()).then(async()=>{for(let y=0;y<=2;y++){if(await _(s.agentId,t,i.status,l,oe(i.actionInfo),{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})!==void 0)return;y<2&&(h.warn(`[${n.displayName}] compaction sendStatus attempt ${y+1} failed (HTTP), retrying in ${1e3*(y+1)}ms...`),await new Promise(C=>setTimeout(C,1e3*(y+1))))}h.warn(`[${n.displayName}] compaction sendStatus failed after 3 attempts, event may be lost`)}).catch(T=>{h.warn(`[${n.displayName}] compaction status chain error:`,T)});ae.set(t,f),f.finally(()=>{ae.get(t)===f&&ae.delete(t)})}else{const m=u&&!i.actionInfo?.actionType;if(l?.actionType==="idle"||s.currentRuntimeActionType==="idle"&&u){const y=(ce.get(t)??Promise.resolve()).then(async()=>{for(let C=0;C<=2;C++){if(await _(s.agentId,t,i.status,m?void 0:l,oe(i.actionInfo),{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})!==void 0)return;C<2&&await new Promise(M=>setTimeout(M,1e3*(C+1)))}h.warn(`[${n.displayName}] idle tool sendStatus failed after 3 attempts, status may be stale (frontend will fall back to timeline tool_use event)`)}).catch(g=>{h.warn(`[${n.displayName}] idle status chain error:`,g)});ce.set(t,y),y.finally(()=>{ce.get(t)===y&&ce.delete(t)})}else _(s.agentId,t,i.status,m?void 0:l,oe(i.actionInfo),{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})}if(i.status==="waiting_input"&&s.cachedCapabilitiesActionDetail){const m=s.cachedCapabilitiesActionDetail;s.cachedCapabilitiesActionDetail=void 0,console.log(`[${n.displayName} Adapter] Re-sending cached runtime_capabilities for agent ${s.agentId} (session stabilized to waiting_input)`),_(s.agentId,t,"waiting_input",{actionType:"runtime_capabilities",actionLabel:"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:m},void 0,{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})}}}),e.on("ask-user-question",t=>{const o=p.get(t.sessionId);o&&(console.log(`[${n.displayName} Adapter] AskUserQuestion for agent ${o.agentId}`),ut(o.agentId,t.sessionId,Array.isArray(t.questions)?t.questions:[],{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl},t.toolCallId))}),e.on("permission-request",t=>{const o=p.get(t.sessionId);if(o){console.log(`[${n.displayName} Adapter] Permission request: ${t.toolName} for agent ${o.agentId}`);const r=t.toolInput?v(JSON.stringify(t.toolInput).slice(0,400)):void 0;_(o.agentId,t.sessionId,"waiting_input",{actionType:"other",actionLabel:"\u6743\u9650\u786E\u8BA4",actionDetail:r||t.toolName},void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})}})}A.post("/start",S,async(e,n)=>{const{agentId:t,workspacePath:o,mode:r="sdk"}=e.body||{};if(!t||!o){n.status(400).json({error:"agentId and workspacePath are required"});return}const s=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||De(Pe(e))||void 0;it({agentId:String(t),workspacePath:String(o),serverUrl:e.body?.serverUrl||s,runtimeAccessToken:e.body?.runtimeAccessToken,userId:e.body?.userId,schedulerBaseUrl:s}),e.body?.runtimeFeatures!=null&&(Ye(String(t),e.body.runtimeFeatures),console.log(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u80FD\u529B\u5F00\u5173: ${JSON.stringify(Ze(String(t)))}`)),e.body?.envVars!=null&&typeof e.body.envVars=="object"&&(nt(e.body.envVars),console.log(`[Runtime] agent ${t} \u4E0B\u53D1\u9762\u677F\u73AF\u5883\u53D8\u91CF: ${Object.keys(e.body.envVars).length} \u9879 \u2192 \u684C\u9762\u5DE5\u5177\u5B50\u8FDB\u7A0B`)),e.body?.changeCacheRetentionDays!==void 0&&(ot(e.body.changeCacheRetentionDays),console.log(`[Runtime] agent ${t} \u4E0B\u53D1\u53D8\u66F4\u7F13\u5B58\u4FDD\u7559\u5929\u6570: ${e.body.changeCacheRetentionDays??"\u4E0D\u6E05\u7406"}`)),r&&r!=="sdk"&&console.warn(`[Runtime] Unsupported runtime mode "${r}" requested for agent ${t}; starting SDK session instead.`),await An(e,n)});async function An(e,n){const{agentId:t,workspacePath:o,command:r,autoAccept:s=!0,initialPrompt:i,systemPrompt:a,globalPrompt:c,rolePrompt:d,memory:u,mcpConfigPath:l,extraMcpServers:m,envOverrides:f,idleInputAutoCommand:T,nonInputAutoCommand:y,model:g,instanceAiConfig:C,subAgentModel:$,subAgentEffort:M,scopeKey:Te,browserAllowPrivate:ke}=e.body||{},z=St();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:C?te(C):null,perAgentModel:g??null}});let D=null;const I=String(t||"").trim(),le=String(e.body?.runtimeAccessToken||"").trim()||void 0,B=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||De(Pe(e))||void 0;B?h.info(`[startSdkSession] \u56DE\u8C03\u76EE\u6807 server: ${B} (agentId=${I})`):h.warn(`[startSdkSession] \u672A\u89E3\u6790\u5230 schedulerBaseUrl\uFF0C\u5C06\u56DE\u9000\u5230\u9ED8\u8BA4\u5730\u5740 (agentId=${I})`);try{if(In(),!I){n.status(400).json({error:"agentId is required"});return}const O=Be(I);if(O){n.json(await Nt(O));return}const k=await pt(I);if(k){const R=vt(k);if(!R.reusable)console.warn(`[Runtime] Ignoring stale persisted SDK session for agentId=${I}, sessionId=${k.sessionId}, reason=${R.reason}`),await F(k.sessionId);else{const P=se(k.runtimeStatus,k.runtimeStatus,k.runtimeActionType);n.json({sessionId:k.sessionId,status:P,runtimeStatus:P,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(K.has(I)){n.status(409).json({error:"SDK session is already starting for this agent"});return}K.add(I);const bn=(r||"acode").toLowerCase(),E=Ke(r),He=w.get(E);D=Ve();const We=E==="claude-code"?await Wt():null,J=Ne(E==="claude-code"?We:null,f),H=E==="acode"?g?String(g).trim():void 0:(()=>{const R=g?String(g).trim():void 0,P=J.model?String(J.model).trim():void 0;return R||P})();z.log({level:"info",category:"resolve",message:"\u6A21\u578B\u89E3\u6790\u7ED3\u679C",source:"bridge",agentId:I,sessionId:D??void 0,details:{perAgentModel:g??null,globalModel:J.model??null,resolvedModel:H??null,providerId:E,note:E==="acode"?"adapter handles full priority":"request > global"}});const me={...J.envOverrides};H&&(me.ANTHROPIC_MODEL=H,me.CODEX_MODEL=H);let W,fe=l;if(E==="acode"){const R=C||{},P=await st({apiOverrides:Ie(R)??void 0,agentId:I,sessionId:D??void 0,runtimeBridgeBaseUrl:B});W=P.instanceConfig.config,fe=P.perInstanceConfigPath,z.log({level:"info",category:"apply",message:"prepareAcodeInstanceConfig \u5B8C\u6210",source:"bridge",agentId:I,sessionId:D??void 0,details:{sanitizedApiOverrides:Ie(R)?te(Ie(R)):null,resolvedInstanceAiConfig:W?te(W):null,perInstanceConfigPath:fe,instanceConfigSources:P.instanceConfig.source??null}})}let we=a||void 0,pe,ge,Y;if(E==="acode")if(pe=typeof c=="string"&&c.trim()||void 0,ge=typeof d=="string"&&d.trim()||void 0,typeof u=="string"&&u.trim())Y=u.trim();else{const R=await bt(o,{schedulerBaseUrl:B,runtimeAccessToken:le,agentId:I});R&&(Y=R,h.info(`[startSdkSession] Auto-loaded memories for ACode agent ${I}`))}else if(typeof c=="string"&&c.trim()||typeof d=="string"&&d.trim()||typeof u=="string"&&u.trim()){const P=[c,d,u,a].filter(Z=>typeof Z=="string"&&Z.trim().length>0).map(Z=>Z.trim());we=P.length>0?P.join(`
48
+ `:void 0}function en(e){const n=on(e);return{sourceEventType:e.type,logCategory:"acode",...nn(e),...n?{logLevel:tn(e),logMessage:n}:{}}}function tn(e){return e.type==="error"?"error":e.type==="command_output"&&e.data.stream==="stderr"?"warn":"info"}function nn(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 on(e){if(e.type==="ai_request"){const n=e.data.model||"unknown-model",t=e.data.endpoint?` @ ${e.data.endpoint}`:"",o=typeof e.data.toolCount=="number"?`, tools=${e.data.toolCount}`:"";return`AI request started: ${n}${t}${o}`}if(e.type==="tool_use_start")return ve(e,"\u5F00\u59CB");if(e.type==="tool_use_end")return ve(e,"\u5B8C\u6210");if(e.type==="command_output")return an(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 rn=/\x1b\[[0-9;?]*[a-zA-Z]/g;function sn(e){return e.replace(rn,"")}function an(e){const n=typeof e.data.stream=="string"?e.data.stream:"mixed",t=typeof e.data.sequence=="number"?` #${e.data.sequence}`:"",o=sn(String(e.data.text||"")).replace(/\s+/g," ").trim(),r=o.length>240?`${o.slice(0,240)}...`:o;return`\u547D\u4EE4\u8F93\u51FA(${n}${t}): ${r||"(empty)"}`}function ve(e,n){const t=ye(e.data.toolName,e.data.toolInput),o=e.data.actionLabel||t.actionLabel||"\u8C03\u7528\u5DE5\u5177",r=qe(e,t);return r?`${n}${o}: ${r}`:`${n}${o}: ${e.data.actionDetail||e.data.toolName||"tool"}`}function qe(e,n){const t=e.data.toolInput;return n.actionType==="bash"?cn(t)||e.data.actionDetail||n.actionDetail:n.actionType==="read_file"||n.actionType==="edit_file"||n.actionType==="write_file"?un(t)||e.data.actionDetail||n.actionDetail:e.data.actionDetail||n.actionDetail}function cn(e){const n=Ae(e?.command,e?.cmd);if(n)return n;if(Array.isArray(e?.argv)){const t=e.argv.map(o=>String(o??"").trim()).filter(Boolean).join(" ");return t?v(t):void 0}return Ae(e?.args)}function un(e){const n=Fe(e?.paths);return n.length>0?n.length===1?n[0]:`${n.length}\u4E2A\u6587\u4EF6: ${n.join(", ")}`:Ae(e?.file_path,e?.filePath,e?.path,e?.target_file,e?.targetFile)}function Ae(...e){for(const n of e){if(typeof n=="string"&&n.trim())return v(n.trim());if(Array.isArray(n)){const t=Fe(n)[0];if(t)return t}}}function Fe(e){return Array.isArray(e)?e.map(n=>typeof n=="string"?n.trim():"").filter(Boolean).map(n=>v(n)):[]}function dn(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)}
49
+ ...\uFF08\u8F93\u5165\u53C2\u6570\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`:n}catch{return}}function ln(e){const n=[e.model?`\u6A21\u578B: ${e.model}`:void 0,e.endpoint||e.requestUrl?`\u63A5\u53E3: ${e.endpoint||e.requestUrl}`:void 0,e.requestMethod?`\u65B9\u6CD5: ${e.requestMethod}`:void 0,typeof e.stream=="boolean"?`\u6D41\u5F0F: ${e.stream?"\u662F":"\u5426"}`:void 0,typeof e.messageCount=="number"?`\u4E0A\u4E0B\u6587\u6D88\u606F: ${e.messageCount}`:void 0,typeof e.toolCount=="number"?`\u53EF\u7528\u5DE5\u5177: ${e.toolCount}`:void 0,e.lastUserMessagePreview?`\u6700\u540E\u8BF7\u6C42: ${e.lastUserMessagePreview}`:void 0].filter(i=>!!i),t=mn(e.requestHeaders),o=n.join(`
50
+ `)||"ACode \u6B63\u5728\u53D1\u9001 AI \u8BF7\u6C42",r=t.length>0?`${Ct}${t.join(`
51
+ `)}`:"",s=e.requestBody?`${bt}${e.requestBody}`:"";return`${o}${r}${s}`}function mn(e){return e?Object.entries(e).map(([n,t])=>`${n}: ${t}`).filter(n=>n.trim().length>0):[]}function fn(e,n){return String(n||"").trim().toLowerCase()!=="waiting_input"?!1:e.type==="thinking"||e.type==="text_delta"}function pn(e){for(const n of["estimatedContextTokens","contextTokens","context_tokens","contextUsedTokens","context_used_tokens"]){const t=e[n],o=Number(t);if(Number.isFinite(o)&&o>0)return o}}function gn(e,n){if(!fn(e,n)){if(e.type==="ai_request"){const t=pn(e.data);return{status:"thinking",actionInfo:{actionType:"ai_request",actionLabel:"AI\u8BF7\u6C42",actionDetail:ln(e.data),...t!==void 0?{usage:{inputTokens:t,outputTokens:0}}:{}}}}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=ye(e.data.toolName,e.data.toolInput),o=qe(e,t),r=dn(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:o||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:r,actionId:e.data.actionId||e.data.toolUseId}}:{status:"tool_using",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:o||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:r,actionId:e.data.actionId||e.data.toolUseId}}}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}}}}const x=new Map,ae=new Map,ce=new Map,G=new Map,yn=20,hn=500,In=3e4;async function ue(e,n=In,t=2){for(let o=0;o<=t;o++){const r=new AbortController;let s;try{const i=e(r.signal);i.catch(()=>{}),await Promise.race([i,new Promise((a,c)=>{s=setTimeout(()=>{r.abort(),c(new Error(`sendOutput timeout after ${n}ms`))},n)})]),s&&clearTimeout(s);return}catch(i){s&&clearTimeout(s);const a=i instanceof Error?i.message:String(i);if(o<t){const c=1e3*(o+1);h.warn(`sendOutput attempt ${o+1}/${t+1} failed (${a}), retrying in ${c}ms...`),await new Promise(d=>setTimeout(d,c));continue}h.warn(`sendOutput failed after ${t+1} attempts (${a}), giving up to unblock serial queue`)}}}function de(e,n){const t=n?`${e}:${n}`:void 0;let o,r;if(t)o=G.get(t),r=t;else{const f=[];for(const[T,y]of G)T.startsWith(e+":")&&y.buffer&&f.push(y.sourceEventType);for(const T of f)de(e,T);return}if(!o||!o.buffer)return;o.timer=null;const s=o.buffer,i=o.seq,a=o.entry,c=o.sourceEventType;o.buffer="",r&&G.delete(r);const d={sourceEventType:c,logCategory:"acode"},u={runtimeAccessToken:a.runtimeAccessToken,schedulerBaseUrl:a.schedulerBaseUrl},m=(x.get(e)??Promise.resolve()).then(()=>ue(f=>X(a.agentId,s,e,i,d,u,f)),()=>ue(f=>X(a.agentId,s,e,i,d,u,f)));x.set(e,m),m.finally(()=>{x.get(e)===m&&x.delete(e)})}function Sn(e,n){const t=Zt(e);if(!t)return;n.seq+=1;const o=n.seq,r=en(e),s={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=G.get(c);if(d||(d={buffer:"",seq:0,timer:null,entry:n,sourceEventType:e.type}),d.buffer+=t,d.seq=o,d.entry=n,!d.timer){const u=e.sessionId,l=e.type;d.timer=setTimeout(()=>de(u,l),hn)}G.set(c,d);return}de(e.sessionId);const a=(x.get(e.sessionId)??Promise.resolve()).then(()=>ue(c=>X(n.agentId,t,e.sessionId,o,r,s,c)),()=>ue(c=>X(n.agentId,t,e.sessionId,o,r,s,c)));x.set(e.sessionId,a),a.finally(()=>{x.get(e.sessionId)===a&&x.delete(e.sessionId)})}function Ke(e){return Ye(e)}let ze=!1;function An(){ze||(Je(w,Tn),ft(),ze=!0)}function Tn(e,n){e.on("event",t=>{const o=p.get(t.sessionId);if(o){if(t.type==="tool_use_start"?gt(o.sessionId,t.data.toolUseId||t.data.actionId,t.data.toolInput,t.data.toolName,o.workspacePath):t.type==="tool_use_end"&&pt(t,{sessionId:o.sessionId,agentId:o.agentId,workspacePath:o.workspacePath,providerId:o.providerId}),console.log(`[${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==="runtime_capabilities"&&t.data.actionDetail&&(o.cachedCapabilitiesActionDetail=t.data.actionDetail);const i=gn(t,o.currentRuntimeStatus);i&&_(o.agentId,t.sessionId,i.status,i.actionInfo,oe(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl},t.timestamp?new Date(t.timestamp).getTime():void 0,t.type)}Sn(t,o);const s=Yt(t);if(s){const i={runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl},a=t.timestamp?new Date(t.timestamp).getTime():void 0,c=String(t.data?.toolName||"").toLowerCase()==="browser_launch",d=t.type==="tool_use_end"&&String(t.data?.rawToolName||t.data?.toolName||"").toLowerCase().replace(/[_-]/g,"").includes("todowrite");c?(async()=>{for(let l=0;l<3;l++){if(await _(o.agentId,t.sessionId,"tool_result",s,void 0,i,a,t.type)!==void 0)return;l<2&&await new Promise(f=>setTimeout(f,3e3*(l+1)))}})().catch(u=>console.warn("[Runtime] browser_launch sendStatus retry exhausted:",u)):d?(async()=>{for(let l=0;l<3;l++){if(await _(o.agentId,t.sessionId,"tool_result",s,void 0,i,a,t.type)!==void 0)return;l<2&&await new Promise(f=>setTimeout(f,1e3*(l+1)))}})().catch(u=>console.warn("[Runtime] todo_write sendStatus retry exhausted:",u)):_(o.agentId,t.sessionId,"tool_result",s,void 0,i,a,t.type)}}}),e.on("status-change",(t,o,r)=>{const s=p.get(t);if(s){de(t),o==="thinking"||o==="tool_using"||o==="compacting"?wt(t):L(t);const i=Pt(o,r);s.currentRuntimeStatus=i.status;const a=s.currentRuntimeActionDetail??"",c=a.includes("poll_message")||a.includes("get_message"),u=!(i.actionInfo?.actionType==="ai_request")&&(i.status==="thinking"||i.status==="waiting_input")&&(s.currentRuntimeActionType==="idle"||s.currentRuntimeActionType==="mcp")&&c;(i.actionInfo?.actionType||!u)&&(s.currentRuntimeActionType=i.actionInfo?.actionType,s.currentRuntimeActionLabel=i.actionInfo?.actionLabel,s.currentRuntimeActionDetail=i.actionInfo?.actionDetail,s.currentRuntimeActionInput=i.actionInfo?.actionInput),console.log(`[${n.displayName} Adapter] Status changed: ${i.status} for agent ${s.agentId}`,i.actionInfo||""),St(t,{runtimeStatus:i.status,runtimeActionType:s.currentRuntimeActionType,runtimeActionLabel:s.currentRuntimeActionLabel,runtimeActionDetail:s.currentRuntimeActionDetail});const l=i.actionInfo?.actionType?i.actionInfo:s.currentRuntimeActionType?{actionType:s.currentRuntimeActionType,actionLabel:s.currentRuntimeActionLabel??"",actionDetail:s.currentRuntimeActionDetail,actionInput:s.currentRuntimeActionInput}:void 0;if(i.status==="compacting"){const f=(ae.get(t)??Promise.resolve()).then(async()=>{for(let y=0;y<=2;y++){if(await _(s.agentId,t,i.status,l,oe(i.actionInfo),{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})!==void 0)return;y<2&&(h.warn(`[${n.displayName}] compaction sendStatus attempt ${y+1} failed (HTTP), retrying in ${1e3*(y+1)}ms...`),await new Promise(C=>setTimeout(C,1e3*(y+1))))}h.warn(`[${n.displayName}] compaction sendStatus failed after 3 attempts, event may be lost`)}).catch(T=>{h.warn(`[${n.displayName}] compaction status chain error:`,T)});ae.set(t,f),f.finally(()=>{ae.get(t)===f&&ae.delete(t)})}else{const m=u&&!i.actionInfo?.actionType;if(l?.actionType==="idle"||s.currentRuntimeActionType==="idle"&&u){const y=(ce.get(t)??Promise.resolve()).then(async()=>{for(let C=0;C<=2;C++){if(await _(s.agentId,t,i.status,m?void 0:l,oe(i.actionInfo),{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})!==void 0)return;C<2&&await new Promise(M=>setTimeout(M,1e3*(C+1)))}h.warn(`[${n.displayName}] idle tool sendStatus failed after 3 attempts, status may be stale (frontend will fall back to timeline tool_use event)`)}).catch(g=>{h.warn(`[${n.displayName}] idle status chain error:`,g)});ce.set(t,y),y.finally(()=>{ce.get(t)===y&&ce.delete(t)})}else _(s.agentId,t,i.status,m?void 0:l,oe(i.actionInfo),{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})}if(i.status==="waiting_input"&&s.cachedCapabilitiesActionDetail){const m=s.cachedCapabilitiesActionDetail;s.cachedCapabilitiesActionDetail=void 0,console.log(`[${n.displayName} Adapter] Re-sending cached runtime_capabilities for agent ${s.agentId} (session stabilized to waiting_input)`),_(s.agentId,t,"waiting_input",{actionType:"runtime_capabilities",actionLabel:"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:m},void 0,{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})}}}),e.on("ask-user-question",t=>{const o=p.get(t.sessionId);o&&(console.log(`[${n.displayName} Adapter] AskUserQuestion for agent ${o.agentId}`),lt(o.agentId,t.sessionId,Array.isArray(t.questions)?t.questions:[],{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl},t.toolCallId))}),e.on("permission-request",t=>{const o=p.get(t.sessionId);if(o){console.log(`[${n.displayName} Adapter] Permission request: ${t.toolName} for agent ${o.agentId}`);const r=t.toolInput?v(JSON.stringify(t.toolInput).slice(0,400)):void 0;_(o.agentId,t.sessionId,"waiting_input",{actionType:"other",actionLabel:"\u6743\u9650\u786E\u8BA4",actionDetail:r||t.toolName},void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})}})}A.post("/start",S,async(e,n)=>{const{agentId:t,workspacePath:o,mode:r="sdk"}=e.body||{};if(!t||!o){n.status(400).json({error:"agentId and workspacePath are required"});return}const s=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||De(Pe(e))||void 0;ct({agentId:String(t),workspacePath:String(o),serverUrl:e.body?.serverUrl||s,runtimeAccessToken:e.body?.runtimeAccessToken,userId:e.body?.userId,schedulerBaseUrl:s}),e.body?.runtimeFeatures!=null&&(et(String(t),e.body.runtimeFeatures),console.log(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u80FD\u529B\u5F00\u5173: ${JSON.stringify(tt(String(t)))}`)),e.body?.envVars!=null&&typeof e.body.envVars=="object"&&(rt(e.body.envVars),console.log(`[Runtime] agent ${t} \u4E0B\u53D1\u9762\u677F\u73AF\u5883\u53D8\u91CF: ${Object.keys(e.body.envVars).length} \u9879 \u2192 \u684C\u9762\u5DE5\u5177\u5B50\u8FDB\u7A0B`)),e.body?.changeCacheRetentionDays!==void 0&&(st(e.body.changeCacheRetentionDays),console.log(`[Runtime] agent ${t} \u4E0B\u53D1\u53D8\u66F4\u7F13\u5B58\u4FDD\u7559\u5929\u6570: ${e.body.changeCacheRetentionDays??"\u4E0D\u6E05\u7406"}`)),r&&r!=="sdk"&&console.warn(`[Runtime] Unsupported runtime mode "${r}" requested for agent ${t}; starting SDK session instead.`),await kn(e,n)});async function kn(e,n){const{agentId:t,workspacePath:o,command:r,autoAccept:s=!0,initialPrompt:i,systemPrompt:a,globalPrompt:c,rolePrompt:d,memory:u,mcpConfigPath:l,extraMcpServers:m,envOverrides:f,idleInputAutoCommand:T,nonInputAutoCommand:y,model:g,instanceAiConfig:C,subAgentModel:$,subAgentEffort:M,scopeKey:Te,browserAllowPrivate:ke}=e.body||{},z=Tt();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:C?te(C):null,perAgentModel:g??null}});let D=null;const I=String(t||"").trim(),le=String(e.body?.runtimeAccessToken||"").trim()||void 0,B=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||De(Pe(e))||void 0;B?h.info(`[startSdkSession] \u56DE\u8C03\u76EE\u6807 server: ${B} (agentId=${I})`):h.warn(`[startSdkSession] \u672A\u89E3\u6790\u5230 schedulerBaseUrl\uFF0C\u5C06\u56DE\u9000\u5230\u9ED8\u8BA4\u5730\u5740 (agentId=${I})`);try{if(An(),!I){n.status(400).json({error:"agentId is required"});return}const O=Be(I);if(O){n.json(await qt(O));return}const k=await yt(I);if(k){const R=Ft(k);if(!R.reusable)console.warn(`[Runtime] Ignoring stale persisted SDK session for agentId=${I}, sessionId=${k.sessionId}, reason=${R.reason}`),await F(k.sessionId);else{const P=se(k.runtimeStatus,k.runtimeStatus,k.runtimeActionType);n.json({sessionId:k.sessionId,status:P,runtimeStatus:P,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(K.has(I)){n.status(409).json({error:"SDK session is already starting for this agent"});return}K.add(I);const _n=(r||"acode").toLowerCase(),E=Ke(r),He=w.get(E);D=Ge();const We=E==="claude-code"?await Qt():null,J=Ne(E==="claude-code"?We:null,f),H=E==="acode"?g?String(g).trim():void 0:(()=>{const R=g?String(g).trim():void 0,P=J.model?String(J.model).trim():void 0;return R||P})();z.log({level:"info",category:"resolve",message:"\u6A21\u578B\u89E3\u6790\u7ED3\u679C",source:"bridge",agentId:I,sessionId:D??void 0,details:{perAgentModel:g??null,globalModel:J.model??null,resolvedModel:H??null,providerId:E,note:E==="acode"?"adapter handles full priority":"request > global"}});const me={...J.envOverrides};H&&(me.ANTHROPIC_MODEL=H,me.CODEX_MODEL=H);let W,fe=l;if(E==="acode"){const R=C||{},P=await at({apiOverrides:Ie(R)??void 0,agentId:I,sessionId:D??void 0,runtimeBridgeBaseUrl:B});W=P.instanceConfig.config,fe=P.perInstanceConfigPath,z.log({level:"info",category:"apply",message:"prepareAcodeInstanceConfig \u5B8C\u6210",source:"bridge",agentId:I,sessionId:D??void 0,details:{sanitizedApiOverrides:Ie(R)?te(Ie(R)):null,resolvedInstanceAiConfig:W?te(W):null,perInstanceConfigPath:fe,instanceConfigSources:P.instanceConfig.source??null}})}let we=a||void 0,pe,ge,Y;if(E==="acode")if(pe=typeof c=="string"&&c.trim()||void 0,ge=typeof d=="string"&&d.trim()||void 0,typeof u=="string"&&u.trim())Y=u.trim();else{const R=await _t(o,{schedulerBaseUrl:B,runtimeAccessToken:le,agentId:I});R&&(Y=R,h.info(`[startSdkSession] Auto-loaded memories for ACode agent ${I}`))}else if(typeof c=="string"&&c.trim()||typeof d=="string"&&d.trim()||typeof u=="string"&&u.trim()){const P=[c,d,u,a].filter(Z=>typeof Z=="string"&&Z.trim().length>0).map(Z=>Z.trim());we=P.length>0?P.join(`
52
52
 
53
- `):void 0}const U={command:r||"acode",workingDirectory:o,agentId:I,...Te?{scopeKey:Te}:{},...typeof ke=="boolean"?{browserAllowPrivate:ke}:{},autoAccept:!!s,initialPrompt:i,systemPrompt:we,...pe!==void 0?{globalPrompt:pe}:{},...ge!==void 0?{rolePrompt:ge}:{},...Y!==void 0?{memory:Y}:{},model:H,mcpConfigPath:fe,...W?{instanceAiConfig:W}:{},...typeof $=="string"&&$.trim()?{subAgentModel:$.trim()}:{},...typeof M=="string"&&M.trim()?{subAgentEffort:M.trim()}:{},extraMcpServers:m||{},envOverrides:Oe(String(t),String(o),process.env,me)};z.log({level:"info",category:"launch",message:"\u4F20\u9012\u7ED9 Adapter \u7684\u5B8C\u6574 AdapterSessionConfig",source:"bridge",agentId:I,sessionId:D,details:{adapterModel:U.model??null,adapterInstanceAiConfig:U.instanceAiConfig?te(U.instanceAiConfig):null,adapterMcpConfigPath:U.mcpConfigPath??null}}),await z.flush(),p.set(D,{agentId:I,workspacePath:o,sessionId:D,config:U,providerId:E,seq:0,runtimeAccessToken:le,schedulerBaseUrl:B}),n.json({sessionId:D,status:"starting",runtimeStatus:"starting",agentId:I,workspacePath:o,command:U.command,mode:"sdk"}),Tn({sessionId:D,agentId:I,config:U,adapter:He,providerId:E,idleInputAutoCommand:T,nonInputAutoCommand:y,runtimeAccessToken:le,requestedSchedulerBaseUrl:B})}catch(O){if(D&&(L(D),p.delete(D),q(D)),I&&K.delete(I),!n.headersSent){const k=O instanceof Error?O.message:String(O);n.status(500).json({error:`Failed to start SDK session: ${k}`})}}}async function Tn(e){const{sessionId:n,agentId:t,config:o,adapter:r,providerId:s,idleInputAutoCommand:i,nonInputAutoCommand:a,runtimeAccessToken:c,requestedSchedulerBaseUrl:d}=e;try{await r.startSession(n,o),(i||a)&&r.setIdleCommands?.(n,{idleInputCommand:i||"",nonInputCommand:a||""});let u;if(_t(s))try{if(await new Promise(m=>setTimeout(m,500)),u=r.getSessionPid?.(n),!u){const f=(await at()).find(T=>T.agentId===t||T.cwd===o.workingDirectory||T.command.includes(o.workingDirectory));f&&(u=f.pid,console.log(`[Runtime] Found SDK process PID: ${u} for agentId=${t}`))}}catch(m){console.warn(`[Runtime] Failed to get SDK PID for agentId=${t}:`,m)}const l=se(r.getSessionStatus(n),p.get(n)?.currentRuntimeStatus,p.get(n)?.currentRuntimeActionType);await It({sessionId:n,agentId:t,workspacePath:o.workingDirectory,command:o.command,startedAt:new Date().toISOString(),status:"running",runtimeStatus:l,mode:"sdk",pid:u,providerSessionId:r.getProviderSessionId(n)}),u&&await he().startProcess({agentId:t,sessionId:n,pid:u,mode:"sdk",workspacePath:o.workingDirectory,command:o.command}),await kn({agentId:t,sessionId:n,sdkPid:u,status:l,schedulerBaseUrl:d,runtimeAccessToken:c})}catch(u){L(n),p.delete(n),q(n),await F(n);const l=u instanceof Error?u.message:String(u);console.error(`[Runtime] Background SDK session startup failed for agentId=${t}: ${l}`),await wn({agentId:t,sessionId:n,schedulerBaseUrl:d,runtimeAccessToken:c,errorMessage:l})}finally{K.delete(t)}}async function kn(e){const{agentId:n,sessionId:t,sdkPid:o,status:r,schedulerBaseUrl:s,runtimeAccessToken:i}=e;if(!s||!i){h.debug(`[Runtime] notifyServerSessionReady skipped: missing schedulerBaseUrl or runtimeAccessToken for agentId=${n}`);return}const a=`${s.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Ce.post(a,{agentId:n,sessionId:t,status:r,pid:o},{headers:{"X-Runtime-Token":i,"Content-Type":"application/json"},timeout:5e3}),h.debug(`[Runtime] Notified server session ready: agentId=${n}, sessionId=${t}, status=${r}`)}catch(c){const d=c instanceof Error?c.message:String(c);h.warn(`[Runtime] Failed to notify server session ready: agentId=${n}, error=${d}`)}}async function wn(e){const{agentId:n,sessionId:t,schedulerBaseUrl:o,runtimeAccessToken:r}=e;if(!o||!r)return;const s=`${o.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Ce.post(s,{agentId:n,sessionId:t,status:"stopped"},{headers:{"X-Runtime-Token":r,"Content-Type":"application/json"},timeout:5e3}),h.debug(`[Runtime] Notified server session failed: agentId=${n}, sessionId=${t}`)}catch(i){const a=i instanceof Error?i.message:String(i);h.warn(`[Runtime] Failed to notify server session failed: agentId=${n}, error=${a}`)}}A.post("/sdk/message",S,async(e,n)=>{const{sessionId:t,message:o}=e.body||{};if(!t||!o){n.status(400).json({error:"sessionId and message are required"});return}const r=p.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code";await w.get(s).sendMessage(t,o),n.json({ok:!0})}catch(s){const i=s instanceof Error?s.message:String(s);n.status(500).json({error:i})}}),A.post("/sdk/answer",S,async(e,n)=>{const{sessionId:t,answers:o}=e.body||{};if(!t||!o){n.status(400).json({error:"sessionId and answers are required"});return}const r=p.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",i=w.get(s);i.sendQuestionAnswer&&await i.sendQuestionAnswer(t,o),n.json({ok:!0})}catch(s){const i=s instanceof Error?s.message:String(s);n.status(500).json({error:i})}}),A.post("/sdk/confirm",S,async(e,n)=>{const{sessionId:t,accept:o}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const r=p.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code";await w.get(s).sendConfirmation(t,!!o),n.json({ok:!0})}catch(s){const i=s instanceof Error?s.message:String(s);n.status(500).json({error:i})}}),A.post("/sdk/abort",S,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const o=p.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code";await w.get(r).abortCurrentTurn(t),n.json({ok:!0})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),A.post("/sdk/stop",S,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const o=p.get(t);if(!o){n.json({ok:!0,status:"stopped"});return}try{const r=o.providerId||"claude-code",s=w.get(r);s.abortCurrentTurn(t).catch(()=>{}),await s.terminateSession(t),L(t),p.delete(t),q(t),ie(t),await F(t),await he().removeProcess(o.agentId),await _(o.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl}),n.json({ok:!0,status:"stopped"})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),A.get("/sdk/status/:sessionId",S,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=p.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code",s=w.get(r),i=s.getSessionStatus(t),a=s.getConversation(t);n.json({sessionId:t,status:i,agentId:o.agentId,workspacePath:o.workspacePath,messageCount:a.length})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),A.get("/sdk/capabilities/:sessionId",S,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=p.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code",i=w.get(r).getCapabilities?.(t)??null;n.json({ok:!0,sessionId:t,agentId:o.agentId,capabilities:i,fetchedAt:Date.now()})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),A.get("/sdk/pending-questions/:sessionId",S,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=p.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code",i=w.get(r).getPendingQuestion?.(t)??null;n.json({ok:!0,sessionId:t,agentId:o.agentId,pendingQuestion:i?{toolCallId:i.toolCallId,questions:i.questions}:null,fetchedAt:Date.now()})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),A.post("/command",S,async(e,n)=>{const{sessionId:t,command:o}=e.body||{};if(!t||o===void 0||o===null){n.status(400).json({error:"sessionId and command are required"});return}try{const r=await Kt(String(t),o);n.json({ok:!0,mode:"terminal",...r})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),A.post("/input",S,async(e,n)=>{const{sessionId:t,input:o,mode:r}=e.body||{};if(!t||o===void 0||o===null){n.status(400).json({error:"sessionId and input are required"});return}const s=p.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const i=s.providerId||"claude-code",a=w.get(i);if(r==="shortcut"){if(!a.sendShortcutInput){n.status(400).json({error:"shortcut input is not supported by this SDK provider"});return}await a.sendShortcutInput(t,String(o)),n.json({ok:!0,mode:"shortcut"});return}await a.sendMessage(t,await Ht(o)),n.json({ok:!0,mode:"sdk"})}catch(i){const a=i instanceof Error?i.message:String(i);n.status(500).json({error:a})}}),A.post("/update-auto-commands",S,async(e,n)=>{const{agentId:t,idleInputAutoCommand:o="",nonInputAutoCommand:r=""}=e.body||{},s=String(t||"").trim();if(!s){n.status(400).json({error:"agentId is required"});return}const i=[...p.values()].find(c=>c.agentId===s),a={idleInputCommand:String(o||""),nonInputCommand:String(r||"")};try{let c=!1;i&&(w.get(i.providerId||"claude-code").setIdleCommands?.(i.sessionId,a),c=!0);const d=await yt(s,{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})}}),A.post("/resize",S,(e,n)=>{const{sessionId:t,cols:o,rows:r}=e.body||{};if(!t||!o||!r){n.status(400).json({error:"sessionId, cols, rows are required"});return}if(!p.has(t)){n.status(404).json({error:"SDK session not found"});return}n.json({ok:!0,mode:"sdk",noop:!0,cols:Number(o),rows:Number(r)})}),A.post("/reset-context",S,async(e,n)=>{const{sessionId:t,reason:o}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const r=p.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}const s=r.providerId||"claude-code",i=w.get(s),a=i.resetContext?.bind(i),c=Ct(s,!!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=se(i.getSessionStatus(String(t)),r.currentRuntimeStatus,r.currentRuntimeActionType);n.json({ok:!0,contextReset:!0,sessionId:t,status:d,runtimeStatus:d,agentId:r.agentId,mode:"sdk",providerId:s,reason:typeof o=="string"&&o.trim()?o.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})}}),A.post("/stop",S,async(e,n)=>{const{sessionId:t}=e.body||{},o=$t(e.body);if(!t){n.status(400).json({error:"sessionId is required"});return}const r=p.get(t);if(!r){await F(t),n.json({ok:!0,status:"stopped",mode:"none",statusNotified:!1,reason:o.reason});return}const s=r.agentId;try{console.log(`[Runtime] Stopping SDK session ${t}; suppressStatus=${!o.statusNotified}, reason=${o.reason||"unspecified"}`);const i=r.providerId||"claude-code",a=w.get(i);a.abortCurrentTurn(t).catch(()=>{}),await a.terminateSession(t),L(t),p.delete(t),q(t),ie(t),await F(t),await he().removeProcess(s),o.statusNotified?await _(s,null,"stopped",void 0,void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl}):console.log(`[Runtime] Stopped status notification suppressed for SDK session ${t}; reason=${o.reason||"unspecified"}`),n.json({ok:!0,status:"stopped",mode:"sdk",statusNotified:o.statusNotified,reason:o.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})}}),A.post("/stop-all",S,async(e,n)=>{const t=[],o=[];for(const[r,s]of p.entries())try{const i=s.providerId||"claude-code",a=w.get(i);a.abortCurrentTurn(r).catch(()=>{}),await a.terminateSession(r),L(r),p.delete(r),q(r),ie(r),t.push(r),await _(s.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})}catch(i){const a=i instanceof Error?i.message:String(i);o.push(`SDK ${r}: ${a}`)}try{await gt([]),console.log("[Runtime] \u5DF2\u6E05\u7A7A\u6240\u6709\u6301\u4E45\u5316\u4F1A\u8BDD")}catch(r){const s=r instanceof Error?r.message:String(r);o.push(`Persistence: ${s}`)}n.json({ok:!0,stopped:{sdk:t.length},errors:o.length>0?o:void 0})}),A.get("/events/last/:n",S,(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 o=Re.getLastN(t);n.json({ok:!0,count:o.length,entries:o})}),A.get("/events/since/:index",S,(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 o=Re.getSinceIndex(t);n.json({ok:!0,entries:o.entries,nextIndex:o.nextIndex,oldestIndex:o.oldestIndex,dataLoss:o.oldestIndex>t+1})}),A.get("/events/push-stats",S,(e,n)=>{const t=dt();n.json({ok:!0,count:t.length,agents:t})});export{Pt as buildAcodeCommandOutputPath,Ne as buildClaudeCodeLaunchConfig,Oe as buildRuntimeEnv,Yt as buildSdkOutputMetadata,Gt as buildToolResultTimelineActionInfo,Gn as cleanupSdkSessionByAgentId,Et as countTerminalOutputLines,je as createTerminalOutputDecoder,re as decodeTerminalOutputChunk,vt as evaluatePersistedSessionReuse,Lt as formatCommandInactivityTimeoutNotice,Mt as formatCommandOutputSpilloverNotice,Jt as formatSdkOutputEvent,Se as formatTerminalPrompt,xt as normalizeTerminalCommandInput,$t as parseRuntimeStopOptions,Bt as parseTerminalDirectoryChangeTarget,ue as raceSendOutputWithRetry,Ct as resolveRuntimeContextResetSupport,fn as resolveRuntimeStatusFromProviderEvent,Ht as resolveSdkInputMessage,Ke as resolveSdkProviderId,se as resolveSdkSessionDisplayStatus,Dt as resolveStatusChangeRuntimeState,oe as resolveStatusChangeUsage,Ut as resolveTerminalOutputEncoding,p as sdkSessions,_t as shouldProbeSdkProcessPid,A as terminalRouter};
53
+ `):void 0}const U={command:r||"acode",workingDirectory:o,agentId:I,...Te?{scopeKey:Te}:{},...typeof ke=="boolean"?{browserAllowPrivate:ke}:{},autoAccept:!!s,initialPrompt:i,systemPrompt:we,...pe!==void 0?{globalPrompt:pe}:{},...ge!==void 0?{rolePrompt:ge}:{},...Y!==void 0?{memory:Y}:{},model:H,mcpConfigPath:fe,...W?{instanceAiConfig:W}:{},...typeof $=="string"&&$.trim()?{subAgentModel:$.trim()}:{},...typeof M=="string"&&M.trim()?{subAgentEffort:M.trim()}:{},extraMcpServers:m||{},envOverrides:Oe(String(t),String(o),process.env,me)};z.log({level:"info",category:"launch",message:"\u4F20\u9012\u7ED9 Adapter \u7684\u5B8C\u6574 AdapterSessionConfig",source:"bridge",agentId:I,sessionId:D,details:{adapterModel:U.model??null,adapterInstanceAiConfig:U.instanceAiConfig?te(U.instanceAiConfig):null,adapterMcpConfigPath:U.mcpConfigPath??null}}),await z.flush(),p.set(D,{agentId:I,workspacePath:o,sessionId:D,config:U,providerId:E,seq:0,runtimeAccessToken:le,schedulerBaseUrl:B}),n.json({sessionId:D,status:"starting",runtimeStatus:"starting",agentId:I,workspacePath:o,command:U.command,mode:"sdk"}),wn({sessionId:D,agentId:I,config:U,adapter:He,providerId:E,idleInputAutoCommand:T,nonInputAutoCommand:y,runtimeAccessToken:le,requestedSchedulerBaseUrl:B})}catch(O){if(D&&(L(D),p.delete(D),q(D)),I&&K.delete(I),!n.headersSent){const k=O instanceof Error?O.message:String(O);n.status(500).json({error:`Failed to start SDK session: ${k}`})}}}async function wn(e){const{sessionId:n,agentId:t,config:o,adapter:r,providerId:s,idleInputAutoCommand:i,nonInputAutoCommand:a,runtimeAccessToken:c,requestedSchedulerBaseUrl:d}=e;try{await r.startSession(n,o),(i||a)&&r.setIdleCommands?.(n,{idleInputCommand:i||"",nonInputCommand:a||""});let u;if(Dt(s))try{if(await new Promise(m=>setTimeout(m,500)),u=r.getSessionPid?.(n),!u){const f=(await ut()).find(T=>T.agentId===t||T.cwd===o.workingDirectory||T.command.includes(o.workingDirectory));f&&(u=f.pid,console.log(`[Runtime] Found SDK process PID: ${u} for agentId=${t}`))}}catch(m){console.warn(`[Runtime] Failed to get SDK PID for agentId=${t}:`,m)}const l=se(r.getSessionStatus(n),p.get(n)?.currentRuntimeStatus,p.get(n)?.currentRuntimeActionType);await At({sessionId:n,agentId:t,workspacePath:o.workingDirectory,command:o.command,startedAt:new Date().toISOString(),status:"running",runtimeStatus:l,mode:"sdk",pid:u,providerSessionId:r.getProviderSessionId(n)}),u&&await he().startProcess({agentId:t,sessionId:n,pid:u,mode:"sdk",workspacePath:o.workingDirectory,command:o.command}),await bn({agentId:t,sessionId:n,sdkPid:u,status:l,schedulerBaseUrl:d,runtimeAccessToken:c})}catch(u){L(n),p.delete(n),q(n),await F(n);const l=u instanceof Error?u.message:String(u);console.error(`[Runtime] Background SDK session startup failed for agentId=${t}: ${l}`),await Cn({agentId:t,sessionId:n,schedulerBaseUrl:d,runtimeAccessToken:c,errorMessage:l})}finally{K.delete(t)}}async function bn(e){const{agentId:n,sessionId:t,sdkPid:o,status:r,schedulerBaseUrl:s,runtimeAccessToken:i}=e;if(!s||!i){h.debug(`[Runtime] notifyServerSessionReady skipped: missing schedulerBaseUrl or runtimeAccessToken for agentId=${n}`);return}const a=`${s.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await be.post(a,{agentId:n,sessionId:t,status:r,pid:o},{headers:{"X-Runtime-Token":i,"Content-Type":"application/json"},timeout:5e3}),h.debug(`[Runtime] Notified server session ready: agentId=${n}, sessionId=${t}, status=${r}`)}catch(c){const d=c instanceof Error?c.message:String(c);h.warn(`[Runtime] Failed to notify server session ready: agentId=${n}, error=${d}`)}}async function Cn(e){const{agentId:n,sessionId:t,schedulerBaseUrl:o,runtimeAccessToken:r}=e;if(!o||!r)return;const s=`${o.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await be.post(s,{agentId:n,sessionId:t,status:"stopped"},{headers:{"X-Runtime-Token":r,"Content-Type":"application/json"},timeout:5e3}),h.debug(`[Runtime] Notified server session failed: agentId=${n}, sessionId=${t}`)}catch(i){const a=i instanceof Error?i.message:String(i);h.warn(`[Runtime] Failed to notify server session failed: agentId=${n}, error=${a}`)}}A.post("/sdk/message",S,async(e,n)=>{const{sessionId:t,message:o}=e.body||{};if(!t||!o){n.status(400).json({error:"sessionId and message are required"});return}const r=p.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code";await w.get(s).sendMessage(t,o),n.json({ok:!0})}catch(s){const i=s instanceof Error?s.message:String(s);n.status(500).json({error:i})}}),A.post("/sdk/answer",S,async(e,n)=>{const{sessionId:t,answers:o}=e.body||{};if(!t||!o){n.status(400).json({error:"sessionId and answers are required"});return}const r=p.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",i=w.get(s);i.sendQuestionAnswer&&await i.sendQuestionAnswer(t,o),n.json({ok:!0})}catch(s){const i=s instanceof Error?s.message:String(s);n.status(500).json({error:i})}}),A.post("/sdk/confirm",S,async(e,n)=>{const{sessionId:t,accept:o}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const r=p.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code";await w.get(s).sendConfirmation(t,!!o),n.json({ok:!0})}catch(s){const i=s instanceof Error?s.message:String(s);n.status(500).json({error:i})}}),A.post("/sdk/abort",S,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const o=p.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code";await w.get(r).abortCurrentTurn(t),n.json({ok:!0})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),A.post("/sdk/stop",S,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const o=p.get(t);if(!o){n.json({ok:!0,status:"stopped"});return}try{const r=o.providerId||"claude-code",s=w.get(r);s.abortCurrentTurn(t).catch(()=>{}),await s.terminateSession(t),L(t),p.delete(t),q(t),ie(t),await F(t),await he().removeProcess(o.agentId),await _(o.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl}),n.json({ok:!0,status:"stopped"})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),A.get("/sdk/status/:sessionId",S,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=p.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code",s=w.get(r),i=s.getSessionStatus(t),a=s.getConversation(t);n.json({sessionId:t,status:i,agentId:o.agentId,workspacePath:o.workspacePath,messageCount:a.length})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),A.get("/sdk/capabilities/:sessionId",S,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=p.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code",i=w.get(r).getCapabilities?.(t)??null;n.json({ok:!0,sessionId:t,agentId:o.agentId,capabilities:i,fetchedAt:Date.now()})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),A.get("/sdk/pending-questions/:sessionId",S,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=p.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code",i=w.get(r).getPendingQuestion?.(t)??null;n.json({ok:!0,sessionId:t,agentId:o.agentId,pendingQuestion:i?{toolCallId:i.toolCallId,questions:i.questions}:null,fetchedAt:Date.now()})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),A.post("/command",S,async(e,n)=>{const{sessionId:t,command:o}=e.body||{};if(!t||o===void 0||o===null){n.status(400).json({error:"sessionId and command are required"});return}try{const r=await Ht(String(t),o);n.json({ok:!0,mode:"terminal",...r})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),A.post("/input",S,async(e,n)=>{const{sessionId:t,input:o,mode:r}=e.body||{};if(!t||o===void 0||o===null){n.status(400).json({error:"sessionId and input are required"});return}const s=p.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const i=s.providerId||"claude-code",a=w.get(i);if(r==="shortcut"){if(!a.sendShortcutInput){n.status(400).json({error:"shortcut input is not supported by this SDK provider"});return}await a.sendShortcutInput(t,String(o)),n.json({ok:!0,mode:"shortcut"});return}await a.sendMessage(t,await Xt(o)),n.json({ok:!0,mode:"sdk"})}catch(i){const a=i instanceof Error?i.message:String(i);n.status(500).json({error:a})}}),A.post("/update-auto-commands",S,async(e,n)=>{const{agentId:t,idleInputAutoCommand:o="",nonInputAutoCommand:r=""}=e.body||{},s=String(t||"").trim();if(!s){n.status(400).json({error:"agentId is required"});return}const i=[...p.values()].find(c=>c.agentId===s),a={idleInputCommand:String(o||""),nonInputCommand:String(r||"")};try{let c=!1;i&&(w.get(i.providerId||"claude-code").setIdleCommands?.(i.sessionId,a),c=!0);const d=await It(s,{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})}}),A.post("/resize",S,(e,n)=>{const{sessionId:t,cols:o,rows:r}=e.body||{};if(!t||!o||!r){n.status(400).json({error:"sessionId, cols, rows are required"});return}if(!p.has(t)){n.status(404).json({error:"SDK session not found"});return}n.json({ok:!0,mode:"sdk",noop:!0,cols:Number(o),rows:Number(r)})}),A.post("/reset-context",S,async(e,n)=>{const{sessionId:t,reason:o}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const r=p.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}const s=r.providerId||"claude-code",i=w.get(s),a=i.resetContext?.bind(i),c=$t(s,!!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=se(i.getSessionStatus(String(t)),r.currentRuntimeStatus,r.currentRuntimeActionType);n.json({ok:!0,contextReset:!0,sessionId:t,status:d,runtimeStatus:d,agentId:r.agentId,mode:"sdk",providerId:s,reason:typeof o=="string"&&o.trim()?o.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})}}),A.post("/stop",S,async(e,n)=>{const{sessionId:t}=e.body||{},o=Rt(e.body);if(!t){n.status(400).json({error:"sessionId is required"});return}const r=p.get(t);if(!r){await F(t),n.json({ok:!0,status:"stopped",mode:"none",statusNotified:!1,reason:o.reason});return}const s=r.agentId;try{console.log(`[Runtime] Stopping SDK session ${t}; suppressStatus=${!o.statusNotified}, reason=${o.reason||"unspecified"}`);const i=r.providerId||"claude-code",a=w.get(i);a.abortCurrentTurn(t).catch(()=>{}),await a.terminateSession(t),L(t),p.delete(t),q(t),ie(t),await F(t),await he().removeProcess(s),o.statusNotified?await _(s,null,"stopped",void 0,void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl}):console.log(`[Runtime] Stopped status notification suppressed for SDK session ${t}; reason=${o.reason||"unspecified"}`),n.json({ok:!0,status:"stopped",mode:"sdk",statusNotified:o.statusNotified,reason:o.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})}}),A.post("/stop-all",S,async(e,n)=>{const t=[],o=[];for(const[r,s]of p.entries())try{const i=s.providerId||"claude-code",a=w.get(i);a.abortCurrentTurn(r).catch(()=>{}),await a.terminateSession(r),L(r),p.delete(r),q(r),ie(r),t.push(r),await _(s.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})}catch(i){const a=i instanceof Error?i.message:String(i);o.push(`SDK ${r}: ${a}`)}try{await ht([]),console.log("[Runtime] \u5DF2\u6E05\u7A7A\u6240\u6709\u6301\u4E45\u5316\u4F1A\u8BDD")}catch(r){const s=r instanceof Error?r.message:String(r);o.push(`Persistence: ${s}`)}n.json({ok:!0,stopped:{sdk:t.length},errors:o.length>0?o:void 0})}),A.get("/events/last/:n",S,(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 o=Re.getLastN(t);n.json({ok:!0,count:o.length,entries:o})}),A.get("/events/since/:index",S,(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 o=Re.getSinceIndex(t);n.json({ok:!0,entries:o.entries,nextIndex:o.nextIndex,oldestIndex:o.oldestIndex,dataLoss:o.oldestIndex>t+1})}),A.get("/events/push-stats",S,(e,n)=>{const t=mt();n.json({ok:!0,count:t.length,agents:t})});export{Mt as buildAcodeCommandOutputPath,Ne as buildClaudeCodeLaunchConfig,Oe as buildRuntimeEnv,en as buildSdkOutputMetadata,Yt as buildToolResultTimelineActionInfo,Zn as cleanupSdkSessionByAgentId,Lt as countTerminalOutputLines,je as createTerminalOutputDecoder,re as decodeTerminalOutputChunk,Ft as evaluatePersistedSessionReuse,Ut as formatCommandInactivityTimeoutNotice,xt as formatCommandOutputSpilloverNotice,Zt as formatSdkOutputEvent,Se as formatTerminalPrompt,jt as normalizeTerminalCommandInput,Rt as parseRuntimeStopOptions,Nt as parseTerminalDirectoryChangeTarget,ue as raceSendOutputWithRetry,$t as resolveRuntimeContextResetSupport,gn as resolveRuntimeStatusFromProviderEvent,Xt as resolveSdkInputMessage,Ke as resolveSdkProviderId,se as resolveSdkSessionDisplayStatus,Pt as resolveStatusChangeRuntimeState,oe as resolveStatusChangeUsage,Bt as resolveTerminalOutputEncoding,p as sdkSessions,Dt as shouldProbeSdkProcessPid,A as terminalRouter};
54
54
 
@@ -1,3 +1,3 @@
1
- import{createHash as j}from"node:crypto";import{cpSync as l,existsSync as c,lstatSync as b,mkdirSync as W,readdirSync as D,readFileSync as d,realpathSync as E,rmSync as R,statSync as M,symlinkSync as v,writeFileSync as B}from"node:fs";import n from"node:path";import{fileURLToPath as O}from"node:url";import{getActiveBridgeHttpPort as H,getRuntimeHomeDir as I,isDevMode as $,schedulerBaseUrl as k}from"../config.js";import{logger as i}from"../utils/logger.js";import{loadRuntimeBinding as V}from"./runtime-binding.js";const a=$()?"aws-mcp-dev":"aws-mcp",p=process.env.AWS_SCHEDULER_BACKEND_PORT?Number(process.env.AWS_SCHEDULER_BACKEND_PORT):8080,x=["AWS_PROJECT_NAME","AWS_PROMPT","AWS_ROLE_NAME","AWS_SERVER_URL","AWS_MCP_HTTP_URL","AWS_RUNTIME_BRIDGE_BASE_URL","AWS_HEARTBEAT_INTERVAL","AWS_HEARTBEAT_TIMEOUT","PATH","HOME","USERPROFILE","TMP","TEMP","SystemRoot","COMSPEC","PATHEXT","WINDIR"];function C(){const r=O(import.meta.url);return n.resolve(n.dirname(r),"..","..")}function G(r=C()){return n.join(f(r),"dist","index.js")}function f(r){return n.join(r,"package","aws-client-agent-mcp")}function _(){return n.join(I(),".aws-bridge","mcp")}function Ae(){return n.join(_(),"dist")}function P(r=_()){return n.join(r,".release.json")}function w(r){try{return JSON.parse(d(r,"utf-8")).version||"unknown"}catch{return"unknown"}}function F(r){return w(n.join(r,"package.json"))}function J(r){return w(n.join(f(r),"package.json"))}function A(r,e){c(r)&&K(r,e)}function K(r,e){if(M(r).isDirectory()){l(r,e,{errorOnExist:!1,force:!0,recursive:!0});return}l(r,e,{errorOnExist:!1,force:!0})}function N(r,e){const t=f(r);A(n.join(t,"package.json"),n.join(e,"package.json")),A(n.join(t,"README.md"),n.join(e,"README.md")),A(n.join(t,"package-lock.json"),n.join(e,"package-lock.json"))}function z(r){if(!c(r))return!0;const e=b(r);return e.isSymbolicLink()||e.isDirectory()}function X(r,e){if(!c(r))return!1;try{return E(r)===E(e)}catch{return!1}}function T(r,e){const t=n.join(r,"node_modules"),o=n.join(e,"node_modules");if(!c(t)){i.warn(`[runtime-bridge] ${a} MCP \u672A\u627E\u5230\u4F9D\u8D56\u76EE\u5F55\uFF0Crelease \u4EA7\u7269\u53EF\u80FD\u65E0\u6CD5\u89E3\u6790\u8FD0\u884C\u65F6\u4F9D\u8D56: ${t}`);return}if(!X(o,t)){if(!z(o)){i.warn(`[runtime-bridge] ${a} MCP \u4F9D\u8D56\u8DEF\u5F84\u5DF2\u5B58\u5728\u4F46\u4E0D\u662F\u76EE\u5F55\u6216\u94FE\u63A5\uFF0C\u5DF2\u4FDD\u7559: ${o}`);return}R(o,{recursive:!0,force:!0}),v(t,o,process.platform==="win32"?"junction":"dir")}}function L(r,e=r){return D(r,{withFileTypes:!0}).flatMap(t=>{const o=n.join(r,t.name);return t.isDirectory()?L(o,e):t.isFile()?[n.relative(e,o).split(n.sep).join("/")]:[]})}function Y(r){const e=j("sha256");for(const t of L(r).sort()){const o=n.join(r,...t.split("/")),s=M(o);e.update(t),e.update("\0"),e.update(String(s.size)),e.update("\0"),e.update(d(o)),e.update("\0")}return`sha256:${e.digest("hex")}`}function q(r){try{const e=JSON.parse(d(P(r),"utf-8"));if(typeof e.bridgeVersion=="string"&&typeof e.mcpVersion=="string"&&typeof e.distHash=="string")return{bridgeVersion:e.bridgeVersion,mcpVersion:e.mcpVersion,distHash:e.distHash,releasedAt:typeof e.releasedAt=="string"?e.releasedAt:""}}catch{return null}return null}function Q(r,e,t){return!c(r)||!e||e.bridgeVersion!==t.bridgeVersion||e.mcpVersion!==t.mcpVersion||e.distHash!==t.distHash}function Z(r={}){const e=r.packageRoot||C(),t=n.dirname(G(e)),o=n.join(t,"index.js");if(!c(o))return null;if(c(n.join(e,"src")))return i.info(`[runtime-bridge] ${a} MCP \u672C\u5730\u5F00\u53D1\u6A21\u5F0F\uFF0C\u76F4\u63A5\u4F7F\u7528\u9879\u76EE dist: ${o}`),o;const s=r.releasedRoot||_(),u=n.join(s,"dist"),S=n.join(u,"index.js"),m={bridgeVersion:F(e),mcpVersion:J(e),distHash:Y(t)},U=q(s);return Q(S,U,m)?(R(u,{recursive:!0,force:!0}),W(s,{recursive:!0}),N(e,s),T(e,s),l(t,u,{errorOnExist:!1,force:!0,recursive:!0}),B(P(s),`${JSON.stringify({...m,releasedAt:r.now?r.now():new Date().toISOString()},null,2)}
2
- `,"utf-8"),i.info(`[runtime-bridge] ${a} MCP \u5DF2\u66F4\u65B0\u5230: ${u}`)):(N(e,s),T(e,s),i.info(`[runtime-bridge] ${a} MCP \u5DF2\u662F\u6700\u65B0: ${u}`)),S}function ee(){return Object.fromEntries(Object.entries(process.env).filter(r=>typeof r[1]=="string"))}function re(r){return Object.fromEntries(x.flatMap(e=>{const t=r[e];return typeof t=="string"&&t.length>0?[[e,t]]:[]}))}function te(r){try{const e=JSON.parse(r);if(Array.isArray(e)&&e.every(t=>typeof t=="string"))return e}catch(e){i.warn(`[runtime-bridge] AWS_CLIENT_AGENT_MCP_ARGS \u4E0D\u662F\u5408\u6CD5 JSON\uFF0C\u5DF2\u5FFD\u7565: ${e instanceof Error?e.message:String(e)}`)}return i.warn("[runtime-bridge] AWS_CLIENT_AGENT_MCP_ARGS \u5FC5\u987B\u662F string[] JSON\uFF0C\u5DF2\u5FFD\u7565"),[]}function y(r){const e=r.replace(/^((?:https?|wss?):\/\/(?:\[[^\]]+\]|[^/:?#]+):\d+):\d+(?=\/|$)/i,"$1");try{const t=new URL(e);return t.protocol==="ws:"?t.protocol="http:":t.protocol==="wss:"?t.protocol="https:":t.protocol=t.protocol.toLowerCase(),t.origin}catch{return e.replace(/\/+$/,"")}}function ne(r){const e=r.hostname.toLowerCase();return(e==="localhost"||e==="127.0.0.1"||e==="[::1]")&&r.port!==""&&Number(r.port)!==p}function oe(r){const e=new URL("/ws/agent",y(r));return e.protocol==="https:"?e.protocol="wss:":e.protocol="ws:",e.toString()}function se(r){const e=y(r);let t;try{t=new URL(e)}catch{return new URL("/mcp/call",e).toString()}if(ne(t)){const o=t.port;t.port=String(p),ie(e,o,p)}return new URL("/mcp/call",t).toString()}let h=!1;function ie(r,e,t){h||(h=!0,i.warn(`[AwsClientAgentMcp] \u68C0\u6D4B\u5230\u56DE\u73AF\u5730\u5740\u975E\u540E\u7AEF\u7AEF\u53E3\uFF0CMCP HTTP \u8C03\u7528\u6539\u9053\u76F4\u8FDE\u540E\u7AEF: ${r} -> \u7AEF\u53E3 ${e} -> ${t}\uFF08\u5982\u540E\u7AEF\u5B9E\u9645\u4F7F\u7528\u5176\u5B83\u7AEF\u53E3\u8BF7\u8BBE\u7F6E AWS_SCHEDULER_BACKEND_PORT\uFF09`))}function ce(){const r=String(process.env.AWS_RUNTIME_SCHEDULER_BASE_URL||"").trim();if(r)return r;const e=V(),t=String(e.schedulerBaseUrl||"").trim();return e.status==="paired"&&t?t:k}function ge(r={}){return g(r)}function g(r={}){const e=String(process.env.AWS_CLIENT_AGENT_MCP_COMMAND||"").trim();if(e)return{source:"override",command:e,args:process.env.AWS_CLIENT_AGENT_MCP_ARGS?te(process.env.AWS_CLIENT_AGENT_MCP_ARGS):[]};const t=r.exists||c,s=(r.release||Z)();return s&&t(s)?{source:"bundled",command:process.execPath,args:[s]}:{source:"global",command:"aws-client-agent-mcp",args:[]}}function Se(r){const e=ee(),t=g(),o=ce();return{command:t.command,args:t.args,env:{...re(e),AWS_AGENT_ID:r.agentId,AWS_WORKSPACE_PATH:r.workspacePath,AWS_SERVER_URL:e.AWS_SERVER_URL||oe(o),AWS_MCP_HTTP_URL:e.AWS_MCP_HTTP_URL||se(o),AWS_RUNTIME_BRIDGE_BASE_URL:e.AWS_RUNTIME_BRIDGE_BASE_URL||`http://127.0.0.1:${H()}`,AWS_MCP_CLAIM_LAUNCH_BINDING:e.AWS_MCP_CLAIM_LAUNCH_BINDING||"true"}}}function me(){const r=g(),e=r.args[0]?`${r.command} ${r.args.join(" ")}`:r.command;if(r.source==="global"){i.warn(`[runtime-bridge] ${a} MCP \u672A\u627E\u5230 bundled \u4EA7\u7269\uFF0C\u542F\u52A8\u65F6\u5C06\u56DE\u9000\u5230 PATH \u547D\u4EE4: ${e}`);return}i.info(`[runtime-bridge] ${a} MCP \u5DF2\u51C6\u5907(${r.source}): ${e}`)}export{a as AWS_MCP_SERVER_NAME,Se as buildAwsMcpServerConfig,me as ensureAwsClientAgentMcpReleased,g as getAwsClientAgentMcpPreparedInfo,Ae as getReleasedMcpDistPath,Z as releaseBundledAwsClientAgentMcp,ge as resolveAwsClientAgentMcpCommand};
1
+ import{createHash as w}from"node:crypto";import{cpSync as l,existsSync as c,lstatSync as L,mkdirSync as U,readdirSync as b,readFileSync as d,realpathSync as S,rmSync as E,statSync as M,symlinkSync as v,writeFileSync as W}from"node:fs";import t from"node:path";import{fileURLToPath as I}from"node:url";import{getActiveBridgeHttpPort as B,getRuntimeHomeDir as D,isDevMode as O,schedulerBaseUrl as $}from"../config.js";import{logger as i}from"../utils/logger.js";import{loadRuntimeBinding as H}from"./runtime-binding.js";const a=O()?"aws-mcp-dev":"aws-mcp",k=["AWS_PROJECT_NAME","AWS_PROMPT","AWS_ROLE_NAME","AWS_SERVER_URL","AWS_MCP_HTTP_URL","AWS_RUNTIME_BRIDGE_BASE_URL","AWS_HEARTBEAT_INTERVAL","AWS_HEARTBEAT_TIMEOUT","PATH","HOME","USERPROFILE","TMP","TEMP","SystemRoot","COMSPEC","PATHEXT","WINDIR"];function R(){const r=I(import.meta.url);return t.resolve(t.dirname(r),"..","..")}function V(r=R()){return t.join(p(r),"dist","index.js")}function p(r){return t.join(r,"package","aws-client-agent-mcp")}function f(){return t.join(D(),".aws-bridge","mcp")}function de(){return t.join(f(),"dist")}function C(r=f()){return t.join(r,".release.json")}function y(r){try{return JSON.parse(d(r,"utf-8")).version||"unknown"}catch{return"unknown"}}function x(r){return y(t.join(r,"package.json"))}function G(r){return y(t.join(p(r),"package.json"))}function g(r,e){c(r)&&F(r,e)}function F(r,e){if(M(r).isDirectory()){l(r,e,{errorOnExist:!1,force:!0,recursive:!0});return}l(r,e,{errorOnExist:!1,force:!0})}function N(r,e){const n=p(r);g(t.join(n,"package.json"),t.join(e,"package.json")),g(t.join(n,"README.md"),t.join(e,"README.md")),g(t.join(n,"package-lock.json"),t.join(e,"package-lock.json"))}function J(r){if(!c(r))return!0;const e=L(r);return e.isSymbolicLink()||e.isDirectory()}function z(r,e){if(!c(r))return!1;try{return S(r)===S(e)}catch{return!1}}function T(r,e){const n=t.join(r,"node_modules"),o=t.join(e,"node_modules");if(!c(n)){i.warn(`[runtime-bridge] ${a} MCP \u672A\u627E\u5230\u4F9D\u8D56\u76EE\u5F55\uFF0Crelease \u4EA7\u7269\u53EF\u80FD\u65E0\u6CD5\u89E3\u6790\u8FD0\u884C\u65F6\u4F9D\u8D56: ${n}`);return}if(!z(o,n)){if(!J(o)){i.warn(`[runtime-bridge] ${a} MCP \u4F9D\u8D56\u8DEF\u5F84\u5DF2\u5B58\u5728\u4F46\u4E0D\u662F\u76EE\u5F55\u6216\u94FE\u63A5\uFF0C\u5DF2\u4FDD\u7559: ${o}`);return}E(o,{recursive:!0,force:!0}),v(n,o,process.platform==="win32"?"junction":"dir")}}function P(r,e=r){return b(r,{withFileTypes:!0}).flatMap(n=>{const o=t.join(r,n.name);return n.isDirectory()?P(o,e):n.isFile()?[t.relative(e,o).split(t.sep).join("/")]:[]})}function K(r){const e=w("sha256");for(const n of P(r).sort()){const o=t.join(r,...n.split("/")),s=M(o);e.update(n),e.update("\0"),e.update(String(s.size)),e.update("\0"),e.update(d(o)),e.update("\0")}return`sha256:${e.digest("hex")}`}function X(r){try{const e=JSON.parse(d(C(r),"utf-8"));if(typeof e.bridgeVersion=="string"&&typeof e.mcpVersion=="string"&&typeof e.distHash=="string")return{bridgeVersion:e.bridgeVersion,mcpVersion:e.mcpVersion,distHash:e.distHash,releasedAt:typeof e.releasedAt=="string"?e.releasedAt:""}}catch{return null}return null}function Y(r,e,n){return!c(r)||!e||e.bridgeVersion!==n.bridgeVersion||e.mcpVersion!==n.mcpVersion||e.distHash!==n.distHash}function q(r={}){const e=r.packageRoot||R(),n=t.dirname(V(e)),o=t.join(n,"index.js");if(!c(o))return null;if(c(t.join(e,"src")))return i.info(`[runtime-bridge] ${a} MCP \u672C\u5730\u5F00\u53D1\u6A21\u5F0F\uFF0C\u76F4\u63A5\u4F7F\u7528\u9879\u76EE dist: ${o}`),o;const s=r.releasedRoot||f(),u=t.join(s,"dist"),A=t.join(u,"index.js"),_={bridgeVersion:x(e),mcpVersion:G(e),distHash:K(n)},j=X(s);return Y(A,j,_)?(E(u,{recursive:!0,force:!0}),U(s,{recursive:!0}),N(e,s),T(e,s),l(n,u,{errorOnExist:!1,force:!0,recursive:!0}),W(C(s),`${JSON.stringify({..._,releasedAt:r.now?r.now():new Date().toISOString()},null,2)}
2
+ `,"utf-8"),i.info(`[runtime-bridge] ${a} MCP \u5DF2\u66F4\u65B0\u5230: ${u}`)):(N(e,s),T(e,s),i.info(`[runtime-bridge] ${a} MCP \u5DF2\u662F\u6700\u65B0: ${u}`)),A}function Q(){return Object.fromEntries(Object.entries(process.env).filter(r=>typeof r[1]=="string"))}function Z(r){return Object.fromEntries(k.flatMap(e=>{const n=r[e];return typeof n=="string"&&n.length>0?[[e,n]]:[]}))}function ee(r){try{const e=JSON.parse(r);if(Array.isArray(e)&&e.every(n=>typeof n=="string"))return e}catch(e){i.warn(`[runtime-bridge] AWS_CLIENT_AGENT_MCP_ARGS \u4E0D\u662F\u5408\u6CD5 JSON\uFF0C\u5DF2\u5FFD\u7565: ${e instanceof Error?e.message:String(e)}`)}return i.warn("[runtime-bridge] AWS_CLIENT_AGENT_MCP_ARGS \u5FC5\u987B\u662F string[] JSON\uFF0C\u5DF2\u5FFD\u7565"),[]}function h(r){const e=r.replace(/^((?:https?|wss?):\/\/(?:\[[^\]]+\]|[^/:?#]+):\d+):\d+(?=\/|$)/i,"$1");try{const n=new URL(e);return n.protocol==="ws:"?n.protocol="http:":n.protocol==="wss:"?n.protocol="https:":n.protocol=n.protocol.toLowerCase(),n.origin}catch{return e.replace(/\/+$/,"")}}function re(r){const e=new URL("/ws/agent",h(r));return e.protocol==="https:"?e.protocol="wss:":e.protocol="ws:",e.toString()}function ne(r){const e=h(r);return new URL("/mcp/call",e).toString()}function te(){const r=String(process.env.AWS_RUNTIME_SCHEDULER_BASE_URL||"").trim();if(r)return r;const e=H(),n=String(e.schedulerBaseUrl||"").trim();return e.status==="paired"&&n?n:$}function pe(r={}){return m(r)}function m(r={}){const e=String(process.env.AWS_CLIENT_AGENT_MCP_COMMAND||"").trim();if(e)return{source:"override",command:e,args:process.env.AWS_CLIENT_AGENT_MCP_ARGS?ee(process.env.AWS_CLIENT_AGENT_MCP_ARGS):[]};const n=r.exists||c,s=(r.release||q)();return s&&n(s)?{source:"bundled",command:process.execPath,args:[s]}:{source:"global",command:"aws-client-agent-mcp",args:[]}}function fe(r){const e=Q(),n=m(),o=te();return{command:n.command,args:n.args,env:{...Z(e),AWS_AGENT_ID:r.agentId,AWS_WORKSPACE_PATH:r.workspacePath,AWS_SERVER_URL:e.AWS_SERVER_URL||re(o),AWS_MCP_HTTP_URL:e.AWS_MCP_HTTP_URL||ne(o),AWS_RUNTIME_BRIDGE_BASE_URL:e.AWS_RUNTIME_BRIDGE_BASE_URL||`http://127.0.0.1:${B()}`,AWS_MCP_CLAIM_LAUNCH_BINDING:e.AWS_MCP_CLAIM_LAUNCH_BINDING||"true"}}}function ge(){const r=m(),e=r.args[0]?`${r.command} ${r.args.join(" ")}`:r.command;if(r.source==="global"){i.warn(`[runtime-bridge] ${a} MCP \u672A\u627E\u5230 bundled \u4EA7\u7269\uFF0C\u542F\u52A8\u65F6\u5C06\u56DE\u9000\u5230 PATH \u547D\u4EE4: ${e}`);return}i.info(`[runtime-bridge] ${a} MCP \u5DF2\u51C6\u5907(${r.source}): ${e}`)}export{a as AWS_MCP_SERVER_NAME,fe as buildAwsMcpServerConfig,ge as ensureAwsClientAgentMcpReleased,m as getAwsClientAgentMcpPreparedInfo,de as getReleasedMcpDistPath,q as releaseBundledAwsClientAgentMcp,pe as resolveAwsClientAgentMcpCommand};
3
3
 
@@ -1,2 +1,2 @@
1
- import l from"node:path";import{AiConfigService as p,CcSwitchSdk as f}from"@cc-switch/sdk";import{createMcpAdapters as g,createSkillAdapters as u}from"../adapters/cc-switch/index.js";import{getAcodeConfigFile as C,getAcodeSkillsDir as S,getClaudeConfigFile as k,getClaudeMcpConfigFile as F,getClaudeSkillsDir as m,getCodexConfigFile as x,getCodexSkillsDir as D,getUserHomeDir as v,getOpencodeConfigFile as w,getOpencodeSkillsDir as A}from"../config.js";import{getAgentInitRoot as s}from"./instance-state.js";import{InstanceService as h}from"./instance-service.js";function r(){const e=l.resolve(v());return{runtimeHome:e,acodeConfigFile:l.resolve(C(e)),acodeSkillsDir:l.resolve(S(e)),claudeConfigFile:l.resolve(k(e)),claudeMcpConfigFile:l.resolve(F(e)),claudeSkillsDir:l.resolve(m(e)),codexConfigFile:l.resolve(x(e)),codexSkillsDir:l.resolve(D(e)),opencodeConfigFile:l.resolve(w(e)),opencodeSkillsDir:l.resolve(A(e))}}function d(e){const c=s(e),o=l.join(c,"cc-switch-sdk"),i=r(),n={stateFile:l.join(o,"state.json"),backupDir:l.join(o,"backups"),acodeConfigFile:i.acodeConfigFile,acodeSkillsDir:i.acodeSkillsDir,claudeConfigFile:i.claudeConfigFile,claudeSkillsDir:i.claudeSkillsDir,claudecodeConfigFile:i.claudeMcpConfigFile,claudecodeSkillsDir:i.claudeSkillsDir,codexConfigFile:i.codexConfigFile,codexSkillsDir:i.codexSkillsDir,opencodeConfigFile:i.opencodeConfigFile,opencodeSkillsDir:i.opencodeSkillsDir,ssotSkillsDir:l.join(o,"skills")},t=g(n),a=u(n);return new f({rootDir:o,paths:n,adapters:{mcp:t,skill:a}})}async function B(e){const c=d(e);return await c.load(),c}async function b(e){const[c,o]=await Promise.all([e.importMcpFromApps(),e.importSkillsFromApps()]);return{mcpServers:c,skills:o}}function H(){const e=r();return new p({acodeConfigFile:e.acodeConfigFile,claudecodeConfigFile:e.claudeConfigFile,codexConfigFile:e.codexConfigFile,opencodeConfigFile:e.opencodeConfigFile})}function O(e,c){const o=d(e),i=s(e);return new h(o,i,c)}async function E(e,c,o,i){const n=i||await B(c),t=r();return{ok:!0,adapter:"cc-switch-sdk",action:e,agentId:String(c),payload:o,paths:t,snapshot:{skills:n.getAllSkills().length,mcpServers:n.getAllMcpServers().length}}}function U(e){const c=Array.isArray(e)?e:[],o=i=>c.includes(i);return{acode:o("acode"),claude:!1,claudecode:o("claudecode")||o("claude"),codex:o("codex"),gemini:o("gemini"),opencode:o("opencode"),openclaw:o("openclaw")}}function q(e){return e?{acode:!!e.acode,claude:!1,claudecode:!!e.claudecode||!!e.claude,codex:!!e.codex,gemini:!!e.gemini,opencode:!!e.opencode,openclaw:!!e.openclaw}:{acode:!1,claude:!1,claudecode:!1,codex:!1,gemini:!1,opencode:!1,openclaw:!1}}export{b as discoverCcSwitchConfiguredItems,H as getAiConfigService,r as getCcSwitchAppPaths,d as getCcSwitchSdk,O as getInstanceService,B as loadCcSwitchSdk,E as runCcSwitchAdapter,q as toSdkApps,U as toSdkAppsFromEnabledTools};
1
+ import l from"node:path";import{AiConfigService as p,CcSwitchSdk as f}from"@cc-switch/sdk";import{createMcpAdapters as g,createSkillAdapters as u}from"../adapters/cc-switch/index.js";import{getAcodeConfigFile as C,getAcodeSkillsDir as S,getClaudeConfigFile as k,getClaudeMcpConfigFile as F,getClaudeSkillsDir as m,getCodexConfigFile as x,getCodexSkillsDir as D,getUserHomeDir as v,getOpencodeConfigFile as w,getOpencodeSkillsDir as A}from"../config.js";import{getAgentInitRoot as s}from"./instance-state.js";import{InstanceService as h}from"./instance-service.js";function r(){const e=l.resolve(v());return{runtimeHome:e,acodeConfigFile:l.resolve(C()),acodeSkillsDir:l.resolve(S()),claudeConfigFile:l.resolve(k(e)),claudeMcpConfigFile:l.resolve(F(e)),claudeSkillsDir:l.resolve(m(e)),codexConfigFile:l.resolve(x(e)),codexSkillsDir:l.resolve(D(e)),opencodeConfigFile:l.resolve(w(e)),opencodeSkillsDir:l.resolve(A(e))}}function d(e){const c=s(e),o=l.join(c,"cc-switch-sdk"),i=r(),n={stateFile:l.join(o,"state.json"),backupDir:l.join(o,"backups"),acodeConfigFile:i.acodeConfigFile,acodeSkillsDir:i.acodeSkillsDir,claudeConfigFile:i.claudeConfigFile,claudeSkillsDir:i.claudeSkillsDir,claudecodeConfigFile:i.claudeMcpConfigFile,claudecodeSkillsDir:i.claudeSkillsDir,codexConfigFile:i.codexConfigFile,codexSkillsDir:i.codexSkillsDir,opencodeConfigFile:i.opencodeConfigFile,opencodeSkillsDir:i.opencodeSkillsDir,ssotSkillsDir:l.join(o,"skills")},t=g(n),a=u(n);return new f({rootDir:o,paths:n,adapters:{mcp:t,skill:a}})}async function B(e){const c=d(e);return await c.load(),c}async function b(e){const[c,o]=await Promise.all([e.importMcpFromApps(),e.importSkillsFromApps()]);return{mcpServers:c,skills:o}}function H(){const e=r();return new p({acodeConfigFile:e.acodeConfigFile,claudecodeConfigFile:e.claudeConfigFile,codexConfigFile:e.codexConfigFile,opencodeConfigFile:e.opencodeConfigFile})}function O(e,c){const o=d(e),i=s(e);return new h(o,i,c)}async function E(e,c,o,i){const n=i||await B(c),t=r();return{ok:!0,adapter:"cc-switch-sdk",action:e,agentId:String(c),payload:o,paths:t,snapshot:{skills:n.getAllSkills().length,mcpServers:n.getAllMcpServers().length}}}function U(e){const c=Array.isArray(e)?e:[],o=i=>c.includes(i);return{acode:o("acode"),claude:!1,claudecode:o("claudecode")||o("claude"),codex:o("codex"),gemini:o("gemini"),opencode:o("opencode"),openclaw:o("openclaw")}}function q(e){return e?{acode:!!e.acode,claude:!1,claudecode:!!e.claudecode||!!e.claude,codex:!!e.codex,gemini:!!e.gemini,opencode:!!e.opencode,openclaw:!!e.openclaw}:{acode:!1,claude:!1,claudecode:!1,codex:!1,gemini:!1,opencode:!1,openclaw:!1}}export{b as discoverCcSwitchConfiguredItems,H as getAiConfigService,r as getCcSwitchAppPaths,d as getCcSwitchSdk,O as getInstanceService,B as loadCcSwitchSdk,E as runCcSwitchAdapter,q as toSdkApps,U as toSdkAppsFromEnabledTools};
2
2
 
@@ -1,2 +1,2 @@
1
- import m from"node:fs/promises";import U from"node:path";import{getAcodeConfigFile as O,getRuntimeHomeDir as C,getUserHomeDir as A}from"../config.js";import{getInstanceAiConfigDebugLogger as I}from"../utils/instance-ai-config-debug-logger.js";const _=new Set(["apiKey","api_key","apikey","key","secret","token","password"]);function D(n){const o={...n};for(const r of Object.keys(o))if(_.has(r)){const s=o[r];typeof s=="string"&&s.length>0&&(o[r]=s.length>8?`${s.slice(0,4)}...${s.slice(-4)}`:"***")}else typeof o[r]=="object"&&o[r]!==null&&(o[r]=D(o[r]));return o}function S(){return{...process.env.ACODE_MODEL?{model:process.env.ACODE_MODEL}:{},...process.env.ACODE_BASE_URL?{baseURL:process.env.ACODE_BASE_URL}:{},...process.env.ACODE_API_KEY?{apiKey:process.env.ACODE_API_KEY}:{},...process.env.ACODE_EFFORT?{effort:process.env.ACODE_EFFORT}:{}}}async function w(n){try{const o=await m.readFile(n,"utf-8"),a=JSON.parse(o).provider?.default,e=a?.options;return{...a?.model?{model:a.model}:{},...e?.baseURL||e?.baseUrl?{baseURL:e.baseURL||e.baseUrl}:{},...e?.apiKey?{apiKey:e.apiKey}:{}}}catch{return{}}}function b(n,o,r,s){return o!==void 0?"api":r!==void 0?"env":s!==void 0?"file":"default"}async function N(n){const o=A(),r=O(o),s=U.join(C(),".aws-bridge","instances",n.agentId),a=U.join(s,"acode.json"),e=n.apiOverrides??{},t=S(),i=await w(r),l=e.model??t.model??i.model,g=e.baseURL??t.baseURL??i.baseURL,y=e.apiKey??t.apiKey??i.apiKey,u=e.effort??t.effort,f={};l&&(f.model=l),g&&(f.baseURL=g),y&&(f.apiKey=y),u&&(f.effort=u);const E={model:b("model",e.model,t.model,i.model),baseURL:b("baseURL",e.baseURL,t.baseURL,i.baseURL),apiKey:b("apiKey",e.apiKey,t.apiKey,i.apiKey),effort:b("effort",e.effort,t.effort,void 0)},R=I();try{await m.mkdir(s,{recursive:!0});let c={};try{const K=await m.readFile(r,"utf-8");c=JSON.parse(K)}catch{}const d=JSON.parse(JSON.stringify(c)),L=d.provider??{},v=L.default??{},p=v.options??{};l&&(p.model=l),g&&(p.baseURL=g),y&&(p.apiKey=y),u&&(p.effort=u),v.options=p,L.default=v,d.provider=L,await m.writeFile(a,JSON.stringify(d,null,2),"utf-8"),R.log({level:"info",category:"apply",message:"per-instance acode.json \u5DF2\u5199\u5165",source:"bridge",agentId:n.agentId,sessionId:n.sessionId,details:{perInstanceConfigPath:a,source:E}})}catch(c){const d=c instanceof Error?c.message:String(c);R.log({level:"error",category:"apply",message:`per-instance acode.json \u5199\u5165\u5931\u8D25: ${d}`,source:"bridge",agentId:n.agentId})}return{instanceConfig:{config:f,source:E},perInstanceConfigPath:a}}export{N as prepareAcodeInstanceConfig,D as redactForLog};
1
+ import u from"node:fs/promises";import R from"node:path";import{getAcodeConfigFile as O,getRuntimeHomeDir as U}from"../config.js";import{getInstanceAiConfigDebugLogger as C}from"../utils/instance-ai-config-debug-logger.js";const A=new Set(["apiKey","api_key","apikey","key","secret","token","password"]);function I(t){const e={...t};for(const r of Object.keys(e))if(A.has(r)){const n=e[r];typeof n=="string"&&n.length>0&&(e[r]=n.length>8?`${n.slice(0,4)}...${n.slice(-4)}`:"***")}else typeof e[r]=="object"&&e[r]!==null&&(e[r]=I(e[r]));return e}function _(){return{...process.env.ACODE_MODEL?{model:process.env.ACODE_MODEL}:{},...process.env.ACODE_BASE_URL?{baseURL:process.env.ACODE_BASE_URL}:{},...process.env.ACODE_API_KEY?{apiKey:process.env.ACODE_API_KEY}:{},...process.env.ACODE_EFFORT?{effort:process.env.ACODE_EFFORT}:{}}}async function D(t){try{const e=await u.readFile(t,"utf-8"),s=JSON.parse(e).provider?.default,o=s?.options;return{...s?.model?{model:s.model}:{},...o?.baseURL||o?.baseUrl?{baseURL:o.baseURL||o.baseUrl}:{},...o?.apiKey?{apiKey:o.apiKey}:{}}}catch{return{}}}function m(t,e,r,n){return e!==void 0?"api":r!==void 0?"env":n!==void 0?"file":"default"}async function k(t){const e=O(),r=R.join(U(),".aws-bridge","instances",t.agentId),n=R.join(r,"acode.json"),s=t.apiOverrides??{},o=_(),a=await D(e),p=s.model??o.model??a.model,l=s.baseURL??o.baseURL??a.baseURL,g=s.apiKey??o.apiKey??a.apiKey,y=s.effort??o.effort,c={};p&&(c.model=p),l&&(c.baseURL=l),g&&(c.apiKey=g),y&&(c.effort=y);const v={model:m("model",s.model,o.model,a.model),baseURL:m("baseURL",s.baseURL,o.baseURL,a.baseURL),apiKey:m("apiKey",s.apiKey,o.apiKey,a.apiKey),effort:m("effort",s.effort,o.effort,void 0)},E=C();try{await u.mkdir(r,{recursive:!0});let i={};try{const K=await u.readFile(e,"utf-8");i=JSON.parse(K)}catch{}const f=JSON.parse(JSON.stringify(i)),b=f.provider??{},L=b.default??{},d=L.options??{};p&&(d.model=p),l&&(d.baseURL=l),g&&(d.apiKey=g),y&&(d.effort=y),L.options=d,b.default=L,f.provider=b,await u.writeFile(n,JSON.stringify(f,null,2),"utf-8"),E.log({level:"info",category:"apply",message:"per-instance acode.json \u5DF2\u5199\u5165",source:"bridge",agentId:t.agentId,sessionId:t.sessionId,details:{perInstanceConfigPath:n,source:v}})}catch(i){const f=i instanceof Error?i.message:String(i);E.log({level:"error",category:"apply",message:`per-instance acode.json \u5199\u5165\u5931\u8D25: ${f}`,source:"bridge",agentId:t.agentId})}return{instanceConfig:{config:c,source:v},perInstanceConfigPath:n}}export{k as prepareAcodeInstanceConfig,I as redactForLog};
2
2
 
@@ -1,2 +1,2 @@
1
- import{promises as a}from"node:fs";import f from"node:os";import c from"node:path";import{renameWithRetry as w}from"./fs-utils.js";const p=c.join(f.homedir(),".acode","bg-tasks");function m(s){return String(s).replace(/[^a-zA-Z0-9_-]/g,"_")}function u(s){return c.join(p,m(s))}function h(s){return c.join(u(s),"state.json")}class S{constructor(){this.writeChains=new Map}chain(t){return this.writeChains.get(t)??Promise.resolve()}setChain(t,r){this.writeChains.set(t,r.catch(()=>{}))}async readSession(t){try{const r=await a.readFile(h(t),"utf-8"),e=JSON.parse(r);return{agentId:t,updatedAt:typeof e.updatedAt=="number"?e.updatedAt:0,tasks:Array.isArray(e.tasks)?e.tasks:[]}}catch(r){if(r?.code==="ENOENT")return null;if(r instanceof SyntaxError)return await this.backupCorrupt(t).catch(()=>{}),null;throw r}}async persistSession(t,r){const e=h(t),n=this.chain(t).then(async()=>{await a.mkdir(u(t),{recursive:!0});const o={agentId:t,updatedAt:Date.now(),tasks:r},i=`${e}.tmp`;await a.writeFile(i,JSON.stringify(o,null,2),"utf-8"),await w(i,e)});this.setChain(t,n),await n}async markNotified(t,r){const e=await this.readSession(t);if(!e)return;const n=new Set(r);let o=!1;for(const i of e.tasks)n.has(i.taskId)&&!i.notified&&(i.notified=!0,o=!0);o&&await this.persistSession(t,e.tasks)}outputPathFor(t,r){return c.join(u(t),`${r}.out`)}async deleteAgent(t){const r=this.chain(t).then(()=>a.rm(u(t),{recursive:!0,force:!0}));this.setChain(t,r),await r.catch(()=>{})}async listAgents(){try{return(await a.readdir(p,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>r.name)}catch(t){if(t?.code==="ENOENT")return[];throw t}}async backupCorrupt(t){const r=h(t),e=`${r}.corrupt-${Date.now()}`;await a.copyFile(r,e).catch(()=>{})}}export{S as BackgroundCommandStore};
1
+ import{promises as a}from"node:fs";import c from"node:path";import{renameWithRetry as f}from"./fs-utils.js";import{resolveAcodeHome as p}from"./paths.js";function w(s){return String(s).replace(/[^a-zA-Z0-9_-]/g,"_")}function u(s){return c.join(p(),"bg-tasks",w(s))}function h(s){return c.join(u(s),"state.json")}class k{constructor(){this.writeChains=new Map}chain(t){return this.writeChains.get(t)??Promise.resolve()}setChain(t,r){this.writeChains.set(t,r.catch(()=>{}))}async readSession(t){try{const r=await a.readFile(h(t),"utf-8"),e=JSON.parse(r);return{agentId:t,updatedAt:typeof e.updatedAt=="number"?e.updatedAt:0,tasks:Array.isArray(e.tasks)?e.tasks:[]}}catch(r){if(r?.code==="ENOENT")return null;if(r instanceof SyntaxError)return await this.backupCorrupt(t).catch(()=>{}),null;throw r}}async persistSession(t,r){const e=h(t),n=this.chain(t).then(async()=>{await a.mkdir(u(t),{recursive:!0});const o={agentId:t,updatedAt:Date.now(),tasks:r},i=`${e}.tmp`;await a.writeFile(i,JSON.stringify(o,null,2),"utf-8"),await f(i,e)});this.setChain(t,n),await n}async markNotified(t,r){const e=await this.readSession(t);if(!e)return;const n=new Set(r);let o=!1;for(const i of e.tasks)n.has(i.taskId)&&!i.notified&&(i.notified=!0,o=!0);o&&await this.persistSession(t,e.tasks)}outputPathFor(t,r){return c.join(u(t),`${r}.out`)}async deleteAgent(t){const r=this.chain(t).then(()=>a.rm(u(t),{recursive:!0,force:!0}));this.setChain(t,r),await r.catch(()=>{})}async listAgents(){try{return(await a.readdir(c.join(p(),"bg-tasks"),{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>r.name)}catch(t){if(t?.code==="ENOENT")return[];throw t}}async backupCorrupt(t){const r=h(t),e=`${r}.corrupt-${Date.now()}`;await a.copyFile(r,e).catch(()=>{})}}export{k as BackgroundCommandStore};
2
2
 
@@ -1,9 +1,9 @@
1
- import{randomUUID as g}from"node:crypto";import{promises as d}from"node:fs";import l from"node:os";import a from"node:path";const C=300,y=300,u=128*1024;function x(t){return t.replace(/\\/g,"/")}function o(t){return String(t).padStart(2,"0")}function b(t){if(!t)return 0;const e=t.replace(/\r\n/g,`
1
+ import{randomUUID as g}from"node:crypto";import{promises as d}from"node:fs";import c from"node:path";import{resolveAcodeHome as l}from"../paths.js";const C=300,h=300,u=128*1024;function x(t){return t.replace(/\\/g,"/")}function o(t){return String(t).padStart(2,"0")}function b(t){if(!t)return 0;const e=t.replace(/\r\n/g,`
2
2
  `).replace(/\r/g,`
3
3
  `),r=e.endsWith(`
4
4
  `)?e.slice(0,-1):e;return r?r.split(`
5
- `).length:1}function $(t){return a.join(l.homedir(),".acode","cmd-dist",t)}function M(t){return a.join(l.homedir(),".acode","cmd-dist",t)}function S(t,e,r,c){const i=e.getFullYear(),n=o(e.getMonth()+1),s=o(e.getDate()),m=o(e.getHours()),f=o(e.getMinutes()),p=`${i}${n}${s}-${m}${f}${o(e.getSeconds())}-${String(e.getMilliseconds()).padStart(3,"0")}-${process.pid}-${g().slice(0,8)}`;return a.join($(t),`${i}-${n}-${s}`,m,f,`${p}-${r}.${c}`)}async function T(t,e,r,c,i=new Date){const n=S(t,i,e,r);return await d.mkdir(a.dirname(n),{recursive:!0}),await d.writeFile(n,c,"utf-8"),n}async function L(t){const e=$(t);try{await d.rm(e,{recursive:!0,force:!0})}catch{}}function I(t){return[`Command: ${t.commandText}`,`Command file: ${t.commandFilePath??"null"}`,`Command line count: ${t.commandLineCount}`,`CWD: ${t.cwd}`,`Started: ${t.startedAt.toISOString()}`,`Ended: ${t.endedAt.toISOString()}`,`Exit code: ${t.exitCode??"null"}`,`Signal: ${t.signal??"null"}`,`Timed out: ${t.timedOut}`,`Timed out by inactivity: ${t.inactivityTimedOut}`,"","--- stdout ---",t.stdout,"","--- stderr ---",t.stderr].join(`
5
+ `).length:1}function $(t){return c.join(l(),"cmd-dist",t)}function M(t){return c.join(l(),"cmd-dist",t)}function S(t,e,r,a){const i=e.getFullYear(),n=o(e.getMonth()+1),s=o(e.getDate()),m=o(e.getHours()),f=o(e.getMinutes()),p=`${i}${n}${s}-${m}${f}${o(e.getSeconds())}-${String(e.getMilliseconds()).padStart(3,"0")}-${process.pid}-${g().slice(0,8)}`;return c.join($(t),`${i}-${n}-${s}`,m,f,`${p}-${r}.${a}`)}async function T(t,e,r,a,i=new Date){const n=S(t,i,e,r);return await d.mkdir(c.dirname(n),{recursive:!0}),await d.writeFile(n,a,"utf-8"),n}async function L(t){const e=$(t);try{await d.rm(e,{recursive:!0,force:!0})}catch{}}function I(t){return[`Command: ${t.commandText}`,`Command file: ${t.commandFilePath??"null"}`,`Command line count: ${t.commandLineCount}`,`CWD: ${t.cwd}`,`Started: ${t.startedAt.toISOString()}`,`Ended: ${t.endedAt.toISOString()}`,`Exit code: ${t.exitCode??"null"}`,`Signal: ${t.signal??"null"}`,`Timed out: ${t.timedOut}`,`Timed out by inactivity: ${t.inactivityTimedOut}`,"","--- stdout ---",t.stdout,"","--- stderr ---",t.stderr].join(`
6
6
  `)}function _(t,e){return[`[ACode] \u547D\u4EE4\u8F93\u51FA\u8D85\u8FC7 ${C} \u884C\uFF08\u5171 ${e} \u884C\uFF09\uFF0C\u5B8C\u6574\u8F93\u51FA\u5DF2\u5199\u5165: ${x(t)}`,"[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",""].join(`
7
7
  `)}function P(t){return Buffer.byteLength(t,"utf-8")<=u?{text:t}:{text:Buffer.from(t,"utf-8").subarray(0,u).toString("utf-8")+`
8
- ...[truncated after ${u} bytes]`}}export{C as COMMAND_OUTPUT_SPILLOVER_LINE_LIMIT,y as LONG_COMMAND_LINE_LIMIT,u as MAX_COMMAND_OUTPUT_BYTES,M as buildAcodeAgentDir,$ as buildAcodeCmdDistDir,I as buildCommandOutputSpilloverContent,L as cleanupAcodeCmdDist,b as countOutputLines,_ as formatCommandOutputSpilloverStdout,x as toDisplayPath,P as truncateOutput,T as writeCommandArtifactFile};
8
+ ...[truncated after ${u} bytes]`}}export{C as COMMAND_OUTPUT_SPILLOVER_LINE_LIMIT,h as LONG_COMMAND_LINE_LIMIT,u as MAX_COMMAND_OUTPUT_BYTES,M as buildAcodeAgentDir,$ as buildAcodeCmdDistDir,I as buildCommandOutputSpilloverContent,L as cleanupAcodeCmdDist,b as countOutputLines,_ as formatCommandOutputSpilloverStdout,x as toDisplayPath,P as truncateOutput,T as writeCommandArtifactFile};
9
9
 
@@ -0,0 +1,2 @@
1
+
2
+ export declare function resolveAcodeHome(): string;
@@ -0,0 +1,2 @@
1
+ import o from"node:os";import e from"node:path";function c(){return String(process.env.ACODE_HOME||"").trim()||e.join(o.homedir(),".acode")}export{c as resolveAcodeHome};
2
+
@@ -115,6 +115,8 @@ export declare class ACodeRuntime extends EventEmitter {
115
115
 
116
116
  private buildAskUserQuestionDeps;
117
117
 
118
+ private buildAllocatableToolList;
119
+
118
120
  private buildSubAgentToolDeps;
119
121
 
120
122
  private buildAwaitCompleteDeps;