aws-runtime-bridge 1.9.40 → 1.9.45
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/dist/adapter/AcodeSdkAdapter.d.ts +31 -4
- package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/AcodeSdkAdapter.js +382 -57
- package/dist/adapter/ClaudeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/ClaudeSdkAdapter.js +1 -0
- package/dist/adapter/OpencodeSdkAdapter.d.ts +19 -0
- package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/OpencodeSdkAdapter.js +62 -0
- package/dist/adapter/types.d.ts +21 -6
- package/dist/adapter/types.d.ts.map +1 -1
- package/dist/adapter/types.js +10 -1
- package/dist/index.js +11 -0
- package/dist/routes/ai-sources.js +4 -1
- package/dist/routes/dashboard.d.ts.map +1 -1
- package/dist/routes/dashboard.js +1 -1
- package/dist/routes/file-browser.d.ts.map +1 -1
- package/dist/routes/file-browser.js +47 -1
- package/dist/routes/processes.d.ts.map +1 -1
- package/dist/routes/processes.js +7 -0
- package/dist/routes/runtime-binding.d.ts.map +1 -1
- package/dist/routes/runtime-binding.js +6 -3
- package/dist/routes/sessions.js +93 -5
- package/dist/routes/sub-agents.js +15 -1
- package/dist/routes/terminal.d.ts +15 -0
- package/dist/routes/terminal.d.ts.map +1 -1
- package/dist/routes/terminal.js +162 -5
- package/dist/services/acode-package.d.ts +8 -1
- package/dist/services/acode-package.d.ts.map +1 -1
- package/dist/services/acode-package.js +33 -4
- package/dist/services/aws-client-agent-mcp.d.ts.map +1 -1
- package/dist/services/aws-client-agent-mcp.js +11 -4
- package/dist/services/fileSnapshotStore.js +1 -1
- package/dist/services/legacy-path-migration.d.ts +3 -0
- package/dist/services/legacy-path-migration.d.ts.map +1 -0
- package/dist/services/legacy-path-migration.js +66 -0
- package/dist/services/lifecycle-state.d.ts.map +1 -1
- package/dist/services/lifecycle-state.js +1 -1
- package/dist/services/runtime-binding.d.ts +5 -0
- package/dist/services/runtime-binding.d.ts.map +1 -1
- package/dist/services/runtime-binding.js +33 -1
- package/dist/services/session-output.d.ts +7 -1
- package/dist/services/session-output.d.ts.map +1 -1
- package/dist/services/session-output.js +16 -2
- package/dist/services/workspace-files.d.ts +48 -0
- package/dist/services/workspace-files.d.ts.map +1 -1
- package/dist/services/workspace-files.js +285 -0
- package/package/acode/dist/built-in-file-tools.d.ts.map +1 -1
- package/package/acode/dist/built-in-file-tools.js +504 -3
- package/package/acode/dist/compaction.d.ts +43 -7
- package/package/acode/dist/compaction.d.ts.map +1 -1
- package/package/acode/dist/compaction.js +286 -31
- package/package/acode/dist/runtime.d.ts +130 -0
- package/package/acode/dist/runtime.d.ts.map +1 -1
- package/package/acode/dist/runtime.js +972 -71
- package/package/acode/dist/sub-agent-manager.d.ts +96 -1
- package/package/acode/dist/sub-agent-manager.d.ts.map +1 -1
- package/package/acode/dist/sub-agent-manager.js +293 -3
- package/package/acode/dist/sub-agent-store.d.ts +8 -1
- package/package/acode/dist/sub-agent-store.d.ts.map +1 -1
- package/package/acode/dist/sub-agent-store.js +55 -0
- package/package/acode/dist/sub-agent-tools.d.ts.map +1 -1
- package/package/acode/dist/sub-agent-tools.js +5 -4
- package/package/acode/dist/sub-agent-types.d.ts +4 -0
- package/package/acode/dist/sub-agent-types.d.ts.map +1 -1
- package/package/acode/dist/types.d.ts +19 -0
- package/package/acode/dist/types.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +9 -0
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/agent-client.js +69 -10
- package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/config.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/config.js +4 -0
- package/package/aws-client-agent-mcp/dist/config.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/constants.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/constants.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/constants.js +3 -1
- package/package/aws-client-agent-mcp/dist/constants.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts +4 -1
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/context-manager.js +6 -2
- package/package/aws-client-agent-mcp/dist/context-manager.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/context-manager.test.js +5 -0
- package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/http-client.d.ts +5 -0
- package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/http-client.js +15 -1
- package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +102 -34
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js +637 -209
- package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +151 -51
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +7 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +18 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +32 -9
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.js +58 -19
- package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js +3 -3
- package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +21 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.js +47 -21
- package/package/aws-client-agent-mcp/dist/message-buffer.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +13 -0
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.js +18 -0
- package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts +9 -0
- package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +34 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.js +146 -18
- package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClaudeSdkAdapter.d.ts","sourceRoot":"","sources":["../../src/adapter/ClaudeSdkAdapter.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ClaudeSdkAdapter.d.ts","sourceRoot":"","sources":["../../src/adapter/ClaudeSdkAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -853,6 +853,7 @@ export class ClaudeSdkAdapter extends EventEmitter {
|
|
|
853
853
|
this.pendingQuestions.set(sessionId, { resolve, toolInput });
|
|
854
854
|
this.emit('ask-user-question', {
|
|
855
855
|
sessionId,
|
|
856
|
+
toolCallId: this.activeToolUseIds.get(sessionId) || undefined,
|
|
856
857
|
questions: toolInput.questions,
|
|
857
858
|
});
|
|
858
859
|
});
|
|
@@ -57,6 +57,25 @@ export declare class OpencodeSdkAdapter extends EventEmitter implements BaseProv
|
|
|
57
57
|
private runSseLoop;
|
|
58
58
|
private handleOpenCodeEvent;
|
|
59
59
|
private handlePartUpdate;
|
|
60
|
+
/**
|
|
61
|
+
* 同步 todowrite 工具调用的 todo 到公共 TodoStore 路径 ~/.acode/todos/{agentId}.json。
|
|
62
|
+
*
|
|
63
|
+
* OpenCode 内置 todowrite 工具与 ACode 共享同一文件格式,确保 poll_message
|
|
64
|
+
* 的 buildTodoReminderNotification() 能在 OpenCode runtime 下正确感知未完成 todo。
|
|
65
|
+
*
|
|
66
|
+
* 触发条件:
|
|
67
|
+
* - toolName 为 todowrite 或 todo_write
|
|
68
|
+
* - state.status 为 completed(工具调用成功完成)
|
|
69
|
+
* - session.config.agentId 存在
|
|
70
|
+
* - toolInput 包含有效的 todos 数组
|
|
71
|
+
*
|
|
72
|
+
* 写入格式(与 ACode TodoStore 一致):
|
|
73
|
+
* { agentId, updatedAt, background, todos: [{content, status, priority}] }
|
|
74
|
+
*
|
|
75
|
+
* 测试替身可通过覆写 getTodoStoreDir 注入临时目录。
|
|
76
|
+
*/
|
|
77
|
+
private getTodoStoreDir;
|
|
78
|
+
private syncTodosFromToolCall;
|
|
60
79
|
private emitEvent;
|
|
61
80
|
private startIdleDetection;
|
|
62
81
|
private stopIdleDetection;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpencodeSdkAdapter.d.ts","sourceRoot":"","sources":["../../src/adapter/OpencodeSdkAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAkB3C,OAAO,EAKL,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EAExB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AA8HpB,qBAAa,kBAAmB,SAAQ,YAAa,YAAW,mBAAmB;IACjF,QAAQ,CAAC,UAAU,cAAc;IACjC,QAAQ,CAAC,WAAW,cAAc;IAElC,OAAO,CAAC,QAAQ,CAA2C;IAC3D,OAAO,CAAC,SAAS,CAAC,CAAoB;IAEhC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkK5E,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqDzG,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBnE,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7F,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAUnG,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAclD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BxD,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,mBAAmB,EAAE;IAIzD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAItC,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI3D,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI9D,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAOpD,OAAO,IAAI,IAAI;IAaf;;;OAGG;YACW,OAAO;YA2BP,aAAa;IAmB3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAahC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,YAAY;YAYN,UAAU;IAuBxB,OAAO,CAAC,mBAAmB;IAiJ3B,OAAO,CAAC,gBAAgB;
|
|
1
|
+
{"version":3,"file":"OpencodeSdkAdapter.d.ts","sourceRoot":"","sources":["../../src/adapter/OpencodeSdkAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAkB3C,OAAO,EAKL,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EAExB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AA8HpB,qBAAa,kBAAmB,SAAQ,YAAa,YAAW,mBAAmB;IACjF,QAAQ,CAAC,UAAU,cAAc;IACjC,QAAQ,CAAC,WAAW,cAAc;IAElC,OAAO,CAAC,QAAQ,CAA2C;IAC3D,OAAO,CAAC,SAAS,CAAC,CAAoB;IAEhC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkK5E,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqDzG,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBnE,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7F,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAUnG,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAclD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BxD,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,mBAAmB,EAAE;IAIzD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAItC,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI3D,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI9D,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAOpD,OAAO,IAAI,IAAI;IAaf;;;OAGG;YACW,OAAO;YA2BP,aAAa;IAmB3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAahC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,YAAY;YAYN,UAAU;IAuBxB,OAAO,CAAC,mBAAmB;IAiJ3B,OAAO,CAAC,gBAAgB;IAwHxB;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,eAAe;YAIT,qBAAqB;IA0CnC,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,kBAAkB;IAuC1B,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,2BAA2B;CAOpC"}
|
|
@@ -720,6 +720,12 @@ export class OpencodeSdkAdapter extends EventEmitter {
|
|
|
720
720
|
this.emit('status-change', sessionId, 'tool_using', { ...actionInfo, usage: session.adapterSession.totalUsage });
|
|
721
721
|
}
|
|
722
722
|
else if (state.status === 'completed') {
|
|
723
|
+
// 同步 todowrite 工具完成的 todo 到公共 TodoStore 路径,供 poll_message 提醒使用
|
|
724
|
+
if (toolName === 'todowrite' || toolName === 'todo_write') {
|
|
725
|
+
this.syncTodosFromToolCall(session, toolInput).catch((err) => {
|
|
726
|
+
console.warn('[OpencodeSdkAdapter] 同步 todo 到文件失败:', err);
|
|
727
|
+
});
|
|
728
|
+
}
|
|
723
729
|
emitToolStart();
|
|
724
730
|
const output = redactTransientClipboardPastePaths(state.output);
|
|
725
731
|
this.emitEvent({
|
|
@@ -745,6 +751,62 @@ export class OpencodeSdkAdapter extends EventEmitter {
|
|
|
745
751
|
}
|
|
746
752
|
}
|
|
747
753
|
}
|
|
754
|
+
/**
|
|
755
|
+
* 同步 todowrite 工具调用的 todo 到公共 TodoStore 路径 ~/.acode/todos/{agentId}.json。
|
|
756
|
+
*
|
|
757
|
+
* OpenCode 内置 todowrite 工具与 ACode 共享同一文件格式,确保 poll_message
|
|
758
|
+
* 的 buildTodoReminderNotification() 能在 OpenCode runtime 下正确感知未完成 todo。
|
|
759
|
+
*
|
|
760
|
+
* 触发条件:
|
|
761
|
+
* - toolName 为 todowrite 或 todo_write
|
|
762
|
+
* - state.status 为 completed(工具调用成功完成)
|
|
763
|
+
* - session.config.agentId 存在
|
|
764
|
+
* - toolInput 包含有效的 todos 数组
|
|
765
|
+
*
|
|
766
|
+
* 写入格式(与 ACode TodoStore 一致):
|
|
767
|
+
* { agentId, updatedAt, background, todos: [{content, status, priority}] }
|
|
768
|
+
*
|
|
769
|
+
* 测试替身可通过覆写 getTodoStoreDir 注入临时目录。
|
|
770
|
+
*/
|
|
771
|
+
getTodoStoreDir() {
|
|
772
|
+
return path.join(os.homedir(), '.acode', 'todos');
|
|
773
|
+
}
|
|
774
|
+
async syncTodosFromToolCall(session, toolInput) {
|
|
775
|
+
const agentId = session.config.agentId;
|
|
776
|
+
if (!agentId)
|
|
777
|
+
return;
|
|
778
|
+
const rawTodos = toolInput['todos'];
|
|
779
|
+
if (!Array.isArray(rawTodos) || rawTodos.length === 0)
|
|
780
|
+
return;
|
|
781
|
+
// 校验并标准化为 TodoItem 格式
|
|
782
|
+
const todos = [];
|
|
783
|
+
for (const item of rawTodos) {
|
|
784
|
+
if (item && typeof item === 'object') {
|
|
785
|
+
const content = typeof item.content === 'string' ? item.content.trim() : '';
|
|
786
|
+
const status = typeof item.status === 'string' ? item.status : '';
|
|
787
|
+
const priority = typeof item.priority === 'string' ? item.priority : '';
|
|
788
|
+
if (content && status && priority) {
|
|
789
|
+
todos.push({ content, status, priority });
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
if (todos.length === 0)
|
|
794
|
+
return;
|
|
795
|
+
// 安全化 agentId 防止路径穿越
|
|
796
|
+
const safe = String(agentId).replace(/[^a-zA-Z0-9_-]/g, '_');
|
|
797
|
+
const todosDir = this.getTodoStoreDir();
|
|
798
|
+
const target = path.join(todosDir, `${safe}.json`);
|
|
799
|
+
const doc = {
|
|
800
|
+
agentId,
|
|
801
|
+
updatedAt: new Date().toISOString(),
|
|
802
|
+
background: 'OpenCode runtime todos',
|
|
803
|
+
todos,
|
|
804
|
+
};
|
|
805
|
+
await fs.promises.mkdir(todosDir, { recursive: true });
|
|
806
|
+
const tmp = `${target}.tmp`;
|
|
807
|
+
await fs.promises.writeFile(tmp, JSON.stringify(doc, null, 2), 'utf-8');
|
|
808
|
+
await fs.promises.rename(tmp, target);
|
|
809
|
+
}
|
|
748
810
|
emitEvent(event) {
|
|
749
811
|
this.emit('event', event);
|
|
750
812
|
}
|
package/dist/adapter/types.d.ts
CHANGED
|
@@ -59,6 +59,15 @@ export interface RuntimeTokenUsage {
|
|
|
59
59
|
outputTokens: number;
|
|
60
60
|
/** Model context window token limit used for the used/limit display. */
|
|
61
61
|
contextLimit?: number;
|
|
62
|
+
/** Model max output token limit, used to compute the compaction point. */
|
|
63
|
+
maxOutput?: number;
|
|
64
|
+
/** Provider 显式输入上限(部分 Provider 的 input+output 总额 ≠ context 上限)。
|
|
65
|
+
* 来自 runtime resolveProviderConfig,前端用于精确显示压缩点。 */
|
|
66
|
+
inputLimit?: number;
|
|
67
|
+
/** 后端实际触发压缩的阈值(= min(contextLimit×动态比例, hardLimit - min(buffer, maxOutput)))。
|
|
68
|
+
* 动态比例按窗口大小分级(<32K=0.70, 32K-128K=0.75, 128K-512K=0.80, >=512K=0.85)。
|
|
69
|
+
* 前端 AgentContextPanel 优先用此值显示竖线,消除前端自算公式的脱节。 */
|
|
70
|
+
compactionThreshold?: number;
|
|
62
71
|
}
|
|
63
72
|
export type CommandOutputStream = "stdout" | "stderr" | "mixed";
|
|
64
73
|
export interface RuntimeStatusActionInfo {
|
|
@@ -205,6 +214,10 @@ export interface AdapterInstanceAiConfig {
|
|
|
205
214
|
apiKey?: string;
|
|
206
215
|
/** Per-instance model reasoning effort (minimal|low|medium|high|xhigh) */
|
|
207
216
|
effort?: string;
|
|
217
|
+
/** Sub Agent 专用模型覆盖(空值=继承主 Agent 模型,仅 ACode 消费) */
|
|
218
|
+
subAgentModel?: string;
|
|
219
|
+
/** Sub Agent 专用思考强度覆盖(空值=继承主 Agent 强度,仅 ACode 消费) */
|
|
220
|
+
subAgentEffort?: string;
|
|
208
221
|
}
|
|
209
222
|
export interface AdapterSessionConfig {
|
|
210
223
|
/** CLI 命令(支持绝对路径) */
|
|
@@ -245,6 +258,10 @@ export interface AdapterSessionConfig {
|
|
|
245
258
|
* per-instance acode.json 后作为 configPath 使用。
|
|
246
259
|
*/
|
|
247
260
|
instanceAiConfig?: AdapterInstanceAiConfig;
|
|
261
|
+
/** Sub Agent 模型覆盖(仅 ACode 消费,空值=继承主 Agent 模型) */
|
|
262
|
+
subAgentModel?: string;
|
|
263
|
+
/** Sub Agent 思考强度覆盖(仅 ACode 消费,空值=继承主 Agent 强度) */
|
|
264
|
+
subAgentEffort?: string;
|
|
248
265
|
/** Provider 特定参数 */
|
|
249
266
|
providerArgs?: string[];
|
|
250
267
|
/** 环境变量覆盖 */
|
|
@@ -271,12 +288,8 @@ export interface AdapterSession {
|
|
|
271
288
|
messages: ConversationMessage[];
|
|
272
289
|
/** 创建时间 */
|
|
273
290
|
createdAt: string;
|
|
274
|
-
/**
|
|
275
|
-
totalUsage:
|
|
276
|
-
inputTokens: number;
|
|
277
|
-
outputTokens: number;
|
|
278
|
-
contextLimit?: number;
|
|
279
|
-
};
|
|
291
|
+
/** Token 用量快照(input=当前上下文大小,output=当前轮输出,均为覆盖式赋值) */
|
|
292
|
+
totalUsage: RuntimeTokenUsage;
|
|
280
293
|
/** SDK 进程 PID(用于检测进程是否存活) */
|
|
281
294
|
pid?: number;
|
|
282
295
|
}
|
|
@@ -305,6 +318,8 @@ export interface PermissionRequest {
|
|
|
305
318
|
}
|
|
306
319
|
export interface AskUserQuestionRequest {
|
|
307
320
|
sessionId: string;
|
|
321
|
+
/** 提问实例的唯一标识(toolCallId),用于前端精确去重,区分同一会话内连续多次提问 */
|
|
322
|
+
toolCallId?: string;
|
|
308
323
|
questions: Array<{
|
|
309
324
|
question: string;
|
|
310
325
|
header?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapter/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,UAAU,GACV,YAAY,GACZ,eAAe,GACf,WAAW,GACX,YAAY,GACZ,OAAO,GACP,YAAY,CAAC;AAIjB,MAAM,MAAM,iBAAiB,GACzB,YAAY,GACZ,YAAY,GACZ,UAAU,GACV,gBAAgB,GAChB,gBAAgB,GAChB,cAAc,GACd,oBAAoB,GACpB,mBAAmB,GACnB,gBAAgB,GAChB,eAAe,GACf,kBAAkB,GAClB,OAAO,GACP,oBAAoB,GACpB,sBAAsB,CAAC;AAI3B;;;GAGG;AACH,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,KAAK,GACL,MAAM,GACN,WAAW,GACX,YAAY,GACZ,WAAW,GACX,MAAM,GACN,QAAQ,GACR,KAAK,GACL,YAAY,GACZ,KAAK,GACL,UAAU,GACV,OAAO,GACP,oBAAoB,GACpB,sBAAsB,CAAC;AAE3B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,aAAa;IACb,UAAU,EAAE,cAAc,CAAC;IAC3B,iBAAiB;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAUD;;;GAGG;AACH,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQvE;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAWvE;AAED;;GAEG;AACH,wBAAgB,yCAAyC,CACvD,KAAK,EAAE,OAAO,GACb,OAAO,CAgBT;AA2CD,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAsBjE;AAWD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,QAAQ,CAAC,EAAE,YAAY,GACtB,cAAc,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapter/types.ts"],"names":[],"mappings":"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"}
|
package/dist/adapter/types.js
CHANGED
|
@@ -138,7 +138,9 @@ export function getToolActionInfo(toolName, toolInput, metadata) {
|
|
|
138
138
|
? name.slice(name.indexOf("-mcp__") + 6)
|
|
139
139
|
: name.includes("/")
|
|
140
140
|
? name.split("/").filter(Boolean).at(-1) || name
|
|
141
|
-
: name
|
|
141
|
+
: name.includes("__")
|
|
142
|
+
? name.split("__").pop() || name
|
|
143
|
+
: name;
|
|
142
144
|
const normalizedSemanticToolName = semanticToolName.replace(/[_-]/g, "");
|
|
143
145
|
const normalizeSkillList = (value) => {
|
|
144
146
|
if (!Array.isArray(value)) {
|
|
@@ -272,6 +274,13 @@ export function getToolActionInfo(toolName, toolInput, metadata) {
|
|
|
272
274
|
actionDetail: getCanonicalMcpDetail(toolName),
|
|
273
275
|
};
|
|
274
276
|
}
|
|
277
|
+
// ask_user_question 内置工具:阻塞等待用户回答
|
|
278
|
+
if (matchesToolName("ask_user_question", "askuserquestion")) {
|
|
279
|
+
return {
|
|
280
|
+
actionType: "other",
|
|
281
|
+
actionLabel: "等待回答",
|
|
282
|
+
};
|
|
283
|
+
}
|
|
275
284
|
// MCP 工具调用
|
|
276
285
|
// 优先使用 metadata 中的 mcpServer 信息(SDK 直接提供)
|
|
277
286
|
// 格式包括:
|
package/dist/index.js
CHANGED
|
@@ -41,6 +41,8 @@ import { ensureAwsClientAgentMcpReleased } from "./services/aws-client-agent-mcp
|
|
|
41
41
|
import { ensureAcodePackageReleased } from "./services/acode-package.js";
|
|
42
42
|
import { ensureStartupConfig } from "./services/startup-config-wizard.js";
|
|
43
43
|
import { handleCliCommand } from "./services/cli-commands.js";
|
|
44
|
+
import { migrateOldPathsOnStartup } from "./services/legacy-path-migration.js";
|
|
45
|
+
import { subAgentStore } from "./services/sub-agent-manager-instance.js";
|
|
44
46
|
import { buildGracefulShutdownPlan, shouldCleanupPersistedSessionsOnStartup, } from "./services/runtime-lifecycle-policy.js";
|
|
45
47
|
import { deliverPendingBridgeLifecycleNotifications } from "./services/lifecycle-state.js";
|
|
46
48
|
const cliCommandResult = await handleCliCommand();
|
|
@@ -52,6 +54,7 @@ await ensureStartupConfig();
|
|
|
52
54
|
validateProductionToken();
|
|
53
55
|
ensureAwsClientAgentMcpReleased();
|
|
54
56
|
ensureAcodePackageReleased();
|
|
57
|
+
migrateOldPathsOnStartup();
|
|
55
58
|
logRuntimeBindingStartupState();
|
|
56
59
|
// ★ 启动时自动注册
|
|
57
60
|
async function performAutoRegister() {
|
|
@@ -495,6 +498,14 @@ async function gracefulShutdown(signal, server, preserveSessions = false) {
|
|
|
495
498
|
process.exit(1);
|
|
496
499
|
}
|
|
497
500
|
}
|
|
501
|
+
// 启动前清理僵尸 sub-agent 记录(bridge 重启前未完成的 running/pending 记录)
|
|
502
|
+
subAgentStore.reconcileZombies().then((fixed) => {
|
|
503
|
+
if (fixed > 0) {
|
|
504
|
+
logger.info(`[runtime-bridge] 已清理 ${fixed} 个僵尸 sub-agent 记录`);
|
|
505
|
+
}
|
|
506
|
+
}).catch((err) => {
|
|
507
|
+
logger.warn("[runtime-bridge] 清理僵尸 sub-agent 记录失败:", err.message);
|
|
508
|
+
});
|
|
498
509
|
// 启动服务器
|
|
499
510
|
const server = startServer();
|
|
500
511
|
/**
|
|
@@ -63,7 +63,7 @@ async function fetchRemoteModelList(baseUrl, apiKey, protocolType) {
|
|
|
63
63
|
return [];
|
|
64
64
|
}
|
|
65
65
|
aiSourcesRouter.post('/cc-switch/apply-ai-sources', validateToken, async (req, res) => {
|
|
66
|
-
const { agentId, template, ccSwitchEnabledTools, acodeTemplateId, claudecodeTemplateId, codexTemplateId, opencodeTemplateId, acodeModelEffort, claudecodeModelEffort, codexModelEffort, opencodeModelEffort, acode, claudecode, codex, opencode, } = req.body || {};
|
|
66
|
+
const { agentId, template, ccSwitchEnabledTools, acodeTemplateId, claudecodeTemplateId, codexTemplateId, opencodeTemplateId, acodeModelEffort, claudecodeModelEffort, codexModelEffort, opencodeModelEffort, acodeSubAgentTemplateId, acodeSubAgentModel, acodeSubAgentModelEffort, acode, acodeSubAgent, claudecode, codex, opencode, } = req.body || {};
|
|
67
67
|
if (!agentId) {
|
|
68
68
|
res.status(400).json({ error: 'agentId is required' });
|
|
69
69
|
return;
|
|
@@ -89,6 +89,9 @@ aiSourcesRouter.post('/cc-switch/apply-ai-sources', validateToken, async (req, r
|
|
|
89
89
|
claudecodeModelEffort: String(claudecodeModelEffort || ''),
|
|
90
90
|
codexModelEffort: String(codexModelEffort || ''),
|
|
91
91
|
opencodeModelEffort: String(opencodeModelEffort || ''),
|
|
92
|
+
acodeSubAgentTemplateId: String(acodeSubAgentTemplateId || ''),
|
|
93
|
+
acodeSubAgentModel: String(acodeSubAgentModel || ''),
|
|
94
|
+
acodeSubAgentModelEffort: String(acodeSubAgentModelEffort || ''),
|
|
92
95
|
generatedFromUnifiedTemplate: appliedSummary.generatedFromUnifiedTemplate,
|
|
93
96
|
applied: appliedSummary.applied,
|
|
94
97
|
skippedTools: appliedSummary.skippedTools,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/routes/dashboard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/routes/dashboard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsFH,eAAO,MAAM,eAAe,4CAAW,CAAC"}
|
package/dist/routes/dashboard.js
CHANGED
|
@@ -52,7 +52,7 @@ async function loadLatestLifecycleOperation() {
|
|
|
52
52
|
const fs = await import("node:fs/promises");
|
|
53
53
|
const path = await import("node:path");
|
|
54
54
|
const os = await import("node:os");
|
|
55
|
-
const lifecycleFile = path.join(String(process.env.AWS_RUNTIME_HOME_DIR || os.homedir()).trim() || os.homedir(), ".
|
|
55
|
+
const lifecycleFile = path.join(String(process.env.AWS_RUNTIME_HOME_DIR || os.homedir()).trim() || os.homedir(), ".aws-bridge", "lifecycle-state.json");
|
|
56
56
|
try {
|
|
57
57
|
const raw = await fs.readFile(lifecycleFile, "utf8");
|
|
58
58
|
const parsed = JSON.parse(raw);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-browser.d.ts","sourceRoot":"","sources":["../../src/routes/file-browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,MAAM,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"file-browser.d.ts","sourceRoot":"","sources":["../../src/routes/file-browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,MAAM,MAAM,QAAQ,CAAC;AA2B5B,eAAO,MAAM,iBAAiB,4CAAW,CAAC;AAE1C,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAUhD,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,UAAU,mBAAmB;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAMD,UAAU,iBAAkB,SAAQ,eAAe;IACjD,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,UAAU,qBAAsB,SAAQ,mBAAmB;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE,iBAAiB,EAAE,CAAC;CAC3B;AAED,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAiBD,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAUvI;AAED,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAgBzF;AAyFD;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,WAAW,SAAK,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAkB5F;AAoCD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CAuBpE;AA6BD,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,CAWhH"}
|
|
@@ -10,7 +10,7 @@ import { Router } from 'express';
|
|
|
10
10
|
import multer from 'multer';
|
|
11
11
|
import { allowHostFileBrowser } from '../config.js';
|
|
12
12
|
import { validateToken } from '../middleware/auth.js';
|
|
13
|
-
import { chmodWorkspaceEntry, createWorkspaceEntry, deleteWorkspaceEntry, extractWorkspaceArchive, getWorkspaceEntryProperties, listWorkspaceDirectory, moveWorkspaceEntry, previewWorkspaceDocument, readWorkspaceFile, renameWorkspaceEntry, resolveWorkspaceDownloadTarget, streamWorkspaceDirectoryZip, uploadWorkspaceFiles, writeWorkspaceFile, } from '../services/workspace-files.js';
|
|
13
|
+
import { chmodWorkspaceEntry, createWorkspaceEntry, deleteWorkspaceEntry, extractWorkspaceArchive, getWorkspaceEntryProperties, listWorkspaceDirectory, moveWorkspaceEntry, previewWorkspaceDocument, readWorkspaceFile, renameWorkspaceEntry, replaceWorkspaceFiles, resolveWorkspaceDownloadTarget, searchWorkspaceFiles, streamWorkspaceDirectoryZip, uploadWorkspaceFiles, writeWorkspaceFile, } from '../services/workspace-files.js';
|
|
14
14
|
import { unwatchWorkspaceFile, watchWorkspaceFile } from '../services/workspace-watch.js';
|
|
15
15
|
import { createLogger } from '../utils/logger.js';
|
|
16
16
|
const log = createLogger('file-browser');
|
|
@@ -736,3 +736,49 @@ fileBrowserRouter.post('/workspace/extract', validateToken, async (req, res) =>
|
|
|
736
736
|
res.status(400).json({ error: err.message });
|
|
737
737
|
}
|
|
738
738
|
});
|
|
739
|
+
/**
|
|
740
|
+
* 在工作区范围内搜索文件内容。
|
|
741
|
+
* POST /api/file-browser/workspace/search
|
|
742
|
+
*/
|
|
743
|
+
fileBrowserRouter.post('/workspace/search', validateToken, async (req, res) => {
|
|
744
|
+
try {
|
|
745
|
+
const { workspacePath, keyword, fileMask, ignoreCase, maxResults, mode } = req.body || {};
|
|
746
|
+
const result = await searchWorkspaceFiles({
|
|
747
|
+
workspacePath: String(workspacePath || ''),
|
|
748
|
+
keyword: String(keyword || ''),
|
|
749
|
+
fileMask: fileMask !== undefined ? String(fileMask) : undefined,
|
|
750
|
+
ignoreCase: toBoolean(ignoreCase),
|
|
751
|
+
maxResults: typeof maxResults === 'number' ? maxResults : undefined,
|
|
752
|
+
mode: mode === 'filename' ? 'filename' : 'content'
|
|
753
|
+
});
|
|
754
|
+
res.json(result);
|
|
755
|
+
}
|
|
756
|
+
catch (error) {
|
|
757
|
+
const err = error;
|
|
758
|
+
log.error('failed to search workspace files:', err);
|
|
759
|
+
res.status(400).json({ error: err.message });
|
|
760
|
+
}
|
|
761
|
+
});
|
|
762
|
+
/**
|
|
763
|
+
* 在工作区范围内批量替换文件内容。
|
|
764
|
+
* POST /api/file-browser/workspace/replace
|
|
765
|
+
*/
|
|
766
|
+
fileBrowserRouter.post('/workspace/replace', validateToken, async (req, res) => {
|
|
767
|
+
try {
|
|
768
|
+
const { workspacePath, keyword, replacement, fileMask, ignoreCase, filePath } = req.body || {};
|
|
769
|
+
const result = await replaceWorkspaceFiles({
|
|
770
|
+
workspacePath: String(workspacePath || ''),
|
|
771
|
+
keyword: String(keyword || ''),
|
|
772
|
+
replacement: String(replacement ?? ''),
|
|
773
|
+
fileMask: fileMask !== undefined ? String(fileMask) : undefined,
|
|
774
|
+
ignoreCase: toBoolean(ignoreCase),
|
|
775
|
+
filePath: filePath !== undefined ? String(filePath) : undefined
|
|
776
|
+
});
|
|
777
|
+
res.json(result);
|
|
778
|
+
}
|
|
779
|
+
catch (error) {
|
|
780
|
+
const err = error;
|
|
781
|
+
log.error('failed to replace workspace files:', err);
|
|
782
|
+
res.status(400).json({ error: err.message });
|
|
783
|
+
}
|
|
784
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processes.d.ts","sourceRoot":"","sources":["../../src/routes/processes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"processes.d.ts","sourceRoot":"","sources":["../../src/routes/processes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,eAAO,MAAM,eAAe,4CAAW,CAAC"}
|
package/dist/routes/processes.js
CHANGED
|
@@ -8,6 +8,7 @@ import { validateToken } from '../middleware/auth.js';
|
|
|
8
8
|
import { getAgentProcessManager } from '../services/agent-process-manager.js';
|
|
9
9
|
import { discoverAllProcessesFull } from '../services/process-detector.js';
|
|
10
10
|
import { createLogger } from '../utils/logger.js';
|
|
11
|
+
import { cleanupSdkSessionByAgentId } from './terminal.js';
|
|
11
12
|
const log = createLogger('processes');
|
|
12
13
|
export const processesRouter = Router();
|
|
13
14
|
/**
|
|
@@ -158,6 +159,12 @@ processesRouter.post('/processes/:agentId/force-kill', validateToken, async (req
|
|
|
158
159
|
try {
|
|
159
160
|
const manager = getAgentProcessManager();
|
|
160
161
|
const result = await manager.forceKill(agentId);
|
|
162
|
+
// ★ 关键修复:强制终止后清理 bridge 内部内存状态
|
|
163
|
+
// 防止 sdkSessions 残留条目阻塞后续启动
|
|
164
|
+
const cleanedSessionId = cleanupSdkSessionByAgentId(agentId);
|
|
165
|
+
if (cleanedSessionId) {
|
|
166
|
+
log.info(`[processes/force-kill] Cleaned up SDK session after force-kill: agentId=${agentId}, sessionId=${cleanedSessionId}`);
|
|
167
|
+
}
|
|
161
168
|
res.json({
|
|
162
169
|
ok: result.success,
|
|
163
170
|
agentId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-binding.d.ts","sourceRoot":"","sources":["../../src/routes/runtime-binding.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,oBAAoB,4CAAW,CAAC;AAE7C,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,wBAAwB,GAC9B,yBAAyB,CAM3B;
|
|
1
|
+
{"version":3,"file":"runtime-binding.d.ts","sourceRoot":"","sources":["../../src/routes/runtime-binding.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,oBAAoB,4CAAW,CAAC;AAE7C,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,wBAAwB,GAC9B,yBAAyB,CAM3B;AAwPD,wBAAgB,6BAA6B,IAAI,IAAI,CAapD"}
|
|
@@ -148,7 +148,7 @@ runtimeBindingRouter.post("/binding/refresh-token", (req, res) => {
|
|
|
148
148
|
res.status(403).json({ ok: false, error: "loopback request required" });
|
|
149
149
|
return;
|
|
150
150
|
}
|
|
151
|
-
const { agentId, currentToken } = req.body || {};
|
|
151
|
+
const { agentId, currentToken, forceRefresh } = req.body || {};
|
|
152
152
|
const normalizedAgentId = String(agentId || "").trim();
|
|
153
153
|
if (!normalizedAgentId) {
|
|
154
154
|
res.status(400).json({ ok: false, error: "agentId is required" });
|
|
@@ -159,9 +159,12 @@ runtimeBindingRouter.post("/binding/refresh-token", (req, res) => {
|
|
|
159
159
|
res.status(404).json({ ok: false, error: "no cached token for agent" });
|
|
160
160
|
return;
|
|
161
161
|
}
|
|
162
|
-
//
|
|
162
|
+
// forceRefresh=true 时跳过 token 一致性检查,直接返回缓存的最新 token。
|
|
163
|
+
// 用于 WebSocket 1008(policy rejection)场景:即使 bridge 缓存的 token 与当前相同,
|
|
164
|
+
// 也允许返回,由客户端侧的 hammer 保护控制重复请求。
|
|
165
|
+
// 非 forceRefresh(HTTP 401 反应式刷新)保持原有 409 语义。
|
|
163
166
|
const normalizedCurrent = String(currentToken || "").trim();
|
|
164
|
-
if (normalizedCurrent && latest.runtimeAccessToken === normalizedCurrent) {
|
|
167
|
+
if (!forceRefresh && normalizedCurrent && latest.runtimeAccessToken === normalizedCurrent) {
|
|
165
168
|
res.status(409).json({
|
|
166
169
|
ok: false,
|
|
167
170
|
error: "token_unchanged",
|
package/dist/routes/sessions.js
CHANGED
|
@@ -10,7 +10,7 @@ import { validateToken } from '../middleware/auth.js';
|
|
|
10
10
|
import { isProcessRunning, findOrphanProcessByAgentId, findOrphanProcessByWorkspace } from '../services/process-detector.js';
|
|
11
11
|
import { findPersistedSessionByAgentId, loadPersistedSessions, removePersistedSession, } from '../services/terminal-persistence.js';
|
|
12
12
|
import { createLogger } from '../utils/logger.js';
|
|
13
|
-
import { sdkSessions } from './terminal.js';
|
|
13
|
+
import { sdkSessions, cleanupSdkSessionByAgentId } from './terminal.js';
|
|
14
14
|
const log = createLogger('sessions');
|
|
15
15
|
export const sessionsRouter = Router();
|
|
16
16
|
/**
|
|
@@ -198,11 +198,62 @@ sessionsRouter.post('/search-orphan', validateToken, async (req, res) => {
|
|
|
198
198
|
}
|
|
199
199
|
try {
|
|
200
200
|
// 1. 首先检查 runtime-bridge 是否已经有活跃 SDK 会话
|
|
201
|
-
|
|
202
|
-
const
|
|
201
|
+
// ★ 同时检测陈旧会话:进程已死但 sdkSessions 中仍有残留条目时,清理并视为无活跃会话
|
|
202
|
+
const activeSdkSessionEntry = Array.from(sdkSessions.entries()).find(([, s]) => s.agentId === agentId);
|
|
203
|
+
let hasActiveSession = false;
|
|
204
|
+
let activeSessionPid;
|
|
205
|
+
let activeSessionCommand;
|
|
206
|
+
if (activeSdkSessionEntry) {
|
|
207
|
+
const [activeSessionId, activeEntry] = activeSdkSessionEntry;
|
|
208
|
+
const adapter = adapterRegistry.get(activeEntry.providerId || 'claude-code');
|
|
209
|
+
activeSessionPid = adapter.getSessionPid?.(activeSessionId);
|
|
210
|
+
activeSessionCommand = activeEntry.config?.command;
|
|
211
|
+
const isPidAlive = activeSessionPid ? isProcessRunning(activeSessionPid) : false;
|
|
212
|
+
const sessionStatus = adapter.getSessionStatus(activeSessionId);
|
|
213
|
+
const isSessionDeadStatus = sessionStatus === 'completed' ||
|
|
214
|
+
sessionStatus === 'terminated' ||
|
|
215
|
+
sessionStatus === 'error';
|
|
216
|
+
if (isPidAlive) {
|
|
217
|
+
// 外部 CLI provider(claude-code/opencode):进程存活,视为活跃会话
|
|
218
|
+
hasActiveSession = true;
|
|
219
|
+
}
|
|
220
|
+
else if (activeSessionPid && !isPidAlive) {
|
|
221
|
+
// PID 存在但进程已死亡 - 清理陈旧会话
|
|
222
|
+
log.info(`[search-orphan] Cleaning up stale SDK session (process dead): agentId=${agentId}, sessionId=${activeSessionId}, pid=${activeSessionPid}`);
|
|
223
|
+
sdkSessions.delete(activeSessionId);
|
|
224
|
+
await removePersistedSession(activeSessionId);
|
|
225
|
+
}
|
|
226
|
+
else if (isSessionDeadStatus) {
|
|
227
|
+
// 无 PID(in-process provider 如 ACode)且会话已结束 - 清理陈旧会话
|
|
228
|
+
log.info(`[search-orphan] Cleaning up stale in-process SDK session (status=${sessionStatus}): agentId=${agentId}, sessionId=${activeSessionId}`);
|
|
229
|
+
try {
|
|
230
|
+
await adapter.terminateSession(activeSessionId);
|
|
231
|
+
}
|
|
232
|
+
catch (e) {
|
|
233
|
+
log.warn(`[search-orphan] Failed to terminate stale in-process session: ${e}`);
|
|
234
|
+
}
|
|
235
|
+
sdkSessions.delete(activeSessionId);
|
|
236
|
+
await removePersistedSession(activeSessionId);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
// 无 PID 且会话仍存活(in-process provider,如 ACode)
|
|
240
|
+
// WebSocket 断开导致前端显示 LOST,但 in-process 运行时仍在运行且不可达
|
|
241
|
+
// 终止会话以释放资源,然后清理
|
|
242
|
+
log.info(`[search-orphan] Terminating unreachable in-process SDK session: agentId=${agentId}, sessionId=${activeSessionId}, status=${sessionStatus || 'unknown'}`);
|
|
243
|
+
try {
|
|
244
|
+
await adapter.abortCurrentTurn(activeSessionId).catch(() => { });
|
|
245
|
+
await adapter.terminateSession(activeSessionId);
|
|
246
|
+
}
|
|
247
|
+
catch (e) {
|
|
248
|
+
log.warn(`[search-orphan] Failed to terminate in-process session: ${e}`);
|
|
249
|
+
}
|
|
250
|
+
sdkSessions.delete(activeSessionId);
|
|
251
|
+
await removePersistedSession(activeSessionId);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
203
254
|
// 2. 搜索标记了该 agentId 的进程(命令 + 环境变量 + 进程树匹配)
|
|
204
255
|
const orphanProcess = await findOrphanProcessByAgentId(agentId);
|
|
205
|
-
// 3.
|
|
256
|
+
// 3. 如果找到残留进程,返回进程信息
|
|
206
257
|
if (orphanProcess) {
|
|
207
258
|
log.info(`[search-orphan] Found orphan process for agentId=${agentId}, pid=${orphanProcess.pid}`);
|
|
208
259
|
res.json({
|
|
@@ -220,6 +271,24 @@ sessionsRouter.post('/search-orphan', validateToken, async (req, res) => {
|
|
|
220
271
|
});
|
|
221
272
|
return;
|
|
222
273
|
}
|
|
274
|
+
// 3.5 活跃会话的进程仍然存活时,将其作为可终止的残留进程返回
|
|
275
|
+
// 场景:WebSocket 断开导致前端显示 LOST/zombie,但 SDK 进程仍在运行且不可达
|
|
276
|
+
// 用户可以通过终止该进程来清理僵尸状态
|
|
277
|
+
if (hasActiveSession && activeSessionPid) {
|
|
278
|
+
log.info(`[search-orphan] Active session process still running, reporting as terminable orphan: agentId=${agentId}, pid=${activeSessionPid}`);
|
|
279
|
+
res.json({
|
|
280
|
+
ok: true,
|
|
281
|
+
agentId,
|
|
282
|
+
hasActiveSession: true,
|
|
283
|
+
found: true,
|
|
284
|
+
orphan: {
|
|
285
|
+
pid: activeSessionPid,
|
|
286
|
+
command: activeSessionCommand || '(active SDK session)',
|
|
287
|
+
message: 'Found active SDK session process. Click terminate to stop it.',
|
|
288
|
+
},
|
|
289
|
+
});
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
223
292
|
// 4. 检查持久化会话中的 PID 是否仍然存活
|
|
224
293
|
// 即使进程列表匹配不到(命令行特征未识别),PID 存活说明进程仍在运行
|
|
225
294
|
const persistedSession = await findPersistedSessionByAgentId(agentId);
|
|
@@ -291,7 +360,23 @@ sessionsRouter.post('/terminate-orphan', validateToken, async (req, res) => {
|
|
|
291
360
|
return;
|
|
292
361
|
}
|
|
293
362
|
try {
|
|
294
|
-
//
|
|
363
|
+
// 0. 清理 sdkSessions 中匹配 agentId 的活跃会话条目
|
|
364
|
+
// 场景:/search-orphan 将活跃会话的 PID 作为残留进程返回,用户终止该进程后需要清理 bridge 侧的会话状态
|
|
365
|
+
const activeSessionEntry = Array.from(sdkSessions.entries()).find(([, s]) => s.agentId === agentId);
|
|
366
|
+
if (activeSessionEntry) {
|
|
367
|
+
const [activeSessionId, activeEntry] = activeSessionEntry;
|
|
368
|
+
const adapter = adapterRegistry.get(activeEntry.providerId || 'claude-code');
|
|
369
|
+
try {
|
|
370
|
+
await adapter.terminateSession(activeSessionId);
|
|
371
|
+
}
|
|
372
|
+
catch (e) {
|
|
373
|
+
log.warn(`[terminate-orphan] Failed to terminate SDK session for agentId=${agentId}:`, e);
|
|
374
|
+
}
|
|
375
|
+
sdkSessions.delete(activeSessionId);
|
|
376
|
+
await removePersistedSession(activeSessionId);
|
|
377
|
+
log.info(`[terminate-orphan] Cleaned up SDK session for agentId=${agentId}, sessionId=${activeSessionId}`);
|
|
378
|
+
}
|
|
379
|
+
// 1. 检查进程是否还在运行
|
|
295
380
|
if (!isProcessRunning(pid)) {
|
|
296
381
|
res.json({
|
|
297
382
|
ok: true,
|
|
@@ -585,6 +670,9 @@ sessionsRouter.post('/terminate-tree', validateToken, async (req, res) => {
|
|
|
585
670
|
const result = await terminateProcessTree(pid);
|
|
586
671
|
// 4. 等待进程完全终止(最多 5 秒)
|
|
587
672
|
const exited = await waitForProcessExit(pid, 5000);
|
|
673
|
+
// ★ 关键修复:terminate-tree 后清理 bridge 内部内存状态
|
|
674
|
+
// 防止 sdkSessions 残留条目阻塞后续启动
|
|
675
|
+
cleanupSdkSessionByAgentId(agentId);
|
|
588
676
|
// 5. 清理持久化状�?
|
|
589
677
|
await import('../services/terminal-persistence.js').then(m => m.removePersistedSession(targetSessionId));
|
|
590
678
|
log.info(`[terminate-tree] Terminated process tree for agentId=${agentId}, pid=${pid}, mode=${mode}, terminated=${result.terminated}, failed=${result.failed}, exited=${exited}`);
|