aws-runtime-bridge 1.9.189 → 1.9.192
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 +111 -0
- package/dist/adapter/AcodeSdkAdapter.d.ts +13 -0
- package/dist/adapter/AcodeSdkAdapter.js +3 -3
- package/dist/config.d.ts +0 -31
- package/dist/config.js +2 -2
- package/dist/index.js +1 -1
- package/dist/routes/media-files.d.ts +19 -0
- package/dist/routes/media-files.js +2 -0
- package/dist/routes/plugin-ui.d.ts +17 -0
- package/dist/routes/plugin-ui.js +2 -0
- package/dist/routes/plugins.d.ts +3 -0
- package/dist/routes/plugins.js +1 -1
- package/dist/routes/terminal.d.ts +83 -0
- package/dist/routes/terminal.js +25 -25
- package/dist/scripts/migrate-user-scopes.js +1 -1
- package/dist/services/agent-capability-sync.js +1 -1
- package/dist/services/capability-config.d.ts +0 -1
- package/dist/services/capability-config.js +2 -2
- package/dist/services/instance-ai-config-service.js +1 -1
- package/dist/services/plugin-deployment.d.ts +2 -30
- package/dist/services/plugin-deployment.js +2 -2
- package/dist/services/plugin-handler-adapter.d.ts +10 -1
- package/dist/services/plugin-handler-adapter.js +2 -2
- package/dist/services/plugin-listener-runner.js +4 -4
- package/dist/services/plugin-loader.d.ts +7 -1
- package/dist/services/plugin-loader.js +1 -1
- package/dist/services/plugin-manager.d.ts +32 -12
- package/dist/services/plugin-manager.js +4 -4
- package/dist/services/plugin-manifest.d.ts +53 -3
- package/dist/services/plugin-manifest.js +1 -1
- package/dist/services/plugin-runtime.d.ts +8 -9
- package/dist/services/plugin-ui-status-runtime.d.ts +8 -0
- package/dist/services/plugin-ui-status-runtime.js +2 -0
- package/dist/services/plugin-ui-status.d.ts +96 -0
- package/dist/services/plugin-ui-status.js +2 -0
- package/dist/services/plugin-wecom-callback.d.ts +61 -0
- package/dist/services/plugin-wecom-callback.js +3 -0
- package/dist/services/user-scope.d.ts +1 -9
- package/dist/services/user-scope.js +1 -1
- package/package/acode/dist/plugin-types.d.ts +41 -1
- package/package/acode/dist/runtime.d.ts +17 -0
- package/package/acode/dist/runtime.js +20 -20
- package/package/aws-client-agent-mcp/dist/mcp-server.js +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +15 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +35 -5
- package/package/aws-client-agent-mcp/dist/tool-groups.js +2 -2
- package/package.json +1 -1
package/dist/routes/terminal.js
CHANGED
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
import{spawn as
|
|
2
|
-
`);if(
|
|
1
|
+
import{spawn as wt}from"node:child_process";import{promises as ue}from"node:fs";import Ot from"node:os";import de from"node:path";import{TextDecoder as le}from"node:util";import{buildResumeContextBlock as He,deleteJournal as Dt,readJournal as Mt}from"@agentswork/acode";import Ke from"axios";import{Router as Pt}from"express";import{v4 as Lt}from"uuid";import{adapterRegistry as _,getToolActionInfo as Me,isTransientClipboardPasteFilePath as We,redactTransientClipboardPastePaths as z,registerSdkProviders as xt,resolveSdkProviderIdByCommand as Ut}from"../adapter/index.js";import{MESSAGE_POLLING_IDLE_PROMPT as ze}from"../adapter/prompts.js";import{getActiveBridgeHttpPort as Nt,getAcodeDataHome as qe}from"../config.js";import{validateToken as T}from"../middleware/auth.js";import{registerAgentOwner as jt}from"../services/agent-ownership.js";import{getAgentProcessManager as Pe}from"../services/agent-process-manager.js";import{loadAgentStartupMemories as Bt}from"../services/agent-startup-memory.js";import{resolveSchedulerBaseUrlFromToken as Ye}from"../services/auto-register.js";import{setChangeCacheRetentionDays as vt}from"../services/change-cache-retention.js";import{clearDebugMounts as fe}from"../services/debug-mount.js";import{getAllPushStats as Ft,startHeartbeatScheduler as Ht}from"../services/event-delta-pusher.js";import{sweepExpiredSnapshots as Kt}from"../services/fileSnapshotStore.js";import{prepareAcodeInstanceConfig as Wt,redactForLog as pe}from"../services/instance-ai-config-service.js";import{setAgentFeatures as zt,setAgentCapabilities as qt,setAgentInheritedFeatures as Yt,setAgentCapabilitiesInherited as Xt,getAgentFeatures as Vt,getAgentInheritedFeatures as Gt,getFeatureState as h,LAUNCH_ITEM_FEATURE_KEY as Xe,HIRE_FEATURE_KEY as Ve,PENCIL_FEATURE_KEY as Ge,DRAW_FEATURE_KEY as Je,OFFICE_FEATURE_KEY as Qe,COLLABORATION_TASK_FEATURE_KEY as Ze,COLLABORATION_MEETING_FEATURE_KEY as et,COLLABORATION_DEBUG_FEATURE_KEY as tt,COLLABORATION_FILE_HISTORY_FEATURE_KEY as nt,COLLABORATION_VOICE_FEATURE_KEY as ot,EMAIL_FEATURE_KEY as st,SKILL_INSTALL_FEATURE_KEY as rt,ABILITY_DEV_FEATURE_KEY as it}from"../services/instance-features.js";import{setLogRetentionDays as Jt}from"../services/log-retention.js";import{enqueueMcpLaunchBinding as Qt}from"../services/mcp-launch-binding-queue.js";import{setPanelEnvVars as Zt,setAgentMeta as en}from"../services/panel-env.js";import{findClaudeCodeProcesses as tn,isProcessRunning as nn}from"../services/process-detector.js";import{forgetSession as q,onSdkToolUseEnd as on,onSdkToolUseStart as sn}from"../services/sdk-tool-file-change-recorder.js";import{bridgeEventBuffer as at,sendOutput as Y,sendQuestionRequest as rn,sendToolAuthRequest as an,sendStatus as $}from"../services/session-output.js";import{getSnapshotRetentionDays as Le,setSnapshotRetentionDays as cn}from"../services/snapshot-retention.js";import{findPersistedSessionByAgentId as un,removePersistedSession as X,savePersistedSessions as dn,updatePersistedSessionAutoCommands as ln,updatePersistedSessionRuntimeState as fn,upsertPersistedSession as pn}from"../services/terminal-persistence.js";import{extractUserScope as mn,normalizeUserScope as gn}from"../services/user-scope.js";import{getInstanceAiConfigDebugLogger as yn}from"../utils/instance-ai-config-debug-logger.js";import{logger as l}from"../utils/logger.js";const S=Pt();function ct(e){const n=e.header("X-Runtime-Token");return n&&n.trim()?n.trim():(e.header("Authorization")||"").match(/^Bearer\s+(.+)$/i)?.[1]?.trim()||void 0}const p=new Map,In=45e3,me=new Map;function hn(e){if(me.has(e))return;const n=setInterval(()=>{const t=p.get(e);if(!t){U(e);return}const o=t.currentRuntimeStatus;if(o!=="thinking"&&o!=="tool_using"&&o!=="compacting"){U(e);return}$(t.agentId,e,o,void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl}).catch(()=>{})},In);me.set(e,n)}function U(e){const n=me.get(e);n&&(clearInterval(n),me.delete(e))}const ut=4e3,Tn=200,Sn=2e3,dt=24e3,lt=200,ft=8e3;function An(e){if(!Array.isArray(e)||e.length===0)return{snapshot:"",truncated:!1};const n=[];let t=null,o=[];const r=()=>{if(t===null)return;const u=o.join("").trim();if(o=[],!u){t=null;return}const d=t==="user"?"\u7528\u6237":t==="assistant"?"\u52A9\u624B":t;n.push(`\u3010${d}\u3011${ge(u,Sn)}`),t=null};for(const u of e){const d=String(u?.role||"").trim();if(!d||d==="system")continue;if(d==="tool_use"||d==="tool_result"){r();const f=String(u.toolName||"").trim()||"\u672A\u77E5\u5DE5\u5177";if(kn(f))continue;if(d==="tool_use"){const y=On(String(u.content||""));n.push(`\u3010\u5DE5\u5177\u8C03\u7528\u3011${f}${y?` ${y}`:""}`)}else{const y=ge(String(u.content||"").trim(),Tn);n.push(`\u3010\u5DE5\u5177\u7ED3\u679C\u3011${f}${u.isError?"\uFF08\u5931\u8D25\uFF09":""}${y?`\uFF1A${y}`:""}`)}continue}const m=String(u.content||"");m.trim()&&(t===d||(r(),t=d),o.push(m))}if(r(),n.length===0)return{snapshot:"",truncated:!1};const s=n.join(`
|
|
2
|
+
`);if(s.length<=dt)return{snapshot:s,truncated:!1};const i=dt-ft,a=s.slice(0,ft),c=s.slice(s.length-i);return{snapshot:`${a}
|
|
3
3
|
|
|
4
|
-
...\uFF08\u6B64\u5904\u7701\u7565\u4E2D\u6BB5 ${
|
|
4
|
+
...\uFF08\u6B64\u5904\u7701\u7565\u4E2D\u6BB5 ${s.length-a.length-c.length} \u5B57\u7B26\u5386\u53F2\uFF09...
|
|
5
5
|
|
|
6
|
-
${c}`,truncated:!0}}function ge(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
|
|
6
|
+
${c}`,truncated:!0}}function ge(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 kn(e){const n=e.toLowerCase();return n.includes("poll_message")||n.includes("get_message")||n.includes("await_complete")}const _n="raw-transcript",pt="conversation";function bn(e){const{sessionId:n,agentId:t,workspacePath:o,providerId:r,exportRawTranscript:s,getConversation:i,getTotalUsage:a}=e;let c=r==="acode"?_n:pt,u=null;if(r==="acode"&&typeof s=="function")try{const f=s(n);Array.isArray(f)&&(u=f)}catch(f){l.warn(`[CONTEXT-JSON] exportRawTranscript \u5931\u8D25\uFF0C\u964D\u7EA7\u7EDF\u4E00\u89C6\u56FE: sessionId=${n} error=${f instanceof Error?f.message:String(f)}`)}u===null&&(r==="acode"&&(c=pt),u=i(n)??[]);let d;try{d=a?.(n)}catch(f){l.warn(`[CONTEXT-JSON] getTotalUsage \u5931\u8D25\uFF0CtokenUsage \u7F6E\u7A7A: sessionId=${n} error=${f instanceof Error?f.message:String(f)}`),d=void 0}const m=d?{inputTokens:d.inputTokens??null,outputTokens:d.outputTokens??null,contextLimit:d.contextLimit??null,maxOutput:d.maxOutput??null,inputLimit:d.inputLimit??null,compactionThreshold:d.compactionThreshold??null,totalInputTokens:d.totalInputTokens??null,totalOutputTokens:d.totalOutputTokens??null,cacheHitTokens:d.cacheHitTokens??null,cacheMissTokens:d.cacheMissTokens??null}:null;return{ok:!0,sessionId:n,agentId:t,workspacePath:o,providerId:r,format:c,messages:u,messageCount:u.length,tokenUsage:m,fetchedAt:Date.now()}}function Cn(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"]),o=1e6,s=n.filter(i=>!!i&&typeof i=="object"&&t.has(String(i.role))).filter(i=>JSON.stringify(i).length<=o).slice(0,5e3);return s.length>0?s:void 0}catch{return}}function En(e){if(!(typeof e!="string"||!e.trim()))try{const n=JSON.parse(e);if(!n||typeof n!="object"||Array.isArray(n))return;const t=a=>{const c=Number(a);return Number.isFinite(c)&&c>=0?c:void 0},o=t(n.totalInputTokens),r=t(n.totalOutputTokens),s=t(n.cacheHitTokens),i=t(n.cacheMissTokens);return o===void 0&&r===void 0&&s===void 0&&i===void 0?void 0:{...o!==void 0?{totalInputTokens:o}:{},...r!==void 0?{totalOutputTokens:r}:{},...s!==void 0?{cacheHitTokens:s}:{},...i!==void 0?{cacheMissTokens:i}:{}}}catch{return}}const Rn="\u6CE8\u610F\uFF1A\u4E0A\u6B21\u8FD0\u884C\u56E0\u610F\u5916\u4E2D\u65AD\u5BFC\u81F4\u672C\u5B9E\u4F8B\u8FDB\u5165\u4E86\u4F11\u7720\uFF0C\u4E0A\u9762\u7684\u5FEB\u7167\u662F\u4E2D\u65AD\u524D\u6700\u540E\u4E00\u6B21\u81EA\u52A8\u4FDD\u5B58\u7684\u8FDB\u5EA6\uFF0C\u90E8\u5206\u6700\u8FD1\u7684\u5DE5\u4F5C\u72B6\u6001\u53EF\u80FD\u5DF2\u7ECF\u4E22\u5931\u3002\u9047\u5230\u4E2D\u65AD\u5BFC\u81F4\u4F60\u8FDB\u5165\u4E86\u4F11\u7720\uFF0C\u90E8\u5206\u5DE5\u4F5C\u72B6\u6001\u53EF\u80FD\u5DF2\u7ECF\u4E22\u5931\uFF0C\u8BF7\u7EE7\u7EED\u5DE5\u4F5C\uFF01\u884C\u52A8\u524D\u5148\u81EA\u67E5\u73B0\u573A\uFF08\u8BFB\u6587\u4EF6/poll_message\uFF09\uFF0C\u786E\u8BA4\u4E0A\u4E00\u6B65\u662F\u5426\u5DF2\u843D\u76D8\uFF0C\u518D\u7EE7\u7EED\u63A8\u8FDB\u672A\u5B8C\u6210\u7684\u4E8B\u9879\u3002",mt="\u6CE8\u610F\uFF1A\u672C\u5B9E\u4F8B\u4E0A\u6B21\u6B63\u5E38\u7ED3\u675F\u8FD0\u884C\u5E76\u81EA\u52A8\u4FDD\u5B58\u4E86\u5B8C\u6574\u8FDB\u5EA6\u3002\u8BF7\u57FA\u4E8E\u5FEB\u7167\u7EE7\u7EED\u63A8\u8FDB\u672A\u5B8C\u6210\u7684\u4E8B\u9879\u3002",$n="\u4F11\u7720\u91CD\u65B0\u9192\u6765\uFF0C\u90E8\u5206\u8FD0\u884C\u72B6\u6001\u53EF\u80FD\u5DF2\u4E22\u5931\uFF0C\u8BF7\u7EE7\u7EED\u5DE5\u4F5C\u3002";function wn(e,n){return n.crashRecoveryApplied||n.resumeTranscriptCount>0||typeof n.resumeContext=="string"&&n.resumeContext.trim().length>0?$n:e}function On(e){const n=String(e??"").trim();if(!n)return"";let t;try{const r=JSON.parse(n);if(!r||typeof r!="object"||Array.isArray(r))return"";t=r}catch{return ge(n,lt)}const o=[];for(const r of["file_path","path","filePath","pattern","query","command","cmd","url"]){const s=t[r];if(typeof s=="string"&&s.trim()&&o.push(`${r}=${s.trim()}`),o.length>=3)break}if(o.length===0){const r=Object.keys(t).slice(0,5);return r.length>0?`(${r.join(", ")})`:""}return ge(o.join(" "),lt)}function gt(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 V=new Set;function Dn(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 Mn(e){return e!=="acode"}function Pn(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,o=typeof e=="object"&&e!==null&&"discardContext"in e&&e.discardContext===!0;return{statusNotified:!n,reason:t,discardContext:o}}function Z(e){const n=e?.usage;if(!n)return;const t=Number.isFinite(n.inputTokens)?n.inputTokens:0,o=Number.isFinite(n.outputTokens)?n.outputTokens:0;if(t<=0&&o<=0&&!n.contextLimit&&!n.maxOutput&&!n.inputLimit&&!n.compactionThreshold&&n.totalInputTokens===void 0&&n.totalOutputTokens===void 0)return;const r={inputTokens:t,outputTokens:o,...n.contextLimit?{contextLimit:n.contextLimit}:{},...n.maxOutput?{maxOutput:n.maxOutput}:{},...n.inputLimit?{inputLimit:n.inputLimit}:{},...n.compactionThreshold?{compactionThreshold:n.compactionThreshold}:{},...n.cacheHitTokens!==void 0?{cacheHitTokens:n.cacheHitTokens}:{},...n.cacheMissTokens!==void 0?{cacheMissTokens:n.cacheMissTokens}:{},...n.totalInputTokens!==void 0?{totalInputTokens:n.totalInputTokens}:{},...n.totalOutputTokens!==void 0?{totalOutputTokens:n.totalOutputTokens}:{}};return process.env.ACODE_TOKEN_DEBUG==="1"&&(r.inputTokens>0||r.outputTokens>0||r.cacheHitTokens!==void 0||r.cacheMissTokens!==void 0||r.totalInputTokens!==void 0||r.totalOutputTokens!==void 0)&&l.info(`[TokenDebug][Terminal] resolveStatusChangeUsage: input=${r.inputTokens} output=${r.outputTokens} cacheHit=${r.cacheHitTokens??"(none)"} cacheMiss=${r.cacheMissTokens??"(none)"} totalInput=${r.totalInputTokens??"(none)"} totalOutput=${r.totalOutputTokens??"(none)"} actionType=${e?.actionType??"(none)"}`),r}function Ln(e,n){const t=String(e||"").trim().toLowerCase(),o=String(n?.actionType||"").trim().toLowerCase();return t==="tool_using"&&o==="idle"?n?{status:"waiting_input",actionInfo:n}:{status:"waiting_input"}:n?{status:e,actionInfo:n}:{status:e}}function xn(e){return e.restoredActionInfo?.actionType==="idle"||e.currentRuntimeActionType==="idle"&&e.shouldPreservePrevAction||e.status==="waiting_input"&&!e.actionInfo?.actionType}function Un(e){return e.actionInfo?.actionType?!1:!!e.usage}const ee=new Map,Nn="utf-8",yt="utf-8",It=300,ht=6e4;function te(e){return String(e).padStart(2,"0")}function jn(e,n=new Date){const t=n.getFullYear(),o=te(n.getMonth()+1),r=te(n.getDate()),s=te(n.getHours()),i=te(n.getMinutes()),a=`${t}${o}${r}-${s}${i}${te(n.getSeconds())}-${String(n.getMilliseconds()).padStart(3,"0")}`;return de.join(qe(),"cmd-dist",e,`${t}-${o}-${r}`,s,i,`${a}-cmd.out`)}function Bn(e){if(!e)return 0;const n=e.replace(/\r\n/g,`
|
|
7
7
|
`).replace(/\r/g,`
|
|
8
8
|
`),t=n.endsWith(`
|
|
9
9
|
`)?n.slice(0,-1):n;return t?t.split(`
|
|
10
|
-
`).length:1}function
|
|
10
|
+
`).length:1}function vn(e,n=It){return`\r
|
|
11
11
|
[ACode] \u547D\u4EE4\u8F93\u51FA\u8D85\u8FC7 ${n} \u884C\uFF0C\u5B8C\u6574\u8F93\u51FA\u5DF2\u5199\u5165: ${e}\r
|
|
12
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
|
|
13
|
-
`}function
|
|
13
|
+
`}function Fn(e=ht){return`\r
|
|
14
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
|
|
15
|
-
`}async function
|
|
16
|
-
`).trim()}function
|
|
17
|
-
`),!0;const
|
|
18
|
-
`),!0):(E(e,`cd: not a directory: ${
|
|
19
|
-
`),!0)}catch(
|
|
20
|
-
`),!0}}async function
|
|
21
|
-
`),
|
|
22
|
-
`),E(t,
|
|
23
|
-
[ACode] \u547D\u4EE4\u8F93\u51FA\u843D\u76D8\u5931\u8D25: ${
|
|
15
|
+
`}async function Tt(e){const n=e.outputPath||jn(e.agentId,e.startedAt);return e.outputPath=n,await ue.mkdir(de.dirname(n),{recursive:!0}),await ue.writeFile(n,e.chunks.join(""),"utf-8"),n}function Hn(e){return String(e??"").replace(/\r/g,`
|
|
16
|
+
`).trim()}function Kn(e=process.platform,n=process.env){const t=n.AWS_TERMINAL_OUTPUT_ENCODING?.trim();return t||(e==="win32"?Nn:yt)}function St(e=Kn()){if(e!=="utf-8")try{return new le(e,{fatal:!1})}catch{return new le(yt,{fatal:!1})}return Wn()}function Wn(){let e=null,n=null,t=null;const o=[];function r(s){try{return new le(s,{fatal:!1})}catch{return new le("utf-8",{fatal:!1})}}return{decode(s,i){if(s!=null&&o.push(s instanceof ArrayBuffer?Buffer.from(s):Buffer.isBuffer(s)?s:Buffer.from(s.buffer,s.byteOffset,s.byteLength)),t==="gb18030")return n||(n=r("gb18030")),n.decode(s,i);e||(e=r("utf-8"));const a=e.decode(s,i);if(t===null&&a.includes("\uFFFD")){t="gb18030",n=r("gb18030");const c=Buffer.concat(o);return n.decode(c)}return t===null&&!i?.stream&&(t="utf-8"),a}}}function ye(e,n,t=!1){return t?e.decode():!n||n.length===0?"":e.decode(n,{stream:!0})}function zn(e){const n=e.trim().match(/^cd(?:\s+(.*))?$/i);if(!n)return;const t=n[1]?.trim();if(!t)return null;const o=t.replace(/^\/d\s+/i,"").trim();return o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'")?o.slice(1,-1):o}function qn(e){const n=ee.get(e.sessionId);if(n)return n;const t={currentDirectory:e.workspacePath,runningProcess:null};return ee.set(e.sessionId,t),t}function At(e){for(const n of p.values())if(n.agentId===e)return n}async function Yn(e){const n=_.get(e.providerId||"claude-code"),t=ne(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 ne(e,n,t){const o=String(e||"").trim();if(o){const s=String(n||"").trim(),i=String(t||"").trim().toLowerCase();return o.toLowerCase()==="tool_using"&&s.toLowerCase()==="waiting_input"&&i==="idle"?s:o}return String(n||"").trim()||"running"}async function Xn(e,n=nn){return e.pid?await n(e.pid)?Et(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 ms(e){try{fe(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}`),U(t),p.delete(t),q(t),Ie(t),X(t).catch(o=>{l.warn(`[cleanupSdkSessionByAgentId] Failed to remove persisted session for agentId=${e}: ${o}`)}),t}V.has(e)&&(V.delete(e),l.info(`[cleanupSdkSessionByAgentId] Released startingAgents lock for agentId=${e}`))}function Ie(e){const n=ee.get(e);if(!n?.runningProcess){ee.delete(e);return}try{n.runningProcess.kill()}catch{}finally{n.runningProcess=null,ee.delete(e)}}function E(e,n){n&&(e.seq+=1,Y(e.agentId,n,e.sessionId,e.seq,void 0,{runtimeAccessToken:e.runtimeAccessToken,schedulerBaseUrl:e.schedulerBaseUrl}).catch(()=>{}))}function xe(e){return`\x1B[36m${e}>\x1B[0m `}function Vn(e,n){return n==="~"?Ot.homedir():de.resolve(e,n)}async function Gn(e,n,t){const o=zn(t);if(o===void 0)return!1;if(o===null)return E(e,`${n.currentDirectory}\r
|
|
17
|
+
`),!0;const r=Vn(n.currentDirectory,o);try{return(await ue.stat(r)).isDirectory()?(n.currentDirectory=r,E(e,`${n.currentDirectory}\r
|
|
18
|
+
`),!0):(E(e,`cd: not a directory: ${r}\r
|
|
19
|
+
`),!0)}catch(s){const i=s instanceof Error?s.message:String(s);return E(e,`cd: ${i}\r
|
|
20
|
+
`),!0}}async function Jn(e,n){const t=p.get(e);if(!t)throw new Error("SDK session not found");const o=Hn(n),r=qn(t);if(!o)return{started:!1,cwd:r.currentDirectory};if(r.runningProcess)throw new Error("A terminal command is already running for this session");const s=z(o);if(E(t,`${xe(r.currentDirectory)}${s}\r
|
|
21
|
+
`),We(o))return E(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
|
+
`),E(t,xe(r.currentDirectory)),{started:!1,cwd:r.currentDirectory};if(await Gn(t,r,o))return{started:!1,cwd:r.currentDirectory};await $(t.agentId,e,"tool_using",{actionType:"bash",actionLabel:"\u7EC8\u7AEF\u547D\u4EE4",actionDetail:s},void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl});const a=wt(o,{cwd:r.currentDirectory,shell:!0,env:kt(t.agentId,t.workspacePath,process.env,t.config.envOverrides)});r.runningProcess=a;const c=St(),u=St(),d=t.providerId==="acode",m={agentId:t.agentId,startedAt:new Date,chunks:[],spilled:!1};let f;const y=()=>{f&&(clearTimeout(f),f=void 0)},C=()=>{y(),f=setTimeout(()=>{r.runningProcess===a&&(E(t,Fn()),a.kill())},ht)},w=(I,P=!0)=>{if(I&&(d&&m.chunks.push(I),d&&P&&C(),!(d&&m.spilled))){if(d&&Bn(m.chunks.join(""))>It){m.spilled=!0,Tt(m).then(b=>{E(t,vn(b))}).catch(b=>{const W=b instanceof Error?b.message:String(b);E(t,`\r
|
|
23
|
+
[ACode] \u547D\u4EE4\u8F93\u51FA\u843D\u76D8\u5931\u8D25: ${W}\r
|
|
24
24
|
`)});return}E(t,I)}};return d&&C(),a.stdout.on("data",I=>{w(ye(c,I))}),a.stderr.on("data",I=>{w(ye(u,I))}),a.on("error",I=>{E(t,`\r
|
|
25
25
|
[Terminal Error] ${I.message}\r
|
|
26
|
-
`)}),a.on("close",(I,
|
|
27
|
-
[ACode] \u547D\u4EE4\u8F93\u51FA\u6700\u7EC8\u843D\u76D8\u5931\u8D25: ${
|
|
26
|
+
`)}),a.on("close",(I,P)=>{y(),r.runningProcess=null,w(ye(c,void 0,!0),!1),w(ye(u,void 0,!0),!1),m.spilled&&Tt(m).catch(b=>{const W=b instanceof Error?b.message:String(b);E(t,`\r
|
|
27
|
+
[ACode] \u547D\u4EE4\u8F93\u51FA\u6700\u7EC8\u843D\u76D8\u5931\u8D25: ${W}\r
|
|
28
28
|
`)}),I&&I!==0?E(t,`\r
|
|
29
29
|
[exit ${I}]\r
|
|
30
|
-
`):
|
|
31
|
-
[signal ${
|
|
32
|
-
`),E(t,
|
|
33
|
-
...\uFF08\u7ED3\u679C\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`}function
|
|
30
|
+
`):P&&E(t,`\r
|
|
31
|
+
[signal ${P}]\r
|
|
32
|
+
`),E(t,xe(r.currentDirectory)),$(t.agentId,e,"waiting_input",void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl})}),{started:!0,cwd:r.currentDirectory}}function kt(e,n,t,o,r){const s={};for(const[i,a]of Object.entries(t))a!==void 0&&(s[i]=a);if(n&&(s.AWS_WORKSPACE_PATH=String(n)),r&&String(r).trim()&&(s.AWS_PROJECT_ROOT=String(r).trim()),o)for(const[i,a]of Object.entries(o)){const c=i.trim();if(!c||a===void 0||a===null)continue;const u=String(a).trim();u&&(s[c]=u)}return s.AWS_AGENT_ID=String(e),s.AWS_MCP_CLAIM_LAUNCH_BINDING="true",s.AWS_RUNTIME_BRIDGE_BASE_URL=`http://127.0.0.1:${Nt()}`,String(s.ACODE_HOME||"").trim()||(s.ACODE_HOME=qe()),h(e,Xe)!=="disabled"&&(s.AWS_LAUNCH_CONFIG_TOOLS=h(e,Xe)),h(e,Ve)!=="disabled"&&(s.AWS_HIRE_TOOLS=h(e,Ve)),h(e,Ge)!=="disabled"&&(s.AWS_PENCIL_TOOLS=h(e,Ge)),h(e,Je)!=="disabled"&&(s.AWS_DRAW_TOOLS=h(e,Je)),h(e,Qe)!=="disabled"&&(s.AWS_OFFICE_TOOLS=h(e,Qe)),h(e,Ze)!=="disabled"&&(s.AWS_COLLABORATION_TASK_TOOLS=h(e,Ze)),h(e,et)!=="disabled"&&(s.AWS_COLLABORATION_MEETING_TOOLS=h(e,et)),h(e,tt)!=="disabled"&&(s.AWS_COLLABORATION_DEBUG_TOOLS=h(e,tt)),h(e,nt)!=="disabled"&&(s.AWS_COLLABORATION_FILE_HISTORY_TOOLS=h(e,nt)),h(e,ot)!=="disabled"&&(s.AWS_COLLABORATION_VOICE_TOOLS=h(e,ot)),h(e,st)!=="disabled"&&(s.AWS_EMAIL_TOOLS=h(e,st)),h(e,rt)!=="disabled"&&(s.AWS_ABILITY_MARKET_TOOLS=h(e,rt)),h(e,it)!=="disabled"&&(s.AWS_ABILITY_DEV_TOOLS=h(e,it)),s}function Qn(e){const n=e.trim(),t=n[0],o=n[n.length-1];return(t==='"'||t==="'")&&t===o?n.slice(1,-1):n}async function Zn(e){const n=String(e);if(!We(n))return n;const t=Qn(n);return de.isAbsolute(t)?ue.readFile(t,"utf-8"):n}function eo(e,n){const t={};for(const r of[e?.env,n])if(r)for(const[s,i]of Object.entries(r)){const a=s.trim();if(!a||i===void 0||i===null)continue;const c=String(i).trim();c&&(t[a]=c)}const o=t.ANTHROPIC_MODEL?.trim()||t.CODEX_MODEL?.trim()||void 0;return{envOverrides:t,model:o}}function to(e){if(e==null)return;const t=(typeof e=="string"?e:JSON.stringify(e,null,2)).trim();if(t)return t.length<=ut?t:`${t.slice(0,ut)}
|
|
33
|
+
...\uFF08\u7ED3\u679C\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`}function no(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 oo(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 so(e){if(e.type!=="tool_use_end")return;const n=to(e.data.toolResult??e.data.actionResult);if(!n)return;const t=Me(e.data.toolName,e.data.toolInput),o=e.data.actionType||t.actionType;if(o==="idle"){const r=String(e.data.rawToolName||e.data.toolName||"").toLowerCase();if((r.includes("poll_message")||r.includes("get_message"))&&!no(n))return}return o==="mcp"&&oo(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:o,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:e.data.actionDetail||t.actionDetail||e.data.toolName,actionId:e.data.actionId||e.data.toolUseId,actionResult:n,...e.data.parentId?{parentId:e.data.parentId}:{}}}function ro(e){if(e.type==="ai_request"){const n=e.data.model?` ${e.data.model}`:"",t=e.data.lastUserMessagePreview?`\uFF1A${e.data.lastUserMessagePreview}`:"";return`\r
|
|
34
34
|
[ACode] \u6B63\u5728\u8BF7\u6C42\u6A21\u578B${n}${t}\r
|
|
35
35
|
`}if(e.type==="text_delta"||e.type==="thinking"||e.type==="compaction_summary"||e.type==="command_output")return e.data.text||void 0;if(e.type==="error")return e.data.text?`\r
|
|
36
36
|
[SDK Error] ${e.data.text}\r
|
|
37
|
-
`:void 0}function
|
|
38
|
-
...\uFF08\u8F93\u5165\u53C2\u6570\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`:n}catch{return}}function lo(e,n){return String(n||"").trim().toLowerCase()!=="waiting_input"?!1:e.type==="thinking"||e.type==="text_delta"}function fo(e,n){if(!lo(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=Me(e.data.toolName,e.data.toolInput),o=_t(e,t),s=uo(e.data.toolInput);return e.data.actionType==="idle"||t.actionType==="idle"?{status:"waiting_input",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:o||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput: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:o||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 B=new Map,Se=new Map,he=new Map;async function Ne(e){const{entry:n,sessionId:t,actionInfo:o,timestamp:s,sourceEventType:r,backoffBaseMs:i,label:a}=e,c={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl},u=3;for(let d=0;d<u;d++){if(await $(n.agentId,t,"tool_result",o,void 0,c,s,r)!==void 0)return;d<u-1&&await new Promise(p=>setTimeout(p,i*(d+1)))}l.warn(`[Runtime] ${a} tool_result sendStatus retry exhausted (result may be lost): agentId=${n.agentId}`)}const oe=new Map,po=20,mo=500,go=3e4;async function Te(e,n=go,t=2){for(let o=0;o<=t;o++){const s=new AbortController;let r;try{const i=e(s.signal);i.catch(()=>{}),await Promise.race([i,new Promise((a,c)=>{r=setTimeout(()=>{s.abort(),c(new Error(`sendOutput timeout after ${n}ms`))},n)})]),r&&clearTimeout(r);return}catch(i){r&&clearTimeout(r);const a=i instanceof Error?i.message:String(i);if(o<t){const c=1e3*(o+1);l.warn(`sendOutput attempt ${o+1}/${t+1} failed (${a}), retrying in ${c}ms...`),await new Promise(u=>setTimeout(u,c));continue}l.warn(`sendOutput failed after ${t+1} attempts (${a}), giving up to unblock serial queue`)}}}async function yo(e,n,t,o,s,r){try{await Y(e,n,t,o,{...s,sourceEventType:"compaction_summary",skipLocalPersist:!0},r)}catch(i){l.debug("Compaction summary realtime push failed (non-persisted)",{agentId:e,sessionId:t,error:i instanceof Error?i.message:String(i)})}}const Ae=new Map,Io=120,So=120;function ho(e,n,t,o){const s=`${n}:compaction_summary`;let r=Ae.get(s);if(r||(r={buffer:"",timer:null,entry:e,sessionId:n,seq:o},Ae.set(s,r)),r.buffer+=t,r.seq=o,r.entry=e,r.buffer.length>=Io){je(n);return}r.timer||(r.timer=setTimeout(()=>je(n),So))}function je(e){const n=`${e}:compaction_summary`,t=Ae.get(n);if(!t)return;t.timer&&(clearTimeout(t.timer),t.timer=null);const o=t.buffer;Ae.delete(n),o&&yo(t.entry.agentId,o,t.sessionId,t.seq,{sourceEventType:"compaction_summary",skipLocalPersist:!0},{runtimeAccessToken:t.entry.runtimeAccessToken,schedulerBaseUrl:t.entry.schedulerBaseUrl})}function ke(e,n){const t=n?`${e}:${n}`:void 0;let o,s;if(t)o=oe.get(t),s=t;else{const y=[];for(const[C,w]of oe)C.startsWith(e+":")&&w.buffer&&y.push(w.sourceEventType);for(const C of y)ke(e,C);return}if(!o||!o.buffer)return;o.timer=null;const r=o.buffer,i=o.seq,a=o.entry,c=o.sourceEventType;o.buffer="",s&&oe.delete(s);const u={sourceEventType:c,logCategory:"acode"},d={runtimeAccessToken:a.runtimeAccessToken,schedulerBaseUrl:a.schedulerBaseUrl},p=(B.get(e)??Promise.resolve()).then(()=>Te(y=>Y(a.agentId,r,e,i,u,d,y)),()=>Te(y=>Y(a.agentId,r,e,i,u,d,y)));B.set(e,p),p.finally(()=>{B.get(e)===p&&B.delete(e)})}function To(e,n){const t=Zn(e);if(!t)return;n.seq+=1;const o=n.seq,s=eo(e),r={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl};if(e.type==="compaction_summary"){ho(n,e.sessionId,t,o);return}if((e.type==="command_output"||e.type==="text_delta"||e.type==="thinking")&&t.length<po){const c=`${e.sessionId}:${e.type}`;let u=oe.get(c);if(u||(u={buffer:"",seq:0,timer:null,entry:n,sourceEventType:e.type}),u.buffer+=t,u.seq=o,u.entry=n,!u.timer){const d=e.sessionId,g=e.type;u.timer=setTimeout(()=>ke(d,g),mo)}oe.set(c,u);return}ke(e.sessionId);const a=(B.get(e.sessionId)??Promise.resolve()).then(()=>Te(c=>Y(n.agentId,t,e.sessionId,o,s,r,c)),()=>Te(c=>Y(n.agentId,t,e.sessionId,o,s,r,c)));B.set(e.sessionId,a),a.finally(()=>{B.get(e.sessionId)===a&&B.delete(e.sessionId)})}function Ct(e){return Pt(e)}let Et=!1;function Ao(){Et||(Lt(_,ko),Ft(),Et=!0)}function ko(e,n){e.on("event",t=>{const o=f.get(t.sessionId);if(o){if(t.type==="tool_use_start"?nn(o.sessionId,t.data.toolUseId||t.data.actionId,t.data.toolInput,t.data.toolName,o.workspacePath):t.type==="tool_use_end"&&tn(t,{sessionId:o.sessionId,agentId:o.agentId,workspacePath:o.workspacePath,providerId:o.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==="compaction_summary"||t.type==="ai_request"||t.type==="error")){t.type==="runtime_capabilities"&&t.data.actionDetail&&(o.cachedCapabilitiesActionDetail=t.data.actionDetail);const i=fo(t,o.currentRuntimeStatus);i&&$(o.agentId,t.sessionId,i.status,i.actionInfo,Z(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl},t.timestamp?new Date(t.timestamp).getTime():void 0,t.type)}t.type==="context_compaction"&&je(t.sessionId),To(t,o);const r=Qn(t);if(r){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");Ne(a?{entry:o,sessionId:t.sessionId,actionInfo:r,timestamp:i,sourceEventType:t.type,backoffBaseMs:3e3,label:"browser_launch"}:c?{entry:o,sessionId:t.sessionId,actionInfo:r,timestamp:i,sourceEventType:t.type,backoffBaseMs:1e3,label:"todo_write"}:{entry:o,sessionId:t.sessionId,actionInfo:r,timestamp:i,sourceEventType:t.type,backoffBaseMs:1e3,label:"tool_result"})}}}),e.on("status-change",(t,o,s)=>{const r=f.get(t);if(r){ke(t),o==="thinking"||o==="tool_using"||o==="compacting"?yn(t):U(t);const i=$n(o,s);r.currentRuntimeStatus=i.status;const a=r.currentRuntimeActionDetail??"",c=a.includes("poll_message")||a.includes("get_message"),d=!(i.actionInfo?.actionType==="ai_request")&&(i.status==="thinking"||i.status==="waiting_input")&&(r.currentRuntimeActionType==="idle"||r.currentRuntimeActionType==="mcp")&&c;(i.actionInfo?.actionType||!d)&&(r.currentRuntimeActionType=i.actionInfo?.actionType,r.currentRuntimeActionLabel=i.actionInfo?.actionLabel,r.currentRuntimeActionDetail=i.actionInfo?.actionDetail,r.currentRuntimeActionInput=i.actionInfo?.actionInput),l.info(`[${n.displayName} Adapter] Status changed: ${i.status} for agent ${r.agentId}`,i.actionInfo||""),dn(t,{runtimeStatus:i.status,runtimeActionType:r.currentRuntimeActionType,runtimeActionLabel:r.currentRuntimeActionLabel,runtimeActionDetail:r.currentRuntimeActionDetail});const g=On({actionInfo:i.actionInfo,usage:Z(i.actionInfo)}),p=g?void 0:i.actionInfo?.actionType?i.actionInfo:r.currentRuntimeActionType?{actionType:r.currentRuntimeActionType,actionLabel:r.currentRuntimeActionLabel??"",actionDetail:r.currentRuntimeActionDetail,actionInput:r.currentRuntimeActionInput}:void 0;if(i.status==="compacting"){const C=(Se.get(t)??Promise.resolve()).then(async()=>{for(let I=0;I<=2;I++){if(await $(r.agentId,t,i.status,p,Z(i.actionInfo),{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl})!==void 0)return;I<2&&(l.warn(`[${n.displayName}] compaction sendStatus attempt ${I+1} failed (HTTP), retrying in ${1e3*(I+1)}ms...`),await new Promise(b=>setTimeout(b,1e3*(I+1))))}l.warn(`[${n.displayName}] compaction sendStatus failed after 3 attempts, event may be lost`)}).catch(w=>{l.warn(`[${n.displayName}] compaction status chain error:`,w)});Se.set(t,C),C.finally(()=>{Se.get(t)===C&&Se.delete(t)})}else{const y=d&&!i.actionInfo?.actionType||g;if(wn({status:i.status,actionInfo:i.actionInfo,restoredActionInfo:p,currentRuntimeActionType:r.currentRuntimeActionType,shouldPreservePrevAction:d})){const I=(he.get(t)??Promise.resolve()).then(async()=>{for(let b=0;b<=2;b++){if(await $(r.agentId,t,i.status,y?void 0:p,Z(i.actionInfo),{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl})!==void 0)return;b<2&&await new Promise(x=>setTimeout(x,1e3*(b+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(L=>{l.warn(`[${n.displayName}] idle status chain error:`,L)});he.set(t,I),I.finally(()=>{he.get(t)===I&&he.delete(t)})}else $(r.agentId,t,i.status,y?void 0:p,Z(i.actionInfo),{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl})}if(i.status==="waiting_input"&&r.cachedCapabilitiesActionDetail){const y=r.cachedCapabilitiesActionDetail;r.cachedCapabilitiesActionDetail=void 0,l.info(`[${n.displayName} Adapter] Re-sending cached runtime_capabilities for agent ${r.agentId} (session stabilized to waiting_input)`),$(r.agentId,t,"waiting_input",{actionType:"runtime_capabilities",actionLabel:"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:y},void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl})}}}),e.on("ask-user-question",t=>{const o=f.get(t.sessionId);o&&(l.info(`[${n.displayName} Adapter] AskUserQuestion for agent ${o.agentId}`),on(o.agentId,t.sessionId,Array.isArray(t.questions)?t.questions:[],{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl},t.toolCallId))}),e.on("tool-permission-request",t=>{const o=f.get(t.sessionId);o&&t.requestId&&(l.info(`[${n.displayName} Adapter] Tool permission request (${t.capability}) for agent ${o.agentId}`),rn(o.agentId,t.sessionId,{requestId:t.requestId,capability:t.capability,...t.detail||{}},{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl}))}),e.on("permission-request",t=>{const o=f.get(t.sessionId);if(o){l.info(`[${n.displayName} Adapter] Permission request: ${t.toolName} for agent ${o.agentId}`);const s=t.toolInput?W(JSON.stringify(t.toolInput).slice(0,400)):void 0;$(o.agentId,t.sessionId,"waiting_input",{actionType:"other",actionLabel:"\u6743\u9650\u786E\u8BA4",actionDetail:s||t.toolName},void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})}})}T.post("/start",h,async(e,n)=>{const{agentId:t,workspacePath:o,mode:s="sdk"}=e.body||{};if(!t||!o){n.status(400).json({error:"agentId and workspacePath are required"});return}const r=fn(e),i=pn(e.body?.tenantId??r?.tenantId,e.body?.ownerUserId??e.body?.userId??r?.userId);if(i)try{xt(String(t),i,String(e.body?.userId??"").trim()||void 0)}catch(c){if(c instanceof Error&&c.message.includes("agent-ownership-mismatch")){n.status(403).json({ok:!1,error:"agent-ownership-mismatch"});return}throw c}const a=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||Ye(ct(e))||void 0;if(Jt({agentId:String(t),workspacePath:String(o),serverUrl:e.body?.serverUrl||a,runtimeAccessToken:e.body?.runtimeAccessToken,userId:e.body?.userId,schedulerBaseUrl:a}),e.body?.runtimeFeatures!==null&&e.body?.runtimeFeatures!==void 0&&(Kt(String(t),e.body.runtimeFeatures),l.info(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u80FD\u529B\u5F00\u5173: ${JSON.stringify(Yt(String(t)))}`)),e.body?.inheritedFeatures!==null&&e.body?.inheritedFeatures!==void 0&&(Wt(String(t),e.body.inheritedFeatures),l.info(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u7EE7\u627F\u4E09\u6001\u5C42: ${JSON.stringify(Gt(String(t)))}`)),e.body?.capabilities!==void 0&&zt(String(t),e.body.capabilities),e.body?.capabilitiesInherited!==void 0&&qt(String(t),e.body.capabilitiesInherited),e.body?.envVars!==null&&e.body?.envVars!==void 0&&typeof e.body.envVars=="object"&&(Xt(String(t),e.body.envVars),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u6709\u6548\u73AF\u5883\u53D8\u91CF: ${Object.keys(e.body.envVars).length} \u9879 \u2192 \u5DE5\u5177\u5B50\u8FDB\u7A0B + MCP spec`)),e.body?.agentMeta!==void 0&&(Qt(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&&(jt(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?.snapshotRetentionDays!==void 0){const c=Pe();sn(e.body.snapshotRetentionDays),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u5FEB\u7167\u4FDD\u7559\u5929\u6570: ${e.body.snapshotRetentionDays??"\u4E0D\u6E05\u7406"}`),c!==Pe()&&vt(Pe())}if(e.body?.logRetentionDays!==void 0){const c=Math.min(Number(e.body.logRetentionDays)||0,7);c>0&&(Vt(c),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u65E5\u5FD7\u4FDD\u7559\u5929\u6570: ${c}`))}s&&s!=="sdk"&&console.warn(`[Runtime] Unsupported runtime mode "${s}" requested for agent ${t}; starting SDK session instead.`),await _o(e,n)});async function _o(e,n){const{agentId:t,workspacePath:o,command:s,projectRoot:r,autoAccept:i=!0,initialPrompt:a,systemPrompt:c,globalPrompt:u,rolePrompt:d,memory:g,resumeContext:p,resumeTranscript:y,resumeTokenUsage:C,mcpConfigPath:w,extraMcpServers:I,envOverrides:L,idleInputAutoCommand:b,nonInputAutoCommand:K,model:x,instanceAiConfig:_e,subAgentModel:be,subAgentEffort:Ce,scopeKey:Be,browserAllowPrivate:Fe}=e.body||{},z=An(y),re=kn(C);l.info(`[HIBERNATE-IMPORT] \u542F\u52A8\u8BF7\u6C42\u643A\u5E26\u4F11\u7720\u6062\u590D: agentId=${String(t||"").trim()||"?"} resumeContext=${typeof p=="string"?`${p.length}\u5B57`:"\u65E0"} resumeTranscript\u539F\u59CB=${typeof y=="string"?`${y.length}\u5B57`:typeof y} \u89E3\u6790\u7ED3\u679C=${z?`${z.length}\u6761`:"null"} resumeTokenUsage\u89E3\u6790=${re?JSON.stringify(re):"null"}`);let N=!1,se,Ee,Re;{const O=String(t||"").trim();if(O&&!z&&!(typeof p=="string"&&p.trim()))try{const m=await Ot(O);if(m&&Array.isArray(m.transcript)&&m.transcript.length>0){se=m.transcript;const k=m.tokenUsage,P=j=>typeof j=="number"&&Number.isFinite(j)?j:void 0;Ee=k?{...P(k.totalInputTokens)!==void 0?{totalInputTokens:P(k.totalInputTokens)}:{},...P(k.totalOutputTokens)!==void 0?{totalOutputTokens:P(k.totalOutputTokens)}:{},...P(k.cacheHitTokens)!==void 0?{cacheHitTokens:P(k.cacheHitTokens)}:{},...P(k.cacheMissTokens)!==void 0?{cacheMissTokens:P(k.cacheMissTokens)}:{}}:void 0,Re=m.reason==="clean"?pt:_n,N=!0,l.info(`[CRASH-RECOVERY] \u547D\u4E2D\u65AD\u70B9 journal: agentId=${O} reason=${m.reason} savedAt=${m.savedAt} messages=${m.messageCount}`)}}catch(m){l.warn(`[CRASH-RECOVERY] journal \u8BFB\u53D6\u5931\u8D25\uFF08\u6309\u65E0 journal \u5904\u7406\uFF09: agentId=${O}, error=${m instanceof Error?m.message:String(m)}`)}}const J=mn();J.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:_e?pe(_e):null,perAgentModel:x??null}});let R=null;const A=String(t||"").trim(),ie=String(e.body?.runtimeAccessToken||"").trim()||void 0,F=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||Ye(ct(e))||void 0;F?l.info(`[startSdkSession] \u56DE\u8C03\u76EE\u6807 server: ${F} (agentId=${A})`):l.warn(`[startSdkSession] \u672A\u89E3\u6790\u5230 schedulerBaseUrl\uFF0C\u5C06\u56DE\u9000\u5230\u9ED8\u8BA4\u5730\u5740 (agentId=${A})`);try{if(Ao(),!A){n.status(400).json({error:"agentId is required"});return}const O=Tt(A);if(O){n.json(await vn(O));return}const m=await an(A);if(m){const D=await Hn(m);if(!D.reusable)console.warn(`[Runtime] Ignoring stale persisted SDK session for agentId=${A}, sessionId=${m.sessionId}, reason=${D.reason}`),await G(m.sessionId);else{const M=ne(m.runtimeStatus,m.runtimeStatus,m.runtimeActionType);n.json({sessionId:m.sessionId,status:M,runtimeStatus:M,runtimeActionType:m.runtimeActionType,runtimeActionLabel:m.runtimeActionLabel,runtimeActionDetail:m.runtimeActionDetail,agentId:m.agentId,workspacePath:m.workspacePath,command:m.command,mode:m.mode||"sdk",pid:m.pid,reused:!0,persistedOnly:!0});return}}if(V.has(A)){n.status(409).json({error:"SDK session is already starting for this agent"});return}V.add(A);const k=Ct(s),P=_.get(k);R=Mt();const j=Gn(null,L),X=k==="acode"?x?String(x).trim():void 0:(()=>{const D=x?String(x).trim():void 0,M=j.model?String(j.model).trim():void 0;return D||M})();J.log({level:"info",category:"resolve",message:"\u6A21\u578B\u89E3\u6790\u7ED3\u679C",source:"bridge",agentId:A,sessionId:R??void 0,details:{perAgentModel:x??null,globalModel:j.model??null,resolvedModel:X??null,providerId:k,note:k==="acode"?"adapter handles full priority":"request > global"}});const $e={...j.envOverrides};X&&($e.ANTHROPIC_MODEL=X,$e.CODEX_MODEL=X);let Q,we=w;if(k==="acode"){const D=_e||{},M=await Ht({apiOverrides:mt(D)??void 0,agentId:A,sessionId:R??void 0,runtimeBridgeBaseUrl:F});Q=M.instanceConfig.config,we=M.perInstanceConfigPath,J.log({level:"info",category:"apply",message:"prepareAcodeInstanceConfig \u5B8C\u6210",source:"bridge",agentId:A,sessionId:R??void 0,details:{sanitizedApiOverrides:(()=>{const H=mt(D);return H?pe(H):null})(),resolvedInstanceAiConfig:Q?pe(Q):null,perInstanceConfigPath:we,instanceConfigSources:M.instanceConfig.source??null}})}let ve=c||void 0,Oe,De,ae;const ce=N?He(`\uFF08\u65E0\u8FDB\u5EA6\u6458\u8981\uFF1A\u5B8C\u6574\u5BF9\u8BDD\u8BB0\u5F55\u7ECF ${Re===pt?"\u6B63\u5E38\u6536\u5C3E\u843D\u76D8":"\u5D29\u6E83\u524D\u81EA\u52A8\u843D\u76D8"}\u5DF2\u539F\u6837\u63A5\u7EED\uFF09`,Re):typeof p=="string"&&p.trim()?He(p):void 0;if(k==="acode")if(Oe=typeof u=="string"&&u.trim()||void 0,De=typeof d=="string"&&d.trim()||void 0,typeof g=="string"&&g.trim())ae=g.trim();else{const D=await Nt(o,{schedulerBaseUrl:F,runtimeAccessToken:ie,agentId:A});D&&(ae=D,l.info(`[startSdkSession] Auto-loaded memories for ACode agent ${A}`))}else if(typeof u=="string"&&u.trim()||typeof d=="string"&&d.trim()||typeof g=="string"&&g.trim()||ce!==void 0){const M=[u,d,g,ce,c].filter(H=>typeof H=="string"&&H.trim().length>0).map(H=>H.trim());ve=M.length>0?M.join(`
|
|
37
|
+
`:void 0}function io(e){const n=uo(e);return{sourceEventType:e.type,logCategory:"acode",...co(e),...n?{logLevel:ao(e),logMessage:n}:{}}}function ao(e){return e.type==="error"?"error":e.type==="command_output"&&e.data.stream==="stderr"?"warn":"info"}function co(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 uo(e){if(e.type==="ai_request"){const n=e.data.model||"unknown-model",t=e.data.endpoint?` @ ${e.data.endpoint}`:"",o=typeof e.data.toolCount=="number"?`, tools=${e.data.toolCount}`:"";return`AI request started: ${n}${t}${o}`}if(e.type==="tool_use_start")return _t(e,"\u5F00\u59CB");if(e.type==="tool_use_end")return _t(e,"\u5B8C\u6210");if(e.type==="command_output")return po(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 lo=/\x1b\[[0-9;?]*[a-zA-Z]/g;function fo(e){return e.replace(lo,"")}function po(e){const n=typeof e.data.stream=="string"?e.data.stream:"mixed",t=typeof e.data.sequence=="number"?` #${e.data.sequence}`:"",o=fo(String(e.data.text||"")).replace(/\s+/g," ").trim(),r=o.length>240?`${o.slice(0,240)}...`:o;return`\u547D\u4EE4\u8F93\u51FA(${n}${t}): ${r||"(empty)"}`}function _t(e,n){const t=Me(e.data.toolName,e.data.toolInput),o=e.data.actionLabel||t.actionLabel||"\u8C03\u7528\u5DE5\u5177",r=bt(e,t);return r?`${n}${o}: ${r}`:`${n}${o}: ${e.data.actionDetail||e.data.toolName||"tool"}`}function bt(e,n){const t=e.data.toolInput;return n.actionType==="bash"?mo(t)||e.data.actionDetail||n.actionDetail:n.actionType==="read_file"||n.actionType==="edit_file"||n.actionType==="write_file"?go(t)||e.data.actionDetail||n.actionDetail:e.data.actionDetail||n.actionDetail}function mo(e){const n=Ue(e?.command,e?.cmd);if(n)return n;if(Array.isArray(e?.argv)){const t=e.argv.map(o=>String(o??"").trim()).filter(Boolean).join(" ");return t?z(t):void 0}return Ue(e?.args)}function go(e){const n=Ct(e?.paths);return n.length>0?n.length===1?n[0]:`${n.length}\u4E2A\u6587\u4EF6: ${n.join(", ")}`:Ue(e?.file_path,e?.filePath,e?.path,e?.target_file,e?.targetFile)}function Ue(...e){for(const n of e){if(typeof n=="string"&&n.trim())return z(n.trim());if(Array.isArray(n)){const t=Ct(n)[0];if(t)return t}}}function Ct(e){return Array.isArray(e)?e.map(n=>typeof n=="string"?n.trim():"").filter(Boolean).map(n=>z(n)):[]}function yo(e){if(!(!e||Object.keys(e).length===0))try{const n=z(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 Io(e,n){return String(n||"").trim().toLowerCase()!=="waiting_input"?!1:e.type==="thinking"||e.type==="text_delta"}function ho(e,n){if(!Io(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=Me(e.data.toolName,e.data.toolInput),o=bt(e,t),r=yo(e.data.toolInput);return e.data.actionType==="idle"||t.actionType==="idle"?{status:"waiting_input",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:o||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:r,actionId:e.data.actionId||e.data.toolUseId}}:{status:"tool_using",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:o||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:r,actionId:e.data.actionId||e.data.toolUseId,...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 v=new Map,he=new Map,Te=new Map;async function Ne(e){const{entry:n,sessionId:t,actionInfo:o,timestamp:r,sourceEventType:s,backoffBaseMs:i,label:a}=e,c={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl},u=3;for(let d=0;d<u;d++){if(await $(n.agentId,t,"tool_result",o,void 0,c,r,s)!==void 0)return;d<u-1&&await new Promise(f=>setTimeout(f,i*(d+1)))}l.warn(`[Runtime] ${a} tool_result sendStatus retry exhausted (result may be lost): agentId=${n.agentId}`)}const oe=new Map,To=20,So=500,Ao=3e4;async function Se(e,n=Ao,t=2){for(let o=0;o<=t;o++){const r=new AbortController;let s;try{const i=e(r.signal);i.catch(()=>{}),await Promise.race([i,new Promise((a,c)=>{s=setTimeout(()=>{r.abort(),c(new Error(`sendOutput timeout after ${n}ms`))},n)})]),s&&clearTimeout(s);return}catch(i){s&&clearTimeout(s);const a=i instanceof Error?i.message:String(i);if(o<t){const c=1e3*(o+1);l.warn(`sendOutput attempt ${o+1}/${t+1} failed (${a}), retrying in ${c}ms...`),await new Promise(u=>setTimeout(u,c));continue}l.warn(`sendOutput failed after ${t+1} attempts (${a}), giving up to unblock serial queue`)}}}async function ko(e,n,t,o,r,s){try{await Y(e,n,t,o,{...r,sourceEventType:"compaction_summary",skipLocalPersist:!0},s)}catch(i){l.debug("Compaction summary realtime push failed (non-persisted)",{agentId:e,sessionId:t,error:i instanceof Error?i.message:String(i)})}}const Ae=new Map,_o=120,bo=120;function Co(e,n,t,o){const r=`${n}:compaction_summary`;let s=Ae.get(r);if(s||(s={buffer:"",timer:null,entry:e,sessionId:n,seq:o},Ae.set(r,s)),s.buffer+=t,s.seq=o,s.entry=e,s.buffer.length>=_o){je(n);return}s.timer||(s.timer=setTimeout(()=>je(n),bo))}function je(e){const n=`${e}:compaction_summary`,t=Ae.get(n);if(!t)return;t.timer&&(clearTimeout(t.timer),t.timer=null);const o=t.buffer;Ae.delete(n),o&&ko(t.entry.agentId,o,t.sessionId,t.seq,{sourceEventType:"compaction_summary",skipLocalPersist:!0},{runtimeAccessToken:t.entry.runtimeAccessToken,schedulerBaseUrl:t.entry.schedulerBaseUrl})}function ke(e,n){const t=n?`${e}:${n}`:void 0;let o,r;if(t)o=oe.get(t),r=t;else{const y=[];for(const[C,w]of oe)C.startsWith(e+":")&&w.buffer&&y.push(w.sourceEventType);for(const C of y)ke(e,C);return}if(!o||!o.buffer)return;o.timer=null;const s=o.buffer,i=o.seq,a=o.entry,c=o.sourceEventType;o.buffer="",r&&oe.delete(r);const u={sourceEventType:c,logCategory:"acode"},d={runtimeAccessToken:a.runtimeAccessToken,schedulerBaseUrl:a.schedulerBaseUrl},f=(v.get(e)??Promise.resolve()).then(()=>Se(y=>Y(a.agentId,s,e,i,u,d,y)),()=>Se(y=>Y(a.agentId,s,e,i,u,d,y)));v.set(e,f),f.finally(()=>{v.get(e)===f&&v.delete(e)})}function Eo(e,n){const t=ro(e);if(!t)return;n.seq+=1;const o=n.seq,r=io(e),s={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl};if(e.type==="compaction_summary"){Co(n,e.sessionId,t,o);return}if((e.type==="command_output"||e.type==="text_delta"||e.type==="thinking")&&t.length<To){const c=`${e.sessionId}:${e.type}`;let u=oe.get(c);if(u||(u={buffer:"",seq:0,timer:null,entry:n,sourceEventType:e.type}),u.buffer+=t,u.seq=o,u.entry=n,!u.timer){const d=e.sessionId,m=e.type;u.timer=setTimeout(()=>ke(d,m),So)}oe.set(c,u);return}ke(e.sessionId);const a=(v.get(e.sessionId)??Promise.resolve()).then(()=>Se(c=>Y(n.agentId,t,e.sessionId,o,r,s,c)),()=>Se(c=>Y(n.agentId,t,e.sessionId,o,r,s,c)));v.set(e.sessionId,a),a.finally(()=>{v.get(e.sessionId)===a&&v.delete(e.sessionId)})}function Et(e){return Ut(e)}let Rt=!1;function Ro(){Rt||(xt(_,$o),Ht(),Rt=!0)}function $o(e,n){e.on("event",t=>{const o=p.get(t.sessionId);if(o){if(t.type==="tool_use_start"?sn(o.sessionId,t.data.toolUseId||t.data.actionId,t.data.toolInput,t.data.toolName,o.workspacePath):t.type==="tool_use_end"&&on(t,{sessionId:o.sessionId,agentId:o.agentId,workspacePath:o.workspacePath,providerId:o.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==="compaction_summary"||t.type==="ai_request"||t.type==="error")){t.type==="runtime_capabilities"&&t.data.actionDetail&&(o.cachedCapabilitiesActionDetail=t.data.actionDetail);const i=ho(t,o.currentRuntimeStatus);i&&$(o.agentId,t.sessionId,i.status,i.actionInfo,Z(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl},t.timestamp?new Date(t.timestamp).getTime():void 0,t.type)}t.type==="context_compaction"&&je(t.sessionId),Eo(t,o);const s=so(t);if(s){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");Ne(a?{entry:o,sessionId:t.sessionId,actionInfo:s,timestamp:i,sourceEventType:t.type,backoffBaseMs:3e3,label:"browser_launch"}:c?{entry:o,sessionId:t.sessionId,actionInfo:s,timestamp:i,sourceEventType:t.type,backoffBaseMs:1e3,label:"todo_write"}:{entry:o,sessionId:t.sessionId,actionInfo:s,timestamp:i,sourceEventType:t.type,backoffBaseMs:1e3,label:"tool_result"})}}}),e.on("status-change",(t,o,r)=>{const s=p.get(t);if(s){ke(t),o==="thinking"||o==="tool_using"||o==="compacting"?hn(t):U(t);const i=Ln(o,r);s.currentRuntimeStatus=i.status;const a=s.currentRuntimeActionDetail??"",c=a.includes("poll_message")||a.includes("get_message"),d=!(i.actionInfo?.actionType==="ai_request")&&(i.status==="thinking"||i.status==="waiting_input")&&(s.currentRuntimeActionType==="idle"||s.currentRuntimeActionType==="mcp")&&c;(i.actionInfo?.actionType||!d)&&(s.currentRuntimeActionType=i.actionInfo?.actionType,s.currentRuntimeActionLabel=i.actionInfo?.actionLabel,s.currentRuntimeActionDetail=i.actionInfo?.actionDetail,s.currentRuntimeActionInput=i.actionInfo?.actionInput),l.info(`[${n.displayName} Adapter] Status changed: ${i.status} for agent ${s.agentId}`,i.actionInfo||""),fn(t,{runtimeStatus:i.status,runtimeActionType:s.currentRuntimeActionType,runtimeActionLabel:s.currentRuntimeActionLabel,runtimeActionDetail:s.currentRuntimeActionDetail});const m=Un({actionInfo:i.actionInfo,usage:Z(i.actionInfo)}),f=m?void 0:i.actionInfo?.actionType?i.actionInfo:s.currentRuntimeActionType?{actionType:s.currentRuntimeActionType,actionLabel:s.currentRuntimeActionLabel??"",actionDetail:s.currentRuntimeActionDetail,actionInput:s.currentRuntimeActionInput}:void 0;if(i.status==="compacting"){const C=(he.get(t)??Promise.resolve()).then(async()=>{for(let I=0;I<=2;I++){if(await $(s.agentId,t,i.status,f,Z(i.actionInfo),{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})!==void 0)return;I<2&&(l.warn(`[${n.displayName}] compaction sendStatus attempt ${I+1} failed (HTTP), retrying in ${1e3*(I+1)}ms...`),await new Promise(b=>setTimeout(b,1e3*(I+1))))}l.warn(`[${n.displayName}] compaction sendStatus failed after 3 attempts, event may be lost`)}).catch(w=>{l.warn(`[${n.displayName}] compaction status chain error:`,w)});he.set(t,C),C.finally(()=>{he.get(t)===C&&he.delete(t)})}else{const y=d&&!i.actionInfo?.actionType||m;if(xn({status:i.status,actionInfo:i.actionInfo,restoredActionInfo:f,currentRuntimeActionType:s.currentRuntimeActionType,shouldPreservePrevAction:d})){const I=(Te.get(t)??Promise.resolve()).then(async()=>{for(let b=0;b<=2;b++){if(await $(s.agentId,t,i.status,y?void 0:f,Z(i.actionInfo),{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})!==void 0)return;b<2&&await new Promise(N=>setTimeout(N,1e3*(b+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(P=>{l.warn(`[${n.displayName}] idle status chain error:`,P)});Te.set(t,I),I.finally(()=>{Te.get(t)===I&&Te.delete(t)})}else $(s.agentId,t,i.status,y?void 0:f,Z(i.actionInfo),{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})}if(i.status==="waiting_input"&&s.cachedCapabilitiesActionDetail){const y=s.cachedCapabilitiesActionDetail;s.cachedCapabilitiesActionDetail=void 0,l.info(`[${n.displayName} Adapter] Re-sending cached runtime_capabilities for agent ${s.agentId} (session stabilized to waiting_input)`),$(s.agentId,t,"waiting_input",{actionType:"runtime_capabilities",actionLabel:"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:y},void 0,{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})}}}),e.on("ask-user-question",t=>{const o=p.get(t.sessionId);o&&(l.info(`[${n.displayName} Adapter] AskUserQuestion for agent ${o.agentId}`),rn(o.agentId,t.sessionId,Array.isArray(t.questions)?t.questions:[],{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl},t.toolCallId))}),e.on("tool-permission-request",t=>{const o=p.get(t.sessionId);o&&t.requestId&&(l.info(`[${n.displayName} Adapter] Tool permission request (${t.capability}) for agent ${o.agentId}`),an(o.agentId,t.sessionId,{requestId:t.requestId,capability:t.capability,...t.detail||{}},{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl}))}),e.on("permission-request",t=>{const o=p.get(t.sessionId);if(o){l.info(`[${n.displayName} Adapter] Permission request: ${t.toolName} for agent ${o.agentId}`);const r=t.toolInput?z(JSON.stringify(t.toolInput).slice(0,400)):void 0;$(o.agentId,t.sessionId,"waiting_input",{actionType:"other",actionLabel:"\u6743\u9650\u786E\u8BA4",actionDetail:r||t.toolName},void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})}})}S.post("/start",T,async(e,n)=>{const{agentId:t,workspacePath:o,mode:r="sdk"}=e.body||{};if(!t||!o){n.status(400).json({error:"agentId and workspacePath are required"});return}const s=mn(e),i=gn(e.body?.tenantId??s?.tenantId,e.body?.ownerUserId??e.body?.userId??s?.userId);if(i)try{jt(String(t),i,String(e.body?.userId??"").trim()||void 0)}catch(c){if(c instanceof Error&&c.message.includes("agent-ownership-mismatch")){n.status(403).json({ok:!1,error:"agent-ownership-mismatch"});return}throw c}const a=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||Ye(ct(e))||void 0;if(Qt({agentId:String(t),workspacePath:String(o),serverUrl:e.body?.serverUrl||a,runtimeAccessToken:e.body?.runtimeAccessToken,userId:e.body?.userId,schedulerBaseUrl:a}),e.body?.runtimeFeatures!==null&&e.body?.runtimeFeatures!==void 0&&(zt(String(t),e.body.runtimeFeatures),l.info(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u80FD\u529B\u5F00\u5173: ${JSON.stringify(Vt(String(t)))}`)),e.body?.inheritedFeatures!==null&&e.body?.inheritedFeatures!==void 0&&(Yt(String(t),e.body.inheritedFeatures),l.info(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u7EE7\u627F\u4E09\u6001\u5C42: ${JSON.stringify(Gt(String(t)))}`)),e.body?.capabilities!==void 0&&qt(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"&&(Zt(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&&(en(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&&(vt(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?.snapshotRetentionDays!==void 0){const c=Le();cn(e.body.snapshotRetentionDays),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u5FEB\u7167\u4FDD\u7559\u5929\u6570: ${e.body.snapshotRetentionDays??"\u4E0D\u6E05\u7406"}`),c!==Le()&&Kt(Le())}if(e.body?.logRetentionDays!==void 0){const c=Math.min(Number(e.body.logRetentionDays)||0,7);c>0&&(Jt(c),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u65E5\u5FD7\u4FDD\u7559\u5929\u6570: ${c}`))}r&&r!=="sdk"&&console.warn(`[Runtime] Unsupported runtime mode "${r}" requested for agent ${t}; starting SDK session instead.`),await wo(e,n)});async function wo(e,n){const{agentId:t,workspacePath:o,command:r,projectRoot:s,autoAccept:i=!0,initialPrompt:a,systemPrompt:c,globalPrompt:u,rolePrompt:d,memory:m,resumeContext:f,resumeTranscript:y,resumeTokenUsage:C,mcpConfigPath:w,extraMcpServers:I,envOverrides:P,idleInputAutoCommand:b,nonInputAutoCommand:W,model:N,instanceAiConfig:_e,subAgentModel:be,subAgentEffort:Ce,scopeKey:Be,browserAllowPrivate:ve}=e.body||{},j=Cn(y),se=En(C);l.info(`[HIBERNATE-IMPORT] \u542F\u52A8\u8BF7\u6C42\u643A\u5E26\u4F11\u7720\u6062\u590D: agentId=${String(t||"").trim()||"?"} resumeContext=${typeof f=="string"?`${f.length}\u5B57`:"\u65E0"} resumeTranscript\u539F\u59CB=${typeof y=="string"?`${y.length}\u5B57`:typeof y} \u89E3\u6790\u7ED3\u679C=${j?`${j.length}\u6761`:"null"} resumeTokenUsage\u89E3\u6790=${se?JSON.stringify(se):"null"}`);let x=!1,re,Ee,Re;{const O=String(t||"").trim();if(O&&!j&&!(typeof f=="string"&&f.trim()))try{const g=await Mt(O);if(g&&Array.isArray(g.transcript)&&g.transcript.length>0){re=g.transcript;const k=g.tokenUsage,L=B=>typeof B=="number"&&Number.isFinite(B)?B:void 0;Ee=k?{...L(k.totalInputTokens)!==void 0?{totalInputTokens:L(k.totalInputTokens)}:{},...L(k.totalOutputTokens)!==void 0?{totalOutputTokens:L(k.totalOutputTokens)}:{},...L(k.cacheHitTokens)!==void 0?{cacheHitTokens:L(k.cacheHitTokens)}:{},...L(k.cacheMissTokens)!==void 0?{cacheMissTokens:L(k.cacheMissTokens)}:{}}:void 0,Re=g.reason==="clean"?mt:Rn,x=!0,l.info(`[CRASH-RECOVERY] \u547D\u4E2D\u65AD\u70B9 journal: agentId=${O} reason=${g.reason} savedAt=${g.savedAt} messages=${g.messageCount}`)}}catch(g){l.warn(`[CRASH-RECOVERY] journal \u8BFB\u53D6\u5931\u8D25\uFF08\u6309\u65E0 journal \u5904\u7406\uFF09: agentId=${O}, error=${g instanceof Error?g.message:String(g)}`)}}const G=yn();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:_e?pe(_e):null,perAgentModel:N??null}});let R=null;const A=String(t||"").trim(),ie=String(e.body?.runtimeAccessToken||"").trim()||void 0,F=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||Ye(ct(e))||void 0;F?l.info(`[startSdkSession] \u56DE\u8C03\u76EE\u6807 server: ${F} (agentId=${A})`):l.warn(`[startSdkSession] \u672A\u89E3\u6790\u5230 schedulerBaseUrl\uFF0C\u5C06\u56DE\u9000\u5230\u9ED8\u8BA4\u5730\u5740 (agentId=${A})`);try{if(Ro(),!A){n.status(400).json({error:"agentId is required"});return}const O=At(A);if(O){n.json(await Yn(O));return}const g=await un(A);if(g){const D=await Xn(g);if(!D.reusable)console.warn(`[Runtime] Ignoring stale persisted SDK session for agentId=${A}, sessionId=${g.sessionId}, reason=${D.reason}`),await X(g.sessionId);else{const M=ne(g.runtimeStatus,g.runtimeStatus,g.runtimeActionType);n.json({sessionId:g.sessionId,status:M,runtimeStatus:M,runtimeActionType:g.runtimeActionType,runtimeActionLabel:g.runtimeActionLabel,runtimeActionDetail:g.runtimeActionDetail,agentId:g.agentId,workspacePath:g.workspacePath,command:g.command,mode:g.mode||"sdk",pid:g.pid,reused:!0,persistedOnly:!0});return}}if(V.has(A)){n.status(409).json({error:"SDK session is already starting for this agent"});return}V.add(A);const k=Et(r),L=_.get(k);R=Lt();const B=eo(null,P),J=k==="acode"?N?String(N).trim():void 0:(()=>{const D=N?String(N).trim():void 0,M=B.model?String(B.model).trim():void 0;return D||M})();G.log({level:"info",category:"resolve",message:"\u6A21\u578B\u89E3\u6790\u7ED3\u679C",source:"bridge",agentId:A,sessionId:R??void 0,details:{perAgentModel:N??null,globalModel:B.model??null,resolvedModel:J??null,providerId:k,note:k==="acode"?"adapter handles full priority":"request > global"}});const $e={...B.envOverrides};J&&($e.ANTHROPIC_MODEL=J,$e.CODEX_MODEL=J);let Q,we=w;if(k==="acode"){const D=_e||{},M=await Wt({apiOverrides:gt(D)??void 0,agentId:A,sessionId:R??void 0,runtimeBridgeBaseUrl:F});Q=M.instanceConfig.config,we=M.perInstanceConfigPath,G.log({level:"info",category:"apply",message:"prepareAcodeInstanceConfig \u5B8C\u6210",source:"bridge",agentId:A,sessionId:R??void 0,details:{sanitizedApiOverrides:(()=>{const K=gt(D);return K?pe(K):null})(),resolvedInstanceAiConfig:Q?pe(Q):null,perInstanceConfigPath:we,instanceConfigSources:M.instanceConfig.source??null}})}let Fe=c||void 0,Oe,De,ae;const ce=x?He(`\uFF08\u65E0\u8FDB\u5EA6\u6458\u8981\uFF1A\u5B8C\u6574\u5BF9\u8BDD\u8BB0\u5F55\u7ECF ${Re===mt?"\u6B63\u5E38\u6536\u5C3E\u843D\u76D8":"\u5D29\u6E83\u524D\u81EA\u52A8\u843D\u76D8"}\u5DF2\u539F\u6837\u63A5\u7EED\uFF09`,Re):typeof f=="string"&&f.trim()?He(f):void 0;if(k==="acode")if(Oe=typeof u=="string"&&u.trim()||void 0,De=typeof d=="string"&&d.trim()||void 0,typeof m=="string"&&m.trim())ae=m.trim();else{const D=await Bt(o,{schedulerBaseUrl:F,runtimeAccessToken:ie,agentId:A});D&&(ae=D,l.info(`[startSdkSession] Auto-loaded memories for ACode agent ${A}`))}else if(typeof u=="string"&&u.trim()||typeof d=="string"&&d.trim()||typeof m=="string"&&m.trim()||ce!==void 0){const M=[u,d,m,ce,c].filter(K=>typeof K=="string"&&K.trim().length>0).map(K=>K.trim());Fe=M.length>0?M.join(`
|
|
39
39
|
|
|
40
|
-
`):void 0}const v={command:s||"acode",workingDirectory:o,agentId:A,...Be?{scopeKey:Be}:{},...typeof Fe=="boolean"?{browserAllowPrivate:Fe}:{},autoAccept:!!i,initialPrompt:a,systemPrompt:ve,...Oe!==void 0?{globalPrompt:Oe}:{},...De!==void 0?{rolePrompt:De}:{},...ae!==void 0?{memory:ae}:{},...ce!==void 0?{resumeContext:ce}:{},...k==="acode"&&Array.isArray(N?se:z)&&((N?se:z)?.length??0)>0?{resumeTranscript:N?se:z}:{},...k==="acode"&&!N&&re?{resumeTokenUsage:re}:{},...k==="acode"&&N&&Ee?{resumeTokenUsage:Ee}:{},model:X,mcpConfigPath:we,...Q?{instanceAiConfig:Q}:{},...typeof be=="string"&&be.trim()?{subAgentModel:be.trim()}:{},...typeof Ce=="string"&&Ce.trim()?{subAgentEffort:Ce.trim()}:{},extraMcpServers:I||{},envOverrides:At(String(t),String(o),process.env,$e,typeof r=="string"?r:void 0)};J.log({level:"info",category:"launch",message:"\u4F20\u9012\u7ED9 Adapter \u7684\u5B8C\u6574 AdapterSessionConfig",source:"bridge",agentId:A,sessionId:R,details:{adapterModel:v.model??null,adapterInstanceAiConfig:v.instanceAiConfig?pe(v.instanceAiConfig):null,adapterMcpConfigPath:v.mcpConfigPath??null}}),await J.flush(),f.set(R,{agentId:A,workspacePath:o,sessionId:R,config:v,providerId:k,seq:0,runtimeAccessToken:ie,schedulerBaseUrl:F}),N&&$(A,R,"starting",{actionType:"hibernation_wake",actionLabel:"\u4F11\u7720\u5524\u9192\u4E2D",actionDetail:"\u68C0\u6D4B\u5230\u4E0A\u6B21\u8FD0\u884C\u5F02\u5E38\u4E2D\u65AD\u7684\u672C\u5730\u8FDB\u5EA6\uFF0C\u6B63\u5728\u63A5\u7EED\u4E0A\u4E0B\u6587\u2026",actionId:`crash-recovery-${R}`},void 0,{runtimeAccessToken:ie,schedulerBaseUrl:F}).catch(()=>{}),n.json({sessionId:R,status:"starting",runtimeStatus:"starting",agentId:A,workspacePath:o,command:v.command,mode:"sdk"}),bo({sessionId:R,agentId:A,config:v,adapter:P,providerId:k,idleInputAutoCommand:b,nonInputAutoCommand:K,runtimeAccessToken:ie,requestedSchedulerBaseUrl:F})}catch(O){if(R&&(U(R),f.delete(R),q(R)),A&&V.delete(A),!n.headersSent){const m=O instanceof Error?O.message:String(O);n.status(500).json({error:`Failed to start SDK session: ${m}`})}}}async function bo(e){const{sessionId:n,agentId:t,config:o,adapter:s,providerId:r,idleInputAutoCommand:i,nonInputAutoCommand:a,runtimeAccessToken:c,requestedSchedulerBaseUrl:u}=e;try{await s.startSession(n,o),s.setIdleCommands?.(n,{idleInputCommand:i||We,nonInputCommand:a||""});let d;if(En(r))try{if(await new Promise(p=>setTimeout(p,500)),d=s.getSessionPid?.(n),!d){const y=(await Zt()).find(C=>C.agentId===t||C.cwd===o.workingDirectory||C.command.includes(o.workingDirectory));y&&(d=y.pid,l.info(`[Runtime] Found SDK process PID: ${d} for agentId=${t}`))}}catch(p){console.warn(`[Runtime] Failed to get SDK PID for agentId=${t}:`,p)}const g=ne(s.getSessionStatus(n),f.get(n)?.currentRuntimeStatus,f.get(n)?.currentRuntimeActionType);await ln({sessionId:n,agentId:t,workspacePath:o.workingDirectory,command:o.command,startedAt:new Date().toISOString(),status:"running",runtimeStatus:g,mode:"sdk",pid:d,providerSessionId:s.getProviderSessionId(n)}),d&&await Le().startProcess({agentId:t,sessionId:n,pid:d,mode:"sdk",workspacePath:o.workingDirectory,command:o.command}),await Co({agentId:t,sessionId:n,sdkPid:d,status:g,schedulerBaseUrl:u,runtimeAccessToken:c})}catch(d){U(n),f.delete(n),q(n),await G(n);const g=d instanceof Error?d.message:String(d);console.error(`[Runtime] Background SDK session startup failed for agentId=${t}: ${g}`),await Eo({agentId:t,sessionId:n,schedulerBaseUrl:u,runtimeAccessToken:c,errorMessage:g})}finally{V.delete(t)}}async function Co(e){const{agentId:n,sessionId:t,sdkPid:o,status:s,schedulerBaseUrl:r,runtimeAccessToken:i}=e;if(!r||!i){l.debug(`[Runtime] notifyServerSessionReady skipped: missing schedulerBaseUrl or runtimeAccessToken for agentId=${n}`);return}const a=`${r.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Ke.post(a,{agentId:n,sessionId:t,status:s,pid:o},{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 u=c instanceof Error?c.message:String(c);l.warn(`[Runtime] Failed to notify server session ready: agentId=${n}, error=${u}`)}}async function Eo(e){const{agentId:n,sessionId:t,schedulerBaseUrl:o,runtimeAccessToken:s}=e;if(!o||!s)return;const r=`${o.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Ke.post(r,{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}`)}}T.post("/sdk/message",h,async(e,n)=>{const{sessionId:t,message:o}=e.body||{};if(!t||!o){n.status(400).json({error:"sessionId and message are required"});return}const s=f.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const r=s.providerId||"claude-code";await _.get(r).sendMessage(t,o),n.json({ok:!0})}catch(r){const i=r instanceof Error?r.message:String(r);n.status(500).json({error:i})}}),T.post("/sdk/answer",h,async(e,n)=>{const{sessionId:t,answers:o,cancelled:s,reason:r}=e.body||{},i=s===!0;if(!t||!i&&!o){n.status(400).json({error:i?"sessionId is required":"sessionId and answers are required"});return}const a=f.get(t);if(!a){n.status(404).json({error:"SDK session not found"});return}try{const c=a.providerId||"claude-code",u=_.get(c);if(i){if(!u.cancelQuestionAnswer){n.status(400).json({error:"adapter does not support cancelling a question"});return}l.debug(`[sdk/answer] cancel question: sessionId=${t}, providerId=${c}, hasReason=${!!String(r||"").trim()}`),await u.cancelQuestionAnswer(t,typeof r=="string"?r:void 0)}else u.sendQuestionAnswer&&await u.sendQuestionAnswer(t,o);n.json({ok:!0})}catch(c){const u=c instanceof Error?c.message:String(c);n.status(500).json({error:u})}}),T.post("/tool-auth/answer",h,async(e,n)=>{const{sessionId:t,requestId:o,allowed:s}=e.body||{};if(!t||!o){n.status(400).json({error:"sessionId and requestId are required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const i=r.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(o),!!s);n.json({ok:!0,existed:c})}catch(i){const a=i instanceof Error?i.message:String(i);n.status(500).json({error:a})}}),T.get("/tool-auth/pending/:sessionId",h,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code",i=_.get(s).getPendingToolAuthRequests?.(t)??[];n.json({ok:!0,sessionId:t,agentId:o.agentId,pendingRequests:i,fetchedAt:Date.now()})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.post("/sdk/confirm",h,async(e,n)=>{const{sessionId:t,accept:o}=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 r=s.providerId||"claude-code";await _.get(r).sendConfirmation(t,!!o),n.json({ok:!0})}catch(r){const i=r instanceof Error?r.message:String(r);n.status(500).json({error:i})}}),T.post("/sdk/abort",h,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code";await _.get(s).abortCurrentTurn(t),n.json({ok:!0})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.post("/sdk/stop",h,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.json({ok:!0,status:"stopped"});return}try{const s=o.providerId||"claude-code",r=_.get(s);r.abortCurrentTurn(t).catch(()=>{}),await r.terminateSession(t),U(t),f.delete(t),q(t),Ie(t),fe(o.agentId),await G(t),await Le().removeProcess(o.agentId),await $(o.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl}),n.json({ok:!0,status:"stopped"})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.get("/sdk/snapshot/:sessionId",h,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code",r=_.get(s),i=r.getConversation(t),a=hn(i);let c=null;if(s==="acode"){const d=r;typeof d.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=d.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 u=r.getTotalUsage?.(t);l.info(`[HIBERNATE-EXPORT] \u5FEB\u7167\u5BFC\u51FA: sessionId=${t} agentId=${o.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"} totalUsage=${u?`in=${u.totalInputTokens??"?"}/out=${u.totalOutputTokens??"?"}`:"null"}`),n.json({sessionId:t,agentId:o.agentId,workspacePath:o.workspacePath,messageCount:i.length,truncated:a.truncated,snapshot:a.snapshot,transcript:c,tokenUsage:u?{inputTokens:u.inputTokens??null,outputTokens:u.outputTokens??null,totalInputTokens:u.totalInputTokens??null,totalOutputTokens:u.totalOutputTokens??null,cacheHitTokens:u.cacheHitTokens??null,cacheMissTokens:u.cacheMissTokens??null}:null,providerId:s})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.get("/sdk/status/:sessionId",h,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code",r=_.get(s),i=r.getSessionStatus(t),a=r.getConversation(t);n.json({sessionId:t,status:i,agentId:o.agentId,workspacePath:o.workspacePath,messageCount:a.length})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.get("/sdk/capabilities/:sessionId",h,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code",i=_.get(s).getCapabilities?.(t)??null;n.json({ok:!0,sessionId:t,agentId:o.agentId,capabilities:i,fetchedAt:Date.now()})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.get("/sdk/pending-questions/:sessionId",h,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code",i=_.get(s).getPendingQuestion?.(t)??null;n.json({ok:!0,sessionId:t,agentId:o.agentId,pendingQuestion:i?{toolCallId:i.toolCallId,questions:i.questions}:null,fetchedAt:Date.now()})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.post("/command",h,async(e,n)=>{const{sessionId:t,command:o}=e.body||{};if(!t||o===void 0||o===null){n.status(400).json({error:"sessionId and command are required"});return}try{const s=await Wn(String(t),o);n.json({ok:!0,mode:"terminal",...s})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}});function Ro(e,n){if(typeof e!="string"||!e||!n||typeof n!="object")return e;const{userId:t,name:o,type:s}=n,r=typeof t=="string"&&t.trim()?t.trim():"",i=typeof o=="string"&&o.trim()?o.trim():r;if(!r&&!i)return e;const a=typeof s=="string"&&s.trim()?s.trim().toUpperCase():"HUMAN",c=i||r,u=r?`, userId: ${r}`:"";return`\u3010${c}\uFF08${a}${u}\uFF09\u53D1\u6765\u3011
|
|
41
|
-
${e}`}
|
|
40
|
+
`):void 0}const $t=wn(a,{crashRecoveryApplied:x,resumeTranscriptCount:Array.isArray(j)?j.length:0,resumeContext:f}),H={command:r||"acode",workingDirectory:o,agentId:A,...Be?{scopeKey:Be}:{},...typeof ve=="boolean"?{browserAllowPrivate:ve}:{},autoAccept:!!i,initialPrompt:$t,systemPrompt:Fe,...Oe!==void 0?{globalPrompt:Oe}:{},...De!==void 0?{rolePrompt:De}:{},...ae!==void 0?{memory:ae}:{},...ce!==void 0?{resumeContext:ce}:{},...k==="acode"&&Array.isArray(x?re:j)&&((x?re:j)?.length??0)>0?{resumeTranscript:x?re:j}:{},...k==="acode"&&!x&&se?{resumeTokenUsage:se}:{},...k==="acode"&&x&&Ee?{resumeTokenUsage:Ee}:{},model:J,mcpConfigPath:we,...Q?{instanceAiConfig:Q}:{},...typeof be=="string"&&be.trim()?{subAgentModel:be.trim()}:{},...typeof Ce=="string"&&Ce.trim()?{subAgentEffort:Ce.trim()}:{},extraMcpServers:I||{},envOverrides:kt(String(t),String(o),process.env,$e,typeof s=="string"?s:void 0)};G.log({level:"info",category:"launch",message:"\u4F20\u9012\u7ED9 Adapter \u7684\u5B8C\u6574 AdapterSessionConfig",source:"bridge",agentId:A,sessionId:R,details:{adapterModel:H.model??null,adapterInstanceAiConfig:H.instanceAiConfig?pe(H.instanceAiConfig):null,adapterMcpConfigPath:H.mcpConfigPath??null}}),await G.flush(),p.set(R,{agentId:A,workspacePath:o,sessionId:R,config:H,providerId:k,seq:0,runtimeAccessToken:ie,schedulerBaseUrl:F}),x&&$(A,R,"starting",{actionType:"hibernation_wake",actionLabel:"\u4F11\u7720\u5524\u9192\u4E2D",actionDetail:"\u68C0\u6D4B\u5230\u4E0A\u6B21\u8FD0\u884C\u5F02\u5E38\u4E2D\u65AD\u7684\u672C\u5730\u8FDB\u5EA6\uFF0C\u6B63\u5728\u63A5\u7EED\u4E0A\u4E0B\u6587\u2026",actionId:`crash-recovery-${R}`},void 0,{runtimeAccessToken:ie,schedulerBaseUrl:F}).catch(()=>{}),n.json({sessionId:R,status:"starting",runtimeStatus:"starting",agentId:A,workspacePath:o,command:H.command,mode:"sdk"}),Oo({sessionId:R,agentId:A,config:H,adapter:L,providerId:k,idleInputAutoCommand:b,nonInputAutoCommand:W,runtimeAccessToken:ie,requestedSchedulerBaseUrl:F})}catch(O){if(R&&(U(R),p.delete(R),q(R)),A&&V.delete(A),!n.headersSent){const g=O instanceof Error?O.message:String(O);n.status(500).json({error:`Failed to start SDK session: ${g}`})}}}async function Oo(e){const{sessionId:n,agentId:t,config:o,adapter:r,providerId:s,idleInputAutoCommand:i,nonInputAutoCommand:a,runtimeAccessToken:c,requestedSchedulerBaseUrl:u}=e;try{await r.startSession(n,o),r.setIdleCommands?.(n,{idleInputCommand:i||ze,nonInputCommand:a||""});let d;if(Mn(s))try{if(await new Promise(f=>setTimeout(f,500)),d=r.getSessionPid?.(n),!d){const y=(await tn()).find(C=>C.agentId===t||C.cwd===o.workingDirectory||C.command.includes(o.workingDirectory));y&&(d=y.pid,l.info(`[Runtime] Found SDK process PID: ${d} for agentId=${t}`))}}catch(f){console.warn(`[Runtime] Failed to get SDK PID for agentId=${t}:`,f)}const m=ne(r.getSessionStatus(n),p.get(n)?.currentRuntimeStatus,p.get(n)?.currentRuntimeActionType);await pn({sessionId:n,agentId:t,workspacePath:o.workingDirectory,command:o.command,startedAt:new Date().toISOString(),status:"running",runtimeStatus:m,mode:"sdk",pid:d,providerSessionId:r.getProviderSessionId(n)}),d&&await Pe().startProcess({agentId:t,sessionId:n,pid:d,mode:"sdk",workspacePath:o.workingDirectory,command:o.command}),await Do({agentId:t,sessionId:n,sdkPid:d,status:m,schedulerBaseUrl:u,runtimeAccessToken:c})}catch(d){U(n),p.delete(n),q(n),await X(n);const m=d instanceof Error?d.message:String(d);console.error(`[Runtime] Background SDK session startup failed for agentId=${t}: ${m}`),await Mo({agentId:t,sessionId:n,schedulerBaseUrl:u,runtimeAccessToken:c,errorMessage:m})}finally{V.delete(t)}}async function Do(e){const{agentId:n,sessionId:t,sdkPid:o,status:r,schedulerBaseUrl:s,runtimeAccessToken:i}=e;if(!s||!i){l.debug(`[Runtime] notifyServerSessionReady skipped: missing schedulerBaseUrl or runtimeAccessToken for agentId=${n}`);return}const a=`${s.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Ke.post(a,{agentId:n,sessionId:t,status:r,pid:o},{headers:{"X-Runtime-Token":i,"Content-Type":"application/json"},timeout:5e3}),l.debug(`[Runtime] Notified server session ready: agentId=${n}, sessionId=${t}, status=${r}`)}catch(c){const u=c instanceof Error?c.message:String(c);l.warn(`[Runtime] Failed to notify server session ready: agentId=${n}, error=${u}`)}}async function Mo(e){const{agentId:n,sessionId:t,schedulerBaseUrl:o,runtimeAccessToken:r}=e;if(!o||!r)return;const s=`${o.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Ke.post(s,{agentId:n,sessionId:t,status:"stopped"},{headers:{"X-Runtime-Token":r,"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",T,async(e,n)=>{const{sessionId:t,message:o}=e.body||{};if(!t||!o){n.status(400).json({error:"sessionId and message are required"});return}const r=p.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code";await _.get(s).sendMessage(t,o),n.json({ok:!0})}catch(s){const i=s instanceof Error?s.message:String(s);n.status(500).json({error:i})}}),S.post("/sdk/answer",T,async(e,n)=>{const{sessionId:t,answers:o,cancelled:r,reason:s}=e.body||{},i=r===!0;if(!t||!i&&!o){n.status(400).json({error:i?"sessionId is required":"sessionId and answers are required"});return}const a=p.get(t);if(!a){n.status(404).json({error:"SDK session not found"});return}try{const c=a.providerId||"claude-code",u=_.get(c);if(i){if(!u.cancelQuestionAnswer){n.status(400).json({error:"adapter does not support cancelling a question"});return}l.debug(`[sdk/answer] cancel question: sessionId=${t}, providerId=${c}, hasReason=${!!String(s||"").trim()}`),await u.cancelQuestionAnswer(t,typeof s=="string"?s:void 0)}else u.sendQuestionAnswer&&await u.sendQuestionAnswer(t,o);n.json({ok:!0})}catch(c){const u=c instanceof Error?c.message:String(c);n.status(500).json({error:u})}}),S.post("/tool-auth/answer",T,async(e,n)=>{const{sessionId:t,requestId:o,allowed:r}=e.body||{};if(!t||!o){n.status(400).json({error:"sessionId and requestId are required"});return}const s=p.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const i=s.providerId||"claude-code",a=_.get(i);if(!a.submitToolPermissionDecision){n.status(400).json({error:"adapter does not support tool authorization"});return}const c=a.submitToolPermissionDecision(t,String(o),!!r);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",T,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=p.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code",i=_.get(r).getPendingToolAuthRequests?.(t)??[];n.json({ok:!0,sessionId:t,agentId:o.agentId,pendingRequests:i,fetchedAt:Date.now()})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.post("/sdk/confirm",T,async(e,n)=>{const{sessionId:t,accept:o}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const r=p.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code";await _.get(s).sendConfirmation(t,!!o),n.json({ok:!0})}catch(s){const i=s instanceof Error?s.message:String(s);n.status(500).json({error:i})}}),S.post("/sdk/abort",T,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const o=p.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code";await _.get(r).abortCurrentTurn(t),n.json({ok:!0})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.post("/sdk/stop",T,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const o=p.get(t);if(!o){n.json({ok:!0,status:"stopped"});return}try{const r=o.providerId||"claude-code",s=_.get(r);s.abortCurrentTurn(t).catch(()=>{}),await s.terminateSession(t),U(t),p.delete(t),q(t),Ie(t),fe(o.agentId),await X(t),await Pe().removeProcess(o.agentId),await $(o.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl}),n.json({ok:!0,status:"stopped"})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.get("/sdk/snapshot/:sessionId",T,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=p.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code",s=_.get(r),i=s.getConversation(t),a=An(i);let c=null;if(r==="acode"){const d=s;typeof d.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=${r}`):(c=d.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=${r}`))}else l.info(`[HIBERNATE-EXPORT] provider=${r} \u4E0D\u652F\u6301\u5B8C\u6574\u91CD\u653E\uFF0C\u6309\u4EC5\u6458\u8981\u4F11\u7720`);const u=s.getTotalUsage?.(t);l.info(`[HIBERNATE-EXPORT] \u5FEB\u7167\u5BFC\u51FA: sessionId=${t} agentId=${o.agentId} providerId=${r} 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"} totalUsage=${u?`in=${u.totalInputTokens??"?"}/out=${u.totalOutputTokens??"?"}`:"null"}`),n.json({sessionId:t,agentId:o.agentId,workspacePath:o.workspacePath,messageCount:i.length,truncated:a.truncated,snapshot:a.snapshot,transcript:c,tokenUsage:u?{inputTokens:u.inputTokens??null,outputTokens:u.outputTokens??null,totalInputTokens:u.totalInputTokens??null,totalOutputTokens:u.totalOutputTokens??null,cacheHitTokens:u.cacheHitTokens??null,cacheMissTokens:u.cacheMissTokens??null}:null,providerId:r})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.get("/sdk/context/:sessionId",T,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=p.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code",s=_.get(r),i=s,a=s,c=bn({sessionId:t,agentId:o.agentId,workspacePath:o.workspacePath,providerId:r,exportRawTranscript:u=>i.exportRawTranscript?.(u),getConversation:u=>a.getConversation(u)??[],getTotalUsage:u=>i.getTotalUsage?.(u)});l.info(`[CONTEXT-JSON] \u4E0A\u4E0B\u6587\u67E5\u8BE2: sessionId=${t} agentId=${o.agentId} providerId=${r} format=${c.format} messages=${c.messageCount} usage=${c.tokenUsage?`in=${c.tokenUsage.inputTokens??"?"}/out=${c.tokenUsage.outputTokens??"?"}`:"null"}`),n.json(c)}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.get("/sdk/status/:sessionId",T,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=p.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code",s=_.get(r),i=s.getSessionStatus(t),a=s.getConversation(t);n.json({sessionId:t,status:i,agentId:o.agentId,workspacePath:o.workspacePath,messageCount:a.length})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.get("/sdk/capabilities/:sessionId",T,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=p.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code",i=_.get(r).getCapabilities?.(t)??null;n.json({ok:!0,sessionId:t,agentId:o.agentId,capabilities:i,fetchedAt:Date.now()})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.get("/sdk/pending-questions/:sessionId",T,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=p.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code",i=_.get(r).getPendingQuestion?.(t)??null;n.json({ok:!0,sessionId:t,agentId:o.agentId,pendingQuestion:i?{toolCallId:i.toolCallId,questions:i.questions}:null,fetchedAt:Date.now()})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.post("/command",T,async(e,n)=>{const{sessionId:t,command:o}=e.body||{};if(!t||o===void 0||o===null){n.status(400).json({error:"sessionId and command are required"});return}try{const r=await Jn(String(t),o);n.json({ok:!0,mode:"terminal",...r})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}});function Po(e,n){if(typeof e!="string"||!e||!n||typeof n!="object")return e;const{userId:t,name:o,type:r}=n,s=typeof t=="string"&&t.trim()?t.trim():"",i=typeof o=="string"&&o.trim()?o.trim():s;if(!s&&!i)return e;const a=typeof r=="string"&&r.trim()?r.trim().toUpperCase():"HUMAN",c=i||s,u=s?`, userId: ${s}`:"";return`\u3010${c}\uFF08${a}${u}\uFF09\u53D1\u6765\u3011
|
|
41
|
+
${e}`}S.post("/input",T,async(e,n)=>{const{sessionId:t,input:o,mode:r,sender:s}=e.body||{};if(!t||o===void 0||o===null){n.status(400).json({error:"sessionId and input are required"});return}const i=p.get(t);if(!i){n.status(404).json({error:"SDK session not found"});return}try{const a=i.providerId||"claude-code",c=_.get(a);if(r==="shortcut"){if(!c.sendShortcutInput){n.status(400).json({error:"shortcut input is not supported by this SDK provider"});return}await c.sendShortcutInput(t,String(o)),n.json({ok:!0,mode:"shortcut"});return}await c.sendMessage(t,Po(await Zn(o),s)),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",T,async(e,n)=>{const{agentId:t,idleInputAutoCommand:o="",nonInputAutoCommand:r=""}=e.body||{},s=String(t||"").trim();if(!s){n.status(400).json({error:"agentId is required"});return}const i=[...p.values()].find(c=>c.agentId===s),a={idleInputCommand:String(o||"").trim()||ze,nonInputCommand:String(r||"")};try{let c=!1;i&&(_.get(i.providerId||"claude-code").setIdleCommands?.(i.sessionId,a),c=!0);const u=await ln(s,{idleInputAutoCommand:a.idleInputCommand,nonInputAutoCommand:a.nonInputCommand});n.json({ok:!0,mode:"sdk",sessionUpdated:c,persistedUpdated:u})}catch(c){const u=c instanceof Error?c.message:String(c);n.status(500).json({ok:!1,mode:"sdk",error:u})}}),S.post("/resize",T,(e,n)=>{const{sessionId:t,cols:o,rows:r}=e.body||{};if(!t||!o||!r){n.status(400).json({error:"sessionId, cols, rows are required"});return}if(!p.has(t)){n.status(404).json({error:"SDK session not found"});return}n.json({ok:!0,mode:"sdk",noop:!0,cols:Number(o),rows:Number(r)})}),S.post("/reset-context",T,async(e,n)=>{const{sessionId:t,reason:o}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const r=p.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}const s=r.providerId||"claude-code",i=_.get(s),a=i.resetContext?.bind(i),c=Dn(s,!!a);if(!c.supported){n.status(c.statusCode).json({error:c.error});return}if(!a){n.status(500).json({error:"ACode adapter does not expose resetContext"});return}try{await a(String(t));const u=ne(i.getSessionStatus(String(t)),r.currentRuntimeStatus,r.currentRuntimeActionType);n.json({ok:!0,contextReset:!0,sessionId:t,status:u,runtimeStatus:u,agentId:r.agentId,mode:"sdk",providerId:s,reason:typeof o=="string"&&o.trim()?o.trim():void 0})}catch(u){const d=u instanceof Error?u.message:String(u);n.status(500).json({ok:!1,contextReset:!1,mode:"sdk",error:d})}}),S.post("/compact-context",T,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({ok:!1,error:"sessionId is required"});return}const o=p.get(t);if(!o){n.status(404).json({ok:!1,error:"SDK session not found"});return}const r=o.providerId||"claude-code",s=_.get(r),i=s.compactContext?.bind(s);if(!i){n.status(400).json({ok:!1,error:`context compaction is not supported by provider: ${r}`});return}try{const a=i(String(t)),c=ne(s.getSessionStatus(String(t)),o.currentRuntimeStatus,o.currentRuntimeActionType);n.json({ok:!0,requested:!0,compacted:!0,sessionId:t,agentId:o.agentId,mode:"sdk",providerId:r,status:c,runtimeStatus:c,result:a??null})}catch(a){const c=a instanceof Error?a.message:String(a);l.warn(`[Runtime] compact-context failed: sessionId=${t}, error=${c}`),n.status(500).json({ok:!1,compacted:!1,mode:"sdk",error:c})}}),S.post("/stop",T,async(e,n)=>{const{sessionId:t}=e.body||{},o=Pn(e.body);if(!t&&!o.discardContext){n.status(400).json({error:"sessionId is required"});return}const r=t?p.get(t):void 0;if(!r){if(o.discardContext){const i=typeof(e.body||{})?.agentId=="string"?e.body.agentId:void 0;i&&await Dt(i).catch(()=>{})}t&&await X(t),n.json({ok:!0,status:"stopped",mode:"none",statusNotified:!1,reason:o.reason});return}const s=r.agentId;try{l.info(`[Runtime] Stopping SDK session ${t}; suppressStatus=${!o.statusNotified}, reason=${o.reason||"unspecified"}`);const i=r.providerId||"claude-code",a=_.get(i);a.abortCurrentTurn(t).catch(()=>{}),await a.terminateSession(t,{discardContext:o.discardContext}),U(t),p.delete(t),q(t),Ie(t),fe(s),await X(t),await Pe().removeProcess(s),o.statusNotified?await $(s,null,"stopped",void 0,void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl}):l.info(`[Runtime] Stopped status notification suppressed for SDK session ${t}; reason=${o.reason||"unspecified"}`),n.json({ok:!0,status:"stopped",mode:"sdk",statusNotified:o.statusNotified,reason:o.reason})}catch(i){const a=i instanceof Error?i.message:String(i);console.error(`[Runtime] Failed to terminate SDK session ${t}:`,a),n.status(500).json({ok:!1,status:"stop_failed",mode:"sdk",error:a})}}),S.post("/stop-all",T,async(e,n)=>{const t=[],o=[];for(const[r,s]of p.entries())try{const i=s.providerId||"claude-code",a=_.get(i);a.abortCurrentTurn(r).catch(()=>{}),await a.terminateSession(r),U(r),p.delete(r),q(r),Ie(r),fe(s.agentId),t.push(r),await $(s.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})}catch(i){const a=i instanceof Error?i.message:String(i);o.push(`SDK ${r}: ${a}`)}try{await dn([]),l.info("[Runtime] \u5DF2\u6E05\u7A7A\u6240\u6709\u6301\u4E45\u5316\u4F1A\u8BDD")}catch(r){const s=r instanceof Error?r.message:String(r);o.push(`Persistence: ${s}`)}n.json({ok:!0,stopped:{sdk:t.length},errors:o.length>0?o:void 0})}),S.get("/events/last/:n",T,(e,n)=>{const t=parseInt(e.params.n,10);if(!Number.isFinite(t)||t<1){n.status(400).json({error:":n must be a positive integer"});return}const o=at.getLastN(t);n.json({ok:!0,count:o.length,entries:o})}),S.get("/events/since/:index",T,(e,n)=>{const t=parseInt(e.params.index,10);if(!Number.isFinite(t)||t<0){n.status(400).json({error:":index must be a non-negative integer"});return}const o=at.getSinceIndex(t);n.json({ok:!0,entries:o.entries,nextIndex:o.nextIndex,oldestIndex:o.oldestIndex,dataLoss:o.oldestIndex>t+1})}),S.get("/events/push-stats",T,(e,n)=>{const t=Ft();n.json({ok:!0,count:t.length,agents:t})});export{mt as CRASH_RECOVERY_NOTICE_CLEAN,Rn as CRASH_RECOVERY_NOTICE_INTERRUPTED,$n as SDK_WAKE_RESUME_PROMPT,jn as buildAcodeCommandOutputPath,eo as buildClaudeCodeLaunchConfig,bn as buildFullContextPayload,kt as buildRuntimeEnv,io as buildSdkOutputMetadata,so as buildToolResultTimelineActionInfo,ms as cleanupSdkSessionByAgentId,Bn as countTerminalOutputLines,St as createTerminalOutputDecoder,ye as decodeTerminalOutputChunk,Co as enqueueCompactionSummaryChunk,Xn as evaluatePersistedSessionReuse,je as flushCompactionSummaryAccumulator,Fn as formatCommandInactivityTimeoutNotice,vn as formatCommandOutputSpilloverNotice,ro as formatSdkOutputEvent,xe as formatTerminalPrompt,xn as isIdleStatusChangeRetryable,Un as isUsageOnlyStatusChange,Hn as normalizeTerminalCommandInput,En as parseResumeTokenUsage,Cn as parseResumeTranscript,Pn as parseRuntimeStopOptions,zn as parseTerminalDirectoryChangeTarget,Se as raceSendOutputWithRetry,An as renderSessionSnapshot,Dn as resolveRuntimeContextResetSupport,ho as resolveRuntimeStatusFromProviderEvent,wn as resolveSdkInitialPrompt,Zn as resolveSdkInputMessage,Et as resolveSdkProviderId,ne as resolveSdkSessionDisplayStatus,Ln as resolveStatusChangeRuntimeState,Z as resolveStatusChangeUsage,Kn as resolveTerminalOutputEncoding,p as sdkSessions,Mn as shouldProbeSdkProcessPid,S as terminalRouter,Po as withSenderSignature};
|
|
42
42
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{cpSync as
|
|
1
|
+
import{cpSync as E,existsSync as a,mkdirSync as B,readdirSync as l,statSync as g}from"node:fs";import r from"node:path";import{getBridgeDataHome as j,getBridgeTemplateDir as C}from"../config.js";import{getUserAiConfigFile as A,getUserCapabilityAgentFile as I,getUserCapabilityDefaultsFile as S,getUserMcpDeployedDir as h,getUserMcpPackagesDir as U,getUserPluginsDeployedDir as k,getUserScopeRoot as w,getUserSkillsDeployedDir as v,getUserSkillsDir as R,isValidScopeId as p}from"../services/user-scope.js";import{createLogger as x}from"../utils/logger.js";const F=x("migrate-user-scopes");function W(e){const u=i=>{const o=e.indexOf(i);return o>=0?String(e[o+1]??"").trim():""},n=u("--tenant"),s=u("--user");if(!n||!s)throw new Error("\u5FC5\u987B\u63D0\u4F9B --tenant <tenantId> \u4E0E --user <userId>");if(!p(n)||!p(s))throw new Error("tenantId/userId \u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u6570\u5B57\u4E0E _ . -");const t=u("--agents");return{tenantId:n,userId:s,dryRun:e.includes("--dry-run"),overwrite:e.includes("--overwrite"),agents:t?t.split(",").map(i=>i.trim()).filter(Boolean):[]}}let y=0,D=0;function b(e){B(r.dirname(e),{recursive:!0})}function d(e,u,n){if(!(!a(e)||!g(e).isFile())){if(a(u)&&!n.overwrite){D+=1;return}if(y+=1,n.dryRun){F.info("[dry-run] file %s \u2192 %s",e,u);return}b(u),E(e,u,{force:!0})}}function f(e,u,n){if(!a(e))return;let s=[];try{s=l(e)}catch{return}for(const t of s){if(t.startsWith("."))continue;const i=r.join(e,t),o=r.join(u,t);let c;try{c=g(i)}catch{continue}c.isDirectory()?f(i,o,n):c.isFile()&&d(i,o,n)}}function P(e){const u={tenantId:e.tenantId,userId:e.userId},n=C();if(!a(n)){F.info("\u9057\u7559\u6A21\u677F\u76EE\u5F55\u4E0D\u5B58\u5728\uFF08%s\uFF09\uFF0C\u65E0\u9700\u8FC1\u79FB",n);return}F.info("\u5F00\u59CB\u8FC1\u79FB\uFF1A%s \u2192 %s%s%s",n,w(u),e.dryRun?"\uFF08dry-run\uFF09":"",e.overwrite?"\uFF08\u8986\u76D6\u5DF2\u5B58\u5728\uFF09":""),d(r.join(n,"config.json"),A(u),e),f(r.join(n,"skills","deployed"),v(u),e);const s=r.join(n,"skills");if(a(s))for(const t of l(s)){if(t==="deployed"||t==="agents"||t==="config.json")continue;const i=r.join(s,t);try{if(!g(i).isDirectory())continue}catch{continue}f(i,r.join(R(u),t),e)}f(r.join(n,"mcp","deployed"),h(u),e),f(r.join(n,"mcp","packages"),U(u),e),f(r.join(n,"plugins","deployed"),k(u),e);for(const t of["skills","mcp","plugins"]){const i=r.join(n,t);d(r.join(i,"config.json"),S(u,t),e);const o=r.join(i,"agents");if(a(o))for(const c of l(o)){if(!c.endsWith(".json")||c.startsWith("."))continue;const m=c.slice(0,-5);d(r.join(o,c),I(u,t,m),e)}}F.info("\u8FC1\u79FB\u5B8C\u6210\uFF1A\u590D\u5236 %d \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7 %d \u4E2A\u5DF2\u5B58\u5728\u6587\u4EF6\u3002\u9057\u7559\u5C42\u4FDD\u7559\uFF08\u53EA\u8BFB\u56DE\u9000\uFF09\u3002",y,D),e.dryRun&&F.info("dry-run \u7ED3\u675F\uFF1A\u672A\u5199\u5165\u4EFB\u4F55\u6587\u4EF6\u3002"),F.info("\u6570\u636E\u6839\uFF1A%s",j())}try{const e=W(process.argv.slice(2));P(e)}catch(e){F.error("\u8FC1\u79FB\u5931\u8D25\uFF1A%s",e instanceof Error?e.message:String(e)),process.exitCode=1}
|
|
2
2
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{cpSync as
|
|
1
|
+
import{cpSync as j,existsSync as y,lstatSync as g,mkdirSync as w,readdirSync as p,realpathSync as d,rmSync as S,symlinkSync as v}from"node:fs";import c from"node:path";import{getBridgeDataHome as L,getBridgeInstancePrivateSkillsDir as b,getBridgeInstanceSkillsDir as E}from"../config.js";import{createLogger as x}from"../utils/logger.js";import{getAgentOwner as F}from"./agent-ownership.js";import{isCapabilityEnabled as A}from"./instance-features.js";import{getUserSkillsDir as B,getUserSkillsDeployedDir as K}from"./user-scope.js";const u=x("agent-capability-sync"),h=process.platform==="win32"?"junction":"dir";function X(){return c.join(L(),"instance-runtime")}function N(e){return E(e)}function T(e){return b(e)}function D(e,r){if(!e||!y(e))return;let n=[];try{n=p(e)}catch{return}for(const s of n){if(s.startsWith("."))continue;const t=c.join(e,s);try{if(!y(c.join(t,"SKILL.md")))continue;r.set(s,t)}catch{continue}}}function C(e){const r=new Map,n=F(e);n&&(D(B(n),r),D(K(n),r));const s=new Set,t=e?T(e):"";if(t&&y(t)){let o=[];try{o=p(t)}catch{o=[]}for(const a of o){if(a.startsWith("."))continue;const f=c.join(t,a);try{if(!y(c.join(f,"SKILL.md")))continue;r.set(a,f),s.add(a)}catch{continue}}}return{sources:r,privateNames:s}}function k(e,r){try{v(e,r,h)}catch(n){if(n.code==="EEXIST")try{if(g(r).isSymbolicLink()){S(r,{recursive:!0,force:!0}),v(e,r,h);return}u.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",c.basename(r),r);return}catch{}u.warn("[farm] junction \u5931\u8D25\uFF0C\u56DE\u9000\u590D\u5236 %s \u2192 %s: %s",e,r,n instanceof Error?n.message:String(n));try{let t=!1;try{t=g(r).isSymbolicLink()}catch{t=!1}const o=y(r);if(o&&!t){u.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}o&&t&&S(r,{recursive:!0,force:!0}),j(e,r,{recursive:!0})}catch(t){u.error("[farm] \u590D\u5236\u56DE\u9000\u4E5F\u5931\u8D25 %s: %s",r,t instanceof Error?t.message:String(t))}}}function M(e,r){try{return c.resolve(d(e))===c.resolve(d(r))}catch{return!1}}function q(e){if(!e)return null;const r=N(e);try{const{sources:n,privateNames:s}=C(e);w(r,{recursive:!0});const t=new Set;let o=[];try{o=p(r)}catch{o=[]}for(const i of o){const l=c.join(r,i);try{g(l).isSymbolicLink()&&t.add(i)}catch{continue}}let a=0,f=0;for(const[i,l]of n){const m=c.join(r,i);if(s.has(i)||A(e,"skills",i))t.has(i)?M(m,l)||(S(m,{recursive:!0,force:!0}),k(l,m),a++):(k(l,m),a++);else if(t.has(i))try{S(m,{recursive:!0,force:!0}),f++}catch{}}for(const i of t)if(!n.has(i))try{S(c.join(r,i),{recursive:!0,force:!0}),f++}catch{}return(a>0||f>0)&&u.info("[farm] agent=%s \u6280\u80FD\u519C\u573A\u5DF2\u540C\u6B65: +%d \u94FE\u63A5, -%d \u53D6\u6D88\u94FE\u63A5 (\u5171 %d \u9879)",e,a,f,n.size),r}catch(n){return u.warn("[farm] agent=%s \u6280\u80FD\u519C\u573A\u540C\u6B65\u5931\u8D25\uFF08\u56DE\u9000\u5168\u5C40\u6280\u80FD\u76EE\u5F55\uFF09: %s",e,n instanceof Error?n.message:String(n)),null}}export{N as getAgentSkillsFarmDir,X as getSkillFarmRoot,q as syncAgentSkillFarm};
|
|
2
2
|
|
|
@@ -24,7 +24,6 @@ export declare function getInherited(scope: UserScope | null, agentId: string, t
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
|
|
28
27
|
export declare function getEffective(scope: UserScope | null, agentId: string, type: CapabilityType, name: string, fallback?: boolean): boolean;
|
|
29
28
|
|
|
30
29
|
export declare function getEffectiveSource(scope: UserScope | null, agentId: string, type: CapabilityType, name: string): "agent" | "inherited" | "bridge" | "deployed" | "default";
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{existsSync as
|
|
2
|
-
`)}function l(r,e){const t=e[r];if(!t||typeof t!="object"||Array.isArray(t))return{};const n={};for(const[i,o]of Object.entries(t))i.trim()&&typeof o=="boolean"&&(n[i.trim()]=o);return n}function
|
|
1
|
+
import{existsSync as v,readFileSync as x,readdirSync as E}from"node:fs";import M from"node:path";import{atomicWriteFileSync as k}from"../utils/file-utils.js";import{getAgentOwner as S}from"./agent-ownership.js";import{getUserCapabilityAgentFile as L,getUserCapabilityDefaultsFile as W,scopeEquals as C}from"./user-scope.js";const b=["skills","mcp","plugins"];function d(r,e){if(e){const t=S(e);if(t)return t}return r}function m(r,e){if(!e)return;const t=S(e);if(t&&!C(t,r))throw new Error("agent-ownership-mismatch")}function w(r,e){return W(r,e)}function p(r,e,t){return L(r,e,t)}const h=new Map;function G(r,e){e?h.set(r,e):h.delete(r)}function g(r,e,t){const n=h.get(r);if(n)try{return n(t)[e]}catch{return}}function j(r){try{if(!v(r))return{};const e=JSON.parse(x(r,"utf8"));return!e||typeof e!="object"||Array.isArray(e)?{}:e}catch{return{}}}function D(r,e){k(r,`${JSON.stringify(e,null,2)}
|
|
2
|
+
`)}function l(r,e){const t=e[r];if(!t||typeof t!="object"||Array.isArray(t))return{};const n={};for(const[i,o]of Object.entries(t))i.trim()&&typeof o=="boolean"&&(n[i.trim()]=o);return n}function P(r,e,t,n){const i={...l(e,r)};n==null?delete i[t]:i[t]=n,r[e]=i}function V(r){try{if(!v(r))return{};const e=JSON.parse(x(r,"utf8"));return!e||typeof e!="object"||Array.isArray(e)?{}:e}catch{return{}}}function a(r,e,t){const n=V(r),i=n[t];return i&&typeof i=="object"&&!Array.isArray(i)?l(e,i):t==="overrides"?l(e,n):{}}function J(r,e,t,n){const i={};for(const o of["overrides","inherited"]){const s=o===t?n:a(r,e,o),f={};for(const u of b){const c=u===e?s:a(r,u,o);f[u]=c}i[o]=f}D(r,i)}function y(r,e){return r?l(e,j(w(r,e))):{}}function F(r,e,t){if(!e)return{};const n=d(r,e);return n?a(p(n,t,e),t,"overrides"):{}}function N(r,e,t){if(!e)return{};const n=d(r,e);return n?a(p(n,t,e),t,"inherited"):{}}function T(r,e,t,n,i){const o=d(r,e),f=F(o,e,t)[n];if(f!==void 0)return f;const c=N(o,e,t)[n];if(c!==void 0)return c;const A=y(o,t)[n];if(A!==void 0)return A;if(i!==void 0)return i;const O=g(t,n,o);return O!==void 0?O:!1}function H(r,e,t,n){const i=d(r,e);return F(i,e,t)[n]!==void 0?"agent":N(i,e,t)[n]!==void 0?"inherited":y(i,t)[n]!==void 0?"bridge":g(t,n,i)!==void 0?"deployed":"default"}function U(r,e,t,n){const i=w(r,e),o=j(i),s=l(e,o);P(o,e,t,n);const f=l(e,o);return JSON.stringify(s)===JSON.stringify(f)?!1:(D(i,o),!0)}function K(r,e,t,n,i){if(!e)return!1;m(r,e);const o=d(r,e)??r,s=p(o,t,e),f=a(s,t,"overrides"),u={...f};return i==null?delete u[n]:u[n]=i,JSON.stringify(f)===JSON.stringify(u)?!1:(J(s,t,"overrides",u),!0)}function Y(r,e,t,n){if(!e)return!1;m(r,e);const i=d(r,e)??r,o=p(i,t,e),s=a(o,t,"inherited"),f={};if(n&&typeof n=="object"&&!Array.isArray(n))for(const[u,c]of Object.entries(n))u.trim()&&typeof c=="boolean"&&(f[u.trim()]=c);return JSON.stringify(s)===JSON.stringify(f)?!1:(J(o,t,"inherited",f),!0)}function Q(r,e){if(!r)return[];const t=M.dirname(p(r,e,"_probe"));try{return v(t)?E(t).filter(n=>n.endsWith(".json")&&!n.startsWith(".")).map(n=>n.slice(0,-5)):[]}catch{return[]}}function X(r,e){const t=h.get(e);if(!t)return 0;let n=0;const i=y(r,e),o=t(r)??{};for(const s of Object.keys(o))s in i||o[s]===!0&&(U(r,e,s,!1),n++);return n}function Z(r,e){return Object.keys(y(r,e)).length>0}function I(r,e,t,n){const i={};for(const o of n)i[o]=T(r,e,t,o);return i}function ee(r,e,t){const n=[];if(!e)return n;for(const i of b){const o=t&&typeof t=="object"?t[i]??{}:{};Y(r,e,i,o)&&n.push(i)}return n}export{b as CAPABILITY_TYPES,y as getDefaults,T as getEffective,I as getEffectiveMap,H as getEffectiveSource,N as getInherited,F as getOverrides,Z as hasAnyDefault,Q as listOverrideAgents,X as reconcileDefaultsFromDeployed,U as setDefault,G as setDeployedDefaultsProvider,Y as setInherited,ee as setInheritedMap,K as setOverride};
|
|
3
3
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
1
|
+
import u from"node:fs/promises";import M from"node:path";import{getBridgeInstanceConfigFile as F,getBridgeInstanceMcpExtraFile as _}from"../config.js";import{getInstanceAiConfigDebugLogger as D}from"../utils/instance-ai-config-debug-logger.js";import{getAgentOwner as U}from"./agent-ownership.js";import{McpDeployManager as h}from"./mcp-deploy.js";import{injectEffectiveEnvIntoMcpServers as k,isBuiltinMcpName as P}from"./mcp-env-injector.js";import{getPanelEnvVars as x,getAgentMeta as N}from"./panel-env.js";import{getUserAiConfigFile as j}from"./user-scope.js";const J=new Set(["apiKey","api_key","apikey","key","secret","token","password"]);function B(e){const r={...e};for(const t of Object.keys(r))if(J.has(t)){const o=r[t];typeof o=="string"&&o.length>0&&(r[t]=o.length>8?`${o.slice(0,4)}...${o.slice(-4)}`:"***")}else typeof r[t]=="object"&&r[t]!==null&&(r[t]=B(r[t]));return r}function $(){return{...process.env.ACODE_MODEL?{model:process.env.ACODE_MODEL}:{},...process.env.ACODE_BASE_URL?{baseURL:process.env.ACODE_BASE_URL}:{},...process.env.ACODE_API_KEY?{apiKey:process.env.ACODE_API_KEY}:{},...process.env.ACODE_EFFORT?{effort:process.env.ACODE_EFFORT}:{}}}async function T(e){try{const r=await u.readFile(e,"utf-8"),a=JSON.parse(r).provider?.default,n=a?.options;return{...a?.model?{model:a.model}:{},...n?.baseURL||n?.baseUrl?{baseURL:n.baseURL||n.baseUrl}:{},...n?.apiKey?{apiKey:n.apiKey}:{}}}catch{return{}}}function E(e,r,t,o){return r!==void 0?"api":t!==void 0?"env":o!==void 0?"file":"default"}function C(e){return _(e)}async function Y(e){try{const r=await u.readFile(C(e),"utf-8"),t=JSON.parse(r);return t.servers&&typeof t.servers=="object"?t.servers:{}}catch{return{}}}function ee(e){return C(e)}async function re(e){const r=U(e.agentId),t=r?j(r):"",o=F(e.agentId),a=e.apiOverrides??{},n=$(),c=await T(t),y=a.model??n.model??c.model,m=a.baseURL??n.baseURL??c.baseURL,v=a.apiKey??n.apiKey??c.apiKey,b=a.effort??n.effort,d={};y&&(d.model=y),m&&(d.baseURL=m),v&&(d.apiKey=v),b&&(d.effort=b);const A={model:E("model",a.model,n.model,c.model),baseURL:E("baseURL",a.baseURL,n.baseURL,c.baseURL),apiKey:E("apiKey",a.apiKey,n.apiKey,c.apiKey),effort:E("effort",a.effort,n.effort,void 0)},I=D();try{await u.mkdir(M.dirname(o),{recursive:!0});let f={};try{const s=await u.readFile(t,"utf-8");f=JSON.parse(s)}catch{}const i=JSON.parse(JSON.stringify(f)),L=i.provider??{},O=L.default??{},p=O.options??{};y&&(p.model=y),m&&(p.baseURL=m),v&&(p.apiKey=v),b&&(p.effort=b),O.options=p,L.default=O,i.provider=L;try{const s=i.mcpServers??{},R=U(e.agentId),l=R?h.forScope(R):null,S=l?l.resolveEnabledMcp(e.agentId,s):s,K=await Y(e.agentId);for(const[g,w]of Object.entries(K))P(g)||(S[g]=w);k(S,x(e.agentId),{resolvePackageDir:g=>l&&l.isPackageHealthy(g)?l.packageDir(g):void 0,agentMeta:N(e.agentId)}),i.mcpServers=S}catch(s){I.log({level:"error",category:"apply",message:`MCP \u80FD\u529B\u8FC7\u6EE4/\u79C1\u6709\u5408\u5E76\u5931\u8D25\uFF08fail-open\uFF0C\u4FDD\u6301\u539F\u914D\u7F6E\uFF09: ${s instanceof Error?s.message:String(s)}`,source:"bridge",agentId:e.agentId,sessionId:e.sessionId})}await u.writeFile(o,JSON.stringify(i,null,2),"utf-8"),I.log({level:"info",category:"apply",message:"per-instance acode.json \u5DF2\u5199\u5165",source:"bridge",agentId:e.agentId,sessionId:e.sessionId,details:{perInstanceConfigPath:o,source:A}})}catch(f){const i=f instanceof Error?f.message:String(f);I.log({level:"error",category:"apply",message:`per-instance acode.json \u5199\u5165\u5931\u8D25: ${i}`,source:"bridge",agentId:e.agentId})}return{instanceConfig:{config:d,source:A},perInstanceConfigPath:o}}export{ee as getAgentMcpExtraFilePath,re as prepareAcodeInstanceConfig,B as redactForLog};
|
|
2
2
|
|