@centerseedwu/naru-agent 0.2.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.
Files changed (247) hide show
  1. package/README.md +392 -0
  2. package/dist/agent.d.ts +39 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +578 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/compression/base.d.ts +12 -0
  7. package/dist/compression/base.d.ts.map +1 -0
  8. package/dist/compression/base.js +2 -0
  9. package/dist/compression/base.js.map +1 -0
  10. package/dist/compression/compressor.d.ts +20 -0
  11. package/dist/compression/compressor.d.ts.map +1 -0
  12. package/dist/compression/compressor.js +52 -0
  13. package/dist/compression/compressor.js.map +1 -0
  14. package/dist/compression/in-memory-store.d.ts +8 -0
  15. package/dist/compression/in-memory-store.d.ts.map +1 -0
  16. package/dist/compression/in-memory-store.js +13 -0
  17. package/dist/compression/in-memory-store.js.map +1 -0
  18. package/dist/decision/index.d.ts +7 -0
  19. package/dist/decision/index.d.ts.map +1 -0
  20. package/dist/decision/index.js +4 -0
  21. package/dist/decision/index.js.map +1 -0
  22. package/dist/decision/llm-structured-classifier.d.ts +18 -0
  23. package/dist/decision/llm-structured-classifier.d.ts.map +1 -0
  24. package/dist/decision/llm-structured-classifier.js +44 -0
  25. package/dist/decision/llm-structured-classifier.js.map +1 -0
  26. package/dist/decision/tool-planner.d.ts +14 -0
  27. package/dist/decision/tool-planner.d.ts.map +1 -0
  28. package/dist/decision/tool-planner.js +35 -0
  29. package/dist/decision/tool-planner.js.map +1 -0
  30. package/dist/decision/types.d.ts +53 -0
  31. package/dist/decision/types.d.ts.map +1 -0
  32. package/dist/decision/types.js +12 -0
  33. package/dist/decision/types.js.map +1 -0
  34. package/dist/event-bus.d.ts +10 -0
  35. package/dist/event-bus.d.ts.map +1 -0
  36. package/dist/event-bus.js +34 -0
  37. package/dist/event-bus.js.map +1 -0
  38. package/dist/guardrails/base.d.ts +10 -0
  39. package/dist/guardrails/base.d.ts.map +1 -0
  40. package/dist/guardrails/base.js +2 -0
  41. package/dist/guardrails/base.js.map +1 -0
  42. package/dist/guardrails/keyword.d.ts +15 -0
  43. package/dist/guardrails/keyword.d.ts.map +1 -0
  44. package/dist/guardrails/keyword.js +37 -0
  45. package/dist/guardrails/keyword.js.map +1 -0
  46. package/dist/index.d.ts +51 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +39 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/intent/base.d.ts +19 -0
  51. package/dist/intent/base.d.ts.map +1 -0
  52. package/dist/intent/base.js +2 -0
  53. package/dist/intent/base.js.map +1 -0
  54. package/dist/intent/llm-classifier.d.ts +22 -0
  55. package/dist/intent/llm-classifier.d.ts.map +1 -0
  56. package/dist/intent/llm-classifier.js +49 -0
  57. package/dist/intent/llm-classifier.js.map +1 -0
  58. package/dist/intent/tool-calling-classifier.d.ts +16 -0
  59. package/dist/intent/tool-calling-classifier.d.ts.map +1 -0
  60. package/dist/intent/tool-calling-classifier.js +56 -0
  61. package/dist/intent/tool-calling-classifier.js.map +1 -0
  62. package/dist/knowledge/base.d.ts +14 -0
  63. package/dist/knowledge/base.d.ts.map +1 -0
  64. package/dist/knowledge/base.js +10 -0
  65. package/dist/knowledge/base.js.map +1 -0
  66. package/dist/knowledge/chroma-store.d.ts +25 -0
  67. package/dist/knowledge/chroma-store.d.ts.map +1 -0
  68. package/dist/knowledge/chroma-store.js +70 -0
  69. package/dist/knowledge/chroma-store.js.map +1 -0
  70. package/dist/knowledge/contextualizer.d.ts +17 -0
  71. package/dist/knowledge/contextualizer.d.ts.map +1 -0
  72. package/dist/knowledge/contextualizer.js +47 -0
  73. package/dist/knowledge/contextualizer.js.map +1 -0
  74. package/dist/knowledge/graph-store.d.ts +22 -0
  75. package/dist/knowledge/graph-store.d.ts.map +1 -0
  76. package/dist/knowledge/graph-store.js +116 -0
  77. package/dist/knowledge/graph-store.js.map +1 -0
  78. package/dist/knowledge/hybrid-store.d.ts +16 -0
  79. package/dist/knowledge/hybrid-store.d.ts.map +1 -0
  80. package/dist/knowledge/hybrid-store.js +39 -0
  81. package/dist/knowledge/hybrid-store.js.map +1 -0
  82. package/dist/knowledge/in-memory-store.d.ts +27 -0
  83. package/dist/knowledge/in-memory-store.d.ts.map +1 -0
  84. package/dist/knowledge/in-memory-store.js +54 -0
  85. package/dist/knowledge/in-memory-store.js.map +1 -0
  86. package/dist/knowledge/pgvector-store.d.ts +27 -0
  87. package/dist/knowledge/pgvector-store.d.ts.map +1 -0
  88. package/dist/knowledge/pgvector-store.js +68 -0
  89. package/dist/knowledge/pgvector-store.js.map +1 -0
  90. package/dist/memory/base.d.ts +21 -0
  91. package/dist/memory/base.d.ts.map +1 -0
  92. package/dist/memory/base.js +9 -0
  93. package/dist/memory/base.js.map +1 -0
  94. package/dist/memory/in-memory-store.d.ts +10 -0
  95. package/dist/memory/in-memory-store.d.ts.map +1 -0
  96. package/dist/memory/in-memory-store.js +35 -0
  97. package/dist/memory/in-memory-store.js.map +1 -0
  98. package/dist/memory/manager.d.ts +29 -0
  99. package/dist/memory/manager.d.ts.map +1 -0
  100. package/dist/memory/manager.js +121 -0
  101. package/dist/memory/manager.js.map +1 -0
  102. package/dist/memory/mem0-manager.d.ts +32 -0
  103. package/dist/memory/mem0-manager.d.ts.map +1 -0
  104. package/dist/memory/mem0-manager.js +77 -0
  105. package/dist/memory/mem0-manager.js.map +1 -0
  106. package/dist/memory/pgvector-store.d.ts +22 -0
  107. package/dist/memory/pgvector-store.d.ts.map +1 -0
  108. package/dist/memory/pgvector-store.js +89 -0
  109. package/dist/memory/pgvector-store.js.map +1 -0
  110. package/dist/orchestration/channel.d.ts +18 -0
  111. package/dist/orchestration/channel.d.ts.map +1 -0
  112. package/dist/orchestration/channel.js +2 -0
  113. package/dist/orchestration/channel.js.map +1 -0
  114. package/dist/orchestration/executor.d.ts +19 -0
  115. package/dist/orchestration/executor.d.ts.map +1 -0
  116. package/dist/orchestration/executor.js +2 -0
  117. package/dist/orchestration/executor.js.map +1 -0
  118. package/dist/orchestration/index.d.ts +13 -0
  119. package/dist/orchestration/index.d.ts.map +1 -0
  120. package/dist/orchestration/index.js +9 -0
  121. package/dist/orchestration/index.js.map +1 -0
  122. package/dist/orchestration/intent.d.ts +49 -0
  123. package/dist/orchestration/intent.d.ts.map +1 -0
  124. package/dist/orchestration/intent.js +57 -0
  125. package/dist/orchestration/intent.js.map +1 -0
  126. package/dist/orchestration/orchestrator.d.ts +59 -0
  127. package/dist/orchestration/orchestrator.d.ts.map +1 -0
  128. package/dist/orchestration/orchestrator.js +216 -0
  129. package/dist/orchestration/orchestrator.js.map +1 -0
  130. package/dist/orchestration/pending.d.ts +28 -0
  131. package/dist/orchestration/pending.d.ts.map +1 -0
  132. package/dist/orchestration/pending.js +32 -0
  133. package/dist/orchestration/pending.js.map +1 -0
  134. package/dist/orchestration/result.d.ts +24 -0
  135. package/dist/orchestration/result.d.ts.map +1 -0
  136. package/dist/orchestration/result.js +2 -0
  137. package/dist/orchestration/result.js.map +1 -0
  138. package/dist/orchestration/session-state.d.ts +24 -0
  139. package/dist/orchestration/session-state.d.ts.map +1 -0
  140. package/dist/orchestration/session-state.js +19 -0
  141. package/dist/orchestration/session-state.js.map +1 -0
  142. package/dist/orchestration/trace.d.ts +20 -0
  143. package/dist/orchestration/trace.d.ts.map +1 -0
  144. package/dist/orchestration/trace.js +2 -0
  145. package/dist/orchestration/trace.js.map +1 -0
  146. package/dist/session/base.d.ts +7 -0
  147. package/dist/session/base.d.ts.map +1 -0
  148. package/dist/session/base.js +2 -0
  149. package/dist/session/base.js.map +1 -0
  150. package/dist/session/in-memory-store.d.ts +9 -0
  151. package/dist/session/in-memory-store.d.ts.map +1 -0
  152. package/dist/session/in-memory-store.js +13 -0
  153. package/dist/session/in-memory-store.js.map +1 -0
  154. package/dist/session/redis-store.d.ts +16 -0
  155. package/dist/session/redis-store.d.ts.map +1 -0
  156. package/dist/session/redis-store.js +29 -0
  157. package/dist/session/redis-store.js.map +1 -0
  158. package/dist/skills/base.d.ts +38 -0
  159. package/dist/skills/base.d.ts.map +1 -0
  160. package/dist/skills/base.js +24 -0
  161. package/dist/skills/base.js.map +1 -0
  162. package/dist/skills/registry.d.ts +11 -0
  163. package/dist/skills/registry.d.ts.map +1 -0
  164. package/dist/skills/registry.js +37 -0
  165. package/dist/skills/registry.js.map +1 -0
  166. package/dist/skills/selectors.d.ts +23 -0
  167. package/dist/skills/selectors.d.ts.map +1 -0
  168. package/dist/skills/selectors.js +52 -0
  169. package/dist/skills/selectors.js.map +1 -0
  170. package/dist/tools/base.d.ts +34 -0
  171. package/dist/tools/base.d.ts.map +1 -0
  172. package/dist/tools/base.js +22 -0
  173. package/dist/tools/base.js.map +1 -0
  174. package/dist/tools/vercel-adapter.d.ts +17 -0
  175. package/dist/tools/vercel-adapter.d.ts.map +1 -0
  176. package/dist/tools/vercel-adapter.js +66 -0
  177. package/dist/tools/vercel-adapter.js.map +1 -0
  178. package/dist/tracing/collector.d.ts +16 -0
  179. package/dist/tracing/collector.d.ts.map +1 -0
  180. package/dist/tracing/collector.js +92 -0
  181. package/dist/tracing/collector.js.map +1 -0
  182. package/dist/tracing/exporters/jsonl.d.ts +13 -0
  183. package/dist/tracing/exporters/jsonl.d.ts.map +1 -0
  184. package/dist/tracing/exporters/jsonl.js +14 -0
  185. package/dist/tracing/exporters/jsonl.js.map +1 -0
  186. package/dist/tracing/trace.d.ts +34 -0
  187. package/dist/tracing/trace.d.ts.map +1 -0
  188. package/dist/tracing/trace.js +28 -0
  189. package/dist/tracing/trace.js.map +1 -0
  190. package/dist/types.d.ts +77 -0
  191. package/dist/types.d.ts.map +1 -0
  192. package/dist/types.js +7 -0
  193. package/dist/types.js.map +1 -0
  194. package/dist/utils/math.d.ts +3 -0
  195. package/dist/utils/math.d.ts.map +1 -0
  196. package/dist/utils/math.js +14 -0
  197. package/dist/utils/math.js.map +1 -0
  198. package/dist-cjs/agent.js +581 -0
  199. package/dist-cjs/compression/base.js +2 -0
  200. package/dist-cjs/compression/compressor.js +55 -0
  201. package/dist-cjs/compression/in-memory-store.js +16 -0
  202. package/dist-cjs/decision/index.js +9 -0
  203. package/dist-cjs/decision/llm-structured-classifier.js +47 -0
  204. package/dist-cjs/decision/tool-planner.js +38 -0
  205. package/dist-cjs/decision/types.js +15 -0
  206. package/dist-cjs/event-bus.js +37 -0
  207. package/dist-cjs/guardrails/base.js +2 -0
  208. package/dist-cjs/guardrails/keyword.js +40 -0
  209. package/dist-cjs/index.js +84 -0
  210. package/dist-cjs/intent/base.js +2 -0
  211. package/dist-cjs/intent/llm-classifier.js +52 -0
  212. package/dist-cjs/intent/tool-calling-classifier.js +59 -0
  213. package/dist-cjs/knowledge/base.js +12 -0
  214. package/dist-cjs/knowledge/chroma-store.js +106 -0
  215. package/dist-cjs/knowledge/contextualizer.js +50 -0
  216. package/dist-cjs/knowledge/graph-store.js +152 -0
  217. package/dist-cjs/knowledge/hybrid-store.js +42 -0
  218. package/dist-cjs/knowledge/in-memory-store.js +57 -0
  219. package/dist-cjs/knowledge/pgvector-store.js +71 -0
  220. package/dist-cjs/memory/base.js +11 -0
  221. package/dist-cjs/memory/in-memory-store.js +38 -0
  222. package/dist-cjs/memory/manager.js +124 -0
  223. package/dist-cjs/memory/mem0-manager.js +113 -0
  224. package/dist-cjs/memory/pgvector-store.js +92 -0
  225. package/dist-cjs/orchestration/channel.js +2 -0
  226. package/dist-cjs/orchestration/executor.js +2 -0
  227. package/dist-cjs/orchestration/index.js +17 -0
  228. package/dist-cjs/orchestration/intent.js +61 -0
  229. package/dist-cjs/orchestration/orchestrator.js +219 -0
  230. package/dist-cjs/orchestration/pending.js +36 -0
  231. package/dist-cjs/orchestration/result.js +2 -0
  232. package/dist-cjs/orchestration/session-state.js +22 -0
  233. package/dist-cjs/orchestration/trace.js +2 -0
  234. package/dist-cjs/session/base.js +2 -0
  235. package/dist-cjs/session/in-memory-store.js +16 -0
  236. package/dist-cjs/session/redis-store.js +32 -0
  237. package/dist-cjs/skills/base.js +27 -0
  238. package/dist-cjs/skills/registry.js +40 -0
  239. package/dist-cjs/skills/selectors.js +56 -0
  240. package/dist-cjs/tools/base.js +24 -0
  241. package/dist-cjs/tools/vercel-adapter.js +69 -0
  242. package/dist-cjs/tracing/collector.js +95 -0
  243. package/dist-cjs/tracing/exporters/jsonl.js +17 -0
  244. package/dist-cjs/tracing/trace.js +31 -0
  245. package/dist-cjs/types.js +9 -0
  246. package/dist-cjs/utils/math.js +17 -0
  247. package/package.json +70 -0
package/dist/agent.js ADDED
@@ -0,0 +1,578 @@
1
+ import { generateText, streamText, stepCountIs, } from "ai";
2
+ import { v4 as uuidv4 } from "uuid";
3
+ import { normalizeUsage } from "./types.js";
4
+ import { DecisionError } from "./decision/types.js";
5
+ import { ToolPlanner } from "./decision/tool-planner.js";
6
+ import { EventBus } from "./event-bus.js";
7
+ import { toVercelTools } from "./tools/vercel-adapter.js";
8
+ import { SkillRegistry } from "./skills/registry.js";
9
+ import { TraceCollector } from "./tracing/collector.js";
10
+ import { ContextCompressor } from "./compression/compressor.js";
11
+ import { InMemorySummaryStore } from "./compression/in-memory-store.js";
12
+ const FALLBACK_RESPONSE = "抱歉,我剛剛出了一點狀況,可以再說一次嗎?";
13
+ export class NaruAgent {
14
+ model;
15
+ name;
16
+ instructions;
17
+ config;
18
+ eventBus;
19
+ skillRegistry = null;
20
+ traceCollector = null;
21
+ contextCompressor = null;
22
+ traceExporters;
23
+ constructor(config) {
24
+ this.model = config.model;
25
+ this.name = config.name ?? "assistant";
26
+ this.instructions = config.instructions ?? [];
27
+ this.config = config;
28
+ this.eventBus = config.eventBus ?? new EventBus();
29
+ this.traceExporters = config.traceExporters ?? [];
30
+ // Skills
31
+ if (config.skills && config.skills.length > 0) {
32
+ this.skillRegistry = new SkillRegistry(config.skills, config.skillSelector, config.maxActiveSkills ?? 3);
33
+ }
34
+ // Tracing
35
+ if (this.traceExporters.length > 0) {
36
+ this.traceCollector = new TraceCollector(this.eventBus);
37
+ }
38
+ // Context compression
39
+ if (config.contextCompression) {
40
+ const summaryStore = config.summaryStore ?? new InMemorySummaryStore();
41
+ const summaryModel = config.summaryModel ?? config.model;
42
+ this.contextCompressor = new ContextCompressor({
43
+ summaryStore,
44
+ summaryModel,
45
+ keepLastRounds: config.compressionKeepLastRounds ?? 5,
46
+ thresholdRounds: config.compressionThresholdRounds ?? 5,
47
+ });
48
+ }
49
+ }
50
+ /**
51
+ * Main chat method — full orchestration loop.
52
+ */
53
+ async chat(message, options) {
54
+ const startTime = Date.now();
55
+ const userId = options?.userId;
56
+ const sessionId = options?.sessionId ?? uuidv4();
57
+ const timings = {};
58
+ // Start trace
59
+ const traceId = this.traceCollector?.startTrace(message, userId, sessionId);
60
+ // === 1. Input Guardrails ===
61
+ if (this.config.guardrails) {
62
+ for (const guardrail of this.config.guardrails) {
63
+ const result = await guardrail.checkInput(message);
64
+ if (!result.passed) {
65
+ const naruResult = this.makeResult({
66
+ content: result.reason ?? "Blocked.",
67
+ blocked: true,
68
+ sessionId,
69
+ traceId: traceId ?? null,
70
+ });
71
+ this.traceCollector?.endTrace(naruResult);
72
+ return naruResult;
73
+ }
74
+ }
75
+ }
76
+ // === 2. Prefetch ===
77
+ const prefetchStart = Date.now();
78
+ const prefetched = await this.prefetch(message, sessionId, options);
79
+ timings.prefetch = Date.now() - prefetchStart;
80
+ const { intent, activeTools } = prefetched;
81
+ // === 3. Load Session History ===
82
+ let history = [];
83
+ if (this.config.sessionStore && sessionId) {
84
+ const stored = await this.config.sessionStore.get(sessionId);
85
+ if (stored) {
86
+ const limit = this.config.numHistoryMessages;
87
+ history = limit ? stored.slice(-limit) : stored;
88
+ }
89
+ }
90
+ // === 4. LLM Call ===
91
+ this.eventBus.emit("before_llm_call");
92
+ const llmStart = Date.now();
93
+ const vercelTools = activeTools.length > 0 ? toVercelTools(activeTools) : undefined;
94
+ const toolChoice = activeTools.length > 0
95
+ ? this.resolveToolChoice({
96
+ message,
97
+ userId,
98
+ sessionId,
99
+ intent,
100
+ activeTools,
101
+ })
102
+ : undefined;
103
+ let content = "";
104
+ const toolCallNames = [];
105
+ let usage = {
106
+ promptTokens: 0,
107
+ completionTokens: 0,
108
+ totalTokens: 0,
109
+ };
110
+ try {
111
+ const result = await generateText({
112
+ model: this.model,
113
+ system: prefetched.systemPrompt,
114
+ messages: [
115
+ ...history,
116
+ { role: "user", content: message },
117
+ ],
118
+ tools: vercelTools,
119
+ toolChoice,
120
+ stopWhen: stepCountIs(this.config.toolCallLimit ?? 10),
121
+ temperature: this.config.temperature ?? 0.7,
122
+ providerOptions: this.config.promptCaching ? {
123
+ anthropic: { cacheControl: true },
124
+ } : undefined,
125
+ });
126
+ content = result.text || "";
127
+ // Extract tool calls from all steps
128
+ for (const step of result.steps ?? []) {
129
+ for (const tc of step.toolCalls ?? []) {
130
+ toolCallNames.push(tc.toolName);
131
+ }
132
+ }
133
+ usage = normalizeUsage(result.usage);
134
+ }
135
+ catch (err) {
136
+ console.error("[NaruAgent] generateText failed:", err);
137
+ content = FALLBACK_RESPONSE;
138
+ }
139
+ timings.llm = Date.now() - llmStart;
140
+ this.eventBus.emit("after_llm_call");
141
+ // === 5. Output Guardrails ===
142
+ if (this.config.guardrails && content) {
143
+ for (const guardrail of this.config.guardrails) {
144
+ const result = await guardrail.checkOutput(content);
145
+ if (!result.passed) {
146
+ content = result.modifiedText ?? "I cannot provide that response.";
147
+ }
148
+ }
149
+ }
150
+ // === 6. Build Result ===
151
+ timings.total = Date.now() - startTime;
152
+ const naruResult = this.makeResult({
153
+ content,
154
+ blocked: false,
155
+ usage,
156
+ intent,
157
+ toolCalls: toolCallNames,
158
+ timings,
159
+ sessionId,
160
+ traceId: traceId ?? null,
161
+ });
162
+ // === 7. Background Tasks ===
163
+ const updatedHistory = [
164
+ ...history,
165
+ { role: "user", content: message },
166
+ { role: "assistant", content },
167
+ ];
168
+ if (this.config.sessionStore && sessionId) {
169
+ this.config.sessionStore.save(sessionId, updatedHistory).catch(() => { });
170
+ }
171
+ if (this.config.memoryManager && userId) {
172
+ this.config.memoryManager
173
+ .add(userId, [
174
+ { role: "user", content: message },
175
+ { role: "assistant", content },
176
+ ])
177
+ .catch(() => { });
178
+ }
179
+ if (this.contextCompressor && sessionId) {
180
+ this.contextCompressor
181
+ .maybeCompress(sessionId, updatedHistory)
182
+ .catch(() => { });
183
+ }
184
+ // Trace export
185
+ const trace = this.traceCollector?.endTrace(naruResult) ?? null;
186
+ naruResult.trace = trace;
187
+ if (trace) {
188
+ for (const exporter of this.traceExporters) {
189
+ exporter.export(trace).catch(() => { });
190
+ }
191
+ }
192
+ this.eventBus.emit("chat_complete", naruResult);
193
+ return naruResult;
194
+ }
195
+ /**
196
+ * Shared prefetch logic for chat() and chatStream().
197
+ */
198
+ async prefetch(message, sessionId, options, skip) {
199
+ const userId = options?.userId;
200
+ const prefetchTimeout = this.config.prefetchTimeout ?? 10000;
201
+ // === Parallel Prefetch ===
202
+ const prefetchTasks = {};
203
+ if (this.config.memoryManager && userId) {
204
+ prefetchTasks.memory = this.config.memoryManager
205
+ .getContextString(userId, message)
206
+ .catch(() => "");
207
+ }
208
+ if (this.config.intentClassifier && !skip?.intent) {
209
+ prefetchTasks.intent = this.config.intentClassifier
210
+ .classify(message)
211
+ .catch(() => ({ needsKnowledge: true, needsTools: true, raw: "YY" }));
212
+ }
213
+ if (this.contextCompressor && sessionId) {
214
+ prefetchTasks.summary = this.contextCompressor
215
+ .getSummary(sessionId)
216
+ .catch(() => null);
217
+ }
218
+ if (this.config.prefetchHooks) {
219
+ for (let i = 0; i < this.config.prefetchHooks.length; i++) {
220
+ const hook = this.config.prefetchHooks[i];
221
+ prefetchTasks[`hook_${i}`] = hook(message, userId).catch(() => "");
222
+ }
223
+ }
224
+ const prefetchKeys = Object.keys(prefetchTasks);
225
+ const prefetchResults = await Promise.allSettled(prefetchKeys.map((key) => Promise.race([
226
+ prefetchTasks[key],
227
+ new Promise((_, reject) => setTimeout(() => reject(new Error("timeout")), prefetchTimeout)),
228
+ ])));
229
+ const prefetchData = {};
230
+ for (let i = 0; i < prefetchKeys.length; i++) {
231
+ const result = prefetchResults[i];
232
+ prefetchData[prefetchKeys[i]] =
233
+ result.status === "fulfilled" ? result.value : null;
234
+ }
235
+ const memoryContext = prefetchData.memory ?? "";
236
+ const intent = prefetchData.intent ?? null;
237
+ const summaryData = prefetchData.summary;
238
+ if (memoryContext)
239
+ this.eventBus.emit("memory_retrieved", { memoryContext });
240
+ if (intent)
241
+ this.eventBus.emit("intent_classified", intent);
242
+ // === Knowledge Retrieval ===
243
+ let knowledgeContext = "";
244
+ if (this.config.knowledgeStore &&
245
+ (intent?.needsKnowledge ?? true)) {
246
+ try {
247
+ const results = await this.config.knowledgeStore.search(message, this.config.knowledgeTopK ?? 3);
248
+ knowledgeContext = this.config.knowledgeStore.formatContext(results, this.config.knowledgeMinScore ?? 0.3);
249
+ if (knowledgeContext) {
250
+ this.eventBus.emit("knowledge_retrieved", { knowledgeContext });
251
+ }
252
+ }
253
+ catch {
254
+ // graceful degradation
255
+ }
256
+ }
257
+ // === Skill Execution ===
258
+ let skillResults = [];
259
+ if (this.skillRegistry && !skip?.skills) {
260
+ try {
261
+ const skillContext = {
262
+ message,
263
+ userId,
264
+ sessionId,
265
+ memoryContext,
266
+ knowledgeStore: this.config.knowledgeStore,
267
+ };
268
+ skillResults = await this.skillRegistry.runSkills(message, skillContext);
269
+ }
270
+ catch {
271
+ // graceful degradation
272
+ }
273
+ }
274
+ // === Tool Calling Classification ===
275
+ let toolCallingContext = "";
276
+ if (this.config.toolCallingClassifier &&
277
+ !skip?.toolCalling &&
278
+ this.getClassifierTools().length > 0) {
279
+ try {
280
+ const tcResult = await this.config.toolCallingClassifier.classify(message, this.getClassifierTools());
281
+ if (tcResult.toolResults.length > 0) {
282
+ toolCallingContext = tcResult.toolResults
283
+ .map((r) => `[${r.tool}]: ${r.result}`)
284
+ .join("\n");
285
+ this.eventBus.emit("tool_calling_classified", tcResult);
286
+ }
287
+ }
288
+ catch {
289
+ // graceful degradation
290
+ }
291
+ }
292
+ // === Build Dynamic Instructions ===
293
+ const dynamicInstructions = [...this.instructions];
294
+ if (summaryData?.summaryText) {
295
+ dynamicInstructions.push(`【Conversation History Summary】\n${summaryData.summaryText}`);
296
+ }
297
+ if (knowledgeContext) {
298
+ dynamicInstructions.push(`【Reference Knowledge】\n${knowledgeContext}`);
299
+ }
300
+ if (memoryContext) {
301
+ dynamicInstructions.push(memoryContext);
302
+ }
303
+ for (const key of prefetchKeys) {
304
+ if (key.startsWith("hook_") && prefetchData[key]) {
305
+ dynamicInstructions.push(prefetchData[key]);
306
+ }
307
+ }
308
+ let overridePrompt = null;
309
+ for (const sr of skillResults) {
310
+ if (sr.overrideSystemPrompt) {
311
+ overridePrompt = sr.overrideSystemPrompt;
312
+ }
313
+ if (sr.promptInjection) {
314
+ dynamicInstructions.push(sr.promptInjection);
315
+ }
316
+ }
317
+ if (toolCallingContext) {
318
+ dynamicInstructions.push(`【Tool Results】\n${toolCallingContext}`);
319
+ }
320
+ // === Prepare Tools ===
321
+ const activeTools = [];
322
+ if (intent?.needsTools ?? true) {
323
+ if (this.config.tools)
324
+ activeTools.push(...this.config.tools);
325
+ }
326
+ if (this.config.alwaysTools)
327
+ activeTools.push(...this.config.alwaysTools);
328
+ for (const sr of skillResults) {
329
+ activeTools.push(...sr.extraTools);
330
+ }
331
+ const systemPrompt = overridePrompt ?? dynamicInstructions.join("\n\n");
332
+ return {
333
+ memoryContext,
334
+ intent,
335
+ summaryData,
336
+ knowledgeContext,
337
+ skillResults,
338
+ toolCallingContext,
339
+ dynamicInstructions,
340
+ activeTools,
341
+ systemPrompt,
342
+ };
343
+ }
344
+ /**
345
+ * Streaming chat — returns an async iterable of text stream parts.
346
+ */
347
+ async *chatStream(message, options) {
348
+ const sessionId = options?.sessionId ?? uuidv4();
349
+ const userId = options?.userId;
350
+ // === Input Guardrails ===
351
+ if (this.config.guardrails) {
352
+ for (const guardrail of this.config.guardrails) {
353
+ const result = await guardrail.checkInput(message);
354
+ if (!result.passed) {
355
+ yield { type: "text-delta", text: result.reason ?? "Blocked." };
356
+ return;
357
+ }
358
+ }
359
+ }
360
+ // === Prefetch ===
361
+ const prefetched = await this.prefetch(message, sessionId, options);
362
+ // Load history
363
+ let history = [];
364
+ if (this.config.sessionStore && sessionId) {
365
+ const stored = await this.config.sessionStore.get(sessionId);
366
+ if (stored) {
367
+ const limit = this.config.numHistoryMessages;
368
+ history = limit ? stored.slice(-limit) : stored;
369
+ }
370
+ }
371
+ const vercelTools = prefetched.activeTools.length > 0
372
+ ? toVercelTools(prefetched.activeTools)
373
+ : undefined;
374
+ const toolChoice = prefetched.activeTools.length > 0
375
+ ? this.resolveToolChoice({
376
+ message,
377
+ userId,
378
+ sessionId,
379
+ intent: prefetched.intent,
380
+ activeTools: prefetched.activeTools,
381
+ })
382
+ : undefined;
383
+ const result = streamText({
384
+ model: this.model,
385
+ system: prefetched.systemPrompt,
386
+ messages: [
387
+ ...history,
388
+ { role: "user", content: message },
389
+ ],
390
+ tools: vercelTools,
391
+ toolChoice,
392
+ stopWhen: stepCountIs(this.config.toolCallLimit ?? 10),
393
+ temperature: this.config.temperature ?? 0.7,
394
+ providerOptions: this.config.promptCaching ? {
395
+ anthropic: { cacheControl: true },
396
+ } : undefined,
397
+ });
398
+ let fullContent = "";
399
+ for await (const part of result.fullStream) {
400
+ if (part.type === "text-delta") {
401
+ fullContent += part.text;
402
+ }
403
+ yield part;
404
+ }
405
+ // === Background: save session, memory, compression ===
406
+ const updatedHistory = [
407
+ ...history,
408
+ { role: "user", content: message },
409
+ { role: "assistant", content: fullContent },
410
+ ];
411
+ if (this.config.sessionStore && sessionId) {
412
+ this.config.sessionStore.save(sessionId, updatedHistory).catch(() => { });
413
+ }
414
+ if (this.config.memoryManager && userId) {
415
+ this.config.memoryManager
416
+ .add(userId, [
417
+ { role: "user", content: message },
418
+ { role: "assistant", content: fullContent },
419
+ ])
420
+ .catch(() => { });
421
+ }
422
+ if (this.contextCompressor && sessionId) {
423
+ this.contextCompressor
424
+ .maybeCompress(sessionId, updatedHistory)
425
+ .catch(() => { });
426
+ }
427
+ }
428
+ /**
429
+ * Structured decision mode — uses full prefetch context (memory, summary,
430
+ * knowledge, hooks) but returns a typed JSON decision instead of generating
431
+ * a natural-language response or executing tools.
432
+ */
433
+ async decide(message, classifier, options) {
434
+ const startTime = Date.now();
435
+ const userId = options?.userId;
436
+ const sessionId = options?.sessionId ?? uuidv4();
437
+ const timings = {};
438
+ // Start trace
439
+ const traceId = this.traceCollector?.startTrace(message, userId, sessionId) ?? null;
440
+ // === 1. Input Guardrails ===
441
+ if (this.config.guardrails) {
442
+ for (const guardrail of this.config.guardrails) {
443
+ const result = await guardrail.checkInput(message);
444
+ if (!result.passed) {
445
+ throw new DecisionError(result.reason ?? "Blocked by input guardrail.");
446
+ }
447
+ }
448
+ }
449
+ // === 2. Prefetch (skip intent/skills/toolCalling — not needed for decide) ===
450
+ const prefetchStart = Date.now();
451
+ const prefetched = await this.prefetch(message, sessionId, { userId }, {
452
+ intent: true,
453
+ skills: true,
454
+ toolCalling: true,
455
+ });
456
+ timings.prefetch = Date.now() - prefetchStart;
457
+ // === 3. Assemble StructuredClassifierInput ===
458
+ // Only pass hook-injected instructions as extraContext to avoid
459
+ // double-injecting summary/memory/knowledge (already in dedicated fields).
460
+ const hookInstructions = this.instructions.length > 0
461
+ ? [...this.instructions]
462
+ : [];
463
+ for (const di of prefetched.dynamicInstructions) {
464
+ // Skip items already covered by dedicated fields
465
+ if (di === prefetched.memoryContext)
466
+ continue;
467
+ if (prefetched.summaryData?.summaryText && di.includes(prefetched.summaryData.summaryText))
468
+ continue;
469
+ if (prefetched.knowledgeContext && di.includes(prefetched.knowledgeContext))
470
+ continue;
471
+ if (!hookInstructions.includes(di))
472
+ hookInstructions.push(di);
473
+ }
474
+ const classifierInput = {
475
+ message,
476
+ sessionId,
477
+ userId,
478
+ summary: prefetched.summaryData?.summaryText ?? null,
479
+ memoryContext: prefetched.memoryContext || undefined,
480
+ knowledgeContext: prefetched.knowledgeContext || undefined,
481
+ extraContext: hookInstructions.length > 0 ? hookInstructions : undefined,
482
+ };
483
+ // === 4. Classify + Optional Tool Planning (parallel) ===
484
+ const classifyStart = Date.now();
485
+ const classifyPromise = classifier.classify(classifierInput);
486
+ const toolPlanPromise = options?.includeToolPlan
487
+ ? (async () => {
488
+ const planStart = Date.now();
489
+ const allTools = this.getClassifierTools();
490
+ if (allTools.length === 0)
491
+ return undefined;
492
+ const planner = new ToolPlanner({ model: this.model });
493
+ const plan = await planner.plan(message, allTools);
494
+ timings.toolPlan = Date.now() - planStart;
495
+ return plan;
496
+ })().catch(() => undefined)
497
+ : Promise.resolve(undefined);
498
+ let classifierOutput;
499
+ let toolPlan;
500
+ try {
501
+ [classifierOutput, toolPlan] = await Promise.all([classifyPromise, toolPlanPromise]);
502
+ }
503
+ catch (err) {
504
+ throw new DecisionError("Classifier failed", err, err instanceof Error ? err.message : String(err));
505
+ }
506
+ timings.classify = Date.now() - classifyStart;
507
+ // === 5. Build Result ===
508
+ timings.total = Date.now() - startTime;
509
+ const decisionResult = {
510
+ decision: classifierOutput.result,
511
+ rawText: classifierOutput.rawText ?? JSON.stringify(classifierOutput.result),
512
+ usage: {
513
+ promptTokens: classifierOutput.usage?.promptTokens ?? 0,
514
+ completionTokens: classifierOutput.usage?.completionTokens ?? 0,
515
+ totalTokens: classifierOutput.usage?.totalTokens ?? 0,
516
+ },
517
+ timings,
518
+ sessionId,
519
+ traceId,
520
+ trace: {
521
+ classifier: classifier.name ?? "unknown",
522
+ usedSummary: !!prefetched.summaryData?.summaryText,
523
+ usedMemory: !!prefetched.memoryContext,
524
+ usedKnowledge: !!prefetched.knowledgeContext,
525
+ toolPlan,
526
+ classifierTrace: classifierOutput.trace,
527
+ },
528
+ };
529
+ // === 7. Background: memory (user message only, no assistant response) ===
530
+ if (this.config.memoryManager && userId) {
531
+ this.config.memoryManager
532
+ .add(userId, [{ role: "user", content: message }])
533
+ .catch(() => { });
534
+ }
535
+ return decisionResult;
536
+ }
537
+ getEventBus() {
538
+ return this.eventBus;
539
+ }
540
+ makeResult(partial) {
541
+ return {
542
+ blocked: false,
543
+ usage: {
544
+ promptTokens: 0,
545
+ completionTokens: 0,
546
+ totalTokens: 0,
547
+ },
548
+ intent: null,
549
+ toolCalls: [],
550
+ timings: {},
551
+ sessionId: null,
552
+ traceId: null,
553
+ trace: null,
554
+ ...partial,
555
+ };
556
+ }
557
+ resolveToolChoice(context) {
558
+ return this.config.toolChoiceResolver?.(context) ?? this.config.toolChoice;
559
+ }
560
+ getClassifierTools() {
561
+ const tools = [];
562
+ if (this.config.tools)
563
+ tools.push(...this.config.tools);
564
+ if (this.config.alwaysTools)
565
+ tools.push(...this.config.alwaysTools);
566
+ return dedupeToolsByName(tools);
567
+ }
568
+ }
569
+ function dedupeToolsByName(tools) {
570
+ const seen = new Set();
571
+ return tools.filter((tool) => {
572
+ if (seen.has(tool.name))
573
+ return false;
574
+ seen.add(tool.name);
575
+ return true;
576
+ });
577
+ }
578
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface CompressedSummary {
2
+ summaryText: string;
3
+ compressedThroughRound: number;
4
+ createdAt: number;
5
+ modelUsed: string;
6
+ }
7
+ export interface BaseSummaryStore {
8
+ get(sessionId: string): Promise<CompressedSummary | null>;
9
+ save(sessionId: string, summary: CompressedSummary): Promise<void>;
10
+ delete(sessionId: string): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/compression/base.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IAC1D,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/compression/base.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import { type LanguageModel, type ModelMessage } from "ai";
2
+ import type { BaseSummaryStore, CompressedSummary } from "./base.js";
3
+ export declare class ContextCompressor {
4
+ private summaryStore;
5
+ private summaryModel;
6
+ private keepLastRounds;
7
+ private thresholdRounds;
8
+ constructor(config: {
9
+ summaryStore: BaseSummaryStore;
10
+ summaryModel: LanguageModel;
11
+ keepLastRounds?: number;
12
+ thresholdRounds?: number;
13
+ });
14
+ getSummary(sessionId: string): Promise<CompressedSummary | null>;
15
+ /**
16
+ * Compress conversation history if it exceeds threshold.
17
+ */
18
+ maybeCompress(sessionId: string, messages: ModelMessage[]): Promise<void>;
19
+ }
20
+ //# sourceMappingURL=compressor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compressor.d.ts","sourceRoot":"","sources":["../../src/compression/compressor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,IAAI,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAErE,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,eAAe,CAAS;gBAEpB,MAAM,EAAE;QAClB,YAAY,EAAE,gBAAgB,CAAC;QAC/B,YAAY,EAAE,aAAa,CAAC;QAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B;IAOK,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAItE;;OAEG;IACG,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,YAAY,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC;CAqCjB"}