@falai/agent 0.4.0 → 0.5.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 (285) hide show
  1. package/README.md +21 -74
  2. package/dist/cjs/core/Agent.d.ts +22 -29
  3. package/dist/cjs/core/Agent.d.ts.map +1 -1
  4. package/dist/cjs/core/Agent.js +465 -275
  5. package/dist/cjs/core/Agent.js.map +1 -1
  6. package/dist/cjs/core/Events.d.ts +10 -1
  7. package/dist/cjs/core/Events.d.ts.map +1 -1
  8. package/dist/cjs/core/Events.js +3 -2
  9. package/dist/cjs/core/Events.js.map +1 -1
  10. package/dist/cjs/core/PersistenceManager.d.ts +19 -0
  11. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  12. package/dist/cjs/core/PersistenceManager.js +57 -0
  13. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  14. package/dist/cjs/core/PromptComposer.d.ts +24 -0
  15. package/dist/cjs/core/PromptComposer.d.ts.map +1 -0
  16. package/dist/cjs/core/PromptComposer.js +127 -0
  17. package/dist/cjs/core/PromptComposer.js.map +1 -0
  18. package/dist/cjs/core/ResponseEngine.d.ts +19 -0
  19. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -0
  20. package/dist/cjs/core/ResponseEngine.js +51 -0
  21. package/dist/cjs/core/ResponseEngine.js.map +1 -0
  22. package/dist/cjs/core/Route.d.ts +18 -12
  23. package/dist/cjs/core/Route.d.ts.map +1 -1
  24. package/dist/cjs/core/Route.js +15 -9
  25. package/dist/cjs/core/Route.js.map +1 -1
  26. package/dist/cjs/core/RoutingEngine.d.ts +38 -0
  27. package/dist/cjs/core/RoutingEngine.d.ts.map +1 -0
  28. package/dist/cjs/core/RoutingEngine.js +110 -0
  29. package/dist/cjs/core/RoutingEngine.js.map +1 -0
  30. package/dist/cjs/core/State.d.ts +15 -4
  31. package/dist/cjs/core/State.d.ts.map +1 -1
  32. package/dist/cjs/core/State.js +21 -2
  33. package/dist/cjs/core/State.js.map +1 -1
  34. package/dist/cjs/core/ToolExecutor.d.ts +29 -0
  35. package/dist/cjs/core/ToolExecutor.d.ts.map +1 -0
  36. package/dist/cjs/core/ToolExecutor.js +73 -0
  37. package/dist/cjs/core/ToolExecutor.js.map +1 -0
  38. package/dist/cjs/core/Transition.d.ts +5 -5
  39. package/dist/cjs/core/Transition.d.ts.map +1 -1
  40. package/dist/cjs/core/Transition.js.map +1 -1
  41. package/dist/cjs/index.d.ts +6 -8
  42. package/dist/cjs/index.d.ts.map +1 -1
  43. package/dist/cjs/index.js +8 -10
  44. package/dist/cjs/index.js.map +1 -1
  45. package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -1
  46. package/dist/cjs/providers/AnthropicProvider.js +10 -13
  47. package/dist/cjs/providers/AnthropicProvider.js.map +1 -1
  48. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  49. package/dist/cjs/providers/GeminiProvider.js +12 -8
  50. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  51. package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
  52. package/dist/cjs/providers/OpenAIProvider.js +10 -53
  53. package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
  54. package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
  55. package/dist/cjs/providers/OpenRouterProvider.js +10 -53
  56. package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
  57. package/dist/cjs/types/agent.d.ts +13 -9
  58. package/dist/cjs/types/agent.d.ts.map +1 -1
  59. package/dist/cjs/types/ai.d.ts +8 -2
  60. package/dist/cjs/types/ai.d.ts.map +1 -1
  61. package/dist/cjs/types/history.d.ts +8 -0
  62. package/dist/cjs/types/history.d.ts.map +1 -1
  63. package/dist/cjs/types/index.d.ts +0 -3
  64. package/dist/cjs/types/index.d.ts.map +1 -1
  65. package/dist/cjs/types/index.js +1 -3
  66. package/dist/cjs/types/index.js.map +1 -1
  67. package/dist/cjs/types/route.d.ts +39 -4
  68. package/dist/cjs/types/route.d.ts.map +1 -1
  69. package/dist/cjs/types/routing.d.ts +16 -0
  70. package/dist/cjs/types/routing.d.ts.map +1 -0
  71. package/dist/cjs/types/routing.js +3 -0
  72. package/dist/cjs/types/routing.js.map +1 -0
  73. package/dist/cjs/types/schema.d.ts +22 -0
  74. package/dist/cjs/types/schema.d.ts.map +1 -0
  75. package/dist/cjs/types/schema.js +3 -0
  76. package/dist/cjs/types/schema.js.map +1 -0
  77. package/dist/cjs/types/session.d.ts +72 -0
  78. package/dist/cjs/types/session.d.ts.map +1 -0
  79. package/dist/cjs/types/session.js +140 -0
  80. package/dist/cjs/types/session.js.map +1 -0
  81. package/dist/cjs/types/tool.d.ts +11 -5
  82. package/dist/cjs/types/tool.d.ts.map +1 -1
  83. package/dist/cjs/utils/id.d.ts +0 -5
  84. package/dist/cjs/utils/id.d.ts.map +1 -1
  85. package/dist/cjs/utils/id.js +0 -10
  86. package/dist/cjs/utils/id.js.map +1 -1
  87. package/dist/cjs/utils/schema.d.ts +17 -0
  88. package/dist/cjs/utils/schema.d.ts.map +1 -0
  89. package/dist/cjs/utils/schema.js +32 -0
  90. package/dist/cjs/utils/schema.js.map +1 -0
  91. package/dist/core/Agent.d.ts +22 -29
  92. package/dist/core/Agent.d.ts.map +1 -1
  93. package/dist/core/Agent.js +465 -275
  94. package/dist/core/Agent.js.map +1 -1
  95. package/dist/core/Events.d.ts +10 -1
  96. package/dist/core/Events.d.ts.map +1 -1
  97. package/dist/core/Events.js +3 -2
  98. package/dist/core/Events.js.map +1 -1
  99. package/dist/core/PersistenceManager.d.ts +19 -0
  100. package/dist/core/PersistenceManager.d.ts.map +1 -1
  101. package/dist/core/PersistenceManager.js +57 -0
  102. package/dist/core/PersistenceManager.js.map +1 -1
  103. package/dist/core/PromptComposer.d.ts +24 -0
  104. package/dist/core/PromptComposer.d.ts.map +1 -0
  105. package/dist/core/PromptComposer.js +123 -0
  106. package/dist/core/PromptComposer.js.map +1 -0
  107. package/dist/core/ResponseEngine.d.ts +19 -0
  108. package/dist/core/ResponseEngine.d.ts.map +1 -0
  109. package/dist/core/ResponseEngine.js +47 -0
  110. package/dist/core/ResponseEngine.js.map +1 -0
  111. package/dist/core/Route.d.ts +18 -12
  112. package/dist/core/Route.d.ts.map +1 -1
  113. package/dist/core/Route.js +15 -9
  114. package/dist/core/Route.js.map +1 -1
  115. package/dist/core/RoutingEngine.d.ts +38 -0
  116. package/dist/core/RoutingEngine.d.ts.map +1 -0
  117. package/dist/core/RoutingEngine.js +106 -0
  118. package/dist/core/RoutingEngine.js.map +1 -0
  119. package/dist/core/State.d.ts +15 -4
  120. package/dist/core/State.d.ts.map +1 -1
  121. package/dist/core/State.js +21 -2
  122. package/dist/core/State.js.map +1 -1
  123. package/dist/core/ToolExecutor.d.ts +29 -0
  124. package/dist/core/ToolExecutor.d.ts.map +1 -0
  125. package/dist/core/ToolExecutor.js +69 -0
  126. package/dist/core/ToolExecutor.js.map +1 -0
  127. package/dist/core/Transition.d.ts +5 -5
  128. package/dist/core/Transition.d.ts.map +1 -1
  129. package/dist/core/Transition.js.map +1 -1
  130. package/dist/index.d.ts +6 -8
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +3 -5
  133. package/dist/index.js.map +1 -1
  134. package/dist/providers/AnthropicProvider.d.ts.map +1 -1
  135. package/dist/providers/AnthropicProvider.js +10 -13
  136. package/dist/providers/AnthropicProvider.js.map +1 -1
  137. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  138. package/dist/providers/GeminiProvider.js +12 -8
  139. package/dist/providers/GeminiProvider.js.map +1 -1
  140. package/dist/providers/OpenAIProvider.d.ts.map +1 -1
  141. package/dist/providers/OpenAIProvider.js +10 -53
  142. package/dist/providers/OpenAIProvider.js.map +1 -1
  143. package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
  144. package/dist/providers/OpenRouterProvider.js +10 -53
  145. package/dist/providers/OpenRouterProvider.js.map +1 -1
  146. package/dist/types/agent.d.ts +13 -9
  147. package/dist/types/agent.d.ts.map +1 -1
  148. package/dist/types/ai.d.ts +8 -2
  149. package/dist/types/ai.d.ts.map +1 -1
  150. package/dist/types/history.d.ts +8 -0
  151. package/dist/types/history.d.ts.map +1 -1
  152. package/dist/types/index.d.ts +0 -3
  153. package/dist/types/index.d.ts.map +1 -1
  154. package/dist/types/index.js +0 -1
  155. package/dist/types/index.js.map +1 -1
  156. package/dist/types/route.d.ts +39 -4
  157. package/dist/types/route.d.ts.map +1 -1
  158. package/dist/types/routing.d.ts +16 -0
  159. package/dist/types/routing.d.ts.map +1 -0
  160. package/dist/types/routing.js +2 -0
  161. package/dist/types/routing.js.map +1 -0
  162. package/dist/types/schema.d.ts +22 -0
  163. package/dist/types/schema.d.ts.map +1 -0
  164. package/dist/types/schema.js +2 -0
  165. package/dist/types/schema.js.map +1 -0
  166. package/dist/types/session.d.ts +72 -0
  167. package/dist/types/session.d.ts.map +1 -0
  168. package/dist/types/session.js +132 -0
  169. package/dist/types/session.js.map +1 -0
  170. package/dist/types/tool.d.ts +11 -5
  171. package/dist/types/tool.d.ts.map +1 -1
  172. package/dist/utils/id.d.ts +0 -5
  173. package/dist/utils/id.d.ts.map +1 -1
  174. package/dist/utils/id.js +0 -9
  175. package/dist/utils/id.js.map +1 -1
  176. package/dist/utils/schema.d.ts +17 -0
  177. package/dist/utils/schema.d.ts.map +1 -0
  178. package/dist/utils/schema.js +27 -0
  179. package/dist/utils/schema.js.map +1 -0
  180. package/docs/ADAPTERS.md +83 -3
  181. package/docs/API_REFERENCE.md +95 -104
  182. package/docs/ARCHITECTURE.md +284 -286
  183. package/docs/CONSTRUCTOR_OPTIONS.md +192 -135
  184. package/docs/CONTEXT_MANAGEMENT.md +311 -28
  185. package/docs/CONTRIBUTING.md +1 -1
  186. package/docs/DOMAINS.md +61 -0
  187. package/docs/GETTING_STARTED.md +177 -88
  188. package/docs/PERSISTENCE.md +170 -23
  189. package/docs/README.md +7 -10
  190. package/examples/business-onboarding.ts +21 -9
  191. package/examples/company-qna-agent.ts +508 -0
  192. package/examples/declarative-agent.ts +143 -26
  193. package/examples/domain-scoping.ts +31 -10
  194. package/examples/extracted-data-modification.ts +415 -0
  195. package/examples/healthcare-agent.ts +194 -90
  196. package/examples/openai-agent.ts +67 -25
  197. package/examples/opensearch-persistence.ts +455 -151
  198. package/examples/persistent-onboarding.ts +162 -96
  199. package/examples/prisma-persistence.ts +371 -125
  200. package/examples/redis-persistence.ts +393 -23
  201. package/examples/rules-prohibitions.ts +32 -11
  202. package/examples/streaming-agent.ts +61 -13
  203. package/examples/travel-agent.ts +266 -133
  204. package/package.json +1 -1
  205. package/src/core/Agent.ts +679 -332
  206. package/src/core/Events.ts +12 -2
  207. package/src/core/PersistenceManager.ts +83 -0
  208. package/src/core/PromptComposer.ts +143 -0
  209. package/src/core/ResponseEngine.ts +82 -0
  210. package/src/core/Route.ts +32 -17
  211. package/src/core/RoutingEngine.ts +165 -0
  212. package/src/core/State.ts +55 -15
  213. package/src/core/ToolExecutor.ts +117 -0
  214. package/src/core/Transition.ts +5 -5
  215. package/src/index.ts +12 -21
  216. package/src/providers/AnthropicProvider.ts +10 -13
  217. package/src/providers/GeminiProvider.ts +12 -8
  218. package/src/providers/OpenAIProvider.ts +10 -56
  219. package/src/providers/OpenRouterProvider.ts +10 -56
  220. package/src/types/agent.ts +16 -10
  221. package/src/types/ai.ts +6 -2
  222. package/src/types/history.ts +8 -0
  223. package/src/types/index.ts +0 -11
  224. package/src/types/route.ts +41 -5
  225. package/src/types/routing.ts +18 -0
  226. package/src/types/schema.ts +23 -0
  227. package/src/types/session.ts +207 -0
  228. package/src/types/tool.ts +29 -7
  229. package/src/utils/id.ts +0 -10
  230. package/src/utils/schema.ts +32 -0
  231. package/dist/cjs/core/ConditionEvaluator.d.ts +0 -72
  232. package/dist/cjs/core/ConditionEvaluator.d.ts.map +0 -1
  233. package/dist/cjs/core/ConditionEvaluator.js +0 -272
  234. package/dist/cjs/core/ConditionEvaluator.js.map +0 -1
  235. package/dist/cjs/core/Observation.d.ts +0 -24
  236. package/dist/cjs/core/Observation.d.ts.map +0 -1
  237. package/dist/cjs/core/Observation.js +0 -39
  238. package/dist/cjs/core/Observation.js.map +0 -1
  239. package/dist/cjs/core/PreparationEngine.d.ts +0 -105
  240. package/dist/cjs/core/PreparationEngine.d.ts.map +0 -1
  241. package/dist/cjs/core/PreparationEngine.js +0 -320
  242. package/dist/cjs/core/PreparationEngine.js.map +0 -1
  243. package/dist/cjs/core/PromptBuilder.d.ts +0 -136
  244. package/dist/cjs/core/PromptBuilder.d.ts.map +0 -1
  245. package/dist/cjs/core/PromptBuilder.js +0 -421
  246. package/dist/cjs/core/PromptBuilder.js.map +0 -1
  247. package/dist/cjs/types/observation.d.ts +0 -27
  248. package/dist/cjs/types/observation.d.ts.map +0 -1
  249. package/dist/cjs/types/observation.js +0 -6
  250. package/dist/cjs/types/observation.js.map +0 -1
  251. package/dist/cjs/types/prompt.d.ts +0 -46
  252. package/dist/cjs/types/prompt.d.ts.map +0 -1
  253. package/dist/cjs/types/prompt.js +0 -19
  254. package/dist/cjs/types/prompt.js.map +0 -1
  255. package/dist/core/ConditionEvaluator.d.ts +0 -72
  256. package/dist/core/ConditionEvaluator.d.ts.map +0 -1
  257. package/dist/core/ConditionEvaluator.js +0 -268
  258. package/dist/core/ConditionEvaluator.js.map +0 -1
  259. package/dist/core/Observation.d.ts +0 -24
  260. package/dist/core/Observation.d.ts.map +0 -1
  261. package/dist/core/Observation.js +0 -35
  262. package/dist/core/Observation.js.map +0 -1
  263. package/dist/core/PreparationEngine.d.ts +0 -105
  264. package/dist/core/PreparationEngine.d.ts.map +0 -1
  265. package/dist/core/PreparationEngine.js +0 -316
  266. package/dist/core/PreparationEngine.js.map +0 -1
  267. package/dist/core/PromptBuilder.d.ts +0 -136
  268. package/dist/core/PromptBuilder.d.ts.map +0 -1
  269. package/dist/core/PromptBuilder.js +0 -417
  270. package/dist/core/PromptBuilder.js.map +0 -1
  271. package/dist/types/observation.d.ts +0 -27
  272. package/dist/types/observation.d.ts.map +0 -1
  273. package/dist/types/observation.js +0 -5
  274. package/dist/types/observation.js.map +0 -1
  275. package/dist/types/prompt.d.ts +0 -46
  276. package/dist/types/prompt.d.ts.map +0 -1
  277. package/dist/types/prompt.js +0 -16
  278. package/dist/types/prompt.js.map +0 -1
  279. package/docs/STRUCTURE.md +0 -58
  280. package/src/core/ConditionEvaluator.ts +0 -381
  281. package/src/core/Observation.ts +0 -47
  282. package/src/core/PreparationEngine.ts +0 -500
  283. package/src/core/PromptBuilder.ts +0 -617
  284. package/src/types/observation.ts +0 -29
  285. package/src/types/prompt.ts +0 -49
@@ -1,381 +0,0 @@
1
- /**
2
- * ConditionEvaluator - Handles AI-powered condition evaluation
3
- *
4
- * This class is responsible for:
5
- * - Evaluating guideline conditions
6
- * - Evaluating transition conditions
7
- * - Extracting tool arguments from context and history
8
- */
9
-
10
- import type { Event, AiProvider, MessageEventData } from "../types/index";
11
- import { EventKind } from "../types/history";
12
- import type { Guideline } from "../types/agent";
13
- import type { ToolRef } from "../types/tool";
14
-
15
- /**
16
- * Result of guideline condition evaluation
17
- */
18
- export interface GuidelineEvaluationResult {
19
- matches: boolean;
20
- rationale?: string;
21
- }
22
-
23
- /**
24
- * Result of transition condition evaluation
25
- */
26
- export interface TransitionEvaluationResult {
27
- shouldFollow: boolean;
28
- rationale?: string;
29
- }
30
-
31
- /**
32
- * Result of tool argument extraction
33
- */
34
- export interface ArgumentExtractionResult {
35
- arguments: unknown[];
36
- rationale?: string;
37
- }
38
-
39
- /**
40
- * Schema for guideline evaluation response
41
- */
42
- interface GuidelineEvaluationSchema {
43
- matches: boolean;
44
- rationale: string;
45
- }
46
-
47
- /**
48
- * Schema for transition evaluation response
49
- */
50
- interface TransitionEvaluationSchema {
51
- shouldFollow: boolean;
52
- rationale: string;
53
- }
54
-
55
- /**
56
- * Schema for argument extraction response
57
- */
58
- interface ArgumentExtractionSchema {
59
- arguments: unknown[];
60
- rationale?: string;
61
- }
62
-
63
- /**
64
- * ConditionEvaluator - Evaluates conditions using AI
65
- */
66
- export class ConditionEvaluator<TContext = unknown> {
67
- constructor(private readonly ai: AiProvider) {}
68
-
69
- /**
70
- * Evaluate a guideline condition against context and history
71
- */
72
- async evaluateGuidelineCondition(
73
- guideline: Guideline,
74
- context: TContext,
75
- history: Event[]
76
- ): Promise<GuidelineEvaluationResult> {
77
- try {
78
- const recentMessages = this.extractRecentMessages(history);
79
-
80
- const prompt = `You are evaluating whether a guideline condition is met.
81
-
82
- Guideline Condition: ${guideline.condition}
83
- Action: ${guideline.action}
84
-
85
- Current Context:
86
- ${JSON.stringify(context, null, 2)}
87
-
88
- Recent Conversation:
89
- ${recentMessages || "(No recent messages)"}
90
-
91
- Evaluate whether the guideline condition is currently met based on the context and conversation.
92
-
93
- Your response must be a JSON object with this exact structure:
94
- {
95
- "matches": boolean (true or false),
96
- "rationale": string (brief explanation)
97
- }`;
98
-
99
- const result = await this.ai.generateMessage<
100
- TContext,
101
- GuidelineEvaluationSchema
102
- >({
103
- prompt,
104
- history,
105
- context,
106
- parameters: {
107
- jsonMode: true,
108
- maxOutputTokens: 500,
109
- },
110
- });
111
-
112
- // Parse structured response
113
- if (result.structured) {
114
- return {
115
- matches: result.structured.matches === true,
116
- rationale: result.structured.rationale,
117
- };
118
- }
119
-
120
- // Fallback parsing
121
- return this.parseGuidelineResponse(result.message);
122
- } catch (error) {
123
- console.error(
124
- `[ConditionEvaluator] Failed to evaluate guideline condition: ${guideline.id}`,
125
- error
126
- );
127
- return {
128
- matches: false,
129
- rationale: "Failed to evaluate condition",
130
- };
131
- }
132
- }
133
-
134
- /**
135
- * Evaluate a transition condition
136
- */
137
- async evaluateTransitionCondition(
138
- condition: string,
139
- context: TContext,
140
- history: Event[]
141
- ): Promise<TransitionEvaluationResult> {
142
- try {
143
- const recentMessages = this.extractRecentMessages(history);
144
-
145
- const prompt = `You are evaluating whether a state transition condition is met.
146
-
147
- Transition Condition: ${condition}
148
-
149
- Current Context:
150
- ${JSON.stringify(context, null, 2)}
151
-
152
- Recent Conversation:
153
- ${recentMessages || "(No recent messages)"}
154
-
155
- Evaluate whether this transition should be followed based on the condition, context, and conversation.
156
-
157
- Your response must be a JSON object with this exact structure:
158
- {
159
- "shouldFollow": boolean (true or false),
160
- "rationale": string (brief explanation)
161
- }`;
162
-
163
- const result = await this.ai.generateMessage<
164
- TContext,
165
- TransitionEvaluationSchema
166
- >({
167
- prompt,
168
- history,
169
- context,
170
- parameters: {
171
- jsonMode: true,
172
- maxOutputTokens: 300,
173
- },
174
- });
175
-
176
- // Parse structured response
177
- if (result.structured) {
178
- return {
179
- shouldFollow: result.structured.shouldFollow === true,
180
- rationale: result.structured.rationale,
181
- };
182
- }
183
-
184
- // Fallback parsing
185
- return this.parseTransitionResponse(result.message);
186
- } catch (error) {
187
- console.error(
188
- `[ConditionEvaluator] Failed to evaluate transition condition`,
189
- error
190
- );
191
- return {
192
- shouldFollow: false,
193
- rationale: "Failed to evaluate condition",
194
- };
195
- }
196
- }
197
-
198
- /**
199
- * Extract tool arguments from context and history
200
- */
201
- async extractToolArguments(
202
- tool: ToolRef<TContext, unknown[], unknown>,
203
- context: TContext,
204
- history: Event[]
205
- ): Promise<ArgumentExtractionResult> {
206
- try {
207
- const recentMessages = this.extractRecentMessages(history);
208
-
209
- const prompt = `You are extracting arguments for a tool call.
210
-
211
- Tool: ${tool.name}
212
- Description: ${tool.description || "No description"}
213
- Parameters: ${JSON.stringify(tool.parameters, null, 2)}
214
-
215
- Current Context:
216
- ${JSON.stringify(context, null, 2)}
217
-
218
- Recent Conversation:
219
- ${recentMessages || "(No recent messages)"}
220
-
221
- Extract the arguments needed to call this tool based on the context and conversation.
222
- If a parameter is not available, use null or a reasonable default value.
223
-
224
- Your response must be a JSON object with this exact structure:
225
- {
226
- "arguments": [arg1, arg2, ...] (array of argument values),
227
- "rationale": string (optional explanation)
228
- }`;
229
-
230
- const result = await this.ai.generateMessage<
231
- TContext,
232
- ArgumentExtractionSchema
233
- >({
234
- prompt,
235
- history,
236
- context,
237
- parameters: {
238
- jsonMode: true,
239
- maxOutputTokens: 500,
240
- },
241
- });
242
-
243
- // Parse structured response
244
- if (result.structured) {
245
- if (
246
- result.structured.arguments &&
247
- Array.isArray(result.structured.arguments)
248
- ) {
249
- return {
250
- arguments: result.structured.arguments,
251
- rationale: result.structured.rationale,
252
- };
253
- }
254
- }
255
-
256
- // Fallback: try to parse from message
257
- return this.parseArgumentResponse(result.message);
258
- } catch (error) {
259
- console.error(
260
- `[ConditionEvaluator] Failed to extract tool arguments: ${tool.name}`,
261
- error
262
- );
263
- return {
264
- arguments: [],
265
- rationale: "Failed to extract arguments",
266
- };
267
- }
268
- }
269
-
270
- /**
271
- * Simple argument extraction from context (fallback)
272
- */
273
- simpleArgumentExtraction(
274
- tool: ToolRef<TContext, unknown[], unknown>,
275
- context: TContext
276
- ): unknown[] {
277
- const contextObj = context as Record<string, unknown>;
278
- const args: unknown[] = [];
279
-
280
- // If parameters is an object with properties, try to match context keys
281
- if (
282
- tool.parameters &&
283
- typeof tool.parameters === "object" &&
284
- !Array.isArray(tool.parameters)
285
- ) {
286
- const params = tool.parameters as Record<string, unknown>;
287
-
288
- // Try to match parameter names with context keys
289
- for (const [paramName, paramDef] of Object.entries(params)) {
290
- if (contextObj[paramName] !== undefined) {
291
- args.push(contextObj[paramName]);
292
- } else if (
293
- typeof paramDef === "object" &&
294
- paramDef !== null &&
295
- "default" in paramDef &&
296
- typeof (paramDef as { default?: unknown }).default !== "undefined"
297
- ) {
298
- args.push((paramDef as { default: unknown }).default);
299
- }
300
- }
301
- }
302
-
303
- return args;
304
- }
305
-
306
- // Private helper methods
307
-
308
- /**
309
- * Extract recent messages from history
310
- */
311
- private extractRecentMessages(history: Event[], count = 5): string {
312
- return history
313
- .slice(-count)
314
- .map((event) => {
315
- if (event.kind === EventKind.MESSAGE) {
316
- const data = event.data as MessageEventData;
317
- return `${data.participant.display_name}: ${data.message}`;
318
- }
319
- return null;
320
- })
321
- .filter((msg): msg is string => msg !== null)
322
- .join("\n");
323
- }
324
-
325
- /**
326
- * Parse guideline evaluation from text response (fallback)
327
- */
328
- private parseGuidelineResponse(message: string): GuidelineEvaluationResult {
329
- const lowerMessage = message.toLowerCase();
330
- const matches =
331
- lowerMessage.includes("true") || lowerMessage.includes('"matches": true');
332
-
333
- return {
334
- matches,
335
- rationale: matches ? "Parsed from text response" : "Condition not met",
336
- };
337
- }
338
-
339
- /**
340
- * Parse transition evaluation from text response (fallback)
341
- */
342
- private parseTransitionResponse(message: string): TransitionEvaluationResult {
343
- const lowerMessage = message.toLowerCase();
344
- const shouldFollow =
345
- lowerMessage.includes("true") ||
346
- lowerMessage.includes('"shouldfollow": true');
347
-
348
- return {
349
- shouldFollow,
350
- rationale: shouldFollow
351
- ? "Parsed from text response"
352
- : "Condition not met",
353
- };
354
- }
355
-
356
- /**
357
- * Parse argument extraction from text response (fallback)
358
- */
359
- private parseArgumentResponse(message: string): ArgumentExtractionResult {
360
- try {
361
- // Try to extract JSON from the message
362
- const jsonMatch = message.match(/\{[\s\S]*\}/);
363
- if (jsonMatch) {
364
- const parsed = JSON.parse(jsonMatch[0]) as ArgumentExtractionSchema;
365
- if (parsed.arguments && Array.isArray(parsed.arguments)) {
366
- return {
367
- arguments: parsed.arguments,
368
- rationale: parsed.rationale,
369
- };
370
- }
371
- }
372
- } catch {
373
- // Ignore parse errors
374
- }
375
-
376
- return {
377
- arguments: [],
378
- rationale: "Failed to parse arguments from response",
379
- };
380
- }
381
- }
@@ -1,47 +0,0 @@
1
- /**
2
- * Observation for route disambiguation
3
- */
4
-
5
- import type {
6
- Observation as IObservation,
7
- ObservationOptions,
8
- } from "../types/observation";
9
- import type { RouteRef } from "../types/route";
10
- import type { Route } from "./Route";
11
- import { generateObservationId } from "../utils/id";
12
-
13
- /**
14
- * An observation that can trigger disambiguation between routes
15
- */
16
- export class Observation implements IObservation {
17
- public readonly id: string;
18
- public readonly description: string;
19
- public routes: RouteRef[] = [];
20
-
21
- constructor(options: ObservationOptions) {
22
- // Use provided ID or generate a deterministic one from the description
23
- this.id = options.id || generateObservationId(options.description);
24
- this.description = options.description;
25
- }
26
-
27
- /**
28
- * Set routes that this observation can disambiguate between
29
- */
30
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
- disambiguate(routes: (Route<any> | RouteRef)[]): this {
32
- this.routes = routes.map((r) => {
33
- if ("getRef" in r) {
34
- return r.getRef();
35
- }
36
- return r;
37
- });
38
- return this;
39
- }
40
-
41
- /**
42
- * Get the routes this observation disambiguates
43
- */
44
- getRoutes(): RouteRef[] {
45
- return [...this.routes];
46
- }
47
- }