@falai/agent 0.6.3 → 0.6.5

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 (137) hide show
  1. package/README.md +89 -29
  2. package/dist/cjs/constants/index.d.ts +6 -1
  3. package/dist/cjs/constants/index.d.ts.map +1 -1
  4. package/dist/cjs/constants/index.js +8 -3
  5. package/dist/cjs/constants/index.js.map +1 -1
  6. package/dist/cjs/core/Agent.d.ts +22 -0
  7. package/dist/cjs/core/Agent.d.ts.map +1 -1
  8. package/dist/cjs/core/Agent.js +113 -26
  9. package/dist/cjs/core/Agent.js.map +1 -1
  10. package/dist/cjs/core/Events.d.ts +13 -0
  11. package/dist/cjs/core/Events.d.ts.map +1 -1
  12. package/dist/cjs/core/Events.js +28 -14
  13. package/dist/cjs/core/Events.js.map +1 -1
  14. package/dist/cjs/core/ResponseEngine.d.ts +1 -1
  15. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
  16. package/dist/cjs/core/ResponseEngine.js +4 -1
  17. package/dist/cjs/core/ResponseEngine.js.map +1 -1
  18. package/dist/cjs/core/Route.d.ts.map +1 -1
  19. package/dist/cjs/core/Route.js +4 -4
  20. package/dist/cjs/core/Route.js.map +1 -1
  21. package/dist/cjs/core/RoutingEngine.d.ts +6 -1
  22. package/dist/cjs/core/RoutingEngine.d.ts.map +1 -1
  23. package/dist/cjs/core/RoutingEngine.js +116 -41
  24. package/dist/cjs/core/RoutingEngine.js.map +1 -1
  25. package/dist/cjs/core/State.d.ts +18 -6
  26. package/dist/cjs/core/State.d.ts.map +1 -1
  27. package/dist/cjs/core/State.js +30 -7
  28. package/dist/cjs/core/State.js.map +1 -1
  29. package/dist/cjs/core/Tool.d.ts +8 -1
  30. package/dist/cjs/core/Tool.d.ts.map +1 -1
  31. package/dist/cjs/core/Tool.js +25 -28
  32. package/dist/cjs/core/Tool.js.map +1 -1
  33. package/dist/cjs/core/Transition.js +1 -1
  34. package/dist/cjs/index.d.ts +1 -1
  35. package/dist/cjs/index.d.ts.map +1 -1
  36. package/dist/cjs/index.js +3 -2
  37. package/dist/cjs/index.js.map +1 -1
  38. package/dist/cjs/types/agent.d.ts +5 -0
  39. package/dist/cjs/types/agent.d.ts.map +1 -1
  40. package/dist/cjs/types/agent.js.map +1 -1
  41. package/dist/cjs/types/route.d.ts +7 -1
  42. package/dist/cjs/types/route.d.ts.map +1 -1
  43. package/dist/cjs/types/session.d.ts +13 -2
  44. package/dist/cjs/types/session.d.ts.map +1 -1
  45. package/dist/cjs/types/session.js +28 -5
  46. package/dist/cjs/types/session.js.map +1 -1
  47. package/dist/cjs/utils/logger.d.ts +10 -0
  48. package/dist/cjs/utils/logger.d.ts.map +1 -0
  49. package/dist/cjs/utils/logger.js +23 -0
  50. package/dist/cjs/utils/logger.js.map +1 -0
  51. package/dist/constants/index.d.ts +6 -1
  52. package/dist/constants/index.d.ts.map +1 -1
  53. package/dist/constants/index.js +6 -1
  54. package/dist/constants/index.js.map +1 -1
  55. package/dist/core/Agent.d.ts +22 -0
  56. package/dist/core/Agent.d.ts.map +1 -1
  57. package/dist/core/Agent.js +113 -26
  58. package/dist/core/Agent.js.map +1 -1
  59. package/dist/core/Events.d.ts +13 -0
  60. package/dist/core/Events.d.ts.map +1 -1
  61. package/dist/core/Events.js +28 -14
  62. package/dist/core/Events.js.map +1 -1
  63. package/dist/core/ResponseEngine.d.ts +1 -1
  64. package/dist/core/ResponseEngine.d.ts.map +1 -1
  65. package/dist/core/ResponseEngine.js +4 -1
  66. package/dist/core/ResponseEngine.js.map +1 -1
  67. package/dist/core/Route.d.ts.map +1 -1
  68. package/dist/core/Route.js +4 -4
  69. package/dist/core/Route.js.map +1 -1
  70. package/dist/core/RoutingEngine.d.ts +6 -1
  71. package/dist/core/RoutingEngine.d.ts.map +1 -1
  72. package/dist/core/RoutingEngine.js +116 -41
  73. package/dist/core/RoutingEngine.js.map +1 -1
  74. package/dist/core/State.d.ts +18 -6
  75. package/dist/core/State.d.ts.map +1 -1
  76. package/dist/core/State.js +31 -8
  77. package/dist/core/State.js.map +1 -1
  78. package/dist/core/Tool.d.ts +8 -1
  79. package/dist/core/Tool.d.ts.map +1 -1
  80. package/dist/core/Tool.js +25 -28
  81. package/dist/core/Tool.js.map +1 -1
  82. package/dist/core/Transition.js +1 -1
  83. package/dist/index.d.ts +1 -1
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +1 -1
  86. package/dist/index.js.map +1 -1
  87. package/dist/types/agent.d.ts +5 -0
  88. package/dist/types/agent.d.ts.map +1 -1
  89. package/dist/types/agent.js.map +1 -1
  90. package/dist/types/route.d.ts +7 -1
  91. package/dist/types/route.d.ts.map +1 -1
  92. package/dist/types/session.d.ts +13 -2
  93. package/dist/types/session.d.ts.map +1 -1
  94. package/dist/types/session.js +28 -5
  95. package/dist/types/session.js.map +1 -1
  96. package/dist/utils/logger.d.ts +10 -0
  97. package/dist/utils/logger.d.ts.map +1 -0
  98. package/dist/utils/logger.js +17 -0
  99. package/dist/utils/logger.js.map +1 -0
  100. package/docs/{CONSTRUCTOR_OPTIONS.md → AGENT.md} +79 -7
  101. package/docs/API_REFERENCE.md +309 -18
  102. package/docs/ARCHITECTURE.md +1 -1
  103. package/docs/DOCS.md +46 -22
  104. package/docs/GETTING_STARTED.md +1 -1
  105. package/docs/README.md +13 -5
  106. package/docs/ROUTES.md +743 -0
  107. package/docs/STATES.md +798 -0
  108. package/examples/business-onboarding.ts +46 -5
  109. package/examples/company-qna-agent.ts +107 -1
  110. package/examples/custom-database-persistence.ts +44 -1
  111. package/examples/declarative-agent.ts +80 -37
  112. package/examples/domain-scoping.ts +91 -21
  113. package/examples/extracted-data-modification.ts +64 -2
  114. package/examples/healthcare-agent.ts +61 -4
  115. package/examples/openai-agent.ts +24 -2
  116. package/examples/opensearch-persistence.ts +26 -1
  117. package/examples/persistent-onboarding.ts +84 -18
  118. package/examples/prisma-persistence.ts +90 -16
  119. package/examples/redis-persistence.ts +89 -17
  120. package/examples/rules-prohibitions.ts +300 -139
  121. package/examples/streaming-agent.ts +60 -0
  122. package/examples/travel-agent.ts +66 -24
  123. package/package.json +3 -2
  124. package/src/constants/index.ts +6 -1
  125. package/src/core/Agent.ts +140 -24
  126. package/src/core/Events.ts +73 -10
  127. package/src/core/ResponseEngine.ts +6 -0
  128. package/src/core/Route.ts +8 -4
  129. package/src/core/RoutingEngine.ts +154 -43
  130. package/src/core/State.ts +45 -12
  131. package/src/core/Tool.ts +67 -10
  132. package/src/core/Transition.ts +1 -1
  133. package/src/index.ts +1 -1
  134. package/src/types/agent.ts +5 -0
  135. package/src/types/route.ts +10 -1
  136. package/src/types/session.ts +47 -7
  137. package/src/utils/logger.ts +19 -0
@@ -55,7 +55,7 @@ export class Transition<TContext = unknown, TExtracted = unknown> {
55
55
  }
56
56
  if (this.spec.state) {
57
57
  if (typeof this.spec.state === "symbol") {
58
- parts.push("state: END_ROUTE");
58
+ parts.push("state: END_STATE");
59
59
  } else {
60
60
  parts.push(`state: ${this.spec.state.id}`);
61
61
  }
package/src/index.ts CHANGED
@@ -62,7 +62,7 @@ export type {
62
62
  } from "./adapters/OpenSearchAdapter";
63
63
 
64
64
  // Constants
65
- export { END_ROUTE } from "./constants";
65
+ export { END_STATE, END_STATE_ID } from "./constants";
66
66
 
67
67
  // Utils
68
68
  export { generateRouteId, generateStateId, generateToolId } from "./utils/id";
@@ -6,6 +6,7 @@ import type { AiProvider } from "./ai";
6
6
  import type { ToolRef } from "./tool";
7
7
  import type { RouteOptions } from "./route";
8
8
  import type { PersistenceConfig } from "./persistence";
9
+ import type { SessionState } from "./session";
9
10
 
10
11
  /**
11
12
  * Composition mode determines how the agent processes and structures responses
@@ -74,8 +75,12 @@ export interface AgentOptions<TContext = unknown> {
74
75
  goal?: string;
75
76
  /** Optional personality/tone instructions used in prompts */
76
77
  personality?: string;
78
+ /** Enable debug logging */
79
+ debug?: boolean;
77
80
  /** Default context data available to the agent */
78
81
  context?: TContext;
82
+ /** Optional current session for convenience methods */
83
+ session?: SessionState;
79
84
  /** Context provider function for always-fresh context (alternative to static context) */
80
85
  contextProvider?: ContextProvider<TContext>;
81
86
  /** Lifecycle hooks for context management */
@@ -66,10 +66,19 @@ export interface RouteOptions<TExtracted = unknown> {
66
66
  initialData?: Partial<TExtracted>;
67
67
  /**
68
68
  * NEW: Sequential steps for simple linear flows
69
- * If provided, automatically chains the steps from initialState to END_ROUTE
69
+ * If provided, automatically chains the steps from initialState to END_STATE
70
70
  * For complex flows with branching, build the state machine manually instead
71
71
  */
72
72
  steps?: TransitionSpec<unknown, TExtracted>[];
73
+ /**
74
+ * Configure the initial state (optional)
75
+ * Accepts full TransitionSpec configuration (id, chatState, gather, skipIf, etc.)
76
+ * Note: toolState and state properties are ignored for initial state
77
+ */
78
+ initialState?: Omit<
79
+ TransitionSpec<unknown, TExtracted>,
80
+ "toolState" | "state" | "condition"
81
+ >;
73
82
  }
74
83
 
75
84
  /**
@@ -24,8 +24,18 @@ export interface SessionState<TExtracted = Record<string, unknown>> {
24
24
  enteredAt: Date;
25
25
  };
26
26
 
27
- /** Data extracted during the current route */
28
- extracted: Partial<TExtracted>;
27
+ /**
28
+ * Data extracted during the current route
29
+ * This is a convenience reference to extractedByRoute[currentRoute.id]
30
+ */
31
+ extracted?: Partial<TExtracted>;
32
+
33
+ /**
34
+ * Extracted data organized by route ID
35
+ * Preserves data when switching between routes
36
+ * Format: { "routeId": { ...extractedData } }
37
+ */
38
+ extractedByRoute?: Record<string, Partial<unknown>>;
29
39
 
30
40
  /** History of routes visited in this session */
31
41
  routeHistory: Array<{
@@ -55,6 +65,7 @@ export function createSession<TExtracted = Record<string, unknown>>(
55
65
  return {
56
66
  id: sessionId,
57
67
  extracted: {},
68
+ extractedByRoute: {},
58
69
  routeHistory: [],
59
70
  metadata: {
60
71
  ...metadata,
@@ -66,12 +77,23 @@ export function createSession<TExtracted = Record<string, unknown>>(
66
77
 
67
78
  /**
68
79
  * Helper to update session with new route
80
+ * Preserves extracted data per route in extractedByRoute map
69
81
  */
70
82
  export function enterRoute<TExtracted = Record<string, unknown>>(
71
83
  session: SessionState<TExtracted>,
72
84
  routeId: string,
73
85
  routeTitle: string
74
86
  ): SessionState<TExtracted> {
87
+ // Save current route's extracted data before switching
88
+ const extractedByRoute = { ...session.extractedByRoute };
89
+ if (
90
+ session.currentRoute &&
91
+ session.extracted &&
92
+ Object.keys(session.extracted).length > 0
93
+ ) {
94
+ extractedByRoute[session.currentRoute.id] = session.extracted;
95
+ }
96
+
75
97
  // Exit current route if exists
76
98
  const routeHistory = [...session.routeHistory];
77
99
  if (session.currentRoute) {
@@ -83,6 +105,9 @@ export function enterRoute<TExtracted = Record<string, unknown>>(
83
105
  }
84
106
  }
85
107
 
108
+ // Load extracted data for new route (if resuming) or start fresh
109
+ const newExtracted = (extractedByRoute[routeId] as Partial<TExtracted>) || {};
110
+
86
111
  // Enter new route
87
112
  const now = new Date();
88
113
  return {
@@ -93,7 +118,8 @@ export function enterRoute<TExtracted = Record<string, unknown>>(
93
118
  enteredAt: now,
94
119
  },
95
120
  currentState: undefined,
96
- extracted: {}, // Reset extracted data for new route
121
+ extracted: newExtracted, // Load route's data or start fresh
122
+ extractedByRoute,
97
123
  routeHistory: [
98
124
  ...routeHistory,
99
125
  {
@@ -133,17 +159,27 @@ export function enterState<TExtracted = Record<string, unknown>>(
133
159
 
134
160
  /**
135
161
  * Helper to merge extracted data into session
162
+ * Updates both the extracted field and the extractedByRoute map
136
163
  */
137
164
  export function mergeExtracted<TExtracted = Record<string, unknown>>(
138
165
  session: SessionState<TExtracted>,
139
166
  extracted: Partial<TExtracted>
140
167
  ): SessionState<TExtracted> {
168
+ const newExtracted = {
169
+ ...session.extracted,
170
+ ...extracted,
171
+ };
172
+
173
+ // Also update the extractedByRoute map for the current route
174
+ const extractedByRoute = { ...session.extractedByRoute };
175
+ if (session.currentRoute) {
176
+ extractedByRoute[session.currentRoute.id] = newExtracted;
177
+ }
178
+
141
179
  return {
142
180
  ...session,
143
- extracted: {
144
- ...session.extracted,
145
- ...extracted,
146
- },
181
+ extracted: newExtracted,
182
+ extractedByRoute,
147
183
  metadata: {
148
184
  ...session.metadata,
149
185
  lastUpdatedAt: new Date(),
@@ -167,6 +203,7 @@ export function sessionStateToData<TExtracted = Record<string, unknown>>(
167
203
  currentState: session.currentState?.id,
168
204
  collectedData: {
169
205
  extracted: session.extracted,
206
+ extractedByRoute: session.extractedByRoute, // Include per-route data
170
207
  routeHistory: session.routeHistory,
171
208
  currentRouteTitle: session.currentRoute?.title,
172
209
  currentStateDescription: session.currentState?.description,
@@ -210,6 +247,9 @@ export function sessionDataToState<TExtracted = Record<string, unknown>>(
210
247
  }
211
248
  : undefined,
212
249
  extracted: (collectedData.extracted as Partial<TExtracted>) || {},
250
+ extractedByRoute:
251
+ (collectedData.extractedByRoute as Record<string, Partial<unknown>>) ||
252
+ {}, // Restore per-route data
213
253
  routeHistory:
214
254
  (collectedData.routeHistory as SessionState<TExtracted>["routeHistory"]) ||
215
255
  [],
@@ -0,0 +1,19 @@
1
+ import log from "loglevel";
2
+
3
+ export enum LoggerLevel {
4
+ DEBUG = "debug",
5
+ INFO = "info",
6
+ WARN = "warn",
7
+ ERROR = "error",
8
+ SILENT = "silent",
9
+ }
10
+
11
+ /**
12
+ * Default log level
13
+ */
14
+ const DEFAULT_LOG_LEVEL = LoggerLevel.SILENT;
15
+
16
+ // Initialize logger
17
+ log.setLevel(DEFAULT_LOG_LEVEL);
18
+
19
+ export const logger = log;