@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.
Files changed (132) hide show
  1. package/README.md +47 -22
  2. package/lib/builtin/run-deferred-task-tool.d.ts +1 -1
  3. package/lib/builtin/run-deferred-task-tool.d.ts.map +1 -1
  4. package/lib/builtin/run-deferred-task-tool.js +1 -1
  5. package/lib/builtin/run-deferred-task-tool.js.map +1 -1
  6. package/lib/config/normalize-ai-config.d.ts +4 -0
  7. package/lib/config/normalize-ai-config.d.ts.map +1 -1
  8. package/lib/config/normalize-ai-config.js +23 -6
  9. package/lib/config/normalize-ai-config.js.map +1 -1
  10. package/lib/config/provider-instance.d.ts.map +1 -1
  11. package/lib/config/provider-instance.js +26 -7
  12. package/lib/config/provider-instance.js.map +1 -1
  13. package/lib/config/types.d.ts +2 -1
  14. package/lib/config/types.d.ts.map +1 -1
  15. package/lib/config/types.js.map +1 -1
  16. package/lib/config/validate-ai-config.d.ts.map +1 -1
  17. package/lib/config/validate-ai-config.js +5 -0
  18. package/lib/config/validate-ai-config.js.map +1 -1
  19. package/lib/deferred-worker-runner.d.ts +2 -0
  20. package/lib/deferred-worker-runner.d.ts.map +1 -1
  21. package/lib/deferred-worker-runner.js +17 -34
  22. package/lib/deferred-worker-runner.js.map +1 -1
  23. package/lib/index.d.ts +2 -1
  24. package/lib/index.d.ts.map +1 -1
  25. package/lib/index.js +1 -1
  26. package/lib/index.js.map +1 -1
  27. package/lib/init/activate-ai-database-storage.d.ts +1 -1
  28. package/lib/init/activate-ai-database-storage.d.ts.map +1 -1
  29. package/lib/init/activate-ai-database-storage.js +16 -13
  30. package/lib/init/activate-ai-database-storage.js.map +1 -1
  31. package/lib/init/create-zhin-agent.d.ts.map +1 -1
  32. package/lib/init/create-zhin-agent.js +17 -2
  33. package/lib/init/create-zhin-agent.js.map +1 -1
  34. package/lib/init/register-db-models.d.ts.map +1 -1
  35. package/lib/init/register-db-models.js +7 -8
  36. package/lib/init/register-db-models.js.map +1 -1
  37. package/lib/init/register-db-upgrade.d.ts +1 -1
  38. package/lib/init/register-db-upgrade.js +2 -2
  39. package/lib/init/register-db-upgrade.js.map +1 -1
  40. package/lib/init/register-management-tools.js +1 -1
  41. package/lib/init/register-management-tools.js.map +1 -1
  42. package/lib/media/subagent-user-delivery.d.ts +2 -9
  43. package/lib/media/subagent-user-delivery.d.ts.map +1 -1
  44. package/lib/media/subagent-user-delivery.js.map +1 -1
  45. package/lib/service.d.ts +31 -22
  46. package/lib/service.d.ts.map +1 -1
  47. package/lib/service.js +48 -19
  48. package/lib/service.js.map +1 -1
  49. package/lib/subagent-ai-events.d.ts +2 -2
  50. package/lib/subagent-ai-events.d.ts.map +1 -1
  51. package/lib/subagent-ai-events.js +17 -21
  52. package/lib/subagent-ai-events.js.map +1 -1
  53. package/lib/subagent.d.ts.map +1 -1
  54. package/lib/subagent.js +44 -59
  55. package/lib/subagent.js.map +1 -1
  56. package/lib/zhin-agent/agent-loop-standalone.d.ts +32 -0
  57. package/lib/zhin-agent/agent-loop-standalone.d.ts.map +1 -0
  58. package/lib/zhin-agent/agent-loop-standalone.js +144 -0
  59. package/lib/zhin-agent/agent-loop-standalone.js.map +1 -0
  60. package/lib/zhin-agent/agent-loop-turn.d.ts +51 -0
  61. package/lib/zhin-agent/agent-loop-turn.d.ts.map +1 -0
  62. package/lib/zhin-agent/agent-loop-turn.js +287 -0
  63. package/lib/zhin-agent/agent-loop-turn.js.map +1 -0
  64. package/lib/zhin-agent/builtin-tools.d.ts +3 -2
  65. package/lib/zhin-agent/builtin-tools.d.ts.map +1 -1
  66. package/lib/zhin-agent/builtin-tools.js +15 -16
  67. package/lib/zhin-agent/builtin-tools.js.map +1 -1
  68. package/lib/zhin-agent/config.d.ts +5 -2
  69. package/lib/zhin-agent/config.d.ts.map +1 -1
  70. package/lib/zhin-agent/config.js +3 -2
  71. package/lib/zhin-agent/config.js.map +1 -1
  72. package/lib/zhin-agent/deferred-delivery.d.ts +5 -0
  73. package/lib/zhin-agent/deferred-delivery.d.ts.map +1 -0
  74. package/lib/zhin-agent/deferred-delivery.js +29 -0
  75. package/lib/zhin-agent/deferred-delivery.js.map +1 -0
  76. package/lib/zhin-agent/index.d.ts +40 -8
  77. package/lib/zhin-agent/index.d.ts.map +1 -1
  78. package/lib/zhin-agent/index.js +162 -17
  79. package/lib/zhin-agent/index.js.map +1 -1
  80. package/lib/zhin-agent/model-resolver.d.ts +0 -1
  81. package/lib/zhin-agent/model-resolver.d.ts.map +1 -1
  82. package/lib/zhin-agent/model-resolver.js.map +1 -1
  83. package/lib/zhin-agent/multimodal-message.d.ts +9 -0
  84. package/lib/zhin-agent/multimodal-message.d.ts.map +1 -0
  85. package/lib/zhin-agent/multimodal-message.js +69 -0
  86. package/lib/zhin-agent/multimodal-message.js.map +1 -0
  87. package/lib/zhin-agent/prompt-access.d.ts +4 -0
  88. package/lib/zhin-agent/prompt-access.d.ts.map +1 -0
  89. package/lib/zhin-agent/prompt-access.js +7 -0
  90. package/lib/zhin-agent/prompt-access.js.map +1 -0
  91. package/lib/zhin-agent/prompt-controller.d.ts +53 -0
  92. package/lib/zhin-agent/prompt-controller.d.ts.map +1 -0
  93. package/lib/zhin-agent/prompt-controller.js +165 -0
  94. package/lib/zhin-agent/prompt-controller.js.map +1 -0
  95. package/lib/zhin-agent/prompt-input.d.ts +3 -0
  96. package/lib/zhin-agent/prompt-input.d.ts.map +1 -0
  97. package/lib/zhin-agent/prompt-input.js +8 -0
  98. package/lib/zhin-agent/prompt-input.js.map +1 -0
  99. package/lib/zhin-agent/session-io.d.ts +12 -7
  100. package/lib/zhin-agent/session-io.d.ts.map +1 -1
  101. package/lib/zhin-agent/session-io.js +18 -15
  102. package/lib/zhin-agent/session-io.js.map +1 -1
  103. package/lib/zhin-agent/session-message-queue.d.ts +20 -0
  104. package/lib/zhin-agent/session-message-queue.d.ts.map +1 -0
  105. package/lib/zhin-agent/session-message-queue.js +52 -0
  106. package/lib/zhin-agent/session-message-queue.js.map +1 -0
  107. package/lib/zhin-agent/tool-calls-user-format.d.ts.map +1 -1
  108. package/lib/zhin-agent/tool-calls-user-format.js +3 -0
  109. package/lib/zhin-agent/tool-calls-user-format.js.map +1 -1
  110. package/lib/zhin-agent/tool-orchestration.d.ts.map +1 -1
  111. package/lib/zhin-agent/tool-orchestration.js +35 -5
  112. package/lib/zhin-agent/tool-orchestration.js.map +1 -1
  113. package/lib/zhin-agent/tool-runtime.d.ts +2 -2
  114. package/lib/zhin-agent/tool-runtime.d.ts.map +1 -1
  115. package/lib/zhin-agent/tool-runtime.js +4 -4
  116. package/lib/zhin-agent/tool-runtime.js.map +1 -1
  117. package/lib/zhin-agent/turn-context.d.ts +9 -0
  118. package/lib/zhin-agent/turn-context.d.ts.map +1 -0
  119. package/lib/zhin-agent/turn-context.js +12 -0
  120. package/lib/zhin-agent/turn-context.js.map +1 -0
  121. package/lib/zhin-agent/turn-pipeline.d.ts +5 -1
  122. package/lib/zhin-agent/turn-pipeline.d.ts.map +1 -1
  123. package/lib/zhin-agent/turn-pipeline.js +113 -436
  124. package/lib/zhin-agent/turn-pipeline.js.map +1 -1
  125. package/lib/zhin-agent/zhin-agent-private.d.ts +11 -4
  126. package/lib/zhin-agent/zhin-agent-private.d.ts.map +1 -1
  127. package/lib/zhin-agent/zhin-agent-private.js.map +1 -1
  128. package/package.json +3 -3
  129. package/lib/zhin-agent/llm-runner.d.ts +0 -18
  130. package/lib/zhin-agent/llm-runner.d.ts.map +0 -1
  131. package/lib/zhin-agent/llm-runner.js +0 -163
  132. 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;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;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
+ {"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":"AAQA,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"}
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,4 @@
1
+ export declare class PromptAccessDeniedError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ //# sourceMappingURL=prompt-access.d.ts.map
@@ -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,7 @@
1
+ export class PromptAccessDeniedError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'PromptAccessDeniedError';
5
+ }
6
+ }
7
+ //# sourceMappingURL=prompt-access.js.map
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AA+BjE,MAAM,OAAO,gBAAgB;IAQR;IACA;IARF,WAAW,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC1C,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC5C,mBAAmB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzD,WAAW,GAAsB,EAAE,CAAC;IACpC,UAAU,GAA+B,IAAI,CAAC;IAEtD,YACmB,YAAuB,EACvB,YAAuB;QADvB,iBAAY,GAAZ,YAAY,CAAW;QACvB,iBAAY,GAAZ,YAAY,CAAW;IACvC,CAAC;IAEJ,MAAM;QACJ,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,kBAAkB;QAChB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IAC/B,CAAC;IAED,mBAAmB;QACjB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC7B,CAAC;IAED,gBAAgB;QACd,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC;IACvD,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,SAAS,CAAC,QAA0B;QAClC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,IAAI,CAAC,MAAM,EAAE;YAAE,OAAO;QAC1B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,iEAAiE;IACjE,KAAK,CAAC,UAAmB;QACvB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,IAAI,UAAU,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU;gBAAE,SAAS;YAC3D,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,UAAmB;QACpC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,IAAI,UAAU,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU;gBAAE,SAAS;YAC3D,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,UAAmB;QACpC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,IAAI,UAAU,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU;gBAAE,SAAS;YAC3D,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,UAAkB,EAAE,OAAsC;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,iEAAiE;IACjE,QAAQ,CAAC,UAAkB,EAAE,OAAsC;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,4EAA4E;IAC5E,QAAQ,CAAC,OAA0B;QACjC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAEO,iBAAiB,CAAC,UAAkB;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE,OAAO;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3C,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;YAC9B,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,KAAiB,EAAE,MAAmB;QAC5D,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,UAAkB,EAAE,MAAc;QAC1D,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAEO,gBAAgB,CAAC,UAAkB,EAAE,MAAc;QACzD,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,MAAM;YAAE,OAAO;QAChE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5C,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBACnC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;gBAC7C,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,OAA0B;QAC9C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAE5E,MAAM,UAAU,GAAe;YAC7B,MAAM;YACN,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK;YACL,eAAe;SAChB,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAEnD,IAAI,UAAU,GAA+B,IAAI,CAAC;QAElD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,MAAM,CAAC,CAAC;YAEtD,MAAM,KAAK,GAAoB;gBAC7B,mBAAmB,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE;gBACtD,mBAAmB,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE;aACvD,CAAC;YAEF,UAAU,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAEhF,OAAO,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;gBACpC,UAAU,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACnE,CAAC;YAED,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,CAAC;YAEpF,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACpD,CAAC;YAED,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC7B,OAAO,UAAU,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAClD,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ import type { AgentMessage, ImageContent } from '@zhin.js/ai';
2
+ export declare function normalizePromptMessages(input: string | AgentMessage | AgentMessage[], images?: ImageContent[]): AgentMessage[];
3
+ //# sourceMappingURL=prompt-input.d.ts.map
@@ -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, ChatHistoryContext, ChatHistoryQuery, MemoryIMSessionStore, IMSessionStore, CreateIMSessionInput } from '@zhin.js/ai';
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 buildChatHistoryQuery(sessionId: string, context: Pick<ToolContext, 'platform' | 'botId' | 'sceneId'>): ChatHistoryQuery;
13
- export declare function buildHistoryMessages(deps: SessionIODeps, sessionId: string, context: Pick<ToolContext, 'platform' | 'botId' | 'sceneId'>, currentUserContent: string): Promise<ChatMessage[]>;
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, context: Pick<ToolContext, 'platform' | 'botId' | 'sceneId'>): Promise<boolean>;
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,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACrB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,eAAe,CAAC;AAM7D,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACvC,cAAc,EAAE,cAAc,GAAG,oBAAoB,CAAC;CACvD;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,CAQtB;AAED,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC,GAC3D,gBAAgB,CAOlB;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,aAAa,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC,EAC5D,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,WAAW,EAAE,CAAC,CAQxB;AAED;;;GAGG;AACH,wBAAsB,+BAA+B,CACnD,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC,GAC3D,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,aAAa,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAEf"}
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 buildChatHistoryQuery(sessionId, context) {
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 buildHistoryMessages(deps, sessionId, context, currentUserContent) {
45
- const history = deps.chatHistory != null
46
- ? await deps.chatHistory.buildHistoryMessages(buildChatHistoryQuery(sessionId, context))
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, context) {
55
- if (await deps.imSessionStore.hasAnySession(sessionKey))
56
- return false;
57
- if (!deps.chatHistory)
58
- return true;
59
- const hasMessages = await deps.chatHistory.hasStoredMessages(buildChatHistoryQuery('new-check', context));
60
- return !hasMessages;
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.imSessionStore.touch(sessionId);
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":"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"}
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;AAwED;;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"}
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
  }