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