@zhin.js/agent 0.1.30 → 0.1.31
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 +47 -22
- package/lib/builtin/run-deferred-task-tool.d.ts +1 -1
- package/lib/builtin/run-deferred-task-tool.d.ts.map +1 -1
- package/lib/builtin/run-deferred-task-tool.js +1 -1
- package/lib/builtin/run-deferred-task-tool.js.map +1 -1
- package/lib/config/normalize-ai-config.d.ts +4 -0
- package/lib/config/normalize-ai-config.d.ts.map +1 -1
- package/lib/config/normalize-ai-config.js +23 -6
- package/lib/config/normalize-ai-config.js.map +1 -1
- package/lib/config/provider-instance.d.ts.map +1 -1
- package/lib/config/provider-instance.js +26 -7
- package/lib/config/provider-instance.js.map +1 -1
- package/lib/config/types.d.ts +2 -1
- package/lib/config/types.d.ts.map +1 -1
- package/lib/config/types.js.map +1 -1
- package/lib/config/validate-ai-config.d.ts.map +1 -1
- package/lib/config/validate-ai-config.js +5 -0
- package/lib/config/validate-ai-config.js.map +1 -1
- package/lib/deferred-worker-runner.d.ts +2 -0
- package/lib/deferred-worker-runner.d.ts.map +1 -1
- package/lib/deferred-worker-runner.js +17 -34
- package/lib/deferred-worker-runner.js.map +1 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/init/activate-ai-database-storage.d.ts +1 -1
- package/lib/init/activate-ai-database-storage.d.ts.map +1 -1
- package/lib/init/activate-ai-database-storage.js +16 -13
- package/lib/init/activate-ai-database-storage.js.map +1 -1
- package/lib/init/create-zhin-agent.d.ts.map +1 -1
- package/lib/init/create-zhin-agent.js +17 -2
- package/lib/init/create-zhin-agent.js.map +1 -1
- package/lib/init/register-db-models.d.ts.map +1 -1
- package/lib/init/register-db-models.js +7 -8
- package/lib/init/register-db-models.js.map +1 -1
- package/lib/init/register-db-upgrade.d.ts +1 -1
- package/lib/init/register-db-upgrade.js +2 -2
- package/lib/init/register-db-upgrade.js.map +1 -1
- package/lib/init/register-management-tools.js +1 -1
- package/lib/init/register-management-tools.js.map +1 -1
- package/lib/media/subagent-user-delivery.d.ts +2 -9
- package/lib/media/subagent-user-delivery.d.ts.map +1 -1
- package/lib/media/subagent-user-delivery.js.map +1 -1
- package/lib/service.d.ts +31 -22
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +48 -19
- package/lib/service.js.map +1 -1
- package/lib/subagent-ai-events.d.ts +2 -2
- package/lib/subagent-ai-events.d.ts.map +1 -1
- package/lib/subagent-ai-events.js +17 -21
- package/lib/subagent-ai-events.js.map +1 -1
- package/lib/subagent.d.ts.map +1 -1
- package/lib/subagent.js +44 -59
- package/lib/subagent.js.map +1 -1
- package/lib/zhin-agent/agent-loop-standalone.d.ts +32 -0
- package/lib/zhin-agent/agent-loop-standalone.d.ts.map +1 -0
- package/lib/zhin-agent/agent-loop-standalone.js +144 -0
- package/lib/zhin-agent/agent-loop-standalone.js.map +1 -0
- package/lib/zhin-agent/agent-loop-turn.d.ts +51 -0
- package/lib/zhin-agent/agent-loop-turn.d.ts.map +1 -0
- package/lib/zhin-agent/agent-loop-turn.js +287 -0
- package/lib/zhin-agent/agent-loop-turn.js.map +1 -0
- package/lib/zhin-agent/builtin-tools.d.ts +3 -2
- package/lib/zhin-agent/builtin-tools.d.ts.map +1 -1
- package/lib/zhin-agent/builtin-tools.js +15 -16
- package/lib/zhin-agent/builtin-tools.js.map +1 -1
- package/lib/zhin-agent/config.d.ts +5 -2
- package/lib/zhin-agent/config.d.ts.map +1 -1
- package/lib/zhin-agent/config.js +3 -2
- package/lib/zhin-agent/config.js.map +1 -1
- package/lib/zhin-agent/deferred-delivery.d.ts +5 -0
- package/lib/zhin-agent/deferred-delivery.d.ts.map +1 -0
- package/lib/zhin-agent/deferred-delivery.js +29 -0
- package/lib/zhin-agent/deferred-delivery.js.map +1 -0
- package/lib/zhin-agent/index.d.ts +40 -8
- package/lib/zhin-agent/index.d.ts.map +1 -1
- package/lib/zhin-agent/index.js +162 -17
- package/lib/zhin-agent/index.js.map +1 -1
- package/lib/zhin-agent/model-resolver.d.ts +0 -1
- package/lib/zhin-agent/model-resolver.d.ts.map +1 -1
- package/lib/zhin-agent/model-resolver.js.map +1 -1
- package/lib/zhin-agent/multimodal-message.d.ts +9 -0
- package/lib/zhin-agent/multimodal-message.d.ts.map +1 -0
- package/lib/zhin-agent/multimodal-message.js +69 -0
- package/lib/zhin-agent/multimodal-message.js.map +1 -0
- package/lib/zhin-agent/prompt-access.d.ts +4 -0
- package/lib/zhin-agent/prompt-access.d.ts.map +1 -0
- package/lib/zhin-agent/prompt-access.js +7 -0
- package/lib/zhin-agent/prompt-access.js.map +1 -0
- package/lib/zhin-agent/prompt-controller.d.ts +53 -0
- package/lib/zhin-agent/prompt-controller.d.ts.map +1 -0
- package/lib/zhin-agent/prompt-controller.js +165 -0
- package/lib/zhin-agent/prompt-controller.js.map +1 -0
- package/lib/zhin-agent/prompt-input.d.ts +3 -0
- package/lib/zhin-agent/prompt-input.d.ts.map +1 -0
- package/lib/zhin-agent/prompt-input.js +8 -0
- package/lib/zhin-agent/prompt-input.js.map +1 -0
- package/lib/zhin-agent/session-io.d.ts +12 -7
- package/lib/zhin-agent/session-io.d.ts.map +1 -1
- package/lib/zhin-agent/session-io.js +18 -15
- package/lib/zhin-agent/session-io.js.map +1 -1
- package/lib/zhin-agent/session-message-queue.d.ts +20 -0
- package/lib/zhin-agent/session-message-queue.d.ts.map +1 -0
- package/lib/zhin-agent/session-message-queue.js +52 -0
- package/lib/zhin-agent/session-message-queue.js.map +1 -0
- package/lib/zhin-agent/tool-calls-user-format.d.ts.map +1 -1
- package/lib/zhin-agent/tool-calls-user-format.js +3 -0
- package/lib/zhin-agent/tool-calls-user-format.js.map +1 -1
- package/lib/zhin-agent/tool-orchestration.d.ts.map +1 -1
- package/lib/zhin-agent/tool-orchestration.js +35 -5
- package/lib/zhin-agent/tool-orchestration.js.map +1 -1
- package/lib/zhin-agent/tool-runtime.d.ts +2 -2
- package/lib/zhin-agent/tool-runtime.d.ts.map +1 -1
- package/lib/zhin-agent/tool-runtime.js +4 -4
- package/lib/zhin-agent/tool-runtime.js.map +1 -1
- package/lib/zhin-agent/turn-context.d.ts +9 -0
- package/lib/zhin-agent/turn-context.d.ts.map +1 -0
- package/lib/zhin-agent/turn-context.js +12 -0
- package/lib/zhin-agent/turn-context.js.map +1 -0
- package/lib/zhin-agent/turn-pipeline.d.ts +5 -1
- package/lib/zhin-agent/turn-pipeline.d.ts.map +1 -1
- package/lib/zhin-agent/turn-pipeline.js +113 -436
- package/lib/zhin-agent/turn-pipeline.js.map +1 -1
- package/lib/zhin-agent/zhin-agent-private.d.ts +11 -4
- package/lib/zhin-agent/zhin-agent-private.d.ts.map +1 -1
- package/lib/zhin-agent/zhin-agent-private.js.map +1 -1
- package/package.json +3 -3
- package/lib/zhin-agent/llm-runner.d.ts +0 -18
- package/lib/zhin-agent/llm-runner.d.ts.map +0 -1
- package/lib/zhin-agent/llm-runner.js +0 -163
- package/lib/zhin-agent/llm-runner.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-resolver.d.ts","sourceRoot":"","sources":["../../src/zhin-agent/model-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"model-resolver.d.ts","sourceRoot":"","sources":["../../src/zhin-agent/model-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,YAAY,CAC1B,cAAc,EAAE,MAAM,EAAE,EACxB,aAAa,EAAE,aAAa,GAAG,IAAI,EACnC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,mBAAmB,EAC3B,IAAI,GAAE,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAkB,EAC1D,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAER;AAED,wBAAgB,sBAAsB,CACpC,cAAc,EAAE,MAAM,EAAE,EACxB,aAAa,EAAE,aAAa,GAAG,IAAI,EACnC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,mBAAmB,EAC3B,IAAI,GAAE,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAkB,EAC1D,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,EAAE,CAqBV"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-resolver.js","sourceRoot":"","sources":["../../src/zhin-agent/model-resolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model-resolver.js","sourceRoot":"","sources":["../../src/zhin-agent/model-resolver.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,YAAY,CAC1B,cAAwB,EACxB,aAAmC,EACnC,YAAoB,EACpB,MAA2B,EAC3B,OAAoD,MAAM,EAC1D,SAAkB;IAElB,OAAO,sBAAsB,CAAC,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACzG,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,cAAwB,EACxB,aAAmC,EACnC,YAAoB,EACpB,MAA2B,EAC3B,OAAoD,MAAM,EAC1D,SAAkB;IAElB,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,IAAI,SAAS;QAAE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAClF,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QACxF,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,KAAK,MAAM,EAAE,IAAI,aAAa,CAAC,YAAY,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,QAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE1E,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ContentPart[] → agentLoop UserMessage(ADR 0009 D2:image blocks)
|
|
3
|
+
*/
|
|
4
|
+
import type { ContentPart, UserMessage } from '@zhin.js/ai';
|
|
5
|
+
/** 从 ContentPart 拼会话可见文本(含 [图片] 等占位) */
|
|
6
|
+
export declare function summarizeMultimodalParts(parts: ContentPart[], supportsVision: boolean): string;
|
|
7
|
+
/** 构建带 image blocks 的 UserMessage(vision 模型走 agentLoop) */
|
|
8
|
+
export declare function buildVisionUserMessage(sessionUserContent: string, parts: ContentPart[], supportsVision: boolean, maxFileBytes: number): Promise<UserMessage>;
|
|
9
|
+
//# sourceMappingURL=multimodal-message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multimodal-message.d.ts","sourceRoot":"","sources":["../../src/zhin-agent/multimodal-message.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,WAAW,EAAgB,WAAW,EAAE,MAAM,aAAa,CAAC;AA0B1E,wCAAwC;AACxC,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,WAAW,EAAE,EACpB,cAAc,EAAE,OAAO,GACtB,MAAM,CAsBR;AAED,2DAA2D;AAC3D,wBAAsB,sBAAsB,CAC1C,kBAAkB,EAAE,MAAM,EAC1B,KAAK,EAAE,WAAW,EAAE,EACpB,cAAc,EAAE,OAAO,EACvB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,WAAW,CAAC,CAyBtB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { createUserMessage } from '@zhin.js/ai';
|
|
2
|
+
import { normalizeContentPartsToPayloads } from '../media/media-normalize.js';
|
|
3
|
+
function parseDataUri(dataUri) {
|
|
4
|
+
const m = /^data:([^;]+);base64,(.+)$/i.exec(dataUri.trim());
|
|
5
|
+
if (!m)
|
|
6
|
+
return null;
|
|
7
|
+
return { mime: m[1], base64: m[2] };
|
|
8
|
+
}
|
|
9
|
+
function imageUrlToContent(url) {
|
|
10
|
+
const parsed = parseDataUri(url);
|
|
11
|
+
if (parsed) {
|
|
12
|
+
return { type: 'image', data: parsed.base64, mimeType: parsed.mime };
|
|
13
|
+
}
|
|
14
|
+
if (url.startsWith('http://') || url.startsWith('https://')) {
|
|
15
|
+
return { type: 'image', data: url, mimeType: 'image/jpeg' };
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
/** 从 ContentPart 拼会话可见文本(含 [图片] 等占位) */
|
|
20
|
+
export function summarizeMultimodalParts(parts, supportsVision) {
|
|
21
|
+
const fragments = [];
|
|
22
|
+
for (const p of parts) {
|
|
23
|
+
switch (p.type) {
|
|
24
|
+
case 'text':
|
|
25
|
+
fragments.push(p.text);
|
|
26
|
+
break;
|
|
27
|
+
case 'image_url':
|
|
28
|
+
fragments.push('[图片]');
|
|
29
|
+
break;
|
|
30
|
+
case 'video_url':
|
|
31
|
+
fragments.push('[视频]');
|
|
32
|
+
break;
|
|
33
|
+
case 'audio':
|
|
34
|
+
fragments.push('[音频]');
|
|
35
|
+
break;
|
|
36
|
+
case 'face':
|
|
37
|
+
fragments.push(p.face.text || `[表情:${p.face.id}]`);
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return fragments.join(' ') || '[多模态消息]';
|
|
42
|
+
}
|
|
43
|
+
/** 构建带 image blocks 的 UserMessage(vision 模型走 agentLoop) */
|
|
44
|
+
export async function buildVisionUserMessage(sessionUserContent, parts, supportsVision, maxFileBytes) {
|
|
45
|
+
const images = [];
|
|
46
|
+
if (supportsVision) {
|
|
47
|
+
const payloads = await normalizeContentPartsToPayloads(parts, maxFileBytes);
|
|
48
|
+
for (const payload of payloads) {
|
|
49
|
+
if (payload.kind === 'image') {
|
|
50
|
+
images.push({
|
|
51
|
+
type: 'image',
|
|
52
|
+
data: payload.base64,
|
|
53
|
+
mimeType: payload.mimeType,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (images.length === 0) {
|
|
58
|
+
for (const p of parts) {
|
|
59
|
+
if (p.type !== 'image_url')
|
|
60
|
+
continue;
|
|
61
|
+
const block = imageUrlToContent(p.image_url.url);
|
|
62
|
+
if (block)
|
|
63
|
+
images.push(block);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return createUserMessage(sessionUserContent, images.length > 0 ? images : undefined);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=multimodal-message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multimodal-message.js","sourceRoot":"","sources":["../../src/zhin-agent/multimodal-message.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-access.d.ts","sourceRoot":"","sources":["../../src/zhin-agent/prompt-access.ts"],"names":[],"mappings":"AAAA,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,OAAO,EAAE,MAAM;CAI5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-access.js","sourceRoot":"","sources":["../../src/zhin-agent/prompt-access.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { AgentEvent, AgentMessage, QueueMode } from '@zhin.js/ai';
|
|
2
|
+
import type { ToolContext } from '../orchestrator/types.js';
|
|
3
|
+
import type { OnChunkCallback } from './config.js';
|
|
4
|
+
import type { AgentLoopTurnResult } from './agent-loop-turn.js';
|
|
5
|
+
export interface PromptTurnHooks {
|
|
6
|
+
getSteeringMessages: () => Promise<AgentMessage[]>;
|
|
7
|
+
getFollowUpMessages: () => Promise<AgentMessage[]>;
|
|
8
|
+
}
|
|
9
|
+
export interface PromptTurnRequest {
|
|
10
|
+
sessionKey: string;
|
|
11
|
+
sessionId: string;
|
|
12
|
+
userMessages: AgentMessage[];
|
|
13
|
+
context: ToolContext;
|
|
14
|
+
onChunk?: OnChunkCallback;
|
|
15
|
+
execute: (initialMessages: AgentMessage[], hooks: PromptTurnHooks, signal: AbortSignal, turnId: string) => Promise<AgentLoopTurnResult>;
|
|
16
|
+
}
|
|
17
|
+
type PromptSubscriber = (event: AgentEvent, signal: AbortSignal) => void | Promise<void>;
|
|
18
|
+
export declare class PromptController {
|
|
19
|
+
private readonly steeringMode;
|
|
20
|
+
private readonly followUpMode;
|
|
21
|
+
private readonly subscribers;
|
|
22
|
+
private readonly activeTurns;
|
|
23
|
+
private readonly latestTurnBySession;
|
|
24
|
+
private idleWaiters;
|
|
25
|
+
private lastResult;
|
|
26
|
+
constructor(steeringMode: QueueMode, followUpMode: QueueMode);
|
|
27
|
+
isIdle(): boolean;
|
|
28
|
+
isBusy(): boolean;
|
|
29
|
+
getActiveTurnCount(): number;
|
|
30
|
+
getActiveSessionKey(): string | null;
|
|
31
|
+
getActiveContext(): ToolContext | null;
|
|
32
|
+
getLastResult(): AgentLoopTurnResult | null;
|
|
33
|
+
subscribe(listener: PromptSubscriber): () => void;
|
|
34
|
+
waitForIdle(): Promise<void>;
|
|
35
|
+
/** Abort all active turns (optionally scoped to one session). */
|
|
36
|
+
abort(sessionKey?: string): void;
|
|
37
|
+
clearSteeringQueue(sessionKey?: string): void;
|
|
38
|
+
clearFollowUpQueue(sessionKey?: string): void;
|
|
39
|
+
/** Master-only: inject into the latest active turn on this session. */
|
|
40
|
+
steer(sessionKey: string, message: AgentMessage | AgentMessage[]): void;
|
|
41
|
+
/** Master-only: queue continuation on the latest active turn. */
|
|
42
|
+
followUp(sessionKey: string, message: AgentMessage | AgentMessage[]): void;
|
|
43
|
+
/** Parallel scheduling: each inbound message spawns an independent turn. */
|
|
44
|
+
schedule(request: PromptTurnRequest): Promise<AgentLoopTurnResult>;
|
|
45
|
+
private resolveLatestTurn;
|
|
46
|
+
private notifyIdle;
|
|
47
|
+
private emitEvent;
|
|
48
|
+
private promoteLatestTurn;
|
|
49
|
+
private demoteLatestTurn;
|
|
50
|
+
private runTurn;
|
|
51
|
+
}
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=prompt-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-controller.d.ts","sourceRoot":"","sources":["../../src/zhin-agent/prompt-controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAGhE,MAAM,WAAW,eAAe;IAC9B,mBAAmB,EAAE,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACnD,mBAAmB,EAAE,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,CACP,eAAe,EAAE,YAAY,EAAE,EAC/B,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACnC;AAED,KAAK,gBAAgB,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAUzF,qBAAa,gBAAgB;IAQzB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAR/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA+B;IAC3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiC;IAC7D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA6B;IACjE,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,UAAU,CAAoC;gBAGnC,YAAY,EAAE,SAAS,EACvB,YAAY,EAAE,SAAS;IAG1C,MAAM,IAAI,OAAO;IAIjB,MAAM,IAAI,OAAO;IAIjB,kBAAkB,IAAI,MAAM;IAI5B,mBAAmB,IAAI,MAAM,GAAG,IAAI;IAKpC,gBAAgB,IAAI,WAAW,GAAG,IAAI;IAMtC,aAAa,IAAI,mBAAmB,GAAG,IAAI;IAI3C,SAAS,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,IAAI;IAO3C,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAOlC,iEAAiE;IACjE,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAOhC,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAO7C,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAO7C,uEAAuE;IACvE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,YAAY,EAAE,GAAG,IAAI;IAQvE,iEAAiE;IACjE,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,YAAY,EAAE,GAAG,IAAI;IAQ1E,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAIlE,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,UAAU;YAQJ,SAAS;IAMvB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,gBAAgB;YAWV,OAAO;CA+CtB"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { SessionMessageQueue } from './session-message-queue.js';
|
|
3
|
+
export class PromptController {
|
|
4
|
+
steeringMode;
|
|
5
|
+
followUpMode;
|
|
6
|
+
subscribers = new Set();
|
|
7
|
+
activeTurns = new Map();
|
|
8
|
+
latestTurnBySession = new Map();
|
|
9
|
+
idleWaiters = [];
|
|
10
|
+
lastResult = null;
|
|
11
|
+
constructor(steeringMode, followUpMode) {
|
|
12
|
+
this.steeringMode = steeringMode;
|
|
13
|
+
this.followUpMode = followUpMode;
|
|
14
|
+
}
|
|
15
|
+
isIdle() {
|
|
16
|
+
return this.activeTurns.size === 0;
|
|
17
|
+
}
|
|
18
|
+
isBusy() {
|
|
19
|
+
return this.activeTurns.size > 0;
|
|
20
|
+
}
|
|
21
|
+
getActiveTurnCount() {
|
|
22
|
+
return this.activeTurns.size;
|
|
23
|
+
}
|
|
24
|
+
getActiveSessionKey() {
|
|
25
|
+
const latest = [...this.latestTurnBySession.entries()].at(-1);
|
|
26
|
+
return latest?.[0] ?? null;
|
|
27
|
+
}
|
|
28
|
+
getActiveContext() {
|
|
29
|
+
const turnId = [...this.latestTurnBySession.values()].at(-1);
|
|
30
|
+
if (!turnId)
|
|
31
|
+
return null;
|
|
32
|
+
return this.activeTurns.get(turnId)?.context ?? null;
|
|
33
|
+
}
|
|
34
|
+
getLastResult() {
|
|
35
|
+
return this.lastResult;
|
|
36
|
+
}
|
|
37
|
+
subscribe(listener) {
|
|
38
|
+
this.subscribers.add(listener);
|
|
39
|
+
return () => {
|
|
40
|
+
this.subscribers.delete(listener);
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async waitForIdle() {
|
|
44
|
+
if (this.isIdle())
|
|
45
|
+
return;
|
|
46
|
+
await new Promise((resolve) => {
|
|
47
|
+
this.idleWaiters.push(resolve);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/** Abort all active turns (optionally scoped to one session). */
|
|
51
|
+
abort(sessionKey) {
|
|
52
|
+
for (const turn of this.activeTurns.values()) {
|
|
53
|
+
if (sessionKey && turn.sessionKey !== sessionKey)
|
|
54
|
+
continue;
|
|
55
|
+
turn.abortController.abort();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
clearSteeringQueue(sessionKey) {
|
|
59
|
+
for (const turn of this.activeTurns.values()) {
|
|
60
|
+
if (sessionKey && turn.sessionKey !== sessionKey)
|
|
61
|
+
continue;
|
|
62
|
+
turn.queue.clearSteering();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
clearFollowUpQueue(sessionKey) {
|
|
66
|
+
for (const turn of this.activeTurns.values()) {
|
|
67
|
+
if (sessionKey && turn.sessionKey !== sessionKey)
|
|
68
|
+
continue;
|
|
69
|
+
turn.queue.clearFollowUp();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Master-only: inject into the latest active turn on this session. */
|
|
73
|
+
steer(sessionKey, message) {
|
|
74
|
+
const turn = this.resolveLatestTurn(sessionKey);
|
|
75
|
+
if (!turn) {
|
|
76
|
+
throw new Error('steer requires an active turn on the same session');
|
|
77
|
+
}
|
|
78
|
+
turn.queue.pushSteering(message);
|
|
79
|
+
}
|
|
80
|
+
/** Master-only: queue continuation on the latest active turn. */
|
|
81
|
+
followUp(sessionKey, message) {
|
|
82
|
+
const turn = this.resolveLatestTurn(sessionKey);
|
|
83
|
+
if (!turn) {
|
|
84
|
+
throw new Error('followUp requires an active turn on the same session');
|
|
85
|
+
}
|
|
86
|
+
turn.queue.pushFollowUp(message);
|
|
87
|
+
}
|
|
88
|
+
/** Parallel scheduling: each inbound message spawns an independent turn. */
|
|
89
|
+
schedule(request) {
|
|
90
|
+
return this.runTurn(request);
|
|
91
|
+
}
|
|
92
|
+
resolveLatestTurn(sessionKey) {
|
|
93
|
+
const turnId = this.latestTurnBySession.get(sessionKey);
|
|
94
|
+
if (!turnId)
|
|
95
|
+
return undefined;
|
|
96
|
+
return this.activeTurns.get(turnId);
|
|
97
|
+
}
|
|
98
|
+
notifyIdle() {
|
|
99
|
+
if (!this.isIdle())
|
|
100
|
+
return;
|
|
101
|
+
const waiters = this.idleWaiters.splice(0);
|
|
102
|
+
for (const resolve of waiters) {
|
|
103
|
+
resolve();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async emitEvent(event, signal) {
|
|
107
|
+
for (const listener of this.subscribers) {
|
|
108
|
+
await listener(event, signal);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
promoteLatestTurn(sessionKey, turnId) {
|
|
112
|
+
this.latestTurnBySession.set(sessionKey, turnId);
|
|
113
|
+
}
|
|
114
|
+
demoteLatestTurn(sessionKey, turnId) {
|
|
115
|
+
if (this.latestTurnBySession.get(sessionKey) !== turnId)
|
|
116
|
+
return;
|
|
117
|
+
this.latestTurnBySession.delete(sessionKey);
|
|
118
|
+
for (const [id, turn] of this.activeTurns) {
|
|
119
|
+
if (turn.sessionKey === sessionKey) {
|
|
120
|
+
this.latestTurnBySession.set(sessionKey, id);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async runTurn(request) {
|
|
126
|
+
const turnId = randomUUID();
|
|
127
|
+
const abortController = new AbortController();
|
|
128
|
+
const signal = abortController.signal;
|
|
129
|
+
const queue = new SessionMessageQueue(this.steeringMode, this.followUpMode);
|
|
130
|
+
const activeTurn = {
|
|
131
|
+
turnId,
|
|
132
|
+
sessionKey: request.sessionKey,
|
|
133
|
+
context: request.context,
|
|
134
|
+
queue,
|
|
135
|
+
abortController,
|
|
136
|
+
};
|
|
137
|
+
this.activeTurns.set(turnId, activeTurn);
|
|
138
|
+
this.promoteLatestTurn(request.sessionKey, turnId);
|
|
139
|
+
let lastResult = null;
|
|
140
|
+
try {
|
|
141
|
+
await this.emitEvent({ type: 'agent_start' }, signal);
|
|
142
|
+
const hooks = {
|
|
143
|
+
getSteeringMessages: async () => queue.drainSteering(),
|
|
144
|
+
getFollowUpMessages: async () => queue.drainFollowUp(),
|
|
145
|
+
};
|
|
146
|
+
lastResult = await request.execute(request.userMessages, hooks, signal, turnId);
|
|
147
|
+
while (queue.hasFollowUp() && !signal.aborted) {
|
|
148
|
+
const batch = queue.drainFollowUp();
|
|
149
|
+
lastResult = await request.execute(batch, hooks, signal, turnId);
|
|
150
|
+
}
|
|
151
|
+
await this.emitEvent({ type: 'agent_end', messages: request.userMessages }, signal);
|
|
152
|
+
if (!lastResult) {
|
|
153
|
+
throw new Error('Prompt turn produced no result');
|
|
154
|
+
}
|
|
155
|
+
this.lastResult = lastResult;
|
|
156
|
+
return lastResult;
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
this.activeTurns.delete(turnId);
|
|
160
|
+
this.demoteLatestTurn(request.sessionKey, turnId);
|
|
161
|
+
this.notifyIdle();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=prompt-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-controller.js","sourceRoot":"","sources":["../../src/zhin-agent/prompt-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-input.d.ts","sourceRoot":"","sources":["../../src/zhin-agent/prompt-input.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG9D,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,YAAY,EAAE,EAC7C,MAAM,CAAC,EAAE,YAAY,EAAE,GACtB,YAAY,EAAE,CAKhB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createUserMessage } from '@zhin.js/ai';
|
|
2
|
+
export function normalizePromptMessages(input, images) {
|
|
3
|
+
if (typeof input === 'string') {
|
|
4
|
+
return [createUserMessage(input, images)];
|
|
5
|
+
}
|
|
6
|
+
return Array.isArray(input) ? input : [input];
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=prompt-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-input.js","sourceRoot":"","sources":["../../src/zhin-agent/prompt-input.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,UAAU,uBAAuB,CACrC,KAA6C,EAC7C,MAAuB;IAEvB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -1,20 +1,25 @@
|
|
|
1
|
-
import type { ChatMessage,
|
|
1
|
+
import type { ChatMessage, MemoryIMSessionStore, IMSessionStore, MemoryAgentSessionStore, AgentSessionStore, ContextRepository, CreateIMSessionInput, CreateAgentSessionInput } from '@zhin.js/ai';
|
|
2
2
|
import type { ToolContext } from '@zhin.js/core';
|
|
3
3
|
export interface SessionIODeps {
|
|
4
|
-
chatHistory: ChatHistoryContext | null;
|
|
5
4
|
imSessionStore: IMSessionStore | MemoryIMSessionStore;
|
|
5
|
+
agentSessionStore: AgentSessionStore | MemoryAgentSessionStore;
|
|
6
|
+
contextRepository: ContextRepository;
|
|
6
7
|
}
|
|
7
8
|
/**
|
|
8
9
|
* 群/频道共享 session 写入时,为 user 消息附加结构化发言者前缀
|
|
9
10
|
*/
|
|
10
11
|
export declare function formatUserContentForSession(context: Pick<ToolContext, 'scope' | 'senderId' | 'roles' | 'message'>, rawContent: string): string;
|
|
11
|
-
export declare function buildSessionCreateInput(sessionKey: string, context: Pick<ToolContext, 'platform' | 'botId' | 'scope' | 'sceneId'>): CreateIMSessionInput;
|
|
12
|
-
export declare function
|
|
13
|
-
export declare function
|
|
12
|
+
export declare function buildSessionCreateInput(sessionKey: string, context: Pick<ToolContext, 'platform' | 'botId' | 'scope' | 'sceneId'>): CreateIMSessionInput & CreateAgentSessionInput;
|
|
13
|
+
export declare function buildImTranscriptQuery(context: Pick<ToolContext, 'platform' | 'botId' | 'sceneId'>): import('@zhin.js/ai').ImTranscriptQuery;
|
|
14
|
+
export declare function buildHistoryMessagesFromContext(deps: SessionIODeps, sessionId: string, currentUserContent: string): Promise<ChatMessage[]>;
|
|
14
15
|
/**
|
|
15
16
|
* 在 `getOrCreateActive` 之前调用:是否视为新会话纪元(用于 ai.session.new)。
|
|
16
|
-
* 须在 beginTurnSession 之前判定,否则同轮创建会令 hasAnySession 恒为 true。
|
|
17
17
|
*/
|
|
18
|
-
export declare function resolveSessionIsNewBeforeCreate(deps: SessionIODeps, sessionKey: string
|
|
18
|
+
export declare function resolveSessionIsNewBeforeCreate(deps: SessionIODeps, sessionKey: string): Promise<boolean>;
|
|
19
|
+
export declare function beginTurnSession(deps: SessionIODeps, sessionKey: string, context: Pick<ToolContext, 'platform' | 'botId' | 'scope' | 'sceneId'>): Promise<{
|
|
20
|
+
sessionKey: string;
|
|
21
|
+
sessionId: string;
|
|
22
|
+
}>;
|
|
19
23
|
export declare function touchSession(deps: SessionIODeps, sessionId: string): Promise<void>;
|
|
24
|
+
export declare function archiveSessionByKey(deps: SessionIODeps, sessionKey: string): Promise<boolean>;
|
|
20
25
|
//# sourceMappingURL=session-io.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-io.d.ts","sourceRoot":"","sources":["../../src/zhin-agent/session-io.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,
|
|
1
|
+
{"version":3,"file":"session-io.d.ts","sourceRoot":"","sources":["../../src/zhin-agent/session-io.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,oBAAoB,EACpB,cAAc,EACd,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,uBAAuB,EACxB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAMjD,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,cAAc,GAAG,oBAAoB,CAAC;IACtD,iBAAiB,EAAE,iBAAiB,GAAG,uBAAuB,CAAC;IAC/D,iBAAiB,EAAE,iBAAiB,CAAC;CACtC;AAcD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC,EACtE,UAAU,EAAE,MAAM,GACjB,MAAM,CAUR;AAED,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC,GACrE,oBAAoB,GAAG,uBAAuB,CAQhD;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC,GAC3D,OAAO,aAAa,EAAE,iBAAiB,CAMzC;AAED,wBAAsB,+BAA+B,CACnD,IAAI,EAAE,aAAa,EACnB,SAAS,EAAE,MAAM,EACjB,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,WAAW,EAAE,CAAC,CAIxB;AAED;;GAEG;AACH,wBAAsB,+BAA+B,CACnD,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC,GACrE,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAIpD;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,aAAa,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAGlB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { agentMessagesToOpenAi } from '@zhin.js/ai';
|
|
1
2
|
import { formatSenderRolesForLabel, stripUserSpoofedSenderPrefix, } from '@zhin.js/core';
|
|
2
3
|
function sanitizeSenderAttr(value) {
|
|
3
4
|
const trimmed = value.trim().replace(/[\]\s]+/g, '_');
|
|
@@ -33,33 +34,35 @@ export function buildSessionCreateInput(sessionKey, context) {
|
|
|
33
34
|
scene_type: context.scope || 'private',
|
|
34
35
|
};
|
|
35
36
|
}
|
|
36
|
-
export function
|
|
37
|
+
export function buildImTranscriptQuery(context) {
|
|
37
38
|
return {
|
|
38
|
-
sessionId,
|
|
39
39
|
platform: context.platform || '',
|
|
40
40
|
botId: context.botId || '',
|
|
41
41
|
sceneId: context.sceneId || '',
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
|
-
export async function
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
: [];
|
|
44
|
+
export async function buildHistoryMessagesFromContext(deps, sessionId, currentUserContent) {
|
|
45
|
+
const loaded = await deps.contextRepository.loadContext(sessionId);
|
|
46
|
+
const history = agentMessagesToOpenAi(loaded.messages);
|
|
48
47
|
return [...history, { role: 'user', content: currentUserContent }];
|
|
49
48
|
}
|
|
50
49
|
/**
|
|
51
50
|
* 在 `getOrCreateActive` 之前调用:是否视为新会话纪元(用于 ai.session.new)。
|
|
52
|
-
* 须在 beginTurnSession 之前判定,否则同轮创建会令 hasAnySession 恒为 true。
|
|
53
51
|
*/
|
|
54
|
-
export async function resolveSessionIsNewBeforeCreate(deps, sessionKey
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const
|
|
60
|
-
|
|
52
|
+
export async function resolveSessionIsNewBeforeCreate(deps, sessionKey) {
|
|
53
|
+
const active = await deps.agentSessionStore.findActive(sessionKey);
|
|
54
|
+
return !active;
|
|
55
|
+
}
|
|
56
|
+
export async function beginTurnSession(deps, sessionKey, context) {
|
|
57
|
+
const input = buildSessionCreateInput(sessionKey, context);
|
|
58
|
+
const record = await deps.agentSessionStore.getOrCreateActive(input);
|
|
59
|
+
return { sessionKey, sessionId: record.session_id };
|
|
61
60
|
}
|
|
62
61
|
export async function touchSession(deps, sessionId) {
|
|
63
|
-
await deps.
|
|
62
|
+
await deps.agentSessionStore.touch(sessionId);
|
|
63
|
+
}
|
|
64
|
+
export async function archiveSessionByKey(deps, sessionKey) {
|
|
65
|
+
await deps.contextRepository.archiveSession(sessionKey);
|
|
66
|
+
return deps.agentSessionStore.archiveByKey(sessionKey);
|
|
64
67
|
}
|
|
65
68
|
//# sourceMappingURL=session-io.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-io.js","sourceRoot":"","sources":["../../src/zhin-agent/session-io.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-io.js","sourceRoot":"","sources":["../../src/zhin-agent/session-io.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AgentMessage } from '@zhin.js/ai';
|
|
2
|
+
import type { QueueMode } from '@zhin.js/ai';
|
|
3
|
+
/** Per-sessionKey steering / follow-up queues (ADR 0009 D6 / Grill #13). */
|
|
4
|
+
export declare class SessionMessageQueue {
|
|
5
|
+
readonly steeringMode: QueueMode;
|
|
6
|
+
readonly followUpMode: QueueMode;
|
|
7
|
+
private steering;
|
|
8
|
+
private followUp;
|
|
9
|
+
constructor(steeringMode: QueueMode, followUpMode: QueueMode);
|
|
10
|
+
pushSteering(input: AgentMessage | AgentMessage[]): void;
|
|
11
|
+
pushFollowUp(input: AgentMessage | AgentMessage[]): void;
|
|
12
|
+
drainSteering(): AgentMessage[];
|
|
13
|
+
drainFollowUp(): AgentMessage[];
|
|
14
|
+
clearSteering(): void;
|
|
15
|
+
clearFollowUp(): void;
|
|
16
|
+
hasFollowUp(): boolean;
|
|
17
|
+
steeringDepth(): number;
|
|
18
|
+
followUpDepth(): number;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=session-message-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-message-queue.d.ts","sourceRoot":"","sources":["../../src/zhin-agent/session-message-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,4EAA4E;AAC5E,qBAAa,mBAAmB;IAK5B,QAAQ,CAAC,YAAY,EAAE,SAAS;IAChC,QAAQ,CAAC,YAAY,EAAE,SAAS;IALlC,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,QAAQ,CAAsB;gBAG3B,YAAY,EAAE,SAAS,EACvB,YAAY,EAAE,SAAS;IAGlC,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,EAAE,GAAG,IAAI;IAIxD,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,EAAE,GAAG,IAAI;IAIxD,aAAa,IAAI,YAAY,EAAE;IAQ/B,aAAa,IAAI,YAAY,EAAE;IAQ/B,aAAa,IAAI,IAAI;IAIrB,aAAa,IAAI,IAAI;IAIrB,WAAW,IAAI,OAAO;IAItB,aAAa,IAAI,MAAM;IAIvB,aAAa,IAAI,MAAM;CAGxB"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
function normalizeMessages(input) {
|
|
2
|
+
return Array.isArray(input) ? input : [input];
|
|
3
|
+
}
|
|
4
|
+
/** Per-sessionKey steering / follow-up queues (ADR 0009 D6 / Grill #13). */
|
|
5
|
+
export class SessionMessageQueue {
|
|
6
|
+
steeringMode;
|
|
7
|
+
followUpMode;
|
|
8
|
+
steering = [];
|
|
9
|
+
followUp = [];
|
|
10
|
+
constructor(steeringMode, followUpMode) {
|
|
11
|
+
this.steeringMode = steeringMode;
|
|
12
|
+
this.followUpMode = followUpMode;
|
|
13
|
+
}
|
|
14
|
+
pushSteering(input) {
|
|
15
|
+
this.steering.push(...normalizeMessages(input));
|
|
16
|
+
}
|
|
17
|
+
pushFollowUp(input) {
|
|
18
|
+
this.followUp.push(...normalizeMessages(input));
|
|
19
|
+
}
|
|
20
|
+
drainSteering() {
|
|
21
|
+
if (this.steering.length === 0)
|
|
22
|
+
return [];
|
|
23
|
+
if (this.steeringMode === 'all') {
|
|
24
|
+
return this.steering.splice(0);
|
|
25
|
+
}
|
|
26
|
+
return this.steering.splice(0, 1);
|
|
27
|
+
}
|
|
28
|
+
drainFollowUp() {
|
|
29
|
+
if (this.followUp.length === 0)
|
|
30
|
+
return [];
|
|
31
|
+
if (this.followUpMode === 'all') {
|
|
32
|
+
return this.followUp.splice(0);
|
|
33
|
+
}
|
|
34
|
+
return this.followUp.splice(0, 1);
|
|
35
|
+
}
|
|
36
|
+
clearSteering() {
|
|
37
|
+
this.steering = [];
|
|
38
|
+
}
|
|
39
|
+
clearFollowUp() {
|
|
40
|
+
this.followUp = [];
|
|
41
|
+
}
|
|
42
|
+
hasFollowUp() {
|
|
43
|
+
return this.followUp.length > 0;
|
|
44
|
+
}
|
|
45
|
+
steeringDepth() {
|
|
46
|
+
return this.steering.length;
|
|
47
|
+
}
|
|
48
|
+
followUpDepth() {
|
|
49
|
+
return this.followUp.length;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=session-message-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-message-queue.js","sourceRoot":"","sources":["../../src/zhin-agent/session-message-queue.ts"],"names":[],"mappings":"AAGA,SAAS,iBAAiB,CAAC,KAAoC;IAC7D,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,4EAA4E;AAC5E,MAAM,OAAO,mBAAmB;IAKnB;IACA;IALH,QAAQ,GAAmB,EAAE,CAAC;IAC9B,QAAQ,GAAmB,EAAE,CAAC;IAEtC,YACW,YAAuB,EACvB,YAAuB;QADvB,iBAAY,GAAZ,YAAY,CAAW;QACvB,iBAAY,GAAZ,YAAY,CAAW;IAC/B,CAAC;IAEJ,YAAY,CAAC,KAAoC;QAC/C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,YAAY,CAAC,KAAoC;QAC/C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,aAAa;QACX,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,aAAa;QACX,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,aAAa;QACX,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IAED,aAAa;QACX,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-calls-user-format.d.ts","sourceRoot":"","sources":["../../src/zhin-agent/tool-calls-user-format.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"tool-calls-user-format.d.ts","sourceRoot":"","sources":["../../src/zhin-agent/tool-calls-user-format.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AA2ED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,CA6C1E;AAED,2EAA2E;AAC3E,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAS/D"}
|
|
@@ -36,6 +36,9 @@ function formatRunDeferredTaskResult(result) {
|
|
|
36
36
|
const raw = asString(result);
|
|
37
37
|
const parsed = parseRunDeferredPayload(raw);
|
|
38
38
|
if (parsed) {
|
|
39
|
+
if (parsed.status === 'delegated') {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
39
42
|
if (parsed.status === 'error') {
|
|
40
43
|
return parsed.error || '子任务执行失败。';
|
|
41
44
|
}
|