aws-runtime-bridge 1.9.171 → 1.9.172
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 +45 -0
- package/dist/adapter/AcodeSdkAdapter.d.ts +6 -12
- package/dist/adapter/AcodeSdkAdapter.js +2 -2
- package/dist/adapter/ClaudeSdkAdapter.d.ts +2 -0
- package/dist/adapter/ClaudeSdkAdapter.js +3 -3
- package/dist/adapter/types.d.ts +4 -7
- package/dist/routes/terminal.d.ts +8 -0
- package/dist/routes/terminal.js +27 -27
- package/dist/services/session-output.d.ts +2 -0
- package/dist/services/session-output.js +2 -2
- package/package/acode/dist/ask-user-question-tool.d.ts +11 -1
- package/package/acode/dist/ask-user-question-tool.js +3 -3
- package/package/acode/dist/built-in-file-tools.js +2 -2
- package/package/acode/dist/compaction.d.ts +143 -31
- package/package/acode/dist/compaction.js +20 -6
- package/package/acode/dist/runtime-environment.js +1 -1
- package/package/acode/dist/runtime.d.ts +13 -4
- package/package/acode/dist/runtime.js +31 -28
- package/package/acode/dist/types.d.ts +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +1 -1
- package/package.json +1 -1
package/dist/adapter/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
|
|
2
2
|
import { EventEmitter } from "node:events";
|
|
3
3
|
export type SessionStatus = "starting" | "thinking" | "tool_using" | "waiting_input" | "completed" | "terminated" | "error" | "compacting";
|
|
4
|
-
export type ProviderEventType = "ai_request" | "text_delta" | "thinking" | "command_output" | "tool_use_start" | "tool_use_end" | "permission_request" | "ask_user_question" | "exit_plan_mode" | "turn_complete" | "session_complete" | "error" | "context_compaction" | "runtime_capabilities" | "tool_batch_start" | "tool_batch_metrics" | "background_command_completed";
|
|
4
|
+
export type ProviderEventType = "ai_request" | "text_delta" | "thinking" | "command_output" | "tool_use_start" | "tool_use_end" | "permission_request" | "ask_user_question" | "exit_plan_mode" | "turn_complete" | "session_complete" | "error" | "context_compaction" | "compaction_summary" | "runtime_capabilities" | "tool_batch_start" | "tool_batch_metrics" | "background_command_completed";
|
|
5
5
|
|
|
6
6
|
export type ToolActionType = "skill" | "mcp" | "idle" | "edit_file" | "write_file" | "read_file" | "bash" | "search" | "web" | "ai_request" | "lsp" | "notebook" | "other" | "context_compaction" | "runtime_capabilities" | "tool_batch" | "background_command";
|
|
7
7
|
|
|
@@ -351,6 +351,8 @@ export declare abstract class BaseProviderAdapter extends EventEmitter {
|
|
|
351
351
|
|
|
352
352
|
abstract sendQuestionAnswer?(sessionId: string, answers: Record<string, string>): Promise<void>;
|
|
353
353
|
|
|
354
|
+
abstract cancelQuestionAnswer?(sessionId: string, reason?: string): Promise<void>;
|
|
355
|
+
|
|
354
356
|
abstract submitToolPermissionDecision?(sessionId: string, requestId: string, allowed: boolean): boolean;
|
|
355
357
|
|
|
356
358
|
abstract getPendingToolAuthRequests?(sessionId: string): Array<{
|
|
@@ -373,12 +375,7 @@ export declare abstract class BaseProviderAdapter extends EventEmitter {
|
|
|
373
375
|
|
|
374
376
|
abstract resetContext?(sessionId: string): Promise<void>;
|
|
375
377
|
|
|
376
|
-
abstract compactContext?(sessionId: string
|
|
377
|
-
pruneCategories?: string[];
|
|
378
|
-
summarize?: boolean;
|
|
379
|
-
}): unknown;
|
|
380
|
-
|
|
381
|
-
abstract getCompactionPreview?(sessionId: string): unknown;
|
|
378
|
+
abstract compactContext?(sessionId: string): unknown;
|
|
382
379
|
|
|
383
380
|
abstract terminateSession(sessionId: string): Promise<void>;
|
|
384
381
|
|
|
@@ -72,6 +72,11 @@ export declare function isIdleStatusChangeRetryable(params: {
|
|
|
72
72
|
currentRuntimeActionType?: string;
|
|
73
73
|
shouldPreservePrevAction: boolean;
|
|
74
74
|
}): boolean;
|
|
75
|
+
|
|
76
|
+
export declare function isUsageOnlyStatusChange(params: {
|
|
77
|
+
actionInfo?: RuntimeStatusActionInfo;
|
|
78
|
+
usage?: ReturnType<typeof resolveStatusChangeUsage>;
|
|
79
|
+
}): boolean;
|
|
75
80
|
export declare function buildAcodeCommandOutputPath(agentId: string, now?: Date): string;
|
|
76
81
|
export declare function countTerminalOutputLines(output: string): number;
|
|
77
82
|
export declare function formatCommandOutputSpilloverNotice(outputPath: string, lineLimit?: number): string;
|
|
@@ -125,6 +130,9 @@ export declare function resolveRuntimeStatusFromProviderEvent(event: ProviderEve
|
|
|
125
130
|
} | undefined;
|
|
126
131
|
|
|
127
132
|
export declare function raceSendOutputWithRetry(factory: (signal: AbortSignal) => Promise<void>, timeoutMs?: number, maxRetries?: number): Promise<void>;
|
|
133
|
+
export declare function enqueueCompactionSummaryChunk(entry: SdkSessionEntry, sessionId: string, output: string, seq: number): void;
|
|
134
|
+
|
|
135
|
+
export declare function flushCompactionSummaryAccumulator(sessionId: string): void;
|
|
128
136
|
export declare function resolveSdkProviderId(command?: string): string;
|
|
129
137
|
|
|
130
138
|
export declare function withSenderSignature(input: unknown, sender: unknown): unknown;
|
package/dist/routes/terminal.js
CHANGED
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
import{spawn as
|
|
2
|
-
`);if(o.length<=
|
|
1
|
+
import{spawn as ht}from"node:child_process";import{promises as oe}from"node:fs";import At from"node:os";import se from"node:path";import{TextDecoder as ie}from"node:util";import Me from"axios";import{Router as Tt}from"express";import{v4 as _t}from"uuid";import{adapterRegistry as T,getToolActionInfo as Ce,isTransientClipboardPasteFilePath as Ue,redactTransientClipboardPastePaths as F,registerSdkProviders as bt,resolveSdkProviderIdByCommand as kt}from"../adapter/index.js";import{MESSAGE_POLLING_IDLE_PROMPT as xe}from"../adapter/prompts.js";import{getActiveBridgeHttpPort as Ct,getAcodeDataHome as Ne}from"../config.js";import{buildResumeContextBlock as Et}from"@agentswork/acode";import{validateToken as I}from"../middleware/auth.js";import{getAgentProcessManager as Ee}from"../services/agent-process-manager.js";import{loadAgentStartupMemories as wt}from"../services/agent-startup-memory.js";import{createAiConfigService as $t}from"../services/ai-config-service.js";import{resolveSchedulerBaseUrlFromToken as Be}from"../services/auto-register.js";import{setChangeCacheRetentionDays as Rt}from"../services/change-cache-retention.js";import{clearDebugMounts as ae}from"../services/debug-mount.js";import{getAllPushStats as Dt,startHeartbeatScheduler as Ot}from"../services/event-delta-pusher.js";import{prepareAcodeInstanceConfig as Pt,redactForLog as ce}from"../services/instance-ai-config-service.js";import{setLogRetentionDays as Lt}from"../services/log-retention.js";import{setAgentFeatures as Mt,setAgentCapabilities as Ut,setAgentInheritedFeatures as xt,setAgentCapabilitiesInherited as Nt,getAgentFeatures as Bt,getAgentInheritedFeatures as jt,getFeatureState as S,LAUNCH_ITEM_FEATURE_KEY as je,HIRE_FEATURE_KEY as Fe,PENCIL_FEATURE_KEY as Ke,DRAW_FEATURE_KEY as ve,OFFICE_FEATURE_KEY as He,COLLABORATION_TASK_FEATURE_KEY as qe,COLLABORATION_MEETING_FEATURE_KEY as We,COLLABORATION_DEBUG_FEATURE_KEY as ze,COLLABORATION_FILE_HISTORY_FEATURE_KEY as Ge,EMAIL_FEATURE_KEY as Ye,SKILL_INSTALL_FEATURE_KEY as Xe,ABILITY_DEV_FEATURE_KEY as Ve}from"../services/instance-features.js";import{enqueueMcpLaunchBinding as Ft}from"../services/mcp-launch-binding-queue.js";import{setPanelEnvVars as Kt,setAgentMeta as vt}from"../services/panel-env.js";import{findClaudeCodeProcesses as Ht,isProcessRunning as qt}from"../services/process-detector.js";import{forgetSession as K,onSdkToolUseEnd as Wt,onSdkToolUseStart as zt}from"../services/sdk-tool-file-change-recorder.js";import{bridgeEventBuffer as Je,sendOutput as v,sendQuestionRequest as Gt,sendToolAuthRequest as Yt,sendStatus as $}from"../services/session-output.js";import{findPersistedSessionByAgentId as Xt,removePersistedSession as H,savePersistedSessions as Vt,updatePersistedSessionAutoCommands as Jt,updatePersistedSessionRuntimeState as Qt,upsertPersistedSession as Zt}from"../services/terminal-persistence.js";import{getInstanceAiConfigDebugLogger as en}from"../utils/instance-ai-config-debug-logger.js";import{logger as l}from"../utils/logger.js";const h=Tt();function Qe(e){const n=e.header("X-Runtime-Token");return n&&n.trim()?n.trim():(e.header("Authorization")||"").match(/^Bearer\s+(.+)$/i)?.[1]?.trim()||void 0}const f=new Map,tn=45e3,ue=new Map;function nn(e){if(ue.has(e))return;const n=setInterval(()=>{const t=f.get(e);if(!t){M(e);return}const r=t.currentRuntimeStatus;if(r!=="thinking"&&r!=="tool_using"&&r!=="compacting"){M(e);return}$(t.agentId,e,r,void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl}).catch(()=>{})},tn);ue.set(e,n)}function M(e){const n=ue.get(e);n&&(clearInterval(n),ue.delete(e))}const Ze=4e3,rn=200,on=2e3,et=24e3,tt=200,nt=8e3;function sn(e){if(!Array.isArray(e)||e.length===0)return{snapshot:"",truncated:!1};const n=[];let t=null,r=[];const s=()=>{if(t===null)return;const u=r.join("").trim();if(r=[],!u){t=null;return}const d=t==="user"?"\u7528\u6237":t==="assistant"?"\u52A9\u624B":t;n.push(`\u3010${d}\u3011${de(u,on)}`),t=null};for(const u of e){const d=String(u?.role||"").trim();if(!d||d==="system")continue;if(d==="tool_use"||d==="tool_result"){s();const p=String(u.toolName||"").trim()||"\u672A\u77E5\u5DE5\u5177";if(an(p))continue;if(d==="tool_use"){const g=un(String(u.content||""));n.push(`\u3010\u5DE5\u5177\u8C03\u7528\u3011${p}${g?` ${g}`:""}`)}else{const g=de(String(u.content||"").trim(),rn);n.push(`\u3010\u5DE5\u5177\u7ED3\u679C\u3011${p}${u.isError?"\uFF08\u5931\u8D25\uFF09":""}${g?`\uFF1A${g}`:""}`)}continue}const m=String(u.content||"");m.trim()&&(t===d||(s(),t=d),r.push(m))}if(s(),n.length===0)return{snapshot:"",truncated:!1};const o=n.join(`
|
|
2
|
+
`);if(o.length<=et)return{snapshot:o,truncated:!1};const i=et-nt,a=o.slice(0,nt),c=o.slice(o.length-i);return{snapshot:`${a}
|
|
3
3
|
|
|
4
4
|
...\uFF08\u6B64\u5904\u7701\u7565\u4E2D\u6BB5 ${o.length-a.length-c.length} \u5B57\u7B26\u5386\u53F2\uFF09...
|
|
5
5
|
|
|
6
|
-
${c}`,truncated:!0}}function
|
|
6
|
+
${c}`,truncated:!0}}function de(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 an(e){const n=e.toLowerCase();return n.includes("poll_message")||n.includes("get_message")||n.includes("await_complete")}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"]),r=1e6,o=n.filter(i=>!!i&&typeof i=="object"&&t.has(String(i.role))).filter(i=>JSON.stringify(i).length<=r).slice(0,5e3);return o.length>0?o:void 0}catch{return}}function un(e){const n=String(e??"").trim();if(!n)return"";let t;try{const s=JSON.parse(n);if(!s||typeof s!="object"||Array.isArray(s))return"";t=s}catch{return de(n,tt)}const r=[];for(const s of["file_path","path","filePath","pattern","query","command","cmd","url"]){const o=t[s];if(typeof o=="string"&&o.trim()&&r.push(`${s}=${o.trim()}`),r.length>=3)break}if(r.length===0){const s=Object.keys(t).slice(0,5);return s.length>0?`(${s.join(", ")})`:""}return de(r.join(" "),tt)}function rt(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 q=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 ln(e){return e!=="acode"}function fn(e){const n=typeof e=="object"&&e!==null&&"suppressStatus"in e&&e.suppressStatus===!0,t=typeof e=="object"&&e!==null&&"reason"in e&&typeof e.reason=="string"&&e.reason.trim()?e.reason.trim():void 0;return{statusNotified:!n,reason:t}}function V(e){const n=e?.usage;if(!n)return;const t=Number.isFinite(n.inputTokens)?n.inputTokens:0,r=Number.isFinite(n.outputTokens)?n.outputTokens:0;if(t<=0&&r<=0&&!n.contextLimit&&!n.maxOutput&&!n.inputLimit&&!n.compactionThreshold)return;const s={inputTokens:t,outputTokens:r,...n.contextLimit?{contextLimit:n.contextLimit}:{},...n.maxOutput?{maxOutput:n.maxOutput}:{},...n.inputLimit?{inputLimit:n.inputLimit}:{},...n.compactionThreshold?{compactionThreshold:n.compactionThreshold}:{},...n.cacheHitTokens!==void 0?{cacheHitTokens:n.cacheHitTokens}:{},...n.cacheMissTokens!==void 0?{cacheMissTokens:n.cacheMissTokens}:{}};return process.env.ACODE_TOKEN_DEBUG==="1"&&(s.inputTokens>0||s.outputTokens>0||s.cacheHitTokens!==void 0||s.cacheMissTokens!==void 0)&&l.info(`[TokenDebug][Terminal] resolveStatusChangeUsage: input=${s.inputTokens} output=${s.outputTokens} cacheHit=${s.cacheHitTokens??"(none)"} cacheMiss=${s.cacheMissTokens??"(none)"} actionType=${e?.actionType??"(none)"}`),s}function mn(e,n){const t=String(e||"").trim().toLowerCase(),r=String(n?.actionType||"").trim().toLowerCase();return t==="tool_using"&&r==="idle"?n?{status:"waiting_input",actionInfo:n}:{status:"waiting_input"}:n?{status:e,actionInfo:n}:{status:e}}function pn(e){return e.restoredActionInfo?.actionType==="idle"||e.currentRuntimeActionType==="idle"&&e.shouldPreservePrevAction||e.status==="waiting_input"&&!e.actionInfo?.actionType}function gn(e){return e.actionInfo?.actionType?!1:!!e.usage}const J=new Map,yn="utf-8",ot="utf-8",st=300,it=6e4;function Q(e){return String(e).padStart(2,"0")}function Sn(e,n=new Date){const t=n.getFullYear(),r=Q(n.getMonth()+1),s=Q(n.getDate()),o=Q(n.getHours()),i=Q(n.getMinutes()),a=`${t}${r}${s}-${o}${i}${Q(n.getSeconds())}-${String(n.getMilliseconds()).padStart(3,"0")}`;return se.join(Ne(),"cmd-dist",e,`${t}-${r}-${s}`,o,i,`${a}-cmd.out`)}function In(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 hn(e,n=st){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 An(e=it){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 s
|
|
15
|
+
`}async function at(e){const n=e.outputPath||Sn(e.agentId,e.startedAt);return e.outputPath=n,await oe.mkdir(se.dirname(n),{recursive:!0}),await oe.writeFile(n,e.chunks.join(""),"utf-8"),n}function Tn(e){return String(e??"").replace(/\r/g,`
|
|
16
|
+
`).trim()}function _n(e=process.platform,n=process.env){const t=n.AWS_TERMINAL_OUTPUT_ENCODING?.trim();return t||(e==="win32"?yn:ot)}function ct(e=_n()){if(e!=="utf-8")try{return new ie(e,{fatal:!1})}catch{return new ie(ot,{fatal:!1})}return bn()}function bn(){let e=null,n=null,t=null;const r=[];function s(o){try{return new ie(o,{fatal:!1})}catch{return new ie("utf-8",{fatal:!1})}}return{decode(o,i){if(o!=null&&r.push(o instanceof ArrayBuffer?Buffer.from(o):Buffer.isBuffer(o)?o:Buffer.from(o.buffer,o.byteOffset,o.byteLength)),t==="gb18030")return n||(n=s("gb18030")),n.decode(o,i);e||(e=s("utf-8"));const a=e.decode(o,i);if(t===null&&a.includes("\uFFFD")){t="gb18030",n=s("gb18030");const c=Buffer.concat(r);return n.decode(c)}return t===null&&!i?.stream&&(t="utf-8"),a}}}function le(e,n,t=!1){return t?e.decode():!n||n.length===0?"":e.decode(n,{stream:!0})}function kn(e){const n=e.trim().match(/^cd(?:\s+(.*))?$/i);if(!n)return;const t=n[1]?.trim();if(!t)return null;const r=t.replace(/^\/d\s+/i,"").trim();return r.startsWith('"')&&r.endsWith('"')||r.startsWith("'")&&r.endsWith("'")?r.slice(1,-1):r}function Cn(e){const n=J.get(e.sessionId);if(n)return n;const t={currentDirectory:e.workspacePath,runningProcess:null};return J.set(e.sessionId,t),t}function ut(e){for(const n of f.values())if(n.agentId===e)return n}async function En(e){const n=T.get(e.providerId||"claude-code"),t=Z(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 Z(e,n,t){const r=String(e||"").trim();if(r){const o=String(n||"").trim(),i=String(t||"").trim().toLowerCase();return r.toLowerCase()==="tool_using"&&o.toLowerCase()==="waiting_input"&&i==="idle"?o:r}return String(n||"").trim()||"running"}async function wn(e,n=qt){return e.pid?await n(e.pid)?gt(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 Hr(e){try{ae(e)}catch(t){l.warn(`[cleanupSdkSessionByAgentId] clear debug mounts failed for agentId=${e}: ${t}`)}const n=ut(e);if(!n)l.info(`[cleanupSdkSessionByAgentId] No active SDK session found for agentId=${e}, cleaning residual state anyway`);else{const t=n.sessionId;return l.info(`[cleanupSdkSessionByAgentId] Cleaning up SDK session for agentId=${e}, sessionId=${t}`),M(t),f.delete(t),K(t),fe(t),H(t).catch(r=>{l.warn(`[cleanupSdkSessionByAgentId] Failed to remove persisted session for agentId=${e}: ${r}`)}),t}q.has(e)&&(q.delete(e),l.info(`[cleanupSdkSessionByAgentId] Released startingAgents lock for agentId=${e}`))}function fe(e){const n=J.get(e);if(!n?.runningProcess){J.delete(e);return}try{n.runningProcess.kill()}catch{}finally{n.runningProcess=null,J.delete(e)}}function C(e,n){n&&(e.seq+=1,v(e.agentId,n,e.sessionId,e.seq,void 0,{runtimeAccessToken:e.runtimeAccessToken,schedulerBaseUrl:e.schedulerBaseUrl}).catch(()=>{}))}function we(e){return`\x1B[36m${e}>\x1B[0m `}function $n(e,n){return n==="~"?At.homedir():se.resolve(e,n)}async function Rn(e,n,t){const r=kn(t);if(r===void 0)return!1;if(r===null)return C(e,`${n.currentDirectory}\r
|
|
17
|
+
`),!0;const s=$n(n.currentDirectory,r);try{return(await oe.stat(s)).isDirectory()?(n.currentDirectory=s,C(e,`${n.currentDirectory}\r
|
|
18
18
|
`),!0):(C(e,`cd: not a directory: ${s}\r
|
|
19
19
|
`),!0)}catch(o){const i=o instanceof Error?o.message:String(o);return C(e,`cd: ${i}\r
|
|
20
|
-
`),!0}}async function
|
|
21
|
-
`),
|
|
22
|
-
`),C(t,
|
|
23
|
-
[ACode] \u547D\u4EE4\u8F93\u51FA\u843D\u76D8\u5931\u8D25: ${
|
|
24
|
-
`)});return}C(t,
|
|
25
|
-
[Terminal Error] ${
|
|
26
|
-
`)}),a.on("close",(
|
|
27
|
-
[ACode] \u547D\u4EE4\u8F93\u51FA\u6700\u7EC8\u843D\u76D8\u5931\u8D25: ${
|
|
28
|
-
`)}),
|
|
29
|
-
[exit ${
|
|
30
|
-
`):
|
|
31
|
-
[signal ${
|
|
32
|
-
`),C(t,
|
|
33
|
-
...\uFF08\u7ED3\u679C\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`}function
|
|
20
|
+
`),!0}}async function Dn(e,n){const t=f.get(e);if(!t)throw new Error("SDK session not found");const r=Tn(n),s=Cn(t);if(!r)return{started:!1,cwd:s.currentDirectory};if(s.runningProcess)throw new Error("A terminal command is already running for this session");const o=F(r);if(C(t,`${we(s.currentDirectory)}${o}\r
|
|
21
|
+
`),Ue(r))return C(t,`[Terminal Warning] \u68C0\u6D4B\u5230\u526A\u8D34\u677F\u4E34\u65F6 paste \u6587\u4EF6\u8DEF\u5F84\uFF0C\u5DF2\u8DF3\u8FC7\u6267\u884C\u3002\u8BF7\u7C98\u8D34\u6587\u4EF6\u5185\u5BB9\u6216\u4F7F\u7528\u663E\u5F0F\u8BFB\u53D6\u547D\u4EE4\u3002\r
|
|
22
|
+
`),C(t,we(s.currentDirectory)),{started:!1,cwd:s.currentDirectory};if(await Rn(t,s,r))return{started:!1,cwd:s.currentDirectory};await $(t.agentId,e,"tool_using",{actionType:"bash",actionLabel:"\u7EC8\u7AEF\u547D\u4EE4",actionDetail:o},void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl});const a=ht(r,{cwd:s.currentDirectory,shell:!0,env:dt(t.agentId,t.workspacePath,process.env,t.config.envOverrides)});s.runningProcess=a;const c=ct(),u=ct(),d=t.providerId==="acode",m={agentId:t.agentId,startedAt:new Date,chunks:[],spilled:!1};let p;const g=()=>{p&&(clearTimeout(p),p=void 0)},k=()=>{g(),p=setTimeout(()=>{s.runningProcess===a&&(C(t,An()),a.kill())},it)},E=(y,L=!0)=>{if(y&&(d&&m.chunks.push(y),d&&L&&k(),!(d&&m.spilled))){if(d&&In(m.chunks.join(""))>st){m.spilled=!0,at(m).then(_=>{C(t,hn(_))}).catch(_=>{const R=_ instanceof Error?_.message:String(_);C(t,`\r
|
|
23
|
+
[ACode] \u547D\u4EE4\u8F93\u51FA\u843D\u76D8\u5931\u8D25: ${R}\r
|
|
24
|
+
`)});return}C(t,y)}};return d&&k(),a.stdout.on("data",y=>{E(le(c,y))}),a.stderr.on("data",y=>{E(le(u,y))}),a.on("error",y=>{C(t,`\r
|
|
25
|
+
[Terminal Error] ${y.message}\r
|
|
26
|
+
`)}),a.on("close",(y,L)=>{g(),s.runningProcess=null,E(le(c,void 0,!0),!1),E(le(u,void 0,!0),!1),m.spilled&&at(m).catch(_=>{const R=_ instanceof Error?_.message:String(_);C(t,`\r
|
|
27
|
+
[ACode] \u547D\u4EE4\u8F93\u51FA\u6700\u7EC8\u843D\u76D8\u5931\u8D25: ${R}\r
|
|
28
|
+
`)}),y&&y!==0?C(t,`\r
|
|
29
|
+
[exit ${y}]\r
|
|
30
|
+
`):L&&C(t,`\r
|
|
31
|
+
[signal ${L}]\r
|
|
32
|
+
`),C(t,we(s.currentDirectory)),$(t.agentId,e,"waiting_input",void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl})}),{started:!0,cwd:s.currentDirectory}}function dt(e,n,t,r,s){const o={};for(const[i,a]of Object.entries(t))a!==void 0&&(o[i]=a);if(n&&(o.AWS_WORKSPACE_PATH=String(n)),s&&String(s).trim()&&(o.AWS_PROJECT_ROOT=String(s).trim()),r)for(const[i,a]of Object.entries(r)){const c=i.trim();if(!c||a===void 0||a===null)continue;const u=String(a).trim();u&&(o[c]=u)}return o.AWS_AGENT_ID=String(e),o.AWS_MCP_CLAIM_LAUNCH_BINDING="true",o.AWS_RUNTIME_BRIDGE_BASE_URL=`http://127.0.0.1:${Ct()}`,String(o.ACODE_HOME||"").trim()||(o.ACODE_HOME=Ne()),S(e,je)!=="disabled"&&(o.AWS_LAUNCH_CONFIG_TOOLS=S(e,je)),S(e,Fe)!=="disabled"&&(o.AWS_HIRE_TOOLS=S(e,Fe)),S(e,Ke)!=="disabled"&&(o.AWS_PENCIL_TOOLS=S(e,Ke)),S(e,ve)!=="disabled"&&(o.AWS_DRAW_TOOLS=S(e,ve)),S(e,He)!=="disabled"&&(o.AWS_OFFICE_TOOLS=S(e,He)),S(e,qe)!=="disabled"&&(o.AWS_COLLABORATION_TASK_TOOLS=S(e,qe)),S(e,We)!=="disabled"&&(o.AWS_COLLABORATION_MEETING_TOOLS=S(e,We)),S(e,ze)!=="disabled"&&(o.AWS_COLLABORATION_DEBUG_TOOLS=S(e,ze)),S(e,Ge)!=="disabled"&&(o.AWS_COLLABORATION_FILE_HISTORY_TOOLS=S(e,Ge)),S(e,Ye)!=="disabled"&&(o.AWS_EMAIL_TOOLS=S(e,Ye)),S(e,Xe)!=="disabled"&&(o.AWS_ABILITY_MARKET_TOOLS=S(e,Xe)),S(e,Ve)!=="disabled"&&(o.AWS_ABILITY_DEV_TOOLS=S(e,Ve)),o}function On(e){const n=e.trim(),t=n[0],r=n[n.length-1];return(t==='"'||t==="'")&&t===r?n.slice(1,-1):n}async function Pn(e){const n=String(e);if(!Ue(n))return n;const t=On(n);return se.isAbsolute(t)?oe.readFile(t,"utf-8"):n}function lt(e,n){const t={};for(const s of[e?.env,n])if(s)for(const[o,i]of Object.entries(s)){const a=o.trim();if(!a||i===void 0||i===null)continue;const c=String(i).trim();c&&(t[a]=c)}const r=t.ANTHROPIC_MODEL?.trim()||t.CODEX_MODEL?.trim()||void 0;return{envOverrides:t,model:r}}async function Ln(){try{return await $t().readClaudeCodeConfig()}catch(e){return console.warn(`[Runtime] Failed to read saved ClaudeCode AI config: ${e.message}`),{}}}function Mn(e){if(e==null)return;const t=(typeof e=="string"?e:JSON.stringify(e,null,2)).trim();if(t)return t.length<=Ze?t:`${t.slice(0,Ze)}
|
|
33
|
+
...\uFF08\u7ED3\u679C\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`}function Un(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 xn(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 Nn(e){if(e.type!=="tool_use_end")return;const n=Mn(e.data.toolResult??e.data.actionResult);if(!n)return;const t=Ce(e.data.toolName,e.data.toolInput),r=e.data.actionType||t.actionType;if(r==="idle"){const s=String(e.data.rawToolName||e.data.toolName||"").toLowerCase();if((s.includes("poll_message")||s.includes("get_message"))&&!Un(n))return}return r==="mcp"&&xn(e)?{actionType:"mcp",actionLabel:"MCP\u8FD4\u56DE",actionDetail:e.data.actionDetail||e.data.toolName,actionId:e.data.actionId||e.data.toolUseId,actionResult:n,...e.data.parentId?{parentId:e.data.parentId}:{}}:{actionType:r,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:e.data.actionDetail||t.actionDetail||e.data.toolName,actionId:e.data.actionId||e.data.toolUseId,actionResult:n,...e.data.parentId?{parentId:e.data.parentId}:{}}}function Bn(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
|
-
`}if(e.type==="text_delta"||e.type==="thinking"||e.type==="command_output")return e.data.text||void 0;if(e.type==="error")return e.data.text?`\r
|
|
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 Wn(e,n){return String(n||"").trim().toLowerCase()!=="waiting_input"?!1:e.type==="thinking"||e.type==="text_delta"}function Gn(e,n){if(!Wn(e,n)){if(e.type==="background_command_completed")return{status:"tool_result",actionInfo:{actionType:"background_command",actionLabel:"\u540E\u53F0\u547D\u4EE4",actionDetail:"background_command_completed"}};if(e.type==="thinking"||e.type==="text_delta")return{status:"thinking"};if(e.type==="tool_use_start"){const t=ke(e.data.toolName,e.data.toolInput),r=lt(e,t),s=zn(e.data.toolInput);return e.data.actionType==="idle"||t.actionType==="idle"?{status:"waiting_input",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:r||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:s,actionId:e.data.actionId||e.data.toolUseId}}:{status:"tool_using",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:r||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:s,actionId:e.data.actionId||e.data.toolUseId,...e.data.batchId?{parentId:e.data.batchId}:{}}}}if(e.type==="turn_complete")return{status:"waiting_input",actionInfo:e.data.usage?{usage:e.data.usage}:void 0};if(e.type==="error")return{status:"error"};if(e.type==="context_compaction")return{status:"compacting",actionInfo:{actionType:"context_compaction",actionLabel:e.data.actionLabel,actionDetail:e.data.actionDetail,...e.data.actionId?{actionId:e.data.actionId}:{},...e.data.parentId?{parentId:e.data.parentId}:{}}};if(e.type==="runtime_capabilities")return{status:n||"waiting_input",actionInfo:{actionType:"runtime_capabilities",actionLabel:e.data.actionLabel||"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:e.data.actionDetail}};if(e.type==="tool_batch_start"){const t=e.data.batchId;return t?{status:"tool_result",actionInfo:{actionType:"tool_batch",actionLabel:"\u5E76\u884C\u6267\u884C\u5DE5\u5177",actionDetail:e.data.actionDetail,actionId:t}}:void 0}if(e.type==="tool_batch_metrics"){const t=e.data.batchId;return t?{status:"tool_result",actionInfo:{actionType:"tool_batch",actionLabel:"\u5E76\u884C\u6267\u884C\u5DE5\u5177",actionId:t,batchId:t,...e.data.batchMetrics?{batchMetrics:e.data.batchMetrics}:{}}}:void 0}}}const x=new Map,fe=new Map,pe=new Map;async function $e(e){const{entry:n,sessionId:t,actionInfo:r,timestamp:s,sourceEventType:o,backoffBaseMs:i,label:a}=e,c={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl},d=3;for(let u=0;u<d;u++){if(await $(n.agentId,t,"tool_result",r,void 0,c,s,o)!==void 0)return;u<d-1&&await new Promise(m=>setTimeout(m,i*(u+1)))}l.warn(`[Runtime] ${a} tool_result sendStatus retry exhausted (result may be lost): agentId=${n.agentId}`)}const Q=new Map,Yn=20,Xn=500,Vn=3e4;async function me(e,n=Vn,t=2){for(let r=0;r<=t;r++){const s=new AbortController;let o;try{const i=e(s.signal);i.catch(()=>{}),await Promise.race([i,new Promise((a,c)=>{o=setTimeout(()=>{s.abort(),c(new Error(`sendOutput timeout after ${n}ms`))},n)})]),o&&clearTimeout(o);return}catch(i){o&&clearTimeout(o);const a=i instanceof Error?i.message:String(i);if(r<t){const c=1e3*(r+1);l.warn(`sendOutput attempt ${r+1}/${t+1} failed (${a}), retrying in ${c}ms...`),await new Promise(d=>setTimeout(d,c));continue}l.warn(`sendOutput failed after ${t+1} attempts (${a}), giving up to unblock serial queue`)}}}function ge(e,n){const t=n?`${e}:${n}`:void 0;let r,s;if(t)r=Q.get(t),s=t;else{const g=[];for(const[k,A]of Q)k.startsWith(e+":")&&A.buffer&&g.push(A.sourceEventType);for(const k of g)ge(e,k);return}if(!r||!r.buffer)return;r.timer=null;const o=r.buffer,i=r.seq,a=r.entry,c=r.sourceEventType;r.buffer="",s&&Q.delete(s);const d={sourceEventType:c,logCategory:"acode"},u={runtimeAccessToken:a.runtimeAccessToken,schedulerBaseUrl:a.schedulerBaseUrl},m=(x.get(e)??Promise.resolve()).then(()=>me(g=>Y(a.agentId,o,e,i,d,u,g)),()=>me(g=>Y(a.agentId,o,e,i,d,u,g)));x.set(e,m),m.finally(()=>{x.get(e)===m&&x.delete(e)})}function Jn(e,n){const t=xn(e);if(!t)return;n.seq+=1;const r=n.seq,s=Un(e),o={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl};if((e.type==="command_output"||e.type==="text_delta"||e.type==="thinking")&&t.length<Yn){const c=`${e.sessionId}:${e.type}`;let d=Q.get(c);if(d||(d={buffer:"",seq:0,timer:null,entry:n,sourceEventType:e.type}),d.buffer+=t,d.seq=r,d.entry=n,!d.timer){const u=e.sessionId,p=e.type;d.timer=setTimeout(()=>ge(u,p),Xn)}Q.set(c,d);return}ge(e.sessionId);const a=(x.get(e.sessionId)??Promise.resolve()).then(()=>me(c=>Y(n.agentId,t,e.sessionId,r,s,o,c)),()=>me(c=>Y(n.agentId,t,e.sessionId,r,s,o,c)));x.set(e.sessionId,a),a.finally(()=>{x.get(e.sessionId)===a&&x.delete(e.sessionId)})}function pt(e){return _t(e)}let mt=!1;function Qn(){mt||(Tt(h,Zn),Rt(),mt=!0)}function Zn(e,n){e.on("event",t=>{const r=f.get(t.sessionId);if(r){if(t.type==="tool_use_start"?qt(r.sessionId,t.data.toolUseId||t.data.actionId,t.data.toolInput,t.data.toolName,r.workspacePath):t.type==="tool_use_end"&&Ht(t,{sessionId:r.sessionId,agentId:r.agentId,workspacePath:r.workspacePath,providerId:r.providerId}),l.info(`[${n.displayName} Adapter] Event: ${t.type} for session ${t.sessionId}`),!(t.type==="thinking"||t.type==="text_delta"||t.type==="tool_use_start"||t.type==="context_compaction"||t.type==="ai_request"||t.type==="error")){t.type==="runtime_capabilities"&&t.data.actionDetail&&(r.cachedCapabilitiesActionDetail=t.data.actionDetail);const i=Gn(t,r.currentRuntimeStatus);i&&$(r.agentId,t.sessionId,i.status,i.actionInfo,de(i.actionInfo),{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl},t.timestamp?new Date(t.timestamp).getTime():void 0,t.type)}Jn(t,r);const o=Mn(t);if(o){const i=t.timestamp?new Date(t.timestamp).getTime():void 0,a=String(t.data?.toolName||"").toLowerCase()==="browser_launch",c=t.type==="tool_use_end"&&String(t.data?.rawToolName||t.data?.toolName||"").toLowerCase().replace(/[_-]/g,"").includes("todowrite");$e(a?{entry:r,sessionId:t.sessionId,actionInfo:o,timestamp:i,sourceEventType:t.type,backoffBaseMs:3e3,label:"browser_launch"}:c?{entry:r,sessionId:t.sessionId,actionInfo:o,timestamp:i,sourceEventType:t.type,backoffBaseMs:1e3,label:"todo_write"}:{entry:r,sessionId:t.sessionId,actionInfo:o,timestamp:i,sourceEventType:t.type,backoffBaseMs:1e3,label:"tool_result"})}}}),e.on("status-change",(t,r,s)=>{const o=f.get(t);if(o){ge(t),r==="thinking"||r==="tool_using"||r==="compacting"?en(t):M(t);const i=ln(r,s);o.currentRuntimeStatus=i.status;const a=o.currentRuntimeActionDetail??"",c=a.includes("poll_message")||a.includes("get_message"),u=!(i.actionInfo?.actionType==="ai_request")&&(i.status==="thinking"||i.status==="waiting_input")&&(o.currentRuntimeActionType==="idle"||o.currentRuntimeActionType==="mcp")&&c;(i.actionInfo?.actionType||!u)&&(o.currentRuntimeActionType=i.actionInfo?.actionType,o.currentRuntimeActionLabel=i.actionInfo?.actionLabel,o.currentRuntimeActionDetail=i.actionInfo?.actionDetail,o.currentRuntimeActionInput=i.actionInfo?.actionInput),l.info(`[${n.displayName} Adapter] Status changed: ${i.status} for agent ${o.agentId}`,i.actionInfo||""),Vt(t,{runtimeStatus:i.status,runtimeActionType:o.currentRuntimeActionType,runtimeActionLabel:o.currentRuntimeActionLabel,runtimeActionDetail:o.currentRuntimeActionDetail});const p=i.actionInfo?.actionType?i.actionInfo:o.currentRuntimeActionType?{actionType:o.currentRuntimeActionType,actionLabel:o.currentRuntimeActionLabel??"",actionDetail:o.currentRuntimeActionDetail,actionInput:o.currentRuntimeActionInput}:void 0;if(i.status==="compacting"){const g=(fe.get(t)??Promise.resolve()).then(async()=>{for(let A=0;A<=2;A++){if(await $(o.agentId,t,i.status,p,de(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})!==void 0)return;A<2&&(l.warn(`[${n.displayName}] compaction sendStatus attempt ${A+1} failed (HTTP), retrying in ${1e3*(A+1)}ms...`),await new Promise(E=>setTimeout(E,1e3*(A+1))))}l.warn(`[${n.displayName}] compaction sendStatus failed after 3 attempts, event may be lost`)}).catch(k=>{l.warn(`[${n.displayName}] compaction status chain error:`,k)});fe.set(t,g),g.finally(()=>{fe.get(t)===g&&fe.delete(t)})}else{const m=u&&!i.actionInfo?.actionType;if(fn({status:i.status,actionInfo:i.actionInfo,restoredActionInfo:p,currentRuntimeActionType:o.currentRuntimeActionType,shouldPreservePrevAction:u})){const A=(pe.get(t)??Promise.resolve()).then(async()=>{for(let E=0;E<=2;E++){if(await $(o.agentId,t,i.status,m?void 0:p,de(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})!==void 0)return;E<2&&await new Promise(D=>setTimeout(D,1e3*(E+1)))}l.warn(`[${n.displayName}] idle tool sendStatus failed after 3 attempts, status may be stale (frontend will fall back to timeline tool_use event)`)}).catch(T=>{l.warn(`[${n.displayName}] idle status chain error:`,T)});pe.set(t,A),A.finally(()=>{pe.get(t)===A&&pe.delete(t)})}else $(o.agentId,t,i.status,m?void 0:p,de(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})}if(i.status==="waiting_input"&&o.cachedCapabilitiesActionDetail){const m=o.cachedCapabilitiesActionDetail;o.cachedCapabilitiesActionDetail=void 0,l.info(`[${n.displayName} Adapter] Re-sending cached runtime_capabilities for agent ${o.agentId} (session stabilized to waiting_input)`),$(o.agentId,t,"waiting_input",{actionType:"runtime_capabilities",actionLabel:"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:m},void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})}}}),e.on("ask-user-question",t=>{const r=f.get(t.sessionId);r&&(l.info(`[${n.displayName} Adapter] AskUserQuestion for agent ${r.agentId}`),zt(r.agentId,t.sessionId,Array.isArray(t.questions)?t.questions:[],{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl},t.toolCallId))}),e.on("tool-permission-request",t=>{const r=f.get(t.sessionId);r&&t.requestId&&(l.info(`[${n.displayName} Adapter] Tool permission request (${t.capability}) for agent ${r.agentId}`),Wt(r.agentId,t.sessionId,{requestId:t.requestId,capability:t.capability,...t.detail||{}},{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl}))}),e.on("permission-request",t=>{const r=f.get(t.sessionId);if(r){l.info(`[${n.displayName} Adapter] Permission request: ${t.toolName} for agent ${r.agentId}`);const s=t.toolInput?v(JSON.stringify(t.toolInput).slice(0,400)):void 0;$(r.agentId,t.sessionId,"waiting_input",{actionType:"other",actionLabel:"\u6743\u9650\u786E\u8BA4",actionDetail:s||t.toolName},void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl})}})}S.post("/start",y,async(e,n)=>{const{agentId:t,workspacePath:r,mode:s="sdk"}=e.body||{};if(!t||!r){n.status(400).json({error:"agentId and workspacePath are required"});return}const o=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||Ue(Ve(e))||void 0;if(jt({agentId:String(t),workspacePath:String(r),serverUrl:e.body?.serverUrl||o,runtimeAccessToken:e.body?.runtimeAccessToken,userId:e.body?.userId,schedulerBaseUrl:o}),e.body?.runtimeFeatures!==null&&e.body?.runtimeFeatures!==void 0&&(Ot(String(t),e.body.runtimeFeatures),l.info(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u80FD\u529B\u5F00\u5173: ${JSON.stringify(Ut(String(t)))}`)),e.body?.inheritedFeatures!==null&&e.body?.inheritedFeatures!==void 0&&(Mt(String(t),e.body.inheritedFeatures),l.info(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u7EE7\u627F\u4E09\u6001\u5C42: ${JSON.stringify(Nt(String(t)))}`)),e.body?.capabilities!==void 0&&Lt(String(t),e.body.capabilities),e.body?.capabilitiesInherited!==void 0&&xt(String(t),e.body.capabilitiesInherited),e.body?.envVars!==null&&e.body?.envVars!==void 0&&typeof e.body.envVars=="object"&&(Bt(String(t),e.body.envVars),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u6709\u6548\u73AF\u5883\u53D8\u91CF: ${Object.keys(e.body.envVars).length} \u9879 \u2192 \u5DE5\u5177\u5B50\u8FDB\u7A0B + MCP spec`)),e.body?.agentMeta!==void 0&&(vt(String(t),e.body.agentMeta),l.info(`[Runtime] agent ${t} \u4E0B\u53D1 agent \u5143\u4FE1\u606F: ${JSON.stringify(e.body.agentMeta)} \u2192 MCP \u4FDD\u7559\u952E\u6CE8\u5165`)),e.body?.changeCacheRetentionDays!==void 0&&(wt(e.body.changeCacheRetentionDays),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u53D8\u66F4\u7F13\u5B58\u4FDD\u7559\u5929\u6570: ${e.body.changeCacheRetentionDays??"\u4E0D\u6E05\u7406"}`)),e.body?.logRetentionDays!==void 0){const i=Math.min(Number(e.body.logRetentionDays)||0,7);i>0&&(Pt(i),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u65E5\u5FD7\u4FDD\u7559\u5929\u6570: ${i}`))}s&&s!=="sdk"&&console.warn(`[Runtime] Unsupported runtime mode "${s}" requested for agent ${t}; starting SDK session instead.`),await er(e,n)});async function er(e,n){const{agentId:t,workspacePath:r,command:s,projectRoot:o,autoAccept:i=!0,initialPrompt:a,systemPrompt:c,globalPrompt:d,rolePrompt:u,memory:p,resumeContext:m,resumeTranscript:g,mcpConfigPath:k,extraMcpServers:A,envOverrides:T,idleInputAutoCommand:E,nonInputAutoCommand:R,model:D,instanceAiConfig:ye,subAgentModel:Ie,subAgentEffort:Se,scopeKey:Re,browserAllowPrivate:De}=e.body||{},q=sn(g);l.info(`[HIBERNATE-IMPORT] \u542F\u52A8\u8BF7\u6C42\u643A\u5E26\u4F11\u7720\u6062\u590D: agentId=${String(t||"").trim()||"?"} resumeContext=${typeof m=="string"?`${m.length}\u5B57`:"\u65E0"} resumeTranscript\u539F\u59CB=${typeof g=="string"?`${g.length}\u5B57`:typeof g} \u89E3\u6790\u7ED3\u679C=${q?`${q.length}\u6761`:"null"}`);const z=Qt();z.log({level:"info",category:"launch",message:"startSdkSession: \u6536\u5230\u542F\u52A8\u8BF7\u6C42",source:"bridge",agentId:String(t||"").trim()||void 0,details:{reqBodyKeys:Object.keys(e.body||{}),perInstanceAiConfig:ye?ie(ye):null,perAgentModel:D??null}});let w=null;const _=String(t||"").trim(),he=String(e.body?.runtimeAccessToken||"").trim()||void 0,j=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||Ue(Ve(e))||void 0;j?l.info(`[startSdkSession] \u56DE\u8C03\u76EE\u6807 server: ${j} (agentId=${_})`):l.warn(`[startSdkSession] \u672A\u89E3\u6790\u5230 schedulerBaseUrl\uFF0C\u5C06\u56DE\u9000\u5230\u9ED8\u8BA4\u5730\u5740 (agentId=${_})`);try{if(Qn(),!_){n.status(400).json({error:"agentId is required"});return}const B=at(_);if(B){n.json(await bn(B));return}const b=await Gt(_);if(b){const O=await kn(b);if(!O.reusable)console.warn(`[Runtime] Ignoring stale persisted SDK session for agentId=${_}, sessionId=${b.sessionId}, reason=${O.reason}`),await K(b.sessionId);else{const L=J(b.runtimeStatus,b.runtimeStatus,b.runtimeActionType);n.json({sessionId:b.sessionId,status:L,runtimeStatus:L,runtimeActionType:b.runtimeActionType,runtimeActionLabel:b.runtimeActionLabel,runtimeActionDetail:b.runtimeActionDetail,agentId:b.agentId,workspacePath:b.workspacePath,command:b.command,mode:b.mode||"sdk",pid:b.pid,reused:!0,persistedOnly:!0});return}}if(H.has(_)){n.status(409).json({error:"SDK session is already starting for this agent"});return}H.add(_);const P=pt(s),gt=h.get(P);w=At();const yt=P==="claude-code"?await Dn():null,Z=dt(P==="claude-code"?yt:null,T),W=P==="acode"?D?String(D).trim():void 0:(()=>{const O=D?String(D).trim():void 0,L=Z.model?String(Z.model).trim():void 0;return O||L})();z.log({level:"info",category:"resolve",message:"\u6A21\u578B\u89E3\u6790\u7ED3\u679C",source:"bridge",agentId:_,sessionId:w??void 0,details:{perAgentModel:D??null,globalModel:Z.model??null,resolvedModel:W??null,providerId:P,note:P==="acode"?"adapter handles full priority":"request > global"}});const Ae={...Z.envOverrides};W&&(Ae.ANTHROPIC_MODEL=W,Ae.CODEX_MODEL=W);let G,Te=k;if(P==="acode"){const O=ye||{},L=await Dt({apiOverrides:tt(O)??void 0,agentId:_,sessionId:w??void 0,runtimeBridgeBaseUrl:j});G=L.instanceConfig.config,Te=L.perInstanceConfigPath,z.log({level:"info",category:"apply",message:"prepareAcodeInstanceConfig \u5B8C\u6210",source:"bridge",agentId:_,sessionId:w??void 0,details:{sanitizedApiOverrides:(()=>{const N=tt(O);return N?ie(N):null})(),resolvedInstanceAiConfig:G?ie(G):null,perInstanceConfigPath:Te,instanceConfigSources:L.instanceConfig.source??null}})}let Pe=c||void 0,_e,be,ee;const te=typeof m=="string"&&m.trim()?kt(m):void 0;if(P==="acode")if(_e=typeof d=="string"&&d.trim()||void 0,be=typeof u=="string"&&u.trim()||void 0,typeof p=="string"&&p.trim())ee=p.trim();else{const O=await Ct(r,{schedulerBaseUrl:j,runtimeAccessToken:he,agentId:_});O&&(ee=O,l.info(`[startSdkSession] Auto-loaded memories for ACode agent ${_}`))}else if(typeof d=="string"&&d.trim()||typeof u=="string"&&u.trim()||typeof p=="string"&&p.trim()||te!==void 0){const L=[d,u,p,te,c].filter(N=>typeof N=="string"&&N.trim().length>0).map(N=>N.trim());Pe=L.length>0?L.join(`
|
|
37
|
+
`:void 0}function jn(e){const n=vn(e);return{sourceEventType:e.type,logCategory:"acode",...Kn(e),...n?{logLevel:Fn(e),logMessage:n}:{}}}function Fn(e){return e.type==="error"?"error":e.type==="command_output"&&e.data.stream==="stderr"?"warn":"info"}function Kn(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 vn(e){if(e.type==="ai_request"){const n=e.data.model||"unknown-model",t=e.data.endpoint?` @ ${e.data.endpoint}`:"",r=typeof e.data.toolCount=="number"?`, tools=${e.data.toolCount}`:"";return`AI request started: ${n}${t}${r}`}if(e.type==="tool_use_start")return ft(e,"\u5F00\u59CB");if(e.type==="tool_use_end")return ft(e,"\u5B8C\u6210");if(e.type==="command_output")return Wn(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 Hn=/\x1b\[[0-9;?]*[a-zA-Z]/g;function qn(e){return e.replace(Hn,"")}function Wn(e){const n=typeof e.data.stream=="string"?e.data.stream:"mixed",t=typeof e.data.sequence=="number"?` #${e.data.sequence}`:"",r=qn(String(e.data.text||"")).replace(/\s+/g," ").trim(),s=r.length>240?`${r.slice(0,240)}...`:r;return`\u547D\u4EE4\u8F93\u51FA(${n}${t}): ${s||"(empty)"}`}function ft(e,n){const t=Ce(e.data.toolName,e.data.toolInput),r=e.data.actionLabel||t.actionLabel||"\u8C03\u7528\u5DE5\u5177",s=mt(e,t);return s?`${n}${r}: ${s}`:`${n}${r}: ${e.data.actionDetail||e.data.toolName||"tool"}`}function mt(e,n){const t=e.data.toolInput;return n.actionType==="bash"?zn(t)||e.data.actionDetail||n.actionDetail:n.actionType==="read_file"||n.actionType==="edit_file"||n.actionType==="write_file"?Gn(t)||e.data.actionDetail||n.actionDetail:e.data.actionDetail||n.actionDetail}function zn(e){const n=$e(e?.command,e?.cmd);if(n)return n;if(Array.isArray(e?.argv)){const t=e.argv.map(r=>String(r??"").trim()).filter(Boolean).join(" ");return t?F(t):void 0}return $e(e?.args)}function Gn(e){const n=pt(e?.paths);return n.length>0?n.length===1?n[0]:`${n.length}\u4E2A\u6587\u4EF6: ${n.join(", ")}`:$e(e?.file_path,e?.filePath,e?.path,e?.target_file,e?.targetFile)}function $e(...e){for(const n of e){if(typeof n=="string"&&n.trim())return F(n.trim());if(Array.isArray(n)){const t=pt(n)[0];if(t)return t}}}function pt(e){return Array.isArray(e)?e.map(n=>typeof n=="string"?n.trim():"").filter(Boolean).map(n=>F(n)):[]}function Yn(e){if(!(!e||Object.keys(e).length===0))try{const n=F(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 Xn(e,n){return String(n||"").trim().toLowerCase()!=="waiting_input"?!1:e.type==="thinking"||e.type==="text_delta"}function Vn(e,n){if(!Xn(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=Ce(e.data.toolName,e.data.toolInput),r=mt(e,t),s=Yn(e.data.toolInput);return e.data.actionType==="idle"||t.actionType==="idle"?{status:"waiting_input",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:r||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:s,actionId:e.data.actionId||e.data.toolUseId}}:{status:"tool_using",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:r||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:s,actionId:e.data.actionId||e.data.toolUseId,...e.data.batchId?{parentId:e.data.batchId}:{}}}}if(e.type==="turn_complete")return{status:"waiting_input",actionInfo:e.data.usage?{usage:e.data.usage}:void 0};if(e.type==="error")return{status:"error"};if(e.type==="context_compaction")return{status:"compacting",actionInfo:{actionType:"context_compaction",actionLabel:e.data.actionLabel,actionDetail:e.data.actionDetail,...e.data.actionId?{actionId:e.data.actionId}:{},...e.data.parentId?{parentId:e.data.parentId}:{}}};if(e.type==="runtime_capabilities")return{status:n||"waiting_input",actionInfo:{actionType:"runtime_capabilities",actionLabel:e.data.actionLabel||"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:e.data.actionDetail}};if(e.type==="tool_batch_start"){const t=e.data.batchId;return t?{status:"tool_result",actionInfo:{actionType:"tool_batch",actionLabel:"\u5E76\u884C\u6267\u884C\u5DE5\u5177",actionDetail:e.data.actionDetail,actionId:t}}:void 0}if(e.type==="tool_batch_metrics"){const t=e.data.batchId;return t?{status:"tool_result",actionInfo:{actionType:"tool_batch",actionLabel:"\u5E76\u884C\u6267\u884C\u5DE5\u5177",actionId:t,batchId:t,...e.data.batchMetrics?{batchMetrics:e.data.batchMetrics}:{}}}:void 0}}}const U=new Map,me=new Map,pe=new Map;async function Re(e){const{entry:n,sessionId:t,actionInfo:r,timestamp:s,sourceEventType:o,backoffBaseMs:i,label:a}=e,c={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl},u=3;for(let d=0;d<u;d++){if(await $(n.agentId,t,"tool_result",r,void 0,c,s,o)!==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 ee=new Map,Jn=20,Qn=500,Zn=3e4;async function ge(e,n=Zn,t=2){for(let r=0;r<=t;r++){const s=new AbortController;let o;try{const i=e(s.signal);i.catch(()=>{}),await Promise.race([i,new Promise((a,c)=>{o=setTimeout(()=>{s.abort(),c(new Error(`sendOutput timeout after ${n}ms`))},n)})]),o&&clearTimeout(o);return}catch(i){o&&clearTimeout(o);const a=i instanceof Error?i.message:String(i);if(r<t){const c=1e3*(r+1);l.warn(`sendOutput attempt ${r+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 er(e,n,t,r,s,o){try{await v(e,n,t,r,{...s,sourceEventType:"compaction_summary",skipLocalPersist:!0},o)}catch(i){l.debug("Compaction summary realtime push failed (non-persisted)",{agentId:e,sessionId:t,error:i instanceof Error?i.message:String(i)})}}const ye=new Map,tr=120,nr=120;function rr(e,n,t,r){const s=`${n}:compaction_summary`;let o=ye.get(s);if(o||(o={buffer:"",timer:null,entry:e,sessionId:n,seq:r},ye.set(s,o)),o.buffer+=t,o.seq=r,o.entry=e,o.buffer.length>=tr){De(n);return}o.timer||(o.timer=setTimeout(()=>De(n),nr))}function De(e){const n=`${e}:compaction_summary`,t=ye.get(n);if(!t)return;t.timer&&(clearTimeout(t.timer),t.timer=null);const r=t.buffer;ye.delete(n),r&&er(t.entry.agentId,r,t.sessionId,t.seq,{sourceEventType:"compaction_summary",skipLocalPersist:!0},{runtimeAccessToken:t.entry.runtimeAccessToken,schedulerBaseUrl:t.entry.schedulerBaseUrl})}function Se(e,n){const t=n?`${e}:${n}`:void 0;let r,s;if(t)r=ee.get(t),s=t;else{const g=[];for(const[k,E]of ee)k.startsWith(e+":")&&E.buffer&&g.push(E.sourceEventType);for(const k of g)Se(e,k);return}if(!r||!r.buffer)return;r.timer=null;const o=r.buffer,i=r.seq,a=r.entry,c=r.sourceEventType;r.buffer="",s&&ee.delete(s);const u={sourceEventType:c,logCategory:"acode"},d={runtimeAccessToken:a.runtimeAccessToken,schedulerBaseUrl:a.schedulerBaseUrl},p=(U.get(e)??Promise.resolve()).then(()=>ge(g=>v(a.agentId,o,e,i,u,d,g)),()=>ge(g=>v(a.agentId,o,e,i,u,d,g)));U.set(e,p),p.finally(()=>{U.get(e)===p&&U.delete(e)})}function or(e,n){const t=Bn(e);if(!t)return;n.seq+=1;const r=n.seq,s=jn(e),o={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl};if(e.type==="compaction_summary"){rr(n,e.sessionId,t,r);return}if((e.type==="command_output"||e.type==="text_delta"||e.type==="thinking")&&t.length<Jn){const c=`${e.sessionId}:${e.type}`;let u=ee.get(c);if(u||(u={buffer:"",seq:0,timer:null,entry:n,sourceEventType:e.type}),u.buffer+=t,u.seq=r,u.entry=n,!u.timer){const d=e.sessionId,m=e.type;u.timer=setTimeout(()=>Se(d,m),Qn)}ee.set(c,u);return}Se(e.sessionId);const a=(U.get(e.sessionId)??Promise.resolve()).then(()=>ge(c=>v(n.agentId,t,e.sessionId,r,s,o,c)),()=>ge(c=>v(n.agentId,t,e.sessionId,r,s,o,c)));U.set(e.sessionId,a),a.finally(()=>{U.get(e.sessionId)===a&&U.delete(e.sessionId)})}function gt(e){return kt(e)}let yt=!1;function sr(){yt||(bt(T,ir),Ot(),yt=!0)}function ir(e,n){e.on("event",t=>{const r=f.get(t.sessionId);if(r){if(t.type==="tool_use_start"?zt(r.sessionId,t.data.toolUseId||t.data.actionId,t.data.toolInput,t.data.toolName,r.workspacePath):t.type==="tool_use_end"&&Wt(t,{sessionId:r.sessionId,agentId:r.agentId,workspacePath:r.workspacePath,providerId:r.providerId}),l.info(`[${n.displayName} Adapter] Event: ${t.type} for session ${t.sessionId}`),!(t.type==="thinking"||t.type==="text_delta"||t.type==="tool_use_start"||t.type==="context_compaction"||t.type==="compaction_summary"||t.type==="ai_request"||t.type==="error")){t.type==="runtime_capabilities"&&t.data.actionDetail&&(r.cachedCapabilitiesActionDetail=t.data.actionDetail);const i=Vn(t,r.currentRuntimeStatus);i&&$(r.agentId,t.sessionId,i.status,i.actionInfo,V(i.actionInfo),{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl},t.timestamp?new Date(t.timestamp).getTime():void 0,t.type)}t.type==="context_compaction"&&De(t.sessionId),or(t,r);const o=Nn(t);if(o){const i=t.timestamp?new Date(t.timestamp).getTime():void 0,a=String(t.data?.toolName||"").toLowerCase()==="browser_launch",c=t.type==="tool_use_end"&&String(t.data?.rawToolName||t.data?.toolName||"").toLowerCase().replace(/[_-]/g,"").includes("todowrite");Re(a?{entry:r,sessionId:t.sessionId,actionInfo:o,timestamp:i,sourceEventType:t.type,backoffBaseMs:3e3,label:"browser_launch"}:c?{entry:r,sessionId:t.sessionId,actionInfo:o,timestamp:i,sourceEventType:t.type,backoffBaseMs:1e3,label:"todo_write"}:{entry:r,sessionId:t.sessionId,actionInfo:o,timestamp:i,sourceEventType:t.type,backoffBaseMs:1e3,label:"tool_result"})}}}),e.on("status-change",(t,r,s)=>{const o=f.get(t);if(o){Se(t),r==="thinking"||r==="tool_using"||r==="compacting"?nn(t):M(t);const i=mn(r,s);o.currentRuntimeStatus=i.status;const a=o.currentRuntimeActionDetail??"",c=a.includes("poll_message")||a.includes("get_message"),d=!(i.actionInfo?.actionType==="ai_request")&&(i.status==="thinking"||i.status==="waiting_input")&&(o.currentRuntimeActionType==="idle"||o.currentRuntimeActionType==="mcp")&&c;(i.actionInfo?.actionType||!d)&&(o.currentRuntimeActionType=i.actionInfo?.actionType,o.currentRuntimeActionLabel=i.actionInfo?.actionLabel,o.currentRuntimeActionDetail=i.actionInfo?.actionDetail,o.currentRuntimeActionInput=i.actionInfo?.actionInput),l.info(`[${n.displayName} Adapter] Status changed: ${i.status} for agent ${o.agentId}`,i.actionInfo||""),Qt(t,{runtimeStatus:i.status,runtimeActionType:o.currentRuntimeActionType,runtimeActionLabel:o.currentRuntimeActionLabel,runtimeActionDetail:o.currentRuntimeActionDetail});const m=gn({actionInfo:i.actionInfo,usage:V(i.actionInfo)}),p=m?void 0:i.actionInfo?.actionType?i.actionInfo:o.currentRuntimeActionType?{actionType:o.currentRuntimeActionType,actionLabel:o.currentRuntimeActionLabel??"",actionDetail:o.currentRuntimeActionDetail,actionInput:o.currentRuntimeActionInput}:void 0;if(i.status==="compacting"){const k=(me.get(t)??Promise.resolve()).then(async()=>{for(let y=0;y<=2;y++){if(await $(o.agentId,t,i.status,p,V(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})!==void 0)return;y<2&&(l.warn(`[${n.displayName}] compaction sendStatus attempt ${y+1} failed (HTTP), retrying in ${1e3*(y+1)}ms...`),await new Promise(_=>setTimeout(_,1e3*(y+1))))}l.warn(`[${n.displayName}] compaction sendStatus failed after 3 attempts, event may be lost`)}).catch(E=>{l.warn(`[${n.displayName}] compaction status chain error:`,E)});me.set(t,k),k.finally(()=>{me.get(t)===k&&me.delete(t)})}else{const g=d&&!i.actionInfo?.actionType||m;if(pn({status:i.status,actionInfo:i.actionInfo,restoredActionInfo:p,currentRuntimeActionType:o.currentRuntimeActionType,shouldPreservePrevAction:d})){const y=(pe.get(t)??Promise.resolve()).then(async()=>{for(let _=0;_<=2;_++){if(await $(o.agentId,t,i.status,g?void 0:p,V(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})!==void 0)return;_<2&&await new Promise(W=>setTimeout(W,1e3*(_+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)});pe.set(t,y),y.finally(()=>{pe.get(t)===y&&pe.delete(t)})}else $(o.agentId,t,i.status,g?void 0:p,V(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})}if(i.status==="waiting_input"&&o.cachedCapabilitiesActionDetail){const g=o.cachedCapabilitiesActionDetail;o.cachedCapabilitiesActionDetail=void 0,l.info(`[${n.displayName} Adapter] Re-sending cached runtime_capabilities for agent ${o.agentId} (session stabilized to waiting_input)`),$(o.agentId,t,"waiting_input",{actionType:"runtime_capabilities",actionLabel:"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:g},void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})}}}),e.on("ask-user-question",t=>{const r=f.get(t.sessionId);r&&(l.info(`[${n.displayName} Adapter] AskUserQuestion for agent ${r.agentId}`),Gt(r.agentId,t.sessionId,Array.isArray(t.questions)?t.questions:[],{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl},t.toolCallId))}),e.on("tool-permission-request",t=>{const r=f.get(t.sessionId);r&&t.requestId&&(l.info(`[${n.displayName} Adapter] Tool permission request (${t.capability}) for agent ${r.agentId}`),Yt(r.agentId,t.sessionId,{requestId:t.requestId,capability:t.capability,...t.detail||{}},{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl}))}),e.on("permission-request",t=>{const r=f.get(t.sessionId);if(r){l.info(`[${n.displayName} Adapter] Permission request: ${t.toolName} for agent ${r.agentId}`);const s=t.toolInput?F(JSON.stringify(t.toolInput).slice(0,400)):void 0;$(r.agentId,t.sessionId,"waiting_input",{actionType:"other",actionLabel:"\u6743\u9650\u786E\u8BA4",actionDetail:s||t.toolName},void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl})}})}h.post("/start",I,async(e,n)=>{const{agentId:t,workspacePath:r,mode:s="sdk"}=e.body||{};if(!t||!r){n.status(400).json({error:"agentId and workspacePath are required"});return}const o=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||Be(Qe(e))||void 0;if(Ft({agentId:String(t),workspacePath:String(r),serverUrl:e.body?.serverUrl||o,runtimeAccessToken:e.body?.runtimeAccessToken,userId:e.body?.userId,schedulerBaseUrl:o}),e.body?.runtimeFeatures!==null&&e.body?.runtimeFeatures!==void 0&&(Mt(String(t),e.body.runtimeFeatures),l.info(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u80FD\u529B\u5F00\u5173: ${JSON.stringify(Bt(String(t)))}`)),e.body?.inheritedFeatures!==null&&e.body?.inheritedFeatures!==void 0&&(xt(String(t),e.body.inheritedFeatures),l.info(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u7EE7\u627F\u4E09\u6001\u5C42: ${JSON.stringify(jt(String(t)))}`)),e.body?.capabilities!==void 0&&Ut(String(t),e.body.capabilities),e.body?.capabilitiesInherited!==void 0&&Nt(String(t),e.body.capabilitiesInherited),e.body?.envVars!==null&&e.body?.envVars!==void 0&&typeof e.body.envVars=="object"&&(Kt(String(t),e.body.envVars),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u6709\u6548\u73AF\u5883\u53D8\u91CF: ${Object.keys(e.body.envVars).length} \u9879 \u2192 \u5DE5\u5177\u5B50\u8FDB\u7A0B + MCP spec`)),e.body?.agentMeta!==void 0&&(vt(String(t),e.body.agentMeta),l.info(`[Runtime] agent ${t} \u4E0B\u53D1 agent \u5143\u4FE1\u606F: ${JSON.stringify(e.body.agentMeta)} \u2192 MCP \u4FDD\u7559\u952E\u6CE8\u5165`)),e.body?.changeCacheRetentionDays!==void 0&&(Rt(e.body.changeCacheRetentionDays),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u53D8\u66F4\u7F13\u5B58\u4FDD\u7559\u5929\u6570: ${e.body.changeCacheRetentionDays??"\u4E0D\u6E05\u7406"}`)),e.body?.logRetentionDays!==void 0){const i=Math.min(Number(e.body.logRetentionDays)||0,7);i>0&&(Lt(i),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u65E5\u5FD7\u4FDD\u7559\u5929\u6570: ${i}`))}s&&s!=="sdk"&&console.warn(`[Runtime] Unsupported runtime mode "${s}" requested for agent ${t}; starting SDK session instead.`),await ar(e,n)});async function ar(e,n){const{agentId:t,workspacePath:r,command:s,projectRoot:o,autoAccept:i=!0,initialPrompt:a,systemPrompt:c,globalPrompt:u,rolePrompt:d,memory:m,resumeContext:p,resumeTranscript:g,mcpConfigPath:k,extraMcpServers:E,envOverrides:y,idleInputAutoCommand:L,nonInputAutoCommand:_,model:R,instanceAiConfig:W,subAgentModel:Ie,subAgentEffort:he,scopeKey:Oe,browserAllowPrivate:Pe}=e.body||{},z=cn(g);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 g=="string"?`${g.length}\u5B57`:typeof g} \u89E3\u6790\u7ED3\u679C=${z?`${z.length}\u6761`:"null"}`);const G=en();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:W?ce(W):null,perAgentModel:R??null}});let w=null;const A=String(t||"").trim(),Ae=String(e.body?.runtimeAccessToken||"").trim()||void 0,B=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||Be(Qe(e))||void 0;B?l.info(`[startSdkSession] \u56DE\u8C03\u76EE\u6807 server: ${B} (agentId=${A})`):l.warn(`[startSdkSession] \u672A\u89E3\u6790\u5230 schedulerBaseUrl\uFF0C\u5C06\u56DE\u9000\u5230\u9ED8\u8BA4\u5730\u5740 (agentId=${A})`);try{if(sr(),!A){n.status(400).json({error:"agentId is required"});return}const j=ut(A);if(j){n.json(await En(j));return}const b=await Xt(A);if(b){const O=await wn(b);if(!O.reusable)console.warn(`[Runtime] Ignoring stale persisted SDK session for agentId=${A}, sessionId=${b.sessionId}, reason=${O.reason}`),await H(b.sessionId);else{const P=Z(b.runtimeStatus,b.runtimeStatus,b.runtimeActionType);n.json({sessionId:b.sessionId,status:P,runtimeStatus:P,runtimeActionType:b.runtimeActionType,runtimeActionLabel:b.runtimeActionLabel,runtimeActionDetail:b.runtimeActionDetail,agentId:b.agentId,workspacePath:b.workspacePath,command:b.command,mode:b.mode||"sdk",pid:b.pid,reused:!0,persistedOnly:!0});return}}if(q.has(A)){n.status(409).json({error:"SDK session is already starting for this agent"});return}q.add(A);const D=gt(s),St=T.get(D);w=_t();const It=D==="claude-code"?await Ln():null,te=lt(D==="claude-code"?It:null,y),Y=D==="acode"?R?String(R).trim():void 0:(()=>{const O=R?String(R).trim():void 0,P=te.model?String(te.model).trim():void 0;return O||P})();G.log({level:"info",category:"resolve",message:"\u6A21\u578B\u89E3\u6790\u7ED3\u679C",source:"bridge",agentId:A,sessionId:w??void 0,details:{perAgentModel:R??null,globalModel:te.model??null,resolvedModel:Y??null,providerId:D,note:D==="acode"?"adapter handles full priority":"request > global"}});const Te={...te.envOverrides};Y&&(Te.ANTHROPIC_MODEL=Y,Te.CODEX_MODEL=Y);let X,_e=k;if(D==="acode"){const O=W||{},P=await Pt({apiOverrides:rt(O)??void 0,agentId:A,sessionId:w??void 0,runtimeBridgeBaseUrl:B});X=P.instanceConfig.config,_e=P.perInstanceConfigPath,G.log({level:"info",category:"apply",message:"prepareAcodeInstanceConfig \u5B8C\u6210",source:"bridge",agentId:A,sessionId:w??void 0,details:{sanitizedApiOverrides:(()=>{const N=rt(O);return N?ce(N):null})(),resolvedInstanceAiConfig:X?ce(X):null,perInstanceConfigPath:_e,instanceConfigSources:P.instanceConfig.source??null}})}let Le=c||void 0,be,ke,ne;const re=typeof p=="string"&&p.trim()?Et(p):void 0;if(D==="acode")if(be=typeof u=="string"&&u.trim()||void 0,ke=typeof d=="string"&&d.trim()||void 0,typeof m=="string"&&m.trim())ne=m.trim();else{const O=await wt(r,{schedulerBaseUrl:B,runtimeAccessToken:Ae,agentId:A});O&&(ne=O,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()||re!==void 0){const P=[u,d,m,re,c].filter(N=>typeof N=="string"&&N.trim().length>0).map(N=>N.trim());Le=P.length>0?P.join(`
|
|
39
39
|
|
|
40
|
-
`):void 0}const U={command:s||"acode",workingDirectory:r,agentId:_,...Re?{scopeKey:Re}:{},...typeof De=="boolean"?{browserAllowPrivate:De}:{},autoAccept:!!i,initialPrompt:a,systemPrompt:Pe,..._e!==void 0?{globalPrompt:_e}:{},...be!==void 0?{rolePrompt:be}:{},...ee!==void 0?{memory:ee}:{},...te!==void 0?{resumeContext:te}:{},...P==="acode"&&Array.isArray(q)&&q.length>0?{resumeTranscript:q}:{},model:W,mcpConfigPath:Te,...G?{instanceAiConfig:G}:{},...typeof Ie=="string"&&Ie.trim()?{subAgentModel:Ie.trim()}:{},...typeof Se=="string"&&Se.trim()?{subAgentEffort:Se.trim()}:{},extraMcpServers:A||{},envOverrides:ct(String(t),String(r),process.env,Ae,typeof o=="string"?o:void 0)};z.log({level:"info",category:"launch",message:"\u4F20\u9012\u7ED9 Adapter \u7684\u5B8C\u6574 AdapterSessionConfig",source:"bridge",agentId:_,sessionId:w,details:{adapterModel:U.model??null,adapterInstanceAiConfig:U.instanceAiConfig?ie(U.instanceAiConfig):null,adapterMcpConfigPath:U.mcpConfigPath??null}}),await z.flush(),f.set(w,{agentId:_,workspacePath:r,sessionId:w,config:U,providerId:P,seq:0,runtimeAccessToken:he,schedulerBaseUrl:j}),n.json({sessionId:w,status:"starting",runtimeStatus:"starting",agentId:_,workspacePath:r,command:U.command,mode:"sdk"}),tr({sessionId:w,agentId:_,config:U,adapter:gt,providerId:P,idleInputAutoCommand:E,nonInputAutoCommand:R,runtimeAccessToken:he,requestedSchedulerBaseUrl:j})}catch(B){if(w&&(M(w),f.delete(w),F(w)),_&&H.delete(_),!n.headersSent){const b=B instanceof Error?B.message:String(B);n.status(500).json({error:`Failed to start SDK session: ${b}`})}}}async function tr(e){const{sessionId:n,agentId:t,config:r,adapter:s,providerId:o,idleInputAutoCommand:i,nonInputAutoCommand:a,runtimeAccessToken:c,requestedSchedulerBaseUrl:d}=e;try{await s.startSession(n,r),s.setIdleCommands?.(n,{idleInputCommand:i||Me,nonInputCommand:a||""});let u;if(dn(o))try{if(await new Promise(m=>setTimeout(m,500)),u=s.getSessionPid?.(n),!u){const g=(await Ft()).find(k=>k.agentId===t||k.cwd===r.workingDirectory||k.command.includes(r.workingDirectory));g&&(u=g.pid,l.info(`[Runtime] Found SDK process PID: ${u} for agentId=${t}`))}}catch(m){console.warn(`[Runtime] Failed to get SDK PID for agentId=${t}:`,m)}const p=J(s.getSessionStatus(n),f.get(n)?.currentRuntimeStatus,f.get(n)?.currentRuntimeActionType);await Jt({sessionId:n,agentId:t,workspacePath:r.workingDirectory,command:r.command,startedAt:new Date().toISOString(),status:"running",runtimeStatus:p,mode:"sdk",pid:u,providerSessionId:s.getProviderSessionId(n)}),u&&await Ce().startProcess({agentId:t,sessionId:n,pid:u,mode:"sdk",workspacePath:r.workingDirectory,command:r.command}),await nr({agentId:t,sessionId:n,sdkPid:u,status:p,schedulerBaseUrl:d,runtimeAccessToken:c})}catch(u){M(n),f.delete(n),F(n),await K(n);const p=u instanceof Error?u.message:String(u);console.error(`[Runtime] Background SDK session startup failed for agentId=${t}: ${p}`),await rr({agentId:t,sessionId:n,schedulerBaseUrl:d,runtimeAccessToken:c,errorMessage:p})}finally{H.delete(t)}}async function nr(e){const{agentId:n,sessionId:t,sdkPid:r,status:s,schedulerBaseUrl:o,runtimeAccessToken:i}=e;if(!o||!i){l.debug(`[Runtime] notifyServerSessionReady skipped: missing schedulerBaseUrl or runtimeAccessToken for agentId=${n}`);return}const a=`${o.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Oe.post(a,{agentId:n,sessionId:t,status:s,pid:r},{headers:{"X-Runtime-Token":i,"Content-Type":"application/json"},timeout:5e3}),l.debug(`[Runtime] Notified server session ready: agentId=${n}, sessionId=${t}, status=${s}`)}catch(c){const d=c instanceof Error?c.message:String(c);l.warn(`[Runtime] Failed to notify server session ready: agentId=${n}, error=${d}`)}}async function rr(e){const{agentId:n,sessionId:t,schedulerBaseUrl:r,runtimeAccessToken:s}=e;if(!r||!s)return;const o=`${r.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Oe.post(o,{agentId:n,sessionId:t,status:"stopped"},{headers:{"X-Runtime-Token":s,"Content-Type":"application/json"},timeout:5e3}),l.debug(`[Runtime] Notified server session failed: agentId=${n}, sessionId=${t}`)}catch(i){const a=i instanceof Error?i.message:String(i);l.warn(`[Runtime] Failed to notify server session failed: agentId=${n}, error=${a}`)}}S.post("/sdk/message",y,async(e,n)=>{const{sessionId:t,message:r}=e.body||{};if(!t||!r){n.status(400).json({error:"sessionId and message are required"});return}const s=f.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const o=s.providerId||"claude-code";await h.get(o).sendMessage(t,r),n.json({ok:!0})}catch(o){const i=o instanceof Error?o.message:String(o);n.status(500).json({error:i})}}),S.post("/sdk/answer",y,async(e,n)=>{const{sessionId:t,answers:r}=e.body||{};if(!t||!r){n.status(400).json({error:"sessionId and answers are required"});return}const s=f.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const o=s.providerId||"claude-code",i=h.get(o);i.sendQuestionAnswer&&await i.sendQuestionAnswer(t,r),n.json({ok:!0})}catch(o){const i=o instanceof Error?o.message:String(o);n.status(500).json({error:i})}}),S.post("/tool-auth/answer",y,async(e,n)=>{const{sessionId:t,requestId:r,allowed:s}=e.body||{};if(!t||!r){n.status(400).json({error:"sessionId and requestId are required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const i=o.providerId||"claude-code",a=h.get(i);if(!a.submitToolPermissionDecision){n.status(400).json({error:"adapter does not support tool authorization"});return}const c=a.submitToolPermissionDecision(t,String(r),!!s);n.json({ok:!0,existed:c})}catch(i){const a=i instanceof Error?i.message:String(i);n.status(500).json({error:a})}}),S.get("/tool-auth/pending/:sessionId",y,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",i=h.get(s).getPendingToolAuthRequests?.(t)??[];n.json({ok:!0,sessionId:t,agentId:r.agentId,pendingRequests:i,fetchedAt:Date.now()})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),S.post("/sdk/confirm",y,async(e,n)=>{const{sessionId:t,accept:r}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const s=f.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const o=s.providerId||"claude-code";await h.get(o).sendConfirmation(t,!!r),n.json({ok:!0})}catch(o){const i=o instanceof Error?o.message:String(o);n.status(500).json({error:i})}}),S.post("/sdk/abort",y,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code";await h.get(s).abortCurrentTurn(t),n.json({ok:!0})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),S.post("/sdk/stop",y,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const r=f.get(t);if(!r){n.json({ok:!0,status:"stopped"});return}try{const s=r.providerId||"claude-code",o=h.get(s);o.abortCurrentTurn(t).catch(()=>{}),await o.terminateSession(t),M(t),f.delete(t),F(t),le(t),se(r.agentId),await K(t),await Ce().removeProcess(r.agentId),await $(r.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl}),n.json({ok:!0,status:"stopped"})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),S.get("/sdk/snapshot/:sessionId",y,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",o=h.get(s),i=o.getConversation(t),a=rn(i);let c=null;if(s==="acode"){const u=o;typeof u.exportRawTranscript!="function"?l.warn(`[HIBERNATE-EXPORT] adapter \u65E0 exportRawTranscript \u65B9\u6CD5 \u2014 bridge \u8FDB\u7A0B\u53EF\u80FD\u8FD0\u884C\u7684\u662F\u65E7\u6784\u5EFA\uFF08\u8BF7\u91CD\u542F bridge\uFF09\u3002providerId=${s}`):(c=u.exportRawTranscript?.(t)??null,c===null&&l.warn(`[HIBERNATE-EXPORT] exportRawTranscript \u8FD4\u56DE\u7A7A \u2014 runtime \u53EF\u80FD\u672A\u5B8C\u6210 start() \u6216\u4E0D\u652F\u6301\u3002providerId=${s}`))}else l.info(`[HIBERNATE-EXPORT] provider=${s} \u4E0D\u652F\u6301\u5B8C\u6574\u91CD\u653E\uFF0C\u6309\u4EC5\u6458\u8981\u4F11\u7720`);const d=o.getTotalUsage?.(t);l.info(`[HIBERNATE-EXPORT] \u5FEB\u7167\u5BFC\u51FA: sessionId=${t} agentId=${r.agentId} providerId=${s} messages=${i.length} summaryChars=${a.snapshot.length} truncated=${a.truncated} transcript=${c?`${c.length}\u6761`:"null"} usage=${d?`in=${d.inputTokens??"?"}/out=${d.outputTokens??"?"}`:"null"}`),n.json({sessionId:t,agentId:r.agentId,workspacePath:r.workspacePath,messageCount:i.length,truncated:a.truncated,snapshot:a.snapshot,transcript:c,tokenUsage:d?{inputTokens:d.inputTokens??null,outputTokens:d.outputTokens??null}:null,providerId:s})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),S.get("/sdk/status/:sessionId",y,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",o=h.get(s),i=o.getSessionStatus(t),a=o.getConversation(t);n.json({sessionId:t,status:i,agentId:r.agentId,workspacePath:r.workspacePath,messageCount:a.length})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),S.get("/sdk/capabilities/:sessionId",y,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",i=h.get(s).getCapabilities?.(t)??null;n.json({ok:!0,sessionId:t,agentId:r.agentId,capabilities:i,fetchedAt:Date.now()})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),S.get("/sdk/pending-questions/:sessionId",y,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",i=h.get(s).getPendingQuestion?.(t)??null;n.json({ok:!0,sessionId:t,agentId:r.agentId,pendingQuestion:i?{toolCallId:i.toolCallId,questions:i.questions}:null,fetchedAt:Date.now()})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),S.post("/command",y,async(e,n)=>{const{sessionId:t,command:r}=e.body||{};if(!t||r===void 0||r===null){n.status(400).json({error:"sessionId and command are required"});return}try{const s=await wn(String(t),r);n.json({ok:!0,mode:"terminal",...s})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}});function or(e,n){if(typeof e!="string"||!e||!n||typeof n!="object")return e;const{userId:t,name:r,type:s}=n,o=typeof t=="string"&&t.trim()?t.trim():"",i=typeof r=="string"&&r.trim()?r.trim():o;if(!o&&!i)return e;const a=typeof s=="string"&&s.trim()?s.trim().toUpperCase():"HUMAN",c=i||o,d=o?`, userId: ${o}`:"";return`\u3010${c}\uFF08${a}${d}\uFF09\u53D1\u6765\u3011
|
|
41
|
-
${e}`}
|
|
40
|
+
`):void 0}const x={command:s||"acode",workingDirectory:r,agentId:A,...Oe?{scopeKey:Oe}:{},...typeof Pe=="boolean"?{browserAllowPrivate:Pe}:{},autoAccept:!!i,initialPrompt:a,systemPrompt:Le,...be!==void 0?{globalPrompt:be}:{},...ke!==void 0?{rolePrompt:ke}:{},...ne!==void 0?{memory:ne}:{},...re!==void 0?{resumeContext:re}:{},...D==="acode"&&Array.isArray(z)&&z.length>0?{resumeTranscript:z}:{},model:Y,mcpConfigPath:_e,...X?{instanceAiConfig:X}:{},...typeof Ie=="string"&&Ie.trim()?{subAgentModel:Ie.trim()}:{},...typeof he=="string"&&he.trim()?{subAgentEffort:he.trim()}:{},extraMcpServers:E||{},envOverrides:dt(String(t),String(r),process.env,Te,typeof o=="string"?o:void 0)};G.log({level:"info",category:"launch",message:"\u4F20\u9012\u7ED9 Adapter \u7684\u5B8C\u6574 AdapterSessionConfig",source:"bridge",agentId:A,sessionId:w,details:{adapterModel:x.model??null,adapterInstanceAiConfig:x.instanceAiConfig?ce(x.instanceAiConfig):null,adapterMcpConfigPath:x.mcpConfigPath??null}}),await G.flush(),f.set(w,{agentId:A,workspacePath:r,sessionId:w,config:x,providerId:D,seq:0,runtimeAccessToken:Ae,schedulerBaseUrl:B}),n.json({sessionId:w,status:"starting",runtimeStatus:"starting",agentId:A,workspacePath:r,command:x.command,mode:"sdk"}),cr({sessionId:w,agentId:A,config:x,adapter:St,providerId:D,idleInputAutoCommand:L,nonInputAutoCommand:_,runtimeAccessToken:Ae,requestedSchedulerBaseUrl:B})}catch(j){if(w&&(M(w),f.delete(w),K(w)),A&&q.delete(A),!n.headersSent){const b=j instanceof Error?j.message:String(j);n.status(500).json({error:`Failed to start SDK session: ${b}`})}}}async function cr(e){const{sessionId:n,agentId:t,config:r,adapter:s,providerId:o,idleInputAutoCommand:i,nonInputAutoCommand:a,runtimeAccessToken:c,requestedSchedulerBaseUrl:u}=e;try{await s.startSession(n,r),s.setIdleCommands?.(n,{idleInputCommand:i||xe,nonInputCommand:a||""});let d;if(ln(o))try{if(await new Promise(p=>setTimeout(p,500)),d=s.getSessionPid?.(n),!d){const g=(await Ht()).find(k=>k.agentId===t||k.cwd===r.workingDirectory||k.command.includes(r.workingDirectory));g&&(d=g.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 m=Z(s.getSessionStatus(n),f.get(n)?.currentRuntimeStatus,f.get(n)?.currentRuntimeActionType);await Zt({sessionId:n,agentId:t,workspacePath:r.workingDirectory,command:r.command,startedAt:new Date().toISOString(),status:"running",runtimeStatus:m,mode:"sdk",pid:d,providerSessionId:s.getProviderSessionId(n)}),d&&await Ee().startProcess({agentId:t,sessionId:n,pid:d,mode:"sdk",workspacePath:r.workingDirectory,command:r.command}),await ur({agentId:t,sessionId:n,sdkPid:d,status:m,schedulerBaseUrl:u,runtimeAccessToken:c})}catch(d){M(n),f.delete(n),K(n),await H(n);const m=d instanceof Error?d.message:String(d);console.error(`[Runtime] Background SDK session startup failed for agentId=${t}: ${m}`),await dr({agentId:t,sessionId:n,schedulerBaseUrl:u,runtimeAccessToken:c,errorMessage:m})}finally{q.delete(t)}}async function ur(e){const{agentId:n,sessionId:t,sdkPid:r,status:s,schedulerBaseUrl:o,runtimeAccessToken:i}=e;if(!o||!i){l.debug(`[Runtime] notifyServerSessionReady skipped: missing schedulerBaseUrl or runtimeAccessToken for agentId=${n}`);return}const a=`${o.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Me.post(a,{agentId:n,sessionId:t,status:s,pid:r},{headers:{"X-Runtime-Token":i,"Content-Type":"application/json"},timeout:5e3}),l.debug(`[Runtime] Notified server session ready: agentId=${n}, sessionId=${t}, status=${s}`)}catch(c){const u=c instanceof Error?c.message:String(c);l.warn(`[Runtime] Failed to notify server session ready: agentId=${n}, error=${u}`)}}async function dr(e){const{agentId:n,sessionId:t,schedulerBaseUrl:r,runtimeAccessToken:s}=e;if(!r||!s)return;const o=`${r.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Me.post(o,{agentId:n,sessionId:t,status:"stopped"},{headers:{"X-Runtime-Token":s,"Content-Type":"application/json"},timeout:5e3}),l.debug(`[Runtime] Notified server session failed: agentId=${n}, sessionId=${t}`)}catch(i){const a=i instanceof Error?i.message:String(i);l.warn(`[Runtime] Failed to notify server session failed: agentId=${n}, error=${a}`)}}h.post("/sdk/message",I,async(e,n)=>{const{sessionId:t,message:r}=e.body||{};if(!t||!r){n.status(400).json({error:"sessionId and message are required"});return}const s=f.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const o=s.providerId||"claude-code";await T.get(o).sendMessage(t,r),n.json({ok:!0})}catch(o){const i=o instanceof Error?o.message:String(o);n.status(500).json({error:i})}}),h.post("/sdk/answer",I,async(e,n)=>{const{sessionId:t,answers:r,cancelled:s,reason:o}=e.body||{},i=s===!0;if(!t||!i&&!r){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=T.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(o||"").trim()}`),await u.cancelQuestionAnswer(t,typeof o=="string"?o:void 0)}else u.sendQuestionAnswer&&await u.sendQuestionAnswer(t,r);n.json({ok:!0})}catch(c){const u=c instanceof Error?c.message:String(c);n.status(500).json({error:u})}}),h.post("/tool-auth/answer",I,async(e,n)=>{const{sessionId:t,requestId:r,allowed:s}=e.body||{};if(!t||!r){n.status(400).json({error:"sessionId and requestId are required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const i=o.providerId||"claude-code",a=T.get(i);if(!a.submitToolPermissionDecision){n.status(400).json({error:"adapter does not support tool authorization"});return}const c=a.submitToolPermissionDecision(t,String(r),!!s);n.json({ok:!0,existed:c})}catch(i){const a=i instanceof Error?i.message:String(i);n.status(500).json({error:a})}}),h.get("/tool-auth/pending/:sessionId",I,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",i=T.get(s).getPendingToolAuthRequests?.(t)??[];n.json({ok:!0,sessionId:t,agentId:r.agentId,pendingRequests:i,fetchedAt:Date.now()})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),h.post("/sdk/confirm",I,async(e,n)=>{const{sessionId:t,accept:r}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const s=f.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const o=s.providerId||"claude-code";await T.get(o).sendConfirmation(t,!!r),n.json({ok:!0})}catch(o){const i=o instanceof Error?o.message:String(o);n.status(500).json({error:i})}}),h.post("/sdk/abort",I,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code";await T.get(s).abortCurrentTurn(t),n.json({ok:!0})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),h.post("/sdk/stop",I,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const r=f.get(t);if(!r){n.json({ok:!0,status:"stopped"});return}try{const s=r.providerId||"claude-code",o=T.get(s);o.abortCurrentTurn(t).catch(()=>{}),await o.terminateSession(t),M(t),f.delete(t),K(t),fe(t),ae(r.agentId),await H(t),await Ee().removeProcess(r.agentId),await $(r.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl}),n.json({ok:!0,status:"stopped"})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),h.get("/sdk/snapshot/:sessionId",I,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",o=T.get(s),i=o.getConversation(t),a=sn(i);let c=null;if(s==="acode"){const d=o;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=o.getTotalUsage?.(t);l.info(`[HIBERNATE-EXPORT] \u5FEB\u7167\u5BFC\u51FA: sessionId=${t} agentId=${r.agentId} providerId=${s} messages=${i.length} summaryChars=${a.snapshot.length} truncated=${a.truncated} transcript=${c?`${c.length}\u6761`:"null"} usage=${u?`in=${u.inputTokens??"?"}/out=${u.outputTokens??"?"}`:"null"}`),n.json({sessionId:t,agentId:r.agentId,workspacePath:r.workspacePath,messageCount:i.length,truncated:a.truncated,snapshot:a.snapshot,transcript:c,tokenUsage:u?{inputTokens:u.inputTokens??null,outputTokens:u.outputTokens??null}:null,providerId:s})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),h.get("/sdk/status/:sessionId",I,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",o=T.get(s),i=o.getSessionStatus(t),a=o.getConversation(t);n.json({sessionId:t,status:i,agentId:r.agentId,workspacePath:r.workspacePath,messageCount:a.length})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),h.get("/sdk/capabilities/:sessionId",I,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",i=T.get(s).getCapabilities?.(t)??null;n.json({ok:!0,sessionId:t,agentId:r.agentId,capabilities:i,fetchedAt:Date.now()})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),h.get("/sdk/pending-questions/:sessionId",I,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",i=T.get(s).getPendingQuestion?.(t)??null;n.json({ok:!0,sessionId:t,agentId:r.agentId,pendingQuestion:i?{toolCallId:i.toolCallId,questions:i.questions}:null,fetchedAt:Date.now()})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}}),h.post("/command",I,async(e,n)=>{const{sessionId:t,command:r}=e.body||{};if(!t||r===void 0||r===null){n.status(400).json({error:"sessionId and command are required"});return}try{const s=await Dn(String(t),r);n.json({ok:!0,mode:"terminal",...s})}catch(s){const o=s instanceof Error?s.message:String(s);n.status(500).json({error:o})}});function lr(e,n){if(typeof e!="string"||!e||!n||typeof n!="object")return e;const{userId:t,name:r,type:s}=n,o=typeof t=="string"&&t.trim()?t.trim():"",i=typeof r=="string"&&r.trim()?r.trim():o;if(!o&&!i)return e;const a=typeof s=="string"&&s.trim()?s.trim().toUpperCase():"HUMAN",c=i||o,u=o?`, userId: ${o}`:"";return`\u3010${c}\uFF08${a}${u}\uFF09\u53D1\u6765\u3011
|
|
41
|
+
${e}`}h.post("/input",I,async(e,n)=>{const{sessionId:t,input:r,mode:s,sender:o}=e.body||{};if(!t||r===void 0||r===null){n.status(400).json({error:"sessionId and input are required"});return}const i=f.get(t);if(!i){n.status(404).json({error:"SDK session not found"});return}try{const a=i.providerId||"claude-code",c=T.get(a);if(s==="shortcut"){if(!c.sendShortcutInput){n.status(400).json({error:"shortcut input is not supported by this SDK provider"});return}await c.sendShortcutInput(t,String(r)),n.json({ok:!0,mode:"shortcut"});return}await c.sendMessage(t,lr(await Pn(r),o)),n.json({ok:!0,mode:"sdk"})}catch(a){const c=a instanceof Error?a.message:String(a);n.status(500).json({error:c})}}),h.post("/update-auto-commands",I,async(e,n)=>{const{agentId:t,idleInputAutoCommand:r="",nonInputAutoCommand:s=""}=e.body||{},o=String(t||"").trim();if(!o){n.status(400).json({error:"agentId is required"});return}const i=[...f.values()].find(c=>c.agentId===o),a={idleInputCommand:String(r||"").trim()||xe,nonInputCommand:String(s||"")};try{let c=!1;i&&(T.get(i.providerId||"claude-code").setIdleCommands?.(i.sessionId,a),c=!0);const u=await Jt(o,{idleInputAutoCommand:a.idleInputCommand,nonInputAutoCommand:a.nonInputCommand});n.json({ok:!0,mode:"sdk",sessionUpdated:c,persistedUpdated:u})}catch(c){const u=c instanceof Error?c.message:String(c);n.status(500).json({ok:!1,mode:"sdk",error:u})}}),h.post("/resize",I,(e,n)=>{const{sessionId:t,cols:r,rows:s}=e.body||{};if(!t||!r||!s){n.status(400).json({error:"sessionId, cols, rows are required"});return}if(!f.has(t)){n.status(404).json({error:"SDK session not found"});return}n.json({ok:!0,mode:"sdk",noop:!0,cols:Number(r),rows:Number(s)})}),h.post("/reset-context",I,async(e,n)=>{const{sessionId:t,reason:r}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const s=f.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}const o=s.providerId||"claude-code",i=T.get(o),a=i.resetContext?.bind(i),c=dn(o,!!a);if(!c.supported){n.status(c.statusCode).json({error:c.error});return}if(!a){n.status(500).json({error:"ACode adapter does not expose resetContext"});return}try{await a(String(t));const u=Z(i.getSessionStatus(String(t)),s.currentRuntimeStatus,s.currentRuntimeActionType);n.json({ok:!0,contextReset:!0,sessionId:t,status:u,runtimeStatus:u,agentId:s.agentId,mode:"sdk",providerId:o,reason:typeof r=="string"&&r.trim()?r.trim():void 0})}catch(u){const d=u instanceof Error?u.message:String(u);n.status(500).json({ok:!1,contextReset:!1,mode:"sdk",error:d})}}),h.post("/compact-context",I,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({ok:!1,error:"sessionId is required"});return}const r=f.get(t);if(!r){n.status(404).json({ok:!1,error:"SDK session not found"});return}const s=r.providerId||"claude-code",o=T.get(s),i=o.compactContext?.bind(o);if(!i){n.status(400).json({ok:!1,error:`context compaction is not supported by provider: ${s}`});return}try{const a=i(String(t)),c=Z(o.getSessionStatus(String(t)),r.currentRuntimeStatus,r.currentRuntimeActionType);n.json({ok:!0,requested:!0,compacted:!0,sessionId:t,agentId:r.agentId,mode:"sdk",providerId:s,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})}}),h.post("/stop",I,async(e,n)=>{const{sessionId:t}=e.body||{},r=fn(e.body);if(!t){n.status(400).json({error:"sessionId is required"});return}const s=f.get(t);if(!s){await H(t),n.json({ok:!0,status:"stopped",mode:"none",statusNotified:!1,reason:r.reason});return}const o=s.agentId;try{l.info(`[Runtime] Stopping SDK session ${t}; suppressStatus=${!r.statusNotified}, reason=${r.reason||"unspecified"}`);const i=s.providerId||"claude-code",a=T.get(i);a.abortCurrentTurn(t).catch(()=>{}),await a.terminateSession(t),M(t),f.delete(t),K(t),fe(t),ae(o),await H(t),await Ee().removeProcess(o),r.statusNotified?await $(o,null,"stopped",void 0,void 0,{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl}):l.info(`[Runtime] Stopped status notification suppressed for SDK session ${t}; reason=${r.reason||"unspecified"}`),n.json({ok:!0,status:"stopped",mode:"sdk",statusNotified:r.statusNotified,reason:r.reason})}catch(i){const a=i instanceof Error?i.message:String(i);console.error(`[Runtime] Failed to terminate SDK session ${t}:`,a),n.status(500).json({ok:!1,status:"stop_failed",mode:"sdk",error:a})}}),h.post("/stop-all",I,async(e,n)=>{const t=[],r=[];for(const[s,o]of f.entries())try{const i=o.providerId||"claude-code",a=T.get(i);a.abortCurrentTurn(s).catch(()=>{}),await a.terminateSession(s),M(s),f.delete(s),K(s),fe(s),ae(o.agentId),t.push(s),await $(o.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})}catch(i){const a=i instanceof Error?i.message:String(i);r.push(`SDK ${s}: ${a}`)}try{await Vt([]),l.info("[Runtime] \u5DF2\u6E05\u7A7A\u6240\u6709\u6301\u4E45\u5316\u4F1A\u8BDD")}catch(s){const o=s instanceof Error?s.message:String(s);r.push(`Persistence: ${o}`)}n.json({ok:!0,stopped:{sdk:t.length},errors:r.length>0?r:void 0})}),h.get("/events/last/:n",I,(e,n)=>{const t=parseInt(e.params.n,10);if(!Number.isFinite(t)||t<1){n.status(400).json({error:":n must be a positive integer"});return}const r=Je.getLastN(t);n.json({ok:!0,count:r.length,entries:r})}),h.get("/events/since/:index",I,(e,n)=>{const t=parseInt(e.params.index,10);if(!Number.isFinite(t)||t<0){n.status(400).json({error:":index must be a non-negative integer"});return}const r=Je.getSinceIndex(t);n.json({ok:!0,entries:r.entries,nextIndex:r.nextIndex,oldestIndex:r.oldestIndex,dataLoss:r.oldestIndex>t+1})}),h.get("/events/push-stats",I,(e,n)=>{const t=Dt();n.json({ok:!0,count:t.length,agents:t})});export{Sn as buildAcodeCommandOutputPath,lt as buildClaudeCodeLaunchConfig,dt as buildRuntimeEnv,jn as buildSdkOutputMetadata,Nn as buildToolResultTimelineActionInfo,Hr as cleanupSdkSessionByAgentId,In as countTerminalOutputLines,ct as createTerminalOutputDecoder,le as decodeTerminalOutputChunk,rr as enqueueCompactionSummaryChunk,wn as evaluatePersistedSessionReuse,De as flushCompactionSummaryAccumulator,An as formatCommandInactivityTimeoutNotice,hn as formatCommandOutputSpilloverNotice,Bn as formatSdkOutputEvent,we as formatTerminalPrompt,pn as isIdleStatusChangeRetryable,gn as isUsageOnlyStatusChange,Tn as normalizeTerminalCommandInput,cn as parseResumeTranscript,fn as parseRuntimeStopOptions,kn as parseTerminalDirectoryChangeTarget,ge as raceSendOutputWithRetry,sn as renderSessionSnapshot,dn as resolveRuntimeContextResetSupport,Vn as resolveRuntimeStatusFromProviderEvent,Pn as resolveSdkInputMessage,gt as resolveSdkProviderId,Z as resolveSdkSessionDisplayStatus,mn as resolveStatusChangeRuntimeState,V as resolveStatusChangeUsage,_n as resolveTerminalOutputEncoding,f as sdkSessions,ln as shouldProbeSdkProcessPid,h as terminalRouter,lr as withSenderSignature};
|
|
42
42
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import h from"axios";import{resolveSchedulerBaseUrlFrom as H}from"../config.js";import{requestRuntimeAccessTokenRefreshForServer as
|
|
2
|
-
${r.slice(-E)}`:r,a={category:"output",agentId:t,sessionId:c,output:n,seq:e,sourceEventType:i?.sourceEventType,logLevel:i?.logLevel,logCategory:i?.logCategory};B.appendOrMerge(a,p=>{const l=p.data;if(l.category!=="output"||l.sessionId!==c||l.sourceEventType!==i?.sourceEventType||Date.now()-p.timestamp>1e4)return!1;const d=(l.output||"").length,T=(a.output||"").length;return d+T<=E},(p,l)=>{const d=p.output||"",T=l.output||"";return d.includes(T)?p:{...p,output:`${d}${T}`}});const k=S.appendOrMergeOutput(t,a);$(t,k,o)}}async function V(t,r,c,e,i){const o=y(e),u={agentId:t,sessionId:r,questions:c,...i?{toolCallId:i}:{}};try{const s=m(e,o);if(!s)return;await h.post(`${o}/api/runtime/callback/question`,u,{headers:s})}catch(s){if(w(s)===401&&await R(o)){const a=m(x(e),o);if(a)try{await h.post(`${o}/api/runtime/callback/question`,u,{headers:a});return}catch{}}}finally{const s={category:"question",agentId:t,sessionId:r,...i?{toolCallId:i}:{},questions:c};B.append(s);const n=S.append(t,s);$(t,n,e)}}async function Y(t,r,c,e){const i=y(e),o={agentId:t,sessionId:r,...c};try{const u=m(e,i);if(!u)return;await h.post(`${i}/api/runtime/callback/tool-auth`,o,{headers:u})}catch(u){if(w(u)===401&&await R(i)){const n=m(x(e),i);if(n)try{await h.post(`${i}/api/runtime/callback/tool-auth`,o,{headers:n});return}catch{}}}}async function Z(t){const r=y();try{const c=m(void 0,r);if(!c)return;await h.post(`${r}/api/runtime/callback/file-changed`,t,{headers:c})}catch(c){if(w(c)===401&&await R(r)){const i=m(void 0,r);if(i)try{await h.post(`${r}/api/runtime/callback/file-changed`,t,{headers:i});return}catch{}}}finally{const c={category:"file_changed",agentId:"",sessionId:null,workspacePath:t.workspacePath,filePath:t.filePath,eventType:t.eventType,size:t.size};B.append(c)}}function I(t,r){const c=U.get(t);if(!c||!r)return;const e=`${c.outputBuffer}${r}`;if(e.length<=M){c.outputBuffer=e;return}const o=`\r
|
|
1
|
+
import h from"axios";import{resolveSchedulerBaseUrlFrom as H}from"../config.js";import{requestRuntimeAccessTokenRefreshForServer as P}from"../services/auto-register.js";import{logger as f}from"../utils/logger.js";import{agentEventStore as S}from"./agent-event-store.js";import{scheduleEventPush as $}from"./event-delta-pusher.js";import{RingBuffer as C}from"./ring-buffer.js";import{getRuntimeAccessToken as _}from"./runtime-binding.js";const B=new C(2e3);function m(t,r=y(t)){const c=t?.runtimeAccessToken||_(r)||_();return c?{"X-Runtime-Token":c}:void 0}function x(t){if(t)return{schedulerBaseUrl:t.schedulerBaseUrl}}function y(t){return H(t?.schedulerBaseUrl).url}const O=100;function w(t){if(typeof t!="object"||t===null)return;const r=t.response;if(typeof r!="object"||r===null)return;const c=r.status;return typeof c=="number"?c:void 0}let L=null;async function R(t){if(L)return L;L=(async()=>{try{const r=await P(t);return r.success&&r.runtimeAccessToken?(f.info("[session-output] Runtime token refreshed after 401"),!0):(f.warn("[session-output] Runtime token refresh failed",{error:r.error}),!1)}catch(r){return f.warn("[session-output] Runtime token refresh threw",{error:r}),!1}})();try{return await L}finally{L=null}}const E=8e3,M=64*1024,g=32*1024,A=15e3,U=new Map;async function J(t,r,c,e,i,o,u,s){const n={agentId:t,sessionId:r,status:c};u!==void 0&&(n.timestamp=u),e&&(e.actionType&&(n.actionType=e.actionType),e.actionLabel&&(n.actionLabel=e.actionLabel),e.actionDetail&&(n.actionDetail=e.actionDetail),e.actionInput&&(n.actionInput=e.actionInput),e.actionResult&&(n.actionResult=e.actionResult),e.actionError&&(n.actionError=e.actionError),e.actionId&&(n.actionId=e.actionId),e.parentId&&(n.parentId=e.parentId),e.batchId&&(n.batchId=e.batchId),e.batchMetrics&&(n.batchMetrics=e.batchMetrics)),i&&(n.inputTokens=i.inputTokens,n.outputTokens=i.outputTokens,i.contextLimit&&(n.contextLimit=i.contextLimit),i.maxOutput&&(n.maxOutput=i.maxOutput),i.inputLimit&&(n.inputLimit=i.inputLimit),i.compactionThreshold&&(n.compactionThreshold=i.compactionThreshold),i.cacheHitTokens!==void 0&&(n.cacheHitTokens=i.cacheHitTokens),i.cacheMissTokens!==void 0&&(n.cacheMissTokens=i.cacheMissTokens)),s&&(n.sourceEventType=s),process.env.ACODE_TOKEN_DEBUG==="1"&&(n.inputTokens!==void 0||n.outputTokens!==void 0||n.cacheHitTokens!==void 0||n.cacheMissTokens!==void 0)&&console.log(`[TokenDebug][SendStatus] status=${c} inputTokens=${n.inputTokens??"(none)"} outputTokens=${n.outputTokens??"(none)"} cacheHitTokens=${n.cacheHitTokens??"(none)"} cacheMissTokens=${n.cacheMissTokens??"(none)"} contextLimit=${n.contextLimit??"(none)"} actionType=${n.actionType??"(none)"}`);const a=y(o),k=m(o,a);if(!k){f.warn("Skip runtime status callback because runtime token is missing",{agentId:t,sessionId:r,status:c,schedulerBaseUrl:a});return}const p=e?.actionType==="context_compaction";p&&f.info("[compaction-diag] sendStatus enter",{agentId:t,sessionId:r,status:c,actionId:e?.actionId,parentId:e?.parentId,actionLabel:e?.actionLabel});try{const l=await h.post(`${a}/api/runtime/callback/status`,n,{headers:k,timeout:15e3});if(p){const d=l?.data;f.info("[compaction-diag] sendStatus success",{agentId:t,actionId:e?.actionId,actionLabel:e?.actionLabel,httpStatus:l?.status,ignored:d?.ignored,responseBody:d})}return l}catch(l){if(w(l)===401&&await R(a)){const T=m(x(o),a);if(T)try{const b=await h.post(`${a}/api/runtime/callback/status`,n,{headers:T,timeout:15e3});if(p){const v=b?.data;f.info("[compaction-diag] sendStatus retry success",{agentId:t,actionId:e?.actionId,actionLabel:e?.actionLabel,httpStatus:b?.status,ignored:v?.ignored})}return b}catch(b){f.warn("Runtime status callback retry failed after token refresh",{agentId:t,sessionId:r,status:c,error:b});return}}f.warn("Runtime status callback failed",{agentId:t,sessionId:r,status:c,schedulerBaseUrl:a,error:l});return}finally{const l={category:"status",agentId:t,sessionId:r,status:c,actionType:e?.actionType,actionLabel:e?.actionLabel,actionDetail:e?.actionDetail,actionInput:e?.actionInput,actionResult:e?.actionResult,actionError:e?.actionError,actionId:e?.actionId,parentId:e?.parentId,batchId:e?.batchId,batchMetrics:e?.batchMetrics,inputTokens:i?.inputTokens,outputTokens:i?.outputTokens,cacheHitTokens:i?.cacheHitTokens,cacheMissTokens:i?.cacheMissTokens,sourceEventType:s};B.append(l);const d=S.append(t,l);$(t,d,o)}}async function D(t,r,c,e,i,o,u){const s=y(o);try{const n=m(o,s);if(!n){f.warn("Skip runtime output callback because runtime token is missing",{agentId:t,sessionId:c,schedulerBaseUrl:s});return}const a={headers:n,timeout:A};u&&(a.signal=u),await h.post(`${s}/api/runtime/callback/output`,{agentId:t,output:r,sessionId:c,seq:e,...i},a)}catch(n){if(u?.aborted||n?.name==="AbortError"||n?.code==="ERR_CANCELED")throw n;if(w(n)===401&&await R(s)){const k=m(x(o),s);if(k)try{const p={headers:k,timeout:A};u&&(p.signal=u),await h.post(`${s}/api/runtime/callback/output`,{agentId:t,output:r,sessionId:c,seq:e,...i},p);return}catch{}}throw f.warn("Runtime output callback failed",{agentId:t,sessionId:c,error:n}),n}finally{if(!i?.skipLocalPersist){const n=r.length>E?`...(truncated)
|
|
2
|
+
${r.slice(-E)}`:r,a={category:"output",agentId:t,sessionId:c,output:n,seq:e,sourceEventType:i?.sourceEventType,logLevel:i?.logLevel,logCategory:i?.logCategory};B.appendOrMerge(a,p=>{const l=p.data;if(l.category!=="output"||l.sessionId!==c||l.sourceEventType!==i?.sourceEventType||Date.now()-p.timestamp>1e4)return!1;const d=(l.output||"").length,T=(a.output||"").length;return d+T<=E},(p,l)=>{const d=p.output||"",T=l.output||"";return d.includes(T)?p:{...p,output:`${d}${T}`}});const k=S.appendOrMergeOutput(t,a);$(t,k,o)}}}async function V(t,r,c,e,i){const o=y(e),u={agentId:t,sessionId:r,questions:c,...i?{toolCallId:i}:{}};try{const s=m(e,o);if(!s)return;await h.post(`${o}/api/runtime/callback/question`,u,{headers:s})}catch(s){if(w(s)===401&&await R(o)){const a=m(x(e),o);if(a)try{await h.post(`${o}/api/runtime/callback/question`,u,{headers:a});return}catch{}}}finally{const s={category:"question",agentId:t,sessionId:r,...i?{toolCallId:i}:{},questions:c};B.append(s);const n=S.append(t,s);$(t,n,e)}}async function Y(t,r,c,e){const i=y(e),o={agentId:t,sessionId:r,...c};try{const u=m(e,i);if(!u)return;await h.post(`${i}/api/runtime/callback/tool-auth`,o,{headers:u})}catch(u){if(w(u)===401&&await R(i)){const n=m(x(e),i);if(n)try{await h.post(`${i}/api/runtime/callback/tool-auth`,o,{headers:n});return}catch{}}}}async function Z(t){const r=y();try{const c=m(void 0,r);if(!c)return;await h.post(`${r}/api/runtime/callback/file-changed`,t,{headers:c})}catch(c){if(w(c)===401&&await R(r)){const i=m(void 0,r);if(i)try{await h.post(`${r}/api/runtime/callback/file-changed`,t,{headers:i});return}catch{}}}finally{const c={category:"file_changed",agentId:"",sessionId:null,workspacePath:t.workspacePath,filePath:t.filePath,eventType:t.eventType,size:t.size};B.append(c)}}function I(t,r){const c=U.get(t);if(!c||!r)return;const e=`${c.outputBuffer}${r}`;if(e.length<=M){c.outputBuffer=e;return}const o=`\r
|
|
3
3
|
[AgentsWorkStudio: omitted ${e.length-M} chars of old terminal output]\r
|
|
4
4
|
`,u=Math.max(0,M-o.length);c.outputBuffer=`${o}${e.slice(-u)}`}function F(t){const r=U.get(t);r&&(r.flushTimer||(r.flushTimer=setTimeout(()=>{r.flushTimer=null,q(t).catch(()=>{})},O)))}async function q(t){const r=U.get(t);if(!r||r.flushInFlight||!r.outputBuffer)return;const c=r.outputBuffer.slice(0,g);r.outputBuffer=r.outputBuffer.slice(g);const e=(async()=>{const i=r.seq+1;r.seq=i,await D(r.agentId,c,t,i),U.get(t)?.outputBuffer&&F(t)})();r.flushInFlight=e;try{await e}finally{const i=U.get(t);i&&(i.flushInFlight=null)}}export{I as appendSessionOutput,B as bridgeEventBuffer,q as flushSessionOutput,F as scheduleOutputFlush,Z as sendFileChanged,D as sendOutput,V as sendQuestionRequest,J as sendStatus,Y as sendToolAuthRequest,U as sessions};
|
|
5
5
|
|
|
@@ -4,8 +4,16 @@ export interface AcodeAskUserQuestionDeps {
|
|
|
4
4
|
|
|
5
5
|
onQuestion(toolCallId: string, questions: AcodeQuestionItem[]): void;
|
|
6
6
|
|
|
7
|
-
waitForAnswer(toolCallId: string, contextVersion: number): Promise<
|
|
7
|
+
waitForAnswer(toolCallId: string, contextVersion: number): Promise<AcodeQuestionAnswerOutcome>;
|
|
8
8
|
}
|
|
9
|
+
|
|
10
|
+
export type AcodeQuestionAnswerOutcome = {
|
|
11
|
+
answers: Record<string, string>;
|
|
12
|
+
cancelled?: false;
|
|
13
|
+
} | {
|
|
14
|
+
cancelled: true;
|
|
15
|
+
reason?: string;
|
|
16
|
+
};
|
|
9
17
|
export interface AcodeQuestionOption {
|
|
10
18
|
label: string;
|
|
11
19
|
description?: string;
|
|
@@ -22,6 +30,8 @@ export interface AcodeAskUserQuestionResult {
|
|
|
22
30
|
tool: "ask_user_question";
|
|
23
31
|
answers: Record<string, string>;
|
|
24
32
|
summary: string;
|
|
33
|
+
cancelled?: boolean;
|
|
34
|
+
reason?: string;
|
|
25
35
|
}
|
|
26
36
|
|
|
27
37
|
export declare const ASK_USER_QUESTION_TOOL_NAME = "ask_user_question";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const
|
|
2
|
-
`);function
|
|
3
|
-
`)}function
|
|
1
|
+
const u="ask_user_question",f=["\u5411\u7528\u6237\u63D0\u51FA\u95EE\u9898\uFF0C\u6536\u96C6\u66F4\u591A\u4FE1\u606F\u4E3A\u505A\u51B3\u7B56\u63D0\u4F9B\u66F4\u591A\u7684\u65B9\u5411\u9009\u62E9\uFF0C\u6BCF\u4E2A\u95EE\u9898\u4F1A\u81EA\u52A8\u8FFD\u52A0\u201C\u5176\u5B83\u201D\u9009\u9879\u4F9B\u7528\u6237\u81EA\u5B9A\u4E49\u8F93\u5165\u3002","\u591A\u4E2A\u95EE\u9898\u65F6\u4E0D\u5F97\u4F9D\u8D56\u524D\u9762\u95EE\u9898\u7684\u7B54\u6848\uFF0C\u82E5\u67D0\u95EE\u9898\u4F9D\u8D56\u53E6\u4E00\u95EE\u9898\u7684\u7B54\u6848\uFF0C\u5E94\u62C6\u6210\u591A\u8F6E\u5206\u522B\u8C03\u7528\u672C\u5DE5\u5177\u3002","\u63D0\u4EA4\u540E\u8FDB\u5165\u7528\u6237\u5BA1\u6279\uFF0C\u5BA1\u6279\u901A\u8FC7\u7684\u9879\u4F1A\u76F4\u63A5\u521B\u5EFA\uFF08\u7ED3\u679C\u968F\u5DE5\u5177\u8FD4\u56DE\uFF09\u3002","\u5982\u679C\u63A8\u8350\u67D0\u4E2A\u9009\u9879\uFF0C\u628A\u5B83\u653E\u5728\u7B2C\u4E00\u4F4D\u5E76\u5728 label \u672B\u5C3E\u52A0\u201C\uFF08\u63A8\u8350\uFF09\u201D\u3002"].join(`
|
|
2
|
+
`);function q(t,o){return{kind:"builtin",toolName:u,exposedName:u,concurrencyMode:"blocking",description:f,inputSchema:d(),async execute(n,e){const r=e?.toolCallId;if(!r)return{ok:!1,tool:u,error:"missing toolCallId in execution context"};const s=b(n.questions);if(s.length===0)return{ok:!1,tool:u,error:"questions must be a non-empty array"};t.onQuestion(r,s);const c=o();let i;try{i=await t.waitForAnswer(r,c)}catch(a){const m=a instanceof Error?a.message:String(a);return{ok:!1,tool:u,error:m}}if(i.cancelled){const a=i.reason?.trim();return{ok:!0,tool:u,answers:{},summary:y(a),cancelled:!0,...a?{reason:a}:{}}}const l=i.answers,p=h(s,l);return{ok:!0,tool:u,answers:l,summary:p}}}}function y(t){return t?`\u7528\u6237\u53D6\u6D88\u4E86\u672C\u6B21\u4F5C\u7B54\u3002\u539F\u56E0\uFF1A${t}`:"\u7528\u6237\u53D6\u6D88\u4E86\u672C\u6B21\u4F5C\u7B54\uFF0C\u672A\u63D0\u4F9B\u539F\u56E0\u3002"}function d(){return{type:"object",properties:{questions:{type:"array",description:"\u8981\u63D0\u95EE\u7684\u95EE\u9898\u5217\u8868\uFF08\u81F3\u5C11 1 \u4E2A\uFF0C\u6570\u91CF\u4E0D\u8BBE\u4E0A\u9650\uFF09\uFF1B\u591A\u4E2A\u95EE\u9898\u65F6\u5FC5\u987B\u76F8\u4E92\u72EC\u7ACB\u3001\u5E76\u5217\u63D0\u95EE\uFF0C\u540E\u7EED\u95EE\u9898\u4E0D\u5F97\u4F9D\u8D56\u524D\u9762\u95EE\u9898\u7684\u7B54\u6848\uFF0C\u6709\u4F9D\u8D56\u5173\u7CFB\u65F6\u5E94\u62C6\u6210\u591A\u6B21\u8C03\u7528",minItems:1,items:{type:"object",properties:{question:{type:"string",description:"\u5B8C\u6574\u95EE\u9898\u6587\u672C\uFF0C\u5EFA\u8BAE\u4EE5\u95EE\u53F7\u7ED3\u5C3E"},header:{type:"string",description:"\u226412 \u5B57\u7B26\u7684\u7B80\u77ED\u6807\u7B7E\uFF0C\u7528\u4E8E UI chip \u663E\u793A"},options:{type:"array",description:"2-4 \u4E2A\u4E92\u65A5\u9009\u9879\uFF08multiSelect=true \u65F6\u53EF\u4E0D\u4E92\u65A5\uFF09",minItems:2,maxItems:4,items:{type:"object",properties:{label:{type:"string",description:"1-5 \u8BCD\u7684\u7B80\u77ED\u6807\u7B7E"},description:{type:"string",description:"\u9009\u9879\u542B\u4E49\u6216\u6743\u8861\u8BF4\u660E"},requiresCustomInput:{type:"boolean",description:"\u9009\u4E2D\u6B64\u9879\u65F6 UI \u663E\u793A\u81EA\u5B9A\u4E49\u8F93\u5165\u6846"}},required:["label"]}},multiple:{type:"boolean",description:"\u662F\u5426\u5141\u8BB8\u591A\u9009\uFF1B\u9ED8\u8BA4 false"}},required:["question","options"]}},custom:{type:"boolean",description:"\u662F\u5426\u5141\u8BB8\u7528\u6237\u8865\u5145\u81EA\u5B9A\u4E49\u8F93\u5165\uFF1B\u9ED8\u8BA4 true"}},required:["questions"]}}function b(t){if(!Array.isArray(t)||t.length===0)return[];const o=[];for(const n of t){if(!n||typeof n!="object")continue;const e=n,r=typeof e.question=="string"?e.question.trim():"";if(!r)continue;const s=g(e.options);if(s.length<2)continue;const c=typeof e.header=="string"&&e.header.trim()?e.header.trim():void 0,i=e.multiple===!0||e.multiSelect===!0;o.push({question:r,header:c,options:s,multiple:i})}return o}function g(t){if(!Array.isArray(t))return[];const o=[];for(const n of t){if(typeof n=="string"){const i=n.trim();i&&o.push({label:i});continue}if(!n||typeof n!="object")continue;const e=n,r=typeof e.label=="string"?e.label.trim():typeof e.value=="string"?e.value.trim():typeof e.text=="string"?e.text.trim():"";if(!r)continue;const s=typeof e.description=="string"&&e.description.trim()?e.description.trim():void 0,c=e.requiresCustomInput===!0||e.requireCustomInput===!0||e.allowCustomInput===!0;if(o.push({label:r,...s?{description:s}:{},...c?{requiresCustomInput:c}:{}}),o.length>=4)break}return o}function h(t,o){const n=["\u7528\u6237\u5DF2\u56DE\u7B54\u4E86\u60A8\u7684\u95EE\u9898\uFF1A"];return t.forEach((e,r)=>{const s=String(r),c=o[s]||(e.header?o[e.header]:"")||o[e.question]||"\uFF08\u672A\u586B\u5199\uFF09",i=e.header||e.question;n.push(`\u2022 ${i}\uFF1A${c}`)}),n.join(`
|
|
3
|
+
`)}function j(t){if(!t||typeof t!="object")return!1;const o=t;return o.ok===!0&&o.tool===u&&typeof o.answers=="object"&&o.answers!==null&&typeof o.summary=="string"&&(o.cancelled===void 0||typeof o.cancelled=="boolean")}function x(t){const o={ok:!0,tool:u,answers:I(t.answers),summary:t.summary,...t.cancelled?{cancelled:!0}:{},...t.reason?{reason:t.reason}:{}};return JSON.stringify(o)}function I(t){const o={};for(const[n,e]of Object.entries(t))o[n]=e;return o}export{u as ASK_USER_QUESTION_TOOL_NAME,q as createAskUserQuestionTool,j as isAskUserQuestionResult,x as serializeAskUserQuestionResult};
|
|
4
4
|
|