aws-runtime-bridge 1.9.186 → 1.9.189
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 +1767 -1673
- package/README.md +256 -256
- package/dist/adapter/AcodeSdkAdapter.js +3 -3
- package/dist/browser/browser-pool.d.ts +2 -0
- package/dist/browser/browser-pool.js +1 -1
- package/dist/config.d.ts +12 -0
- package/dist/config.js +2 -2
- package/dist/index.js +1 -1
- package/dist/remote-desktop/win32-api.js +1 -1
- package/dist/routes/background-tasks.js +4 -4
- package/dist/routes/dashboard.js +17 -17
- package/dist/routes/terminal.js +19 -19
- package/dist/services/acode-bg-manager.js +1 -1
- package/dist/services/auto-register.js +1 -1
- package/dist/services/instance-features.d.ts +9 -0
- package/dist/services/instance-features.js +1 -1
- package/dist/services/panel-auth.d.ts +4 -0
- package/dist/services/panel-auth.js +1 -1
- package/dist/services/plugin-handler-adapter.js +2 -2
- package/dist/services/workspace-files.js +1 -1
- package/dist/utils/dynamic-import.d.ts +31 -0
- package/dist/utils/dynamic-import.js +2 -0
- package/dist/utils/sdk-package-loader.js +1 -1
- package/node_modules/playwright/cli.js +0 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_beta_linux.sh +0 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_beta_mac.sh +0 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_stable_linux.sh +0 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_stable_mac.sh +0 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_beta_linux.sh +0 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_beta_mac.sh +0 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_dev_linux.sh +0 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_dev_mac.sh +0 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_stable_linux.sh +0 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_stable_mac.sh +0 -0
- package/node_modules/playwright-core/cli.js +0 -0
- package/node_modules/playwright-core/lib/webp_codec.wasm +0 -0
- package/node_modules/playwright-core/lib/xdg-open +0 -0
- package/package/acode/dist/await-complete-tool.js +3 -3
- package/package/acode/dist/runtime.d.ts +9 -0
- package/package/acode/dist/runtime.js +20 -21
- package/package/acode/dist/sub-agent-manager.d.ts +33 -0
- package/package/acode/dist/sub-agent-manager.js +9 -1
- package/package/acode/dist/sub-agent-tools.d.ts +4 -0
- package/package/acode/dist/sub-agent-tools.js +27 -12
- package/package/acode/dist/subagent-handback.d.ts +16 -0
- package/package/acode/dist/subagent-handback.js +7 -0
- package/package/acode/dist/tool-allocation.js +1 -1
- package/package/acode/package.json +38 -38
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +10 -5
- package/package/aws-client-agent-mcp/dist/agent-client.js +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +27 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.js +16 -16
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +19 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +35 -19
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +10 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.js +1 -1
- package/package/aws-client-agent-mcp/dist/tool-groups.js +2 -2
- package/package/aws-client-agent-mcp/dist/types.d.ts +81 -3
- package/package/aws-client-agent-mcp/package.json +53 -53
- package/package.json +134 -132
- /package/package/acode/dist/grammars/{grammars/tree-sitter-bash.wasm → tree-sitter-bash.wasm} +0 -0
- /package/package/acode/dist/grammars/{grammars/tree-sitter-c-sharp.wasm → tree-sitter-c-sharp.wasm} +0 -0
- /package/package/acode/dist/grammars/{grammars/tree-sitter-c.wasm → tree-sitter-c.wasm} +0 -0
- /package/package/acode/dist/grammars/{grammars/tree-sitter-cpp.wasm → tree-sitter-cpp.wasm} +0 -0
- /package/package/acode/dist/grammars/{grammars/tree-sitter-go.wasm → tree-sitter-go.wasm} +0 -0
- /package/package/acode/dist/grammars/{grammars/tree-sitter-java.wasm → tree-sitter-java.wasm} +0 -0
- /package/package/acode/dist/grammars/{grammars/tree-sitter-javascript.wasm → tree-sitter-javascript.wasm} +0 -0
- /package/package/acode/dist/grammars/{grammars/tree-sitter-jsx.wasm → tree-sitter-jsx.wasm} +0 -0
- /package/package/acode/dist/grammars/{grammars/tree-sitter-lua.wasm → tree-sitter-lua.wasm} +0 -0
- /package/package/acode/dist/grammars/{grammars/tree-sitter-php.wasm → tree-sitter-php.wasm} +0 -0
- /package/package/acode/dist/grammars/{grammars/tree-sitter-python.wasm → tree-sitter-python.wasm} +0 -0
- /package/package/acode/dist/grammars/{grammars/tree-sitter-ruby.wasm → tree-sitter-ruby.wasm} +0 -0
- /package/package/acode/dist/grammars/{grammars/tree-sitter-rust.wasm → tree-sitter-rust.wasm} +0 -0
- /package/package/acode/dist/grammars/{grammars/tree-sitter-tsx.wasm → tree-sitter-tsx.wasm} +0 -0
- /package/package/acode/dist/grammars/{grammars/tree-sitter-typescript.wasm → tree-sitter-typescript.wasm} +0 -0
package/dist/routes/terminal.js
CHANGED
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
import{spawn as
|
|
2
|
-
`);if(r.length<=
|
|
1
|
+
import{spawn as Rt}from"node:child_process";import{promises as ue}from"node:fs";import $t from"node:os";import de from"node:path";import{TextDecoder as le}from"node:util";import{buildResumeContextBlock as He,deleteJournal as wt,readJournal as Ot}from"@agentswork/acode";import Ke from"axios";import{Router as Dt}from"express";import{v4 as Mt}from"uuid";import{adapterRegistry as _,getToolActionInfo as Me,isTransientClipboardPasteFilePath as ze,redactTransientClipboardPastePaths as W,registerSdkProviders as Lt,resolveSdkProviderIdByCommand as Pt}from"../adapter/index.js";import{MESSAGE_POLLING_IDLE_PROMPT as We}from"../adapter/prompts.js";import{getActiveBridgeHttpPort as Ut,getAcodeDataHome as qe}from"../config.js";import{validateToken as h}from"../middleware/auth.js";import{registerAgentOwner as xt}from"../services/agent-ownership.js";import{getAgentProcessManager as Le}from"../services/agent-process-manager.js";import{loadAgentStartupMemories as Nt}from"../services/agent-startup-memory.js";import{resolveSchedulerBaseUrlFromToken as Ye}from"../services/auto-register.js";import{setChangeCacheRetentionDays as jt}from"../services/change-cache-retention.js";import{clearDebugMounts as fe}from"../services/debug-mount.js";import{getAllPushStats as Bt,startHeartbeatScheduler as Ft}from"../services/event-delta-pusher.js";import{sweepExpiredSnapshots as vt}from"../services/fileSnapshotStore.js";import{prepareAcodeInstanceConfig as Ht,redactForLog as pe}from"../services/instance-ai-config-service.js";import{setAgentFeatures as Kt,setAgentCapabilities as zt,setAgentInheritedFeatures as Wt,setAgentCapabilitiesInherited as qt,getAgentFeatures as Yt,getAgentInheritedFeatures as Gt,getFeatureState as S,LAUNCH_ITEM_FEATURE_KEY as Ge,HIRE_FEATURE_KEY as Ve,PENCIL_FEATURE_KEY as Je,DRAW_FEATURE_KEY as Xe,OFFICE_FEATURE_KEY as Qe,COLLABORATION_TASK_FEATURE_KEY as Ze,COLLABORATION_MEETING_FEATURE_KEY as et,COLLABORATION_DEBUG_FEATURE_KEY as tt,COLLABORATION_FILE_HISTORY_FEATURE_KEY as nt,COLLABORATION_VOICE_FEATURE_KEY as ot,EMAIL_FEATURE_KEY as rt,SKILL_INSTALL_FEATURE_KEY as st,ABILITY_DEV_FEATURE_KEY as it}from"../services/instance-features.js";import{setLogRetentionDays as Vt}from"../services/log-retention.js";import{enqueueMcpLaunchBinding as Jt}from"../services/mcp-launch-binding-queue.js";import{setPanelEnvVars as Xt,setAgentMeta as Qt}from"../services/panel-env.js";import{findClaudeCodeProcesses as Zt,isProcessRunning as en}from"../services/process-detector.js";import{forgetSession as q,onSdkToolUseEnd as tn,onSdkToolUseStart as nn}from"../services/sdk-tool-file-change-recorder.js";import{bridgeEventBuffer as at,sendOutput as Y,sendQuestionRequest as on,sendToolAuthRequest as rn,sendStatus as $}from"../services/session-output.js";import{getSnapshotRetentionDays as Pe,setSnapshotRetentionDays as sn}from"../services/snapshot-retention.js";import{findPersistedSessionByAgentId as an,removePersistedSession as G,savePersistedSessions as cn,updatePersistedSessionAutoCommands as un,updatePersistedSessionRuntimeState as dn,upsertPersistedSession as ln}from"../services/terminal-persistence.js";import{extractUserScope as fn,normalizeUserScope as pn}from"../services/user-scope.js";import{getInstanceAiConfigDebugLogger as mn}from"../utils/instance-ai-config-debug-logger.js";import{logger as l}from"../utils/logger.js";const T=Dt();function ct(e){const n=e.header("X-Runtime-Token");return n&&n.trim()?n.trim():(e.header("Authorization")||"").match(/^Bearer\s+(.+)$/i)?.[1]?.trim()||void 0}const f=new Map,gn=45e3,me=new Map;function yn(e){if(me.has(e))return;const n=setInterval(()=>{const t=f.get(e);if(!t){U(e);return}const o=t.currentRuntimeStatus;if(o!=="thinking"&&o!=="tool_using"&&o!=="compacting"){U(e);return}$(t.agentId,e,o,void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl}).catch(()=>{})},gn);me.set(e,n)}function U(e){const n=me.get(e);n&&(clearInterval(n),me.delete(e))}const ut=4e3,In=200,Sn=2e3,dt=24e3,lt=200,ft=8e3;function hn(e){if(!Array.isArray(e)||e.length===0)return{snapshot:"",truncated:!1};const n=[];let t=null,o=[];const s=()=>{if(t===null)return;const u=o.join("").trim();if(o=[],!u){t=null;return}const d=t==="user"?"\u7528\u6237":t==="assistant"?"\u52A9\u624B":t;n.push(`\u3010${d}\u3011${ge(u,Sn)}`),t=null};for(const u of e){const d=String(u?.role||"").trim();if(!d||d==="system")continue;if(d==="tool_use"||d==="tool_result"){s();const p=String(u.toolName||"").trim()||"\u672A\u77E5\u5DE5\u5177";if(Tn(p))continue;if(d==="tool_use"){const y=bn(String(u.content||""));n.push(`\u3010\u5DE5\u5177\u8C03\u7528\u3011${p}${y?` ${y}`:""}`)}else{const y=ge(String(u.content||"").trim(),In);n.push(`\u3010\u5DE5\u5177\u7ED3\u679C\u3011${p}${u.isError?"\uFF08\u5931\u8D25\uFF09":""}${y?`\uFF1A${y}`:""}`)}continue}const g=String(u.content||"");g.trim()&&(t===d||(s(),t=d),o.push(g))}if(s(),n.length===0)return{snapshot:"",truncated:!1};const r=n.join(`
|
|
2
|
+
`);if(r.length<=dt)return{snapshot:r,truncated:!1};const i=dt-ft,a=r.slice(0,ft),c=r.slice(r.length-i);return{snapshot:`${a}
|
|
3
3
|
|
|
4
4
|
...\uFF08\u6B64\u5904\u7701\u7565\u4E2D\u6BB5 ${r.length-a.length-c.length} \u5B57\u7B26\u5386\u53F2\uFF09...
|
|
5
5
|
|
|
6
|
-
${c}`,truncated:!0}}function ge(e,n){const t=String(e??"");return t.length<=n?t:`${t.slice(0,n)}...\uFF08\u622A\u65AD ${t.length-n} \u5B57\u7B26\uFF09`}function
|
|
6
|
+
${c}`,truncated:!0}}function ge(e,n){const t=String(e??"");return t.length<=n?t:`${t.slice(0,n)}...\uFF08\u622A\u65AD ${t.length-n} \u5B57\u7B26\uFF09`}function Tn(e){const n=e.toLowerCase();return n.includes("poll_message")||n.includes("get_message")||n.includes("await_complete")}function An(e){if(typeof e!="string"||!e.trim())return Array.isArray(e)&&e.length>0?e:void 0;try{const n=JSON.parse(e);if(!Array.isArray(n)||n.length===0)return;const t=new Set(["system","user","assistant","tool"]),o=1e6,r=n.filter(i=>!!i&&typeof i=="object"&&t.has(String(i.role))).filter(i=>JSON.stringify(i).length<=o).slice(0,5e3);return r.length>0?r:void 0}catch{return}}function kn(e){if(!(typeof e!="string"||!e.trim()))try{const n=JSON.parse(e);if(!n||typeof n!="object"||Array.isArray(n))return;const t=a=>{const c=Number(a);return Number.isFinite(c)&&c>=0?c:void 0},o=t(n.totalInputTokens),s=t(n.totalOutputTokens),r=t(n.cacheHitTokens),i=t(n.cacheMissTokens);return o===void 0&&s===void 0&&r===void 0&&i===void 0?void 0:{...o!==void 0?{totalInputTokens:o}:{},...s!==void 0?{totalOutputTokens:s}:{},...r!==void 0?{cacheHitTokens:r}:{},...i!==void 0?{cacheMissTokens:i}:{}}}catch{return}}const _n="\u6CE8\u610F\uFF1A\u4E0A\u6B21\u8FD0\u884C\u56E0\u610F\u5916\u4E2D\u65AD\u5BFC\u81F4\u672C\u5B9E\u4F8B\u8FDB\u5165\u4E86\u4F11\u7720\uFF0C\u4E0A\u9762\u7684\u5FEB\u7167\u662F\u4E2D\u65AD\u524D\u6700\u540E\u4E00\u6B21\u81EA\u52A8\u4FDD\u5B58\u7684\u8FDB\u5EA6\uFF0C\u90E8\u5206\u6700\u8FD1\u7684\u5DE5\u4F5C\u72B6\u6001\u53EF\u80FD\u5DF2\u7ECF\u4E22\u5931\u3002\u9047\u5230\u4E2D\u65AD\u5BFC\u81F4\u4F60\u8FDB\u5165\u4E86\u4F11\u7720\uFF0C\u90E8\u5206\u5DE5\u4F5C\u72B6\u6001\u53EF\u80FD\u5DF2\u7ECF\u4E22\u5931\uFF0C\u8BF7\u7EE7\u7EED\u5DE5\u4F5C\uFF01\u884C\u52A8\u524D\u5148\u81EA\u67E5\u73B0\u573A\uFF08\u8BFB\u6587\u4EF6/poll_message\uFF09\uFF0C\u786E\u8BA4\u4E0A\u4E00\u6B65\u662F\u5426\u5DF2\u843D\u76D8\uFF0C\u518D\u7EE7\u7EED\u63A8\u8FDB\u672A\u5B8C\u6210\u7684\u4E8B\u9879\u3002",pt="\u6CE8\u610F\uFF1A\u672C\u5B9E\u4F8B\u4E0A\u6B21\u6B63\u5E38\u7ED3\u675F\u8FD0\u884C\u5E76\u81EA\u52A8\u4FDD\u5B58\u4E86\u5B8C\u6574\u8FDB\u5EA6\u3002\u8BF7\u57FA\u4E8E\u5FEB\u7167\u7EE7\u7EED\u63A8\u8FDB\u672A\u5B8C\u6210\u7684\u4E8B\u9879\u3002";function bn(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 ge(n,lt)}const o=[];for(const s of["file_path","path","filePath","pattern","query","command","cmd","url"]){const r=t[s];if(typeof r=="string"&&r.trim()&&o.push(`${s}=${r.trim()}`),o.length>=3)break}if(o.length===0){const s=Object.keys(t).slice(0,5);return s.length>0?`(${s.join(", ")})`:""}return ge(o.join(" "),lt)}function mt(e){if(e==null||typeof e!="object"||Array.isArray(e))return;const n=e,t={};return typeof n.model=="string"&&n.model.trim()&&(t.model=n.model.trim()),typeof n.baseURL=="string"&&n.baseURL.trim()&&(t.baseURL=n.baseURL.trim()),typeof n.apiKey=="string"&&n.apiKey.trim()&&(t.apiKey=n.apiKey.trim()),typeof n.effort=="string"&&n.effort.trim()&&(t.effort=n.effort.trim()),t}const V=new Set;function Cn(e,n){return e!=="acode"?{supported:!1,statusCode:400,error:"context reset without restart is only supported by ACode"}:n?{supported:!0}:{supported:!1,statusCode:500,error:"ACode adapter does not expose resetContext"}}function En(e){return e!=="acode"}function Rn(e){const n=typeof e=="object"&&e!==null&&"suppressStatus"in e&&e.suppressStatus===!0,t=typeof e=="object"&&e!==null&&"reason"in e&&typeof e.reason=="string"&&e.reason.trim()?e.reason.trim():void 0,o=typeof e=="object"&&e!==null&&"discardContext"in e&&e.discardContext===!0;return{statusNotified:!n,reason:t,discardContext:o}}function Z(e){const n=e?.usage;if(!n)return;const t=Number.isFinite(n.inputTokens)?n.inputTokens:0,o=Number.isFinite(n.outputTokens)?n.outputTokens:0;if(t<=0&&o<=0&&!n.contextLimit&&!n.maxOutput&&!n.inputLimit&&!n.compactionThreshold&&n.totalInputTokens===void 0&&n.totalOutputTokens===void 0)return;const s={inputTokens:t,outputTokens:o,...n.contextLimit?{contextLimit:n.contextLimit}:{},...n.maxOutput?{maxOutput:n.maxOutput}:{},...n.inputLimit?{inputLimit:n.inputLimit}:{},...n.compactionThreshold?{compactionThreshold:n.compactionThreshold}:{},...n.cacheHitTokens!==void 0?{cacheHitTokens:n.cacheHitTokens}:{},...n.cacheMissTokens!==void 0?{cacheMissTokens:n.cacheMissTokens}:{},...n.totalInputTokens!==void 0?{totalInputTokens:n.totalInputTokens}:{},...n.totalOutputTokens!==void 0?{totalOutputTokens:n.totalOutputTokens}:{}};return process.env.ACODE_TOKEN_DEBUG==="1"&&(s.inputTokens>0||s.outputTokens>0||s.cacheHitTokens!==void 0||s.cacheMissTokens!==void 0||s.totalInputTokens!==void 0||s.totalOutputTokens!==void 0)&&l.info(`[TokenDebug][Terminal] resolveStatusChangeUsage: input=${s.inputTokens} output=${s.outputTokens} cacheHit=${s.cacheHitTokens??"(none)"} cacheMiss=${s.cacheMissTokens??"(none)"} totalInput=${s.totalInputTokens??"(none)"} totalOutput=${s.totalOutputTokens??"(none)"} actionType=${e?.actionType??"(none)"}`),s}function $n(e,n){const t=String(e||"").trim().toLowerCase(),o=String(n?.actionType||"").trim().toLowerCase();return t==="tool_using"&&o==="idle"?n?{status:"waiting_input",actionInfo:n}:{status:"waiting_input"}:n?{status:e,actionInfo:n}:{status:e}}function wn(e){return e.restoredActionInfo?.actionType==="idle"||e.currentRuntimeActionType==="idle"&&e.shouldPreservePrevAction||e.status==="waiting_input"&&!e.actionInfo?.actionType}function On(e){return e.actionInfo?.actionType?!1:!!e.usage}const ee=new Map,Dn="utf-8",gt="utf-8",yt=300,It=6e4;function te(e){return String(e).padStart(2,"0")}function Mn(e,n=new Date){const t=n.getFullYear(),o=te(n.getMonth()+1),s=te(n.getDate()),r=te(n.getHours()),i=te(n.getMinutes()),a=`${t}${o}${s}-${r}${i}${te(n.getSeconds())}-${String(n.getMilliseconds()).padStart(3,"0")}`;return de.join(qe(),"cmd-dist",e,`${t}-${o}-${s}`,r,i,`${a}-cmd.out`)}function Ln(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 Pn(e,n=
|
|
10
|
+
`).length:1}function Pn(e,n=yt){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 Un(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 St(e){const n=e.outputPath||Mn(e.agentId,e.startedAt);return e.outputPath=n,await ue.mkdir(de.dirname(n),{recursive:!0}),await ue.writeFile(n,e.chunks.join(""),"utf-8"),n}function xn(e){return String(e??"").replace(/\r/g,`
|
|
16
|
+
`).trim()}function Nn(e=process.platform,n=process.env){const t=n.AWS_TERMINAL_OUTPUT_ENCODING?.trim();return t||(e==="win32"?Dn:gt)}function ht(e=Nn()){if(e!=="utf-8")try{return new le(e,{fatal:!1})}catch{return new le(gt,{fatal:!1})}return jn()}function jn(){let e=null,n=null,t=null;const o=[];function s(r){try{return new le(r,{fatal:!1})}catch{return new le("utf-8",{fatal:!1})}}return{decode(r,i){if(r!=null&&o.push(r instanceof ArrayBuffer?Buffer.from(r):Buffer.isBuffer(r)?r:Buffer.from(r.buffer,r.byteOffset,r.byteLength)),t==="gb18030")return n||(n=s("gb18030")),n.decode(r,i);e||(e=s("utf-8"));const a=e.decode(r,i);if(t===null&&a.includes("\uFFFD")){t="gb18030",n=s("gb18030");const c=Buffer.concat(o);return n.decode(c)}return t===null&&!i?.stream&&(t="utf-8"),a}}}function ye(e,n,t=!1){return t?e.decode():!n||n.length===0?"":e.decode(n,{stream:!0})}function Bn(e){const n=e.trim().match(/^cd(?:\s+(.*))?$/i);if(!n)return;const t=n[1]?.trim();if(!t)return null;const o=t.replace(/^\/d\s+/i,"").trim();return o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'")?o.slice(1,-1):o}function Fn(e){const n=ee.get(e.sessionId);if(n)return n;const t={currentDirectory:e.workspacePath,runningProcess:null};return ee.set(e.sessionId,t),t}function Tt(e){for(const n of f.values())if(n.agentId===e)return n}async function vn(e){const n=_.get(e.providerId||"claude-code"),t=ne(n.getSessionStatus(e.sessionId),e.currentRuntimeStatus,e.currentRuntimeActionType);return{sessionId:e.sessionId,status:t,runtimeStatus:t,runtimeActionType:e.currentRuntimeActionType,runtimeActionLabel:e.currentRuntimeActionLabel,runtimeActionDetail:e.currentRuntimeActionDetail,agentId:e.agentId,workspacePath:e.workspacePath,command:e.config.command,mode:"sdk",providerSessionId:n.getProviderSessionId(e.sessionId),reused:!0}}function ne(e,n,t){const o=String(e||"").trim();if(o){const r=String(n||"").trim(),i=String(t||"").trim().toLowerCase();return o.toLowerCase()==="tool_using"&&r.toLowerCase()==="waiting_input"&&i==="idle"?r:o}return String(n||"").trim()||"running"}async function Hn(e,n=en){return e.pid?await n(e.pid)?Ct(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 cr(e){try{fe(e)}catch(t){l.warn(`[cleanupSdkSessionByAgentId] clear debug mounts failed for agentId=${e}: ${t}`)}const n=Tt(e);if(!n)l.info(`[cleanupSdkSessionByAgentId] No active SDK session found for agentId=${e}, cleaning residual state anyway`);else{const t=n.sessionId;return l.info(`[cleanupSdkSessionByAgentId] Cleaning up SDK session for agentId=${e}, sessionId=${t}`),U(t),f.delete(t),q(t),Ie(t),G(t).catch(o=>{l.warn(`[cleanupSdkSessionByAgentId] Failed to remove persisted session for agentId=${e}: ${o}`)}),t}V.has(e)&&(V.delete(e),l.info(`[cleanupSdkSessionByAgentId] Released startingAgents lock for agentId=${e}`))}function Ie(e){const n=ee.get(e);if(!n?.runningProcess){ee.delete(e);return}try{n.runningProcess.kill()}catch{}finally{n.runningProcess=null,ee.delete(e)}}function E(e,n){n&&(e.seq+=1,Y(e.agentId,n,e.sessionId,e.seq,void 0,{runtimeAccessToken:e.runtimeAccessToken,schedulerBaseUrl:e.schedulerBaseUrl}).catch(()=>{}))}function Ue(e){return`\x1B[36m${e}>\x1B[0m `}function Kn(e,n){return n==="~"?$t.homedir():de.resolve(e,n)}async function zn(e,n,t){const o=Bn(t);if(o===void 0)return!1;if(o===null)return E(e,`${n.currentDirectory}\r
|
|
17
|
+
`),!0;const s=Kn(n.currentDirectory,o);try{return(await ue.stat(s)).isDirectory()?(n.currentDirectory=s,E(e,`${n.currentDirectory}\r
|
|
18
18
|
`),!0):(E(e,`cd: not a directory: ${s}\r
|
|
19
19
|
`),!0)}catch(r){const i=r instanceof Error?r.message:String(r);return E(e,`cd: ${i}\r
|
|
20
|
-
`),!0}}async function
|
|
20
|
+
`),!0}}async function Wn(e,n){const t=f.get(e);if(!t)throw new Error("SDK session not found");const o=xn(n),s=Fn(t);if(!o)return{started:!1,cwd:s.currentDirectory};if(s.runningProcess)throw new Error("A terminal command is already running for this session");const r=W(o);if(E(t,`${Ue(s.currentDirectory)}${r}\r
|
|
21
21
|
`),ze(o))return E(t,`[Terminal Warning] \u68C0\u6D4B\u5230\u526A\u8D34\u677F\u4E34\u65F6 paste \u6587\u4EF6\u8DEF\u5F84\uFF0C\u5DF2\u8DF3\u8FC7\u6267\u884C\u3002\u8BF7\u7C98\u8D34\u6587\u4EF6\u5185\u5BB9\u6216\u4F7F\u7528\u663E\u5F0F\u8BFB\u53D6\u547D\u4EE4\u3002\r
|
|
22
|
-
`),E(t,Ue(s.currentDirectory)),{started:!1,cwd:s.currentDirectory};if(await
|
|
22
|
+
`),E(t,Ue(s.currentDirectory)),{started:!1,cwd:s.currentDirectory};if(await zn(t,s,o))return{started:!1,cwd:s.currentDirectory};await $(t.agentId,e,"tool_using",{actionType:"bash",actionLabel:"\u7EC8\u7AEF\u547D\u4EE4",actionDetail:r},void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl});const a=Rt(o,{cwd:s.currentDirectory,shell:!0,env:At(t.agentId,t.workspacePath,process.env,t.config.envOverrides)});s.runningProcess=a;const c=ht(),u=ht(),d=t.providerId==="acode",g={agentId:t.agentId,startedAt:new Date,chunks:[],spilled:!1};let p;const y=()=>{p&&(clearTimeout(p),p=void 0)},C=()=>{y(),p=setTimeout(()=>{s.runningProcess===a&&(E(t,Un()),a.kill())},It)},w=(I,L=!0)=>{if(I&&(d&&g.chunks.push(I),d&&L&&C(),!(d&&g.spilled))){if(d&&Ln(g.chunks.join(""))>yt){g.spilled=!0,St(g).then(b=>{E(t,Pn(b))}).catch(b=>{const K=b instanceof Error?b.message:String(b);E(t,`\r
|
|
23
23
|
[ACode] \u547D\u4EE4\u8F93\u51FA\u843D\u76D8\u5931\u8D25: ${K}\r
|
|
24
24
|
`)});return}E(t,I)}};return d&&C(),a.stdout.on("data",I=>{w(ye(c,I))}),a.stderr.on("data",I=>{w(ye(u,I))}),a.on("error",I=>{E(t,`\r
|
|
25
25
|
[Terminal Error] ${I.message}\r
|
|
26
|
-
`)}),a.on("close",(I,
|
|
26
|
+
`)}),a.on("close",(I,L)=>{y(),s.runningProcess=null,w(ye(c,void 0,!0),!1),w(ye(u,void 0,!0),!1),g.spilled&&St(g).catch(b=>{const K=b instanceof Error?b.message:String(b);E(t,`\r
|
|
27
27
|
[ACode] \u547D\u4EE4\u8F93\u51FA\u6700\u7EC8\u843D\u76D8\u5931\u8D25: ${K}\r
|
|
28
28
|
`)}),I&&I!==0?E(t,`\r
|
|
29
29
|
[exit ${I}]\r
|
|
30
|
-
`):
|
|
31
|
-
[signal ${
|
|
32
|
-
`),E(t,Ue(s.currentDirectory)),$(t.agentId,e,"waiting_input",void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl})}),{started:!0,cwd:s.currentDirectory}}function
|
|
33
|
-
...\uFF08\u7ED3\u679C\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`}function
|
|
30
|
+
`):L&&E(t,`\r
|
|
31
|
+
[signal ${L}]\r
|
|
32
|
+
`),E(t,Ue(s.currentDirectory)),$(t.agentId,e,"waiting_input",void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl})}),{started:!0,cwd:s.currentDirectory}}function At(e,n,t,o,s){const r={};for(const[i,a]of Object.entries(t))a!==void 0&&(r[i]=a);if(n&&(r.AWS_WORKSPACE_PATH=String(n)),s&&String(s).trim()&&(r.AWS_PROJECT_ROOT=String(s).trim()),o)for(const[i,a]of Object.entries(o)){const c=i.trim();if(!c||a===void 0||a===null)continue;const u=String(a).trim();u&&(r[c]=u)}return r.AWS_AGENT_ID=String(e),r.AWS_MCP_CLAIM_LAUNCH_BINDING="true",r.AWS_RUNTIME_BRIDGE_BASE_URL=`http://127.0.0.1:${Ut()}`,String(r.ACODE_HOME||"").trim()||(r.ACODE_HOME=qe()),S(e,Ge)!=="disabled"&&(r.AWS_LAUNCH_CONFIG_TOOLS=S(e,Ge)),S(e,Ve)!=="disabled"&&(r.AWS_HIRE_TOOLS=S(e,Ve)),S(e,Je)!=="disabled"&&(r.AWS_PENCIL_TOOLS=S(e,Je)),S(e,Xe)!=="disabled"&&(r.AWS_DRAW_TOOLS=S(e,Xe)),S(e,Qe)!=="disabled"&&(r.AWS_OFFICE_TOOLS=S(e,Qe)),S(e,Ze)!=="disabled"&&(r.AWS_COLLABORATION_TASK_TOOLS=S(e,Ze)),S(e,et)!=="disabled"&&(r.AWS_COLLABORATION_MEETING_TOOLS=S(e,et)),S(e,tt)!=="disabled"&&(r.AWS_COLLABORATION_DEBUG_TOOLS=S(e,tt)),S(e,nt)!=="disabled"&&(r.AWS_COLLABORATION_FILE_HISTORY_TOOLS=S(e,nt)),S(e,ot)!=="disabled"&&(r.AWS_COLLABORATION_VOICE_TOOLS=S(e,ot)),S(e,rt)!=="disabled"&&(r.AWS_EMAIL_TOOLS=S(e,rt)),S(e,st)!=="disabled"&&(r.AWS_ABILITY_MARKET_TOOLS=S(e,st)),S(e,it)!=="disabled"&&(r.AWS_ABILITY_DEV_TOOLS=S(e,it)),r}function qn(e){const n=e.trim(),t=n[0],o=n[n.length-1];return(t==='"'||t==="'")&&t===o?n.slice(1,-1):n}async function Yn(e){const n=String(e);if(!ze(n))return n;const t=qn(n);return de.isAbsolute(t)?ue.readFile(t,"utf-8"):n}function Gn(e,n){const t={};for(const s of[e?.env,n])if(s)for(const[r,i]of Object.entries(s)){const a=r.trim();if(!a||i===void 0||i===null)continue;const c=String(i).trim();c&&(t[a]=c)}const o=t.ANTHROPIC_MODEL?.trim()||t.CODEX_MODEL?.trim()||void 0;return{envOverrides:t,model:o}}function Vn(e){if(e==null)return;const t=(typeof e=="string"?e:JSON.stringify(e,null,2)).trim();if(t)return t.length<=ut?t:`${t.slice(0,ut)}
|
|
33
|
+
...\uFF08\u7ED3\u679C\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`}function Jn(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 Qn(e){if(e.type!=="tool_use_end")return;const n=Vn(e.data.toolResult??e.data.actionResult);if(!n)return;const t=Me(e.data.toolName,e.data.toolInput),o=e.data.actionType||t.actionType;if(o==="idle"){const s=String(e.data.rawToolName||e.data.toolName||"").toLowerCase();if((s.includes("poll_message")||s.includes("get_message"))&&!Jn(n))return}return o==="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:o,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:e.data.actionDetail||t.actionDetail||e.data.toolName,actionId:e.data.actionId||e.data.toolUseId,actionResult:n,...e.data.parentId?{parentId:e.data.parentId}:{}}}function Zn(e){if(e.type==="ai_request"){const n=e.data.model?` ${e.data.model}`:"",t=e.data.lastUserMessagePreview?`\uFF1A${e.data.lastUserMessagePreview}`:"";return`\r
|
|
34
34
|
[ACode] \u6B63\u5728\u8BF7\u6C42\u6A21\u578B${n}${t}\r
|
|
35
35
|
`}if(e.type==="text_delta"||e.type==="thinking"||e.type==="compaction_summary"||e.type==="command_output")return e.data.text||void 0;if(e.type==="error")return e.data.text?`\r
|
|
36
36
|
[SDK Error] ${e.data.text}\r
|
|
37
|
-
`:void 0}function
|
|
38
|
-
...\uFF08\u8F93\u5165\u53C2\u6570\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`:n}catch{return}}function uo(e,n){return String(n||"").trim().toLowerCase()!=="waiting_input"?!1:e.type==="thinking"||e.type==="text_delta"}function lo(e,n){if(!uo(e,n)){if(e.type==="background_command_completed")return{status:"tool_result",actionInfo:{actionType:"background_command",actionLabel:"\u540E\u53F0\u547D\u4EE4",actionDetail:"background_command_completed"}};if(e.type==="thinking"||e.type==="text_delta")return{status:"thinking"};if(e.type==="tool_use_start"){const t=Me(e.data.toolName,e.data.toolInput),o=kt(e,t),s=co(e.data.toolInput);return e.data.actionType==="idle"||t.actionType==="idle"?{status:"waiting_input",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:o||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:s,actionId:e.data.actionId||e.data.toolUseId}}:{status:"tool_using",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:o||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:s,actionId:e.data.actionId||e.data.toolUseId,...e.data.batchId?{parentId:e.data.batchId}:{}}}}if(e.type==="turn_complete")return{status:"waiting_input",actionInfo:e.data.usage?{usage:e.data.usage}:void 0};if(e.type==="error")return{status:"error"};if(e.type==="context_compaction")return{status:"compacting",actionInfo:{actionType:"context_compaction",actionLabel:e.data.actionLabel,actionDetail:e.data.actionDetail,...e.data.actionId?{actionId:e.data.actionId}:{},...e.data.parentId?{parentId:e.data.parentId}:{}}};if(e.type==="runtime_capabilities")return{status:n||"waiting_input",actionInfo:{actionType:"runtime_capabilities",actionLabel:e.data.actionLabel||"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:e.data.actionDetail}};if(e.type==="tool_batch_start"){const t=e.data.batchId;return t?{status:"tool_result",actionInfo:{actionType:"tool_batch",actionLabel:"\u5E76\u884C\u6267\u884C\u5DE5\u5177",actionDetail:e.data.actionDetail,actionId:t}}:void 0}if(e.type==="tool_batch_metrics"){const t=e.data.batchId;return t?{status:"tool_result",actionInfo:{actionType:"tool_batch",actionLabel:"\u5E76\u884C\u6267\u884C\u5DE5\u5177",actionId:t,batchId:t,...e.data.batchMetrics?{batchMetrics:e.data.batchMetrics}:{}}}:void 0}}}const B=new Map,Se=new Map,he=new Map;async function Ne(e){const{entry:n,sessionId:t,actionInfo:o,timestamp:s,sourceEventType:r,backoffBaseMs:i,label:a}=e,c={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl},u=3;for(let d=0;d<u;d++){if(await $(n.agentId,t,"tool_result",o,void 0,c,s,r)!==void 0)return;d<u-1&&await new Promise(p=>setTimeout(p,i*(d+1)))}l.warn(`[Runtime] ${a} tool_result sendStatus retry exhausted (result may be lost): agentId=${n.agentId}`)}const oe=new Map,fo=20,po=500,mo=3e4;async function Te(e,n=mo,t=2){for(let o=0;o<=t;o++){const s=new AbortController;let r;try{const i=e(s.signal);i.catch(()=>{}),await Promise.race([i,new Promise((a,c)=>{r=setTimeout(()=>{s.abort(),c(new Error(`sendOutput timeout after ${n}ms`))},n)})]),r&&clearTimeout(r);return}catch(i){r&&clearTimeout(r);const a=i instanceof Error?i.message:String(i);if(o<t){const c=1e3*(o+1);l.warn(`sendOutput attempt ${o+1}/${t+1} failed (${a}), retrying in ${c}ms...`),await new Promise(u=>setTimeout(u,c));continue}l.warn(`sendOutput failed after ${t+1} attempts (${a}), giving up to unblock serial queue`)}}}async function go(e,n,t,o,s,r){try{await Y(e,n,t,o,{...s,sourceEventType:"compaction_summary",skipLocalPersist:!0},r)}catch(i){l.debug("Compaction summary realtime push failed (non-persisted)",{agentId:e,sessionId:t,error:i instanceof Error?i.message:String(i)})}}const Ae=new Map,yo=120,Io=120;function So(e,n,t,o){const s=`${n}:compaction_summary`;let r=Ae.get(s);if(r||(r={buffer:"",timer:null,entry:e,sessionId:n,seq:o},Ae.set(s,r)),r.buffer+=t,r.seq=o,r.entry=e,r.buffer.length>=yo){je(n);return}r.timer||(r.timer=setTimeout(()=>je(n),Io))}function je(e){const n=`${e}:compaction_summary`,t=Ae.get(n);if(!t)return;t.timer&&(clearTimeout(t.timer),t.timer=null);const o=t.buffer;Ae.delete(n),o&&go(t.entry.agentId,o,t.sessionId,t.seq,{sourceEventType:"compaction_summary",skipLocalPersist:!0},{runtimeAccessToken:t.entry.runtimeAccessToken,schedulerBaseUrl:t.entry.schedulerBaseUrl})}function ke(e,n){const t=n?`${e}:${n}`:void 0;let o,s;if(t)o=oe.get(t),s=t;else{const y=[];for(const[C,w]of oe)C.startsWith(e+":")&&w.buffer&&y.push(w.sourceEventType);for(const C of y)ke(e,C);return}if(!o||!o.buffer)return;o.timer=null;const r=o.buffer,i=o.seq,a=o.entry,c=o.sourceEventType;o.buffer="",s&&oe.delete(s);const u={sourceEventType:c,logCategory:"acode"},d={runtimeAccessToken:a.runtimeAccessToken,schedulerBaseUrl:a.schedulerBaseUrl},p=(B.get(e)??Promise.resolve()).then(()=>Te(y=>Y(a.agentId,r,e,i,u,d,y)),()=>Te(y=>Y(a.agentId,r,e,i,u,d,y)));B.set(e,p),p.finally(()=>{B.get(e)===p&&B.delete(e)})}function ho(e,n){const t=Qn(e);if(!t)return;n.seq+=1;const o=n.seq,s=Zn(e),r={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl};if(e.type==="compaction_summary"){So(n,e.sessionId,t,o);return}if((e.type==="command_output"||e.type==="text_delta"||e.type==="thinking")&&t.length<fo){const c=`${e.sessionId}:${e.type}`;let u=oe.get(c);if(u||(u={buffer:"",seq:0,timer:null,entry:n,sourceEventType:e.type}),u.buffer+=t,u.seq=o,u.entry=n,!u.timer){const d=e.sessionId,g=e.type;u.timer=setTimeout(()=>ke(d,g),po)}oe.set(c,u);return}ke(e.sessionId);const a=(B.get(e.sessionId)??Promise.resolve()).then(()=>Te(c=>Y(n.agentId,t,e.sessionId,o,s,r,c)),()=>Te(c=>Y(n.agentId,t,e.sessionId,o,s,r,c)));B.set(e.sessionId,a),a.finally(()=>{B.get(e.sessionId)===a&&B.delete(e.sessionId)})}function bt(e){return Pt(e)}let Ct=!1;function To(){Ct||(Mt(_,Ao),Bt(),Ct=!0)}function Ao(e,n){e.on("event",t=>{const o=f.get(t.sessionId);if(o){if(t.type==="tool_use_start"?tn(o.sessionId,t.data.toolUseId||t.data.actionId,t.data.toolInput,t.data.toolName,o.workspacePath):t.type==="tool_use_end"&&en(t,{sessionId:o.sessionId,agentId:o.agentId,workspacePath:o.workspacePath,providerId:o.providerId}),l.info(`[${n.displayName} Adapter] Event: ${t.type} for session ${t.sessionId}`),!(t.type==="thinking"||t.type==="text_delta"||t.type==="tool_use_start"||t.type==="context_compaction"||t.type==="compaction_summary"||t.type==="ai_request"||t.type==="error")){t.type==="runtime_capabilities"&&t.data.actionDetail&&(o.cachedCapabilitiesActionDetail=t.data.actionDetail);const i=lo(t,o.currentRuntimeStatus);i&&$(o.agentId,t.sessionId,i.status,i.actionInfo,Z(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl},t.timestamp?new Date(t.timestamp).getTime():void 0,t.type)}t.type==="context_compaction"&&je(t.sessionId),ho(t,o);const r=Xn(t);if(r){const i=t.timestamp?new Date(t.timestamp).getTime():void 0,a=String(t.data?.toolName||"").toLowerCase()==="browser_launch",c=t.type==="tool_use_end"&&String(t.data?.rawToolName||t.data?.toolName||"").toLowerCase().replace(/[_-]/g,"").includes("todowrite");Ne(a?{entry:o,sessionId:t.sessionId,actionInfo:r,timestamp:i,sourceEventType:t.type,backoffBaseMs:3e3,label:"browser_launch"}:c?{entry:o,sessionId:t.sessionId,actionInfo:r,timestamp:i,sourceEventType:t.type,backoffBaseMs:1e3,label:"todo_write"}:{entry:o,sessionId:t.sessionId,actionInfo:r,timestamp:i,sourceEventType:t.type,backoffBaseMs:1e3,label:"tool_result"})}}}),e.on("status-change",(t,o,s)=>{const r=f.get(t);if(r){ke(t),o==="thinking"||o==="tool_using"||o==="compacting"?gn(t):U(t);const i=Rn(o,s);r.currentRuntimeStatus=i.status;const a=r.currentRuntimeActionDetail??"",c=a.includes("poll_message")||a.includes("get_message"),d=!(i.actionInfo?.actionType==="ai_request")&&(i.status==="thinking"||i.status==="waiting_input")&&(r.currentRuntimeActionType==="idle"||r.currentRuntimeActionType==="mcp")&&c;(i.actionInfo?.actionType||!d)&&(r.currentRuntimeActionType=i.actionInfo?.actionType,r.currentRuntimeActionLabel=i.actionInfo?.actionLabel,r.currentRuntimeActionDetail=i.actionInfo?.actionDetail,r.currentRuntimeActionInput=i.actionInfo?.actionInput),l.info(`[${n.displayName} Adapter] Status changed: ${i.status} for agent ${r.agentId}`,i.actionInfo||""),un(t,{runtimeStatus:i.status,runtimeActionType:r.currentRuntimeActionType,runtimeActionLabel:r.currentRuntimeActionLabel,runtimeActionDetail:r.currentRuntimeActionDetail});const g=wn({actionInfo:i.actionInfo,usage:Z(i.actionInfo)}),p=g?void 0:i.actionInfo?.actionType?i.actionInfo:r.currentRuntimeActionType?{actionType:r.currentRuntimeActionType,actionLabel:r.currentRuntimeActionLabel??"",actionDetail:r.currentRuntimeActionDetail,actionInput:r.currentRuntimeActionInput}:void 0;if(i.status==="compacting"){const C=(Se.get(t)??Promise.resolve()).then(async()=>{for(let I=0;I<=2;I++){if(await $(r.agentId,t,i.status,p,Z(i.actionInfo),{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl})!==void 0)return;I<2&&(l.warn(`[${n.displayName}] compaction sendStatus attempt ${I+1} failed (HTTP), retrying in ${1e3*(I+1)}ms...`),await new Promise(b=>setTimeout(b,1e3*(I+1))))}l.warn(`[${n.displayName}] compaction sendStatus failed after 3 attempts, event may be lost`)}).catch(w=>{l.warn(`[${n.displayName}] compaction status chain error:`,w)});Se.set(t,C),C.finally(()=>{Se.get(t)===C&&Se.delete(t)})}else{const y=d&&!i.actionInfo?.actionType||g;if($n({status:i.status,actionInfo:i.actionInfo,restoredActionInfo:p,currentRuntimeActionType:r.currentRuntimeActionType,shouldPreservePrevAction:d})){const I=(he.get(t)??Promise.resolve()).then(async()=>{for(let b=0;b<=2;b++){if(await $(r.agentId,t,i.status,y?void 0:p,Z(i.actionInfo),{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl})!==void 0)return;b<2&&await new Promise(x=>setTimeout(x,1e3*(b+1)))}l.warn(`[${n.displayName}] idle tool sendStatus failed after 3 attempts, status may be stale (frontend will fall back to timeline tool_use event)`)}).catch(P=>{l.warn(`[${n.displayName}] idle status chain error:`,P)});he.set(t,I),I.finally(()=>{he.get(t)===I&&he.delete(t)})}else $(r.agentId,t,i.status,y?void 0:p,Z(i.actionInfo),{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl})}if(i.status==="waiting_input"&&r.cachedCapabilitiesActionDetail){const y=r.cachedCapabilitiesActionDetail;r.cachedCapabilitiesActionDetail=void 0,l.info(`[${n.displayName} Adapter] Re-sending cached runtime_capabilities for agent ${r.agentId} (session stabilized to waiting_input)`),$(r.agentId,t,"waiting_input",{actionType:"runtime_capabilities",actionLabel:"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:y},void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl})}}}),e.on("ask-user-question",t=>{const o=f.get(t.sessionId);o&&(l.info(`[${n.displayName} Adapter] AskUserQuestion for agent ${o.agentId}`),nn(o.agentId,t.sessionId,Array.isArray(t.questions)?t.questions:[],{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl},t.toolCallId))}),e.on("tool-permission-request",t=>{const o=f.get(t.sessionId);o&&t.requestId&&(l.info(`[${n.displayName} Adapter] Tool permission request (${t.capability}) for agent ${o.agentId}`),on(o.agentId,t.sessionId,{requestId:t.requestId,capability:t.capability,...t.detail||{}},{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl}))}),e.on("permission-request",t=>{const o=f.get(t.sessionId);if(o){l.info(`[${n.displayName} Adapter] Permission request: ${t.toolName} for agent ${o.agentId}`);const s=t.toolInput?W(JSON.stringify(t.toolInput).slice(0,400)):void 0;$(o.agentId,t.sessionId,"waiting_input",{actionType:"other",actionLabel:"\u6743\u9650\u786E\u8BA4",actionDetail:s||t.toolName},void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})}})}T.post("/start",h,async(e,n)=>{const{agentId:t,workspacePath:o,mode:s="sdk"}=e.body||{};if(!t||!o){n.status(400).json({error:"agentId and workspacePath are required"});return}const r=ln(e),i=fn(e.body?.tenantId??r?.tenantId,e.body?.ownerUserId??e.body?.userId??r?.userId);if(i)try{Ut(String(t),i,String(e.body?.userId??"").trim()||void 0)}catch(c){if(c instanceof Error&&c.message.includes("agent-ownership-mismatch")){n.status(403).json({ok:!1,error:"agent-ownership-mismatch"});return}throw c}const a=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||Ye(at(e))||void 0;if(Vt({agentId:String(t),workspacePath:String(o),serverUrl:e.body?.serverUrl||a,runtimeAccessToken:e.body?.runtimeAccessToken,userId:e.body?.userId,schedulerBaseUrl:a}),e.body?.runtimeFeatures!==null&&e.body?.runtimeFeatures!==void 0&&(Ht(String(t),e.body.runtimeFeatures),l.info(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u80FD\u529B\u5F00\u5173: ${JSON.stringify(qt(String(t)))}`)),e.body?.inheritedFeatures!==null&&e.body?.inheritedFeatures!==void 0&&(zt(String(t),e.body.inheritedFeatures),l.info(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u7EE7\u627F\u4E09\u6001\u5C42: ${JSON.stringify(Yt(String(t)))}`)),e.body?.capabilities!==void 0&&Kt(String(t),e.body.capabilities),e.body?.capabilitiesInherited!==void 0&&Wt(String(t),e.body.capabilitiesInherited),e.body?.envVars!==null&&e.body?.envVars!==void 0&&typeof e.body.envVars=="object"&&(Jt(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&&(Xt(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&&(Nt(e.body.changeCacheRetentionDays),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u53D8\u66F4\u7F13\u5B58\u4FDD\u7559\u5929\u6570: ${e.body.changeCacheRetentionDays??"\u4E0D\u6E05\u7406"}`)),e.body?.snapshotRetentionDays!==void 0){const c=Le();rn(e.body.snapshotRetentionDays),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u5FEB\u7167\u4FDD\u7559\u5929\u6570: ${e.body.snapshotRetentionDays??"\u4E0D\u6E05\u7406"}`),c!==Le()&&Ft(Le())}if(e.body?.logRetentionDays!==void 0){const c=Math.min(Number(e.body.logRetentionDays)||0,7);c>0&&(Gt(c),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u65E5\u5FD7\u4FDD\u7559\u5929\u6570: ${c}`))}s&&s!=="sdk"&&console.warn(`[Runtime] Unsupported runtime mode "${s}" requested for agent ${t}; starting SDK session instead.`),await ko(e,n)});async function ko(e,n){const{agentId:t,workspacePath:o,command:s,projectRoot:r,autoAccept:i=!0,initialPrompt:a,systemPrompt:c,globalPrompt:u,rolePrompt:d,memory:g,resumeContext:p,resumeTranscript:y,resumeTokenUsage:C,mcpConfigPath:w,extraMcpServers:I,envOverrides:P,idleInputAutoCommand:b,nonInputAutoCommand:K,model:x,instanceAiConfig:_e,subAgentModel:be,subAgentEffort:Ce,scopeKey:Be,browserAllowPrivate:Fe}=e.body||{},z=Tn(y),re=An(C);l.info(`[HIBERNATE-IMPORT] \u542F\u52A8\u8BF7\u6C42\u643A\u5E26\u4F11\u7720\u6062\u590D: agentId=${String(t||"").trim()||"?"} resumeContext=${typeof p=="string"?`${p.length}\u5B57`:"\u65E0"} resumeTranscript\u539F\u59CB=${typeof y=="string"?`${y.length}\u5B57`:typeof y} \u89E3\u6790\u7ED3\u679C=${z?`${z.length}\u6761`:"null"} resumeTokenUsage\u89E3\u6790=${re?JSON.stringify(re):"null"}`);let N=!1,se,Ee,Re;{const O=String(t||"").trim();if(O&&!z&&!(typeof p=="string"&&p.trim()))try{const m=await wt(O);if(m&&Array.isArray(m.transcript)&&m.transcript.length>0){se=m.transcript;const k=m.tokenUsage,L=j=>typeof j=="number"&&Number.isFinite(j)?j:void 0;Ee=k?{...L(k.totalInputTokens)!==void 0?{totalInputTokens:L(k.totalInputTokens)}:{},...L(k.totalOutputTokens)!==void 0?{totalOutputTokens:L(k.totalOutputTokens)}:{},...L(k.cacheHitTokens)!==void 0?{cacheHitTokens:L(k.cacheHitTokens)}:{},...L(k.cacheMissTokens)!==void 0?{cacheMissTokens:L(k.cacheMissTokens)}:{}}:void 0,Re=m.reason==="clean"?ft:kn,N=!0,l.info(`[CRASH-RECOVERY] \u547D\u4E2D\u65AD\u70B9 journal: agentId=${O} reason=${m.reason} savedAt=${m.savedAt} messages=${m.messageCount}`)}}catch(m){l.warn(`[CRASH-RECOVERY] journal \u8BFB\u53D6\u5931\u8D25\uFF08\u6309\u65E0 journal \u5904\u7406\uFF09: agentId=${O}, error=${m instanceof Error?m.message:String(m)}`)}}const J=pn();J.log({level:"info",category:"launch",message:"startSdkSession: \u6536\u5230\u542F\u52A8\u8BF7\u6C42",source:"bridge",agentId:String(t||"").trim()||void 0,details:{reqBodyKeys:Object.keys(e.body||{}),perInstanceAiConfig:_e?pe(_e):null,perAgentModel:x??null}});let R=null;const A=String(t||"").trim(),ie=String(e.body?.runtimeAccessToken||"").trim()||void 0,F=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||Ye(at(e))||void 0;F?l.info(`[startSdkSession] \u56DE\u8C03\u76EE\u6807 server: ${F} (agentId=${A})`):l.warn(`[startSdkSession] \u672A\u89E3\u6790\u5230 schedulerBaseUrl\uFF0C\u5C06\u56DE\u9000\u5230\u9ED8\u8BA4\u5730\u5740 (agentId=${A})`);try{if(To(),!A){n.status(400).json({error:"agentId is required"});return}const O=ht(A);if(O){n.json(await Fn(O));return}const m=await sn(A);if(m){const D=await vn(m);if(!D.reusable)console.warn(`[Runtime] Ignoring stale persisted SDK session for agentId=${A}, sessionId=${m.sessionId}, reason=${D.reason}`),await G(m.sessionId);else{const M=ne(m.runtimeStatus,m.runtimeStatus,m.runtimeActionType);n.json({sessionId:m.sessionId,status:M,runtimeStatus:M,runtimeActionType:m.runtimeActionType,runtimeActionLabel:m.runtimeActionLabel,runtimeActionDetail:m.runtimeActionDetail,agentId:m.agentId,workspacePath:m.workspacePath,command:m.command,mode:m.mode||"sdk",pid:m.pid,reused:!0,persistedOnly:!0});return}}if(V.has(A)){n.status(409).json({error:"SDK session is already starting for this agent"});return}V.add(A);const k=bt(s),L=_.get(k);R=Dt();const j=Yn(null,P),X=k==="acode"?x?String(x).trim():void 0:(()=>{const D=x?String(x).trim():void 0,M=j.model?String(j.model).trim():void 0;return D||M})();J.log({level:"info",category:"resolve",message:"\u6A21\u578B\u89E3\u6790\u7ED3\u679C",source:"bridge",agentId:A,sessionId:R??void 0,details:{perAgentModel:x??null,globalModel:j.model??null,resolvedModel:X??null,providerId:k,note:k==="acode"?"adapter handles full priority":"request > global"}});const $e={...j.envOverrides};X&&($e.ANTHROPIC_MODEL=X,$e.CODEX_MODEL=X);let Q,we=w;if(k==="acode"){const D=_e||{},M=await vt({apiOverrides:pt(D)??void 0,agentId:A,sessionId:R??void 0,runtimeBridgeBaseUrl:F});Q=M.instanceConfig.config,we=M.perInstanceConfigPath,J.log({level:"info",category:"apply",message:"prepareAcodeInstanceConfig \u5B8C\u6210",source:"bridge",agentId:A,sessionId:R??void 0,details:{sanitizedApiOverrides:(()=>{const H=pt(D);return H?pe(H):null})(),resolvedInstanceAiConfig:Q?pe(Q):null,perInstanceConfigPath:we,instanceConfigSources:M.instanceConfig.source??null}})}let ve=c||void 0,Oe,De,ae;const ce=N?He(`\uFF08\u65E0\u8FDB\u5EA6\u6458\u8981\uFF1A\u5B8C\u6574\u5BF9\u8BDD\u8BB0\u5F55\u7ECF ${Re===ft?"\u6B63\u5E38\u6536\u5C3E\u843D\u76D8":"\u5D29\u6E83\u524D\u81EA\u52A8\u843D\u76D8"}\u5DF2\u539F\u6837\u63A5\u7EED\uFF09`,Re):typeof p=="string"&&p.trim()?He(p):void 0;if(k==="acode")if(Oe=typeof u=="string"&&u.trim()||void 0,De=typeof d=="string"&&d.trim()||void 0,typeof g=="string"&&g.trim())ae=g.trim();else{const D=await xt(o,{schedulerBaseUrl:F,runtimeAccessToken:ie,agentId:A});D&&(ae=D,l.info(`[startSdkSession] Auto-loaded memories for ACode agent ${A}`))}else if(typeof u=="string"&&u.trim()||typeof d=="string"&&d.trim()||typeof g=="string"&&g.trim()||ce!==void 0){const M=[u,d,g,ce,c].filter(H=>typeof H=="string"&&H.trim().length>0).map(H=>H.trim());ve=M.length>0?M.join(`
|
|
37
|
+
`:void 0}function eo(e){const n=oo(e);return{sourceEventType:e.type,logCategory:"acode",...no(e),...n?{logLevel:to(e),logMessage:n}:{}}}function to(e){return e.type==="error"?"error":e.type==="command_output"&&e.data.stream==="stderr"?"warn":"info"}function no(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 oo(e){if(e.type==="ai_request"){const n=e.data.model||"unknown-model",t=e.data.endpoint?` @ ${e.data.endpoint}`:"",o=typeof e.data.toolCount=="number"?`, tools=${e.data.toolCount}`:"";return`AI request started: ${n}${t}${o}`}if(e.type==="tool_use_start")return kt(e,"\u5F00\u59CB");if(e.type==="tool_use_end")return kt(e,"\u5B8C\u6210");if(e.type==="command_output")return io(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 ro=/\x1b\[[0-9;?]*[a-zA-Z]/g;function so(e){return e.replace(ro,"")}function io(e){const n=typeof e.data.stream=="string"?e.data.stream:"mixed",t=typeof e.data.sequence=="number"?` #${e.data.sequence}`:"",o=so(String(e.data.text||"")).replace(/\s+/g," ").trim(),s=o.length>240?`${o.slice(0,240)}...`:o;return`\u547D\u4EE4\u8F93\u51FA(${n}${t}): ${s||"(empty)"}`}function kt(e,n){const t=Me(e.data.toolName,e.data.toolInput),o=e.data.actionLabel||t.actionLabel||"\u8C03\u7528\u5DE5\u5177",s=_t(e,t);return s?`${n}${o}: ${s}`:`${n}${o}: ${e.data.actionDetail||e.data.toolName||"tool"}`}function _t(e,n){const t=e.data.toolInput;return n.actionType==="bash"?ao(t)||e.data.actionDetail||n.actionDetail:n.actionType==="read_file"||n.actionType==="edit_file"||n.actionType==="write_file"?co(t)||e.data.actionDetail||n.actionDetail:e.data.actionDetail||n.actionDetail}function ao(e){const n=xe(e?.command,e?.cmd);if(n)return n;if(Array.isArray(e?.argv)){const t=e.argv.map(o=>String(o??"").trim()).filter(Boolean).join(" ");return t?W(t):void 0}return xe(e?.args)}function co(e){const n=bt(e?.paths);return n.length>0?n.length===1?n[0]:`${n.length}\u4E2A\u6587\u4EF6: ${n.join(", ")}`:xe(e?.file_path,e?.filePath,e?.path,e?.target_file,e?.targetFile)}function xe(...e){for(const n of e){if(typeof n=="string"&&n.trim())return W(n.trim());if(Array.isArray(n)){const t=bt(n)[0];if(t)return t}}}function bt(e){return Array.isArray(e)?e.map(n=>typeof n=="string"?n.trim():"").filter(Boolean).map(n=>W(n)):[]}function uo(e){if(!(!e||Object.keys(e).length===0))try{const n=W(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 lo(e,n){return String(n||"").trim().toLowerCase()!=="waiting_input"?!1:e.type==="thinking"||e.type==="text_delta"}function fo(e,n){if(!lo(e,n)){if(e.type==="background_command_completed")return{status:"tool_result",actionInfo:{actionType:"background_command",actionLabel:"\u540E\u53F0\u547D\u4EE4",actionDetail:"background_command_completed"}};if(e.type==="thinking"||e.type==="text_delta")return{status:"thinking"};if(e.type==="tool_use_start"){const t=Me(e.data.toolName,e.data.toolInput),o=_t(e,t),s=uo(e.data.toolInput);return e.data.actionType==="idle"||t.actionType==="idle"?{status:"waiting_input",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:o||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:s,actionId:e.data.actionId||e.data.toolUseId}}:{status:"tool_using",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:o||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:s,actionId:e.data.actionId||e.data.toolUseId,...e.data.batchId?{parentId:e.data.batchId}:{}}}}if(e.type==="turn_complete")return{status:"waiting_input",actionInfo:e.data.usage?{usage:e.data.usage}:void 0};if(e.type==="error")return{status:"error"};if(e.type==="context_compaction")return{status:"compacting",actionInfo:{actionType:"context_compaction",actionLabel:e.data.actionLabel,actionDetail:e.data.actionDetail,...e.data.actionId?{actionId:e.data.actionId}:{},...e.data.parentId?{parentId:e.data.parentId}:{}}};if(e.type==="runtime_capabilities")return{status:n||"waiting_input",actionInfo:{actionType:"runtime_capabilities",actionLabel:e.data.actionLabel||"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:e.data.actionDetail}};if(e.type==="tool_batch_start"){const t=e.data.batchId;return t?{status:"tool_result",actionInfo:{actionType:"tool_batch",actionLabel:"\u5E76\u884C\u6267\u884C\u5DE5\u5177",actionDetail:e.data.actionDetail,actionId:t}}:void 0}if(e.type==="tool_batch_metrics"){const t=e.data.batchId;return t?{status:"tool_result",actionInfo:{actionType:"tool_batch",actionLabel:"\u5E76\u884C\u6267\u884C\u5DE5\u5177",actionId:t,batchId:t,...e.data.batchMetrics?{batchMetrics:e.data.batchMetrics}:{}}}:void 0}}}const B=new Map,Se=new Map,he=new Map;async function Ne(e){const{entry:n,sessionId:t,actionInfo:o,timestamp:s,sourceEventType:r,backoffBaseMs:i,label:a}=e,c={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl},u=3;for(let d=0;d<u;d++){if(await $(n.agentId,t,"tool_result",o,void 0,c,s,r)!==void 0)return;d<u-1&&await new Promise(p=>setTimeout(p,i*(d+1)))}l.warn(`[Runtime] ${a} tool_result sendStatus retry exhausted (result may be lost): agentId=${n.agentId}`)}const oe=new Map,po=20,mo=500,go=3e4;async function Te(e,n=go,t=2){for(let o=0;o<=t;o++){const s=new AbortController;let r;try{const i=e(s.signal);i.catch(()=>{}),await Promise.race([i,new Promise((a,c)=>{r=setTimeout(()=>{s.abort(),c(new Error(`sendOutput timeout after ${n}ms`))},n)})]),r&&clearTimeout(r);return}catch(i){r&&clearTimeout(r);const a=i instanceof Error?i.message:String(i);if(o<t){const c=1e3*(o+1);l.warn(`sendOutput attempt ${o+1}/${t+1} failed (${a}), retrying in ${c}ms...`),await new Promise(u=>setTimeout(u,c));continue}l.warn(`sendOutput failed after ${t+1} attempts (${a}), giving up to unblock serial queue`)}}}async function yo(e,n,t,o,s,r){try{await Y(e,n,t,o,{...s,sourceEventType:"compaction_summary",skipLocalPersist:!0},r)}catch(i){l.debug("Compaction summary realtime push failed (non-persisted)",{agentId:e,sessionId:t,error:i instanceof Error?i.message:String(i)})}}const Ae=new Map,Io=120,So=120;function ho(e,n,t,o){const s=`${n}:compaction_summary`;let r=Ae.get(s);if(r||(r={buffer:"",timer:null,entry:e,sessionId:n,seq:o},Ae.set(s,r)),r.buffer+=t,r.seq=o,r.entry=e,r.buffer.length>=Io){je(n);return}r.timer||(r.timer=setTimeout(()=>je(n),So))}function je(e){const n=`${e}:compaction_summary`,t=Ae.get(n);if(!t)return;t.timer&&(clearTimeout(t.timer),t.timer=null);const o=t.buffer;Ae.delete(n),o&&yo(t.entry.agentId,o,t.sessionId,t.seq,{sourceEventType:"compaction_summary",skipLocalPersist:!0},{runtimeAccessToken:t.entry.runtimeAccessToken,schedulerBaseUrl:t.entry.schedulerBaseUrl})}function ke(e,n){const t=n?`${e}:${n}`:void 0;let o,s;if(t)o=oe.get(t),s=t;else{const y=[];for(const[C,w]of oe)C.startsWith(e+":")&&w.buffer&&y.push(w.sourceEventType);for(const C of y)ke(e,C);return}if(!o||!o.buffer)return;o.timer=null;const r=o.buffer,i=o.seq,a=o.entry,c=o.sourceEventType;o.buffer="",s&&oe.delete(s);const u={sourceEventType:c,logCategory:"acode"},d={runtimeAccessToken:a.runtimeAccessToken,schedulerBaseUrl:a.schedulerBaseUrl},p=(B.get(e)??Promise.resolve()).then(()=>Te(y=>Y(a.agentId,r,e,i,u,d,y)),()=>Te(y=>Y(a.agentId,r,e,i,u,d,y)));B.set(e,p),p.finally(()=>{B.get(e)===p&&B.delete(e)})}function To(e,n){const t=Zn(e);if(!t)return;n.seq+=1;const o=n.seq,s=eo(e),r={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl};if(e.type==="compaction_summary"){ho(n,e.sessionId,t,o);return}if((e.type==="command_output"||e.type==="text_delta"||e.type==="thinking")&&t.length<po){const c=`${e.sessionId}:${e.type}`;let u=oe.get(c);if(u||(u={buffer:"",seq:0,timer:null,entry:n,sourceEventType:e.type}),u.buffer+=t,u.seq=o,u.entry=n,!u.timer){const d=e.sessionId,g=e.type;u.timer=setTimeout(()=>ke(d,g),mo)}oe.set(c,u);return}ke(e.sessionId);const a=(B.get(e.sessionId)??Promise.resolve()).then(()=>Te(c=>Y(n.agentId,t,e.sessionId,o,s,r,c)),()=>Te(c=>Y(n.agentId,t,e.sessionId,o,s,r,c)));B.set(e.sessionId,a),a.finally(()=>{B.get(e.sessionId)===a&&B.delete(e.sessionId)})}function Ct(e){return Pt(e)}let Et=!1;function Ao(){Et||(Lt(_,ko),Ft(),Et=!0)}function ko(e,n){e.on("event",t=>{const o=f.get(t.sessionId);if(o){if(t.type==="tool_use_start"?nn(o.sessionId,t.data.toolUseId||t.data.actionId,t.data.toolInput,t.data.toolName,o.workspacePath):t.type==="tool_use_end"&&tn(t,{sessionId:o.sessionId,agentId:o.agentId,workspacePath:o.workspacePath,providerId:o.providerId}),l.info(`[${n.displayName} Adapter] Event: ${t.type} for session ${t.sessionId}`),!(t.type==="thinking"||t.type==="text_delta"||t.type==="tool_use_start"||t.type==="context_compaction"||t.type==="compaction_summary"||t.type==="ai_request"||t.type==="error")){t.type==="runtime_capabilities"&&t.data.actionDetail&&(o.cachedCapabilitiesActionDetail=t.data.actionDetail);const i=fo(t,o.currentRuntimeStatus);i&&$(o.agentId,t.sessionId,i.status,i.actionInfo,Z(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl},t.timestamp?new Date(t.timestamp).getTime():void 0,t.type)}t.type==="context_compaction"&&je(t.sessionId),To(t,o);const r=Qn(t);if(r){const i=t.timestamp?new Date(t.timestamp).getTime():void 0,a=String(t.data?.toolName||"").toLowerCase()==="browser_launch",c=t.type==="tool_use_end"&&String(t.data?.rawToolName||t.data?.toolName||"").toLowerCase().replace(/[_-]/g,"").includes("todowrite");Ne(a?{entry:o,sessionId:t.sessionId,actionInfo:r,timestamp:i,sourceEventType:t.type,backoffBaseMs:3e3,label:"browser_launch"}:c?{entry:o,sessionId:t.sessionId,actionInfo:r,timestamp:i,sourceEventType:t.type,backoffBaseMs:1e3,label:"todo_write"}:{entry:o,sessionId:t.sessionId,actionInfo:r,timestamp:i,sourceEventType:t.type,backoffBaseMs:1e3,label:"tool_result"})}}}),e.on("status-change",(t,o,s)=>{const r=f.get(t);if(r){ke(t),o==="thinking"||o==="tool_using"||o==="compacting"?yn(t):U(t);const i=$n(o,s);r.currentRuntimeStatus=i.status;const a=r.currentRuntimeActionDetail??"",c=a.includes("poll_message")||a.includes("get_message"),d=!(i.actionInfo?.actionType==="ai_request")&&(i.status==="thinking"||i.status==="waiting_input")&&(r.currentRuntimeActionType==="idle"||r.currentRuntimeActionType==="mcp")&&c;(i.actionInfo?.actionType||!d)&&(r.currentRuntimeActionType=i.actionInfo?.actionType,r.currentRuntimeActionLabel=i.actionInfo?.actionLabel,r.currentRuntimeActionDetail=i.actionInfo?.actionDetail,r.currentRuntimeActionInput=i.actionInfo?.actionInput),l.info(`[${n.displayName} Adapter] Status changed: ${i.status} for agent ${r.agentId}`,i.actionInfo||""),dn(t,{runtimeStatus:i.status,runtimeActionType:r.currentRuntimeActionType,runtimeActionLabel:r.currentRuntimeActionLabel,runtimeActionDetail:r.currentRuntimeActionDetail});const g=On({actionInfo:i.actionInfo,usage:Z(i.actionInfo)}),p=g?void 0:i.actionInfo?.actionType?i.actionInfo:r.currentRuntimeActionType?{actionType:r.currentRuntimeActionType,actionLabel:r.currentRuntimeActionLabel??"",actionDetail:r.currentRuntimeActionDetail,actionInput:r.currentRuntimeActionInput}:void 0;if(i.status==="compacting"){const C=(Se.get(t)??Promise.resolve()).then(async()=>{for(let I=0;I<=2;I++){if(await $(r.agentId,t,i.status,p,Z(i.actionInfo),{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl})!==void 0)return;I<2&&(l.warn(`[${n.displayName}] compaction sendStatus attempt ${I+1} failed (HTTP), retrying in ${1e3*(I+1)}ms...`),await new Promise(b=>setTimeout(b,1e3*(I+1))))}l.warn(`[${n.displayName}] compaction sendStatus failed after 3 attempts, event may be lost`)}).catch(w=>{l.warn(`[${n.displayName}] compaction status chain error:`,w)});Se.set(t,C),C.finally(()=>{Se.get(t)===C&&Se.delete(t)})}else{const y=d&&!i.actionInfo?.actionType||g;if(wn({status:i.status,actionInfo:i.actionInfo,restoredActionInfo:p,currentRuntimeActionType:r.currentRuntimeActionType,shouldPreservePrevAction:d})){const I=(he.get(t)??Promise.resolve()).then(async()=>{for(let b=0;b<=2;b++){if(await $(r.agentId,t,i.status,y?void 0:p,Z(i.actionInfo),{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl})!==void 0)return;b<2&&await new Promise(x=>setTimeout(x,1e3*(b+1)))}l.warn(`[${n.displayName}] idle tool sendStatus failed after 3 attempts, status may be stale (frontend will fall back to timeline tool_use event)`)}).catch(L=>{l.warn(`[${n.displayName}] idle status chain error:`,L)});he.set(t,I),I.finally(()=>{he.get(t)===I&&he.delete(t)})}else $(r.agentId,t,i.status,y?void 0:p,Z(i.actionInfo),{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl})}if(i.status==="waiting_input"&&r.cachedCapabilitiesActionDetail){const y=r.cachedCapabilitiesActionDetail;r.cachedCapabilitiesActionDetail=void 0,l.info(`[${n.displayName} Adapter] Re-sending cached runtime_capabilities for agent ${r.agentId} (session stabilized to waiting_input)`),$(r.agentId,t,"waiting_input",{actionType:"runtime_capabilities",actionLabel:"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:y},void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl})}}}),e.on("ask-user-question",t=>{const o=f.get(t.sessionId);o&&(l.info(`[${n.displayName} Adapter] AskUserQuestion for agent ${o.agentId}`),on(o.agentId,t.sessionId,Array.isArray(t.questions)?t.questions:[],{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl},t.toolCallId))}),e.on("tool-permission-request",t=>{const o=f.get(t.sessionId);o&&t.requestId&&(l.info(`[${n.displayName} Adapter] Tool permission request (${t.capability}) for agent ${o.agentId}`),rn(o.agentId,t.sessionId,{requestId:t.requestId,capability:t.capability,...t.detail||{}},{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl}))}),e.on("permission-request",t=>{const o=f.get(t.sessionId);if(o){l.info(`[${n.displayName} Adapter] Permission request: ${t.toolName} for agent ${o.agentId}`);const s=t.toolInput?W(JSON.stringify(t.toolInput).slice(0,400)):void 0;$(o.agentId,t.sessionId,"waiting_input",{actionType:"other",actionLabel:"\u6743\u9650\u786E\u8BA4",actionDetail:s||t.toolName},void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})}})}T.post("/start",h,async(e,n)=>{const{agentId:t,workspacePath:o,mode:s="sdk"}=e.body||{};if(!t||!o){n.status(400).json({error:"agentId and workspacePath are required"});return}const r=fn(e),i=pn(e.body?.tenantId??r?.tenantId,e.body?.ownerUserId??e.body?.userId??r?.userId);if(i)try{xt(String(t),i,String(e.body?.userId??"").trim()||void 0)}catch(c){if(c instanceof Error&&c.message.includes("agent-ownership-mismatch")){n.status(403).json({ok:!1,error:"agent-ownership-mismatch"});return}throw c}const a=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||Ye(ct(e))||void 0;if(Jt({agentId:String(t),workspacePath:String(o),serverUrl:e.body?.serverUrl||a,runtimeAccessToken:e.body?.runtimeAccessToken,userId:e.body?.userId,schedulerBaseUrl:a}),e.body?.runtimeFeatures!==null&&e.body?.runtimeFeatures!==void 0&&(Kt(String(t),e.body.runtimeFeatures),l.info(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u80FD\u529B\u5F00\u5173: ${JSON.stringify(Yt(String(t)))}`)),e.body?.inheritedFeatures!==null&&e.body?.inheritedFeatures!==void 0&&(Wt(String(t),e.body.inheritedFeatures),l.info(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u7EE7\u627F\u4E09\u6001\u5C42: ${JSON.stringify(Gt(String(t)))}`)),e.body?.capabilities!==void 0&&zt(String(t),e.body.capabilities),e.body?.capabilitiesInherited!==void 0&&qt(String(t),e.body.capabilitiesInherited),e.body?.envVars!==null&&e.body?.envVars!==void 0&&typeof e.body.envVars=="object"&&(Xt(String(t),e.body.envVars),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u6709\u6548\u73AF\u5883\u53D8\u91CF: ${Object.keys(e.body.envVars).length} \u9879 \u2192 \u5DE5\u5177\u5B50\u8FDB\u7A0B + MCP spec`)),e.body?.agentMeta!==void 0&&(Qt(String(t),e.body.agentMeta),l.info(`[Runtime] agent ${t} \u4E0B\u53D1 agent \u5143\u4FE1\u606F: ${JSON.stringify(e.body.agentMeta)} \u2192 MCP \u4FDD\u7559\u952E\u6CE8\u5165`)),e.body?.changeCacheRetentionDays!==void 0&&(jt(e.body.changeCacheRetentionDays),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u53D8\u66F4\u7F13\u5B58\u4FDD\u7559\u5929\u6570: ${e.body.changeCacheRetentionDays??"\u4E0D\u6E05\u7406"}`)),e.body?.snapshotRetentionDays!==void 0){const c=Pe();sn(e.body.snapshotRetentionDays),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u5FEB\u7167\u4FDD\u7559\u5929\u6570: ${e.body.snapshotRetentionDays??"\u4E0D\u6E05\u7406"}`),c!==Pe()&&vt(Pe())}if(e.body?.logRetentionDays!==void 0){const c=Math.min(Number(e.body.logRetentionDays)||0,7);c>0&&(Vt(c),l.info(`[Runtime] agent ${t} \u4E0B\u53D1\u65E5\u5FD7\u4FDD\u7559\u5929\u6570: ${c}`))}s&&s!=="sdk"&&console.warn(`[Runtime] Unsupported runtime mode "${s}" requested for agent ${t}; starting SDK session instead.`),await _o(e,n)});async function _o(e,n){const{agentId:t,workspacePath:o,command:s,projectRoot:r,autoAccept:i=!0,initialPrompt:a,systemPrompt:c,globalPrompt:u,rolePrompt:d,memory:g,resumeContext:p,resumeTranscript:y,resumeTokenUsage:C,mcpConfigPath:w,extraMcpServers:I,envOverrides:L,idleInputAutoCommand:b,nonInputAutoCommand:K,model:x,instanceAiConfig:_e,subAgentModel:be,subAgentEffort:Ce,scopeKey:Be,browserAllowPrivate:Fe}=e.body||{},z=An(y),re=kn(C);l.info(`[HIBERNATE-IMPORT] \u542F\u52A8\u8BF7\u6C42\u643A\u5E26\u4F11\u7720\u6062\u590D: agentId=${String(t||"").trim()||"?"} resumeContext=${typeof p=="string"?`${p.length}\u5B57`:"\u65E0"} resumeTranscript\u539F\u59CB=${typeof y=="string"?`${y.length}\u5B57`:typeof y} \u89E3\u6790\u7ED3\u679C=${z?`${z.length}\u6761`:"null"} resumeTokenUsage\u89E3\u6790=${re?JSON.stringify(re):"null"}`);let N=!1,se,Ee,Re;{const O=String(t||"").trim();if(O&&!z&&!(typeof p=="string"&&p.trim()))try{const m=await Ot(O);if(m&&Array.isArray(m.transcript)&&m.transcript.length>0){se=m.transcript;const k=m.tokenUsage,P=j=>typeof j=="number"&&Number.isFinite(j)?j:void 0;Ee=k?{...P(k.totalInputTokens)!==void 0?{totalInputTokens:P(k.totalInputTokens)}:{},...P(k.totalOutputTokens)!==void 0?{totalOutputTokens:P(k.totalOutputTokens)}:{},...P(k.cacheHitTokens)!==void 0?{cacheHitTokens:P(k.cacheHitTokens)}:{},...P(k.cacheMissTokens)!==void 0?{cacheMissTokens:P(k.cacheMissTokens)}:{}}:void 0,Re=m.reason==="clean"?pt:_n,N=!0,l.info(`[CRASH-RECOVERY] \u547D\u4E2D\u65AD\u70B9 journal: agentId=${O} reason=${m.reason} savedAt=${m.savedAt} messages=${m.messageCount}`)}}catch(m){l.warn(`[CRASH-RECOVERY] journal \u8BFB\u53D6\u5931\u8D25\uFF08\u6309\u65E0 journal \u5904\u7406\uFF09: agentId=${O}, error=${m instanceof Error?m.message:String(m)}`)}}const J=mn();J.log({level:"info",category:"launch",message:"startSdkSession: \u6536\u5230\u542F\u52A8\u8BF7\u6C42",source:"bridge",agentId:String(t||"").trim()||void 0,details:{reqBodyKeys:Object.keys(e.body||{}),perInstanceAiConfig:_e?pe(_e):null,perAgentModel:x??null}});let R=null;const A=String(t||"").trim(),ie=String(e.body?.runtimeAccessToken||"").trim()||void 0,F=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||Ye(ct(e))||void 0;F?l.info(`[startSdkSession] \u56DE\u8C03\u76EE\u6807 server: ${F} (agentId=${A})`):l.warn(`[startSdkSession] \u672A\u89E3\u6790\u5230 schedulerBaseUrl\uFF0C\u5C06\u56DE\u9000\u5230\u9ED8\u8BA4\u5730\u5740 (agentId=${A})`);try{if(Ao(),!A){n.status(400).json({error:"agentId is required"});return}const O=Tt(A);if(O){n.json(await vn(O));return}const m=await an(A);if(m){const D=await Hn(m);if(!D.reusable)console.warn(`[Runtime] Ignoring stale persisted SDK session for agentId=${A}, sessionId=${m.sessionId}, reason=${D.reason}`),await G(m.sessionId);else{const M=ne(m.runtimeStatus,m.runtimeStatus,m.runtimeActionType);n.json({sessionId:m.sessionId,status:M,runtimeStatus:M,runtimeActionType:m.runtimeActionType,runtimeActionLabel:m.runtimeActionLabel,runtimeActionDetail:m.runtimeActionDetail,agentId:m.agentId,workspacePath:m.workspacePath,command:m.command,mode:m.mode||"sdk",pid:m.pid,reused:!0,persistedOnly:!0});return}}if(V.has(A)){n.status(409).json({error:"SDK session is already starting for this agent"});return}V.add(A);const k=Ct(s),P=_.get(k);R=Mt();const j=Gn(null,L),X=k==="acode"?x?String(x).trim():void 0:(()=>{const D=x?String(x).trim():void 0,M=j.model?String(j.model).trim():void 0;return D||M})();J.log({level:"info",category:"resolve",message:"\u6A21\u578B\u89E3\u6790\u7ED3\u679C",source:"bridge",agentId:A,sessionId:R??void 0,details:{perAgentModel:x??null,globalModel:j.model??null,resolvedModel:X??null,providerId:k,note:k==="acode"?"adapter handles full priority":"request > global"}});const $e={...j.envOverrides};X&&($e.ANTHROPIC_MODEL=X,$e.CODEX_MODEL=X);let Q,we=w;if(k==="acode"){const D=_e||{},M=await Ht({apiOverrides:mt(D)??void 0,agentId:A,sessionId:R??void 0,runtimeBridgeBaseUrl:F});Q=M.instanceConfig.config,we=M.perInstanceConfigPath,J.log({level:"info",category:"apply",message:"prepareAcodeInstanceConfig \u5B8C\u6210",source:"bridge",agentId:A,sessionId:R??void 0,details:{sanitizedApiOverrides:(()=>{const H=mt(D);return H?pe(H):null})(),resolvedInstanceAiConfig:Q?pe(Q):null,perInstanceConfigPath:we,instanceConfigSources:M.instanceConfig.source??null}})}let ve=c||void 0,Oe,De,ae;const ce=N?He(`\uFF08\u65E0\u8FDB\u5EA6\u6458\u8981\uFF1A\u5B8C\u6574\u5BF9\u8BDD\u8BB0\u5F55\u7ECF ${Re===pt?"\u6B63\u5E38\u6536\u5C3E\u843D\u76D8":"\u5D29\u6E83\u524D\u81EA\u52A8\u843D\u76D8"}\u5DF2\u539F\u6837\u63A5\u7EED\uFF09`,Re):typeof p=="string"&&p.trim()?He(p):void 0;if(k==="acode")if(Oe=typeof u=="string"&&u.trim()||void 0,De=typeof d=="string"&&d.trim()||void 0,typeof g=="string"&&g.trim())ae=g.trim();else{const D=await Nt(o,{schedulerBaseUrl:F,runtimeAccessToken:ie,agentId:A});D&&(ae=D,l.info(`[startSdkSession] Auto-loaded memories for ACode agent ${A}`))}else if(typeof u=="string"&&u.trim()||typeof d=="string"&&d.trim()||typeof g=="string"&&g.trim()||ce!==void 0){const M=[u,d,g,ce,c].filter(H=>typeof H=="string"&&H.trim().length>0).map(H=>H.trim());ve=M.length>0?M.join(`
|
|
39
39
|
|
|
40
|
-
`):void 0}const v={command:s||"acode",workingDirectory:o,agentId:A,...Be?{scopeKey:Be}:{},...typeof Fe=="boolean"?{browserAllowPrivate:Fe}:{},autoAccept:!!i,initialPrompt:a,systemPrompt:ve,...Oe!==void 0?{globalPrompt:Oe}:{},...De!==void 0?{rolePrompt:De}:{},...ae!==void 0?{memory:ae}:{},...ce!==void 0?{resumeContext:ce}:{},...k==="acode"&&Array.isArray(N?se:z)&&((N?se:z)?.length??0)>0?{resumeTranscript:N?se:z}:{},...k==="acode"&&!N&&re?{resumeTokenUsage:re}:{},...k==="acode"&&N&&Ee?{resumeTokenUsage:Ee}:{},model:X,mcpConfigPath:we,...Q?{instanceAiConfig:Q}:{},...typeof be=="string"&&be.trim()?{subAgentModel:be.trim()}:{},...typeof Ce=="string"&&Ce.trim()?{subAgentEffort:Ce.trim()}:{},extraMcpServers:I||{},envOverrides:Tt(String(t),String(o),process.env,$e,typeof r=="string"?r:void 0)};J.log({level:"info",category:"launch",message:"\u4F20\u9012\u7ED9 Adapter \u7684\u5B8C\u6574 AdapterSessionConfig",source:"bridge",agentId:A,sessionId:R,details:{adapterModel:v.model??null,adapterInstanceAiConfig:v.instanceAiConfig?pe(v.instanceAiConfig):null,adapterMcpConfigPath:v.mcpConfigPath??null}}),await J.flush(),f.set(R,{agentId:A,workspacePath:o,sessionId:R,config:v,providerId:k,seq:0,runtimeAccessToken:ie,schedulerBaseUrl:F}),N&&$(A,R,"starting",{actionType:"hibernation_wake",actionLabel:"\u4F11\u7720\u5524\u9192\u4E2D",actionDetail:"\u68C0\u6D4B\u5230\u4E0A\u6B21\u8FD0\u884C\u5F02\u5E38\u4E2D\u65AD\u7684\u672C\u5730\u8FDB\u5EA6\uFF0C\u6B63\u5728\u63A5\u7EED\u4E0A\u4E0B\u6587\u2026",actionId:`crash-recovery-${R}`},void 0,{runtimeAccessToken:ie,schedulerBaseUrl:F}).catch(()=>{}),n.json({sessionId:R,status:"starting",runtimeStatus:"starting",agentId:A,workspacePath:o,command:v.command,mode:"sdk"}),_o({sessionId:R,agentId:A,config:v,adapter:L,providerId:k,idleInputAutoCommand:b,nonInputAutoCommand:K,runtimeAccessToken:ie,requestedSchedulerBaseUrl:F})}catch(O){if(R&&(U(R),f.delete(R),q(R)),A&&V.delete(A),!n.headersSent){const m=O instanceof Error?O.message:String(O);n.status(500).json({error:`Failed to start SDK session: ${m}`})}}}async function _o(e){const{sessionId:n,agentId:t,config:o,adapter:s,providerId:r,idleInputAutoCommand:i,nonInputAutoCommand:a,runtimeAccessToken:c,requestedSchedulerBaseUrl:u}=e;try{await s.startSession(n,o),s.setIdleCommands?.(n,{idleInputCommand:i||We,nonInputCommand:a||""});let d;if(Cn(r))try{if(await new Promise(p=>setTimeout(p,500)),d=s.getSessionPid?.(n),!d){const y=(await Qt()).find(C=>C.agentId===t||C.cwd===o.workingDirectory||C.command.includes(o.workingDirectory));y&&(d=y.pid,l.info(`[Runtime] Found SDK process PID: ${d} for agentId=${t}`))}}catch(p){console.warn(`[Runtime] Failed to get SDK PID for agentId=${t}:`,p)}const g=ne(s.getSessionStatus(n),f.get(n)?.currentRuntimeStatus,f.get(n)?.currentRuntimeActionType);await dn({sessionId:n,agentId:t,workspacePath:o.workingDirectory,command:o.command,startedAt:new Date().toISOString(),status:"running",runtimeStatus:g,mode:"sdk",pid:d,providerSessionId:s.getProviderSessionId(n)}),d&&await Pe().startProcess({agentId:t,sessionId:n,pid:d,mode:"sdk",workspacePath:o.workingDirectory,command:o.command}),await bo({agentId:t,sessionId:n,sdkPid:d,status:g,schedulerBaseUrl:u,runtimeAccessToken:c})}catch(d){U(n),f.delete(n),q(n),await G(n);const g=d instanceof Error?d.message:String(d);console.error(`[Runtime] Background SDK session startup failed for agentId=${t}: ${g}`),await Co({agentId:t,sessionId:n,schedulerBaseUrl:u,runtimeAccessToken:c,errorMessage:g})}finally{V.delete(t)}}async function bo(e){const{agentId:n,sessionId:t,sdkPid:o,status:s,schedulerBaseUrl:r,runtimeAccessToken:i}=e;if(!r||!i){l.debug(`[Runtime] notifyServerSessionReady skipped: missing schedulerBaseUrl or runtimeAccessToken for agentId=${n}`);return}const a=`${r.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Ke.post(a,{agentId:n,sessionId:t,status:s,pid:o},{headers:{"X-Runtime-Token":i,"Content-Type":"application/json"},timeout:5e3}),l.debug(`[Runtime] Notified server session ready: agentId=${n}, sessionId=${t}, status=${s}`)}catch(c){const u=c instanceof Error?c.message:String(c);l.warn(`[Runtime] Failed to notify server session ready: agentId=${n}, error=${u}`)}}async function Co(e){const{agentId:n,sessionId:t,schedulerBaseUrl:o,runtimeAccessToken:s}=e;if(!o||!s)return;const r=`${o.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Ke.post(r,{agentId:n,sessionId:t,status:"stopped"},{headers:{"X-Runtime-Token":s,"Content-Type":"application/json"},timeout:5e3}),l.debug(`[Runtime] Notified server session failed: agentId=${n}, sessionId=${t}`)}catch(i){const a=i instanceof Error?i.message:String(i);l.warn(`[Runtime] Failed to notify server session failed: agentId=${n}, error=${a}`)}}T.post("/sdk/message",h,async(e,n)=>{const{sessionId:t,message:o}=e.body||{};if(!t||!o){n.status(400).json({error:"sessionId and message are required"});return}const s=f.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const r=s.providerId||"claude-code";await _.get(r).sendMessage(t,o),n.json({ok:!0})}catch(r){const i=r instanceof Error?r.message:String(r);n.status(500).json({error:i})}}),T.post("/sdk/answer",h,async(e,n)=>{const{sessionId:t,answers:o,cancelled:s,reason:r}=e.body||{},i=s===!0;if(!t||!i&&!o){n.status(400).json({error:i?"sessionId is required":"sessionId and answers are required"});return}const a=f.get(t);if(!a){n.status(404).json({error:"SDK session not found"});return}try{const c=a.providerId||"claude-code",u=_.get(c);if(i){if(!u.cancelQuestionAnswer){n.status(400).json({error:"adapter does not support cancelling a question"});return}l.debug(`[sdk/answer] cancel question: sessionId=${t}, providerId=${c}, hasReason=${!!String(r||"").trim()}`),await u.cancelQuestionAnswer(t,typeof r=="string"?r:void 0)}else u.sendQuestionAnswer&&await u.sendQuestionAnswer(t,o);n.json({ok:!0})}catch(c){const u=c instanceof Error?c.message:String(c);n.status(500).json({error:u})}}),T.post("/tool-auth/answer",h,async(e,n)=>{const{sessionId:t,requestId:o,allowed:s}=e.body||{};if(!t||!o){n.status(400).json({error:"sessionId and requestId are required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const i=r.providerId||"claude-code",a=_.get(i);if(!a.submitToolPermissionDecision){n.status(400).json({error:"adapter does not support tool authorization"});return}const c=a.submitToolPermissionDecision(t,String(o),!!s);n.json({ok:!0,existed:c})}catch(i){const a=i instanceof Error?i.message:String(i);n.status(500).json({error:a})}}),T.get("/tool-auth/pending/:sessionId",h,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code",i=_.get(s).getPendingToolAuthRequests?.(t)??[];n.json({ok:!0,sessionId:t,agentId:o.agentId,pendingRequests:i,fetchedAt:Date.now()})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.post("/sdk/confirm",h,async(e,n)=>{const{sessionId:t,accept:o}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const s=f.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const r=s.providerId||"claude-code";await _.get(r).sendConfirmation(t,!!o),n.json({ok:!0})}catch(r){const i=r instanceof Error?r.message:String(r);n.status(500).json({error:i})}}),T.post("/sdk/abort",h,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code";await _.get(s).abortCurrentTurn(t),n.json({ok:!0})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.post("/sdk/stop",h,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.json({ok:!0,status:"stopped"});return}try{const s=o.providerId||"claude-code",r=_.get(s);r.abortCurrentTurn(t).catch(()=>{}),await r.terminateSession(t),U(t),f.delete(t),q(t),Ie(t),fe(o.agentId),await G(t),await Pe().removeProcess(o.agentId),await $(o.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl}),n.json({ok:!0,status:"stopped"})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.get("/sdk/snapshot/:sessionId",h,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code",r=_.get(s),i=r.getConversation(t),a=Sn(i);let c=null;if(s==="acode"){const d=r;typeof d.exportRawTranscript!="function"?l.warn(`[HIBERNATE-EXPORT] adapter \u65E0 exportRawTranscript \u65B9\u6CD5 \u2014 bridge \u8FDB\u7A0B\u53EF\u80FD\u8FD0\u884C\u7684\u662F\u65E7\u6784\u5EFA\uFF08\u8BF7\u91CD\u542F bridge\uFF09\u3002providerId=${s}`):(c=d.exportRawTranscript?.(t)??null,c===null&&l.warn(`[HIBERNATE-EXPORT] exportRawTranscript \u8FD4\u56DE\u7A7A \u2014 runtime \u53EF\u80FD\u672A\u5B8C\u6210 start() \u6216\u4E0D\u652F\u6301\u3002providerId=${s}`))}else l.info(`[HIBERNATE-EXPORT] provider=${s} \u4E0D\u652F\u6301\u5B8C\u6574\u91CD\u653E\uFF0C\u6309\u4EC5\u6458\u8981\u4F11\u7720`);const u=r.getTotalUsage?.(t);l.info(`[HIBERNATE-EXPORT] \u5FEB\u7167\u5BFC\u51FA: sessionId=${t} agentId=${o.agentId} providerId=${s} messages=${i.length} summaryChars=${a.snapshot.length} truncated=${a.truncated} transcript=${c?`${c.length}\u6761`:"null"} usage=${u?`in=${u.inputTokens??"?"}/out=${u.outputTokens??"?"}`:"null"} totalUsage=${u?`in=${u.totalInputTokens??"?"}/out=${u.totalOutputTokens??"?"}`:"null"}`),n.json({sessionId:t,agentId:o.agentId,workspacePath:o.workspacePath,messageCount:i.length,truncated:a.truncated,snapshot:a.snapshot,transcript:c,tokenUsage:u?{inputTokens:u.inputTokens??null,outputTokens:u.outputTokens??null,totalInputTokens:u.totalInputTokens??null,totalOutputTokens:u.totalOutputTokens??null,cacheHitTokens:u.cacheHitTokens??null,cacheMissTokens:u.cacheMissTokens??null}:null,providerId:s})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.get("/sdk/status/:sessionId",h,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code",r=_.get(s),i=r.getSessionStatus(t),a=r.getConversation(t);n.json({sessionId:t,status:i,agentId:o.agentId,workspacePath:o.workspacePath,messageCount:a.length})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.get("/sdk/capabilities/:sessionId",h,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code",i=_.get(s).getCapabilities?.(t)??null;n.json({ok:!0,sessionId:t,agentId:o.agentId,capabilities:i,fetchedAt:Date.now()})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.get("/sdk/pending-questions/:sessionId",h,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code",i=_.get(s).getPendingQuestion?.(t)??null;n.json({ok:!0,sessionId:t,agentId:o.agentId,pendingQuestion:i?{toolCallId:i.toolCallId,questions:i.questions}:null,fetchedAt:Date.now()})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.post("/command",h,async(e,n)=>{const{sessionId:t,command:o}=e.body||{};if(!t||o===void 0||o===null){n.status(400).json({error:"sessionId and command are required"});return}try{const s=await zn(String(t),o);n.json({ok:!0,mode:"terminal",...s})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}});function Eo(e,n){if(typeof e!="string"||!e||!n||typeof n!="object")return e;const{userId:t,name:o,type:s}=n,r=typeof t=="string"&&t.trim()?t.trim():"",i=typeof o=="string"&&o.trim()?o.trim():r;if(!r&&!i)return e;const a=typeof s=="string"&&s.trim()?s.trim().toUpperCase():"HUMAN",c=i||r,u=r?`, userId: ${r}`:"";return`\u3010${c}\uFF08${a}${u}\uFF09\u53D1\u6765\u3011
|
|
41
|
-
${e}`}T.post("/input",h,async(e,n)=>{const{sessionId:t,input:o,mode:s,sender:r}=e.body||{};if(!t||o===void 0||o===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=_.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(o)),n.json({ok:!0,mode:"shortcut"});return}await c.sendMessage(t,
|
|
40
|
+
`):void 0}const v={command:s||"acode",workingDirectory:o,agentId:A,...Be?{scopeKey:Be}:{},...typeof Fe=="boolean"?{browserAllowPrivate:Fe}:{},autoAccept:!!i,initialPrompt:a,systemPrompt:ve,...Oe!==void 0?{globalPrompt:Oe}:{},...De!==void 0?{rolePrompt:De}:{},...ae!==void 0?{memory:ae}:{},...ce!==void 0?{resumeContext:ce}:{},...k==="acode"&&Array.isArray(N?se:z)&&((N?se:z)?.length??0)>0?{resumeTranscript:N?se:z}:{},...k==="acode"&&!N&&re?{resumeTokenUsage:re}:{},...k==="acode"&&N&&Ee?{resumeTokenUsage:Ee}:{},model:X,mcpConfigPath:we,...Q?{instanceAiConfig:Q}:{},...typeof be=="string"&&be.trim()?{subAgentModel:be.trim()}:{},...typeof Ce=="string"&&Ce.trim()?{subAgentEffort:Ce.trim()}:{},extraMcpServers:I||{},envOverrides:At(String(t),String(o),process.env,$e,typeof r=="string"?r:void 0)};J.log({level:"info",category:"launch",message:"\u4F20\u9012\u7ED9 Adapter \u7684\u5B8C\u6574 AdapterSessionConfig",source:"bridge",agentId:A,sessionId:R,details:{adapterModel:v.model??null,adapterInstanceAiConfig:v.instanceAiConfig?pe(v.instanceAiConfig):null,adapterMcpConfigPath:v.mcpConfigPath??null}}),await J.flush(),f.set(R,{agentId:A,workspacePath:o,sessionId:R,config:v,providerId:k,seq:0,runtimeAccessToken:ie,schedulerBaseUrl:F}),N&&$(A,R,"starting",{actionType:"hibernation_wake",actionLabel:"\u4F11\u7720\u5524\u9192\u4E2D",actionDetail:"\u68C0\u6D4B\u5230\u4E0A\u6B21\u8FD0\u884C\u5F02\u5E38\u4E2D\u65AD\u7684\u672C\u5730\u8FDB\u5EA6\uFF0C\u6B63\u5728\u63A5\u7EED\u4E0A\u4E0B\u6587\u2026",actionId:`crash-recovery-${R}`},void 0,{runtimeAccessToken:ie,schedulerBaseUrl:F}).catch(()=>{}),n.json({sessionId:R,status:"starting",runtimeStatus:"starting",agentId:A,workspacePath:o,command:v.command,mode:"sdk"}),bo({sessionId:R,agentId:A,config:v,adapter:P,providerId:k,idleInputAutoCommand:b,nonInputAutoCommand:K,runtimeAccessToken:ie,requestedSchedulerBaseUrl:F})}catch(O){if(R&&(U(R),f.delete(R),q(R)),A&&V.delete(A),!n.headersSent){const m=O instanceof Error?O.message:String(O);n.status(500).json({error:`Failed to start SDK session: ${m}`})}}}async function bo(e){const{sessionId:n,agentId:t,config:o,adapter:s,providerId:r,idleInputAutoCommand:i,nonInputAutoCommand:a,runtimeAccessToken:c,requestedSchedulerBaseUrl:u}=e;try{await s.startSession(n,o),s.setIdleCommands?.(n,{idleInputCommand:i||We,nonInputCommand:a||""});let d;if(En(r))try{if(await new Promise(p=>setTimeout(p,500)),d=s.getSessionPid?.(n),!d){const y=(await Zt()).find(C=>C.agentId===t||C.cwd===o.workingDirectory||C.command.includes(o.workingDirectory));y&&(d=y.pid,l.info(`[Runtime] Found SDK process PID: ${d} for agentId=${t}`))}}catch(p){console.warn(`[Runtime] Failed to get SDK PID for agentId=${t}:`,p)}const g=ne(s.getSessionStatus(n),f.get(n)?.currentRuntimeStatus,f.get(n)?.currentRuntimeActionType);await ln({sessionId:n,agentId:t,workspacePath:o.workingDirectory,command:o.command,startedAt:new Date().toISOString(),status:"running",runtimeStatus:g,mode:"sdk",pid:d,providerSessionId:s.getProviderSessionId(n)}),d&&await Le().startProcess({agentId:t,sessionId:n,pid:d,mode:"sdk",workspacePath:o.workingDirectory,command:o.command}),await Co({agentId:t,sessionId:n,sdkPid:d,status:g,schedulerBaseUrl:u,runtimeAccessToken:c})}catch(d){U(n),f.delete(n),q(n),await G(n);const g=d instanceof Error?d.message:String(d);console.error(`[Runtime] Background SDK session startup failed for agentId=${t}: ${g}`),await Eo({agentId:t,sessionId:n,schedulerBaseUrl:u,runtimeAccessToken:c,errorMessage:g})}finally{V.delete(t)}}async function Co(e){const{agentId:n,sessionId:t,sdkPid:o,status:s,schedulerBaseUrl:r,runtimeAccessToken:i}=e;if(!r||!i){l.debug(`[Runtime] notifyServerSessionReady skipped: missing schedulerBaseUrl or runtimeAccessToken for agentId=${n}`);return}const a=`${r.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Ke.post(a,{agentId:n,sessionId:t,status:s,pid:o},{headers:{"X-Runtime-Token":i,"Content-Type":"application/json"},timeout:5e3}),l.debug(`[Runtime] Notified server session ready: agentId=${n}, sessionId=${t}, status=${s}`)}catch(c){const u=c instanceof Error?c.message:String(c);l.warn(`[Runtime] Failed to notify server session ready: agentId=${n}, error=${u}`)}}async function Eo(e){const{agentId:n,sessionId:t,schedulerBaseUrl:o,runtimeAccessToken:s}=e;if(!o||!s)return;const r=`${o.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await Ke.post(r,{agentId:n,sessionId:t,status:"stopped"},{headers:{"X-Runtime-Token":s,"Content-Type":"application/json"},timeout:5e3}),l.debug(`[Runtime] Notified server session failed: agentId=${n}, sessionId=${t}`)}catch(i){const a=i instanceof Error?i.message:String(i);l.warn(`[Runtime] Failed to notify server session failed: agentId=${n}, error=${a}`)}}T.post("/sdk/message",h,async(e,n)=>{const{sessionId:t,message:o}=e.body||{};if(!t||!o){n.status(400).json({error:"sessionId and message are required"});return}const s=f.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const r=s.providerId||"claude-code";await _.get(r).sendMessage(t,o),n.json({ok:!0})}catch(r){const i=r instanceof Error?r.message:String(r);n.status(500).json({error:i})}}),T.post("/sdk/answer",h,async(e,n)=>{const{sessionId:t,answers:o,cancelled:s,reason:r}=e.body||{},i=s===!0;if(!t||!i&&!o){n.status(400).json({error:i?"sessionId is required":"sessionId and answers are required"});return}const a=f.get(t);if(!a){n.status(404).json({error:"SDK session not found"});return}try{const c=a.providerId||"claude-code",u=_.get(c);if(i){if(!u.cancelQuestionAnswer){n.status(400).json({error:"adapter does not support cancelling a question"});return}l.debug(`[sdk/answer] cancel question: sessionId=${t}, providerId=${c}, hasReason=${!!String(r||"").trim()}`),await u.cancelQuestionAnswer(t,typeof r=="string"?r:void 0)}else u.sendQuestionAnswer&&await u.sendQuestionAnswer(t,o);n.json({ok:!0})}catch(c){const u=c instanceof Error?c.message:String(c);n.status(500).json({error:u})}}),T.post("/tool-auth/answer",h,async(e,n)=>{const{sessionId:t,requestId:o,allowed:s}=e.body||{};if(!t||!o){n.status(400).json({error:"sessionId and requestId are required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const i=r.providerId||"claude-code",a=_.get(i);if(!a.submitToolPermissionDecision){n.status(400).json({error:"adapter does not support tool authorization"});return}const c=a.submitToolPermissionDecision(t,String(o),!!s);n.json({ok:!0,existed:c})}catch(i){const a=i instanceof Error?i.message:String(i);n.status(500).json({error:a})}}),T.get("/tool-auth/pending/:sessionId",h,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code",i=_.get(s).getPendingToolAuthRequests?.(t)??[];n.json({ok:!0,sessionId:t,agentId:o.agentId,pendingRequests:i,fetchedAt:Date.now()})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.post("/sdk/confirm",h,async(e,n)=>{const{sessionId:t,accept:o}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const s=f.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const r=s.providerId||"claude-code";await _.get(r).sendConfirmation(t,!!o),n.json({ok:!0})}catch(r){const i=r instanceof Error?r.message:String(r);n.status(500).json({error:i})}}),T.post("/sdk/abort",h,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code";await _.get(s).abortCurrentTurn(t),n.json({ok:!0})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.post("/sdk/stop",h,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.json({ok:!0,status:"stopped"});return}try{const s=o.providerId||"claude-code",r=_.get(s);r.abortCurrentTurn(t).catch(()=>{}),await r.terminateSession(t),U(t),f.delete(t),q(t),Ie(t),fe(o.agentId),await G(t),await Le().removeProcess(o.agentId),await $(o.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl}),n.json({ok:!0,status:"stopped"})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.get("/sdk/snapshot/:sessionId",h,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code",r=_.get(s),i=r.getConversation(t),a=hn(i);let c=null;if(s==="acode"){const d=r;typeof d.exportRawTranscript!="function"?l.warn(`[HIBERNATE-EXPORT] adapter \u65E0 exportRawTranscript \u65B9\u6CD5 \u2014 bridge \u8FDB\u7A0B\u53EF\u80FD\u8FD0\u884C\u7684\u662F\u65E7\u6784\u5EFA\uFF08\u8BF7\u91CD\u542F bridge\uFF09\u3002providerId=${s}`):(c=d.exportRawTranscript?.(t)??null,c===null&&l.warn(`[HIBERNATE-EXPORT] exportRawTranscript \u8FD4\u56DE\u7A7A \u2014 runtime \u53EF\u80FD\u672A\u5B8C\u6210 start() \u6216\u4E0D\u652F\u6301\u3002providerId=${s}`))}else l.info(`[HIBERNATE-EXPORT] provider=${s} \u4E0D\u652F\u6301\u5B8C\u6574\u91CD\u653E\uFF0C\u6309\u4EC5\u6458\u8981\u4F11\u7720`);const u=r.getTotalUsage?.(t);l.info(`[HIBERNATE-EXPORT] \u5FEB\u7167\u5BFC\u51FA: sessionId=${t} agentId=${o.agentId} providerId=${s} messages=${i.length} summaryChars=${a.snapshot.length} truncated=${a.truncated} transcript=${c?`${c.length}\u6761`:"null"} usage=${u?`in=${u.inputTokens??"?"}/out=${u.outputTokens??"?"}`:"null"} totalUsage=${u?`in=${u.totalInputTokens??"?"}/out=${u.totalOutputTokens??"?"}`:"null"}`),n.json({sessionId:t,agentId:o.agentId,workspacePath:o.workspacePath,messageCount:i.length,truncated:a.truncated,snapshot:a.snapshot,transcript:c,tokenUsage:u?{inputTokens:u.inputTokens??null,outputTokens:u.outputTokens??null,totalInputTokens:u.totalInputTokens??null,totalOutputTokens:u.totalOutputTokens??null,cacheHitTokens:u.cacheHitTokens??null,cacheMissTokens:u.cacheMissTokens??null}:null,providerId:s})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.get("/sdk/status/:sessionId",h,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code",r=_.get(s),i=r.getSessionStatus(t),a=r.getConversation(t);n.json({sessionId:t,status:i,agentId:o.agentId,workspacePath:o.workspacePath,messageCount:a.length})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.get("/sdk/capabilities/:sessionId",h,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code",i=_.get(s).getCapabilities?.(t)??null;n.json({ok:!0,sessionId:t,agentId:o.agentId,capabilities:i,fetchedAt:Date.now()})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.get("/sdk/pending-questions/:sessionId",h,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const s=o.providerId||"claude-code",i=_.get(s).getPendingQuestion?.(t)??null;n.json({ok:!0,sessionId:t,agentId:o.agentId,pendingQuestion:i?{toolCallId:i.toolCallId,questions:i.questions}:null,fetchedAt:Date.now()})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}}),T.post("/command",h,async(e,n)=>{const{sessionId:t,command:o}=e.body||{};if(!t||o===void 0||o===null){n.status(400).json({error:"sessionId and command are required"});return}try{const s=await Wn(String(t),o);n.json({ok:!0,mode:"terminal",...s})}catch(s){const r=s instanceof Error?s.message:String(s);n.status(500).json({error:r})}});function Ro(e,n){if(typeof e!="string"||!e||!n||typeof n!="object")return e;const{userId:t,name:o,type:s}=n,r=typeof t=="string"&&t.trim()?t.trim():"",i=typeof o=="string"&&o.trim()?o.trim():r;if(!r&&!i)return e;const a=typeof s=="string"&&s.trim()?s.trim().toUpperCase():"HUMAN",c=i||r,u=r?`, userId: ${r}`:"";return`\u3010${c}\uFF08${a}${u}\uFF09\u53D1\u6765\u3011
|
|
41
|
+
${e}`}T.post("/input",h,async(e,n)=>{const{sessionId:t,input:o,mode:s,sender:r}=e.body||{};if(!t||o===void 0||o===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=_.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(o)),n.json({ok:!0,mode:"shortcut"});return}await c.sendMessage(t,Ro(await Yn(o),r)),n.json({ok:!0,mode:"sdk"})}catch(a){const c=a instanceof Error?a.message:String(a);n.status(500).json({error:c})}}),T.post("/update-auto-commands",h,async(e,n)=>{const{agentId:t,idleInputAutoCommand:o="",nonInputAutoCommand:s=""}=e.body||{},r=String(t||"").trim();if(!r){n.status(400).json({error:"agentId is required"});return}const i=[...f.values()].find(c=>c.agentId===r),a={idleInputCommand:String(o||"").trim()||We,nonInputCommand:String(s||"")};try{let c=!1;i&&(_.get(i.providerId||"claude-code").setIdleCommands?.(i.sessionId,a),c=!0);const u=await un(r,{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})}}),T.post("/resize",h,(e,n)=>{const{sessionId:t,cols:o,rows:s}=e.body||{};if(!t||!o||!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(o),rows:Number(s)})}),T.post("/reset-context",h,async(e,n)=>{const{sessionId:t,reason:o}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const s=f.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}const r=s.providerId||"claude-code",i=_.get(r),a=i.resetContext?.bind(i),c=Cn(r,!!a);if(!c.supported){n.status(c.statusCode).json({error:c.error});return}if(!a){n.status(500).json({error:"ACode adapter does not expose resetContext"});return}try{await a(String(t));const u=ne(i.getSessionStatus(String(t)),s.currentRuntimeStatus,s.currentRuntimeActionType);n.json({ok:!0,contextReset:!0,sessionId:t,status:u,runtimeStatus:u,agentId:s.agentId,mode:"sdk",providerId:r,reason:typeof o=="string"&&o.trim()?o.trim():void 0})}catch(u){const d=u instanceof Error?u.message:String(u);n.status(500).json({ok:!1,contextReset:!1,mode:"sdk",error:d})}}),T.post("/compact-context",h,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({ok:!1,error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({ok:!1,error:"SDK session not found"});return}const s=o.providerId||"claude-code",r=_.get(s),i=r.compactContext?.bind(r);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=ne(r.getSessionStatus(String(t)),o.currentRuntimeStatus,o.currentRuntimeActionType);n.json({ok:!0,requested:!0,compacted:!0,sessionId:t,agentId:o.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})}}),T.post("/stop",h,async(e,n)=>{const{sessionId:t}=e.body||{},o=Rn(e.body);if(!t&&!o.discardContext){n.status(400).json({error:"sessionId is required"});return}const s=t?f.get(t):void 0;if(!s){if(o.discardContext){const i=typeof(e.body||{})?.agentId=="string"?e.body.agentId:void 0;i&&await wt(i).catch(()=>{})}t&&await G(t),n.json({ok:!0,status:"stopped",mode:"none",statusNotified:!1,reason:o.reason});return}const r=s.agentId;try{l.info(`[Runtime] Stopping SDK session ${t}; suppressStatus=${!o.statusNotified}, reason=${o.reason||"unspecified"}`);const i=s.providerId||"claude-code",a=_.get(i);a.abortCurrentTurn(t).catch(()=>{}),await a.terminateSession(t,{discardContext:o.discardContext}),U(t),f.delete(t),q(t),Ie(t),fe(r),await G(t),await Le().removeProcess(r),o.statusNotified?await $(r,null,"stopped",void 0,void 0,{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl}):l.info(`[Runtime] Stopped status notification suppressed for SDK session ${t}; reason=${o.reason||"unspecified"}`),n.json({ok:!0,status:"stopped",mode:"sdk",statusNotified:o.statusNotified,reason:o.reason})}catch(i){const a=i instanceof Error?i.message:String(i);console.error(`[Runtime] Failed to terminate SDK session ${t}:`,a),n.status(500).json({ok:!1,status:"stop_failed",mode:"sdk",error:a})}}),T.post("/stop-all",h,async(e,n)=>{const t=[],o=[];for(const[s,r]of f.entries())try{const i=r.providerId||"claude-code",a=_.get(i);a.abortCurrentTurn(s).catch(()=>{}),await a.terminateSession(s),U(s),f.delete(s),q(s),Ie(s),fe(r.agentId),t.push(s),await $(r.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl})}catch(i){const a=i instanceof Error?i.message:String(i);o.push(`SDK ${s}: ${a}`)}try{await cn([]),l.info("[Runtime] \u5DF2\u6E05\u7A7A\u6240\u6709\u6301\u4E45\u5316\u4F1A\u8BDD")}catch(s){const r=s instanceof Error?s.message:String(s);o.push(`Persistence: ${r}`)}n.json({ok:!0,stopped:{sdk:t.length},errors:o.length>0?o:void 0})}),T.get("/events/last/:n",h,(e,n)=>{const t=parseInt(e.params.n,10);if(!Number.isFinite(t)||t<1){n.status(400).json({error:":n must be a positive integer"});return}const o=at.getLastN(t);n.json({ok:!0,count:o.length,entries:o})}),T.get("/events/since/:index",h,(e,n)=>{const t=parseInt(e.params.index,10);if(!Number.isFinite(t)||t<0){n.status(400).json({error:":index must be a non-negative integer"});return}const o=at.getSinceIndex(t);n.json({ok:!0,entries:o.entries,nextIndex:o.nextIndex,oldestIndex:o.oldestIndex,dataLoss:o.oldestIndex>t+1})}),T.get("/events/push-stats",h,(e,n)=>{const t=Bt();n.json({ok:!0,count:t.length,agents:t})});export{pt as CRASH_RECOVERY_NOTICE_CLEAN,_n as CRASH_RECOVERY_NOTICE_INTERRUPTED,Mn as buildAcodeCommandOutputPath,Gn as buildClaudeCodeLaunchConfig,At as buildRuntimeEnv,eo as buildSdkOutputMetadata,Qn as buildToolResultTimelineActionInfo,cr as cleanupSdkSessionByAgentId,Ln as countTerminalOutputLines,ht as createTerminalOutputDecoder,ye as decodeTerminalOutputChunk,ho as enqueueCompactionSummaryChunk,Hn as evaluatePersistedSessionReuse,je as flushCompactionSummaryAccumulator,Un as formatCommandInactivityTimeoutNotice,Pn as formatCommandOutputSpilloverNotice,Zn as formatSdkOutputEvent,Ue as formatTerminalPrompt,wn as isIdleStatusChangeRetryable,On as isUsageOnlyStatusChange,xn as normalizeTerminalCommandInput,kn as parseResumeTokenUsage,An as parseResumeTranscript,Rn as parseRuntimeStopOptions,Bn as parseTerminalDirectoryChangeTarget,Te as raceSendOutputWithRetry,hn as renderSessionSnapshot,Cn as resolveRuntimeContextResetSupport,fo as resolveRuntimeStatusFromProviderEvent,Yn as resolveSdkInputMessage,Ct as resolveSdkProviderId,ne as resolveSdkSessionDisplayStatus,$n as resolveStatusChangeRuntimeState,Z as resolveStatusChangeUsage,Nn as resolveTerminalOutputEncoding,f as sdkSessions,En as shouldProbeSdkProcessPid,T as terminalRouter,Ro as withSenderSignature};
|
|
42
42
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"node:path";import{pathToFileURL as m}from"node:url";import{logger as o}from"../utils/logger.js";import{getReleasedAcodeEntryPath as
|
|
1
|
+
import e from"node:path";import{pathToFileURL as m}from"node:url";import{loadDynamicModule as g}from"../utils/dynamic-import.js";import{logger as o}from"../utils/logger.js";import{getReleasedAcodeEntryPath as c}from"./acode-package.js";let a=null;function s(){return a||(a=(async()=>{try{const r=c(),t=e.join(e.dirname(r),"background-command-manager.js"),n=await g(m(t).href);return n.backgroundCommandManager?n.backgroundCommandManager:(o.warn("[acode-bg-manager] manager \u5355\u4F8B\u7F3A\u5931\uFF0C\u540E\u53F0\u547D\u4EE4\u8BE6\u60C5/\u6D41\u4E0D\u53EF\u7528"),null)}catch(r){return o.warn("[acode-bg-manager] \u52A0\u8F7D manager \u5931\u8D25: %s",r?.message),null}})().then(r=>(r||(a=null),r))),a}export{s as getAcodeBgManager};
|
|
2
2
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{randomBytes as ce}from"node:crypto";import p from"node:fs";import w from"node:os";import $ from"axios";import{v4 as ue}from"uuid";import{getActiveBridgeHttpPort as de,getAutoRegisterConfigFilePath as T,isDesktopAppMode as le,schedulerBaseUrl as m}from"../config.js";import{runExclusiveConfigWrite as D}from"../utils/config-write-queue.js";import{logger as a}from"../utils/logger.js";import{buildTargetKey as x,fingerprintUserKey as fe,serverUrlOfTargetKey as F}from"../utils/target-identity.js";import{clearRuntimeBinding as ge,clearScopedRuntimeAccessToken as me,getRuntimeAccessToken as G,getRuntimeBindingPublicState as pe,getScopedRuntimeAccessToken as Y,listScopedRuntimeAccessTokens as ye,loadRuntimeBinding as M,normalizeSchedulerBaseUrl as S,saveRuntimeBinding as H,saveScopedRuntimeAccessToken as V}from"./runtime-binding.js";const X={enabled:!1,serverUrl:m,preferSameLanIp:!0,maxRetries:3,retryInterval:2e3},d={registered:!1,registrations:{}};let k=[];const Ie=10*60*1e3,B=new Map;function Q(){const e=Date.now();for(const[r,t]of B)t.expiresAt<=e&&B.delete(r)}function Je(){Q();const e=[...k];for(const r of B.values())r.key&&!e.includes(r.key)&&e.push(r.key);return e}function qe(e){const r=String(e||"").trim();if(!r)return[];const t=h(),n=t.filter(i=>String(i.connectionKey||"").trim()===r);if(n.length>0)return n;Q();const o=new Set;for(const[i,s]of B)s.key===r&&o.add(i);return o.size===0?[]:t.filter(i=>o.has(N(i)))}function Ye(){return k[0]??""}const Ae=3e4;function Z(){const e=Number(process.env.AWS_REGISTER_BACKGROUND_RETRY_INTERVAL);return Number.isFinite(e)&&e>0?e:Ae}const C=new Map;function ee(e){const r=e.serverUrl||m,t=N(e)||r;if(C.has(t))return;const n=setTimeout(()=>{C.delete(t),Re(e,t)},Z());n.unref?.(),C.set(t,n)}async function Re(e,r){try{const t=h().find(n=>N(n)===r)||e;await q(t,{backgroundRetry:!0})}catch(t){a.warn(`[AutoRegister] \u540E\u53F0\u91CD\u8BD5\u6CE8\u518C\u5F02\u5E38: ${t.message}`),ee(e)}}function He(){for(const e of C.values())clearTimeout(e);C.clear()}function Te(e){const r=e.trim();if(r.length<8)return r;for(let t=1;t<=r.length/2;t++){if(r.length%t!==0)continue;const n=r.slice(0,t);let o=!0;for(let i=t;i<r.length;i+=t)if(r.slice(i,i+t)!==n){o=!1;break}if(o&&n.length<r.length)return n}return r}function Se(e){const r=g(e);if(!r)return r;const t=Te(r);return t!==r&&a.warn(`[AutoRegister] userKey \u7591\u4F3C\u88AB\u590D\u5236\u4E86\u4E24\u904D\uFF08\u957F\u5EA6 ${r.length} \u2192 ${t.length}\uFF09\uFF0C\u5DF2\u81EA\u52A8\u53BB\u91CD\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u662F\u5426\u91CD\u590D\u7C98\u8D34\u3002`),t}function g(e){return e==null?void 0:String(e).trim()||void 0}function _(e){return S(e)}function re(e){return Array.isArray(e.autoRegisterTargets)?e.autoRegisterTargets.filter(r=>!!(r&&typeof r=="object"&&!Array.isArray(r))):[]}function N(e){const r=e?.serverUrl||m;return x(r,e?.credentialId||e?.userKey)}function y(e){return e?.credentialId||e?.userKey}function P(e){if(typeof e=="boolean")return e;if(typeof e=="string"){const r=e.trim().toLowerCase();if(["true","1","yes","y"].includes(r))return!0;if(["false","0","no","n"].includes(r))return!1}}function te(e){if(e==null||e==="")return;const r=Number(e);return Number.isFinite(r)?r:void 0}function O(e){const r=g(e.serverUrl)||g(e.schedulerBaseUrl),t=g(e.connectionKey)||g(e.password);return{enabled:P(e.enabled),serverUrl:r,tenantId:g(e.tenantId),userId:g(e.userId),userKey:Se(e.userKey),machineToken:g(e.machineToken),connectionKey:t,instanceName:g(e.instanceName),instanceId:g(e.instanceId),credentialId:g(e.credentialId),credentialRef:g(e.credentialRef),credentialType:g(e.credentialType),projectId:g(e.projectId),roleName:g(e.roleName),workspacePath:g(e.workspacePath),registerAddr:g(e.registerAddr),registerIp:g(e.registerIp),virtualIp:g(e.virtualIp),tunnel:P(e.tunnel),preferSameLanIp:P(e.preferSameLanIp),maxRetries:te(e.maxRetries),retryInterval:te(e.retryInterval)}}function ne(){const e=T();try{if(!p.existsSync(e))return a.debug(`[AutoRegister] \u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`),null;const r=p.readFileSync(e,"utf-8"),t=JSON.parse(r);return a.info(`[AutoRegister] \u4ECE\u914D\u7F6E\u6587\u4EF6\u52A0\u8F7D\u914D\u7F6E: ${e}`),O(t)}catch(r){const t=r;return a.warn(`[AutoRegister] \u8BFB\u53D6\u914D\u7F6E\u6587\u4EF6\u5931\u8D25: ${e}, error: ${t.message}`),null}}function he(){const e=T();try{if(!p.existsSync(e))return[];const r=p.readFileSync(e,"utf-8"),t=JSON.parse(r),n=O(t),o=Array.isArray(t.autoRegisterTargets)?t.autoRegisterTargets:[];return o.length===0?n.userKey||n.machineToken?[n]:[]:o.filter(i=>!!(i&&typeof i=="object"&&!Array.isArray(i))).map(i=>{const s=O(i);return{...n,...s,machineToken:s.machineToken||(s.userKey?void 0:n.machineToken),connectionKey:s.connectionKey}})}catch(r){const t=r;return a.warn(`[AutoRegister] \u8BFB\u53D6\u81EA\u52A8\u6CE8\u518C\u76EE\u6807\u5931\u8D25: ${e}, error: ${t.message}`),[]}}function Ve(){const e=T();if(!p.existsSync(e))return[];let r;try{r=JSON.parse(p.readFileSync(e,"utf-8"))}catch(s){return a.warn(`[AutoRegister] \u8BFB\u53D6 config.json \u5931\u8D25\uFF08targets \u6458\u8981\uFF09: ${s.message}`),[]}const t=O(r),n=Array.isArray(r.autoRegisterTargets)?r.autoRegisterTargets:[],o=n.length>0?n.filter(s=>!!(s&&typeof s=="object"&&!Array.isArray(s))).map(s=>{const c=O(s);return{...t,...c,machineToken:c.machineToken||(c.userKey?void 0:t.machineToken),connectionKey:c.connectionKey}}):t.userKey||t.machineToken?[t]:[],i=s=>{const c=String(s||"").trim();return c?c.length<=8?"****":`${c.slice(0,8)}****${c.slice(-4)}`:""};return o.map((s,c)=>({index:c,serverUrl:s.serverUrl||"",instanceName:s.instanceName||"",registerAddr:s.registerAddr||s.registerIp||s.virtualIp||"",tunnel:typeof s.tunnel=="boolean"?s.tunnel:null,userKeyMasked:i(s.userKey),machineTokenSet:!!String(s.machineToken||"").trim(),credentialType:s.credentialType||"",credentialId:s.credentialId||"",credentialRef:s.credentialRef||"",connectionKeySet:!!String(s.connectionKey||"").trim()}))}function se(){const e={};return process.env.AWS_AUTO_REGISTER==="true"&&(e.enabled=!0),process.env.AWS_RUNTIME_SCHEDULER_BASE_URL&&(e.serverUrl=process.env.AWS_RUNTIME_SCHEDULER_BASE_URL),process.env.AWS_TENANT_ID&&(e.tenantId=process.env.AWS_TENANT_ID),process.env.AWS_USER_KEY&&(e.userKey=process.env.AWS_USER_KEY),process.env.AWS_BRIDGE_MACHINE_TOKEN&&(e.machineToken=process.env.AWS_BRIDGE_MACHINE_TOKEN),process.env.AWS_BRIDGE_CONNECTION_KEY&&(e.connectionKey=process.env.AWS_BRIDGE_CONNECTION_KEY),process.env.AWS_INSTANCE_NAME&&(e.instanceName=process.env.AWS_INSTANCE_NAME),process.env.AWS_PROJECT_NAME&&(e.projectId=process.env.AWS_PROJECT_NAME),process.env.AWS_ROLE_NAME&&(e.roleName=process.env.AWS_ROLE_NAME),process.env.AWS_WORKSPACE_PATH&&(e.workspacePath=process.env.AWS_WORKSPACE_PATH),process.env.AWS_REGISTER_ADDR&&(e.registerAddr=process.env.AWS_REGISTER_ADDR),process.env.AWS_REGISTER_IP&&(e.registerIp=process.env.AWS_REGISTER_IP),process.env.AWS_VIRTUAL_IP&&(e.virtualIp=process.env.AWS_VIRTUAL_IP),process.env.AWS_PREFER_SAME_LAN_IP&&(e.preferSameLanIp=P(process.env.AWS_PREFER_SAME_LAN_IP)??!0),process.env.AWS_REGISTER_MAX_RETRIES&&(e.maxRetries=parseInt(process.env.AWS_REGISTER_MAX_RETRIES,10)),process.env.AWS_REGISTER_RETRY_INTERVAL&&(e.retryInterval=parseInt(process.env.AWS_REGISTER_RETRY_INTERVAL,10)),e}function W(){const e=ne(),r=se(),t={...X,...e||{},...r},n=t.instanceName||w.hostname();let o=!1;return process.env.AWS_AUTO_REGISTER!==void 0?o=process.env.AWS_AUTO_REGISTER==="true":e&&(o=!0),{enabled:o,serverUrl:t.serverUrl||m,tenantId:t.tenantId||"",userKey:t.userKey||"",machineToken:t.machineToken,connectionKey:t.connectionKey,instanceName:n,instanceId:t.instanceId,credentialId:t.credentialId,credentialRef:t.credentialRef,credentialType:t.credentialType,projectId:t.projectId,roleName:t.roleName,workspacePath:t.workspacePath,registerAddr:t.registerAddr,registerIp:t.registerIp,virtualIp:t.virtualIp,tunnel:typeof t.tunnel=="boolean"?t.tunnel:void 0,preferSameLanIp:t.preferSameLanIp!==!1,maxRetries:t.maxRetries,retryInterval:t.retryInterval}}function h(){const e=he(),r=se(),n=(e.length>0?e:[ne()||{}]).map(o=>{const i={...X,...o,...r};let s=!1;return process.env.AWS_AUTO_REGISTER!==void 0?s=process.env.AWS_AUTO_REGISTER==="true":s=e.length>0||!!(i.userKey||i.machineToken),{enabled:s,serverUrl:i.serverUrl||m,tenantId:i.tenantId||"",userId:i.userId,userKey:i.userKey||"",machineToken:i.machineToken,connectionKey:i.connectionKey,instanceName:i.instanceName||w.hostname(),instanceId:i.instanceId,credentialId:i.credentialId,credentialRef:i.credentialRef,credentialType:i.credentialType,projectId:i.projectId,roleName:i.roleName,workspacePath:i.workspacePath,registerAddr:i.registerAddr,registerIp:i.registerIp,virtualIp:i.virtualIp,tunnel:typeof i.tunnel=="boolean"?i.tunnel:void 0,preferSameLanIp:i.preferSameLanIp!==!1,maxRetries:i.maxRetries,retryInterval:i.retryInterval}});return k=n.map(o=>o.connectionKey).filter(o=>!!(o&&o.trim())),n}function ve(){const e=w.networkInterfaces(),r=[];for(const t of Object.keys(e)){const n=e[t];if(n)for(const o of n)o.family==="IPv4"&&!o.internal&&r.push({address:o.address,netmask:o.netmask,name:t})}return r}function z(e){const r=e.split(".").map(Number);return(r[0]<<24)+(r[1]<<16)+(r[2]<<8)+r[3]}function Ke(e,r,t){const n=z(e),o=z(r),i=z(t);return(n&i)===(o&i)}function Ue(e){try{const r=new URL(e);return r.hostname==="localhost"||r.hostname==="127.0.0.1"?"127.0.0.1":/^(\d{1,3}\.){3}\d{1,3}$/.test(r.hostname)?r.hostname:null}catch{return null}}function ke(e){return e==="127.0.0.1"}function _e(e){const r=ve();if(r.length===0)return a.warn("[AutoRegister] \u672A\u627E\u5230\u4EFB\u4F55\u975E\u5185\u90E8 IP \u5730\u5740\uFF0C\u4F7F\u7528 127.0.0.1"),"127.0.0.1";const t=Ue(e);if(t){if(ke(t))return"127.0.0.1";for(const n of r)if(Ke(n.address,t,n.netmask))return a.info(`[AutoRegister] \u627E\u5230\u4E0E\u8C03\u5EA6\u4E2D\u5FC3\u540C\u5B50\u7F51\u7684 IP: ${n.address} (\u7F51\u5361: ${n.name}, \u5B50\u7F51\u63A9\u7801: ${n.netmask})`),n.address;a.warn(`[AutoRegister] \u672A\u627E\u5230\u4E0E\u8C03\u5EA6\u4E2D\u5FC3 (${t}) \u540C\u5B50\u7F51\u7684\u672C\u673A IP\uFF0C\u4F7F\u7528 127.0.0.1`)}else a.warn("[AutoRegister] \u65E0\u6CD5\u89E3\u6790\u8C03\u5EA6\u4E2D\u5FC3 IP\uFF0C\u4F7F\u7528 127.0.0.1");return"127.0.0.1"}function Ee(e=m){return _e(e)}function ie(e){const r=e||W();return!r.enabled||!r.userKey&&!r.machineToken?!1:r.tunnel===!0?!0:r.tunnel===!1?!1:!r.registerAddr&&!r.registerIp&&!r.virtualIp}function L(e){const r=de();if(ie(e)){const i=e.serverUrl||m;try{const s=new URL(i);if(!e.instanceId)a.warn("[AutoRegister] \u96A7\u9053\u6A21\u5F0F\u4F46\u7F3A\u5C11 instanceId\uFF0C\u964D\u7EA7\u4E3A\u76F4\u8FDE\u6A21\u5F0F");else return`${s.protocol}//${s.host}/tunnel/${e.instanceId}`}catch{a.warn("[AutoRegister] serverUrl \u89E3\u6790\u5931\u8D25\uFF0C\u964D\u7EA7\u4E3A\u76F4\u8FDE\u6A21\u5F0F")}}const t=le()||e.preferSameLanIp===!1?"127.0.0.1":Ee(e.serverUrl||m),n=e.registerAddr||e.registerIp||e.virtualIp||t;return n?/^https?:\/\//i.test(n)?n:/:[0-9]+$/.test(n)?`http://${n}`:`http://${n}:${r}`:`http://127.0.0.1:${r}`}function b(){return h()[0]||W()}function Xe(e){return Ne(e)?.serverUrl}function Ne(e){const r=String(e||"").trim();if(!r)return;for(const n of h()){if(!n?.serverUrl)continue;const o=Y(n.serverUrl,y(n));if(o&&o===r)return{serverUrl:S(n.serverUrl)||n.serverUrl,userKey:n.userKey,identityKey:y(n),instanceId:n.instanceId};const i=ye(n.serverUrl);for(const s of i){if(s.accessToken!==r)continue;const c=fe(n.userKey)===s.userKeyFingerprint?n.userKey:void 0;return{serverUrl:S(n.serverUrl)||n.serverUrl,userKey:c,identityKey:c}}}const t=M();if(t.schedulerBaseUrl){const n=Y(t.schedulerBaseUrl);if(n&&n===r)return{serverUrl:S(t.schedulerBaseUrl)||t.schedulerBaseUrl}}}function we(e){if(!e)return;const r=Object.entries(d.registrations).find(([,t])=>t===e);return r?F(r[0]):void 0}function $e(e,r){const t=S(e);if(!t)return;if(String(r||"").trim()){const o=d.registrations[x(t,r)];return o||void 0}const n=Object.entries(d.registrations).filter(([o])=>F(o)===t);return n.length===1?n[0][1]:void 0}function j(e,r){const t=we(r);if(t)return t;const n=g(e.serverUrl);if(n&&(n!==m||process.env.AWS_RUNTIME_SCHEDULER_BASE_URL))return n;const o=M(),i=g(o.schedulerBaseUrl);return o.status==="paired"&&i?i:n||m}async function Be(e){const r=e.instanceName||w.hostname(),t=e.serverUrl||m,n={tenantId:e.tenantId,userKey:e.machineToken?void 0:e.userKey,machineToken:e.machineToken,instanceId:e.instanceId,instanceName:r,hostname:w.hostname(),virtualIp:e.registerAddr||e.registerIp||e.virtualIp,runtimeBridgeBaseUrl:L(e),connectionKey:e.connectionKey,workspacePath:e.workspacePath,projectId:e.projectId,roleName:e.roleName};return a.info(`[AutoRegister] \u6B63\u5728\u6CE8\u518C\u5B9E\u4F8B: ${r}`),a.info(`[AutoRegister] \u8C03\u5EA6\u4E2D\u5FC3: ${t}`),a.info(e.machineToken?"[AutoRegister] \u51ED\u636E: \u673A\u5668\u81EA\u6301\u51ED\u636E\uFF08machineToken\uFF09":`[AutoRegister] \u7528\u6237 Key: ${e.userKey?"****"+e.userKey.slice(-4):"(\u672A\u8BBE\u7F6E)"}`),a.info(`[AutoRegister] \u79DF\u6237 ID: ${e.tenantId||"(\u81EA\u52A8\u63A8\u5BFC)"}`),(await $.post(`${t}/api/instances/register`,n,{headers:{"Content-Type":"application/json"},timeout:1e4})).data}function Ce(e,r,t,n,o,i,s,c,u){const l=T();return D(l,()=>{if(!p.existsSync(l))return;const I=p.readFileSync(l,"utf-8"),v=JSON.parse(I),U=S(e);if(!U)return;let A=!1;const R=f=>S(String(f.serverUrl||f.schedulerBaseUrl||""))!==U?!1:String(t||"").trim()?String(f.userKey??"").trim()===String(t).trim():String(s||"").trim()?String(f.machineToken??"").trim()===String(s).trim():!0,K=f=>{R(f)&&(r&&f.instanceId!==r&&(f.instanceId=r,A=!0),n&&f.credentialId!==n&&(f.credentialId=n,A=!0),o&&f.credentialRef!==o&&(f.credentialRef=o,A=!0),i&&f.credentialType!==i&&(f.credentialType=i,A=!0),c&&f.tenantId!==c&&(f.tenantId=c,A=!0),u&&f.userId!==u&&(f.userId=u,A=!0))};if(Array.isArray(v.autoRegisterTargets))for(const f of v.autoRegisterTargets)f&&typeof f=="object"&&!Array.isArray(f)&&K(f);else K(v);A&&(p.writeFileSync(l,JSON.stringify(v,null,2),"utf-8"),a.info(`[AutoRegister] \u5DF2\u56DE\u5199 instanceId \u5230 config.json (serverUrl=${e}${t?`, userKey=****${String(t).slice(-4)}`:""})`))})}async function Oe(e,r){const t=String(r||"").trim();if(!t)return;const n=y(e),o=_(e.serverUrl);if(!n||!o)return;const i=T();try{await D(i,()=>{if(!p.existsSync(i))return;const s=p.readFileSync(i,"utf-8"),c=JSON.parse(s),l=re(c).find(I=>_(I.serverUrl||I.schedulerBaseUrl)===o&&String(I.credentialId||I.userKey||"").trim()===n);if(!l){a.warn(`[AutoRegister] \u65E0\u6CD5\u5B9A\u4F4D connectionKey \u5BF9\u5E94 target\uFF0C\u8DF3\u8FC7\u5199\u76D8: server=${o}`);return}String(l.connectionKey??"").trim()!==t&&(l.connectionKey=t,p.writeFileSync(i,JSON.stringify(c,null,2),"utf-8"),a.info(`[AutoRegister] \u5DF2\u5199\u5165 target connectionKey \u5230 config.json: ${i}`))})}catch(s){a.warn(`[AutoRegister] \u5199\u5165 target connectionKey \u5230 config.json \u5931\u8D25: ${s.message}`)}}async function Qe(e,r){const t=String(e||"").trim();if(!t)throw new Error("connectionKey is required");const n=_(r?.serverUrl);if(!n)throw new Error("serverUrl is required to rotate a target connectionKey");const o=T();let i;const s=await D(o,()=>{if(!p.existsSync(o))return!1;const l=JSON.parse(p.readFileSync(o,"utf-8")),I=re(l),v=String(r?.instanceId||"").trim(),U=String(r?.credentialId||"").trim(),A=I.filter(K=>{if(_(K.serverUrl||K.schedulerBaseUrl)!==n)return!1;if(v&&String(K.instanceId||"").trim()===v)return!0;if(U){const E=String(K.credentialId||"").trim(),ae=String(K.userKey||"").trim();if(E===U||ae===U)return!0}return!v&&!U&&I.filter(E=>_(E.serverUrl||E.schedulerBaseUrl)===n).length===1});if(A.length!==1)throw new Error(`\u65E0\u6CD5\u552F\u4E00\u5B9A\u4F4D connectionKey \u5BF9\u5E94 target\uFF08server=${n}, matches=${A.length}\uFF09`);const R=A[0];return String(R.connectionKey??"").trim()===t?!1:(i={targetKey:x(String(R.serverUrl??R.schedulerBaseUrl??""),R.credentialId||R.userKey),previousConnectionKey:String(R.connectionKey??"").trim()},R.connectionKey=t,String(l.connectionKey??"").trim()&&delete l.connectionKey,p.writeFileSync(o,JSON.stringify(l,null,2),"utf-8"),a.info(`[AutoRegister] \u5DF2\u8F6E\u6362 target connectionKey \u5E76\u5199\u56DE config.json: ${o}`),!0)}),c=!!process.env.AWS_BRIDGE_CONNECTION_KEY;c&&s&&(process.env.AWS_BRIDGE_CONNECTION_KEY=t,a.warn("[AutoRegister] \u68C0\u6D4B\u5230 AWS_BRIDGE_CONNECTION_KEY \u73AF\u5883\u53D8\u91CF\uFF0C\u5DF2\u540C\u6B65\u66F4\u65B0\u5F53\u524D\u8FDB\u7A0B\uFF1B\u91CD\u542F bridge \u540E\u4F1A\u56DE\u5230\u73AF\u5883\u53D8\u91CF\u4E2D\u7684\u65E7\u503C\uFF0C\u8BF7\u4E00\u5E76\u4FEE\u6539\u90E8\u7F72\u914D\u7F6E"));const u=h().map(l=>String(l.connectionKey||"").trim()).filter(l=>l.length>0);return k=s?[...new Set([t,...u])]:[...new Set(u)],s&&i&&i.previousConnectionKey!==t&&B.set(i.targetKey,{key:i.previousConnectionKey,expiresAt:Date.now()+Ie}),{envOverrideWarning:c,rotated:s}}async function oe(e){let r=0;for(const t of e)String(t.connectionKey||"").trim()||(t.connectionKey=`awsb_${ce(24).toString("base64url")}`,r+=1,k.includes(t.connectionKey)||(k=[...k,t.connectionKey]),await Oe(t,t.connectionKey));r!==0&&a.info(`[AutoRegister] ${r} \u4E2A\u76EE\u6807\u7F3A\u5C11 connectionKey\uFF0C\u5DF2\u6309 target \u72EC\u7ACB\u751F\u6210\u5E76\u5199\u5165 config.json`)}function J(e){if(!e)return;const r=Object.entries(d.registrations).find(([,i])=>i===e);if(!r)return;const t=r[0],n=F(t),o=h().find(i=>N(i)===t);return{serverUrl:n,identityKey:o?y(o):void 0,targetKey:t}}async function be(e){const r=J(e),t=r?.serverUrl||j(b(),e),n=G(t,r?.identityKey);if(!n)throw new Error("runtimeAccessToken is required to unregister bridge instance");return(await $.post(`${t}/api/instances/unregister`,{instanceId:e},{headers:{"Content-Type":"application/json","X-Runtime-Token":n},timeout:1e4})).data}async function Ze(e){const r=e?[{...W(),...e}]:h();await oe(r);const n=(r.length>1?await Promise.all(r.map(i=>q(i))):[await q(r[0]||W())]).every(Boolean),o=r.every(i=>!i.enabled||!i.userKey&&!i.machineToken);if(!e&&(n||o)){const{stopTunnelClientsExcept:i}=await import("./tunnel-client.js");i(r.filter(s=>!!s.serverUrl).map(s=>x(s.serverUrl,y(s))))}return n}async function q(e,r){if(!e.enabled)return a.info("[AutoRegister] \u81EA\u52A8\u6CE8\u518C\u672A\u542F\u7528"),a.info(`[AutoRegister] \u8981\u542F\u7528\u81EA\u52A8\u6CE8\u518C\uFF0C\u8BF7\u521B\u5EFA\u914D\u7F6E\u6587\u4EF6 ${T()} \u6216\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF AWS_AUTO_REGISTER=true`),!1;if(!e.userKey&&!e.machineToken)return a.error("[AutoRegister] \u7F3A\u5C11\u6CE8\u518C\u51ED\u636E\uFF08\u5728\u914D\u7F6E\u6587\u4EF6\u4E2D\u8BBE\u7F6E userKey \u6216 machineToken\uFF0C\u4E5F\u53EF\u7528 `awsb pair --ticket ...` \u914D\u5BF9\uFF09"),!1;String(e.connectionKey||"").trim()||await oe([e]);const t=ie(e);t&&!e.instanceId&&(e.instanceId=`bridge-${ue().replace(/-/g,"").slice(0,12)}`,a.info(`[AutoRegister] \u96A7\u9053\u6A21\u5F0F\uFF1A\u5DF2\u9884\u58F0\u660E instanceId=${e.instanceId}`));const n=r?.backgroundRetry?1:e.maxRetries??3,o=e.retryInterval??2e3;for(let i=1;i<=n;i++){try{d.lastAttempt=new Date;const s=await Be(e);if(s.success){if(d.registered=!0,d.instanceId=s.instanceId,s.credentialId&&(e.credentialId=s.credentialId,e.credentialType=s.credentialType),e.credentialRef=s.credentialRef,s.tenantId&&(e.tenantId=s.tenantId),s.userId&&(e.userId=s.userId),s.instanceId&&(d.registrations[N(e)]=s.instanceId,e.instanceId=s.instanceId),d.error=void 0,a.info("[AutoRegister] \u2713 \u6CE8\u518C\u6210\u529F\uFF01"),a.info(`[AutoRegister] \u5B9E\u4F8B ID: ${s.instanceId}`),a.info(`[AutoRegister] \u6D88\u606F: ${s.message}`),a.info(`[AutoRegister] \u66F4\u65B0: ${s.isUpdate?"\u662F":"\u5426"}`),s.runtimeAccessToken)try{const c=e.serverUrl||m;H({accessToken:s.runtimeAccessToken,instanceId:s.instanceId,userId:s.userId,schedulerBaseUrl:c,userKey:y(e)});const u=S(s.serverUrl);u&&u!==S(c)&&(V({serverBaseUrl:u,accessToken:s.runtimeAccessToken,userKey:y(e)}),a.info(`[AutoRegister] \u68C0\u6D4B\u5230 server \u4E0B\u53D1\u5730\u5740(${u})\u4E0E\u8FDE\u63A5\u5730\u5740(${c})\u4E0D\u540C\uFF0C\u5DF2\u6309\u4E24\u4E2A\u5730\u5740\u5206\u522B\u4FDD\u5B58 scoped token`)),a.info("[AutoRegister] \u5DF2\u4FDD\u5B58\u8C03\u5EA6\u4E2D\u5FC3\u4E0B\u53D1\u7684 runtime access token"),s.instanceId&&Ce(e.serverUrl||m,s.instanceId,e.userKey,s.credentialId,s.credentialRef,s.credentialType,e.machineToken,s.tenantId,s.userId).catch(l=>{a.warn(`[AutoRegister] \u56DE\u5199 instanceId \u5230 config.json \u5931\u8D25: ${l.message}`)})}catch(c){const u=c;return a.error(`[AutoRegister] \u4FDD\u5B58 runtime access token \u5931\u8D25: ${u.message}`),d.error=u.message,!1}else a.warn("[AutoRegister] \u6CE8\u518C\u54CD\u5E94\u672A\u5305\u542B runtime access token\uFF0CMCP \u5C06\u65E0\u6CD5\u8BBF\u95EE\u8C03\u5EA6\u4E2D\u5FC3\uFF0C\u8BF7\u68C0\u67E5 server \u7684 bridge \u5B9E\u4F8B token \u9881\u53D1\u903B\u8F91");if(t&&s.instanceId&&s.runtimeAccessToken){const{startTunnelClient:c}=await import("./tunnel-client.js"),u=e.serverUrl||m;c(u,s.instanceId,y(e)),a.info(`[AutoRegister] \u96A7\u9053\u5BA2\u6237\u7AEF\u5DF2\u542F\u52A8: server=${u}, instanceId=${s.instanceId}${e.userKey?`, userKey=****${e.userKey.slice(-4)}`:""}`)}return!0}else a.warn(`[AutoRegister] \u6CE8\u518C\u5931\u8D25: ${s.message}`),d.error=s.message}catch(s){const c=s,u=c.response?.data?JSON.stringify(c.response.data):c.message;a.error(`[AutoRegister] \u6CE8\u518C\u8BF7\u6C42\u5931\u8D25 (\u5C1D\u8BD5 ${i}/${n}): ${u}`),d.error=u}i<n&&(a.info(`[AutoRegister] ${o/1e3} \u79D2\u540E\u91CD\u8BD5...`),await new Promise(s=>setTimeout(s,o)))}return r?.backgroundRetry?a.warn(`[AutoRegister] \u540E\u53F0\u91CD\u8BD5\u6CE8\u518C\u4ECD\u672A\u6210\u529F (server=${e.serverUrl||m}): ${d.error||"\u672A\u77E5"}`):(a.error("[AutoRegister] \u2717 \u6CE8\u518C\u5931\u8D25\uFF0C\u5DF2\u8FBE\u6700\u5927\u91CD\u8BD5\u6B21\u6570"),a.error("[AutoRegister] ========================================"),a.error("[AutoRegister] \u81EA\u52A8\u6CE8\u518C\u5DF2\u542F\u7528\u4F46\u6CE8\u518C\u5931\u8D25\uFF0C\u5B9E\u4F8B\u6682\u65F6\u65E0\u6CD5\u6B63\u5E38\u5DE5\u4F5C"),a.error("[AutoRegister] \u8BF7\u68C0\u67E5\u4EE5\u4E0B\u914D\u7F6E\uFF1A"),a.error(`[AutoRegister] - \u7528\u6237 Key (userKey): ${e.userKey?"****"+e.userKey.slice(-4):"(\u672A\u8BBE\u7F6E)"}`),a.error(`[AutoRegister] - \u79DF\u6237 ID (tenantId): ${e.tenantId||"(\u53EF\u9009\uFF0C\u5C06\u81EA\u52A8\u63A8\u5BFC)"}`),a.error(`[AutoRegister] - \u5B9E\u4F8B\u540D (instanceName): ${e.instanceName||"(\u4F7F\u7528\u4E3B\u673A\u540D)"}`),a.error(`[AutoRegister] - \u8C03\u5EA6\u4E2D\u5FC3\u5730\u5740: ${e.serverUrl||m}`),a.error(`[AutoRegister] - \u6700\u540E\u9519\u8BEF: ${d.error||"\u672A\u77E5"}`),a.error("[AutoRegister] ========================================"),a.error(`[AutoRegister] \u914D\u7F6E\u6765\u6E90\uFF1A${T()} \u6216\u73AF\u5883\u53D8\u91CF`),a.warn(`[AutoRegister] \u5C06\u5728\u540E\u53F0\u6301\u7EED\u91CD\u8BD5\u6CE8\u518C\uFF08\u6BCF ${Math.round(Z()/1e3)} \u79D2\uFF09\uFF0C\u76F4\u5230\u4E0E\u8C03\u5EA6\u4E2D\u5FC3\u5EFA\u7ACB\u8FDE\u63A5`)),ee(e),!1}async function er(){const e=b();if(!e.userKey&&!e.machineToken)return{success:!1,error:"userKey or machineToken is required for runtime token refresh"};const r=pe(),t=j(e),n=L(e);try{const o=await $.post(`${t}/api/instances/runtime-tokens/refresh`,{tenantId:e.tenantId,userKey:e.machineToken?void 0:e.userKey,machineToken:e.machineToken,instanceId:r.instanceId,instanceName:e.instanceName,runtimeBridgeBaseUrl:n},{headers:{"Content-Type":"application/json"},timeout:1e4});if(!o.data.success||!o.data.runtimeAccessToken)return{success:!1,error:o.data.message||"scheduler did not return runtimeAccessToken"};const s=G(t,y(e))!==o.data.runtimeAccessToken;return H({accessToken:o.data.runtimeAccessToken,instanceId:r.instanceId,userId:o.data.userId||e.userKey||e.credentialId||"",schedulerBaseUrl:t,userKey:y(e)}),{success:!0,runtimeAccessToken:o.data.runtimeAccessToken,updated:s}}catch(o){const i=o;return{success:!1,error:i.response?.data?JSON.stringify(i.response.data):i.message}}}async function rr(e,r){const t=_(e);if(!t)return{success:!1,error:"serverUrl is required for runtime token refresh"};const n=h().filter(u=>_(u.serverUrl)===t),o=String(r||"").trim(),i=o?n.find(u=>String(u.userKey||"").trim()===o||String(u.credentialId||"").trim()===o):n.length===1?n[0]:void 0;if(!i)return{success:!1,error:o?"no auto-register target matches this identity":"multiple auto-register targets share this serverUrl; specify the target identity"};if(!i.userKey&&!i.machineToken)return{success:!1,error:"userKey or machineToken is required for runtime token refresh"};const s={instanceId:$e(t,y(i))},c=L(i);try{const u=await $.post(`${t}/api/instances/runtime-tokens/refresh`,{tenantId:i.tenantId,userKey:i.machineToken?void 0:i.userKey,machineToken:i.machineToken,instanceId:s.instanceId,instanceName:i.instanceName,runtimeBridgeBaseUrl:c},{headers:{"Content-Type":"application/json"},timeout:1e4});if(!u.data.success||!u.data.runtimeAccessToken)return{success:!1,error:u.data.message||"scheduler did not return runtimeAccessToken"};const I=G(t,y(i))!==u.data.runtimeAccessToken;return V({serverBaseUrl:t,accessToken:u.data.runtimeAccessToken,userKey:y(i)}),{success:!0,runtimeAccessToken:u.data.runtimeAccessToken,updated:I}}catch(u){const l=u;return{success:!1,error:l.response?.data?JSON.stringify(l.response.data):l.message}}}async function tr(){if(!d.registered||!d.instanceId)return a.info("[AutoRegister] \u5B9E\u4F8B\u672A\u6CE8\u518C\uFF0C\u65E0\u9700\u6CE8\u9500"),!0;const e=J(d.instanceId),r=e?h().find(t=>N(t)===e.targetKey):void 0;if(r&&(String(r.machineToken||"").trim()||r.credentialType==="MACHINE_TOKEN"))return a.info(`[AutoRegister] \u673A\u5668\u51ED\u636E\u76EE\u6807\uFF08instanceId=${d.instanceId}\uFF09\u8DF3\u8FC7\u6CE8\u9500\uFF1A\u914D\u5BF9\u8EAB\u4EFD\u5FC5\u987B\u8DE8\u91CD\u542F\u5B58\u6D3B\uFF0C\u4E0D\u5220\u9664\u8C03\u5EA6\u4E2D\u5FC3\u767B\u8BB0\u884C`),!0;try{const t=await be(d.instanceId);if(t.success){a.info(`[AutoRegister] \u2713 \u6CE8\u9500\u6210\u529F: ${d.instanceId}`);const n=J(d.instanceId),o=n?.serverUrl||j(b(),d.instanceId);M().schedulerBaseUrl&&me(o,n?.identityKey),ge();try{const{stopTunnelClientForTarget:s}=await import("./tunnel-client.js");s(o,n?.identityKey??y(b()))}catch(s){a.warn(`[AutoRegister] \u6CE8\u9500\u540E\u505C\u6B62\u96A7\u9053\u5931\u8D25: ${s.message}`)}if(!n)d.registered=!1,d.instanceId=void 0;else{delete d.registrations[n.targetKey];const s=Object.entries(d.registrations);d.registered=s.length>0,d.instanceId=s[s.length-1]?.[1]}return!0}else return a.warn(`[AutoRegister] \u6CE8\u9500\u5931\u8D25: ${t.message}`),!1}catch(t){const n=t;return a.error(`[AutoRegister] \u6CE8\u9500\u8BF7\u6C42\u5931\u8D25: ${n.message}`),!1}}function nr(){return{...d}}function sr(){return d.registered}function ir(){return d.instanceId}async function or(){const e=b(),r=d.instanceId,t=j(e,r),n={};if(r&&(n.instanceId=r),e.enabled&&(n.runtimeBridgeBaseUrl=L(e)),!n.instanceId&&!n.runtimeBridgeBaseUrl)return a.info("[AutoRegister] Bridge \u91CD\u542F\u6E05\u7406\uFF1A\u6CA1\u6709 instanceId \u6216 runtimeBridgeBaseUrl\uFF0C\u8DF3\u8FC7\u6E05\u7406"),{success:!0,agentCount:0};try{a.info("[AutoRegister] Bridge \u91CD\u542F\u6E05\u7406\uFF1A\u6B63\u5728\u901A\u77E5\u8C03\u5EA6\u4E2D\u5FC3..."),a.info(`[AutoRegister] instanceId: ${n.instanceId||"(\u65E0)"}`),a.info(`[AutoRegister] runtimeBridgeBaseUrl: ${n.runtimeBridgeBaseUrl||"(\u65E0)"}`);const o=await $.post(`${t}/api/instances/bridge-restart-cleanup`,n,{headers:{"Content-Type":"application/json"},timeout:1e4});return o.data.success?(a.info(`[AutoRegister] \u2713 Bridge \u91CD\u542F\u6E05\u7406\u6210\u529F\uFF1A${o.data.message}`),a.info(`[AutoRegister] \u6E05\u7406\u4E86 ${o.data.agentCount||0} \u4E2A Agent`),{success:!0,agentCount:o.data.agentCount||0}):(a.warn(`[AutoRegister] Bridge \u91CD\u542F\u6E05\u7406\u5931\u8D25\uFF1A${o.data.message}`),{success:!1,error:o.data.message})}catch(o){const i=o,s=i.response?.data?JSON.stringify(i.response.data):i.message;return a.warn(`[AutoRegister] Bridge \u91CD\u542F\u6E05\u7406\u8BF7\u6C42\u5931\u8D25\uFF1A${s}`),{success:!1,error:s}}}export{Ze as autoRegister,or as bridgeRestartCleanup,He as cancelBackgroundRegisterRetries,Te as collapseDuplicatedSecret,qe as findConfigsByConnectionKey,T as getAutoRegisterConfigFilePath,Je as getConfiguredConnectionKeys,Ye as getCurrentConfiguredConnectionKey,ir as getInstanceId,nr as getRegistrationState,sr as isRegistered,ie as isTunnelConfig,Ve as listConfiguredTargetSummaries,W as loadConfig,h as loadConfigs,b as loadPrimaryLifecycleConfig,Qe as replaceConfiguredConnectionKey,er as requestRuntimeAccessTokenRefresh,rr as requestRuntimeAccessTokenRefreshForServer,$e as resolveInstanceIdForTarget,L as resolveRuntimeBridgeBaseUrl,Xe as resolveSchedulerBaseUrlFromToken,Ne as resolveTargetIdentityFromToken,tr as unregister};
|
|
1
|
+
import{createHash as ue,randomBytes as de}from"node:crypto";import m from"node:fs";import w from"node:os";import x from"node:path";import{fileURLToPath as le}from"node:url";import B from"axios";import{v4 as fe}from"uuid";import{getActiveBridgeHttpPort as ge,getAutoRegisterConfigFilePath as S,getBridgeVersion as me,isDesktopAppMode as pe,schedulerBaseUrl as p}from"../config.js";import{runExclusiveConfigWrite as D}from"../utils/config-write-queue.js";import{logger as a}from"../utils/logger.js";import{buildTargetKey as P,fingerprintUserKey as ye,serverUrlOfTargetKey as G}from"../utils/target-identity.js";import{clearRuntimeBinding as Ie,clearScopedRuntimeAccessToken as Ae,getRuntimeAccessToken as M,getRuntimeBindingPublicState as Re,getScopedRuntimeAccessToken as H,listScopedRuntimeAccessTokens as Se,loadRuntimeBinding as z,normalizeSchedulerBaseUrl as T,saveRuntimeBinding as V,saveScopedRuntimeAccessToken as X}from"./runtime-binding.js";const Q={enabled:!1,serverUrl:p,preferSameLanIp:!0,maxRetries:3,retryInterval:2e3},d={registered:!1,registrations:{}};let k=[];const Te=10*60*1e3,$=new Map;function Z(){const e=Date.now();for(const[r,t]of $)t.expiresAt<=e&&$.delete(r)}function Ze(){Z();const e=[...k];for(const r of $.values())r.key&&!e.includes(r.key)&&e.push(r.key);return e}function er(e){const r=String(e||"").trim();if(!r)return[];const t=h(),n=t.filter(i=>String(i.connectionKey||"").trim()===r);if(n.length>0)return n;Z();const o=new Set;for(const[i,s]of $)s.key===r&&o.add(i);return o.size===0?[]:t.filter(i=>o.has(N(i)))}function rr(){return k[0]??""}const he=3e4;function ee(){const e=Number(process.env.AWS_REGISTER_BACKGROUND_RETRY_INTERVAL);return Number.isFinite(e)&&e>0?e:he}const C=new Map;function re(e){const r=e.serverUrl||p,t=N(e)||r;if(C.has(t))return;const n=setTimeout(()=>{C.delete(t),ve(e,t)},ee());n.unref?.(),C.set(t,n)}async function ve(e,r){try{const t=h().find(n=>N(n)===r)||e;await Y(t,{backgroundRetry:!0})}catch(t){a.warn(`[AutoRegister] \u540E\u53F0\u91CD\u8BD5\u6CE8\u518C\u5F02\u5E38: ${t.message}`),re(e)}}function tr(){for(const e of C.values())clearTimeout(e);C.clear()}function Ke(e){const r=e.trim();if(r.length<8)return r;for(let t=1;t<=r.length/2;t++){if(r.length%t!==0)continue;const n=r.slice(0,t);let o=!0;for(let i=t;i<r.length;i+=t)if(r.slice(i,i+t)!==n){o=!1;break}if(o&&n.length<r.length)return n}return r}function Ue(e){const r=g(e);if(!r)return r;const t=Ke(r);return t!==r&&a.warn(`[AutoRegister] userKey \u7591\u4F3C\u88AB\u590D\u5236\u4E86\u4E24\u904D\uFF08\u957F\u5EA6 ${r.length} \u2192 ${t.length}\uFF09\uFF0C\u5DF2\u81EA\u52A8\u53BB\u91CD\u3002\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u662F\u5426\u91CD\u590D\u7C98\u8D34\u3002`),t}function g(e){return e==null?void 0:String(e).trim()||void 0}function _(e){return T(e)}function te(e){return Array.isArray(e.autoRegisterTargets)?e.autoRegisterTargets.filter(r=>!!(r&&typeof r=="object"&&!Array.isArray(r))):[]}function N(e){const r=e?.serverUrl||p;return P(r,e?.credentialId||e?.userKey)}function y(e){return e?.credentialId||e?.userKey}function W(e){if(typeof e=="boolean")return e;if(typeof e=="string"){const r=e.trim().toLowerCase();if(["true","1","yes","y"].includes(r))return!0;if(["false","0","no","n"].includes(r))return!1}}function ne(e){if(e==null||e==="")return;const r=Number(e);return Number.isFinite(r)?r:void 0}function O(e){const r=g(e.serverUrl)||g(e.schedulerBaseUrl),t=g(e.connectionKey)||g(e.password);return{enabled:W(e.enabled),serverUrl:r,tenantId:g(e.tenantId),userId:g(e.userId),userKey:Ue(e.userKey),machineToken:g(e.machineToken),connectionKey:t,instanceName:g(e.instanceName),instanceId:g(e.instanceId),credentialId:g(e.credentialId),credentialRef:g(e.credentialRef),credentialType:g(e.credentialType),projectId:g(e.projectId),roleName:g(e.roleName),workspacePath:g(e.workspacePath),registerAddr:g(e.registerAddr),registerIp:g(e.registerIp),virtualIp:g(e.virtualIp),tunnel:W(e.tunnel),preferSameLanIp:W(e.preferSameLanIp),maxRetries:ne(e.maxRetries),retryInterval:ne(e.retryInterval)}}function se(){const e=S();try{if(!m.existsSync(e))return a.debug(`[AutoRegister] \u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`),null;const r=m.readFileSync(e,"utf-8"),t=JSON.parse(r);return a.info(`[AutoRegister] \u4ECE\u914D\u7F6E\u6587\u4EF6\u52A0\u8F7D\u914D\u7F6E: ${e}`),O(t)}catch(r){const t=r;return a.warn(`[AutoRegister] \u8BFB\u53D6\u914D\u7F6E\u6587\u4EF6\u5931\u8D25: ${e}, error: ${t.message}`),null}}function ke(){const e=S();try{if(!m.existsSync(e))return[];const r=m.readFileSync(e,"utf-8"),t=JSON.parse(r),n=O(t),o=Array.isArray(t.autoRegisterTargets)?t.autoRegisterTargets:[];return o.length===0?n.userKey||n.machineToken?[n]:[]:o.filter(i=>!!(i&&typeof i=="object"&&!Array.isArray(i))).map(i=>{const s=O(i);return{...n,...s,machineToken:s.machineToken||(s.userKey?void 0:n.machineToken),connectionKey:s.connectionKey}})}catch(r){const t=r;return a.warn(`[AutoRegister] \u8BFB\u53D6\u81EA\u52A8\u6CE8\u518C\u76EE\u6807\u5931\u8D25: ${e}, error: ${t.message}`),[]}}function nr(){const e=S();if(!m.existsSync(e))return[];let r;try{r=JSON.parse(m.readFileSync(e,"utf-8"))}catch(s){return a.warn(`[AutoRegister] \u8BFB\u53D6 config.json \u5931\u8D25\uFF08targets \u6458\u8981\uFF09: ${s.message}`),[]}const t=O(r),n=Array.isArray(r.autoRegisterTargets)?r.autoRegisterTargets:[],o=n.length>0?n.filter(s=>!!(s&&typeof s=="object"&&!Array.isArray(s))).map(s=>{const c=O(s);return{...t,...c,machineToken:c.machineToken||(c.userKey?void 0:t.machineToken),connectionKey:c.connectionKey}}):t.userKey||t.machineToken?[t]:[],i=s=>{const c=String(s||"").trim();return c?c.length<=8?"****":`${c.slice(0,8)}****${c.slice(-4)}`:""};return o.map((s,c)=>({index:c,serverUrl:s.serverUrl||"",instanceName:s.instanceName||"",registerAddr:s.registerAddr||s.registerIp||s.virtualIp||"",tunnel:typeof s.tunnel=="boolean"?s.tunnel:null,userKeyMasked:i(s.userKey),machineTokenSet:!!String(s.machineToken||"").trim(),credentialType:s.credentialType||"",credentialId:s.credentialId||"",credentialRef:s.credentialRef||"",connectionKeySet:!!String(s.connectionKey||"").trim()}))}function ie(){const e={};return process.env.AWS_AUTO_REGISTER==="true"&&(e.enabled=!0),process.env.AWS_RUNTIME_SCHEDULER_BASE_URL&&(e.serverUrl=process.env.AWS_RUNTIME_SCHEDULER_BASE_URL),process.env.AWS_TENANT_ID&&(e.tenantId=process.env.AWS_TENANT_ID),process.env.AWS_USER_KEY&&(e.userKey=process.env.AWS_USER_KEY),process.env.AWS_BRIDGE_MACHINE_TOKEN&&(e.machineToken=process.env.AWS_BRIDGE_MACHINE_TOKEN),process.env.AWS_BRIDGE_CONNECTION_KEY&&(e.connectionKey=process.env.AWS_BRIDGE_CONNECTION_KEY),process.env.AWS_INSTANCE_NAME&&(e.instanceName=process.env.AWS_INSTANCE_NAME),process.env.AWS_PROJECT_NAME&&(e.projectId=process.env.AWS_PROJECT_NAME),process.env.AWS_ROLE_NAME&&(e.roleName=process.env.AWS_ROLE_NAME),process.env.AWS_WORKSPACE_PATH&&(e.workspacePath=process.env.AWS_WORKSPACE_PATH),process.env.AWS_REGISTER_ADDR&&(e.registerAddr=process.env.AWS_REGISTER_ADDR),process.env.AWS_REGISTER_IP&&(e.registerIp=process.env.AWS_REGISTER_IP),process.env.AWS_VIRTUAL_IP&&(e.virtualIp=process.env.AWS_VIRTUAL_IP),process.env.AWS_PREFER_SAME_LAN_IP&&(e.preferSameLanIp=W(process.env.AWS_PREFER_SAME_LAN_IP)??!0),process.env.AWS_REGISTER_MAX_RETRIES&&(e.maxRetries=parseInt(process.env.AWS_REGISTER_MAX_RETRIES,10)),process.env.AWS_REGISTER_RETRY_INTERVAL&&(e.retryInterval=parseInt(process.env.AWS_REGISTER_RETRY_INTERVAL,10)),e}function L(){const e=se(),r=ie(),t={...Q,...e||{},...r},n=t.instanceName||w.hostname();let o=!1;return process.env.AWS_AUTO_REGISTER!==void 0?o=process.env.AWS_AUTO_REGISTER==="true":e&&(o=!0),{enabled:o,serverUrl:t.serverUrl||p,tenantId:t.tenantId||"",userKey:t.userKey||"",machineToken:t.machineToken,connectionKey:t.connectionKey,instanceName:n,instanceId:t.instanceId,credentialId:t.credentialId,credentialRef:t.credentialRef,credentialType:t.credentialType,projectId:t.projectId,roleName:t.roleName,workspacePath:t.workspacePath,registerAddr:t.registerAddr,registerIp:t.registerIp,virtualIp:t.virtualIp,tunnel:typeof t.tunnel=="boolean"?t.tunnel:void 0,preferSameLanIp:t.preferSameLanIp!==!1,maxRetries:t.maxRetries,retryInterval:t.retryInterval}}function h(){const e=ke(),r=ie(),n=(e.length>0?e:[se()||{}]).map(o=>{const i={...Q,...o,...r};let s=!1;return process.env.AWS_AUTO_REGISTER!==void 0?s=process.env.AWS_AUTO_REGISTER==="true":s=e.length>0||!!(i.userKey||i.machineToken),{enabled:s,serverUrl:i.serverUrl||p,tenantId:i.tenantId||"",userId:i.userId,userKey:i.userKey||"",machineToken:i.machineToken,connectionKey:i.connectionKey,instanceName:i.instanceName||w.hostname(),instanceId:i.instanceId,credentialId:i.credentialId,credentialRef:i.credentialRef,credentialType:i.credentialType,projectId:i.projectId,roleName:i.roleName,workspacePath:i.workspacePath,registerAddr:i.registerAddr,registerIp:i.registerIp,virtualIp:i.virtualIp,tunnel:typeof i.tunnel=="boolean"?i.tunnel:void 0,preferSameLanIp:i.preferSameLanIp!==!1,maxRetries:i.maxRetries,retryInterval:i.retryInterval}});return k=n.map(o=>o.connectionKey).filter(o=>!!(o&&o.trim())),n}function _e(){const e=w.networkInterfaces(),r=[];for(const t of Object.keys(e)){const n=e[t];if(n)for(const o of n)o.family==="IPv4"&&!o.internal&&r.push({address:o.address,netmask:o.netmask,name:t})}return r}function J(e){const r=e.split(".").map(Number);return(r[0]<<24)+(r[1]<<16)+(r[2]<<8)+r[3]}function Ee(e,r,t){const n=J(e),o=J(r),i=J(t);return(n&i)===(o&i)}function Ne(e){try{const r=new URL(e);return r.hostname==="localhost"||r.hostname==="127.0.0.1"?"127.0.0.1":/^(\d{1,3}\.){3}\d{1,3}$/.test(r.hostname)?r.hostname:null}catch{return null}}function we(e){return e==="127.0.0.1"}function Be(e){const r=_e();if(r.length===0)return a.warn("[AutoRegister] \u672A\u627E\u5230\u4EFB\u4F55\u975E\u5185\u90E8 IP \u5730\u5740\uFF0C\u4F7F\u7528 127.0.0.1"),"127.0.0.1";const t=Ne(e);if(t){if(we(t))return"127.0.0.1";for(const n of r)if(Ee(n.address,t,n.netmask))return a.info(`[AutoRegister] \u627E\u5230\u4E0E\u8C03\u5EA6\u4E2D\u5FC3\u540C\u5B50\u7F51\u7684 IP: ${n.address} (\u7F51\u5361: ${n.name}, \u5B50\u7F51\u63A9\u7801: ${n.netmask})`),n.address;a.warn(`[AutoRegister] \u672A\u627E\u5230\u4E0E\u8C03\u5EA6\u4E2D\u5FC3 (${t}) \u540C\u5B50\u7F51\u7684\u672C\u673A IP\uFF0C\u4F7F\u7528 127.0.0.1`)}else a.warn("[AutoRegister] \u65E0\u6CD5\u89E3\u6790\u8C03\u5EA6\u4E2D\u5FC3 IP\uFF0C\u4F7F\u7528 127.0.0.1");return"127.0.0.1"}function $e(e=p){return Be(e)}function oe(e){const r=e||L();return!r.enabled||!r.userKey&&!r.machineToken?!1:r.tunnel===!0?!0:r.tunnel===!1?!1:!r.registerAddr&&!r.registerIp&&!r.virtualIp}function j(e){const r=ge();if(oe(e)){const i=e.serverUrl||p;try{const s=new URL(i);if(!e.instanceId)a.warn("[AutoRegister] \u96A7\u9053\u6A21\u5F0F\u4F46\u7F3A\u5C11 instanceId\uFF0C\u964D\u7EA7\u4E3A\u76F4\u8FDE\u6A21\u5F0F");else return`${s.protocol}//${s.host}/tunnel/${e.instanceId}`}catch{a.warn("[AutoRegister] serverUrl \u89E3\u6790\u5931\u8D25\uFF0C\u964D\u7EA7\u4E3A\u76F4\u8FDE\u6A21\u5F0F")}}const t=pe()||e.preferSameLanIp===!1?"127.0.0.1":$e(e.serverUrl||p),n=e.registerAddr||e.registerIp||e.virtualIp||t;return n?/^https?:\/\//i.test(n)?n:/:[0-9]+$/.test(n)?`http://${n}`:`http://${n}:${r}`:`http://127.0.0.1:${r}`}function b(){return h()[0]||L()}function sr(e){return Ce(e)?.serverUrl}function Ce(e){const r=String(e||"").trim();if(!r)return;for(const n of h()){if(!n?.serverUrl)continue;const o=H(n.serverUrl,y(n));if(o&&o===r)return{serverUrl:T(n.serverUrl)||n.serverUrl,userKey:n.userKey,identityKey:y(n),instanceId:n.instanceId};const i=Se(n.serverUrl);for(const s of i){if(s.accessToken!==r)continue;const c=ye(n.userKey)===s.userKeyFingerprint?n.userKey:void 0;return{serverUrl:T(n.serverUrl)||n.serverUrl,userKey:c,identityKey:c}}}const t=z();if(t.schedulerBaseUrl){const n=H(t.schedulerBaseUrl);if(n&&n===r)return{serverUrl:T(t.schedulerBaseUrl)||t.schedulerBaseUrl}}}function Oe(e){if(!e)return;const r=Object.entries(d.registrations).find(([,t])=>t===e);return r?G(r[0]):void 0}function be(e,r){const t=T(e);if(!t)return;if(String(r||"").trim()){const o=d.registrations[P(t,r)];return o||void 0}const n=Object.entries(d.registrations).filter(([o])=>G(o)===t);return n.length===1?n[0][1]:void 0}function F(e,r){const t=Oe(r);if(t)return t;const n=g(e.serverUrl);if(n&&(n!==p||process.env.AWS_RUNTIME_SCHEDULER_BASE_URL))return n;const o=z(),i=g(o.schedulerBaseUrl);return o.status==="paired"&&i?i:n||p}function xe(){const e={clientVersion:me()};try{const r=x.join(x.dirname(le(import.meta.url)),".."),t=x.join(r,"index.jsc"),n=m.existsSync(t)?t:x.join(r,"index.js"),o=ue("sha256").update(m.readFileSync(n)).digest("hex");e.entrySha256=o.slice(0,16)}catch{}return e}async function Pe(e){const r=e.instanceName||w.hostname(),t=e.serverUrl||p,n={tenantId:e.tenantId,userKey:e.machineToken?void 0:e.userKey,machineToken:e.machineToken,instanceId:e.instanceId,instanceName:r,hostname:w.hostname(),virtualIp:e.registerAddr||e.registerIp||e.virtualIp,runtimeBridgeBaseUrl:j(e),connectionKey:e.connectionKey,workspacePath:e.workspacePath,projectId:e.projectId,roleName:e.roleName,...xe()};return a.info(`[AutoRegister] \u6B63\u5728\u6CE8\u518C\u5B9E\u4F8B: ${r}`),a.info(`[AutoRegister] \u8C03\u5EA6\u4E2D\u5FC3: ${t}`),a.info(e.machineToken?"[AutoRegister] \u51ED\u636E: \u673A\u5668\u81EA\u6301\u51ED\u636E\uFF08machineToken\uFF09":`[AutoRegister] \u7528\u6237 Key: ${e.userKey?"****"+e.userKey.slice(-4):"(\u672A\u8BBE\u7F6E)"}`),a.info(`[AutoRegister] \u79DF\u6237 ID: ${e.tenantId||"(\u81EA\u52A8\u63A8\u5BFC)"}`),(await B.post(`${t}/api/instances/register`,n,{headers:{"Content-Type":"application/json"},timeout:1e4})).data}function We(e,r,t,n,o,i,s,c,u){const l=S();return D(l,()=>{if(!m.existsSync(l))return;const I=m.readFileSync(l,"utf-8"),v=JSON.parse(I),U=T(e);if(!U)return;let A=!1;const R=f=>T(String(f.serverUrl||f.schedulerBaseUrl||""))!==U?!1:String(t||"").trim()?String(f.userKey??"").trim()===String(t).trim():String(s||"").trim()?String(f.machineToken??"").trim()===String(s).trim():!0,K=f=>{R(f)&&(r&&f.instanceId!==r&&(f.instanceId=r,A=!0),n&&f.credentialId!==n&&(f.credentialId=n,A=!0),o&&f.credentialRef!==o&&(f.credentialRef=o,A=!0),i&&f.credentialType!==i&&(f.credentialType=i,A=!0),c&&f.tenantId!==c&&(f.tenantId=c,A=!0),u&&f.userId!==u&&(f.userId=u,A=!0))};if(Array.isArray(v.autoRegisterTargets))for(const f of v.autoRegisterTargets)f&&typeof f=="object"&&!Array.isArray(f)&&K(f);else K(v);A&&(m.writeFileSync(l,JSON.stringify(v,null,2),"utf-8"),a.info(`[AutoRegister] \u5DF2\u56DE\u5199 instanceId \u5230 config.json (serverUrl=${e}${t?`, userKey=****${String(t).slice(-4)}`:""})`))})}async function Le(e,r){const t=String(r||"").trim();if(!t)return;const n=y(e),o=_(e.serverUrl);if(!n||!o)return;const i=S();try{await D(i,()=>{if(!m.existsSync(i))return;const s=m.readFileSync(i,"utf-8"),c=JSON.parse(s),l=te(c).find(I=>_(I.serverUrl||I.schedulerBaseUrl)===o&&String(I.credentialId||I.userKey||"").trim()===n);if(!l){a.warn(`[AutoRegister] \u65E0\u6CD5\u5B9A\u4F4D connectionKey \u5BF9\u5E94 target\uFF0C\u8DF3\u8FC7\u5199\u76D8: server=${o}`);return}String(l.connectionKey??"").trim()!==t&&(l.connectionKey=t,m.writeFileSync(i,JSON.stringify(c,null,2),"utf-8"),a.info(`[AutoRegister] \u5DF2\u5199\u5165 target connectionKey \u5230 config.json: ${i}`))})}catch(s){a.warn(`[AutoRegister] \u5199\u5165 target connectionKey \u5230 config.json \u5931\u8D25: ${s.message}`)}}async function ir(e,r){const t=String(e||"").trim();if(!t)throw new Error("connectionKey is required");const n=_(r?.serverUrl);if(!n)throw new Error("serverUrl is required to rotate a target connectionKey");const o=S();let i;const s=await D(o,()=>{if(!m.existsSync(o))return!1;const l=JSON.parse(m.readFileSync(o,"utf-8")),I=te(l),v=String(r?.instanceId||"").trim(),U=String(r?.credentialId||"").trim(),A=I.filter(K=>{if(_(K.serverUrl||K.schedulerBaseUrl)!==n)return!1;if(v&&String(K.instanceId||"").trim()===v)return!0;if(U){const E=String(K.credentialId||"").trim(),ce=String(K.userKey||"").trim();if(E===U||ce===U)return!0}return!v&&!U&&I.filter(E=>_(E.serverUrl||E.schedulerBaseUrl)===n).length===1});if(A.length!==1)throw new Error(`\u65E0\u6CD5\u552F\u4E00\u5B9A\u4F4D connectionKey \u5BF9\u5E94 target\uFF08server=${n}, matches=${A.length}\uFF09`);const R=A[0];return String(R.connectionKey??"").trim()===t?!1:(i={targetKey:P(String(R.serverUrl??R.schedulerBaseUrl??""),R.credentialId||R.userKey),previousConnectionKey:String(R.connectionKey??"").trim()},R.connectionKey=t,String(l.connectionKey??"").trim()&&delete l.connectionKey,m.writeFileSync(o,JSON.stringify(l,null,2),"utf-8"),a.info(`[AutoRegister] \u5DF2\u8F6E\u6362 target connectionKey \u5E76\u5199\u56DE config.json: ${o}`),!0)}),c=!!process.env.AWS_BRIDGE_CONNECTION_KEY;c&&s&&(process.env.AWS_BRIDGE_CONNECTION_KEY=t,a.warn("[AutoRegister] \u68C0\u6D4B\u5230 AWS_BRIDGE_CONNECTION_KEY \u73AF\u5883\u53D8\u91CF\uFF0C\u5DF2\u540C\u6B65\u66F4\u65B0\u5F53\u524D\u8FDB\u7A0B\uFF1B\u91CD\u542F bridge \u540E\u4F1A\u56DE\u5230\u73AF\u5883\u53D8\u91CF\u4E2D\u7684\u65E7\u503C\uFF0C\u8BF7\u4E00\u5E76\u4FEE\u6539\u90E8\u7F72\u914D\u7F6E"));const u=h().map(l=>String(l.connectionKey||"").trim()).filter(l=>l.length>0);return k=s?[...new Set([t,...u])]:[...new Set(u)],s&&i&&i.previousConnectionKey!==t&&$.set(i.targetKey,{key:i.previousConnectionKey,expiresAt:Date.now()+Te}),{envOverrideWarning:c,rotated:s}}async function ae(e){let r=0;for(const t of e)String(t.connectionKey||"").trim()||(t.connectionKey=`awsb_${de(24).toString("base64url")}`,r+=1,k.includes(t.connectionKey)||(k=[...k,t.connectionKey]),await Le(t,t.connectionKey));r!==0&&a.info(`[AutoRegister] ${r} \u4E2A\u76EE\u6807\u7F3A\u5C11 connectionKey\uFF0C\u5DF2\u6309 target \u72EC\u7ACB\u751F\u6210\u5E76\u5199\u5165 config.json`)}function q(e){if(!e)return;const r=Object.entries(d.registrations).find(([,i])=>i===e);if(!r)return;const t=r[0],n=G(t),o=h().find(i=>N(i)===t);return{serverUrl:n,identityKey:o?y(o):void 0,targetKey:t}}async function je(e){const r=q(e),t=r?.serverUrl||F(b(),e),n=M(t,r?.identityKey);if(!n)throw new Error("runtimeAccessToken is required to unregister bridge instance");return(await B.post(`${t}/api/instances/unregister`,{instanceId:e},{headers:{"Content-Type":"application/json","X-Runtime-Token":n},timeout:1e4})).data}async function or(e){const r=e?[{...L(),...e}]:h();await ae(r);const n=(r.length>1?await Promise.all(r.map(i=>Y(i))):[await Y(r[0]||L())]).every(Boolean),o=r.every(i=>!i.enabled||!i.userKey&&!i.machineToken);if(!e&&(n||o)){const{stopTunnelClientsExcept:i}=await import("./tunnel-client.js");i(r.filter(s=>!!s.serverUrl).map(s=>P(s.serverUrl,y(s))))}return n}async function Y(e,r){if(!e.enabled)return a.info("[AutoRegister] \u81EA\u52A8\u6CE8\u518C\u672A\u542F\u7528"),a.info(`[AutoRegister] \u8981\u542F\u7528\u81EA\u52A8\u6CE8\u518C\uFF0C\u8BF7\u521B\u5EFA\u914D\u7F6E\u6587\u4EF6 ${S()} \u6216\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF AWS_AUTO_REGISTER=true`),!1;if(!e.userKey&&!e.machineToken)return a.error("[AutoRegister] \u7F3A\u5C11\u6CE8\u518C\u51ED\u636E\uFF08\u5728\u914D\u7F6E\u6587\u4EF6\u4E2D\u8BBE\u7F6E userKey \u6216 machineToken\uFF0C\u4E5F\u53EF\u7528 `awsb pair --ticket ...` \u914D\u5BF9\uFF09"),!1;String(e.connectionKey||"").trim()||await ae([e]);const t=oe(e);t&&!e.instanceId&&(e.instanceId=`bridge-${fe().replace(/-/g,"").slice(0,12)}`,a.info(`[AutoRegister] \u96A7\u9053\u6A21\u5F0F\uFF1A\u5DF2\u9884\u58F0\u660E instanceId=${e.instanceId}`));const n=r?.backgroundRetry?1:e.maxRetries??3,o=e.retryInterval??2e3;for(let i=1;i<=n;i++){try{d.lastAttempt=new Date;const s=await Pe(e);if(s.success){if(d.registered=!0,d.instanceId=s.instanceId,s.credentialId&&(e.credentialId=s.credentialId,e.credentialType=s.credentialType),e.credentialRef=s.credentialRef,s.tenantId&&(e.tenantId=s.tenantId),s.userId&&(e.userId=s.userId),s.instanceId&&(d.registrations[N(e)]=s.instanceId,e.instanceId=s.instanceId),d.error=void 0,a.info("[AutoRegister] \u2713 \u6CE8\u518C\u6210\u529F\uFF01"),a.info(`[AutoRegister] \u5B9E\u4F8B ID: ${s.instanceId}`),a.info(`[AutoRegister] \u6D88\u606F: ${s.message}`),a.info(`[AutoRegister] \u66F4\u65B0: ${s.isUpdate?"\u662F":"\u5426"}`),s.runtimeAccessToken)try{const c=e.serverUrl||p;V({accessToken:s.runtimeAccessToken,instanceId:s.instanceId,userId:s.userId,schedulerBaseUrl:c,userKey:y(e)});const u=T(s.serverUrl);u&&u!==T(c)&&(X({serverBaseUrl:u,accessToken:s.runtimeAccessToken,userKey:y(e)}),a.info(`[AutoRegister] \u68C0\u6D4B\u5230 server \u4E0B\u53D1\u5730\u5740(${u})\u4E0E\u8FDE\u63A5\u5730\u5740(${c})\u4E0D\u540C\uFF0C\u5DF2\u6309\u4E24\u4E2A\u5730\u5740\u5206\u522B\u4FDD\u5B58 scoped token`)),a.info("[AutoRegister] \u5DF2\u4FDD\u5B58\u8C03\u5EA6\u4E2D\u5FC3\u4E0B\u53D1\u7684 runtime access token"),s.instanceId&&We(e.serverUrl||p,s.instanceId,e.userKey,s.credentialId,s.credentialRef,s.credentialType,e.machineToken,s.tenantId,s.userId).catch(l=>{a.warn(`[AutoRegister] \u56DE\u5199 instanceId \u5230 config.json \u5931\u8D25: ${l.message}`)})}catch(c){const u=c;return a.error(`[AutoRegister] \u4FDD\u5B58 runtime access token \u5931\u8D25: ${u.message}`),d.error=u.message,!1}else a.warn("[AutoRegister] \u6CE8\u518C\u54CD\u5E94\u672A\u5305\u542B runtime access token\uFF0CMCP \u5C06\u65E0\u6CD5\u8BBF\u95EE\u8C03\u5EA6\u4E2D\u5FC3\uFF0C\u8BF7\u68C0\u67E5 server \u7684 bridge \u5B9E\u4F8B token \u9881\u53D1\u903B\u8F91");if(t&&s.instanceId&&s.runtimeAccessToken){const{startTunnelClient:c}=await import("./tunnel-client.js"),u=e.serverUrl||p;c(u,s.instanceId,y(e)),a.info(`[AutoRegister] \u96A7\u9053\u5BA2\u6237\u7AEF\u5DF2\u542F\u52A8: server=${u}, instanceId=${s.instanceId}${e.userKey?`, userKey=****${e.userKey.slice(-4)}`:""}`)}return!0}else a.warn(`[AutoRegister] \u6CE8\u518C\u5931\u8D25: ${s.message}`),d.error=s.message}catch(s){const c=s,u=c.response?.data?JSON.stringify(c.response.data):c.message;a.error(`[AutoRegister] \u6CE8\u518C\u8BF7\u6C42\u5931\u8D25 (\u5C1D\u8BD5 ${i}/${n}): ${u}`),d.error=u}i<n&&(a.info(`[AutoRegister] ${o/1e3} \u79D2\u540E\u91CD\u8BD5...`),await new Promise(s=>setTimeout(s,o)))}return r?.backgroundRetry?a.warn(`[AutoRegister] \u540E\u53F0\u91CD\u8BD5\u6CE8\u518C\u4ECD\u672A\u6210\u529F (server=${e.serverUrl||p}): ${d.error||"\u672A\u77E5"}`):(a.error("[AutoRegister] \u2717 \u6CE8\u518C\u5931\u8D25\uFF0C\u5DF2\u8FBE\u6700\u5927\u91CD\u8BD5\u6B21\u6570"),a.error("[AutoRegister] ========================================"),a.error("[AutoRegister] \u81EA\u52A8\u6CE8\u518C\u5DF2\u542F\u7528\u4F46\u6CE8\u518C\u5931\u8D25\uFF0C\u5B9E\u4F8B\u6682\u65F6\u65E0\u6CD5\u6B63\u5E38\u5DE5\u4F5C"),a.error("[AutoRegister] \u8BF7\u68C0\u67E5\u4EE5\u4E0B\u914D\u7F6E\uFF1A"),a.error(`[AutoRegister] - \u7528\u6237 Key (userKey): ${e.userKey?"****"+e.userKey.slice(-4):"(\u672A\u8BBE\u7F6E)"}`),a.error(`[AutoRegister] - \u79DF\u6237 ID (tenantId): ${e.tenantId||"(\u53EF\u9009\uFF0C\u5C06\u81EA\u52A8\u63A8\u5BFC)"}`),a.error(`[AutoRegister] - \u5B9E\u4F8B\u540D (instanceName): ${e.instanceName||"(\u4F7F\u7528\u4E3B\u673A\u540D)"}`),a.error(`[AutoRegister] - \u8C03\u5EA6\u4E2D\u5FC3\u5730\u5740: ${e.serverUrl||p}`),a.error(`[AutoRegister] - \u6700\u540E\u9519\u8BEF: ${d.error||"\u672A\u77E5"}`),a.error("[AutoRegister] ========================================"),a.error(`[AutoRegister] \u914D\u7F6E\u6765\u6E90\uFF1A${S()} \u6216\u73AF\u5883\u53D8\u91CF`),a.warn(`[AutoRegister] \u5C06\u5728\u540E\u53F0\u6301\u7EED\u91CD\u8BD5\u6CE8\u518C\uFF08\u6BCF ${Math.round(ee()/1e3)} \u79D2\uFF09\uFF0C\u76F4\u5230\u4E0E\u8C03\u5EA6\u4E2D\u5FC3\u5EFA\u7ACB\u8FDE\u63A5`)),re(e),!1}async function ar(){const e=b();if(!e.userKey&&!e.machineToken)return{success:!1,error:"userKey or machineToken is required for runtime token refresh"};const r=Re(),t=F(e),n=j(e);try{const o=await B.post(`${t}/api/instances/runtime-tokens/refresh`,{tenantId:e.tenantId,userKey:e.machineToken?void 0:e.userKey,machineToken:e.machineToken,instanceId:r.instanceId,instanceName:e.instanceName,runtimeBridgeBaseUrl:n},{headers:{"Content-Type":"application/json"},timeout:1e4});if(!o.data.success||!o.data.runtimeAccessToken)return{success:!1,error:o.data.message||"scheduler did not return runtimeAccessToken"};const s=M(t,y(e))!==o.data.runtimeAccessToken;return V({accessToken:o.data.runtimeAccessToken,instanceId:r.instanceId,userId:o.data.userId||e.userKey||e.credentialId||"",schedulerBaseUrl:t,userKey:y(e)}),{success:!0,runtimeAccessToken:o.data.runtimeAccessToken,updated:s}}catch(o){const i=o;return{success:!1,error:i.response?.data?JSON.stringify(i.response.data):i.message}}}async function cr(e,r){const t=_(e);if(!t)return{success:!1,error:"serverUrl is required for runtime token refresh"};const n=h().filter(u=>_(u.serverUrl)===t),o=String(r||"").trim(),i=o?n.find(u=>String(u.userKey||"").trim()===o||String(u.credentialId||"").trim()===o):n.length===1?n[0]:void 0;if(!i)return{success:!1,error:o?"no auto-register target matches this identity":"multiple auto-register targets share this serverUrl; specify the target identity"};if(!i.userKey&&!i.machineToken)return{success:!1,error:"userKey or machineToken is required for runtime token refresh"};const s={instanceId:be(t,y(i))},c=j(i);try{const u=await B.post(`${t}/api/instances/runtime-tokens/refresh`,{tenantId:i.tenantId,userKey:i.machineToken?void 0:i.userKey,machineToken:i.machineToken,instanceId:s.instanceId,instanceName:i.instanceName,runtimeBridgeBaseUrl:c},{headers:{"Content-Type":"application/json"},timeout:1e4});if(!u.data.success||!u.data.runtimeAccessToken)return{success:!1,error:u.data.message||"scheduler did not return runtimeAccessToken"};const I=M(t,y(i))!==u.data.runtimeAccessToken;return X({serverBaseUrl:t,accessToken:u.data.runtimeAccessToken,userKey:y(i)}),{success:!0,runtimeAccessToken:u.data.runtimeAccessToken,updated:I}}catch(u){const l=u;return{success:!1,error:l.response?.data?JSON.stringify(l.response.data):l.message}}}async function ur(){if(!d.registered||!d.instanceId)return a.info("[AutoRegister] \u5B9E\u4F8B\u672A\u6CE8\u518C\uFF0C\u65E0\u9700\u6CE8\u9500"),!0;const e=q(d.instanceId),r=e?h().find(t=>N(t)===e.targetKey):void 0;if(r&&(String(r.machineToken||"").trim()||r.credentialType==="MACHINE_TOKEN"))return a.info(`[AutoRegister] \u673A\u5668\u51ED\u636E\u76EE\u6807\uFF08instanceId=${d.instanceId}\uFF09\u8DF3\u8FC7\u6CE8\u9500\uFF1A\u914D\u5BF9\u8EAB\u4EFD\u5FC5\u987B\u8DE8\u91CD\u542F\u5B58\u6D3B\uFF0C\u4E0D\u5220\u9664\u8C03\u5EA6\u4E2D\u5FC3\u767B\u8BB0\u884C`),!0;try{const t=await je(d.instanceId);if(t.success){a.info(`[AutoRegister] \u2713 \u6CE8\u9500\u6210\u529F: ${d.instanceId}`);const n=q(d.instanceId),o=n?.serverUrl||F(b(),d.instanceId);z().schedulerBaseUrl&&Ae(o,n?.identityKey),Ie();try{const{stopTunnelClientForTarget:s}=await import("./tunnel-client.js");s(o,n?.identityKey??y(b()))}catch(s){a.warn(`[AutoRegister] \u6CE8\u9500\u540E\u505C\u6B62\u96A7\u9053\u5931\u8D25: ${s.message}`)}if(!n)d.registered=!1,d.instanceId=void 0;else{delete d.registrations[n.targetKey];const s=Object.entries(d.registrations);d.registered=s.length>0,d.instanceId=s[s.length-1]?.[1]}return!0}else return a.warn(`[AutoRegister] \u6CE8\u9500\u5931\u8D25: ${t.message}`),!1}catch(t){const n=t;return a.error(`[AutoRegister] \u6CE8\u9500\u8BF7\u6C42\u5931\u8D25: ${n.message}`),!1}}function dr(){return{...d}}function lr(){return d.registered}function fr(){return d.instanceId}async function gr(){const e=b(),r=d.instanceId,t=F(e,r),n={};if(r&&(n.instanceId=r),e.enabled&&(n.runtimeBridgeBaseUrl=j(e)),!n.instanceId&&!n.runtimeBridgeBaseUrl)return a.info("[AutoRegister] Bridge \u91CD\u542F\u6E05\u7406\uFF1A\u6CA1\u6709 instanceId \u6216 runtimeBridgeBaseUrl\uFF0C\u8DF3\u8FC7\u6E05\u7406"),{success:!0,agentCount:0};try{a.info("[AutoRegister] Bridge \u91CD\u542F\u6E05\u7406\uFF1A\u6B63\u5728\u901A\u77E5\u8C03\u5EA6\u4E2D\u5FC3..."),a.info(`[AutoRegister] instanceId: ${n.instanceId||"(\u65E0)"}`),a.info(`[AutoRegister] runtimeBridgeBaseUrl: ${n.runtimeBridgeBaseUrl||"(\u65E0)"}`);const o=await B.post(`${t}/api/instances/bridge-restart-cleanup`,n,{headers:{"Content-Type":"application/json"},timeout:1e4});return o.data.success?(a.info(`[AutoRegister] \u2713 Bridge \u91CD\u542F\u6E05\u7406\u6210\u529F\uFF1A${o.data.message}`),a.info(`[AutoRegister] \u6E05\u7406\u4E86 ${o.data.agentCount||0} \u4E2A Agent`),{success:!0,agentCount:o.data.agentCount||0}):(a.warn(`[AutoRegister] Bridge \u91CD\u542F\u6E05\u7406\u5931\u8D25\uFF1A${o.data.message}`),{success:!1,error:o.data.message})}catch(o){const i=o,s=i.response?.data?JSON.stringify(i.response.data):i.message;return a.warn(`[AutoRegister] Bridge \u91CD\u542F\u6E05\u7406\u8BF7\u6C42\u5931\u8D25\uFF1A${s}`),{success:!1,error:s}}}export{or as autoRegister,gr as bridgeRestartCleanup,tr as cancelBackgroundRegisterRetries,Ke as collapseDuplicatedSecret,er as findConfigsByConnectionKey,S as getAutoRegisterConfigFilePath,Ze as getConfiguredConnectionKeys,rr as getCurrentConfiguredConnectionKey,fr as getInstanceId,dr as getRegistrationState,lr as isRegistered,oe as isTunnelConfig,nr as listConfiguredTargetSummaries,L as loadConfig,h as loadConfigs,b as loadPrimaryLifecycleConfig,ir as replaceConfiguredConnectionKey,ar as requestRuntimeAccessTokenRefresh,cr as requestRuntimeAccessTokenRefreshForServer,be as resolveInstanceIdForTarget,j as resolveRuntimeBridgeBaseUrl,sr as resolveSchedulerBaseUrlFromToken,Ce as resolveTargetIdentityFromToken,ur as unregister};
|
|
2
2
|
|
|
@@ -114,6 +114,15 @@ export declare const EMAIL_FEATURE_KEY = "email";
|
|
|
114
114
|
|
|
115
115
|
|
|
116
116
|
|
|
117
|
+
export declare const COLLABORATION_VOICE_FEATURE_KEY = "collaboration.voice";
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
117
126
|
|
|
118
127
|
export declare const GROUP_KEY_TO_FEATURE: ReadonlyMap<string, string>;
|
|
119
128
|
|