@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.
- package/README.md +89 -29
- package/dist/cjs/constants/index.d.ts +6 -1
- package/dist/cjs/constants/index.d.ts.map +1 -1
- package/dist/cjs/constants/index.js +8 -3
- package/dist/cjs/constants/index.js.map +1 -1
- package/dist/cjs/core/Agent.d.ts +22 -0
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +113 -26
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/Events.d.ts +13 -0
- package/dist/cjs/core/Events.d.ts.map +1 -1
- package/dist/cjs/core/Events.js +28 -14
- package/dist/cjs/core/Events.js.map +1 -1
- package/dist/cjs/core/ResponseEngine.d.ts +1 -1
- package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
- package/dist/cjs/core/ResponseEngine.js +4 -1
- package/dist/cjs/core/ResponseEngine.js.map +1 -1
- package/dist/cjs/core/Route.d.ts.map +1 -1
- package/dist/cjs/core/Route.js +4 -4
- package/dist/cjs/core/Route.js.map +1 -1
- package/dist/cjs/core/RoutingEngine.d.ts +6 -1
- package/dist/cjs/core/RoutingEngine.d.ts.map +1 -1
- package/dist/cjs/core/RoutingEngine.js +116 -41
- package/dist/cjs/core/RoutingEngine.js.map +1 -1
- package/dist/cjs/core/State.d.ts +18 -6
- package/dist/cjs/core/State.d.ts.map +1 -1
- package/dist/cjs/core/State.js +30 -7
- package/dist/cjs/core/State.js.map +1 -1
- package/dist/cjs/core/Tool.d.ts +8 -1
- package/dist/cjs/core/Tool.d.ts.map +1 -1
- package/dist/cjs/core/Tool.js +25 -28
- package/dist/cjs/core/Tool.js.map +1 -1
- package/dist/cjs/core/Transition.js +1 -1
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +3 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/agent.d.ts +5 -0
- package/dist/cjs/types/agent.d.ts.map +1 -1
- package/dist/cjs/types/agent.js.map +1 -1
- package/dist/cjs/types/route.d.ts +7 -1
- package/dist/cjs/types/route.d.ts.map +1 -1
- package/dist/cjs/types/session.d.ts +13 -2
- package/dist/cjs/types/session.d.ts.map +1 -1
- package/dist/cjs/types/session.js +28 -5
- package/dist/cjs/types/session.js.map +1 -1
- package/dist/cjs/utils/logger.d.ts +10 -0
- package/dist/cjs/utils/logger.d.ts.map +1 -0
- package/dist/cjs/utils/logger.js +23 -0
- package/dist/cjs/utils/logger.js.map +1 -0
- package/dist/constants/index.d.ts +6 -1
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +6 -1
- package/dist/constants/index.js.map +1 -1
- package/dist/core/Agent.d.ts +22 -0
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +113 -26
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/Events.d.ts +13 -0
- package/dist/core/Events.d.ts.map +1 -1
- package/dist/core/Events.js +28 -14
- package/dist/core/Events.js.map +1 -1
- package/dist/core/ResponseEngine.d.ts +1 -1
- package/dist/core/ResponseEngine.d.ts.map +1 -1
- package/dist/core/ResponseEngine.js +4 -1
- package/dist/core/ResponseEngine.js.map +1 -1
- package/dist/core/Route.d.ts.map +1 -1
- package/dist/core/Route.js +4 -4
- package/dist/core/Route.js.map +1 -1
- package/dist/core/RoutingEngine.d.ts +6 -1
- package/dist/core/RoutingEngine.d.ts.map +1 -1
- package/dist/core/RoutingEngine.js +116 -41
- package/dist/core/RoutingEngine.js.map +1 -1
- package/dist/core/State.d.ts +18 -6
- package/dist/core/State.d.ts.map +1 -1
- package/dist/core/State.js +31 -8
- package/dist/core/State.js.map +1 -1
- package/dist/core/Tool.d.ts +8 -1
- package/dist/core/Tool.d.ts.map +1 -1
- package/dist/core/Tool.js +25 -28
- package/dist/core/Tool.js.map +1 -1
- package/dist/core/Transition.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types/agent.d.ts +5 -0
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js.map +1 -1
- package/dist/types/route.d.ts +7 -1
- package/dist/types/route.d.ts.map +1 -1
- package/dist/types/session.d.ts +13 -2
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/session.js +28 -5
- package/dist/types/session.js.map +1 -1
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +17 -0
- package/dist/utils/logger.js.map +1 -0
- package/docs/{CONSTRUCTOR_OPTIONS.md → AGENT.md} +79 -7
- package/docs/API_REFERENCE.md +309 -18
- package/docs/ARCHITECTURE.md +1 -1
- package/docs/DOCS.md +46 -22
- package/docs/GETTING_STARTED.md +1 -1
- package/docs/README.md +13 -5
- package/docs/ROUTES.md +743 -0
- package/docs/STATES.md +798 -0
- package/examples/business-onboarding.ts +46 -5
- package/examples/company-qna-agent.ts +107 -1
- package/examples/custom-database-persistence.ts +44 -1
- package/examples/declarative-agent.ts +80 -37
- package/examples/domain-scoping.ts +91 -21
- package/examples/extracted-data-modification.ts +64 -2
- package/examples/healthcare-agent.ts +61 -4
- package/examples/openai-agent.ts +24 -2
- package/examples/opensearch-persistence.ts +26 -1
- package/examples/persistent-onboarding.ts +84 -18
- package/examples/prisma-persistence.ts +90 -16
- package/examples/redis-persistence.ts +89 -17
- package/examples/rules-prohibitions.ts +300 -139
- package/examples/streaming-agent.ts +60 -0
- package/examples/travel-agent.ts +66 -24
- package/package.json +3 -2
- package/src/constants/index.ts +6 -1
- package/src/core/Agent.ts +140 -24
- package/src/core/Events.ts +73 -10
- package/src/core/ResponseEngine.ts +6 -0
- package/src/core/Route.ts +8 -4
- package/src/core/RoutingEngine.ts +154 -43
- package/src/core/State.ts +45 -12
- package/src/core/Tool.ts +67 -10
- package/src/core/Transition.ts +1 -1
- package/src/index.ts +1 -1
- package/src/types/agent.ts +5 -0
- package/src/types/route.ts +10 -1
- package/src/types/session.ts +47 -7
- package/src/utils/logger.ts +19 -0
package/src/core/Transition.ts
CHANGED
|
@@ -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:
|
|
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 {
|
|
65
|
+
export { END_STATE, END_STATE_ID } from "./constants";
|
|
66
66
|
|
|
67
67
|
// Utils
|
|
68
68
|
export { generateRouteId, generateStateId, generateToolId } from "./utils/id";
|
package/src/types/agent.ts
CHANGED
|
@@ -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 */
|
package/src/types/route.ts
CHANGED
|
@@ -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
|
|
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
|
/**
|
package/src/types/session.ts
CHANGED
|
@@ -24,8 +24,18 @@ export interface SessionState<TExtracted = Record<string, unknown>> {
|
|
|
24
24
|
enteredAt: Date;
|
|
25
25
|
};
|
|
26
26
|
|
|
27
|
-
/**
|
|
28
|
-
|
|
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:
|
|
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
|
-
|
|
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;
|