@zhin.js/agent 1.0.9 → 1.1.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/README.md +46 -11
- package/lib/aop/index.d.ts +0 -2
- package/lib/aop/index.d.ts.map +1 -1
- package/lib/aop/index.js +0 -1
- package/lib/aop/index.js.map +1 -1
- package/lib/builtin/analyze-media-tool.d.ts.map +1 -1
- package/lib/builtin/analyze-media-tool.js +9 -8
- package/lib/builtin/analyze-media-tool.js.map +1 -1
- package/lib/collaboration/{inbound-turn-pipeline.d.ts → inbound-turn-compat.d.ts} +10 -6
- package/lib/collaboration/inbound-turn-compat.d.ts.map +1 -0
- package/lib/collaboration/inbound-turn-compat.js +30 -0
- package/lib/collaboration/inbound-turn-compat.js.map +1 -0
- package/lib/collaboration/index.d.ts +2 -5
- package/lib/collaboration/index.d.ts.map +1 -1
- package/lib/collaboration/index.js +1 -4
- package/lib/collaboration/index.js.map +1 -1
- package/lib/config/agent-interfaces.d.ts +3 -3
- package/lib/config/agent-interfaces.d.ts.map +1 -1
- package/lib/config/validate-ai-config.js +1 -1
- package/lib/config/validate-ai-config.js.map +1 -1
- package/lib/core/agent-core-run.d.ts +13 -0
- package/lib/core/agent-core-run.d.ts.map +1 -1
- package/lib/core/agent-core-run.js +38 -2
- package/lib/core/agent-core-run.js.map +1 -1
- package/lib/core/agent-loop-standalone.d.ts +3 -2
- package/lib/core/agent-loop-standalone.d.ts.map +1 -1
- package/lib/core/agent-loop-standalone.js +14 -7
- package/lib/core/agent-loop-standalone.js.map +1 -1
- package/lib/event/publish-agent-stream.d.ts +2 -2
- package/lib/event/publish-agent-stream.d.ts.map +1 -1
- package/lib/event/publish-agent-stream.js +2 -2
- package/lib/event/publish-agent-stream.js.map +1 -1
- package/lib/event/turn-event.d.ts +9 -1
- package/lib/event/turn-event.d.ts.map +1 -1
- package/lib/event/turn-event.js +3 -1
- package/lib/event/turn-event.js.map +1 -1
- package/lib/event/turn-to-agent-stream.d.ts +2 -1
- package/lib/event/turn-to-agent-stream.d.ts.map +1 -1
- package/lib/event/turn-to-agent-stream.js +29 -15
- package/lib/event/turn-to-agent-stream.js.map +1 -1
- package/lib/index.d.ts +4 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -1
- package/lib/index.js.map +1 -1
- package/lib/init/output-renderer.d.ts +3 -3
- package/lib/init/output-renderer.d.ts.map +1 -1
- package/lib/init/output-renderer.js +1 -1
- package/lib/init/output-renderer.js.map +1 -1
- package/lib/init.d.ts +0 -1
- package/lib/init.d.ts.map +1 -1
- package/lib/init.js +0 -3
- package/lib/init.js.map +1 -1
- package/lib/internal/agent-host.d.ts +3 -0
- package/lib/internal/agent-host.d.ts.map +1 -1
- package/lib/internal/host-types.d.ts +1 -0
- package/lib/internal/host-types.d.ts.map +1 -1
- package/lib/media/inbound-refs.d.ts +9 -0
- package/lib/media/inbound-refs.d.ts.map +1 -0
- package/lib/media/inbound-refs.js +18 -0
- package/lib/media/inbound-refs.js.map +1 -0
- package/lib/media/index.d.ts +1 -0
- package/lib/media/index.d.ts.map +1 -1
- package/lib/media/index.js +1 -0
- package/lib/media/index.js.map +1 -1
- package/lib/media/media-normalize.d.ts +15 -4
- package/lib/media/media-normalize.d.ts.map +1 -1
- package/lib/media/media-normalize.js +92 -88
- package/lib/media/media-normalize.js.map +1 -1
- package/lib/media/media-publisher.d.ts +3 -3
- package/lib/media/media-publisher.d.ts.map +1 -1
- package/lib/media/media-publisher.js +25 -27
- package/lib/media/media-publisher.js.map +1 -1
- package/lib/media/media-router.d.ts +5 -3
- package/lib/media/media-router.d.ts.map +1 -1
- package/lib/media/media-router.js +14 -5
- package/lib/media/media-router.js.map +1 -1
- package/lib/media/media-types.d.ts +8 -2
- package/lib/media/media-types.d.ts.map +1 -1
- package/lib/media/media-types.js.map +1 -1
- package/lib/media/subagent-inbound.d.ts +5 -4
- package/lib/media/subagent-inbound.d.ts.map +1 -1
- package/lib/media/subagent-inbound.js +10 -5
- package/lib/media/subagent-inbound.js.map +1 -1
- package/lib/orchestrator/bootstrap-executors.d.ts.map +1 -1
- package/lib/orchestrator/bootstrap-executors.js +5 -5
- package/lib/orchestrator/bootstrap-executors.js.map +1 -1
- package/lib/routing/match-rules.d.ts +4 -0
- package/lib/routing/match-rules.d.ts.map +1 -0
- package/lib/routing/match-rules.js +29 -0
- package/lib/routing/match-rules.js.map +1 -0
- package/lib/routing/route-matcher.d.ts +1 -2
- package/lib/routing/route-matcher.d.ts.map +1 -1
- package/lib/routing/route-matcher.js +2 -58
- package/lib/routing/route-matcher.js.map +1 -1
- package/lib/service.d.ts +4 -3
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js.map +1 -1
- package/lib/session/resolve-session-interaction-port.d.ts +2 -2
- package/lib/session/resolve-session-interaction-port.d.ts.map +1 -1
- package/lib/session/resolve-session-interaction-port.js +5 -1
- package/lib/session/resolve-session-interaction-port.js.map +1 -1
- package/lib/session/session-interaction-port.d.ts +7 -2
- package/lib/session/session-interaction-port.d.ts.map +1 -1
- package/lib/session/session-interaction-port.js +3 -1
- package/lib/session/session-interaction-port.js.map +1 -1
- package/lib/subagent/subagent-runtime.d.ts +4 -3
- package/lib/subagent/subagent-runtime.d.ts.map +1 -1
- package/lib/subagent/subagent-runtime.js +8 -2
- package/lib/subagent/subagent-runtime.js.map +1 -1
- package/lib/tool/tool-approval-gate.d.ts +9 -4
- package/lib/tool/tool-approval-gate.d.ts.map +1 -1
- package/lib/tool/tool-approval-gate.js +19 -8
- package/lib/tool/tool-approval-gate.js.map +1 -1
- package/lib/turn/agent-turn-context.d.ts +13 -0
- package/lib/turn/agent-turn-context.d.ts.map +1 -0
- package/lib/turn/agent-turn-context.js +13 -0
- package/lib/turn/agent-turn-context.js.map +1 -0
- package/lib/turn/inbound-media.d.ts +26 -0
- package/lib/turn/inbound-media.d.ts.map +1 -0
- package/lib/turn/inbound-media.js +128 -0
- package/lib/turn/inbound-media.js.map +1 -0
- package/lib/turn/inbound-queue-runtime.d.ts +1 -0
- package/lib/turn/inbound-queue-runtime.d.ts.map +1 -1
- package/lib/turn/inbound-queue-runtime.js +1 -0
- package/lib/turn/inbound-queue-runtime.js.map +1 -1
- package/lib/turn/inbound-turn-queue.d.ts +5 -0
- package/lib/turn/inbound-turn-queue.d.ts.map +1 -1
- package/lib/turn/inbound-turn-queue.js +46 -1
- package/lib/turn/inbound-turn-queue.js.map +1 -1
- package/lib/turn/index.d.ts +4 -5
- package/lib/turn/index.d.ts.map +1 -1
- package/lib/turn/index.js +4 -5
- package/lib/turn/index.js.map +1 -1
- package/lib/turn/process-stream.d.ts.map +1 -1
- package/lib/turn/process-stream.js +21 -13
- package/lib/turn/process-stream.js.map +1 -1
- package/lib/turn/prompt-api.d.ts +2 -2
- package/lib/turn/prompt-api.d.ts.map +1 -1
- package/lib/turn/prompt-api.js +1 -1
- package/lib/turn/prompt-api.js.map +1 -1
- package/lib/turn/prompt-controller.d.ts +7 -0
- package/lib/turn/prompt-controller.d.ts.map +1 -1
- package/lib/turn/prompt-controller.js +52 -7
- package/lib/turn/prompt-controller.js.map +1 -1
- package/lib/turn/prompt-input.d.ts +2 -2
- package/lib/turn/prompt-input.d.ts.map +1 -1
- package/lib/turn/prompt-input.js +2 -2
- package/lib/turn/prompt-input.js.map +1 -1
- package/lib/turn/turn-context-bridge.d.ts +6 -1
- package/lib/turn/turn-context-bridge.d.ts.map +1 -1
- package/lib/turn/turn-context-bridge.js +8 -5
- package/lib/turn/turn-context-bridge.js.map +1 -1
- package/lib/turn/turn-pipeline.d.ts +8 -2
- package/lib/turn/turn-pipeline.d.ts.map +1 -1
- package/lib/turn/turn-pipeline.js +13 -101
- package/lib/turn/turn-pipeline.js.map +1 -1
- package/lib/turn/turn-terminal.d.ts +14 -0
- package/lib/turn/turn-terminal.d.ts.map +1 -0
- package/lib/turn/turn-terminal.js +44 -0
- package/lib/turn/turn-terminal.js.map +1 -0
- package/lib/zhin-agent/index.d.ts +30 -5
- package/lib/zhin-agent/index.d.ts.map +1 -1
- package/lib/zhin-agent/index.js +61 -9
- package/lib/zhin-agent/index.js.map +1 -1
- package/package.json +8 -8
- package/lib/collaboration/inbound-turn-enrich.d.ts +0 -25
- package/lib/collaboration/inbound-turn-enrich.d.ts.map +0 -1
- package/lib/collaboration/inbound-turn-enrich.js +0 -51
- package/lib/collaboration/inbound-turn-enrich.js.map +0 -1
- package/lib/collaboration/inbound-turn-execute.d.ts +0 -33
- package/lib/collaboration/inbound-turn-execute.d.ts.map +0 -1
- package/lib/collaboration/inbound-turn-execute.js +0 -73
- package/lib/collaboration/inbound-turn-execute.js.map +0 -1
- package/lib/collaboration/inbound-turn-outbound-stage.d.ts +0 -27
- package/lib/collaboration/inbound-turn-outbound-stage.d.ts.map +0 -1
- package/lib/collaboration/inbound-turn-outbound-stage.js +0 -74
- package/lib/collaboration/inbound-turn-outbound-stage.js.map +0 -1
- package/lib/collaboration/inbound-turn-pipeline.d.ts.map +0 -1
- package/lib/collaboration/inbound-turn-pipeline.js +0 -202
- package/lib/collaboration/inbound-turn-pipeline.js.map +0 -1
- package/lib/collaboration/inbound-turn-route.d.ts +0 -42
- package/lib/collaboration/inbound-turn-route.d.ts.map +0 -1
- package/lib/collaboration/inbound-turn-route.js +0 -107
- package/lib/collaboration/inbound-turn-route.js.map +0 -1
- package/lib/init/message-media.d.ts +0 -11
- package/lib/init/message-media.d.ts.map +0 -1
- package/lib/init/message-media.js +0 -107
- package/lib/init/message-media.js.map +0 -1
- package/lib/init/register-ai-trigger.d.ts +0 -7
- package/lib/init/register-ai-trigger.d.ts.map +0 -1
- package/lib/init/register-ai-trigger.js +0 -72
- package/lib/init/register-ai-trigger.js.map +0 -1
- package/lib/turn/multimodal-message.d.ts +0 -9
- package/lib/turn/multimodal-message.d.ts.map +0 -1
- package/lib/turn/multimodal-message.js +0 -72
- package/lib/turn/multimodal-message.js.map +0 -1
|
@@ -9,6 +9,15 @@ export class TurnSupersededError extends Error {
|
|
|
9
9
|
this.sessionKey = sessionKey;
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
|
+
/** A caller cancelled a turn explicitly (for example, an IM trigger timeout). */
|
|
13
|
+
export class TurnCancelledError extends Error {
|
|
14
|
+
sessionKey;
|
|
15
|
+
constructor(sessionKey, reason) {
|
|
16
|
+
super(`Turn cancelled on session ${sessionKey}`, reason === undefined ? undefined : { cause: reason });
|
|
17
|
+
this.name = 'TurnCancelledError';
|
|
18
|
+
this.sessionKey = sessionKey;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
12
21
|
export class PromptController {
|
|
13
22
|
steeringMode;
|
|
14
23
|
followUpMode;
|
|
@@ -61,7 +70,7 @@ export class PromptController {
|
|
|
61
70
|
for (const turn of this.activeTurns.values()) {
|
|
62
71
|
if (sessionKey && turn.sessionKey !== sessionKey)
|
|
63
72
|
continue;
|
|
64
|
-
turn.abortController.abort();
|
|
73
|
+
turn.abortController.abort(new TurnCancelledError(turn.sessionKey));
|
|
65
74
|
}
|
|
66
75
|
}
|
|
67
76
|
clearSteeringQueue(sessionKey) {
|
|
@@ -96,7 +105,11 @@ export class PromptController {
|
|
|
96
105
|
}
|
|
97
106
|
/** 同 session 串行:新 turn 开始前 abort 仍在执行的旧 turn,避免过期回复污染群上下文。 */
|
|
98
107
|
schedule(request) {
|
|
99
|
-
this.
|
|
108
|
+
for (const turn of this.activeTurns.values()) {
|
|
109
|
+
if (turn.sessionKey !== request.sessionKey)
|
|
110
|
+
continue;
|
|
111
|
+
turn.abortController.abort(new TurnSupersededError(request.sessionKey));
|
|
112
|
+
}
|
|
100
113
|
return this.runTurn(request);
|
|
101
114
|
}
|
|
102
115
|
resolveLatestTurn(sessionKey) {
|
|
@@ -136,6 +149,13 @@ export class PromptController {
|
|
|
136
149
|
const turnId = randomUUID();
|
|
137
150
|
const abortController = new AbortController();
|
|
138
151
|
const signal = abortController.signal;
|
|
152
|
+
const abortFromCaller = () => {
|
|
153
|
+
abortController.abort(request.signal?.reason ?? new TurnCancelledError(request.sessionKey));
|
|
154
|
+
};
|
|
155
|
+
if (request.signal?.aborted)
|
|
156
|
+
abortFromCaller();
|
|
157
|
+
else
|
|
158
|
+
request.signal?.addEventListener('abort', abortFromCaller, { once: true });
|
|
139
159
|
const queue = new SessionMessageQueue(this.steeringMode, this.followUpMode);
|
|
140
160
|
const activeTurn = {
|
|
141
161
|
turnId,
|
|
@@ -148,19 +168,31 @@ export class PromptController {
|
|
|
148
168
|
this.promoteLatestTurn(request.sessionKey, turnId);
|
|
149
169
|
let lastResult = null;
|
|
150
170
|
try {
|
|
171
|
+
throwIfAborted(signal, request.sessionKey);
|
|
151
172
|
await this.emitEvent({ type: 'agent_start' }, signal);
|
|
173
|
+
throwIfAborted(signal, request.sessionKey);
|
|
152
174
|
const hooks = {
|
|
153
175
|
getSteeringMessages: async () => queue.drainSteering(),
|
|
154
176
|
getFollowUpMessages: async () => queue.drainFollowUp(),
|
|
155
177
|
};
|
|
156
|
-
|
|
178
|
+
try {
|
|
179
|
+
lastResult = await request.execute(request.userMessages, hooks, signal, turnId);
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
throwIfAborted(signal, request.sessionKey);
|
|
183
|
+
throw error;
|
|
184
|
+
}
|
|
157
185
|
while (queue.hasFollowUp() && !signal.aborted) {
|
|
158
186
|
const batch = queue.drainFollowUp();
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
187
|
+
try {
|
|
188
|
+
lastResult = await request.execute(batch, hooks, signal, turnId);
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
throwIfAborted(signal, request.sessionKey);
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
163
194
|
}
|
|
195
|
+
throwIfAborted(signal, request.sessionKey);
|
|
164
196
|
await this.emitEvent({ type: 'agent_end', messages: request.userMessages }, signal);
|
|
165
197
|
if (!lastResult) {
|
|
166
198
|
throw new Error('Prompt turn produced no result');
|
|
@@ -169,6 +201,7 @@ export class PromptController {
|
|
|
169
201
|
return lastResult;
|
|
170
202
|
}
|
|
171
203
|
finally {
|
|
204
|
+
request.signal?.removeEventListener('abort', abortFromCaller);
|
|
172
205
|
this.activeTurns.delete(turnId);
|
|
173
206
|
this.demoteLatestTurn(request.sessionKey, turnId);
|
|
174
207
|
this.notifyIdle();
|
|
@@ -187,4 +220,16 @@ export class PromptController {
|
|
|
187
220
|
this.lastResult = null;
|
|
188
221
|
}
|
|
189
222
|
}
|
|
223
|
+
function throwIfAborted(signal, sessionKey) {
|
|
224
|
+
if (!signal.aborted)
|
|
225
|
+
return;
|
|
226
|
+
throw turnAbortReason(sessionKey, signal.reason);
|
|
227
|
+
}
|
|
228
|
+
function turnAbortReason(sessionKey, reason) {
|
|
229
|
+
// AbortController.abort() without a reason produces DOMException AbortError.
|
|
230
|
+
// Normalize it, but retain deliberate errors such as TriggerTimeoutError.
|
|
231
|
+
if (reason instanceof Error && reason.name !== 'AbortError')
|
|
232
|
+
return reason;
|
|
233
|
+
return new TurnCancelledError(sessionKey, reason);
|
|
234
|
+
}
|
|
190
235
|
//# sourceMappingURL=prompt-controller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-controller.js","sourceRoot":"","sources":["../../src/turn/prompt-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt-controller.js","sourceRoot":"","sources":["../../src/turn/prompt-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { type AgentMessage, type
|
|
2
|
-
export declare function normalizePromptMessages(input: string | AgentMessage | AgentMessage[],
|
|
1
|
+
import { type AgentMessage, type MediaContentBlock } from '@zhin.js/ai';
|
|
2
|
+
export declare function normalizePromptMessages(input: string | AgentMessage | AgentMessage[], media?: MediaContentBlock[]): AgentMessage[];
|
|
3
3
|
//# sourceMappingURL=prompt-input.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-input.d.ts","sourceRoot":"","sources":["../../src/turn/prompt-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"prompt-input.d.ts","sourceRoot":"","sources":["../../src/turn/prompt-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,iBAAiB,EAAqB,MAAM,aAAa,CAAC;AAC3F,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,YAAY,EAAE,EAC7C,KAAK,CAAC,EAAE,iBAAiB,EAAE,GAC1B,YAAY,EAAE,CAKhB"}
|
package/lib/turn/prompt-input.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createUserMessage } from '@zhin.js/ai';
|
|
2
|
-
export function normalizePromptMessages(input,
|
|
2
|
+
export function normalizePromptMessages(input, media) {
|
|
3
3
|
if (typeof input === 'string') {
|
|
4
|
-
return [createUserMessage(input,
|
|
4
|
+
return [createUserMessage(input, media)];
|
|
5
5
|
}
|
|
6
6
|
return Array.isArray(input) ? input : [input];
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-input.js","sourceRoot":"","sources":["../../src/turn/prompt-input.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"prompt-input.js","sourceRoot":"","sources":["../../src/turn/prompt-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC3F,MAAM,UAAU,uBAAuB,CACrC,KAA6C,EAC7C,KAA2B;IAE3B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -5,9 +5,14 @@ export interface TurnContextBridgeState {
|
|
|
5
5
|
pendingActivityFeedbackEligible?: boolean;
|
|
6
6
|
alwaysSkillsBaseline: string;
|
|
7
7
|
}
|
|
8
|
+
/** Explicit turn state used by concurrency-safe entry points. */
|
|
9
|
+
export interface TurnContextRunOptions {
|
|
10
|
+
readonly scheduleContext?: ScheduleTurnContext;
|
|
11
|
+
readonly activityFeedbackEligible?: boolean;
|
|
12
|
+
}
|
|
8
13
|
export declare function initScheduleTurnContext(state: TurnContextBridgeState, ctx: ScheduleTurnContext): void;
|
|
9
14
|
export declare function initInboundTurnContext(state: TurnContextBridgeState): void;
|
|
10
15
|
export declare function getTurnActiveSkills(state: TurnContextBridgeState): string;
|
|
11
|
-
export declare function runInTurnContext<T>(state: TurnContextBridgeState, config: Required<ZhinAgentConfig>, turnId: string, fn: () => Promise<T
|
|
16
|
+
export declare function runInTurnContext<T>(state: TurnContextBridgeState, config: Required<ZhinAgentConfig>, turnId: string, fn: () => Promise<T>, options?: TurnContextRunOptions): Promise<T>;
|
|
12
17
|
export declare function appendActiveSkills(fragment: string): void;
|
|
13
18
|
//# sourceMappingURL=turn-context-bridge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turn-context-bridge.d.ts","sourceRoot":"","sources":["../../src/turn/turn-context-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAmG,MAAM,6BAA6B,CAAC;AAExK,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,MAAM,WAAW,sBAAsB;IACrC,0BAA0B,CAAC,EAAE,mBAAmB,CAAC;IACjD,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,sBAAsB,EAAE,GAAG,EAAE,mBAAmB,GAAG,IAAI,CAGrG;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAG1E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAIzE;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,KAAK,EAAE,sBAAsB,EAC7B,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,EACjC,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"turn-context-bridge.d.ts","sourceRoot":"","sources":["../../src/turn/turn-context-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAmG,MAAM,6BAA6B,CAAC;AAExK,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,MAAM,WAAW,sBAAsB;IACrC,0BAA0B,CAAC,EAAE,mBAAmB,CAAC;IACjD,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,iEAAiE;AACjE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,mBAAmB,CAAC;IAC/C,QAAQ,CAAC,wBAAwB,CAAC,EAAE,OAAO,CAAC;CAC7C;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,sBAAsB,EAAE,GAAG,EAAE,mBAAmB,GAAG,IAAI,CAGrG;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAG1E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAIzE;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,KAAK,EAAE,sBAAsB,EAC7B,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,EACjC,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,CAAC,CAAC,CAWZ;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEzD"}
|
|
@@ -14,12 +14,15 @@ export function getTurnActiveSkills(state) {
|
|
|
14
14
|
return fromTurn;
|
|
15
15
|
return state.alwaysSkillsBaseline;
|
|
16
16
|
}
|
|
17
|
-
export function runInTurnContext(state, config, turnId, fn) {
|
|
17
|
+
export function runInTurnContext(state, config, turnId, fn, options) {
|
|
18
18
|
const tracker = new TurnTracker(config.subagentTurnWaitMs);
|
|
19
|
-
const scheduleContext = state.pendingScheduleTurnContext;
|
|
20
|
-
const activityFeedbackEligible =
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
const scheduleContext = options?.scheduleContext ?? state.pendingScheduleTurnContext;
|
|
20
|
+
const activityFeedbackEligible = options?.activityFeedbackEligible
|
|
21
|
+
?? state.pendingActivityFeedbackEligible;
|
|
22
|
+
if (options?.scheduleContext === undefined)
|
|
23
|
+
state.pendingScheduleTurnContext = undefined;
|
|
24
|
+
if (options?.activityFeedbackEligible === undefined)
|
|
25
|
+
state.pendingActivityFeedbackEligible = undefined;
|
|
23
26
|
const init = {};
|
|
24
27
|
if (scheduleContext)
|
|
25
28
|
init.scheduleContext = scheduleContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turn-context-bridge.js","sourceRoot":"","sources":["../../src/turn/turn-context-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,sBAAsB,EAAE,8BAA8B,EAAE,gBAAgB,IAAI,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACxK,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"turn-context-bridge.js","sourceRoot":"","sources":["../../src/turn/turn-context-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,sBAAsB,EAAE,8BAA8B,EAAE,gBAAgB,IAAI,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACxK,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAchD,MAAM,UAAU,uBAAuB,CAAC,KAA6B,EAAE,GAAwB;IAC7F,KAAK,CAAC,0BAA0B,GAAG,GAAG,CAAC;IACvC,KAAK,CAAC,+BAA+B,GAAG,KAAK,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAA6B;IAClE,KAAK,CAAC,+BAA+B,GAAG,IAAI,CAAC;IAC7C,KAAK,CAAC,0BAA0B,GAAG,SAAS,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAA6B;IAC/D,MAAM,QAAQ,GAAG,8BAA8B,EAAE,CAAC;IAClD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,OAAO,KAAK,CAAC,oBAAoB,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,KAA6B,EAC7B,MAAiC,EACjC,MAAc,EACd,EAAoB,EACpB,OAA+B;IAE/B,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC3D,MAAM,eAAe,GAAG,OAAO,EAAE,eAAe,IAAI,KAAK,CAAC,0BAA0B,CAAC;IACrF,MAAM,wBAAwB,GAAG,OAAO,EAAE,wBAAwB;WAC7D,KAAK,CAAC,+BAA+B,CAAC;IAC3C,IAAI,OAAO,EAAE,eAAe,KAAK,SAAS;QAAE,KAAK,CAAC,0BAA0B,GAAG,SAAS,CAAC;IACzF,IAAI,OAAO,EAAE,wBAAwB,KAAK,SAAS;QAAE,KAAK,CAAC,+BAA+B,GAAG,SAAS,CAAC;IACvG,MAAM,IAAI,GAA0H,EAAE,CAAC;IACvI,IAAI,eAAe;QAAE,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IAC5D,IAAI,wBAAwB;QAAE,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;IACnE,OAAO,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAC/F,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,sBAAsB,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type AgentRunJournal } from '@zhin.js/ai/agent-stream';
|
|
2
|
+
import { type MediaContentBlock } from '@zhin.js/ai';
|
|
2
3
|
import type { TurnEvent } from '../event/turn-event.js';
|
|
3
4
|
import type { ZhinAgentPrivate, OnChunkCallback, OutputElement, Tool } from '../internal/agent-host.js';
|
|
4
5
|
import type { Message } from '@zhin.js/core';
|
|
@@ -8,7 +9,12 @@ export interface ProcessTextTurnOptions {
|
|
|
8
9
|
deferredAutoContinue?: boolean;
|
|
9
10
|
/** Tap AgentCore.runText TurnEvent stream (processMessageStream) */
|
|
10
11
|
onTurnEvent?: (event: TurnEvent) => void;
|
|
12
|
+
/** Ordered wire-event journal owned by processTextTurnStream. */
|
|
13
|
+
journal?: AgentRunJournal;
|
|
14
|
+
/** Compatibility media supplied by ZhinAgent.processMultimodal. */
|
|
15
|
+
mediaBlocks?: readonly MediaContentBlock[];
|
|
16
|
+
/** Per-turn cancellation from an ingress owner such as the IM trigger host. */
|
|
17
|
+
signal?: AbortSignal;
|
|
11
18
|
}
|
|
12
19
|
export declare function processTextTurn(host: ZhinAgentPrivate, content: string, commMessage: Message, externalTools?: Tool[], onChunk?: OnChunkCallback, extras?: ProcessTextTurnOptions): Promise<OutputElement[]>;
|
|
13
|
-
export declare function processMultimodalTurn(host: ZhinAgentPrivate, parts: ContentPart[], commMessage: Message, onChunk?: OnChunkCallback): Promise<OutputElement[]>;
|
|
14
20
|
//# sourceMappingURL=turn-pipeline.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turn-pipeline.d.ts","sourceRoot":"","sources":["../../src/turn/turn-pipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"turn-pipeline.d.ts","sourceRoot":"","sources":["../../src/turn/turn-pipeline.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAGtF,OAAO,EAAe,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAalE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAMxD,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,IAAI,EACL,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAmB7C,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,CAAC,EAAE,OAAO,aAAa,EAAE,YAAY,EAAE,CAAC;IACxD,sDAAsD;IACtD,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,oEAAoE;IACpE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,iEAAiE;IACjE,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,mEAAmE;IACnE,WAAW,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC3C,+EAA+E;IAC/E,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,OAAO,EACpB,aAAa,GAAE,IAAI,EAAO,EAC1B,OAAO,CAAC,EAAE,eAAe,EACzB,MAAM,CAAC,EAAE,sBAAsB,GAC9B,OAAO,CAAC,aAAa,EAAE,CAAC,CA8J1B"}
|
|
@@ -2,14 +2,11 @@ import { formatCompact, getLogger } from '@zhin.js/logger';
|
|
|
2
2
|
import { AgentStreamEventType } from '@zhin.js/ai/agent-stream';
|
|
3
3
|
import { publishAgentStream } from '../event/publish-agent-stream.js';
|
|
4
4
|
import { readHttpSessionId } from '../session/resolve-session-interaction-port.js';
|
|
5
|
-
import {
|
|
6
|
-
import { providerSupportsVision } from '../media/vision-capability.js';
|
|
7
|
-
import { buildMultimodalVisionSystemPrompt } from '../prompt/assembly.js';
|
|
5
|
+
import { parseOutput } from '@zhin.js/ai';
|
|
8
6
|
import { TurnSupersededError } from './prompt-controller.js';
|
|
9
|
-
import {
|
|
7
|
+
import { applyInboundMediaInjection, resolveInboundMediaInjection, } from './inbound-media.js';
|
|
10
8
|
import { EMPTY_USAGE } from './turn-metrics.js';
|
|
11
9
|
import { logPhase } from '../internal/phase-trace.js';
|
|
12
|
-
import { DEFAULT_MULTIMODAL_CONFIG } from '../media/media-types.js';
|
|
13
10
|
import { prepareTurnTools } from '../tool/prepare-turn-tools.js';
|
|
14
11
|
import { defaultAgentCore } from '../core/agent-core.js';
|
|
15
12
|
import { buildTextTurnOutbound, finalizeTurnAfterAgentLoop, handleTurnSuperseded, } from './turn-complete.js';
|
|
@@ -89,6 +86,13 @@ export async function processTextTurn(host, content, commMessage, externalTools
|
|
|
89
86
|
tool_search: true,
|
|
90
87
|
names: resolvedTools.map(t => t.name).join(',') || '(none)',
|
|
91
88
|
}));
|
|
89
|
+
const resolvedInboundMedia = await resolveInboundMediaInjection(commMessage);
|
|
90
|
+
const inboundMedia = extras?.mediaBlocks?.length
|
|
91
|
+
? {
|
|
92
|
+
blocks: [...resolvedInboundMedia.blocks, ...extras.mediaBlocks],
|
|
93
|
+
textAppends: resolvedInboundMedia.textAppends,
|
|
94
|
+
}
|
|
95
|
+
: resolvedInboundMedia;
|
|
92
96
|
const turnCtx = await requireContextSystem(host).buildTextTurnContext({
|
|
93
97
|
host,
|
|
94
98
|
commMessage,
|
|
@@ -96,7 +100,9 @@ export async function processTextTurn(host, content, commMessage, externalTools
|
|
|
96
100
|
turnUser,
|
|
97
101
|
deferredStats,
|
|
98
102
|
prebuiltMessages: extras?.prebuiltMessages,
|
|
103
|
+
mode: inboundMedia.blocks.length > 0 ? 'vision' : undefined,
|
|
99
104
|
});
|
|
105
|
+
turnCtx.userMessages = applyInboundMediaInjection(turnCtx.userMessages, inboundMedia);
|
|
100
106
|
const { userMessages, personaEnhanced: personaForChat, modelCandidates: chatCandidates, modelId, } = turnCtx;
|
|
101
107
|
logPhase(host.phaseConfig, 'path.agent_loop', sessionId, {
|
|
102
108
|
toolCount: resolvedTools.length,
|
|
@@ -109,6 +115,7 @@ export async function processTextTurn(host, content, commMessage, externalTools
|
|
|
109
115
|
userMessages,
|
|
110
116
|
commMessage,
|
|
111
117
|
onChunk,
|
|
118
|
+
signal: extras?.signal,
|
|
112
119
|
execute: (initialMessages, hooks, signal, _turnId) => (host.agentCore ?? defaultAgentCore).runTextTurn({
|
|
113
120
|
host,
|
|
114
121
|
sessionId,
|
|
@@ -127,6 +134,7 @@ export async function processTextTurn(host, content, commMessage, externalTools
|
|
|
127
134
|
signal,
|
|
128
135
|
deferredStats,
|
|
129
136
|
onTurnEvent: extras?.onTurnEvent,
|
|
137
|
+
journal: extras?.journal,
|
|
130
138
|
}),
|
|
131
139
|
});
|
|
132
140
|
}
|
|
@@ -152,100 +160,4 @@ export async function processTextTurn(host, content, commMessage, externalTools
|
|
|
152
160
|
});
|
|
153
161
|
return buildTextTurnOutbound(reply, loopResult);
|
|
154
162
|
}
|
|
155
|
-
export async function processMultimodalTurn(host, parts, commMessage, onChunk) {
|
|
156
|
-
const sessionSystem = requireSessionSystem(host);
|
|
157
|
-
const textContent = summarizeMultimodalParts(parts, providerSupportsVision(host.getTurnProvider()));
|
|
158
|
-
const prep = await sessionSystem.prepareTextTurn(host, commMessage, textContent);
|
|
159
|
-
const { sessionKey, userId, sessionId, isNewSession, turnUser } = prep;
|
|
160
|
-
await host.emitter.dispatch('ai.processing.start', host.emitter.createPayload(sessionId, commMessage, 'multimodal'));
|
|
161
|
-
const rateCheck = host.rateLimiter.check(userId);
|
|
162
|
-
if (!rateCheck.allowed) {
|
|
163
|
-
await host.emitter.dispatch('ai.processing.finish', host.emitter.createPayload(sessionId, commMessage, 'multimodal', {
|
|
164
|
-
path: 'rate_limited',
|
|
165
|
-
reply: rateCheck.message || '请稍后再试',
|
|
166
|
-
reason: 'rate_limited',
|
|
167
|
-
}));
|
|
168
|
-
await host.finalizeActiveTurn({ usage: EMPTY_USAGE, path: 'rate_limited' });
|
|
169
|
-
return parseOutput(rateCheck.message || '请稍后再试');
|
|
170
|
-
}
|
|
171
|
-
host.emitter.emit('ai.typing.start', host.emitter.createPayload(sessionId, commMessage, 'multimodal', {
|
|
172
|
-
reason: 'processing',
|
|
173
|
-
}));
|
|
174
|
-
host.beginActiveTurn();
|
|
175
|
-
const supportsVision = providerSupportsVision(host.getTurnProvider());
|
|
176
|
-
const personaForVision = host.buildDisciplinedPrompt(host.config.persona);
|
|
177
|
-
const visionSystemPrompt = await buildMultimodalVisionSystemPrompt(host, {
|
|
178
|
-
commMessage,
|
|
179
|
-
sessionId,
|
|
180
|
-
textContent,
|
|
181
|
-
personaEnhanced: personaForVision,
|
|
182
|
-
});
|
|
183
|
-
const turnCtx = await requireContextSystem(host).buildTextTurnContext({
|
|
184
|
-
host,
|
|
185
|
-
commMessage,
|
|
186
|
-
content: textContent,
|
|
187
|
-
turnUser,
|
|
188
|
-
mode: 'vision',
|
|
189
|
-
});
|
|
190
|
-
const { modelCandidates: visionCandidates } = turnCtx;
|
|
191
|
-
logPhase(host.phaseConfig, 'path.agent_loop', sessionId, { mode: 'multimodal' });
|
|
192
|
-
const firstPrompt = turnUser.promptMessages[0];
|
|
193
|
-
const userMessage = await buildVisionUserMessage(firstPrompt ? userMessagePlainText(firstPrompt) : textContent, parts, supportsVision, DEFAULT_MULTIMODAL_CONFIG.maxFileBytes);
|
|
194
|
-
const { userMessages } = await requireContextSystem(host).buildTextTurnContext({
|
|
195
|
-
host,
|
|
196
|
-
commMessage,
|
|
197
|
-
content: textContent,
|
|
198
|
-
turnUser,
|
|
199
|
-
mode: 'vision',
|
|
200
|
-
prebuiltMessages: [userMessage],
|
|
201
|
-
});
|
|
202
|
-
let loopResult;
|
|
203
|
-
try {
|
|
204
|
-
loopResult = await host.promptController.schedule({
|
|
205
|
-
sessionKey,
|
|
206
|
-
sessionId,
|
|
207
|
-
userMessages,
|
|
208
|
-
commMessage,
|
|
209
|
-
onChunk,
|
|
210
|
-
execute: (initialMessages, hooks, signal, _turnId) => (host.agentCore ?? defaultAgentCore).runVisionTurn({
|
|
211
|
-
host,
|
|
212
|
-
sessionId,
|
|
213
|
-
commMessage,
|
|
214
|
-
visionSystemPrompt,
|
|
215
|
-
userMessages: initialMessages,
|
|
216
|
-
modelCandidates: visionCandidates,
|
|
217
|
-
onChunk,
|
|
218
|
-
promptHooks: hooks,
|
|
219
|
-
signal,
|
|
220
|
-
}),
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
catch (err) {
|
|
224
|
-
if (err instanceof TurnSupersededError) {
|
|
225
|
-
return handleTurnSuperseded(host, sessionId, commMessage, 'multimodal', err);
|
|
226
|
-
}
|
|
227
|
-
loopResult = {
|
|
228
|
-
reply: '抱歉,我无法理解这条消息。',
|
|
229
|
-
usage: EMPTY_USAGE,
|
|
230
|
-
path: 'multimodal',
|
|
231
|
-
iterations: 0,
|
|
232
|
-
model: visionCandidates[0] || '',
|
|
233
|
-
toolCalls: [],
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
const reply = loopResult.reply;
|
|
237
|
-
await finalizeTurnAfterAgentLoop({
|
|
238
|
-
host,
|
|
239
|
-
sessionSystem,
|
|
240
|
-
sessionId,
|
|
241
|
-
commMessage,
|
|
242
|
-
mode: 'multimodal',
|
|
243
|
-
loopResult,
|
|
244
|
-
isNewSession,
|
|
245
|
-
rawContent: turnUser.rawContent,
|
|
246
|
-
reply,
|
|
247
|
-
finishPath: 'multimodal',
|
|
248
|
-
});
|
|
249
|
-
return parseOutput(reply);
|
|
250
|
-
}
|
|
251
163
|
//# sourceMappingURL=turn-pipeline.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turn-pipeline.js","sourceRoot":"","sources":["../../src/turn/turn-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"turn-pipeline.js","sourceRoot":"","sources":["../../src/turn/turn-pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type TurnCancelledEvent, type TurnEvent, type TurnTerminalEvent } from '../event/turn-event.js';
|
|
2
|
+
/**
|
|
3
|
+
* Enforces the public invariant that one turn has one and only one terminal
|
|
4
|
+
* event. Late chunks or a duplicate terminal from a cancelled worker are not
|
|
5
|
+
* observable after the first terminal has been accepted.
|
|
6
|
+
*/
|
|
7
|
+
export declare class TurnTerminalGate {
|
|
8
|
+
#private;
|
|
9
|
+
accept(event: TurnEvent): boolean;
|
|
10
|
+
get terminal(): TurnTerminalEvent | undefined;
|
|
11
|
+
}
|
|
12
|
+
export declare function turnCancelledEvent(error: unknown): TurnCancelledEvent;
|
|
13
|
+
export declare function isTurnCancellation(error: unknown): boolean;
|
|
14
|
+
//# sourceMappingURL=turn-terminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-terminal.d.ts","sourceRoot":"","sources":["../../src/turn/turn-terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,kBAAkB,EAAE,KAAK,SAAS,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE9H;;;;GAIG;AACH,qBAAa,gBAAgB;;IAG3B,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO;IAMjC,IAAI,QAAQ,IAAI,iBAAiB,GAAG,SAAS,CAE5C;CACF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CAarE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQ1D"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { isTurnTerminalEvent } from '../event/turn-event.js';
|
|
2
|
+
/**
|
|
3
|
+
* Enforces the public invariant that one turn has one and only one terminal
|
|
4
|
+
* event. Late chunks or a duplicate terminal from a cancelled worker are not
|
|
5
|
+
* observable after the first terminal has been accepted.
|
|
6
|
+
*/
|
|
7
|
+
export class TurnTerminalGate {
|
|
8
|
+
#terminal;
|
|
9
|
+
accept(event) {
|
|
10
|
+
if (this.#terminal)
|
|
11
|
+
return false;
|
|
12
|
+
if (isTurnTerminalEvent(event))
|
|
13
|
+
this.#terminal = event;
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
get terminal() {
|
|
17
|
+
return this.#terminal;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function turnCancelledEvent(error) {
|
|
21
|
+
const name = error instanceof Error ? error.name : '';
|
|
22
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
23
|
+
if (name === 'TurnSupersededError') {
|
|
24
|
+
return { type: 'turn_cancelled', code: 'superseded', reason };
|
|
25
|
+
}
|
|
26
|
+
if (name === 'TriggerTimeoutError' || name === 'InboundTurnExpiredError') {
|
|
27
|
+
return { type: 'turn_cancelled', code: 'timeout', reason };
|
|
28
|
+
}
|
|
29
|
+
if (name === 'InboundTurnQueueDisposedError' || reason === 'InboundTurnQueue disposed') {
|
|
30
|
+
return { type: 'turn_cancelled', code: 'disposed', reason };
|
|
31
|
+
}
|
|
32
|
+
return { type: 'turn_cancelled', code: 'cancelled', reason };
|
|
33
|
+
}
|
|
34
|
+
export function isTurnCancellation(error) {
|
|
35
|
+
if (!(error instanceof Error))
|
|
36
|
+
return false;
|
|
37
|
+
return error.name === 'TurnCancelledError'
|
|
38
|
+
|| error.name === 'TurnSupersededError'
|
|
39
|
+
|| error.name === 'InboundTurnCancelledError'
|
|
40
|
+
|| error.name === 'InboundTurnExpiredError'
|
|
41
|
+
|| error.name === 'TriggerTimeoutError'
|
|
42
|
+
|| error.name === 'AbortError';
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=turn-terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-terminal.js","sourceRoot":"","sources":["../../src/turn/turn-terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAmE,MAAM,wBAAwB,CAAC;AAE9H;;;;GAIG;AACH,MAAM,OAAO,gBAAgB;IAC3B,SAAS,CAAgC;IAEzC,MAAM,CAAC,KAAgB;QACrB,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QACjC,IAAI,mBAAmB,CAAC,KAAK,CAAC;YAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,MAAM,IAAI,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtE,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;IAChE,CAAC;IACD,IAAI,IAAI,KAAK,qBAAqB,IAAI,IAAI,KAAK,yBAAyB,EAAE,CAAC;QACzE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAC7D,CAAC;IACD,IAAI,IAAI,KAAK,+BAA+B,IAAI,MAAM,KAAK,2BAA2B,EAAE,CAAC;QACvF,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAC9D,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,KAAK,CAAC,IAAI,KAAK,oBAAoB;WACrC,KAAK,CAAC,IAAI,KAAK,qBAAqB;WACpC,KAAK,CAAC,IAAI,KAAK,2BAA2B;WAC1C,KAAK,CAAC,IAAI,KAAK,yBAAyB;WACxC,KAAK,CAAC,IAAI,KAAK,qBAAqB;WACpC,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC;AACnC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type AIProvider, type AgentTool, type AgentMessage, type ContentPart, type
|
|
1
|
+
import { type AIProvider, type AgentTool, type AgentMessage, type ContentPart, type MediaContentBlock, type AgentEvent, type OutputElement, type ImTranscriptStore, type ImTranscriptWriteInput } from '@zhin.js/ai';
|
|
2
2
|
import type { Tool, Message } from '../orchestrator/types.js';
|
|
3
3
|
import type { SkillRegistry } from '../orchestrator/skill-registry.js';
|
|
4
4
|
import type { SkillSystem } from '../skill/skill-system.js';
|
|
@@ -20,20 +20,35 @@ import type { CollaborationScene } from '../collaboration/types.js';
|
|
|
20
20
|
import { type ScheduleTurnContext } from '../internal/turn-context.js';
|
|
21
21
|
import type { ResolvedAgentBinding } from '../config/types.js';
|
|
22
22
|
import type { DeferredWorkerResult } from '../deferred-worker-runner.js';
|
|
23
|
+
import { type AgentTurnConfiguration } from '../turn/agent-turn-context.js';
|
|
24
|
+
import { type TurnContextRunOptions } from '../turn/turn-context-bridge.js';
|
|
23
25
|
import type { TurnEvent } from '../event/turn-event.js';
|
|
24
26
|
import type { IAgentTurnProcessor, IAgentSessionManager, IAgentDiagnostics, IAgentConfigurator } from '../config/agent-interfaces.js';
|
|
25
27
|
export type { ZhinAgentConfig, OnChunkCallback } from '../config/index.js';
|
|
26
28
|
export type { IAgentTurnProcessor, IAgentSessionManager, IAgentDiagnostics, IAgentConfigurator, } from '../config/agent-interfaces.js';
|
|
27
29
|
export type { ZhinAgentTurnMetrics, ZhinAgentTurnPath } from '../turn/turn-metrics.js';
|
|
28
30
|
export { PromptAccessDeniedError } from '../turn/prompt-access.js';
|
|
31
|
+
export type { AgentTurnConfiguration } from '../turn/agent-turn-context.js';
|
|
29
32
|
export { formatAiHandlerCompleteLog, formatAiHandlerTurnTable, formatZhinAgentTurnUsage } from '../turn/turn-metrics.js';
|
|
30
33
|
export * from '../prompt/prompt-builder.js';
|
|
31
34
|
export * from '../prompt/templates.js';
|
|
32
35
|
export * from '../turn/task-continuation.js';
|
|
36
|
+
export interface AgentTurnRequest {
|
|
37
|
+
readonly content: string;
|
|
38
|
+
readonly message: Message;
|
|
39
|
+
readonly tools?: readonly Tool[];
|
|
40
|
+
readonly onChunk?: OnChunkCallback;
|
|
41
|
+
/** Cancels only this turn; the signal reaches queueing, model IO, and tools. */
|
|
42
|
+
readonly signal?: AbortSignal;
|
|
43
|
+
/** Enables IM activity feedback only for an actual inbound user message. */
|
|
44
|
+
readonly activityFeedbackEligible?: boolean;
|
|
45
|
+
/** Per-message routing state. Never call configure() for these values. */
|
|
46
|
+
readonly configuration?: AgentTurnConfiguration;
|
|
47
|
+
}
|
|
33
48
|
export declare class ZhinAgent implements IAgentTurnProcessor, IAgentSessionManager, IAgentDiagnostics, IAgentConfigurator {
|
|
34
49
|
private provider;
|
|
35
50
|
private providerResolver;
|
|
36
|
-
private
|
|
51
|
+
private configuredActiveBinding;
|
|
37
52
|
private config;
|
|
38
53
|
/** ideal 模块槽位;经 getter/setter 供 configure 与 asPrivate(host) 读写 */
|
|
39
54
|
private readonly runtimeModules;
|
|
@@ -46,7 +61,7 @@ export declare class ZhinAgent implements IAgentTurnProcessor, IAgentSessionMana
|
|
|
46
61
|
private userProfiles;
|
|
47
62
|
private rateLimiter;
|
|
48
63
|
private subagentSystem;
|
|
49
|
-
private
|
|
64
|
+
private configuredBootstrapContext;
|
|
50
65
|
private alwaysSkillsBaseline;
|
|
51
66
|
private skillsSummaryXML;
|
|
52
67
|
private modelRegistry;
|
|
@@ -72,6 +87,10 @@ export declare class ZhinAgent implements IAgentTurnProcessor, IAgentSessionMana
|
|
|
72
87
|
set skillSystem(value: SkillSystem | null);
|
|
73
88
|
get orchestrator(): AgentOrchestrator | null;
|
|
74
89
|
set orchestrator(value: AgentOrchestrator | null);
|
|
90
|
+
get activeBinding(): ResolvedAgentBinding | null;
|
|
91
|
+
set activeBinding(value: ResolvedAgentBinding | null);
|
|
92
|
+
get bootstrapContext(): string;
|
|
93
|
+
set bootstrapContext(value: string);
|
|
75
94
|
get agentCore(): AgentCore | null;
|
|
76
95
|
set agentCore(value: AgentCore | null);
|
|
77
96
|
get toolSystem(): ToolSystem | null;
|
|
@@ -123,7 +142,7 @@ export declare class ZhinAgent implements IAgentTurnProcessor, IAgentSessionMana
|
|
|
123
142
|
continueAfterDeferredWorker(commMessage: Message, taskId: string, goal: string, result: DeferredWorkerResult): Promise<void>;
|
|
124
143
|
continueAfterSubagent(payload: SubagentCompletePayload): Promise<void>;
|
|
125
144
|
getActiveTurnTracker(): TurnTracker | undefined;
|
|
126
|
-
runInTurnContext<T>(turnId: string, fn: () => Promise<T
|
|
145
|
+
runInTurnContext<T>(turnId: string, fn: () => Promise<T>, options?: TurnContextRunOptions): Promise<T>;
|
|
127
146
|
getSubagentSystem(): SubagentSystem | null;
|
|
128
147
|
buildParentContextSnapshotForSubagent(origin: SubagentOrigin): Promise<string | undefined>;
|
|
129
148
|
getEventEmitter(): ZhinAgentEventEmitter;
|
|
@@ -154,7 +173,7 @@ export declare class ZhinAgent implements IAgentTurnProcessor, IAgentSessionMana
|
|
|
154
173
|
steer(message: AgentMessage, commMessage: Message): void;
|
|
155
174
|
followUp(message: AgentMessage, commMessage: Message): void;
|
|
156
175
|
prompt(input: string | AgentMessage | AgentMessage[], commMessage: Message, options?: {
|
|
157
|
-
|
|
176
|
+
media?: MediaContentBlock[];
|
|
158
177
|
onChunk?: OnChunkCallback;
|
|
159
178
|
}): Promise<OutputElement[]>;
|
|
160
179
|
appendPassiveGroupChatter(_commMessage: Message, _rawContent: string): Promise<void>;
|
|
@@ -165,7 +184,13 @@ export declare class ZhinAgent implements IAgentTurnProcessor, IAgentSessionMana
|
|
|
165
184
|
}>;
|
|
166
185
|
private requireSessionSystem;
|
|
167
186
|
process(content: string, commMessage: Message, externalTools?: Tool[], onChunk?: OnChunkCallback): Promise<OutputElement[]>;
|
|
187
|
+
/**
|
|
188
|
+
* Executes one immutable, generation-owned Agent turn. This prevents two
|
|
189
|
+
* concurrent IM messages from overwriting activeBinding/bootstrapContext.
|
|
190
|
+
*/
|
|
191
|
+
processTurn(request: AgentTurnRequest): Promise<OutputElement[]>;
|
|
168
192
|
processStream(content: string, commMessage: Message, externalTools?: Tool[]): AsyncGenerator<TurnEvent, void, undefined>;
|
|
193
|
+
/** Compatibility entry: translate legacy ContentPart[] into canonical media blocks. */
|
|
169
194
|
processMultimodal(parts: ContentPart[], commMessage: Message, onChunk?: OnChunkCallback): Promise<OutputElement[]>;
|
|
170
195
|
isReady(): boolean;
|
|
171
196
|
dispose(): void;
|