aws-runtime-bridge 1.9.119 → 1.9.122

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 (96) hide show
  1. package/README.md +2 -0
  2. package/dist/adapter/AcodeSdkAdapter.d.ts +18 -0
  3. package/dist/adapter/AcodeSdkAdapter.js +5 -5
  4. package/dist/adapter/types.d.ts +4 -0
  5. package/dist/adapter/types.js +1 -1
  6. package/dist/browser/built-in-browser-tools.js +1 -1
  7. package/dist/desktop/built-in-desktop-tools.d.ts +49 -0
  8. package/dist/desktop/built-in-desktop-tools.js +2 -0
  9. package/dist/desktop/desktop-mcp-client.d.ts +47 -0
  10. package/dist/desktop/desktop-mcp-client.js +3 -0
  11. package/dist/index.js +1 -1
  12. package/dist/routes/dashboard.js +4 -4
  13. package/dist/routes/file-browser.js +1 -1
  14. package/dist/routes/git.d.ts +39 -0
  15. package/dist/routes/git.js +33 -25
  16. package/dist/routes/instance.js +1 -1
  17. package/dist/routes/jdks.d.ts +2 -0
  18. package/dist/routes/jdks.js +2 -0
  19. package/dist/routes/launch.d.ts +6 -0
  20. package/dist/routes/launch.js +30 -0
  21. package/dist/routes/terminal.js +30 -30
  22. package/dist/services/change-cache-retention.d.ts +5 -0
  23. package/dist/services/change-cache-retention.js +2 -0
  24. package/dist/services/desktop-mcp-manager.d.ts +47 -0
  25. package/dist/services/desktop-mcp-manager.js +2 -0
  26. package/dist/services/instance-features.d.ts +6 -0
  27. package/dist/services/instance-features.js +1 -1
  28. package/dist/services/jdk-scanner.d.ts +20 -0
  29. package/dist/services/jdk-scanner.js +2 -0
  30. package/dist/services/launch-manager.d.ts +181 -0
  31. package/dist/services/launch-manager.js +12 -0
  32. package/dist/services/launch-metrics.d.ts +89 -0
  33. package/dist/services/launch-metrics.js +4 -0
  34. package/dist/services/launch-streams.d.ts +24 -0
  35. package/dist/services/launch-streams.js +11 -0
  36. package/dist/services/mcp-launch-binding-queue.js +1 -1
  37. package/dist/services/panel-auth.d.ts +10 -0
  38. package/dist/services/panel-auth.js +1 -1
  39. package/dist/services/panel-env.d.ts +5 -0
  40. package/dist/services/panel-env.js +2 -0
  41. package/dist/services/port-detector.d.ts +3 -0
  42. package/dist/services/port-detector.js +6 -0
  43. package/dist/services/runtime-lifecycle-policy.d.ts +1 -0
  44. package/dist/services/runtime-lifecycle-policy.js +1 -1
  45. package/dist/services/tunnel-client.js +1 -1
  46. package/dist/services/workspace-files.d.ts +31 -0
  47. package/dist/services/workspace-files.js +1 -1
  48. package/dist/services/workspaceTaskChangeWatcher.d.ts +2 -0
  49. package/dist/services/workspaceTaskChangeWatcher.js +3 -3
  50. package/package/acode/dist/built-in-file-tools.d.ts +2 -0
  51. package/package/acode/dist/runtime.d.ts +20 -0
  52. package/package/acode/dist/runtime.js +27 -27
  53. package/package/acode/dist/sub-agent-manager.d.ts +4 -0
  54. package/package/acode/dist/sub-agent-manager.js +1 -1
  55. package/package/acode/dist/sub-agent-tools.d.ts +6 -0
  56. package/package/acode/dist/sub-agent-tools.js +39 -10
  57. package/package/acode/dist/sub-agent-types.d.ts +2 -0
  58. package/package/acode/dist/tool-allocation.d.ts +55 -0
  59. package/package/acode/dist/tool-allocation.js +2 -0
  60. package/package/acode/dist/types.d.ts +6 -0
  61. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +24 -0
  62. package/package/aws-client-agent-mcp/dist/agent-client.js +1 -1
  63. package/package/aws-client-agent-mcp/dist/agent-client.test.js +19 -5
  64. package/package/aws-client-agent-mcp/dist/context-manager.test.js +6 -6
  65. package/package/aws-client-agent-mcp/dist/http-client.d.ts +2 -0
  66. package/package/aws-client-agent-mcp/dist/http-client.js +1 -1
  67. package/package/aws-client-agent-mcp/dist/index.js +1 -1
  68. package/package/aws-client-agent-mcp/dist/launch-config-tools.test.d.ts +1 -0
  69. package/package/aws-client-agent-mcp/dist/launch-config-tools.test.js +106 -0
  70. package/package/aws-client-agent-mcp/dist/logger.d.ts +4 -0
  71. package/package/aws-client-agent-mcp/dist/logger.js +2 -2
  72. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +21 -0
  73. package/package/aws-client-agent-mcp/dist/mcp-server.js +25 -25
  74. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +24 -16
  75. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +20 -0
  76. package/package/aws-client-agent-mcp/dist/mcp-tools.js +8 -8
  77. package/package/aws-client-agent-mcp/dist/mcp-tools.test.js +55 -1
  78. package/package/aws-client-agent-mcp/dist/memory-store.test.js +5 -1
  79. package/package/aws-client-agent-mcp/dist/parent-lifecycle.d.ts +10 -0
  80. package/package/aws-client-agent-mcp/dist/parent-lifecycle.js +2 -0
  81. package/package/aws-client-agent-mcp/dist/parent-lifecycle.test.d.ts +1 -0
  82. package/package/aws-client-agent-mcp/dist/parent-lifecycle.test.js +81 -0
  83. package/package/aws-client-agent-mcp/dist/status-reporter.js +1 -1
  84. package/package/aws-client-agent-mcp/dist/types.d.ts +4 -0
  85. package/package/aws-client-agent-mcp/dist/watchdog-worker.d.ts +1 -0
  86. package/package/aws-client-agent-mcp/dist/watchdog-worker.js +3 -0
  87. package/package/aws-client-agent-mcp/dist/watchdog.d.ts +17 -0
  88. package/package/aws-client-agent-mcp/dist/watchdog.js +2 -0
  89. package/package/aws-client-agent-mcp/dist/watchdog.test.d.ts +1 -0
  90. package/package/aws-client-agent-mcp/dist/watchdog.test.js +124 -0
  91. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +4 -0
  92. package/package/aws-client-agent-mcp/dist/websocket-client.js +1 -1
  93. package/package/aws-client-agent-mcp/dist/websocket-client.test.js +83 -6
  94. package/package/aws-client-agent-mcp/package.json +1 -1
  95. package/package.json +4 -1
  96. package/scripts/ensure-build-tools.mjs +141 -0
@@ -1,54 +1,54 @@
1
- import{spawn as We}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 Xe}from"uuid";import Ce from"axios";import{adapterRegistry as w,getToolActionInfo as ye,isTransientClipboardPasteFilePath as $e,redactTransientClipboardPastePaths as q,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 Ve,getAgentFeatures as Ye}from"../services/instance-features.js";import{getAiConfigService as Ze}from"../services/cc-switch-sdk.js";import{prepareAcodeInstanceConfig as et,redactForLog as te}from"../services/instance-ai-config-service.js";import{enqueueMcpLaunchBinding as tt}from"../services/mcp-launch-binding-queue.js";import{resolveSchedulerBaseUrlFromToken as _e}from"../services/auto-register.js";import{findClaudeCodeProcesses as nt,isProcessRunning as rt}from"../services/process-detector.js";import{bridgeEventBuffer as De,sendOutput as Q,sendQuestionRequest as ot,sendStatus as _}from"../services/session-output.js";import{getAllPushStats as st,startHeartbeatScheduler as it}from"../services/event-delta-pusher.js";import{forgetSession as v,onSdkToolUseEnd as at,onSdkToolUseStart as ct}from"../services/sdk-tool-file-change-recorder.js";import{findPersistedSessionByAgentId as ut,removePersistedSession as F,savePersistedSessions as dt,updatePersistedSessionAutoCommands as lt,updatePersistedSessionRuntimeState as mt,upsertPersistedSession as ft}from"../services/terminal-persistence.js";import{getInstanceAiConfigDebugLogger as pt}from"../utils/instance-ai-config-debug-logger.js";import{logger as h}from"../utils/logger.js";const A=Qe();function Pe(e){const t=e.header("X-Runtime-Token");return t&&t.trim()?t.trim():(e.header("Authorization")||"").match(/^Bearer\s+(.+)$/i)?.[1]?.trim()||void 0}const f=new Map,gt=45e3,ne=new Map;function yt(e){if(ne.has(e))return;const t=setInterval(()=>{const n=f.get(e);if(!n){x(e);return}const r=n.currentRuntimeStatus;if(r!=="thinking"&&r!=="tool_using"&&r!=="compacting"){x(e);return}_(n.agentId,e,r,void 0,void 0,{runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl}).catch(()=>{})},gt);ne.set(e,t)}function x(e){const t=ne.get(e);t&&(clearInterval(t),ne.delete(e))}const Re=4e3,ht=`
1
+ import{spawn as We}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 Xe}from"express";import{v4 as Qe}from"uuid";import Ce from"axios";import{adapterRegistry as w,getToolActionInfo as ye,isTransientClipboardPasteFilePath as _e,redactTransientClipboardPastePaths as v,registerSdkProviders as Ve,resolveSdkProviderIdByCommand as Ge}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 Je,getAgentFeatures as Ye,isFeatureEnabled as Ze,LAUNCH_ITEM_FEATURE_KEY as et}from"../services/instance-features.js";import{setPanelEnvVars as tt}from"../services/panel-env.js";import{setChangeCacheRetentionDays as nt}from"../services/change-cache-retention.js";import{getAiConfigService as rt}from"../services/cc-switch-sdk.js";import{prepareAcodeInstanceConfig as ot,redactForLog as te}from"../services/instance-ai-config-service.js";import{enqueueMcpLaunchBinding as st}from"../services/mcp-launch-binding-queue.js";import{resolveSchedulerBaseUrlFromToken as $e}from"../services/auto-register.js";import{findClaudeCodeProcesses as it,isProcessRunning as at}from"../services/process-detector.js";import{bridgeEventBuffer as De,sendOutput as X,sendQuestionRequest as ct,sendStatus as _}from"../services/session-output.js";import{getAllPushStats as ut,startHeartbeatScheduler as dt}from"../services/event-delta-pusher.js";import{forgetSession as q,onSdkToolUseEnd as lt,onSdkToolUseStart as mt}from"../services/sdk-tool-file-change-recorder.js";import{findPersistedSessionByAgentId as ft,removePersistedSession as F,savePersistedSessions as pt,updatePersistedSessionAutoCommands as gt,updatePersistedSessionRuntimeState as yt,upsertPersistedSession as ht}from"../services/terminal-persistence.js";import{getInstanceAiConfigDebugLogger as It}from"../utils/instance-ai-config-debug-logger.js";import{logger as h}from"../utils/logger.js";const A=Xe();function Re(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,St=45e3,ne=new Map;function At(e){if(ne.has(e))return;const n=setInterval(()=>{const t=p.get(e);if(!t){x(e);return}const r=t.currentRuntimeStatus;if(r!=="thinking"&&r!=="tool_using"&&r!=="compacting"){x(e);return}_(t.agentId,e,r,void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl}).catch(()=>{})},St);ne.set(e,n)}function x(e){const n=ne.get(e);n&&(clearInterval(n),ne.delete(e))}const Pe=4e3,Tt=`
2
2
 
3
3
  \u8BF7\u6C42\u4F53:
4
- `;function Ie(e){if(e==null||typeof e!="object"||Array.isArray(e))return;const t=e,n={};return typeof t.model=="string"&&t.model.trim()&&(n.model=t.model.trim()),typeof t.baseURL=="string"&&t.baseURL.trim()&&(n.baseURL=t.baseURL.trim()),typeof t.apiKey=="string"&&t.apiKey.trim()&&(n.apiKey=t.apiKey.trim()),typeof t.effort=="string"&&t.effort.trim()&&(n.effort=t.effort.trim()),n}const It=`
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 kt=`
5
5
 
6
6
  \u8BF7\u6C42\u5934:
7
- `,K=new Set;async function St(e,t){const n=[],r=[],o=j.join(e,".agentswork","memory");try{const c=(await N.readdir(o)).filter(u=>u.endsWith(".json")),d=await Promise.all(c.map(async u=>{try{const l=await N.readFile(j.join(o,u),"utf-8");return JSON.parse(l)}catch{return h.warn("[loadAgentStartupMemories] Failed to parse memory file: %s",j.join(o,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",p=(l.content||"").trim();p&&(m==="recently_memory"?n.push({title:l.title,content:p,uri:l.uri||""}):m==="agent_memory"&&r.push({title:l.title,content:p,uri:l.uri||""}))}}catch{h.debug("[loadAgentStartupMemories] \u65E0\u6CD5\u8BFB\u53D6\u8BB0\u5FC6\u76EE\u5F55: %s",o)}if(n.length===0&&r.length===0&&t?.schedulerBaseUrl&&t?.runtimeAccessToken&&t?.agentId){const a=`${t.schedulerBaseUrl.replace(/\/+$/,"")}/mcp/call`,c={"Content-Type":"application/json","X-Runtime-Token":t.runtimeAccessToken,Authorization:`Bearer ${t.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:t.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 p=m.value;if(!Array.isArray(p))continue;const T=d[l]==="recently_memory"?n:r;for(const y of p){const g=(y.content||"").trim();g&&T.push({title:y.title,content:g,uri:y.uri||""})}}(n.length>0||r.length>0)&&h.info(`[loadAgentStartupMemories] Loaded ${n.length} task(s) and ${r.length} memory(s) from server for ${t.agentId}`)}const s=10;n.sort((a,c)=>c.uri.localeCompare(a.uri)),r.sort((a,c)=>c.uri.localeCompare(a.uri));const i=[];if(n.length>0){const c=n.slice(0,s).map((d,u)=>`${d.title?`\u3010${d.title}\u3011`:`\u6761\u76EE ${u+1}`}
7
+ `,K=new Set;async function wt(e,n){const t=[],r=[],o=j.join(e,".agentswork","memory");try{const c=(await N.readdir(o)).filter(u=>u.endsWith(".json")),d=await Promise.all(c.map(async u=>{try{const l=await N.readFile(j.join(o,u),"utf-8");return JSON.parse(l)}catch{return h.warn("[loadAgentStartupMemories] Failed to parse memory file: %s",j.join(o,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"&&r.push({title:l.title,content:f,uri:l.uri||""}))}}catch{h.debug("[loadAgentStartupMemories] \u65E0\u6CD5\u8BFB\u53D6\u8BB0\u5FC6\u76EE\u5F55: %s",o)}if(t.length===0&&r.length===0&&n?.schedulerBaseUrl&&n?.runtimeAccessToken&&n?.agentId){const a=`${n.schedulerBaseUrl.replace(/\/+$/,"")}/mcp/call`,c={"Content-Type":"application/json","X-Runtime-Token":n.runtimeAccessToken,Authorization:`Bearer ${n.runtimeAccessToken}`},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:r;for(const y of f){const g=(y.content||"").trim();g&&T.push({title:y.title,content:g,uri:y.uri||""})}}(t.length>0||r.length>0)&&h.info(`[loadAgentStartupMemories] Loaded ${t.length} task(s) and ${r.length} memory(s) from server for ${n.agentId}`)}const s=10;t.sort((a,c)=>c.uri.localeCompare(a.uri)),r.sort((a,c)=>c.uri.localeCompare(a.uri));const i=[];if(t.length>0){const c=t.slice(0,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
 
11
- `)}`),n.length>s&&i.push(`... \u53CA\u53E6\u5916 ${n.length-s} \u6761\u77ED\u671F\u8BB0\u5FC6`)}if(r.length>0){const c=r.slice(0,s).map(d=>{const u=d.title?`\u3010${d.title}\u3011`:"";return u?`${u}
11
+ `)}`),t.length>s&&i.push(`... \u53CA\u53E6\u5916 ${t.length-s} \u6761\u77ED\u671F\u8BB0\u5FC6`)}if(r.length>0){const c=r.slice(0,s).map(d=>{const u=d.title?`\u3010${d.title}\u3011`:"";return u?`${u}
12
12
  ${d.content}`:d.content});i.push(`\u3010agent\u8BA4\u77E5\u3011
13
13
  ${c.join(`
14
14
 
15
15
  `)}`),r.length>s&&i.push(`... \u53CA\u53E6\u5916 ${r.length-s} \u6761 agent \u8BA4\u77E5`)}if(i.length!==0)return i.join(`
16
16
 
17
- `)}function At(e,t){return e!=="acode"?{supported:!1,statusCode:400,error:"context reset without restart is only supported by ACode"}:t?{supported:!0}:{supported:!1,statusCode:500,error:"ACode adapter does not expose resetContext"}}function Tt(e){return e!=="acode"}function kt(e){const t=typeof e=="object"&&e!==null&&"suppressStatus"in e&&e.suppressStatus===!0,n=typeof e=="object"&&e!==null&&"reason"in e&&typeof e.reason=="string"&&e.reason.trim()?e.reason.trim():void 0;return{statusNotified:!t,reason:n}}function re(e){const t=e?.usage;if(!t)return;const n=Number.isFinite(t.inputTokens)?t.inputTokens:0,r=Number.isFinite(t.outputTokens)?t.outputTokens:0;if(n<=0&&r<=0&&!t.contextLimit&&!t.maxOutput&&!t.inputLimit&&!t.compactionThreshold)return;const o={inputTokens:n,outputTokens:r,...t.contextLimit?{contextLimit:t.contextLimit}:{},...t.maxOutput?{maxOutput:t.maxOutput}:{},...t.inputLimit?{inputLimit:t.inputLimit}:{},...t.compactionThreshold?{compactionThreshold:t.compactionThreshold}:{},...t.cacheHitTokens?{cacheHitTokens:t.cacheHitTokens}:{},...t.cacheMissTokens?{cacheMissTokens:t.cacheMissTokens}:{}};return process.env.ACODE_TOKEN_DEBUG==="1"&&(o.inputTokens>0||o.outputTokens>0||o.cacheHitTokens!==void 0||o.cacheMissTokens!==void 0)&&console.log(`[TokenDebug][Terminal] resolveStatusChangeUsage: input=${o.inputTokens} output=${o.outputTokens} cacheHit=${o.cacheHitTokens??"(none)"} cacheMiss=${o.cacheMissTokens??"(none)"} actionType=${e?.actionType??"(none)"}`),o}function wt(e,t){const n=String(e||"").trim().toLowerCase(),r=String(t?.actionType||"").trim().toLowerCase();return n==="tool_using"&&r==="idle"?t?{status:"waiting_input",actionInfo:t}:{status:"waiting_input"}:t?{status:e,actionInfo:t}:{status:e}}const X=new Map,bt="utf-8",Me="utf-8",Ee=300,xe=6e4;function G(e){return String(e).padStart(2,"0")}function Ct(e,t=new Date){const n=t.getFullYear(),r=G(t.getMonth()+1),o=G(t.getDate()),s=G(t.getHours()),i=G(t.getMinutes()),a=`${n}${r}${o}-${s}${i}${G(t.getSeconds())}-${String(t.getMilliseconds()).padStart(3,"0")}`;return j.join(be.homedir(),".acode","cmd-dist",e,`${n}-${r}-${o}`,s,i,`${a}-cmd.out`)}function $t(e){if(!e)return 0;const t=e.replace(/\r\n/g,`
17
+ `)}function bt(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 Ct(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 re(e){const n=e?.usage;if(!n)return;const t=Number.isFinite(n.inputTokens)?n.inputTokens:0,r=Number.isFinite(n.outputTokens)?n.outputTokens:0;if(t<=0&&r<=0&&!n.contextLimit&&!n.maxOutput&&!n.inputLimit&&!n.compactionThreshold)return;const o={inputTokens:t,outputTokens:r,...n.contextLimit?{contextLimit:n.contextLimit}:{},...n.maxOutput?{maxOutput:n.maxOutput}:{},...n.inputLimit?{inputLimit:n.inputLimit}:{},...n.compactionThreshold?{compactionThreshold:n.compactionThreshold}:{},...n.cacheHitTokens?{cacheHitTokens:n.cacheHitTokens}:{},...n.cacheMissTokens?{cacheMissTokens:n.cacheMissTokens}:{}};return process.env.ACODE_TOKEN_DEBUG==="1"&&(o.inputTokens>0||o.outputTokens>0||o.cacheHitTokens!==void 0||o.cacheMissTokens!==void 0)&&console.log(`[TokenDebug][Terminal] resolveStatusChangeUsage: input=${o.inputTokens} output=${o.outputTokens} cacheHit=${o.cacheHitTokens??"(none)"} cacheMiss=${o.cacheMissTokens??"(none)"} actionType=${e?.actionType??"(none)"}`),o}function $t(e,n){const t=String(e||"").trim().toLowerCase(),r=String(n?.actionType||"").trim().toLowerCase();return t==="tool_using"&&r==="idle"?n?{status:"waiting_input",actionInfo:n}:{status:"waiting_input"}:n?{status:e,actionInfo:n}:{status:e}}const Q=new Map,Dt="utf-8",Ee="utf-8",Me=300,xe=6e4;function V(e){return String(e).padStart(2,"0")}function Rt(e,n=new Date){const t=n.getFullYear(),r=V(n.getMonth()+1),o=V(n.getDate()),s=V(n.getHours()),i=V(n.getMinutes()),a=`${t}${r}${o}-${s}${i}${V(n.getSeconds())}-${String(n.getMilliseconds()).padStart(3,"0")}`;return j.join(be.homedir(),".acode","cmd-dist",e,`${t}-${r}-${o}`,s,i,`${a}-cmd.out`)}function Pt(e){if(!e)return 0;const n=e.replace(/\r\n/g,`
18
18
  `).replace(/\r/g,`
19
- `),n=t.endsWith(`
20
- `)?t.slice(0,-1):t;return n?n.split(`
21
- `).length:1}function _t(e,t=Ee){return`\r
22
- [ACode] \u547D\u4EE4\u8F93\u51FA\u8D85\u8FC7 ${t} \u884C\uFF0C\u5B8C\u6574\u8F93\u51FA\u5DF2\u5199\u5165: ${e}\r
19
+ `),t=n.endsWith(`
20
+ `)?n.slice(0,-1):n;return t?t.split(`
21
+ `).length:1}function Et(e,n=Me){return`\r
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 Dt(e=xe){return`\r
24
+ `}function Mt(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 Le(e){const t=e.outputPath||Ct(e.agentId,e.startedAt);return e.outputPath=t,await N.mkdir(j.dirname(t),{recursive:!0}),await N.writeFile(t,e.chunks.join(""),"utf-8"),t}function Pt(e){return String(e??"").replace(/\r/g,`
27
- `).trim()}function Rt(e=process.platform,t=process.env){const n=t.AWS_TERMINAL_OUTPUT_ENCODING?.trim();return n||(e==="win32"?bt:Me)}function Ue(e=Rt()){if(e!=="utf-8")try{return new ee(e,{fatal:!1})}catch{return new ee(Me,{fatal:!1})}return Mt()}function Mt(){let e=null,t=null,n=null;const r=[];function o(s){try{return new ee(s,{fatal:!1})}catch{return new ee("utf-8",{fatal:!1})}}return{decode(s,i){if(s!=null&&r.push(s instanceof ArrayBuffer?Buffer.from(s):Buffer.isBuffer(s)?s:Buffer.from(s.buffer,s.byteOffset,s.byteLength)),n==="gb18030")return t||(t=o("gb18030")),t.decode(s,i);e||(e=o("utf-8"));const a=e.decode(s,i);if(n===null&&a.includes("\uFFFD")){n="gb18030",t=o("gb18030");const c=Buffer.concat(r);return t.decode(c)}return n===null&&!i?.stream&&(n="utf-8"),a}}}function oe(e,t,n=!1){return n?e.decode():!t||t.length===0?"":e.decode(t,{stream:!0})}function Et(e){const t=e.trim().match(/^cd(?:\s+(.*))?$/i);if(!t)return;const n=t[1]?.trim();if(!n)return null;const r=n.replace(/^\/d\s+/i,"").trim();return r.startsWith('"')&&r.endsWith('"')||r.startsWith("'")&&r.endsWith("'")?r.slice(1,-1):r}function xt(e){const t=X.get(e.sessionId);if(t)return t;const n={currentDirectory:e.workspacePath,runningProcess:null};return X.set(e.sessionId,n),n}function je(e){for(const t of f.values())if(t.agentId===e)return t}async function Lt(e){const t=w.get(e.providerId||"claude-code"),n=se(t.getSessionStatus(e.sessionId),e.currentRuntimeStatus,e.currentRuntimeActionType);return{sessionId:e.sessionId,status:n,runtimeStatus:n,runtimeActionType:e.currentRuntimeActionType,runtimeActionLabel:e.currentRuntimeActionLabel,runtimeActionDetail:e.currentRuntimeActionDetail,agentId:e.agentId,workspacePath:e.workspacePath,command:e.config.command,mode:"sdk",providerSessionId:t.getProviderSessionId(e.sessionId),reused:!0}}function se(e,t,n){const r=String(e||"").trim();if(r){const s=String(t||"").trim(),i=String(n||"").trim().toLowerCase();return r.toLowerCase()==="tool_using"&&s.toLowerCase()==="waiting_input"&&i==="idle"?s:r}return String(t||"").trim()||"running"}function Ut(e,t=rt){return e.pid?t(e.pid)?Fe(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 Kn(e){const t=je(e);if(!t)h.info(`[cleanupSdkSessionByAgentId] No active SDK session found for agentId=${e}, cleaning residual state anyway`);else{const n=t.sessionId;return h.info(`[cleanupSdkSessionByAgentId] Cleaning up SDK session for agentId=${e}, sessionId=${n}`),x(n),f.delete(n),v(n),ie(n),F(n).catch(r=>{h.warn(`[cleanupSdkSessionByAgentId] Failed to remove persisted session for agentId=${e}: ${r}`)}),n}K.has(e)&&(K.delete(e),h.info(`[cleanupSdkSessionByAgentId] Released startingAgents lock for agentId=${e}`))}function ie(e){const t=X.get(e);if(!t?.runningProcess){X.delete(e);return}try{t.runningProcess.kill()}catch{}finally{t.runningProcess=null,X.delete(e)}}function b(e,t){t&&(e.seq+=1,Q(e.agentId,t,e.sessionId,e.seq,void 0,{runtimeAccessToken:e.runtimeAccessToken,schedulerBaseUrl:e.schedulerBaseUrl}).catch(()=>{}))}function Se(e){return`\x1B[36m${e}>\x1B[0m `}function jt(e,t){return t==="~"?be.homedir():j.resolve(e,t)}async function Bt(e,t,n){const r=Et(n);if(r===void 0)return!1;if(r===null)return b(e,`${t.currentDirectory}\r
28
- `),!0;const o=jt(t.currentDirectory,r);try{return(await N.stat(o)).isDirectory()?(t.currentDirectory=o,b(e,`${t.currentDirectory}\r
26
+ `}async function Le(e){const n=e.outputPath||Rt(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 Lt(e=process.platform,n=process.env){const t=n.AWS_TERMINAL_OUTPUT_ENCODING?.trim();return t||(e==="win32"?Dt:Ee)}function Ue(e=Lt()){if(e!=="utf-8")try{return new ee(e,{fatal:!1})}catch{return new ee(Ee,{fatal:!1})}return Ut()}function Ut(){let e=null,n=null,t=null;const r=[];function o(s){try{return new ee(s,{fatal:!1})}catch{return new ee("utf-8",{fatal:!1})}}return{decode(s,i){if(s!=null&&r.push(s instanceof ArrayBuffer?Buffer.from(s):Buffer.isBuffer(s)?s:Buffer.from(s.buffer,s.byteOffset,s.byteLength)),t==="gb18030")return n||(n=o("gb18030")),n.decode(s,i);e||(e=o("utf-8"));const a=e.decode(s,i);if(t===null&&a.includes("\uFFFD")){t="gb18030",n=o("gb18030");const c=Buffer.concat(r);return n.decode(c)}return t===null&&!i?.stream&&(t="utf-8"),a}}}function oe(e,n,t=!1){return t?e.decode():!n||n.length===0?"":e.decode(n,{stream:!0})}function jt(e){const n=e.trim().match(/^cd(?:\s+(.*))?$/i);if(!n)return;const t=n[1]?.trim();if(!t)return null;const r=t.replace(/^\/d\s+/i,"").trim();return r.startsWith('"')&&r.endsWith('"')||r.startsWith("'")&&r.endsWith("'")?r.slice(1,-1):r}function Bt(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 je(e){for(const n of p.values())if(n.agentId===e)return n}async function Ot(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 r=String(e||"").trim();if(r){const s=String(n||"").trim(),i=String(t||"").trim().toLowerCase();return r.toLowerCase()==="tool_using"&&s.toLowerCase()==="waiting_input"&&i==="idle"?s:r}return String(n||"").trim()||"running"}function Nt(e,n=at){return e.pid?n(e.pid)?Fe(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 Vn(e){const n=je(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}`),x(t),p.delete(t),q(t),ie(t),F(t).catch(r=>{h.warn(`[cleanupSdkSessionByAgentId] Failed to remove persisted session for agentId=${e}: ${r}`)}),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 vt(e,n){return n==="~"?be.homedir():j.resolve(e,n)}async function qt(e,n,t){const r=jt(t);if(r===void 0)return!1;if(r===null)return b(e,`${n.currentDirectory}\r
28
+ `),!0;const o=vt(n.currentDirectory,r);try{return(await N.stat(o)).isDirectory()?(n.currentDirectory=o,b(e,`${n.currentDirectory}\r
29
29
  `),!0):(b(e,`cd: not a directory: ${o}\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 Ot(e,t){const n=f.get(e);if(!n)throw new Error("SDK session not found");const r=Pt(t),o=xt(n);if(!r)return{started:!1,cwd:o.currentDirectory};if(o.runningProcess)throw new Error("A terminal command is already running for this session");const s=q(r);if(b(n,`${Se(o.currentDirectory)}${s}\r
32
- `),$e(r))return b(n,`[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(n,Se(o.currentDirectory)),{started:!1,cwd:o.currentDirectory};if(await Bt(n,o,r))return{started:!1,cwd:o.currentDirectory};await _(n.agentId,e,"tool_using",{actionType:"bash",actionLabel:"\u7EC8\u7AEF\u547D\u4EE4",actionDetail:s},void 0,{runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl});const a=We(r,{cwd:o.currentDirectory,shell:!0,env:Be(n.agentId,n.workspacePath,process.env,n.config.envOverrides)});o.runningProcess=a;const c=Ue(),d=Ue(),u=n.providerId==="acode",l={agentId:n.agentId,startedAt:new Date,chunks:[],spilled:!1};let m;const p=()=>{m&&(clearTimeout(m),m=void 0)},T=()=>{p(),m=setTimeout(()=>{o.runningProcess===a&&(b(n,Dt()),a.kill())},xe)},y=(g,C=!0)=>{if(g&&(u&&l.chunks.push(g),u&&C&&T(),!(u&&l.spilled))){if(u&&$t(l.chunks.join(""))>Ee){l.spilled=!0,Le(l).then($=>{b(n,_t($))}).catch($=>{const E=$ instanceof Error?$.message:String($);b(n,`\r
34
- [ACode] \u547D\u4EE4\u8F93\u51FA\u843D\u76D8\u5931\u8D25: ${E}\r
35
- `)});return}b(n,g)}};return u&&T(),a.stdout.on("data",g=>{y(oe(c,g))}),a.stderr.on("data",g=>{y(oe(d,g))}),a.on("error",g=>{b(n,`\r
31
+ `),!0}}async function Ft(e,n){const t=p.get(e);if(!t)throw new Error("SDK session not found");const r=xt(n),o=Bt(t);if(!r)return{started:!1,cwd:o.currentDirectory};if(o.runningProcess)throw new Error("A terminal command is already running for this session");const s=v(r);if(b(t,`${Se(o.currentDirectory)}${s}\r
32
+ `),_e(r))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(o.currentDirectory)),{started:!1,cwd:o.currentDirectory};if(await qt(t,o,r))return{started:!1,cwd:o.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=We(r,{cwd:o.currentDirectory,shell:!0,env:Be(t.agentId,t.workspacePath,process.env,t.config.envOverrides)});o.runningProcess=a;const c=Ue(),d=Ue(),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(()=>{o.runningProcess===a&&(b(t,Mt()),a.kill())},xe)},y=(g,C=!0)=>{if(g&&(u&&l.chunks.push(g),u&&C&&T(),!(u&&l.spilled))){if(u&&Pt(l.chunks.join(""))>Me){l.spilled=!0,Le(l).then($=>{b(t,Et($))}).catch($=>{const M=$ instanceof Error?$.message:String($);b(t,`\r
34
+ [ACode] \u547D\u4EE4\u8F93\u51FA\u843D\u76D8\u5931\u8D25: ${M}\r
35
+ `)});return}b(t,g)}};return u&&T(),a.stdout.on("data",g=>{y(oe(c,g))}),a.stderr.on("data",g=>{y(oe(d,g))}),a.on("error",g=>{b(t,`\r
36
36
  [Terminal Error] ${g.message}\r
37
- `)}),a.on("close",(g,C)=>{p(),o.runningProcess=null,y(oe(c,void 0,!0),!1),y(oe(d,void 0,!0),!1),l.spilled&&Le(l).catch($=>{const E=$ instanceof Error?$.message:String($);b(n,`\r
38
- [ACode] \u547D\u4EE4\u8F93\u51FA\u6700\u7EC8\u843D\u76D8\u5931\u8D25: ${E}\r
39
- `)}),g&&g!==0?b(n,`\r
37
+ `)}),a.on("close",(g,C)=>{f(),o.runningProcess=null,y(oe(c,void 0,!0),!1),y(oe(d,void 0,!0),!1),l.spilled&&Le(l).catch($=>{const M=$ instanceof Error?$.message:String($);b(t,`\r
38
+ [ACode] \u547D\u4EE4\u8F93\u51FA\u6700\u7EC8\u843D\u76D8\u5931\u8D25: ${M}\r
39
+ `)}),g&&g!==0?b(t,`\r
40
40
  [exit ${g}]\r
41
- `):C&&b(n,`\r
41
+ `):C&&b(t,`\r
42
42
  [signal ${C}]\r
43
- `),b(n,Se(o.currentDirectory)),_(n.agentId,e,"waiting_input",void 0,void 0,{runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl})}),{started:!0,cwd:o.currentDirectory}}function Be(e,t,n,r){const o={};for(const[s,i]of Object.entries(n))i!==void 0&&(o[s]=i);if(t&&(o.AWS_WORKSPACE_PATH=String(t)),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&&(o[a]=c)}return o.AWS_AGENT_ID=String(e),o.AWS_MCP_CLAIM_LAUNCH_BINDING="true",o}function Nt(e){const t=e.trim(),n=t[0],r=t[t.length-1];return(n==='"'||n==="'")&&n===r?t.slice(1,-1):t}async function qt(e){const t=String(e);if(!$e(t))return t;const n=Nt(t);return j.isAbsolute(n)?N.readFile(n,"utf-8"):t}function Oe(e,t){const n={};for(const o of[e?.env,t])if(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&&(n[a]=c)}const r=n.ANTHROPIC_MODEL?.trim()||n.CODEX_MODEL?.trim()||void 0;return{envOverrides:n,model:r}}async function vt(){try{return await Ze().readClaudeCodeConfig()}catch(e){return console.warn(`[Runtime] Failed to read saved ClaudeCode AI config: ${e.message}`),{}}}function Ft(e){if(e==null)return;const n=(typeof e=="string"?e:JSON.stringify(e,null,2)).trim();if(n)return n.length<=Re?n:`${n.slice(0,Re)}
44
- ...\uFF08\u7ED3\u679C\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`}function Kt(e){try{const t=JSON.parse(e);if(t&&typeof t=="object"&&!Array.isArray(t))return["directMessages","groupMessages","messages"].some(n=>Array.isArray(t[n])&&t[n].length>0)}catch{}return e.trim().length>0}function zt(e){if(e.data.actionType==="mcp")return!0;const n=String(e.data.toolName||"").toLowerCase();return n.startsWith("mcp__")||n.includes("-mcp__")||n.includes("mcp_")}function Ht(e){if(e.type!=="tool_use_end")return;const t=Ft(e.data.toolResult??e.data.actionResult);if(!t)return;const n=ye(e.data.toolName,e.data.toolInput),r=e.data.actionType||n.actionType;if(!(r==="idle"&&!Kt(t)))return r==="mcp"&&zt(e)?{actionType:"mcp",actionLabel:"MCP\u8FD4\u56DE",actionDetail:e.data.actionDetail||e.data.toolName,actionId:e.data.actionId||e.data.toolUseId,actionResult:t}:{actionType:r,actionLabel:e.data.actionLabel||n.actionLabel,actionDetail:e.data.actionDetail||n.actionDetail||e.data.toolName,actionId:e.data.actionId||e.data.toolUseId,actionResult:t}}function Wt(e){if(e.type==="ai_request"){const t=e.data.model?` ${e.data.model}`:"",n=e.data.lastUserMessagePreview?`\uFF1A${e.data.lastUserMessagePreview}`:"";return`\r
45
- [ACode] \u6B63\u5728\u8BF7\u6C42\u6A21\u578B${t}${n}\r
43
+ `),b(t,Se(o.currentDirectory)),_(t.agentId,e,"waiting_input",void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl})}),{started:!0,cwd:o.currentDirectory}}function Be(e,n,t,r){const o={};for(const[s,i]of Object.entries(t))i!==void 0&&(o[s]=i);if(n&&(o.AWS_WORKSPACE_PATH=String(n)),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&&(o[a]=c)}return o.AWS_AGENT_ID=String(e),o.AWS_MCP_CLAIM_LAUNCH_BINDING="true",Ze(e,et)&&(o.AWS_LAUNCH_CONFIG_TOOLS="1"),o}function Kt(e){const n=e.trim(),t=n[0],r=n[n.length-1];return(t==='"'||t==="'")&&t===r?n.slice(1,-1):n}async function zt(e){const n=String(e);if(!_e(n))return n;const t=Kt(n);return j.isAbsolute(t)?N.readFile(t,"utf-8"):n}function Oe(e,n){const t={};for(const o of[e?.env,n])if(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&&(t[a]=c)}const r=t.ANTHROPIC_MODEL?.trim()||t.CODEX_MODEL?.trim()||void 0;return{envOverrides:t,model:r}}async function Ht(){try{return await rt().readClaudeCodeConfig()}catch(e){return console.warn(`[Runtime] Failed to read saved ClaudeCode AI config: ${e.message}`),{}}}function Wt(e){if(e==null)return;const t=(typeof e=="string"?e:JSON.stringify(e,null,2)).trim();if(t)return t.length<=Pe?t:`${t.slice(0,Pe)}
44
+ ...\uFF08\u7ED3\u679C\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`}function Xt(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 Qt(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 Vt(e){if(e.type!=="tool_use_end")return;const n=Wt(e.data.toolResult??e.data.actionResult);if(!n)return;const t=ye(e.data.toolName,e.data.toolInput),r=e.data.actionType||t.actionType;if(!(r==="idle"&&!Xt(n)))return r==="mcp"&&Qt(e)?{actionType:"mcp",actionLabel:"MCP\u8FD4\u56DE",actionDetail:e.data.actionDetail||e.data.toolName,actionId:e.data.actionId||e.data.toolUseId,actionResult:n}:{actionType:r,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:e.data.actionDetail||t.actionDetail||e.data.toolName,actionId:e.data.actionId||e.data.toolUseId,actionResult:n}}function Gt(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
+ [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 Qt(e){const t=Jt(e);return{sourceEventType:e.type,logCategory:"acode",...Gt(e),...t?{logLevel:Xt(e),logMessage:t}:{}}}function Xt(e){return e.type==="error"?"error":e.type==="command_output"&&e.data.stream==="stderr"?"warn":"info"}function Gt(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 Jt(e){if(e.type==="ai_request"){const t=e.data.model||"unknown-model",n=e.data.endpoint?` @ ${e.data.endpoint}`:"",r=typeof e.data.toolCount=="number"?`, tools=${e.data.toolCount}`:"";return`AI request started: ${t}${n}${r}`}if(e.type==="tool_use_start")return Ne(e,"\u5F00\u59CB");if(e.type==="tool_use_end")return Ne(e,"\u5B8C\u6210");if(e.type==="command_output")return Zt(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 Vt=/\x1b\[[0-9;?]*[a-zA-Z]/g;function Yt(e){return e.replace(Vt,"")}function Zt(e){const t=typeof e.data.stream=="string"?e.data.stream:"mixed",n=typeof e.data.sequence=="number"?` #${e.data.sequence}`:"",r=Yt(String(e.data.text||"")).replace(/\s+/g," ").trim(),o=r.length>240?`${r.slice(0,240)}...`:r;return`\u547D\u4EE4\u8F93\u51FA(${t}${n}): ${o||"(empty)"}`}function Ne(e,t){const n=ye(e.data.toolName,e.data.toolInput),r=e.data.actionLabel||n.actionLabel||"\u8C03\u7528\u5DE5\u5177",o=qe(e,n);return o?`${t}${r}: ${o}`:`${t}${r}: ${e.data.actionDetail||e.data.toolName||"tool"}`}function qe(e,t){const n=e.data.toolInput;return t.actionType==="bash"?en(n)||e.data.actionDetail||t.actionDetail:t.actionType==="read_file"||t.actionType==="edit_file"||t.actionType==="write_file"?tn(n)||e.data.actionDetail||t.actionDetail:e.data.actionDetail||t.actionDetail}function en(e){const t=Ae(e?.command,e?.cmd);if(t)return t;if(Array.isArray(e?.argv)){const n=e.argv.map(r=>String(r??"").trim()).filter(Boolean).join(" ");return n?q(n):void 0}return Ae(e?.args)}function tn(e){const t=ve(e?.paths);return t.length>0?t.length===1?t[0]:`${t.length}\u4E2A\u6587\u4EF6: ${t.join(", ")}`:Ae(e?.file_path,e?.filePath,e?.path,e?.target_file,e?.targetFile)}function Ae(...e){for(const t of e){if(typeof t=="string"&&t.trim())return q(t.trim());if(Array.isArray(t)){const n=ve(t)[0];if(n)return n}}}function ve(e){return Array.isArray(e)?e.map(t=>typeof t=="string"?t.trim():"").filter(Boolean).map(t=>q(t)):[]}function nn(e){if(!(!e||Object.keys(e).length===0))try{const t=q(JSON.stringify(e,null,2));return t.length>8e3?`${t.slice(0,8e3)}
49
- ...\uFF08\u8F93\u5165\u53C2\u6570\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`:t}catch{return}}function rn(e){const t=[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),n=on(e.requestHeaders),r=t.join(`
50
- `)||"ACode \u6B63\u5728\u53D1\u9001 AI \u8BF7\u6C42",o=n.length>0?`${It}${n.join(`
51
- `)}`:"",s=e.requestBody?`${ht}${e.requestBody}`:"";return`${r}${o}${s}`}function on(e){return e?Object.entries(e).map(([t,n])=>`${t}: ${n}`).filter(t=>t.trim().length>0):[]}function sn(e,t){return String(t||"").trim().toLowerCase()!=="waiting_input"?!1:e.type==="thinking"||e.type==="text_delta"}function an(e){for(const t of["estimatedContextTokens","contextTokens","context_tokens","contextUsedTokens","context_used_tokens"]){const n=e[t],r=Number(n);if(Number.isFinite(r)&&r>0)return r}}function cn(e,t){if(!sn(e,t)){if(e.type==="ai_request"){const n=an(e.data);return{status:"thinking",actionInfo:{actionType:"ai_request",actionLabel:"AI\u8BF7\u6C42",actionDetail:rn(e.data),...n!==void 0?{usage:{inputTokens:n,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 n=ye(e.data.toolName,e.data.toolInput),r=qe(e,n),o=nn(e.data.toolInput);return e.data.actionType==="idle"||n.actionType==="idle"?{status:"waiting_input",actionInfo:{actionType:e.data.actionType||n.actionType,actionLabel:e.data.actionLabel||n.actionLabel,actionDetail:r||e.data.actionDetail||n.actionDetail||e.data.toolName,actionInput:o,actionId:e.data.actionId||e.data.toolUseId}}:{status:"tool_using",actionInfo:{actionType:e.data.actionType||n.actionType,actionLabel:e.data.actionLabel||n.actionLabel,actionDetail:r||e.data.actionDetail||n.actionDetail||e.data.toolName,actionInput:o,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:t||"waiting_input",actionInfo:{actionType:"runtime_capabilities",actionLabel:e.data.actionLabel||"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:e.data.actionDetail}}}}const L=new Map,ae=new Map,ce=new Map,J=new Map,un=20,dn=500,ln=3e4;async function ue(e,t=ln,n=2){for(let r=0;r<=n;r++){const o=new AbortController;let s;try{const i=e(o.signal);i.catch(()=>{}),await Promise.race([i,new Promise((a,c)=>{s=setTimeout(()=>{o.abort(),c(new Error(`sendOutput timeout after ${t}ms`))},t)})]),s&&clearTimeout(s);return}catch(i){s&&clearTimeout(s);const a=i instanceof Error?i.message:String(i);if(r<n){const c=1e3*(r+1);h.warn(`sendOutput attempt ${r+1}/${n+1} failed (${a}), retrying in ${c}ms...`),await new Promise(d=>setTimeout(d,c));continue}h.warn(`sendOutput failed after ${n+1} attempts (${a}), giving up to unblock serial queue`)}}}function de(e,t){const n=t?`${e}:${t}`:void 0;let r,o;if(n)r=J.get(n),o=n;else{const p=[];for(const[T,y]of J)T.startsWith(e+":")&&y.buffer&&p.push(y.sourceEventType);for(const T of p)de(e,T);return}if(!r||!r.buffer)return;r.timer=null;const s=r.buffer,i=r.seq,a=r.entry,c=r.sourceEventType;r.buffer="",o&&J.delete(o);const d={sourceEventType:c,logCategory:"acode"},u={runtimeAccessToken:a.runtimeAccessToken,schedulerBaseUrl:a.schedulerBaseUrl},m=(L.get(e)??Promise.resolve()).then(()=>ue(p=>Q(a.agentId,s,e,i,d,u,p)),()=>ue(p=>Q(a.agentId,s,e,i,d,u,p)));L.set(e,m),m.finally(()=>{L.get(e)===m&&L.delete(e)})}function mn(e,t){const n=Wt(e);if(!n)return;t.seq+=1;const r=t.seq,o=Qt(e),s={runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl};if((e.type==="command_output"||e.type==="text_delta"||e.type==="thinking")&&n.length<un){const c=`${e.sessionId}:${e.type}`;let d=J.get(c);if(d||(d={buffer:"",seq:0,timer:null,entry:t,sourceEventType:e.type}),d.buffer+=n,d.seq=r,d.entry=t,!d.timer){const u=e.sessionId,l=e.type;d.timer=setTimeout(()=>de(u,l),dn)}J.set(c,d);return}de(e.sessionId);const a=(L.get(e.sessionId)??Promise.resolve()).then(()=>ue(c=>Q(t.agentId,n,e.sessionId,r,o,s,c)),()=>ue(c=>Q(t.agentId,n,e.sessionId,r,o,s,c)));L.set(e.sessionId,a),a.finally(()=>{L.get(e.sessionId)===a&&L.delete(e.sessionId)})}function Fe(e){return Je(e)}let Ke=!1;function fn(){Ke||(Ge(w,pn),it(),Ke=!0)}function pn(e,t){e.on("event",n=>{const r=f.get(n.sessionId);if(r){if(n.type==="tool_use_start"?ct(r.sessionId,n.data.toolUseId||n.data.actionId,n.data.toolInput,n.data.toolName,r.workspacePath):n.type==="tool_use_end"&&at(n,{sessionId:r.sessionId,agentId:r.agentId,workspacePath:r.workspacePath,providerId:r.providerId}),console.log(`[${t.displayName} Adapter] Event: ${n.type} for session ${n.sessionId}`),!(n.type==="thinking"||n.type==="text_delta"||n.type==="tool_use_start"||n.type==="context_compaction"||n.type==="ai_request")){n.type==="runtime_capabilities"&&n.data.actionDetail&&(r.cachedCapabilitiesActionDetail=n.data.actionDetail);const i=cn(n,r.currentRuntimeStatus);i&&_(r.agentId,n.sessionId,i.status,i.actionInfo,re(i.actionInfo),{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl},n.timestamp?new Date(n.timestamp).getTime():void 0,n.type)}mn(n,r);const s=Ht(n);if(s){const i={runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl},a=n.timestamp?new Date(n.timestamp).getTime():void 0;String(n.data?.toolName||"").toLowerCase()==="browser_launch"?(async()=>{for(let u=0;u<3;u++){if(await _(r.agentId,n.sessionId,"tool_result",s,void 0,i,a,n.type)!==void 0)return;u<2&&await new Promise(m=>setTimeout(m,3e3*(u+1)))}})().catch(d=>console.warn("[Runtime] browser_launch sendStatus retry exhausted:",d)):_(r.agentId,n.sessionId,"tool_result",s,void 0,i,a,n.type)}}}),e.on("status-change",(n,r,o)=>{const s=f.get(n);if(s){de(n),r==="thinking"||r==="tool_using"||r==="compacting"?yt(n):x(n);const i=wt(r,o);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(`[${t.displayName} Adapter] Status changed: ${i.status} for agent ${s.agentId}`,i.actionInfo||""),mt(n,{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 p=(ae.get(n)??Promise.resolve()).then(async()=>{for(let y=0;y<=2;y++){if(await _(s.agentId,n,i.status,l,re(i.actionInfo),{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})!==void 0)return;y<2&&(h.warn(`[${t.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(`[${t.displayName}] compaction sendStatus failed after 3 attempts, event may be lost`)}).catch(T=>{h.warn(`[${t.displayName}] compaction status chain error:`,T)});ae.set(n,p),p.finally(()=>{ae.get(n)===p&&ae.delete(n)})}else{const m=u&&!i.actionInfo?.actionType;if(l?.actionType==="idle"||s.currentRuntimeActionType==="idle"&&u){const y=(ce.get(n)??Promise.resolve()).then(async()=>{for(let C=0;C<=2;C++){if(await _(s.agentId,n,i.status,m?void 0:l,re(i.actionInfo),{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})!==void 0)return;C<2&&await new Promise(E=>setTimeout(E,1e3*(C+1)))}h.warn(`[${t.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(`[${t.displayName}] idle status chain error:`,g)});ce.set(n,y),y.finally(()=>{ce.get(n)===y&&ce.delete(n)})}else _(s.agentId,n,i.status,m?void 0:l,re(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(`[${t.displayName} Adapter] Re-sending cached runtime_capabilities for agent ${s.agentId} (session stabilized to waiting_input)`),_(s.agentId,n,"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",n=>{const r=f.get(n.sessionId);r&&(console.log(`[${t.displayName} Adapter] AskUserQuestion for agent ${r.agentId}`),ot(r.agentId,n.sessionId,Array.isArray(n.questions)?n.questions:[],{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl},n.toolCallId))}),e.on("permission-request",n=>{const r=f.get(n.sessionId);if(r){console.log(`[${t.displayName} Adapter] Permission request: ${n.toolName} for agent ${r.agentId}`);const o=n.toolInput?q(JSON.stringify(n.toolInput).slice(0,400)):void 0;_(r.agentId,n.sessionId,"waiting_input",{actionType:"other",actionLabel:"\u6743\u9650\u786E\u8BA4",actionDetail:o||n.toolName},void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl})}})}A.post("/start",S,async(e,t)=>{const{agentId:n,workspacePath:r,mode:o="sdk"}=e.body||{};if(!n||!r){t.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()||_e(Pe(e))||void 0;tt({agentId:String(n),workspacePath:String(r),serverUrl:e.body?.serverUrl||s,runtimeAccessToken:e.body?.runtimeAccessToken,userId:e.body?.userId,schedulerBaseUrl:s}),e.body?.runtimeFeatures!=null&&(Ve(String(n),e.body.runtimeFeatures),console.log(`[Runtime] agent ${n} \u542F\u52A8\u4E0B\u53D1\u80FD\u529B\u5F00\u5173: ${JSON.stringify(Ye(String(n)))}`)),o&&o!=="sdk"&&console.warn(`[Runtime] Unsupported runtime mode "${o}" requested for agent ${n}; starting SDK session instead.`),await gn(e,t)});async function gn(e,t){const{agentId:n,workspacePath:r,command:o,autoAccept:s=!0,initialPrompt:i,systemPrompt:a,globalPrompt:c,rolePrompt:d,memory:u,mcpConfigPath:l,extraMcpServers:m,envOverrides:p,idleInputAutoCommand:T,nonInputAutoCommand:y,model:g,instanceAiConfig:C,subAgentModel:$,subAgentEffort:E,scopeKey:Te,browserAllowPrivate:ke}=e.body||{},z=pt();z.log({level:"info",category:"launch",message:"startSdkSession: \u6536\u5230\u542F\u52A8\u8BF7\u6C42",source:"bridge",agentId:String(n||"").trim()||void 0,details:{reqBodyKeys:Object.keys(e.body||{}),perInstanceAiConfig:C?te(C):null,perAgentModel:g??null}});let D=null;const I=String(n||"").trim(),le=String(e.body?.runtimeAccessToken||"").trim()||void 0,B=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||_e(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(fn(),!I){t.status(400).json({error:"agentId is required"});return}const O=je(I);if(O){t.json(await Lt(O));return}const k=await ut(I);if(k){const P=Ut(k);if(!P.reusable)console.warn(`[Runtime] Ignoring stale persisted SDK session for agentId=${I}, sessionId=${k.sessionId}, reason=${P.reason}`),await F(k.sessionId);else{const R=se(k.runtimeStatus,k.runtimeStatus,k.runtimeActionType);t.json({sessionId:k.sessionId,status:R,runtimeStatus:R,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)){t.status(409).json({error:"SDK session is already starting for this agent"});return}K.add(I);const Sn=(o||"acode").toLowerCase(),M=Fe(o),ze=w.get(M);D=Xe();const He=M==="claude-code"?await vt():null,V=Oe(M==="claude-code"?He:null,p),H=M==="acode"?g?String(g).trim():void 0:(()=>{const P=g?String(g).trim():void 0,R=V.model?String(V.model).trim():void 0;return P||R})();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:V.model??null,resolvedModel:H??null,providerId:M,note:M==="acode"?"adapter handles full priority":"request > global"}});const me={...V.envOverrides};H&&(me.ANTHROPIC_MODEL=H,me.CODEX_MODEL=H);let W,fe=l;if(M==="acode"){const P=C||{},R=await et({apiOverrides:Ie(P)??void 0,agentId:I,sessionId:D??void 0,runtimeBridgeBaseUrl:B});W=R.instanceConfig.config,fe=R.perInstanceConfigPath,z.log({level:"info",category:"apply",message:"prepareAcodeInstanceConfig \u5B8C\u6210",source:"bridge",agentId:I,sessionId:D??void 0,details:{sanitizedApiOverrides:Ie(P)?te(Ie(P)):null,resolvedInstanceAiConfig:W?te(W):null,perInstanceConfigPath:fe,instanceConfigSources:R.instanceConfig.source??null}})}let we=a||void 0,pe,ge,Y;if(M==="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 P=await St(r,{schedulerBaseUrl:B,runtimeAccessToken:le,agentId:I});P&&(Y=P,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 R=[c,d,u,a].filter(Z=>typeof Z=="string"&&Z.trim().length>0).map(Z=>Z.trim());we=R.length>0?R.join(`
48
+ `:void 0}function Jt(e){const n=en(e);return{sourceEventType:e.type,logCategory:"acode",...Zt(e),...n?{logLevel:Yt(e),logMessage:n}:{}}}function Yt(e){return e.type==="error"?"error":e.type==="command_output"&&e.data.stream==="stderr"?"warn":"info"}function Zt(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 en(e){if(e.type==="ai_request"){const n=e.data.model||"unknown-model",t=e.data.endpoint?` @ ${e.data.endpoint}`:"",r=typeof e.data.toolCount=="number"?`, tools=${e.data.toolCount}`:"";return`AI request started: ${n}${t}${r}`}if(e.type==="tool_use_start")return Ne(e,"\u5F00\u59CB");if(e.type==="tool_use_end")return Ne(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 tn=/\x1b\[[0-9;?]*[a-zA-Z]/g;function nn(e){return e.replace(tn,"")}function rn(e){const n=typeof e.data.stream=="string"?e.data.stream:"mixed",t=typeof e.data.sequence=="number"?` #${e.data.sequence}`:"",r=nn(String(e.data.text||"")).replace(/\s+/g," ").trim(),o=r.length>240?`${r.slice(0,240)}...`:r;return`\u547D\u4EE4\u8F93\u51FA(${n}${t}): ${o||"(empty)"}`}function Ne(e,n){const t=ye(e.data.toolName,e.data.toolInput),r=e.data.actionLabel||t.actionLabel||"\u8C03\u7528\u5DE5\u5177",o=ve(e,t);return o?`${n}${r}: ${o}`:`${n}${r}: ${e.data.actionDetail||e.data.toolName||"tool"}`}function ve(e,n){const t=e.data.toolInput;return n.actionType==="bash"?on(t)||e.data.actionDetail||n.actionDetail:n.actionType==="read_file"||n.actionType==="edit_file"||n.actionType==="write_file"?sn(t)||e.data.actionDetail||n.actionDetail:e.data.actionDetail||n.actionDetail}function on(e){const n=Ae(e?.command,e?.cmd);if(n)return n;if(Array.isArray(e?.argv)){const t=e.argv.map(r=>String(r??"").trim()).filter(Boolean).join(" ");return t?v(t):void 0}return Ae(e?.args)}function sn(e){const n=qe(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=qe(n)[0];if(t)return t}}}function qe(e){return Array.isArray(e)?e.map(n=>typeof n=="string"?n.trim():"").filter(Boolean).map(n=>v(n)):[]}function an(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 cn(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=un(e.requestHeaders),r=n.join(`
50
+ `)||"ACode \u6B63\u5728\u53D1\u9001 AI \u8BF7\u6C42",o=t.length>0?`${kt}${t.join(`
51
+ `)}`:"",s=e.requestBody?`${Tt}${e.requestBody}`:"";return`${r}${o}${s}`}function un(e){return e?Object.entries(e).map(([n,t])=>`${n}: ${t}`).filter(n=>n.trim().length>0):[]}function dn(e,n){return String(n||"").trim().toLowerCase()!=="waiting_input"?!1:e.type==="thinking"||e.type==="text_delta"}function ln(e){for(const n of["estimatedContextTokens","contextTokens","context_tokens","contextUsedTokens","context_used_tokens"]){const t=e[n],r=Number(t);if(Number.isFinite(r)&&r>0)return r}}function mn(e,n){if(!dn(e,n)){if(e.type==="ai_request"){const t=ln(e.data);return{status:"thinking",actionInfo:{actionType:"ai_request",actionLabel:"AI\u8BF7\u6C42",actionDetail:cn(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),r=ve(e,t),o=an(e.data.toolInput);return e.data.actionType==="idle"||t.actionType==="idle"?{status:"waiting_input",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:r||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:o,actionId:e.data.actionId||e.data.toolUseId}}:{status:"tool_using",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:r||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:o,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 L=new Map,ae=new Map,ce=new Map,G=new Map,fn=20,pn=500,gn=3e4;async function ue(e,n=gn,t=2){for(let r=0;r<=t;r++){const o=new AbortController;let s;try{const i=e(o.signal);i.catch(()=>{}),await Promise.race([i,new Promise((a,c)=>{s=setTimeout(()=>{o.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(r<t){const c=1e3*(r+1);h.warn(`sendOutput attempt ${r+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 r,o;if(t)r=G.get(t),o=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(!r||!r.buffer)return;r.timer=null;const s=r.buffer,i=r.seq,a=r.entry,c=r.sourceEventType;r.buffer="",o&&G.delete(o);const d={sourceEventType:c,logCategory:"acode"},u={runtimeAccessToken:a.runtimeAccessToken,schedulerBaseUrl:a.schedulerBaseUrl},m=(L.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)));L.set(e,m),m.finally(()=>{L.get(e)===m&&L.delete(e)})}function yn(e,n){const t=Gt(e);if(!t)return;n.seq+=1;const r=n.seq,o=Jt(e),s={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl};if((e.type==="command_output"||e.type==="text_delta"||e.type==="thinking")&&t.length<fn){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=r,d.entry=n,!d.timer){const u=e.sessionId,l=e.type;d.timer=setTimeout(()=>de(u,l),pn)}G.set(c,d);return}de(e.sessionId);const a=(L.get(e.sessionId)??Promise.resolve()).then(()=>ue(c=>X(n.agentId,t,e.sessionId,r,o,s,c)),()=>ue(c=>X(n.agentId,t,e.sessionId,r,o,s,c)));L.set(e.sessionId,a),a.finally(()=>{L.get(e.sessionId)===a&&L.delete(e.sessionId)})}function Fe(e){return Ge(e)}let Ke=!1;function hn(){Ke||(Ve(w,In),dt(),Ke=!0)}function In(e,n){e.on("event",t=>{const r=p.get(t.sessionId);if(r){if(t.type==="tool_use_start"?mt(r.sessionId,t.data.toolUseId||t.data.actionId,t.data.toolInput,t.data.toolName,r.workspacePath):t.type==="tool_use_end"&&lt(t,{sessionId:r.sessionId,agentId:r.agentId,workspacePath:r.workspacePath,providerId:r.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&&(r.cachedCapabilitiesActionDetail=t.data.actionDetail);const i=mn(t,r.currentRuntimeStatus);i&&_(r.agentId,t.sessionId,i.status,i.actionInfo,re(i.actionInfo),{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl},t.timestamp?new Date(t.timestamp).getTime():void 0,t.type)}yn(t,r);const s=Vt(t);if(s){const i={runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.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 _(r.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 _(r.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)):_(r.agentId,t.sessionId,"tool_result",s,void 0,i,a,t.type)}}}),e.on("status-change",(t,r,o)=>{const s=p.get(t);if(s){de(t),r==="thinking"||r==="tool_using"||r==="compacting"?At(t):x(t);const i=$t(r,o);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||""),yt(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,re(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,re(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,re(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 r=p.get(t.sessionId);r&&(console.log(`[${n.displayName} Adapter] AskUserQuestion for agent ${r.agentId}`),ct(r.agentId,t.sessionId,Array.isArray(t.questions)?t.questions:[],{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl},t.toolCallId))}),e.on("permission-request",t=>{const r=p.get(t.sessionId);if(r){console.log(`[${n.displayName} Adapter] Permission request: ${t.toolName} for agent ${r.agentId}`);const o=t.toolInput?v(JSON.stringify(t.toolInput).slice(0,400)):void 0;_(r.agentId,t.sessionId,"waiting_input",{actionType:"other",actionLabel:"\u6743\u9650\u786E\u8BA4",actionDetail:o||t.toolName},void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl})}})}A.post("/start",S,async(e,n)=>{const{agentId:t,workspacePath:r,mode:o="sdk"}=e.body||{};if(!t||!r){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()||$e(Re(e))||void 0;st({agentId:String(t),workspacePath:String(r),serverUrl:e.body?.serverUrl||s,runtimeAccessToken:e.body?.runtimeAccessToken,userId:e.body?.userId,schedulerBaseUrl:s}),e.body?.runtimeFeatures!=null&&(Je(String(t),e.body.runtimeFeatures),console.log(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u80FD\u529B\u5F00\u5173: ${JSON.stringify(Ye(String(t)))}`)),e.body?.envVars!=null&&typeof e.body.envVars=="object"&&(tt(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&&(nt(e.body.changeCacheRetentionDays),console.log(`[Runtime] agent ${t} \u4E0B\u53D1\u53D8\u66F4\u7F13\u5B58\u4FDD\u7559\u5929\u6570: ${e.body.changeCacheRetentionDays??"\u4E0D\u6E05\u7406"}`)),o&&o!=="sdk"&&console.warn(`[Runtime] Unsupported runtime mode "${o}" requested for agent ${t}; starting SDK session instead.`),await Sn(e,n)});async function Sn(e,n){const{agentId:t,workspacePath:r,command:o,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=It();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()||$e(Re(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(hn(),!I){n.status(400).json({error:"agentId is required"});return}const O=je(I);if(O){n.json(await Ot(O));return}const k=await ft(I);if(k){const R=Nt(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 wn=(o||"acode").toLowerCase(),E=Fe(o),ze=w.get(E);D=Qe();const He=E==="claude-code"?await Ht():null,J=Oe(E==="claude-code"?He: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 ot({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 wt(r,{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:o||"acode",workingDirectory:r,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 E=="string"&&E.trim()?{subAgentEffort:E.trim()}:{},extraMcpServers:m||{},envOverrides:Be(String(n),String(r),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(),f.set(D,{agentId:I,workspacePath:r,sessionId:D,config:U,providerId:M,seq:0,runtimeAccessToken:le,schedulerBaseUrl:B}),t.json({sessionId:D,status:"starting",runtimeStatus:"starting",agentId:I,workspacePath:r,command:U.command,mode:"sdk"}),yn({sessionId:D,agentId:I,config:U,adapter:ze,providerId:M,idleInputAutoCommand:T,nonInputAutoCommand:y,runtimeAccessToken:le,requestedSchedulerBaseUrl:B})}catch(O){if(D&&(x(D),f.delete(D),v(D)),I&&K.delete(I),!t.headersSent){const k=O instanceof Error?O.message:String(O);t.status(500).json({error:`Failed to start SDK session: ${k}`})}}}async function yn(e){const{sessionId:t,agentId:n,config:r,adapter:o,providerId:s,idleInputAutoCommand:i,nonInputAutoCommand:a,runtimeAccessToken:c,requestedSchedulerBaseUrl:d}=e;try{await o.startSession(t,r),(i||a)&&o.setIdleCommands?.(t,{idleInputCommand:i||"",nonInputCommand:a||""});let u;if(Tt(s))try{if(await new Promise(m=>setTimeout(m,500)),u=o.getSessionPid?.(t),!u){const p=(await nt()).find(T=>T.agentId===n||T.cwd===r.workingDirectory||T.command.includes(r.workingDirectory));p&&(u=p.pid,console.log(`[Runtime] Found SDK process PID: ${u} for agentId=${n}`))}}catch(m){console.warn(`[Runtime] Failed to get SDK PID for agentId=${n}:`,m)}const l=se(o.getSessionStatus(t),f.get(t)?.currentRuntimeStatus,f.get(t)?.currentRuntimeActionType);await ft({sessionId:t,agentId:n,workspacePath:r.workingDirectory,command:r.command,startedAt:new Date().toISOString(),status:"running",runtimeStatus:l,mode:"sdk",pid:u,providerSessionId:o.getProviderSessionId(t)}),u&&await he().startProcess({agentId:n,sessionId:t,pid:u,mode:"sdk",workspacePath:r.workingDirectory,command:r.command}),await hn({agentId:n,sessionId:t,sdkPid:u,status:l,schedulerBaseUrl:d,runtimeAccessToken:c})}catch(u){x(t),f.delete(t),v(t),await F(t);const l=u instanceof Error?u.message:String(u);console.error(`[Runtime] Background SDK session startup failed for agentId=${n}: ${l}`),await In({agentId:n,sessionId:t,schedulerBaseUrl:d,runtimeAccessToken:c,errorMessage:l})}finally{K.delete(n)}}async function hn(e){const{agentId:t,sessionId:n,sdkPid:r,status:o,schedulerBaseUrl:s,runtimeAccessToken:i}=e;if(!s||!i){h.debug(`[Runtime] notifyServerSessionReady skipped: missing schedulerBaseUrl or runtimeAccessToken for agentId=${t}`);return}const a=`${s.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Ce.post(a,{agentId:t,sessionId:n,status:o,pid:r},{headers:{"X-Runtime-Token":i,"Content-Type":"application/json"},timeout:5e3}),h.debug(`[Runtime] Notified server session ready: agentId=${t}, sessionId=${n}, status=${o}`)}catch(c){const d=c instanceof Error?c.message:String(c);h.warn(`[Runtime] Failed to notify server session ready: agentId=${t}, error=${d}`)}}async function In(e){const{agentId:t,sessionId:n,schedulerBaseUrl:r,runtimeAccessToken:o}=e;if(!r||!o)return;const s=`${r.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Ce.post(s,{agentId:t,sessionId:n,status:"stopped"},{headers:{"X-Runtime-Token":o,"Content-Type":"application/json"},timeout:5e3}),h.debug(`[Runtime] Notified server session failed: agentId=${t}, sessionId=${n}`)}catch(i){const a=i instanceof Error?i.message:String(i);h.warn(`[Runtime] Failed to notify server session failed: agentId=${t}, error=${a}`)}}A.post("/sdk/message",S,async(e,t)=>{const{sessionId:n,message:r}=e.body||{};if(!n||!r){t.status(400).json({error:"sessionId and message are required"});return}const o=f.get(n);if(!o){t.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code";await w.get(s).sendMessage(n,r),t.json({ok:!0})}catch(s){const i=s instanceof Error?s.message:String(s);t.status(500).json({error:i})}}),A.post("/sdk/answer",S,async(e,t)=>{const{sessionId:n,answers:r}=e.body||{};if(!n||!r){t.status(400).json({error:"sessionId and answers are required"});return}const o=f.get(n);if(!o){t.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code",i=w.get(s);i.sendQuestionAnswer&&await i.sendQuestionAnswer(n,r),t.json({ok:!0})}catch(s){const i=s instanceof Error?s.message:String(s);t.status(500).json({error:i})}}),A.post("/sdk/confirm",S,async(e,t)=>{const{sessionId:n,accept:r}=e.body||{};if(!n){t.status(400).json({error:"sessionId is required"});return}const o=f.get(n);if(!o){t.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code";await w.get(s).sendConfirmation(n,!!r),t.json({ok:!0})}catch(s){const i=s instanceof Error?s.message:String(s);t.status(500).json({error:i})}}),A.post("/sdk/abort",S,async(e,t)=>{const{sessionId:n}=e.body||{};if(!n){t.status(400).json({error:"sessionId is required"});return}const r=f.get(n);if(!r){t.status(404).json({error:"SDK session not found"});return}try{const o=r.providerId||"claude-code";await w.get(o).abortCurrentTurn(n),t.json({ok:!0})}catch(o){const s=o instanceof Error?o.message:String(o);t.status(500).json({error:s})}}),A.post("/sdk/stop",S,async(e,t)=>{const{sessionId:n}=e.body||{};if(!n){t.status(400).json({error:"sessionId is required"});return}const r=f.get(n);if(!r){t.json({ok:!0,status:"stopped"});return}try{const o=r.providerId||"claude-code",s=w.get(o);s.abortCurrentTurn(n).catch(()=>{}),await s.terminateSession(n),x(n),f.delete(n),v(n),ie(n),await F(n),await he().removeProcess(r.agentId),await _(r.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl}),t.json({ok:!0,status:"stopped"})}catch(o){const s=o instanceof Error?o.message:String(o);t.status(500).json({error:s})}}),A.get("/sdk/status/:sessionId",S,(e,t)=>{const n=e.params.sessionId;if(!n){t.status(400).json({error:"sessionId is required"});return}const r=f.get(n);if(!r){t.status(404).json({error:"SDK session not found"});return}try{const o=r.providerId||"claude-code",s=w.get(o),i=s.getSessionStatus(n),a=s.getConversation(n);t.json({sessionId:n,status:i,agentId:r.agentId,workspacePath:r.workspacePath,messageCount:a.length})}catch(o){const s=o instanceof Error?o.message:String(o);t.status(500).json({error:s})}}),A.get("/sdk/capabilities/:sessionId",S,(e,t)=>{const n=e.params.sessionId;if(!n){t.status(400).json({error:"sessionId is required"});return}const r=f.get(n);if(!r){t.status(404).json({error:"SDK session not found"});return}try{const o=r.providerId||"claude-code",i=w.get(o).getCapabilities?.(n)??null;t.json({ok:!0,sessionId:n,agentId:r.agentId,capabilities:i,fetchedAt:Date.now()})}catch(o){const s=o instanceof Error?o.message:String(o);t.status(500).json({error:s})}}),A.get("/sdk/pending-questions/:sessionId",S,(e,t)=>{const n=e.params.sessionId;if(!n){t.status(400).json({error:"sessionId is required"});return}const r=f.get(n);if(!r){t.status(404).json({error:"SDK session not found"});return}try{const o=r.providerId||"claude-code",i=w.get(o).getPendingQuestion?.(n)??null;t.json({ok:!0,sessionId:n,agentId:r.agentId,pendingQuestion:i?{toolCallId:i.toolCallId,questions:i.questions}:null,fetchedAt:Date.now()})}catch(o){const s=o instanceof Error?o.message:String(o);t.status(500).json({error:s})}}),A.post("/command",S,async(e,t)=>{const{sessionId:n,command:r}=e.body||{};if(!n||r===void 0||r===null){t.status(400).json({error:"sessionId and command are required"});return}try{const o=await Ot(String(n),r);t.json({ok:!0,mode:"terminal",...o})}catch(o){const s=o instanceof Error?o.message:String(o);t.status(500).json({error:s})}}),A.post("/input",S,async(e,t)=>{const{sessionId:n,input:r,mode:o}=e.body||{};if(!n||r===void 0||r===null){t.status(400).json({error:"sessionId and input are required"});return}const s=f.get(n);if(!s){t.status(404).json({error:"SDK session not found"});return}try{const i=s.providerId||"claude-code",a=w.get(i);if(o==="shortcut"){if(!a.sendShortcutInput){t.status(400).json({error:"shortcut input is not supported by this SDK provider"});return}await a.sendShortcutInput(n,String(r)),t.json({ok:!0,mode:"shortcut"});return}await a.sendMessage(n,await qt(r)),t.json({ok:!0,mode:"sdk"})}catch(i){const a=i instanceof Error?i.message:String(i);t.status(500).json({error:a})}}),A.post("/update-auto-commands",S,async(e,t)=>{const{agentId:n,idleInputAutoCommand:r="",nonInputAutoCommand:o=""}=e.body||{},s=String(n||"").trim();if(!s){t.status(400).json({error:"agentId is required"});return}const i=[...f.values()].find(c=>c.agentId===s),a={idleInputCommand:String(r||""),nonInputCommand:String(o||"")};try{let c=!1;i&&(w.get(i.providerId||"claude-code").setIdleCommands?.(i.sessionId,a),c=!0);const d=await lt(s,{idleInputAutoCommand:a.idleInputCommand,nonInputAutoCommand:a.nonInputCommand});t.json({ok:!0,mode:"sdk",sessionUpdated:c,persistedUpdated:d})}catch(c){const d=c instanceof Error?c.message:String(c);t.status(500).json({ok:!1,mode:"sdk",error:d})}}),A.post("/resize",S,(e,t)=>{const{sessionId:n,cols:r,rows:o}=e.body||{};if(!n||!r||!o){t.status(400).json({error:"sessionId, cols, rows are required"});return}if(!f.has(n)){t.status(404).json({error:"SDK session not found"});return}t.json({ok:!0,mode:"sdk",noop:!0,cols:Number(r),rows:Number(o)})}),A.post("/reset-context",S,async(e,t)=>{const{sessionId:n,reason:r}=e.body||{};if(!n){t.status(400).json({error:"sessionId is required"});return}const o=f.get(n);if(!o){t.status(404).json({error:"SDK session not found"});return}const s=o.providerId||"claude-code",i=w.get(s),a=i.resetContext?.bind(i),c=At(s,!!a);if(!c.supported){t.status(c.statusCode).json({error:c.error});return}if(!a){t.status(500).json({error:"ACode adapter does not expose resetContext"});return}try{await a(String(n));const d=se(i.getSessionStatus(String(n)),o.currentRuntimeStatus,o.currentRuntimeActionType);t.json({ok:!0,contextReset:!0,sessionId:n,status:d,runtimeStatus:d,agentId:o.agentId,mode:"sdk",providerId:s,reason:typeof r=="string"&&r.trim()?r.trim():void 0})}catch(d){const u=d instanceof Error?d.message:String(d);t.status(500).json({ok:!1,contextReset:!1,mode:"sdk",error:u})}}),A.post("/stop",S,async(e,t)=>{const{sessionId:n}=e.body||{},r=kt(e.body);if(!n){t.status(400).json({error:"sessionId is required"});return}const o=f.get(n);if(!o){await F(n),t.json({ok:!0,status:"stopped",mode:"none",statusNotified:!1,reason:r.reason});return}const s=o.agentId;try{console.log(`[Runtime] Stopping SDK session ${n}; suppressStatus=${!r.statusNotified}, reason=${r.reason||"unspecified"}`);const i=o.providerId||"claude-code",a=w.get(i);a.abortCurrentTurn(n).catch(()=>{}),await a.terminateSession(n),x(n),f.delete(n),v(n),ie(n),await F(n),await he().removeProcess(s),r.statusNotified?await _(s,null,"stopped",void 0,void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl}):console.log(`[Runtime] Stopped status notification suppressed for SDK session ${n}; reason=${r.reason||"unspecified"}`),t.json({ok:!0,status:"stopped",mode:"sdk",statusNotified:r.statusNotified,reason:r.reason})}catch(i){const a=i instanceof Error?i.message:String(i);console.error(`[Runtime] Failed to terminate SDK session ${n}:`,a),t.status(500).json({ok:!1,status:"stop_failed",mode:"sdk",error:a})}}),A.post("/stop-all",S,async(e,t)=>{const n=[],r=[];for(const[o,s]of f.entries())try{const i=s.providerId||"claude-code",a=w.get(i);a.abortCurrentTurn(o).catch(()=>{}),await a.terminateSession(o),x(o),f.delete(o),v(o),ie(o),n.push(o),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);r.push(`SDK ${o}: ${a}`)}try{await dt([]),console.log("[Runtime] \u5DF2\u6E05\u7A7A\u6240\u6709\u6301\u4E45\u5316\u4F1A\u8BDD")}catch(o){const s=o instanceof Error?o.message:String(o);r.push(`Persistence: ${s}`)}t.json({ok:!0,stopped:{sdk:n.length},errors:r.length>0?r:void 0})}),A.get("/events/last/:n",S,(e,t)=>{const n=parseInt(e.params.n,10);if(!Number.isFinite(n)||n<1){t.status(400).json({error:":n must be a positive integer"});return}const r=De.getLastN(n);t.json({ok:!0,count:r.length,entries:r})}),A.get("/events/since/:index",S,(e,t)=>{const n=parseInt(e.params.index,10);if(!Number.isFinite(n)||n<0){t.status(400).json({error:":index must be a non-negative integer"});return}const r=De.getSinceIndex(n);t.json({ok:!0,entries:r.entries,nextIndex:r.nextIndex,oldestIndex:r.oldestIndex,dataLoss:r.oldestIndex>n+1})}),A.get("/events/push-stats",S,(e,t)=>{const n=st();t.json({ok:!0,count:n.length,agents:n})});export{Ct as buildAcodeCommandOutputPath,Oe as buildClaudeCodeLaunchConfig,Be as buildRuntimeEnv,Qt as buildSdkOutputMetadata,Ht as buildToolResultTimelineActionInfo,Kn as cleanupSdkSessionByAgentId,$t as countTerminalOutputLines,Ue as createTerminalOutputDecoder,oe as decodeTerminalOutputChunk,Ut as evaluatePersistedSessionReuse,Dt as formatCommandInactivityTimeoutNotice,_t as formatCommandOutputSpilloverNotice,Wt as formatSdkOutputEvent,Se as formatTerminalPrompt,Pt as normalizeTerminalCommandInput,kt as parseRuntimeStopOptions,Et as parseTerminalDirectoryChangeTarget,ue as raceSendOutputWithRetry,At as resolveRuntimeContextResetSupport,cn as resolveRuntimeStatusFromProviderEvent,qt as resolveSdkInputMessage,Fe as resolveSdkProviderId,se as resolveSdkSessionDisplayStatus,wt as resolveStatusChangeRuntimeState,re as resolveStatusChangeUsage,Rt as resolveTerminalOutputEncoding,f as sdkSessions,Tt as shouldProbeSdkProcessPid,A as terminalRouter};
53
+ `):void 0}const U={command:o||"acode",workingDirectory:r,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:Be(String(t),String(r),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:r,sessionId:D,config:U,providerId:E,seq:0,runtimeAccessToken:le,schedulerBaseUrl:B}),n.json({sessionId:D,status:"starting",runtimeStatus:"starting",agentId:I,workspacePath:r,command:U.command,mode:"sdk"}),An({sessionId:D,agentId:I,config:U,adapter:ze,providerId:E,idleInputAutoCommand:T,nonInputAutoCommand:y,runtimeAccessToken:le,requestedSchedulerBaseUrl:B})}catch(O){if(D&&(x(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 An(e){const{sessionId:n,agentId:t,config:r,adapter:o,providerId:s,idleInputAutoCommand:i,nonInputAutoCommand:a,runtimeAccessToken:c,requestedSchedulerBaseUrl:d}=e;try{await o.startSession(n,r),(i||a)&&o.setIdleCommands?.(n,{idleInputCommand:i||"",nonInputCommand:a||""});let u;if(Ct(s))try{if(await new Promise(m=>setTimeout(m,500)),u=o.getSessionPid?.(n),!u){const f=(await it()).find(T=>T.agentId===t||T.cwd===r.workingDirectory||T.command.includes(r.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(o.getSessionStatus(n),p.get(n)?.currentRuntimeStatus,p.get(n)?.currentRuntimeActionType);await ht({sessionId:n,agentId:t,workspacePath:r.workingDirectory,command:r.command,startedAt:new Date().toISOString(),status:"running",runtimeStatus:l,mode:"sdk",pid:u,providerSessionId:o.getProviderSessionId(n)}),u&&await he().startProcess({agentId:t,sessionId:n,pid:u,mode:"sdk",workspacePath:r.workingDirectory,command:r.command}),await Tn({agentId:t,sessionId:n,sdkPid:u,status:l,schedulerBaseUrl:d,runtimeAccessToken:c})}catch(u){x(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 kn({agentId:t,sessionId:n,schedulerBaseUrl:d,runtimeAccessToken:c,errorMessage:l})}finally{K.delete(t)}}async function Tn(e){const{agentId:n,sessionId:t,sdkPid:r,status:o,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:o,pid:r},{headers:{"X-Runtime-Token":i,"Content-Type":"application/json"},timeout:5e3}),h.debug(`[Runtime] Notified server session ready: agentId=${n}, sessionId=${t}, status=${o}`)}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 kn(e){const{agentId:n,sessionId:t,schedulerBaseUrl:r,runtimeAccessToken:o}=e;if(!r||!o)return;const s=`${r.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Ce.post(s,{agentId:n,sessionId:t,status:"stopped"},{headers:{"X-Runtime-Token":o,"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:r}=e.body||{};if(!t||!r){n.status(400).json({error:"sessionId and message are required"});return}const o=p.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code";await w.get(s).sendMessage(t,r),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:r}=e.body||{};if(!t||!r){n.status(400).json({error:"sessionId and answers are required"});return}const o=p.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code",i=w.get(s);i.sendQuestionAnswer&&await i.sendQuestionAnswer(t,r),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:r}=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 s=o.providerId||"claude-code";await w.get(s).sendConfirmation(t,!!r),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 r=p.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const o=r.providerId||"claude-code";await w.get(o).abortCurrentTurn(t),n.json({ok:!0})}catch(o){const s=o instanceof Error?o.message:String(o);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 r=p.get(t);if(!r){n.json({ok:!0,status:"stopped"});return}try{const o=r.providerId||"claude-code",s=w.get(o);s.abortCurrentTurn(t).catch(()=>{}),await s.terminateSession(t),x(t),p.delete(t),q(t),ie(t),await F(t),await he().removeProcess(r.agentId),await _(r.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl}),n.json({ok:!0,status:"stopped"})}catch(o){const s=o instanceof Error?o.message:String(o);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 r=p.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const o=r.providerId||"claude-code",s=w.get(o),i=s.getSessionStatus(t),a=s.getConversation(t);n.json({sessionId:t,status:i,agentId:r.agentId,workspacePath:r.workspacePath,messageCount:a.length})}catch(o){const s=o instanceof Error?o.message:String(o);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 r=p.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const o=r.providerId||"claude-code",i=w.get(o).getCapabilities?.(t)??null;n.json({ok:!0,sessionId:t,agentId:r.agentId,capabilities:i,fetchedAt:Date.now()})}catch(o){const s=o instanceof Error?o.message:String(o);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 r=p.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const o=r.providerId||"claude-code",i=w.get(o).getPendingQuestion?.(t)??null;n.json({ok:!0,sessionId:t,agentId:r.agentId,pendingQuestion:i?{toolCallId:i.toolCallId,questions:i.questions}:null,fetchedAt:Date.now()})}catch(o){const s=o instanceof Error?o.message:String(o);n.status(500).json({error:s})}}),A.post("/command",S,async(e,n)=>{const{sessionId:t,command:r}=e.body||{};if(!t||r===void 0||r===null){n.status(400).json({error:"sessionId and command are required"});return}try{const o=await Ft(String(t),r);n.json({ok:!0,mode:"terminal",...o})}catch(o){const s=o instanceof Error?o.message:String(o);n.status(500).json({error:s})}}),A.post("/input",S,async(e,n)=>{const{sessionId:t,input:r,mode:o}=e.body||{};if(!t||r===void 0||r===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(o==="shortcut"){if(!a.sendShortcutInput){n.status(400).json({error:"shortcut input is not supported by this SDK provider"});return}await a.sendShortcutInput(t,String(r)),n.json({ok:!0,mode:"shortcut"});return}await a.sendMessage(t,await zt(r)),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:r="",nonInputAutoCommand:o=""}=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(r||""),nonInputCommand:String(o||"")};try{let c=!1;i&&(w.get(i.providerId||"claude-code").setIdleCommands?.(i.sessionId,a),c=!0);const d=await gt(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:r,rows:o}=e.body||{};if(!t||!r||!o){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(r),rows:Number(o)})}),A.post("/reset-context",S,async(e,n)=>{const{sessionId:t,reason:r}=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}const s=o.providerId||"claude-code",i=w.get(s),a=i.resetContext?.bind(i),c=bt(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)),o.currentRuntimeStatus,o.currentRuntimeActionType);n.json({ok:!0,contextReset:!0,sessionId:t,status:d,runtimeStatus:d,agentId:o.agentId,mode:"sdk",providerId:s,reason:typeof r=="string"&&r.trim()?r.trim():void 0})}catch(d){const u=d instanceof Error?d.message:String(d);n.status(500).json({ok:!1,contextReset:!1,mode:"sdk",error:u})}}),A.post("/stop",S,async(e,n)=>{const{sessionId:t}=e.body||{},r=_t(e.body);if(!t){n.status(400).json({error:"sessionId is required"});return}const o=p.get(t);if(!o){await F(t),n.json({ok:!0,status:"stopped",mode:"none",statusNotified:!1,reason:r.reason});return}const s=o.agentId;try{console.log(`[Runtime] Stopping SDK session ${t}; suppressStatus=${!r.statusNotified}, reason=${r.reason||"unspecified"}`);const i=o.providerId||"claude-code",a=w.get(i);a.abortCurrentTurn(t).catch(()=>{}),await a.terminateSession(t),x(t),p.delete(t),q(t),ie(t),await F(t),await he().removeProcess(s),r.statusNotified?await _(s,null,"stopped",void 0,void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl}):console.log(`[Runtime] Stopped status notification suppressed for SDK session ${t}; reason=${r.reason||"unspecified"}`),n.json({ok:!0,status:"stopped",mode:"sdk",statusNotified:r.statusNotified,reason:r.reason})}catch(i){const a=i instanceof Error?i.message:String(i);console.error(`[Runtime] Failed to terminate SDK session ${t}:`,a),n.status(500).json({ok:!1,status:"stop_failed",mode:"sdk",error:a})}}),A.post("/stop-all",S,async(e,n)=>{const t=[],r=[];for(const[o,s]of p.entries())try{const i=s.providerId||"claude-code",a=w.get(i);a.abortCurrentTurn(o).catch(()=>{}),await a.terminateSession(o),x(o),p.delete(o),q(o),ie(o),t.push(o),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);r.push(`SDK ${o}: ${a}`)}try{await pt([]),console.log("[Runtime] \u5DF2\u6E05\u7A7A\u6240\u6709\u6301\u4E45\u5316\u4F1A\u8BDD")}catch(o){const s=o instanceof Error?o.message:String(o);r.push(`Persistence: ${s}`)}n.json({ok:!0,stopped:{sdk:t.length},errors:r.length>0?r: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 r=De.getLastN(t);n.json({ok:!0,count:r.length,entries:r})}),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 r=De.getSinceIndex(t);n.json({ok:!0,entries:r.entries,nextIndex:r.nextIndex,oldestIndex:r.oldestIndex,dataLoss:r.oldestIndex>t+1})}),A.get("/events/push-stats",S,(e,n)=>{const t=ut();n.json({ok:!0,count:t.length,agents:t})});export{Rt as buildAcodeCommandOutputPath,Oe as buildClaudeCodeLaunchConfig,Be as buildRuntimeEnv,Jt as buildSdkOutputMetadata,Vt as buildToolResultTimelineActionInfo,Vn as cleanupSdkSessionByAgentId,Pt as countTerminalOutputLines,Ue as createTerminalOutputDecoder,oe as decodeTerminalOutputChunk,Nt as evaluatePersistedSessionReuse,Mt as formatCommandInactivityTimeoutNotice,Et as formatCommandOutputSpilloverNotice,Gt as formatSdkOutputEvent,Se as formatTerminalPrompt,xt as normalizeTerminalCommandInput,_t as parseRuntimeStopOptions,jt as parseTerminalDirectoryChangeTarget,ue as raceSendOutputWithRetry,bt as resolveRuntimeContextResetSupport,mn as resolveRuntimeStatusFromProviderEvent,zt as resolveSdkInputMessage,Fe as resolveSdkProviderId,se as resolveSdkSessionDisplayStatus,$t as resolveStatusChangeRuntimeState,re as resolveStatusChangeUsage,Lt as resolveTerminalOutputEncoding,p as sdkSessions,Ct as shouldProbeSdkProcessPid,A as terminalRouter};
54
54
 
@@ -0,0 +1,5 @@
1
+
2
+
3
+ export declare function setChangeCacheRetentionDays(days: unknown): void;
4
+
5
+ export declare function getChangeCacheRetentionDays(): number | null;
@@ -0,0 +1,2 @@
1
+ const u=3650;let e=null;function o(n){if(n==null||n===""){e=null;return}if(typeof n=="boolean"){e=null;return}const t=Number(n);if(!Number.isFinite(t)||t<=0){e=null;return}e=Math.min(Math.floor(t),3650)}function i(){return e}export{i as getChangeCacheRetentionDays,o as setChangeCacheRetentionDays};
2
+
@@ -0,0 +1,47 @@
1
+
2
+ import { type ACodeBuiltInToolLike } from "../desktop/built-in-desktop-tools.js";
3
+ import { DesktopMcpConnection, type DesktopMcpToolInfo } from "../desktop/desktop-mcp-client.js";
4
+
5
+ interface DesktopMcpManagerState {
6
+ connection: DesktopMcpConnection;
7
+ tools: DesktopMcpToolInfo[];
8
+
9
+ forwarder: (name: string, args: Record<string, unknown>) => Promise<string>;
10
+ binaryPath: string;
11
+
12
+ envSig: string;
13
+ }
14
+
15
+ interface DesktopMcpFailureState {
16
+ reason: "binary-missing" | "start-failed";
17
+ message: string;
18
+ at: number;
19
+ }
20
+
21
+ export interface DesktopAgentAiInfo {
22
+ model: string;
23
+ baseURL?: string;
24
+ apiKey?: string;
25
+
26
+ supportsImage?: boolean;
27
+ }
28
+
29
+ export declare function resolveDesktopMcpBinary(): Promise<string | null>;
30
+
31
+ export declare function startDesktopMcpManager(): Promise<DesktopMcpManagerState | null>;
32
+
33
+ export declare function getDesktopTools(agentId: string | undefined, agentAi?: DesktopAgentAiInfo): Promise<ACodeBuiltInToolLike[]>;
34
+
35
+ export declare function getDesktopToolsIfReady(): ACodeBuiltInToolLike[];
36
+
37
+ export declare function disposeDesktopMcpManager(): Promise<void>;
38
+
39
+ export declare function getDesktopMcpStatus(): {
40
+ started: boolean;
41
+ binaryPath: string | null;
42
+ toolCount: number;
43
+ failure: DesktopMcpFailureState | null;
44
+
45
+ visionSource: "panel-env" | "agent-fallback" | "none";
46
+ };
47
+ export {};
@@ -0,0 +1,2 @@
1
+ import{access as b,constants as P}from"node:fs/promises";import{getPanelEnvVars as M}from"./panel-env.js";import{join as m,resolve as O}from"node:path";import{createBuiltInDesktopTools as w}from"../desktop/built-in-desktop-tools.js";import{DesktopMcpConnection as T}from"../desktop/desktop-mcp-client.js";import{logger as C}from"../utils/logger.js";import{DESKTOP_FEATURE_KEY as D,isFeatureEnabled as I}from"./instance-features.js";const d=C.child("desktop-mcp");let n=null,c=null,r=null,l,f="none";const k=process.platform==="win32"?"nuphus-mcp.exe":"nuphus-mcp",N=12e4,U=6e4;function x(){const e=process.env.AWS_DESKTOP_MCP_TIMEOUT_MS;if(e){const t=parseInt(e,10);if(Number.isFinite(t)&&t>0)return t}return N}function A(){const e=process.env.AWS_DESKTOP_MCP_RETRY_BACKOFF_MS;if(e){const t=parseInt(e,10);if(Number.isFinite(t)&&t>=0)return t}return U}async function K(){const e=process.env.AWS_DESKTOP_MCP_BIN;if(e){const o=O(e);return await g(o)?o:null}const t=m(process.cwd(),".desktop-mcp","bin",k);return await g(t)?t:null}async function g(e){try{return await b(e,P.F_OK),!0}catch{return!1}}function $(){const e={},t="AWS_DESKTOP_MCP_ENV_";for(const[o,s]of Object.entries(process.env))o.startsWith(t)&&s!==void 0&&(e[o.slice(t.length)]=s);return e}function h(){const e={...$(),...M()},t=e.NUPHUS_MCP_VISION_API_KEY!==void 0||e.NUPHUS_MCP_VISION_MODEL!==void 0;return!t&&l?.apiKey&&l.supportsImage===!0?(f="agent-fallback",e.NUPHUS_MCP_VISION_API_KEY=l.apiKey,e.NUPHUS_MCP_VISION_MODEL=l.model,l.baseURL&&(e.NUPHUS_MCP_VISION_BASE_URL=l.baseURL),d.info(`vision model fallback: reusing agent model ${l.model} for desktop_vision`)):t?f="panel-env":f="none",e}function S(e){return Object.keys(e).sort().map(t=>`${t}=${e[t]}`).join("\0")}async function y(){if(n){if(n.connection.isConnected())return n;await _(n.connection),n=null}if(c)return c;if(r){if(r.reason==="binary-missing"||Date.now()-r.at<A())return null;r=null}return c=(async()=>{const e=await K();if(!e)return r={reason:"binary-missing",message:`nuphus-mcp binary not found. Set AWS_DESKTOP_MCP_BIN or place it at ${m(process.cwd(),".desktop-mcp","bin",k)}`,at:Date.now()},u(`desktop tools unavailable: ${r.message}`),null;const t=h(),o=new T({command:e,env:t,onUnexpectedClose:()=>{u("nuphus-mcp process exited unexpectedly; will restart on next use"),n?.connection===o&&(n=null)}});try{const s=await o.start(),i=x();r=null;const a={connection:o,tools:s,binaryPath:e,envSig:S(t),forwarder:(p,E)=>F(o,p,E,i)};return n=a,u(`nuphus-mcp started (${e}), ${s.filter(p=>p.name.startsWith("desktop_")).length} desktop tools available`),a}catch(s){return await _(o),r={reason:"start-failed",message:s.message,at:Date.now()},v(`nuphus-mcp start failed: ${r.message}`),null}finally{c=null}})(),c}async function F(e,t,o,s){try{return await e.callTool(t,o,s)}catch(i){if(e.isConnected())throw i;v(`nuphus-mcp connection lost during ${t}: ${i.message}; restarting`),n?.connection===e&&(n=null),await _(e);const a=await y();if(!a)throw new Error(`nuphus-mcp restart failed: ${r?.message??"unknown"}`);return a.connection.callTool(t,o,s)}}async function q(e,t){if(!e)return[];t?.model&&(l=t);const o=h(),s=S(o);n&&n.connection.isConnected()&&n.envSig!==s&&(u("nuphus-mcp env changed; restarting to apply new env"),await L());const i=await y();return i?w({tools:i.tools,forwarder:(a,p)=>I(e,D)?i.forwarder(a,p):(d.warn(`tool ${a} blocked: desktop capability disabled for ${e}`),Promise.resolve("desktop capability is disabled for this agent (toggled off while tools were exposed); stop calling desktop_* tools"))}):[]}function G(){const e=n;return!e||!e.connection.isConnected()?R.map(t=>({kind:"builtin",toolName:t,exposedName:t,description:`${t}\uFF08\u684C\u9762\u81EA\u52A8\u5316\u5DE5\u5177\uFF0Cnuphus-mcp \u672A\u8FD0\u884C\uFF09\u3002\u5206\u914D desktop \u5206\u7C7B\u540E\u6309\u9700\u542F\u52A8\u540E\u7AEF\uFF0C\u5177\u4F53\u5DE5\u5177\u4EE5\u542F\u52A8\u540E\u76EE\u5F55\u4E3A\u51C6\u3002`,inputSchema:{type:"object",properties:{}},category:"desktop",async execute(){return`${t} is not ready: nuphus-mcp backend is not running. Allocate the desktop catalog to lazily start it, then retry.`}})):w({tools:e.tools,forwarder:(t,o)=>e.forwarder(t,o)})}const R=["desktop_screenshot","desktop_window_screenshot","desktop_perceive","desktop_vision","desktop_input","desktop_mouse","desktop_mouse_drag","desktop_screen_size","desktop_clipboard_write","desktop_clipboard_clean","desktop_config","desktop_uia_tree","desktop_uia_click","desktop_window_activate","desktop_window_info","desktop_window_move","desktop_window_resize","desktop_windows_list"];async function L(){const e=n;if(n=null,r=null,c){try{await c}catch{}c=null}e&&(await _(e.connection),u("nuphus-mcp stopped"))}function J(){return{started:n!==null,binaryPath:n?.binaryPath??null,toolCount:n?n.tools.filter(e=>e.name.startsWith("desktop_")).length:0,failure:r,visionSource:f}}async function _(e){try{await e.close()}catch{}}function u(e){d.info(e)}function v(e){d.warn(e)}export{L as disposeDesktopMcpManager,J as getDesktopMcpStatus,q as getDesktopTools,G as getDesktopToolsIfReady,K as resolveDesktopMcpBinary,y as startDesktopMcpManager};
2
+
@@ -1,4 +1,10 @@
1
1
 
2
+ export declare const DESKTOP_FEATURE_KEY = "desktop";
3
+
4
+ export declare const BROWSER_FEATURE_KEY = "browser";
5
+
6
+ export declare const LAUNCH_ITEM_FEATURE_KEY = "agentSys.launchItem";
7
+
2
8
  export declare function setAgentFeatures(agentId: string, features: unknown): void;
3
9
 
4
10
  export declare function getAgentFeatures(agentId: string): Record<string, boolean>;
@@ -1,2 +1,2 @@
1
- const r={},i=new Set(["desktop"]),n=new Map;function c(e){if(e==null)return{...r};let t=e;if(typeof e=="string")try{t=JSON.parse(e)}catch{t=null}if(typeof t!="object"||t===null||Array.isArray(t))return{...r};const u={};for(const[o,s]of Object.entries(t))i.has(o)||typeof s=="boolean"&&(u[o]=s);return u}function a(e,t){e&&n.set(e,c(t))}function f(e){return n.get(e)??{...r}}function l(e,t){return f(e)[t]===!0}function p(e){n.delete(e)}function A(){return n.size}export{p as clearAgentFeatures,f as getAgentFeatures,A as instanceFeaturesCacheSize,l as isFeatureEnabled,a as setAgentFeatures};
1
+ const o={},A="desktop",c="browser",l="agentSys.launchItem",i=new Set([c]),E=new Set,r=new Map;function f(e){if(e==null)return{...o};let t=e;if(typeof e=="string")try{t=JSON.parse(e)}catch{t=null}if(typeof t!="object"||t===null||Array.isArray(t))return{...o};const n={};for(const[s,u]of Object.entries(t))E.has(s)||typeof u=="boolean"&&(n[s]=u);return n}function p(e,t){e&&r.set(e,f(t))}function a(e){return r.get(e)??{...o}}function F(e,t){const n=a(e)[t];return n!==void 0?n:i.has(t)}function _(e){r.delete(e)}function S(){return r.size}export{c as BROWSER_FEATURE_KEY,A as DESKTOP_FEATURE_KEY,l as LAUNCH_ITEM_FEATURE_KEY,_ as clearAgentFeatures,a as getAgentFeatures,S as instanceFeaturesCacheSize,F as isFeatureEnabled,p as setAgentFeatures};
2
2
 
@@ -0,0 +1,20 @@
1
+
2
+ export interface JdkInfo {
3
+ id: string;
4
+
5
+ name: string;
6
+
7
+ path: string;
8
+
9
+ version: string;
10
+
11
+ source: "scan" | "manual";
12
+ }
13
+
14
+ export declare function scanInstalledJdks(): Promise<JdkInfo[]>;
15
+
16
+ export declare function listJdks(): Promise<JdkInfo[]>;
17
+
18
+ export declare function addManualJdk(jdkPath: string): Promise<JdkInfo>;
19
+
20
+ export declare function removeManualJdk(jdkId: string): Promise<boolean>;
@@ -0,0 +1,2 @@
1
+ import i from"node:os";import n from"node:path";import d from"node:crypto";import{promises as c}from"node:fs";import{createLogger as g}from"../utils/logger.js";import{atomicWriteJsonFile as y,withFileLock as j}from"../utils/file-utils.js";const f=g("jdk-scanner");function h(){return n.join(i.tmpdir(),"agentswork-runtime-bridge","jdk-registry.json")}function k(){const a=[];return process.env.JAVA_HOME&&a.push(process.env.JAVA_HOME),i.platform()==="win32"?a.push(n.join(process.env.ProgramFiles||"C:\\Program Files","Java"),n.join(process.env.ProgramFiles||"C:\\Program Files","Eclipse Adoptium"),n.join(process.env.ProgramFiles||"C:\\Program Files","Microsoft"),n.join(process.env.ProgramFiles||"C:\\Program Files","Amazon Corretto"),n.join(process.env.ProgramFiles||"C:\\Program Files","Zulu")):i.platform()==="darwin"?a.push("/Library/Java/JavaVirtualMachines"):a.push("/usr/lib/jvm","/opt/java","/opt/jdk","/usr/local/opt"),a.filter(Boolean)}function w(){return i.platform()==="win32"?"java.exe":"java"}async function u(a){try{return await c.access(n.join(a,"bin",w())),!0}catch{return!1}}async function m(a){try{return(await c.readFile(n.join(a,"release"),"utf-8")).match(/^JAVA_VERSION="?([^"\n]+)"?/m)?.[1]?.trim()||""}catch{return""}}async function C(a){try{return(await c.readdir(a,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>n.join(a,r.name))}catch{return[]}}function v(a){return`scan-${d.createHash("sha1").update(a.toLowerCase()).digest("hex").slice(0,12)}`}async function A(){const a=[],e=new Set,r=k();for(const t of r){const o=await C(t);for(const s of o){const p=s.toLowerCase();e.has(p)||(e.add(p),await u(s)&&a.push({id:v(s),name:n.basename(s),path:s,version:await m(s),source:"scan"}))}}if(process.env.JAVA_HOME&&!e.has(process.env.JAVA_HOME.toLowerCase())){const t=process.env.JAVA_HOME;e.add(t.toLowerCase()),await u(t)&&a.push({id:v(t),name:n.basename(t),path:t,version:await m(t),source:"scan"})}return a.sort((t,o)=>(o.version||"").localeCompare(t.version||"")||t.name.localeCompare(o.name)),a}async function l(){try{const a=await c.readFile(h(),"utf-8"),e=JSON.parse(a);return Array.isArray(e)?e:[]}catch{return[]}}async function J(a){const e=h();await j(e,async()=>{await y(e,a)})}async function D(){const a=await A(),e=await l();if(e.length===0)return a;const r=new Set(a.map(o=>o.path.toLowerCase())),t=[...a];for(const o of e){const s=o.path.toLowerCase();r.has(s)||await u(o.path)&&t.push({id:o.id,name:n.basename(o.path),path:o.path,version:await m(o.path),source:"manual"})}return t}async function V(a){const e=a.trim();if(!e)throw new Error("JDK \u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A");const r=n.resolve(e);if(!await u(r))throw new Error(`\u4E0D\u662F\u6709\u6548\u7684 JDK \u76EE\u5F55\uFF08\u7F3A\u5C11 bin/${w()}\uFF09: ${r}`);const t=await l();if(t.some(s=>s.path.toLowerCase()===r.toLowerCase()))throw new Error("\u8BE5 JDK \u5DF2\u6DFB\u52A0");const o=`manual-${d.randomUUID().slice(0,8)}`;return t.push({id:o,path:r}),await J(t),f.info(`[jdk] \u624B\u52A8\u6DFB\u52A0 JDK: id=${o}, path=${r}`),{id:o,name:n.basename(r),path:r,version:await m(r),source:"manual"}}async function x(a){if(!a.startsWith("manual-"))throw new Error("\u4EC5\u652F\u6301\u5220\u9664\u624B\u52A8\u6DFB\u52A0\u7684 JDK");const e=await l(),r=e.filter(t=>t.id!==a);return r.length===e.length?!1:(await J(r),f.info(`[jdk] \u5220\u9664\u624B\u52A8 JDK: id=${a}`),!0)}export{V as addManualJdk,D as listJdks,x as removeManualJdk,A as scanInstalledJdks};
2
+