@migor/agentia 0.9.4 → 0.10.0
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 +1280 -4
- package/README.en.md +61 -3
- package/README.md +66 -4
- package/dist/AGENTS.md +330 -45
- package/dist/container/container.js +21 -0
- package/dist/container/container.js.map +1 -1
- package/dist/core/limits.d.ts +101 -14
- package/dist/core/limits.js +103 -13
- package/dist/core/limits.js.map +1 -1
- package/dist/core/line-framing.d.ts +36 -0
- package/dist/core/line-framing.js +39 -0
- package/dist/core/line-framing.js.map +1 -0
- package/dist/core/message.d.ts +11 -0
- package/dist/core/run.d.ts +68 -4
- package/dist/core/run.js +27 -1
- package/dist/core/run.js.map +1 -1
- package/dist/core/schema.js +59 -8
- package/dist/core/schema.js.map +1 -1
- package/dist/core/timeout.d.ts +43 -1
- package/dist/core/timeout.js +76 -3
- package/dist/core/timeout.js.map +1 -1
- package/dist/core/tool.d.ts +25 -1
- package/dist/core/trace.d.ts +40 -1
- package/dist/core/trace.js +26 -0
- package/dist/core/trace.js.map +1 -1
- package/dist/engine/budget.js +14 -0
- package/dist/engine/budget.js.map +1 -1
- package/dist/engine/defer.d.ts +49 -0
- package/dist/engine/defer.js +72 -0
- package/dist/engine/defer.js.map +1 -0
- package/dist/engine/errors.d.ts +23 -1
- package/dist/engine/errors.js +24 -0
- package/dist/engine/errors.js.map +1 -1
- package/dist/engine/forwarded.d.ts +14 -5
- package/dist/engine/forwarded.js +4 -1
- package/dist/engine/forwarded.js.map +1 -1
- package/dist/engine/loop-result.d.ts +65 -7
- package/dist/engine/loop-result.js +24 -5
- package/dist/engine/loop-result.js.map +1 -1
- package/dist/engine/loop.d.ts +2 -0
- package/dist/engine/loop.js +157 -17
- package/dist/engine/loop.js.map +1 -1
- package/dist/engine/mcp-server-http.d.ts +2 -0
- package/dist/engine/mcp-server-http.js +215 -0
- package/dist/engine/mcp-server-http.js.map +1 -0
- package/dist/engine/mcp-server-stdio.d.ts +15 -0
- package/dist/engine/mcp-server-stdio.js +106 -0
- package/dist/engine/mcp-server-stdio.js.map +1 -0
- package/dist/engine/mcp-server.d.ts +134 -0
- package/dist/engine/mcp-server.js +232 -0
- package/dist/engine/mcp-server.js.map +1 -0
- package/dist/engine/menu-drift.d.ts +34 -0
- package/dist/engine/menu-drift.js +81 -0
- package/dist/engine/menu-drift.js.map +1 -0
- package/dist/engine/policy.d.ts +2 -1
- package/dist/engine/policy.js +7 -1
- package/dist/engine/policy.js.map +1 -1
- package/dist/engine/replay.d.ts +2 -1
- package/dist/engine/replay.js +3 -2
- package/dist/engine/replay.js.map +1 -1
- package/dist/engine/resume-input.d.ts +10 -0
- package/dist/engine/resume-input.js +11 -0
- package/dist/engine/resume-input.js.map +1 -1
- package/dist/engine/run-config.d.ts +26 -2
- package/dist/engine/run-config.js +60 -0
- package/dist/engine/run-config.js.map +1 -1
- package/dist/engine/spec.d.ts +33 -4
- package/dist/engine/spec.js.map +1 -1
- package/dist/engine/tool-context.d.ts +10 -5
- package/dist/engine/tool-context.js +5 -1
- package/dist/engine/tool-context.js.map +1 -1
- package/dist/engine/tracer.d.ts +43 -5
- package/dist/engine/tracer.js +73 -10
- package/dist/engine/tracer.js.map +1 -1
- package/dist/engine/trimming.js +28 -2
- package/dist/engine/trimming.js.map +1 -1
- package/dist/engine/turn.d.ts +60 -3
- package/dist/engine/turn.js +180 -71
- package/dist/engine/turn.js.map +1 -1
- package/dist/engine/types.d.ts +89 -3
- package/dist/engine/types.js +38 -2
- package/dist/engine/types.js.map +1 -1
- package/dist/eval/export.d.ts +48 -0
- package/dist/eval/export.js +146 -0
- package/dist/eval/export.js.map +1 -0
- package/dist/eval/harvest.js +7 -2
- package/dist/eval/harvest.js.map +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/adapter-options.d.ts +22 -0
- package/dist/integrations/adapter-options.js +51 -0
- package/dist/integrations/adapter-options.js.map +1 -1
- package/dist/integrations/anthropic.d.ts +4 -2
- package/dist/integrations/anthropic.js +27 -27
- package/dist/integrations/anthropic.js.map +1 -1
- package/dist/integrations/file-sink.d.ts +20 -0
- package/dist/integrations/file-sink.js +27 -0
- package/dist/integrations/file-sink.js.map +1 -0
- package/dist/integrations/mcp-http.d.ts +3 -3
- package/dist/integrations/mcp-http.js +1 -1
- package/dist/integrations/mcp-http.js.map +1 -1
- package/dist/integrations/mcp-protocol.d.ts +115 -0
- package/dist/integrations/mcp-protocol.js +69 -0
- package/dist/integrations/mcp-protocol.js.map +1 -0
- package/dist/integrations/mcp-stdio.d.ts +3 -3
- package/dist/integrations/mcp-stdio.js +17 -3
- package/dist/integrations/mcp-stdio.js.map +1 -1
- package/dist/integrations/mcp.d.ts +6 -95
- package/dist/integrations/mcp.js +24 -66
- package/dist/integrations/mcp.js.map +1 -1
- package/dist/integrations/metrics-otlp.js +52 -7
- package/dist/integrations/metrics-otlp.js.map +1 -1
- package/dist/integrations/metrics-render.d.ts +15 -0
- package/dist/integrations/metrics-render.js +79 -2
- package/dist/integrations/metrics-render.js.map +1 -1
- package/dist/integrations/metrics-state.d.ts +99 -1
- package/dist/integrations/metrics-state.js +128 -4
- package/dist/integrations/metrics-state.js.map +1 -1
- package/dist/integrations/metrics.d.ts +62 -6
- package/dist/integrations/metrics.js +49 -8
- package/dist/integrations/metrics.js.map +1 -1
- package/dist/integrations/openai.js +9 -31
- package/dist/integrations/openai.js.map +1 -1
- package/dist/integrations/otlp.d.ts +3 -3
- package/dist/integrations/report.d.ts +7 -0
- package/dist/integrations/report.js +20 -1
- package/dist/integrations/report.js.map +1 -1
- package/dist/runtime/memory.d.ts +61 -1
- package/dist/runtime/memory.js +47 -7
- package/dist/runtime/memory.js.map +1 -1
- package/dist/runtime/run.d.ts +12 -2
- package/dist/runtime/run.js +126 -17
- package/dist/runtime/run.js.map +1 -1
- package/dist/store/fsStore.js +10 -4
- package/dist/store/fsStore.js.map +1 -1
- package/dist/store/record.d.ts +41 -0
- package/dist/store/record.js +54 -0
- package/dist/store/record.js.map +1 -0
- package/dist/store/redisStore.d.ts +24 -1
- package/dist/store/redisStore.js +42 -7
- package/dist/store/redisStore.js.map +1 -1
- package/dist/store/sqliteStore.d.ts +23 -0
- package/dist/store/sqliteStore.js +103 -8
- package/dist/store/sqliteStore.js.map +1 -1
- package/dist/store/store.d.ts +65 -2
- package/dist/store/store.js +5 -2
- package/dist/store/store.js.map +1 -1
- package/dist/toolkit/capability-cycles.d.ts +50 -0
- package/dist/toolkit/capability-cycles.js +88 -0
- package/dist/toolkit/capability-cycles.js.map +1 -0
- package/dist/toolkit/capability-slice.d.ts +86 -0
- package/dist/toolkit/capability-slice.js +98 -0
- package/dist/toolkit/capability-slice.js.map +1 -0
- package/dist/toolkit/module.d.ts +7 -1
- package/dist/toolkit/module.js +65 -32
- package/dist/toolkit/module.js.map +1 -1
- package/dist/transport/approval-policy.d.ts +1 -1
- package/dist/transport/approval-policy.js +8 -4
- package/dist/transport/approval-policy.js.map +1 -1
- package/dist/transport/approval-supervisor.d.ts +73 -0
- package/dist/transport/approval-supervisor.js +252 -0
- package/dist/transport/approval-supervisor.js.map +1 -0
- package/dist/transport/async.d.ts +159 -56
- package/dist/transport/async.js +627 -269
- package/dist/transport/async.js.map +1 -1
- package/dist/transport/drain-gate.d.ts +6 -2
- package/dist/transport/drain-gate.js +14 -2
- package/dist/transport/drain-gate.js.map +1 -1
- package/dist/transport/http-endpoints.d.ts +151 -0
- package/dist/transport/http-endpoints.js +480 -0
- package/dist/transport/http-endpoints.js.map +1 -0
- package/dist/transport/http-io.d.ts +66 -0
- package/dist/transport/http-io.js +145 -0
- package/dist/transport/http-io.js.map +1 -0
- package/dist/transport/http-route.d.ts +10 -3
- package/dist/transport/http-route.js +18 -3
- package/dist/transport/http-route.js.map +1 -1
- package/dist/transport/http-shapes.d.ts +11 -0
- package/dist/transport/http-shapes.js +31 -1
- package/dist/transport/http-shapes.js.map +1 -1
- package/dist/transport/http.d.ts +22 -35
- package/dist/transport/http.js +98 -476
- package/dist/transport/http.js.map +1 -1
- package/dist/transport/owner-id.d.ts +29 -0
- package/dist/transport/owner-id.js +46 -0
- package/dist/transport/owner-id.js.map +1 -0
- package/dist/transport/owner-liveness.d.ts +8 -0
- package/dist/transport/owner-liveness.js +56 -0
- package/dist/transport/owner-liveness.js.map +1 -0
- package/dist/transport/resume-policy.d.ts +48 -10
- package/dist/transport/resume-policy.js +25 -10
- package/dist/transport/resume-policy.js.map +1 -1
- package/dist/transport/resume-scanner.d.ts +55 -0
- package/dist/transport/resume-scanner.js +219 -0
- package/dist/transport/resume-scanner.js.map +1 -0
- package/dist/transport/scheduler.js +9 -23
- package/dist/transport/scheduler.js.map +1 -1
- package/dist/transport/signal-supervisor.d.ts +80 -0
- package/dist/transport/signal-supervisor.js +129 -0
- package/dist/transport/signal-supervisor.js.map +1 -0
- package/dist/transport/slot-pool.d.ts +9 -1
- package/dist/transport/slot-pool.js +9 -1
- package/dist/transport/slot-pool.js.map +1 -1
- package/dist/transport/task-events.d.ts +34 -3
- package/dist/transport/task-events.js +93 -5
- package/dist/transport/task-events.js.map +1 -1
- package/dist/transport/wake-policy.d.ts +50 -0
- package/dist/transport/wake-policy.js +43 -0
- package/dist/transport/wake-policy.js.map +1 -0
- package/package.json +14 -4
package/dist/engine/loop.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { truncateWithMark } from '../core/json.js';
|
|
1
2
|
import { createAnthropicClient } from '../integrations/anthropic.js';
|
|
2
3
|
import { withCurrentSpan } from './span-scope.js';
|
|
3
4
|
import { abortedResult, failedResult, finishedResult, suspendedResult } from './loop-result.js';
|
|
4
|
-
import { tailToolUses, textOfParam } from './resume-input.js';
|
|
5
|
-
import {
|
|
5
|
+
import { tailToolUses, renderTaskEvent, textOfParam } from './resume-input.js';
|
|
6
|
+
import { detectMenuDrift, menuSignature } from './menu-drift.js';
|
|
7
|
+
import { DEFAULT_MAX_ITERATIONS, DEFAULT_MAX_TOKENS, resolveDefaultModel, resolveModelChain, runConfigSnapshot, validateLabels, } from './run-config.js';
|
|
6
8
|
import { TraceRecorder } from './tracer.js';
|
|
7
9
|
import { abortedError, budgetError, buildLoopContext, checkTurnEntry, executeTurnTools, recordTurnUsage, streamTurn, } from './turn.js';
|
|
8
10
|
import { textOf } from './text.js';
|
|
@@ -37,6 +39,41 @@ import { isSuccessStopReason } from './types.js';
|
|
|
37
39
|
function forkPolicyPerRun(policy) {
|
|
38
40
|
return policy?.forRun ? policy.forRun() : policy;
|
|
39
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* 事件注入(2026-09-28 ⑥,run 事件投入口):挂起期间投递的事件(`args.events`,
|
|
44
|
+
* 随 `TaskRecord.pendingEvents` 落库到这里)在**未决 tool_use 解决之后**渲染成
|
|
45
|
+
* user 文本消息追加进消息流,每条并在父 span 上记一条 `task.event` 事件留痕
|
|
46
|
+
* (`injected: true` —— 口径是「**注入进本段消息流**」,不是「模型已看到」:
|
|
47
|
+
* 该段若在首个模型请求之前就中止/失败,事件不进持久化历史(终态分支无条件清
|
|
48
|
+
* 簿记,见 async.ts),但这条留痕仍然成立 —— 它记的是注入动作本身。
|
|
49
|
+
* 2026-09-28 外部深评 P3-2:原名 `delivered` 超前于事实)。
|
|
50
|
+
* (投毒面是「看得见」的第一道防线)。
|
|
51
|
+
*
|
|
52
|
+
* 为什么注入点在 loop 而不是宿主往 `rec.spec.messages` 末尾追加:
|
|
53
|
+
* ① `tailToolUses` 只认历史**末尾一条** —— 末尾被一条 user 事件消息占住,
|
|
54
|
+
* 未决 tool_use 就不在末尾了,续跑会被判成新对话(同一批工具再跑一遍);
|
|
55
|
+
* ② 协议要求 tool_result 紧邻 tool_use —— 事件只能排在 tool_result **之后**;
|
|
56
|
+
* ③ 再次挂起的出口**不**走这里(调用方在 suspended/deferred 分支直接返回)——
|
|
57
|
+
* 注入了会把 user 消息留在历史末尾,毁掉下一次续跑判定;那种情况下事件留在
|
|
58
|
+
* `TaskRecord.pendingEvents` 里,等真正跑通的那次续跑再注入。
|
|
59
|
+
*/
|
|
60
|
+
function deliverTaskEvents(ctx, events) {
|
|
61
|
+
if (!events || events.length === 0)
|
|
62
|
+
return;
|
|
63
|
+
const where = ctx.args.parentSpanId ?? '';
|
|
64
|
+
for (const ev of events) {
|
|
65
|
+
ctx.args.recorder.event(where, 'task.event', {
|
|
66
|
+
injected: true,
|
|
67
|
+
event_type: ev.type,
|
|
68
|
+
...(ev.eventId !== undefined ? { event_id: ev.eventId } : {}),
|
|
69
|
+
});
|
|
70
|
+
ctx.messages.push(renderTaskEvent(ev));
|
|
71
|
+
}
|
|
72
|
+
// 置位:出口把它带进结果(eventsDelivered),宿主据此清 pendingEvents ——
|
|
73
|
+
// 注入过的簿记留到下一次续跑就是**重复注入**
|
|
74
|
+
// 置在**跨段共享**的 progress 上(不是内层 ctx):外层 catch 也要读它(外部深评 E4)
|
|
75
|
+
ctx.progress.eventsDelivered = true;
|
|
76
|
+
}
|
|
40
77
|
/**
|
|
41
78
|
* 循环体核心:带父 span 跑一轮 manual loop。请求失败按 error 收掉 turn 后抛出,由外层收尾。
|
|
42
79
|
*
|
|
@@ -58,19 +95,64 @@ async function agentLoop(args) {
|
|
|
58
95
|
// (不发请求、零花费)。
|
|
59
96
|
const resumeUses = tailToolUses(ctx.messages);
|
|
60
97
|
if (resumeUses.length > 0) {
|
|
61
|
-
// 已取消:不执行任何工具(副作用不该在取消后发生),按 aborted
|
|
98
|
+
// 已取消:不执行任何工具(副作用不该在取消后发生),按 aborted 收尾。
|
|
99
|
+
// 放在漂移检测**之前**:已取消的续跑不会再跑任何工具,菜单对不对得上它都不在乎 ——
|
|
100
|
+
// 先发 menu.drift 事件 + console.warn 是纯噪音(还会误导读成「这条要续跑」)。
|
|
62
101
|
if (args.signal?.aborted) {
|
|
63
102
|
return abortedResult();
|
|
64
103
|
}
|
|
104
|
+
const drift = detectMenuDrift(resumeUses, args.tools, { resultSchema: args.resultSchema });
|
|
105
|
+
// 菜单漂移(R8 候选 3 / durable 调研 §4.1 + §6 候选 3):**续跑**时未决 tool_use 引用的
|
|
106
|
+
// 工具在当前菜单里找不到了 —— 上一段与这一段跑在不同的代码版本上(删了 / 改名了一个工具)。
|
|
107
|
+
// 这与回合内「模型编了个不存在的工具名」不同类:那个模型拿一句 `unknown tool` 就能自我
|
|
108
|
+
// 修正(既有路径,钉在 tests/engine/toolTiming.test.ts);这个是**我们的部署动作**把一条
|
|
109
|
+
// 在飞 run 的意图作废了 —— 而它此前**完全静默**(run 照常收尾、调用方零信号,见 spec §10 ⑧)。
|
|
110
|
+
//
|
|
111
|
+
// 动作(本轮立项的取舍,理由写在 spec §10):**不改 run 的成败** —— 挂起是合法态、改代码
|
|
112
|
+
// 是发布常态,判失败会让「续跑」在正常迭代节奏下频繁失败。但把它变成三处看得见:
|
|
113
|
+
// ① `menu.drift` 事件(时间线;经 onTraceEvent 也进 `GET /tasks/:id/stream`)
|
|
114
|
+
// ② 父 span 属性 `menu.drift`(可查询:`TaskRecord.result.trace` 里就带得到)
|
|
115
|
+
// ③ `console.warn`(运维面立即看见,与「sink 失败落 warn」同款,见 spec §10 2026-09-27 ②)
|
|
116
|
+
// 「严格失败」若要做,是把这里换成带具名 error 的收尾 —— 那要动公共选项面 + limits 真源表,
|
|
117
|
+
// 留给后续决策,别在这里先斩后奏。
|
|
118
|
+
if (drift.missing.length > 0) {
|
|
119
|
+
const where = args.parentSpanId ?? '';
|
|
120
|
+
args.recorder.event(where, 'menu.drift', {
|
|
121
|
+
missing: drift.missing,
|
|
122
|
+
tool_use_ids: drift.toolUseIds,
|
|
123
|
+
menu_size: args.tools.length,
|
|
124
|
+
});
|
|
125
|
+
if (where) {
|
|
126
|
+
args.recorder.setAttribute(where, 'menu.drift', `missing:${truncateWithMark(drift.missing.join(','), 200)}`);
|
|
127
|
+
}
|
|
128
|
+
console.warn(`[agentia] 续跑时菜单漂移:未决工具在当前菜单里不存在(${drift.missing.join(', ')})` +
|
|
129
|
+
'—— 这条 run 是上一段代码版本留下的;这些 tool_use 会以 "unknown tool" 回给模型、' +
|
|
130
|
+
'run 照常收尾(trace 上记了 menu.drift 事件与属性)。要按原样续跑就把它们加回菜单。');
|
|
131
|
+
}
|
|
65
132
|
// 工具事件记到父 span:被恢复的回合属于挂起段的旧 trace,本段没有对应 llm.turn
|
|
66
133
|
const outcome = await executeTurnTools(ctx, args.parentSpanId ?? '', resumeUses, null);
|
|
67
134
|
if (outcome.kind === 'suspended') {
|
|
68
|
-
return suspendedResult(ctx, outcome.pending);
|
|
135
|
+
return suspendedResult(ctx, { reason: 'approval', pending: outcome.pending });
|
|
136
|
+
}
|
|
137
|
+
if (outcome.kind === 'deferred') {
|
|
138
|
+
// 恢复段(醒来后重跑这一批)里工具**又**请求延后:说明条件仍未成熟 ⇒ 再挂一次。
|
|
139
|
+
// 目标时刻以**本次**请求为准(不是沿用上一段的 wakeAt —— 工具看到的状态更近)。
|
|
140
|
+
return suspendedResult(ctx, {
|
|
141
|
+
reason: 'timer',
|
|
142
|
+
pending: outcome.pending,
|
|
143
|
+
wakeAt: outcome.wakeAt,
|
|
144
|
+
});
|
|
69
145
|
}
|
|
70
146
|
if (outcome.results.length > 0)
|
|
71
147
|
ctx.messages.push({ role: 'user', content: outcome.results });
|
|
72
|
-
|
|
148
|
+
// 事件注入(2026-09-28 ⑥):在 tool_result **落定之后**进历史(纪律见 deliverTaskEvents)。
|
|
149
|
+
// 上面两个再挂起出口刻意**不**经过这里 —— 事件留在 pendingEvents 里等下一次续跑。
|
|
150
|
+
deliverTaskEvents(ctx, args.events);
|
|
151
|
+
if (ctx.submitted && (args.events === undefined || args.events.length === 0)) {
|
|
73
152
|
// 恢复的回合里 submit_result 校验通过:直接落定(finalText 取该 assistant 消息的文本块)
|
|
153
|
+
// ⚠️ 有待注入事件时**不**直接落定:事件是新输入,落定等于让模型对着旧信息收尾 ——
|
|
154
|
+
// 注入后接着进正常循环,让模型看到事件再决定(可以再 submit_result,先到先得)。
|
|
155
|
+
// (能进这个分支 ⇒ 无事件 ⇒ tail 的下标与原先一致:刚 push 的 tool_results 之前那条)
|
|
74
156
|
const tail = ctx.messages[ctx.messages.length - 2]; // 刚 push 了 tool_results,前一条是那条 assistant
|
|
75
157
|
// iterations 0:本段没发过模型请求(恢复的工具执行不计往返)
|
|
76
158
|
return finishedResult({
|
|
@@ -81,6 +163,11 @@ async function agentLoop(args) {
|
|
|
81
163
|
});
|
|
82
164
|
}
|
|
83
165
|
}
|
|
166
|
+
else {
|
|
167
|
+
// 防御:事件只投给挂起任务 ⇒ 经宿主来的必有未决 tool_use(走上面分支);
|
|
168
|
+
// 手工直传 `events` 给 app.run 而没有未决 tool_use 时,照样注入(诚实:给了就进历史)
|
|
169
|
+
deliverTaskEvents(ctx, args.events);
|
|
170
|
+
}
|
|
84
171
|
for (let iteration = 0; iteration < args.maxIterations; iteration++) {
|
|
85
172
|
const halt = await checkTurnEntry(ctx, iteration);
|
|
86
173
|
if (halt) {
|
|
@@ -89,7 +176,7 @@ async function agentLoop(args) {
|
|
|
89
176
|
finished = true;
|
|
90
177
|
break;
|
|
91
178
|
}
|
|
92
|
-
const { turnId, message, aborted } = await streamTurn(ctx);
|
|
179
|
+
const { turnId, message, aborted, model: modelUsed } = await streamTurn(ctx);
|
|
93
180
|
if (aborted || !message) {
|
|
94
181
|
stopReason = 'aborted';
|
|
95
182
|
error = abortedError();
|
|
@@ -97,7 +184,7 @@ async function agentLoop(args) {
|
|
|
97
184
|
break;
|
|
98
185
|
}
|
|
99
186
|
ctx.progress.iterations++;
|
|
100
|
-
recordTurnUsage(ctx, turnId, message);
|
|
187
|
+
recordTurnUsage(ctx, turnId, message, modelUsed);
|
|
101
188
|
// 成本硬管控(C1):本回合 usage 已落账 → 立刻判一次(超限会触发 onExceed 记事件)。
|
|
102
189
|
// 结果**留到「循环是否还要继续」确定后再用**:
|
|
103
190
|
// - 模型本回合自然收尾 → 不因「最后一回合把额度用超了」把已成功的 run 改判失败
|
|
@@ -119,9 +206,27 @@ async function agentLoop(args) {
|
|
|
119
206
|
// HITL 挂起:assistant 消息(含未决 tool_use)已在历史里、**不推任何 tool_result**
|
|
120
207
|
// (全有或全无,见 executeTurnTools 的审批闸);approval.requested 已记在 turn span 上。
|
|
121
208
|
// error 保持 undefined —— 挂起不是失败。
|
|
122
|
-
stopReason = '
|
|
209
|
+
stopReason = 'suspended';
|
|
210
|
+
finalText = textOf(message);
|
|
211
|
+
return suspendedResult(ctx, { reason: 'approval', pending: outcome.pending }, finalText);
|
|
212
|
+
}
|
|
213
|
+
if (outcome.kind === 'deferred') {
|
|
214
|
+
// abort 优先于挂起(2026-09-28 复审收口):本回合若已被中止(runTimeoutMs 到点 /
|
|
215
|
+
// cancel),意图是「停」—— 不能挂成 timer 之后到点再醒,那等于把取消/超时**吃掉**
|
|
216
|
+
// (审批挂起要人来推、timer 会自己醒,所以这条判据对 deferred 比对 approval 更要紧;
|
|
217
|
+
// 审批那条由 cancel 对 suspended 的翻转兜底,timer 没有这兜底的下一棒)。
|
|
218
|
+
if (args.signal?.aborted) {
|
|
219
|
+
stopReason = 'aborted';
|
|
220
|
+
error = abortedError();
|
|
221
|
+
finished = true;
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
// 时间挂起(durable timer):与上面同形 —— 这批工具**跑过但结果作废**
|
|
225
|
+
// (defer.requested 已记在 turn span 上),assistant 消息留在历史末尾,
|
|
226
|
+
// 醒来后由续跑入口重跑这一批。error 保持 undefined。
|
|
227
|
+
stopReason = 'suspended';
|
|
123
228
|
finalText = textOf(message);
|
|
124
|
-
return suspendedResult(ctx, outcome.pending, finalText);
|
|
229
|
+
return suspendedResult(ctx, { reason: 'timer', pending: outcome.pending, wakeAt: outcome.wakeAt }, finalText);
|
|
125
230
|
}
|
|
126
231
|
if (outcome.results.length > 0)
|
|
127
232
|
ctx.messages.push({ role: 'user', content: outcome.results });
|
|
@@ -157,6 +262,9 @@ async function agentLoop(args) {
|
|
|
157
262
|
iterations: ctx.progress.iterations,
|
|
158
263
|
typed: ctx.typed,
|
|
159
264
|
error,
|
|
265
|
+
...(ctx.progress.eventsDelivered !== undefined
|
|
266
|
+
? { eventsDelivered: ctx.progress.eventsDelivered }
|
|
267
|
+
: {}),
|
|
160
268
|
});
|
|
161
269
|
}
|
|
162
270
|
/** 主入口:开 run 根 span,循环跑在其下。返回完整 trace(traceId 即 runId)。 */
|
|
@@ -179,6 +287,13 @@ export async function runAgent(options) {
|
|
|
179
287
|
// 会话标识(R7 thread 维度):多轮 run 按 session 聚合;OTLP 侧映射 gen_ai.conversation.id
|
|
180
288
|
if (options.sessionId)
|
|
181
289
|
recorder.setAttribute(rootId, 'session.id', options.sessionId);
|
|
290
|
+
// 归因标签(R8-P4):labels.* 落 run 根(trace 侧无基数问题;进 metrics 是
|
|
291
|
+
// metricsSink 的 labelKeys 那道显式开关 —— 两套纪律在各自的注释里互相指)
|
|
292
|
+
if (options.labels) {
|
|
293
|
+
for (const [k, v] of Object.entries(options.labels)) {
|
|
294
|
+
recorder.setAttribute(rootId, `labels.${k}`, v);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
182
297
|
// 入站链路(spec §9.2 跨进程关联):把「谁触发了这次 run」记成 run 根的一条 link。
|
|
183
298
|
// 与 `traceId == runId` 共存 —— 上游是被**链接**而不是被继承成父 span,所以本 run
|
|
184
299
|
// 的树永远自洽(上游采样掉/已结束都不影响),因果关系仍然可查。见 core/trace.ts。
|
|
@@ -188,19 +303,37 @@ export async function runAgent(options) {
|
|
|
188
303
|
...(options.traceContext.spanId ? { spanId: options.traceContext.spanId } : {}),
|
|
189
304
|
});
|
|
190
305
|
}
|
|
306
|
+
// 菜单版本化(R8 候选 3):名字清单(人读、有界)+ 摘要(比对)。
|
|
307
|
+
// 与 `prompts.versions` 同一动机 —— 质量回归要能定位到具体菜单版本;摘要覆盖 schema,
|
|
308
|
+
// 所以「工具还在、签名变了」也算漂移。**只在 run 根记**:子循环走 `runAgentScoped`
|
|
309
|
+
// (不开 run 根、不设根属性),所以不会把子菜单覆写到根上。
|
|
310
|
+
if (options.tools && options.tools.length > 0) {
|
|
311
|
+
const { names, hash } = menuSignature(options.tools);
|
|
312
|
+
recorder.setAttribute(rootId, 'tools.names', names);
|
|
313
|
+
recorder.setAttribute(rootId, 'tools.menuHash', hash);
|
|
314
|
+
}
|
|
191
315
|
// 生效配置快照(G3):本 run 真正用着的旋钮写进 run 根 —— 事后能回答
|
|
192
316
|
// 「这条 run 的 maxCostUsd 设了没 / 重试几次」,换参数前后的对比才有据可查。
|
|
193
317
|
// 只记可序列化标量;函数型选项(summarize / estimateTokens)不记内容。
|
|
194
318
|
for (const [k, v] of Object.entries(runConfigSnapshot(options)))
|
|
195
319
|
recorder.setAttribute(rootId, k, v);
|
|
196
|
-
const progress = { iterations: 0 };
|
|
320
|
+
const progress = { iterations: 0, eventsDelivered: false };
|
|
321
|
+
// fallback 链(R8-P2)在 **try 之外**解析 + 校验:坏环 / 死 client(持久化反序列化的
|
|
322
|
+
// 空壳)是调用方的配置错,必须在 run 入口响亮抛 TypeError —— 放进 try 会被
|
|
323
|
+
// failedResult 收成「一条失败的 run」,配置错就这样被记成了运行失败(静默降级的一种)。
|
|
324
|
+
const client = options.client ?? createAnthropicClient();
|
|
325
|
+
const model = resolveDefaultModel(options.model);
|
|
326
|
+
const modelChain = resolveModelChain({ model, client, fallbacks: options.fallbacks });
|
|
327
|
+
// 归因标签(R8-P4)同一条入口校验纪律:配置错响亮抛,不收成失败的 run
|
|
328
|
+
validateLabels(options.labels);
|
|
197
329
|
let result;
|
|
198
330
|
try {
|
|
199
331
|
// run 根作用域(spec §9.2 出站传播):循环内任何地方(工具 / 子能力 / 中间件)都读得到
|
|
200
332
|
// 「我正处在哪个 span」—— 更内层的作用域由 turn / skill / subagent 逐层收窄。
|
|
201
333
|
result = await withCurrentSpan({ traceId: recorder.traceId, spanId: rootId }, () => agentLoop({
|
|
202
|
-
client
|
|
203
|
-
model
|
|
334
|
+
client,
|
|
335
|
+
model,
|
|
336
|
+
modelChain,
|
|
204
337
|
maxTokens: options.maxTokens ?? DEFAULT_MAX_TOKENS,
|
|
205
338
|
maxIterations: options.maxIterations ?? DEFAULT_MAX_ITERATIONS,
|
|
206
339
|
system: options.system,
|
|
@@ -220,20 +353,21 @@ export async function runAgent(options) {
|
|
|
220
353
|
toolTimeoutMs: options.toolTimeoutMs,
|
|
221
354
|
maxToolConcurrency: options.maxToolConcurrency,
|
|
222
355
|
maxEventChars: options.maxEventChars,
|
|
356
|
+
traceContent: options.traceContent,
|
|
223
357
|
priceOverrides: options.priceOverrides,
|
|
224
358
|
onUnpricedModel: options.onUnpricedModel,
|
|
225
359
|
approvals: options.approvals,
|
|
360
|
+
events: options.events,
|
|
226
361
|
}));
|
|
227
362
|
}
|
|
228
363
|
catch (e) {
|
|
229
364
|
// 硬写 0 会把「第 3 回合请求失败」报成「一次模型都没调」——按实际进度报
|
|
230
|
-
|
|
365
|
+
// eventsDelivered 同期照实传:这条出口可能发生在**事件注入之后**(见 failedResult 头注)
|
|
366
|
+
result = failedResult(e, progress.iterations, progress.eventsDelivered);
|
|
231
367
|
}
|
|
232
|
-
//
|
|
368
|
+
// suspended 不是失败:挂起段本身执行无误(「等人」不该被看板算成「失败」),
|
|
233
369
|
// trace 记 ok;它与成功的区分由 stop_reason attribute 承担。
|
|
234
|
-
const runStatus = result.stopReason === '
|
|
235
|
-
? 'ok'
|
|
236
|
-
: 'error';
|
|
370
|
+
const runStatus = result.stopReason === 'suspended' || isSuccessStopReason(result.stopReason) ? 'ok' : 'error';
|
|
237
371
|
recorder.setAttribute(rootId, 'stop_reason', result.stopReason);
|
|
238
372
|
recorder.end(rootId, { status: runStatus, ...(result.error ? { error: result.error } : {}) });
|
|
239
373
|
const trace = recorder.snapshot(runStatus);
|
|
@@ -246,6 +380,9 @@ export async function runAgent(options) {
|
|
|
246
380
|
typed: result.typed,
|
|
247
381
|
suspendedMessages: result.suspendedMessages,
|
|
248
382
|
pendingApprovals: result.pendingApprovals,
|
|
383
|
+
suspendedReason: result.suspendedReason,
|
|
384
|
+
wakeAt: result.wakeAt,
|
|
385
|
+
eventsDelivered: result.eventsDelivered,
|
|
249
386
|
};
|
|
250
387
|
}
|
|
251
388
|
/**
|
|
@@ -257,6 +394,8 @@ export async function runAgentScoped(opts) {
|
|
|
257
394
|
return agentLoop({
|
|
258
395
|
client: opts.client ?? createAnthropicClient(),
|
|
259
396
|
model: resolveDefaultModel(opts.model),
|
|
397
|
+
// 不传 modelChain:子 agent 子循环**不继承**主 run 的 fallback 链(R8-P2 的有意边界 ——
|
|
398
|
+
// 子循环的 model/client 由能力层显式给,跨厂商的链继承下来会让子 agent 悄悄换厂商)
|
|
260
399
|
maxTokens: opts.maxTokens ?? DEFAULT_MAX_TOKENS,
|
|
261
400
|
maxIterations: opts.maxIterations ?? DEFAULT_MAX_ITERATIONS,
|
|
262
401
|
system: opts.system,
|
|
@@ -272,6 +411,7 @@ export async function runAgentScoped(opts) {
|
|
|
272
411
|
toolTimeoutMs: opts.toolTimeoutMs,
|
|
273
412
|
maxToolConcurrency: opts.maxToolConcurrency,
|
|
274
413
|
maxEventChars: opts.maxEventChars,
|
|
414
|
+
traceContent: opts.traceContent,
|
|
275
415
|
priceOverrides: opts.priceOverrides,
|
|
276
416
|
onUnpricedModel: opts.onUnpricedModel,
|
|
277
417
|
maxTotalTokens: opts.maxTotalTokens,
|
package/dist/engine/loop.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/engine/loop.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/engine/loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { createServer } from 'node:http';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
/**
|
|
4
|
+
* Agentia —— MCP 反向桥的 **StreamableHTTP 传输**(2026-09-28 自 `mcp-server.ts` 切出,
|
|
5
|
+
* 与正向桥 `integrations/mcp-http.ts` 同款排布:桥居中、传输各居其文件)。
|
|
6
|
+
*
|
|
7
|
+
* 形状:POST 收 JSON-RPC,应答 `application/json`(简单应答不上 SSE);`initialize`
|
|
8
|
+
* 响应发 `mcp-session-id` 头(生成的 uuid),后续请求带了就接受、**不带也服务**
|
|
9
|
+
* (无状态 server,宽容是有意的);GET(server→client 流)→ 405;DELETE → 200;
|
|
10
|
+
* 客户端断连会中止该次工具调用的 `signal`;**协议面之外的意外**回 200 + JSON-RPC
|
|
11
|
+
* `-32603`(不冒泡成 unhandled rejection 把宿主带走,见 `onRequest` 的 catch)。
|
|
12
|
+
*
|
|
13
|
+
* **依赖方向(单向,运行期无环)**:本文件从 `mcp-server.js` 只取**类型**
|
|
14
|
+
* (`McpCore` / `McpServer` / 传输相关的选项),协议与执行由 `core` 注入 ——
|
|
15
|
+
* 与正向桥那条**真实的值环**(桥 re-export 连接器 + 连接器反向 import 共享 helper)
|
|
16
|
+
* 刻意不同,见 `mcp-server-stdio.ts` 头注。
|
|
17
|
+
*
|
|
18
|
+
* 入参用 `Pick<McpServerOptions, …>` 而不是自定义一个选项类型:选项的文档**只有一份**
|
|
19
|
+
* (在 `McpServerOptions` 上),子集在这里只表达「本条传输读哪几项」,
|
|
20
|
+
* 免得两处描述同一批旋钮、然后其中一处过期。
|
|
21
|
+
*/
|
|
22
|
+
/** http 侧请求 body 上限(固定 1 MiB,与 HTTP 宿主缺省一致;不公开成旋钮) */
|
|
23
|
+
const MAX_BODY_BYTES = 1024 * 1024;
|
|
24
|
+
export function startHttpTransport(core, opts) {
|
|
25
|
+
const host = opts.host ?? '127.0.0.1';
|
|
26
|
+
const path = opts.path ?? '/mcp';
|
|
27
|
+
const shared = opts.server !== undefined;
|
|
28
|
+
const server = opts.server ?? createServer();
|
|
29
|
+
/** initialize 响应发的会话 id(生成的 uuid;无状态 server 只发不校验 —— 宽容是有意的) */
|
|
30
|
+
const sessionId = randomUUID();
|
|
31
|
+
const sendJson = (res, status, body) => {
|
|
32
|
+
if (res.writableEnded || res.destroyed)
|
|
33
|
+
return; // 客户端已走:写了也没人收
|
|
34
|
+
const payload = JSON.stringify(body);
|
|
35
|
+
res.writeHead(status, {
|
|
36
|
+
'content-type': 'application/json; charset=utf-8',
|
|
37
|
+
'content-length': Buffer.byteLength(payload),
|
|
38
|
+
});
|
|
39
|
+
res.end(payload);
|
|
40
|
+
};
|
|
41
|
+
const readBody = (req) => new Promise((resolvePromise) => {
|
|
42
|
+
const chunks = [];
|
|
43
|
+
let size = 0;
|
|
44
|
+
let done = false;
|
|
45
|
+
const finish = (v) => {
|
|
46
|
+
if (done)
|
|
47
|
+
return;
|
|
48
|
+
done = true;
|
|
49
|
+
resolvePromise(v);
|
|
50
|
+
};
|
|
51
|
+
req.on('data', (c) => {
|
|
52
|
+
size += c.length;
|
|
53
|
+
if (size > MAX_BODY_BYTES) {
|
|
54
|
+
finish(null);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
chunks.push(c);
|
|
58
|
+
});
|
|
59
|
+
req.on('end', () => finish(Buffer.concat(chunks).toString('utf8')));
|
|
60
|
+
req.on('error', () => finish(null));
|
|
61
|
+
req.on('close', () => finish(null));
|
|
62
|
+
});
|
|
63
|
+
const onRequest = async (req, res) => {
|
|
64
|
+
const pathname = new URL(req.url ?? '/', 'http://localhost').pathname;
|
|
65
|
+
if (pathname !== path) {
|
|
66
|
+
// 挂进既有 server 时,别的路径交给宿主自己的路由(本 handler 不管);
|
|
67
|
+
// 自有 server 上就是 404
|
|
68
|
+
if (shared)
|
|
69
|
+
return;
|
|
70
|
+
sendJson(res, 404, { error: `路径不存在: ${pathname}` });
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const method = req.method ?? 'GET';
|
|
74
|
+
// 鉴权缝:与 HTTP 宿主同纪律,**两点都同** ——
|
|
75
|
+
// ① 在读 body 之前(body 一个字节都不收);
|
|
76
|
+
// ② 在**方法 / 路径判定之前**:未鉴权一律 401,不泄露 endpoint 存在性。
|
|
77
|
+
// 宿主的分支顺序是「免鉴权组的 405 先于鉴权,其余先鉴权再判方法与路径」
|
|
78
|
+
// (`transport/http-route.ts`),此前这里把 DELETE/405 摆在鉴权前面,
|
|
79
|
+
// 于是未鉴权能拿到 `405 allow: POST, DELETE` 与 `DELETE → 200`(2026-09-27 ⑨)。
|
|
80
|
+
// 自己这条 path 的判定不在此列:它只是「这个请求是不是我的」,别的路径原样交回宿主。
|
|
81
|
+
if (opts.auth) {
|
|
82
|
+
try {
|
|
83
|
+
await opts.auth(req);
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
console.error('[agentia:mcp-server] 鉴权钩子异常:', e);
|
|
87
|
+
if (!req.complete)
|
|
88
|
+
res.setHeader('connection', 'close'); // body 未消费 ⇒ 连接不可复用
|
|
89
|
+
sendJson(res, 401, { error: '未通过鉴权' });
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (method === 'DELETE') {
|
|
94
|
+
// 尽力终止会话(MCP 约定):无状态 server 没有可终止的会话,200 收口
|
|
95
|
+
res.writeHead(200);
|
|
96
|
+
res.end();
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (method !== 'POST') {
|
|
100
|
+
// GET(server→client 流)不做(YAGNI,见 mcp-server.ts 文件头)→ 405
|
|
101
|
+
res.setHeader('allow', 'POST, DELETE');
|
|
102
|
+
sendJson(res, 405, { error: `方法 ${method} 不被允许,请用 POST` });
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const raw = await readBody(req);
|
|
106
|
+
if (raw === null) {
|
|
107
|
+
if (!req.complete)
|
|
108
|
+
res.setHeader('connection', 'close');
|
|
109
|
+
sendJson(res, 413, { error: `请求 body 超过上限 ${MAX_BODY_BYTES} 字节或连接中断` });
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
let msg;
|
|
113
|
+
try {
|
|
114
|
+
msg = JSON.parse(raw);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
sendJson(res, 400, { error: '请求 body 不是合法 JSON' });
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
// 客户端断连 ⇒ 中止该次工具调用的 signal(协作式;与 HTTP 宿主同款 onClose 守卫)
|
|
121
|
+
const ac = new AbortController();
|
|
122
|
+
const signal = core.trackCall(ac);
|
|
123
|
+
const onClose = () => {
|
|
124
|
+
if (!res.writableEnded)
|
|
125
|
+
ac.abort();
|
|
126
|
+
};
|
|
127
|
+
res.once('close', onClose);
|
|
128
|
+
try {
|
|
129
|
+
const resp = await core.dispatch(msg, signal);
|
|
130
|
+
if (resp === null) {
|
|
131
|
+
// 通知(含 notifications/initialized):202 + 空体
|
|
132
|
+
res.writeHead(202);
|
|
133
|
+
res.end();
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (res.writableEnded || res.destroyed)
|
|
137
|
+
return;
|
|
138
|
+
const payload = JSON.stringify(resp);
|
|
139
|
+
const headers = {
|
|
140
|
+
'content-type': 'application/json; charset=utf-8',
|
|
141
|
+
'content-length': Buffer.byteLength(payload),
|
|
142
|
+
};
|
|
143
|
+
// initialize 响应发 mcp-session-id(生成的 uuid);后续请求带了就接受、不带也服务
|
|
144
|
+
if (msg.method === 'initialize') {
|
|
145
|
+
headers['mcp-session-id'] = sessionId;
|
|
146
|
+
}
|
|
147
|
+
res.writeHead(200, headers);
|
|
148
|
+
res.end(payload);
|
|
149
|
+
}
|
|
150
|
+
catch (e) {
|
|
151
|
+
// 兜底(2026-09-28 修):这个 try 此前**只有 `finally`** —— 异常冒泡出 async handler
|
|
152
|
+
// 就是 unhandled rejection,Node ≥15 默认**终止进程**(同文件的鉴权钩子与 JSON.parse
|
|
153
|
+
// 两处都有 catch;stdio 那条传输也有 `.catch` 兜着,只有这里漏了 ⇒ 同一份协议面在两条
|
|
154
|
+
// 传输上一条活着、一条把宿主带走)。
|
|
155
|
+
//
|
|
156
|
+
// 真能走到这里的只有「协议面之外的意外」,工具自身抛错由 `callTool` 兜成 `isError`
|
|
157
|
+
// 不会冒泡:例如工具列表里某条 `inputSchema` 是带 getter 的对象(`validateJsonSchema`
|
|
158
|
+
// 一读就抛)、或惰性 client 构造失败(默认 `createAnthropicClient()` 缺 API key)。
|
|
159
|
+
// 这些是**请求级**的意外 ⇒ 该回一条 JSON-RPC 错误并继续服务,而不是退出进程。
|
|
160
|
+
console.error('[agentia:mcp-server] 请求处理异常:', e);
|
|
161
|
+
const rawId = msg.id;
|
|
162
|
+
const id = typeof rawId === 'number' || typeof rawId === 'string' || rawId === null ? rawId : null;
|
|
163
|
+
if (res.headersSent) {
|
|
164
|
+
res.end(); // 响应头已定(200 已发):只能收口,状态码改不了了
|
|
165
|
+
}
|
|
166
|
+
else if (!res.writableEnded && !res.destroyed) {
|
|
167
|
+
// 与 stdio 侧同形状(`rpcError` 是协议面的知识,由 core 注入 —— 传输层不自己拼错误码)
|
|
168
|
+
sendJson(res, 200, core.rpcError(id, -32603, '内部错误(详见服务端日志)'));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
finally {
|
|
172
|
+
res.off('close', onClose);
|
|
173
|
+
core.untrackCall(ac);
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
server.on('request', onRequest);
|
|
177
|
+
let url;
|
|
178
|
+
const ready = shared
|
|
179
|
+
? Promise.resolve()
|
|
180
|
+
: new Promise((resolvePromise, rejectPromise) => {
|
|
181
|
+
server.once('error', rejectPromise);
|
|
182
|
+
server.listen(opts.port ?? 0, host, () => {
|
|
183
|
+
const addr = server.address();
|
|
184
|
+
if (addr !== null && typeof addr === 'object') {
|
|
185
|
+
url = `http://${host}:${addr.port}${path}`;
|
|
186
|
+
}
|
|
187
|
+
resolvePromise();
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
let closed = false;
|
|
191
|
+
return {
|
|
192
|
+
get url() {
|
|
193
|
+
return url;
|
|
194
|
+
},
|
|
195
|
+
ready,
|
|
196
|
+
close: () => {
|
|
197
|
+
if (closed)
|
|
198
|
+
return Promise.resolve();
|
|
199
|
+
closed = true;
|
|
200
|
+
core.abortAll();
|
|
201
|
+
if (shared) {
|
|
202
|
+
// 挂进来的既有 server 由宿主自己管:只摘除本 handler
|
|
203
|
+
server.off('request', onRequest);
|
|
204
|
+
return Promise.resolve();
|
|
205
|
+
}
|
|
206
|
+
return new Promise((resolvePromise) => {
|
|
207
|
+
server.close(() => resolvePromise());
|
|
208
|
+
// 仍在飞的连接会吊住 close 的回调(Node ≥ 18.2 有 closeAllConnections;旧版没有则
|
|
209
|
+
// 靠 abortAll 之后工具自行收尾 —— 读 signal 的工具会退出,连接随之结束)
|
|
210
|
+
server.closeAllConnections?.();
|
|
211
|
+
});
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=mcp-server-http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server-http.js","sourceRoot":"","sources":["../../src/engine/mcp-server-http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { McpCore, McpServer } from './mcp-server.js';
|
|
2
|
+
/**
|
|
3
|
+
* Agentia —— MCP 反向桥的 **stdio 传输**(2026-09-28 自 `mcp-server.ts` 切出,
|
|
4
|
+
* 与正向桥 `integrations/mcp-stdio.ts` 同款排布:桥居中、传输各居其文件)。
|
|
5
|
+
*
|
|
6
|
+
* 形状:stdin/stdout **换行分隔 JSON-RPC**(每行一个完整报文);日志只去 stderr
|
|
7
|
+
* —— stdout 是协议面,往里写一个字节都会污染报文流。
|
|
8
|
+
*
|
|
9
|
+
* **依赖方向(单向,运行期无环)**:本文件从 `mcp-server.js` 只取**类型**
|
|
10
|
+
* (`McpCore` / `McpServer`,编译期擦除),协议与执行**由 `core` 注入**。
|
|
11
|
+
* ⚠️ 与正向桥的差别(那边的 `mcp.ts ↔ mcp-stdio.ts` 是一条**真实的值环**:桥 re-export
|
|
12
|
+
* 连接器、连接器反向 import 桥的共享 helper,靠 ESM 的函数提升与调用时机侥幸无恙)——
|
|
13
|
+
* 这里刻意做成注入式:无环是**构造性**的,不靠运气。
|
|
14
|
+
*/
|
|
15
|
+
export declare function startStdioTransport(core: McpCore): McpServer;
|