@base44-preview/sdk 0.8.17-pr.77.dfc0f63 → 0.8.18-pr.106.9dda1d0

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 CHANGED
@@ -1,22 +1,43 @@
1
1
  # Base44 JavaScript SDK
2
2
 
3
- The Base44 SDK provides a JavaScript interface for building apps on the Base44 platform. When Base44 generates your app, the generated code uses the SDK to authenticate users, manage your app's data, interact with AI agents, and more. You can then use the same SDK to modify and extend your app.
3
+ t
4
+
5
+ The Base44 SDK provides a JavaScript interface for building apps on the Base44 platform.
6
+
7
+ You can use it in two ways:
8
+
9
+ - **Inside Base44 apps**: When Base44 generates your app, the SDK is already set up and ready to use.
10
+ - **External apps**: Use the SDK to build your own frontend or backend that uses Base44 as a backend service.
11
+
12
+ ## Installation
13
+
14
+ Install the SDK via npm:
15
+
16
+ ```bash
17
+ npm install @base44/sdk
18
+ ```
19
+
20
+ > **Note**: In Base44-generated apps, the SDK is already installed for you.
4
21
 
5
22
  ## Modules
6
23
 
7
24
  The SDK provides access to Base44's functionality through the following modules:
8
25
 
9
- - **[`agents`](https://docs.base44.com/sdk-docs/interfaces/agents)**: Interact with AI agents and manage conversations.
10
- - **[`app-logs`](https://docs.base44.com/sdk-docs/interfaces/app-logs)**: Access and query app logs.
11
- - **[`auth`](https://docs.base44.com/sdk-docs/interfaces/auth)**: Manage user authentication, registration, and session handling.
12
- - **[`connectors`](https://docs.base44.com/sdk-docs/interfaces/connectors)**: Manage OAuth connections and access tokens for third-party services.
13
- - **[`entities`](https://docs.base44.com/sdk-docs/interfaces/entities)**: Work with your app's data entities using CRUD operations.
14
- - **[`functions`](https://docs.base44.com/sdk-docs/interfaces/functions)**: Execute backend functions.
15
- - **[`integrations`](https://docs.base44.com/sdk-docs/type-aliases/integrations)**: Pre-built server-side functions for external services.
26
+ - **[`agents`](https://docs.base44.com/developers/references/sdk/docs/interfaces/agents)**: Interact with AI agents and manage conversations.
27
+ - **[`app-logs`](https://docs.base44.com/developers/references/sdk/docs/interfaces/app-logs)**: Access and query app logs.
28
+ - **[`auth`](https://docs.base44.com/developers/references/sdk/docs/interfaces/auth)**: Manage user authentication, registration, and session handling.
29
+ - **[`connectors`](https://docs.base44.com/developers/references/sdk/docs/interfaces/connectors)**: Manage OAuth connections and access tokens for third-party services.
30
+ - **[`entities`](https://docs.base44.com/developers/references/sdk/docs/interfaces/entities)**: Work with your app's data entities using CRUD operations.
31
+ - **[`functions`](https://docs.base44.com/developers/references/sdk/docs/interfaces/functions)**: Execute backend functions.
32
+ - **[`integrations`](https://docs.base44.com/developers/references/sdk/docs/type-aliases/integrations)**: Pre-built integrations for external services.
16
33
 
17
- ## Example
34
+ ## Quick starts
18
35
 
19
- Here's a quick look at working with data in the SDK, using the `entities` module to create, update, and list records. In this example, we're working with a custom `Task` entity:
36
+ How you get started depends on your context:
37
+
38
+ ### Inside a Base44 app
39
+
40
+ In Base44-generated apps, the client is pre-configured. Just import and use it:
20
41
 
21
42
  ```typescript
22
43
  import { base44 } from "@/api/base44Client";
@@ -37,14 +58,55 @@ await base44.entities.Task.update(newTask.id, {
37
58
  const tasks = await base44.entities.Task.list();
38
59
  ```
39
60
 
61
+ ### External apps
62
+
63
+ When using Base44 as a backend for your own app, create and configure the client yourself:
64
+
65
+ ```typescript
66
+ import { createClient } from '@base44/sdk';
67
+
68
+ // Create a client for your Base44 app
69
+ const base44 = createClient({
70
+ appId: 'your-app-id' // Find this in the Base44 editor URL
71
+ });
72
+
73
+ // Read public data (anonymous access)
74
+ const products = await base44.entities.Products.list();
75
+
76
+ // Authenticate a user (token is automatically set)
77
+ await base44.auth.loginViaEmailPassword('user@example.com', 'password');
78
+
79
+ // Now operations use the authenticated user's permissions
80
+ const userOrders = await base44.entities.Orders.list();
81
+ ```
82
+
83
+ ### Service role
84
+
85
+ For backend code that needs admin-level access, use the service role. Service role is only available in Base44-hosted backend functions:
86
+
87
+ ```typescript
88
+ import { createClientFromRequest } from 'npm:@base44/sdk';
89
+
90
+ Deno.serve(async (req) => {
91
+ const base44 = createClientFromRequest(req);
92
+
93
+ // Access all data with admin-level permissions
94
+ const allOrders = await base44.asServiceRole.entities.Orders.list();
95
+
96
+ return Response.json({ orders: allOrders });
97
+ });
98
+ ```
99
+
40
100
  ## Learn more
41
101
 
42
- For complete documentation, guides, and API reference, visit the **[Base44 SDK Documentation](https://docs.base44.com/sdk-getting-started/overview)**.
102
+ For complete documentation, guides, and API reference, visit the **[Base44 SDK Documentation](https://docs.base44.com/developers/landing)**.
43
103
 
44
104
  ## Development
45
105
 
46
106
  ### Build the SDK
47
107
 
108
+ Build the SDK from source:
109
+
48
110
  ```bash
49
111
  npm install
50
112
  npm run build
@@ -52,6 +114,8 @@ npm run build
52
114
 
53
115
  ### Run tests
54
116
 
117
+ Run the test suite:
118
+
55
119
  ```bash
56
120
  # Run all tests
57
121
  npm test
@@ -64,6 +128,7 @@ npm run test:coverage
64
128
  ```
65
129
 
66
130
  For E2E tests, create a `tests/.env` file with:
131
+
67
132
  ```
68
133
  BASE44_APP_ID=your_app_id
69
134
  BASE44_AUTH_TOKEN=your_auth_token
package/dist/client.d.ts CHANGED
@@ -5,12 +5,14 @@ export type { Base44Client, CreateClientConfig, CreateClientOptions };
5
5
  *
6
6
  * This is the main entry point for the Base44 SDK. It creates a client that provides access to the SDK's modules, such as {@linkcode EntitiesModule | entities}, {@linkcode AuthModule | auth}, and {@linkcode FunctionsModule | functions}.
7
7
  *
8
- * Typically, you don't need to call this function because Base44 creates the client for you. You can then import and use the client to make API calls. The client takes care of managing authentication for you.
8
+ * How you get a client depends on your context:
9
+ * - **Inside a Base44 app:** The client is automatically created and configured for you. Import it from `@/api/base44Client`.
10
+ * - **External app using Base44 as a backend:** Call `createClient()` directly in your code to create and configure the client.
9
11
  *
10
12
  * The client supports three authentication modes:
11
- * - **Anonymous**: Access modules anonymously without authentication using `base44.moduleName`. Operations are scoped to public data and permissions.
12
- * - **User authentication**: Access modules with user-level permissions using `base44.moduleName`. Operations are scoped to the authenticated user's data and permissions.
13
- * - **Service role authentication**: Access modules with elevated permissions using `base44.asServiceRole.moduleName`. Operations can access any data available to the app's admin. Can only be used in the backend. Typically, you create a client with service role authentication using the {@linkcode createClientFromRequest | createClientFromRequest()} function in your backend functions.
13
+ * - **Anonymous**: Access modules without authentication using `base44.moduleName`. Operations are scoped to public data and permissions.
14
+ * - **User authentication**: Access modules with user-level permissions using `base44.moduleName`. Operations are scoped to the authenticated user's data and permissions. Use `base44.auth.loginViaEmailPassword()` or other auth methods to get a token.
15
+ * - **Service role authentication**: Access modules with elevated permissions using `base44.asServiceRole.moduleName`. Operations can access any data available to the app's admin. Only available in Base44-hosted backend functions. Create a client with service role authentication using {@linkcode createClientFromRequest | createClientFromRequest()}.
14
16
  *
15
17
  * For example, when using the {@linkcode EntitiesModule | entities} module:
16
18
  * - **Anonymous**: Can only read public data.
@@ -39,7 +41,9 @@ export declare function createClient(config: CreateClientConfig): Base44Client;
39
41
  /**
40
42
  * Creates a Base44 client from an HTTP request.
41
43
  *
42
- * The client is created by automatically extracting authentication tokens from a request to a backend function. Base44 inserts the necessary headers when forwarding requests to backend functions.
44
+ * This function is designed for use in Base44-hosted backend functions. For frontends and external backends, use {@linkcode createClient | createClient()} instead.
45
+ *
46
+ * When used in a Base44-hosted backend function, `createClientFromRequest()` automatically extracts authentication tokens from the request headers that Base44 injects when forwarding requests. The returned client includes service role access using `base44.asServiceRole`, which provides admin-level permissions.
43
47
  *
44
48
  * To learn more about the Base44 client, see {@linkcode createClient | createClient()}.
45
49
  *
package/dist/client.js CHANGED
@@ -16,12 +16,14 @@ import { createAnalyticsModule } from "./modules/analytics.js";
16
16
  *
17
17
  * This is the main entry point for the Base44 SDK. It creates a client that provides access to the SDK's modules, such as {@linkcode EntitiesModule | entities}, {@linkcode AuthModule | auth}, and {@linkcode FunctionsModule | functions}.
18
18
  *
19
- * Typically, you don't need to call this function because Base44 creates the client for you. You can then import and use the client to make API calls. The client takes care of managing authentication for you.
19
+ * How you get a client depends on your context:
20
+ * - **Inside a Base44 app:** The client is automatically created and configured for you. Import it from `@/api/base44Client`.
21
+ * - **External app using Base44 as a backend:** Call `createClient()` directly in your code to create and configure the client.
20
22
  *
21
23
  * The client supports three authentication modes:
22
- * - **Anonymous**: Access modules anonymously without authentication using `base44.moduleName`. Operations are scoped to public data and permissions.
23
- * - **User authentication**: Access modules with user-level permissions using `base44.moduleName`. Operations are scoped to the authenticated user's data and permissions.
24
- * - **Service role authentication**: Access modules with elevated permissions using `base44.asServiceRole.moduleName`. Operations can access any data available to the app's admin. Can only be used in the backend. Typically, you create a client with service role authentication using the {@linkcode createClientFromRequest | createClientFromRequest()} function in your backend functions.
24
+ * - **Anonymous**: Access modules without authentication using `base44.moduleName`. Operations are scoped to public data and permissions.
25
+ * - **User authentication**: Access modules with user-level permissions using `base44.moduleName`. Operations are scoped to the authenticated user's data and permissions. Use `base44.auth.loginViaEmailPassword()` or other auth methods to get a token.
26
+ * - **Service role authentication**: Access modules with elevated permissions using `base44.asServiceRole.moduleName`. Operations can access any data available to the app's admin. Only available in Base44-hosted backend functions. Create a client with service role authentication using {@linkcode createClientFromRequest | createClientFromRequest()}.
25
27
  *
26
28
  * For example, when using the {@linkcode EntitiesModule | entities} module:
27
29
  * - **Anonymous**: Can only read public data.
@@ -167,9 +169,7 @@ export function createClient(config) {
167
169
  }
168
170
  }
169
171
  // If authentication is required, verify token and redirect to login if needed
170
- // Skip if already on login page to avoid redirect loop
171
- const isOnLoginPage = typeof window !== "undefined" && window.location.pathname === "/login";
172
- if (requiresAuth && typeof window !== "undefined" && !isOnLoginPage) {
172
+ if (requiresAuth && typeof window !== "undefined") {
173
173
  // We perform this check asynchronously to not block client creation
174
174
  setTimeout(async () => {
175
175
  try {
@@ -226,7 +226,7 @@ export function createClient(config) {
226
226
  /**
227
227
  * Provides access to service role modules.
228
228
  *
229
- * Service role authentication provides elevated permissions for server-side operations. Unlike user authentication, which is scoped to a specific user's permissions, service role authentication has access to the data and operations available to the app's admin.
229
+ * Service role authentication provides elevated permissions for backend operations. Unlike user authentication, which is scoped to a specific user's permissions, service role authentication has access to the data and operations available to the app's admin.
230
230
  *
231
231
  * @throws {Error} When accessed without providing a serviceToken during client creation.
232
232
  *
@@ -253,7 +253,9 @@ export function createClient(config) {
253
253
  /**
254
254
  * Creates a Base44 client from an HTTP request.
255
255
  *
256
- * The client is created by automatically extracting authentication tokens from a request to a backend function. Base44 inserts the necessary headers when forwarding requests to backend functions.
256
+ * This function is designed for use in Base44-hosted backend functions. For frontends and external backends, use {@linkcode createClient | createClient()} instead.
257
+ *
258
+ * When used in a Base44-hosted backend function, `createClientFromRequest()` automatically extracts authentication tokens from the request headers that Base44 injects when forwarding requests. The returned client includes service role access using `base44.asServiceRole`, which provides admin-level permissions.
257
259
  *
258
260
  * To learn more about the Base44 client, see {@linkcode createClient | createClient()}.
259
261
  *
@@ -39,10 +39,13 @@ export interface CreateClientConfig {
39
39
  appId: string;
40
40
  /**
41
41
  * User authentication token. Used to authenticate as a specific user.
42
+ *
43
+ * Inside Base44 apps, the token is managed automatically. For external apps, use auth methods like {@linkcode AuthModule.loginViaEmailPassword | loginViaEmailPassword()} which set the token automatically.
42
44
  */
43
45
  token?: string;
44
46
  /**
45
- * Service role authentication token. Use this in the backend when you need elevated permissions to access data available to the app's admin or perform admin operations. This token should be kept secret and never exposed in the app's frontend. Typically, you get this token from a request to a backend function using {@linkcode createClientFromRequest | createClientFromRequest()}.
47
+ * Service role authentication token. Provides elevated permissions to access data available to the app's admin. Only available in Base44-hosted backend functions. Automatically added to client's created using {@linkcode createClientFromRequest | createClientFromRequest()}.
48
+ * @internal
46
49
  */
47
50
  serviceToken?: string;
48
51
  /**
@@ -71,20 +74,20 @@ export interface CreateClientConfig {
71
74
  * Provides access to all SDK modules for interacting with the app.
72
75
  */
73
76
  export interface Base44Client {
74
- /** {@link EntitiesModule | Entities module} for CRUD operations on your data models. */
75
- entities: EntitiesModule;
76
- /** {@link IntegrationsModule | Integrations module} for calling pre-built integration endpoints. */
77
- integrations: IntegrationsModule;
78
- /** {@link AuthModule | Auth module} for user authentication and management. */
79
- auth: AuthModule;
80
- /** {@link FunctionsModule | Functions module} for invoking custom backend functions. */
81
- functions: FunctionsModule;
82
77
  /** {@link AgentsModule | Agents module} for managing AI agent conversations. */
83
78
  agents: AgentsModule;
79
+ /** {@link AnalyticsModule | Analytics module} for tracking custom events in your app. */
80
+ analytics: AnalyticsModule;
84
81
  /** {@link AppLogsModule | App logs module} for tracking app usage. */
85
82
  appLogs: AppLogsModule;
86
- /** {@link AnalyticsModule | Analytics module} for tracking app usage. */
87
- analytics: AnalyticsModule;
83
+ /** {@link AuthModule | Auth module} for user authentication and management. */
84
+ auth: AuthModule;
85
+ /** {@link EntitiesModule | Entities module} for CRUD operations on your data models. */
86
+ entities: EntitiesModule;
87
+ /** {@link FunctionsModule | Functions module} for invoking custom backend functions. */
88
+ functions: FunctionsModule;
89
+ /** {@link IntegrationsModule | Integrations module} for calling pre-built integration endpoints. */
90
+ integrations: IntegrationsModule;
88
91
  /** Cleanup function to disconnect WebSocket connections. Call when you're done with the client. */
89
92
  cleanup: () => void;
90
93
  /**
@@ -112,22 +115,22 @@ export interface Base44Client {
112
115
  * @throws {Error} When accessed without providing a serviceToken during client creation
113
116
  */
114
117
  readonly asServiceRole: {
118
+ /** {@link AgentsModule | Agents module} with elevated permissions. */
119
+ agents: AgentsModule;
120
+ /** {@link AppLogsModule | App logs module} with elevated permissions. */
121
+ appLogs: AppLogsModule;
122
+ /** {@link ConnectorsModule | Connectors module} for OAuth token retrieval. */
123
+ connectors: ConnectorsModule;
115
124
  /** {@link EntitiesModule | Entities module} with elevated permissions. */
116
125
  entities: EntitiesModule;
126
+ /** {@link FunctionsModule | Functions module} with elevated permissions. */
127
+ functions: FunctionsModule;
117
128
  /** {@link IntegrationsModule | Integrations module} with elevated permissions. */
118
129
  integrations: IntegrationsModule;
119
130
  /** {@link SsoModule | SSO module} for generating SSO tokens.
120
131
  * @internal
121
132
  */
122
133
  sso: SsoModule;
123
- /** {@link ConnectorsModule | Connectors module} for OAuth token retrieval. */
124
- connectors: ConnectorsModule;
125
- /** {@link FunctionsModule | Functions module} with elevated permissions. */
126
- functions: FunctionsModule;
127
- /** {@link AgentsModule | Agents module} with elevated permissions. */
128
- agents: AgentsModule;
129
- /** {@link AppLogsModule | App logs module} with elevated permissions. */
130
- appLogs: AppLogsModule;
131
134
  /** Cleanup function to disconnect WebSocket connections. */
132
135
  cleanup: () => void;
133
136
  };
package/dist/index.d.ts CHANGED
@@ -4,7 +4,7 @@ import { getAccessToken, saveAccessToken, removeAccessToken, getLoginUrl } from
4
4
  export { createClient, createClientFromRequest, Base44Error, getAccessToken, saveAccessToken, removeAccessToken, getLoginUrl, };
5
5
  export type { Base44Client, CreateClientConfig, CreateClientOptions, Base44ErrorJSON, };
6
6
  export * from "./types.js";
7
- export type { EntitiesModule, EntityHandler, RealtimeEventType, RealtimeEvent, RealtimeCallback, Subscription, } from "./modules/entities.types.js";
7
+ export type { EntitiesModule, EntityHandler, RealtimeEventType, RealtimeEvent, RealtimeCallback, } from "./modules/entities.types.js";
8
8
  export type { AuthModule, LoginResponse, RegisterParams, VerifyOtpParams, ChangePasswordParams, ResetPasswordParams, User, } from "./modules/auth.types.js";
9
9
  export type { IntegrationsModule, IntegrationPackage, IntegrationEndpointFunction, CoreIntegrations, InvokeLLMParams, GenerateImageParams, GenerateImageResult, UploadFileParams, UploadFileResult, SendEmailParams, SendEmailResult, ExtractDataFromUploadedFileParams, ExtractDataFromUploadedFileResult, UploadPrivateFileParams, UploadPrivateFileResult, CreateFileSignedUrlParams, CreateFileSignedUrlResult, } from "./modules/integrations.types.js";
10
10
  export type { FunctionsModule } from "./modules/functions.types.js";
@@ -1,6 +1,8 @@
1
1
  import { getAccessToken } from "../utils/auth-utils.js";
2
2
  export function createAgentsModule({ axios, getSocket, appId, serverUrl, token, }) {
3
3
  const baseURL = `/apps/${appId}/agents`;
4
+ // Track active conversations
5
+ const currentConversations = {};
4
6
  const getConversations = () => {
5
7
  return axios.get(`${baseURL}/conversations`);
6
8
  };
@@ -16,22 +18,39 @@ export function createAgentsModule({ axios, getSocket, appId, serverUrl, token,
16
18
  return axios.post(`${baseURL}/conversations`, conversation);
17
19
  };
18
20
  const addMessage = async (conversation, message) => {
19
- const room = `/agent-conversations/${conversation.id}`;
20
- const socket = getSocket();
21
- await socket.updateModel(room, {
22
- ...conversation,
23
- messages: [...(conversation.messages || []), message],
24
- });
25
- return axios.post(`${baseURL}/conversations/${conversation.id}/messages`, message);
21
+ return axios.post(`${baseURL}/conversations/v2/${conversation.id}/messages`, message);
26
22
  };
27
23
  const subscribeToConversation = (conversationId, onUpdate) => {
28
24
  const room = `/agent-conversations/${conversationId}`;
29
25
  const socket = getSocket();
26
+ // Store the promise for initial conversation state
27
+ const conversationPromise = getConversation(conversationId).then((conv) => {
28
+ currentConversations[conversationId] = conv;
29
+ return conv;
30
+ });
30
31
  return socket.subscribeToRoom(room, {
31
32
  connect: () => { },
32
- update_model: ({ data: jsonStr }) => {
33
- const conv = JSON.parse(jsonStr);
34
- onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(conv);
33
+ update_model: async ({ data: jsonStr }) => {
34
+ const data = JSON.parse(jsonStr);
35
+ if (data._message) {
36
+ // Wait for initial conversation to be loaded
37
+ await conversationPromise;
38
+ const message = data._message;
39
+ // Update shared conversation state
40
+ const currentConversation = currentConversations[conversationId];
41
+ if (currentConversation) {
42
+ const messages = currentConversation.messages || [];
43
+ const existingIndex = messages.findIndex((m) => m.id === message.id);
44
+ const updatedMessages = existingIndex !== -1
45
+ ? messages.map((m, i) => (i === existingIndex ? message : m))
46
+ : [...messages, message];
47
+ currentConversations[conversationId] = {
48
+ ...currentConversation,
49
+ messages: updatedMessages,
50
+ };
51
+ onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(currentConversations[conversationId]);
52
+ }
53
+ }
35
54
  },
36
55
  });
37
56
  };
@@ -72,7 +72,7 @@ export interface AgentMessageMetadata {
72
72
  export interface AgentConversation {
73
73
  /** Unique identifier for the conversation. */
74
74
  id: string;
75
- /** Application ID. */
75
+ /** App ID. */
76
76
  app_id: string;
77
77
  /** Name of the agent in this conversation. */
78
78
  agent_name: string;
@@ -138,9 +138,9 @@ export interface CreateConversationParams {
138
138
  export interface AgentsModuleConfig {
139
139
  /** Axios instance for HTTP requests */
140
140
  axios: AxiosInstance;
141
- /** Function to get WebSocket instance for real-time updates (lazy initialization) */
141
+ /** Function to get WebSocket instance for realtime updates (lazy initialization) */
142
142
  getSocket: () => ReturnType<typeof RoomsSocket>;
143
- /** Application ID */
143
+ /** App ID */
144
144
  appId: string;
145
145
  /** Server URL */
146
146
  serverUrl?: string;
@@ -151,7 +151,7 @@ export interface AgentsModuleConfig {
151
151
  * Agents module for managing AI agent conversations.
152
152
  *
153
153
  * This module provides methods to create and manage conversations with AI agents,
154
- * send messages, and subscribe to real-time updates. Conversations can be used
154
+ * send messages, and subscribe to realtime updates. Conversations can be used
155
155
  * for chat interfaces, support systems, or any interactive AI app.
156
156
  *
157
157
  * The agents module enables you to:
@@ -159,7 +159,7 @@ export interface AgentsModuleConfig {
159
159
  * - **Create conversations** with agents defined in the app.
160
160
  * - **Send messages** from users to agents and receive AI-generated responses.
161
161
  * - **Retrieve conversations** individually or as filtered lists with sorting and pagination.
162
- * - **Subscribe to real-time updates** using WebSocket connections to receive instant notifications when new messages arrive.
162
+ * - **Subscribe to realtime updates** using WebSocket connections to receive instant notifications when new messages arrive.
163
163
  * - **Attach metadata** to conversations for tracking context, categories, priorities, or linking to external systems.
164
164
  * - **Generate WhatsApp connection URLs** for users to interact with agents through WhatsApp.
165
165
  *
@@ -275,7 +275,7 @@ export interface AgentsModule {
275
275
  * Adds a message to a conversation.
276
276
  *
277
277
  * Sends a message to the agent and updates the conversation. This method
278
- * also updates the real-time socket to notify any subscribers.
278
+ * also updates the realtime socket to notify any subscribers.
279
279
  *
280
280
  * @param conversation - The conversation to add the message to.
281
281
  * @param message - The message to add.
@@ -293,19 +293,25 @@ export interface AgentsModule {
293
293
  */
294
294
  addMessage(conversation: AgentConversation, message: Partial<AgentMessage>): Promise<AgentMessage>;
295
295
  /**
296
- * Subscribes to real-time updates for a conversation.
296
+ * Subscribes to realtime updates for a conversation.
297
297
  *
298
298
  * Establishes a WebSocket connection to receive instant updates when new
299
299
  * messages are added to the conversation. Returns an unsubscribe function
300
300
  * to clean up the connection.
301
301
  *
302
302
  * @param conversationId - The conversation ID to subscribe to.
303
- * @param onUpdate - Callback function called when the conversation is updated.
303
+ * @param onUpdate - Callback function called when the conversation is updated. The callback receives a conversation object with the following properties:
304
+ * - `id`: Unique identifier for the conversation.
305
+ * - `agent_name`: Name of the agent in this conversation.
306
+ * - `created_date`: ISO 8601 timestamp of when the conversation was created.
307
+ * - `updated_date`: ISO 8601 timestamp of when the conversation was last updated.
308
+ * - `messages`: Array of messages in the conversation. Each message includes `id`, `role` (`'user'`, `'assistant'`, or `'system'`), `content`, `created_date`, and optionally `tool_calls`, `reasoning`, `file_urls`, and `usage`.
309
+ * - `metadata`: Optional metadata associated with the conversation.
304
310
  * @returns Unsubscribe function to stop receiving updates.
305
311
  *
306
312
  * @example
307
313
  * ```typescript
308
- * // Subscribe to real-time updates
314
+ * // Subscribe to realtime updates
309
315
  * const unsubscribe = base44.agents.subscribeToConversation(
310
316
  * 'conv-123',
311
317
  * (updatedConversation) => {
@@ -1,8 +1,38 @@
1
+ /**
2
+ * Properties for analytics events.
3
+ *
4
+ * Key-value pairs with additional event data. Values can be strings, numbers, booleans, or null.
5
+ */
1
6
  export type TrackEventProperties = {
2
7
  [key: string]: string | number | boolean | null | undefined;
3
8
  };
9
+ /**
10
+ * Parameters for tracking an analytics event.
11
+ */
4
12
  export type TrackEventParams = {
13
+ /**
14
+ * Name of the event to track.
15
+ *
16
+ * Use descriptive names like `button_click`, `form_submit`, or `purchase_completed`.
17
+ */
5
18
  eventName: string;
19
+ /**
20
+ * Optional key-value pairs with additional event data.
21
+ *
22
+ * Values can be strings, numbers, booleans, or null.
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * base44.analytics.track({
27
+ * eventName: 'add_to_cart',
28
+ * properties: {
29
+ * product_id: 'prod_123',
30
+ * price: 29.99,
31
+ * quantity: 2
32
+ * }
33
+ * });
34
+ * ```
35
+ */
6
36
  properties?: TrackEventProperties;
7
37
  };
8
38
  export type TrackEventIntrinsicData = {
@@ -37,6 +67,52 @@ export type AnalyticsModuleOptions = {
37
67
  batchSize?: number;
38
68
  heartBeatInterval?: number;
39
69
  };
40
- export type AnalyticsModule = {
41
- track: (params: TrackEventParams) => void;
42
- };
70
+ /**
71
+ * Analytics module for tracking custom events in your app.
72
+ *
73
+ * Use this module to track specific user actions. Track things like button clicks, form submissions, purchases, and feature usage.
74
+ *
75
+ * <Note> Analytics events tracked with this module appear as custom event cards in the [Analytics dashboard](/documentation/performance-and-seo/app-analytics).</Note>
76
+ *
77
+ * When tracking events:
78
+ *
79
+ * - Choose clear, descriptive event names in snake_case like `signup_button_click` or `purchase_completed` rather than generic names like `click`.
80
+ * - Include relevant context in your properties such as identifiers like `product_id`, measurements like `price`, and flags like `is_first_purchase`.
81
+ *
82
+ * This module is only available in user authentication mode (`base44.analytics`).
83
+ */
84
+ export interface AnalyticsModule {
85
+ /**
86
+ * Tracks a custom event that appears as a card in your Analytics dashboard.
87
+ *
88
+ * Each unique event name becomes its own card showing total count and trends over time. This method returns immediately and events are sent in batches in the background.
89
+ *
90
+ * @param params - Event parameters.
91
+ * @param params.eventName - Name of the event. This becomes the card title in your dashboard. Use descriptive names like `'signup_button_click'` or `'purchase_completed'`.
92
+ * @param params.properties - Optional data to attach to the event. You can filter and analyze events by these properties in the dashboard.
93
+ *
94
+ * @example Track a button click
95
+ * ```typescript
96
+ * // Track a button click
97
+ * base44.analytics.track({
98
+ * eventName: 'signup_button_click'
99
+ * });
100
+ * ```
101
+ *
102
+ * @example Track with properties
103
+ * ```typescript
104
+ * // Track with properties
105
+ * base44.analytics.track({
106
+ * eventName: 'add_to_cart',
107
+ * properties: {
108
+ * product_id: 'prod_123',
109
+ * product_name: 'Premium Widget',
110
+ * price: 29.99,
111
+ * quantity: 2,
112
+ * is_first_purchase: true
113
+ * }
114
+ * });
115
+ * ```
116
+ */
117
+ track(params: TrackEventParams): void;
118
+ }
@@ -25,27 +25,25 @@ export function createAuthModule(axios, functionsAxiosClient, appId, options) {
25
25
  if (typeof window === "undefined") {
26
26
  throw new Error("Login method can only be used in a browser environment");
27
27
  }
28
- // Skip redirect if already on login page to avoid redirect loop
29
- if (window.location.pathname === "/login") {
30
- return;
31
- }
32
28
  // If nextUrl is not provided, use the current URL
33
29
  const redirectUrl = nextUrl
34
30
  ? new URL(nextUrl, window.location.origin).toString()
35
31
  : window.location.href;
36
- // For preview URLs (preview--*), redirect to main app's login page
37
- // but keep from_url pointing to the preview URL
38
- let loginBaseUrl = (_a = options.appBaseUrl) !== null && _a !== void 0 ? _a : "";
39
- const hostname = window.location.hostname;
40
- if (hostname.startsWith("preview--")) {
41
- const mainHostname = hostname.replace(/^preview--/, "");
42
- loginBaseUrl = `${window.location.protocol}//${mainHostname}${window.location.port ? ":" + window.location.port : ""}`;
43
- }
44
32
  // Build the login URL
45
- const loginUrl = `${loginBaseUrl}/login?from_url=${encodeURIComponent(redirectUrl)}`;
33
+ const loginUrl = `${(_a = options.appBaseUrl) !== null && _a !== void 0 ? _a : ""}/login?from_url=${encodeURIComponent(redirectUrl)}`;
46
34
  // Redirect to the login page
47
35
  window.location.href = loginUrl;
48
36
  },
37
+ // Redirects the user to a provider's login page
38
+ loginWithProvider(provider, fromUrl = "/") {
39
+ // Build the full redirect URL
40
+ const redirectUrl = new URL(fromUrl, window.location.origin).toString();
41
+ // Build the provider login URL (google is the default, so no provider path needed)
42
+ const providerPath = provider === "google" ? "" : `/${provider}`;
43
+ const loginUrl = `${options.serverUrl}/api/apps/auth${providerPath}/login?app_id=${appId}&from_url=${encodeURIComponent(redirectUrl)}`;
44
+ // Redirect to the provider login page
45
+ window.location.href = loginUrl;
46
+ },
49
47
  // Logout the current user
50
48
  // Removes the token from localStorage and optionally redirects to a URL or reloads the page
51
49
  logout(redirectUrl) {
@@ -171,6 +171,32 @@ export interface AuthModule {
171
171
  * ```
172
172
  */
173
173
  redirectToLogin(nextUrl: string): void;
174
+ /**
175
+ * Redirects the user to a third-party authentication provider's login page.
176
+ *
177
+ * Initiates an OAuth login flow with one of the built-in providers. Requires a browser environment and can't be used in the backend.
178
+ *
179
+ * Supported providers:
180
+ * - `'google'` - {@link https://developers.google.com/identity/protocols/oauth2 | Google OAuth}. Enabled by default.
181
+ * - `'microsoft'` - {@link https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-auth-code-flow | Microsoft OAuth}. Enable Microsoft in your app's authentication settings before specifying this provider.
182
+ * - `'facebook'` - {@link https://developers.facebook.com/docs/facebook-login | Facebook Login}. Enable this in your app's authentication settings before using.
183
+ *
184
+ * @param provider - The authentication provider to use: `'google'`, `'microsoft'`, or `'facebook'`.
185
+ * @param fromUrl - URL to redirect to after successful authentication. Defaults to `'/'`.
186
+ *
187
+ * @example
188
+ * ```typescript
189
+ * // Login with Google and return to current page
190
+ * base44.auth.loginWithProvider('google', window.location.pathname);
191
+ * ```
192
+ *
193
+ * @example
194
+ * ```typescript
195
+ * // Login with Microsoft and redirect to dashboard
196
+ * base44.auth.loginWithProvider('microsoft', '/dashboard');
197
+ * ```
198
+ */
199
+ loginWithProvider(provider: string, fromUrl?: string): void;
174
200
  /**
175
201
  * Logs out the current user.
176
202
  *
@@ -11,9 +11,7 @@ export interface ConnectorAccessTokenResponse {
11
11
  /**
12
12
  * Connectors module for managing OAuth tokens for external services.
13
13
  *
14
- * This module allows you to retrieve OAuth access tokens for external services
15
- * that the app has connected to. Use these tokens to make API
16
- * calls to external services.
14
+ * This module allows you to retrieve OAuth access tokens for external services that the app has connected to. Connectors are app-scoped. When an app builder connects an integration like Google Calendar or Slack, all users of the app share that same connection.
17
15
  *
18
16
  * Unlike the integrations module that provides pre-built functions, connectors give you
19
17
  * raw OAuth tokens so you can call external service APIs directly with full control over
@@ -26,9 +24,9 @@ export interface ConnectorsModule {
26
24
  /**
27
25
  * Retrieves an OAuth access token for a specific external integration type.
28
26
  *
29
- * Returns the OAuth token string for an external service that the app
30
- * has connected to. You can then use this token to make authenticated API calls
31
- * to that external service.
27
+ * Returns the OAuth token string for an external service that an app builder
28
+ * has connected to. This token represents the connected app builder's account
29
+ * and can be used to make authenticated API calls to that external service on behalf of the app.
32
30
  *
33
31
  * @param integrationType - The type of integration, such as `'googlecalendar'`, `'slack'`, or `'github'`.
34
32
  * @returns Promise resolving to the access token string.
@@ -1,5 +1,6 @@
1
1
  /**
2
2
  * Parameters for calling a custom integration endpoint.
3
+ * @internal
3
4
  */
4
5
  export interface CustomIntegrationCallParams {
5
6
  /**
@@ -7,21 +8,17 @@ export interface CustomIntegrationCallParams {
7
8
  */
8
9
  payload?: Record<string, any>;
9
10
  /**
10
- * Path parameters to substitute in the URL (e.g., `{ owner: "user", repo: "repo" }`).
11
+ * Path parameters to substitute in the URL. For example, `{ owner: "user", repo: "repo" }`.
11
12
  */
12
13
  pathParams?: Record<string, string>;
13
14
  /**
14
15
  * Query string parameters to append to the URL.
15
16
  */
16
17
  queryParams?: Record<string, any>;
17
- /**
18
- * Additional headers to send with this specific request.
19
- * These are merged with the integration's configured headers.
20
- */
21
- headers?: Record<string, string>;
22
18
  }
23
19
  /**
24
20
  * Response from a custom integration call.
21
+ * @internal
25
22
  */
26
23
  export interface CustomIntegrationCallResponse {
27
24
  /**
@@ -39,60 +36,17 @@ export interface CustomIntegrationCallResponse {
39
36
  data: any;
40
37
  }
41
38
  /**
42
- * Module for calling custom workspace-level API integrations.
43
- *
44
- * Custom integrations allow workspace administrators to connect any external API
45
- * by importing an OpenAPI specification. Apps in the workspace can then call
46
- * these integrations using this module.
47
- *
48
- * Unlike the built-in integrations (like `Core`), custom integrations:
49
- * - Are defined per-workspace by importing OpenAPI specs
50
- * - Use a slug-based identifier instead of package names
51
- * - Proxy requests through Base44's backend (credentials never exposed to frontend)
52
- *
53
- * @example
54
- * ```typescript
55
- * // Call a custom GitHub integration
56
- * const response = await base44.integrations.custom.call(
57
- * "github", // integration slug (defined by workspace admin)
58
- * "listIssues", // operation ID from the OpenAPI spec
59
- * {
60
- * pathParams: { owner: "myorg", repo: "myrepo" },
61
- * queryParams: { state: "open", per_page: 100 }
62
- * }
63
- * );
39
+ * Module for calling custom pre-configured API integrations.
64
40
  *
65
- * if (response.success) {
66
- * console.log("Issues:", response.data);
67
- * } else {
68
- * console.error("API returned error:", response.status_code);
69
- * }
70
- * ```
71
- *
72
- * @example
73
- * ```typescript
74
- * // Call with request body payload
75
- * const response = await base44.integrations.custom.call(
76
- * "github",
77
- * "createIssue",
78
- * {
79
- * pathParams: { owner: "myorg", repo: "myrepo" },
80
- * payload: {
81
- * title: "Bug report",
82
- * body: "Something is broken",
83
- * labels: ["bug"]
84
- * }
85
- * }
86
- * );
87
- * ```
41
+ * Custom integrations allow workspace administrators to connect any external API by importing an OpenAPI specification. Apps in the workspace can then call these integrations using this module.
88
42
  */
89
43
  export interface CustomIntegrationsModule {
90
44
  /**
91
45
  * Call a custom integration endpoint.
92
46
  *
93
- * @param slug - The integration's unique identifier (slug), as defined by the workspace admin.
94
- * @param operationId - The operation ID from the OpenAPI spec (e.g., "listIssues", "getUser").
95
- * @param params - Optional parameters including payload, pathParams, queryParams, and headers.
47
+ * @param slug - The integration's unique identifier, as defined by the workspace admin.
48
+ * @param operationId - The endpoint in `method:path` format. For example, `"get:/contacts"`, or `"post:/users/{id}"`. The method is the HTTP verb in lowercase and the path matches the OpenAPI specification.
49
+ * @param params - Optional parameters including payload, pathParams, and queryParams.
96
50
  * @returns Promise resolving to the integration call response.
97
51
  *
98
52
  * @throws {Error} If slug is not provided.
@@ -100,6 +54,36 @@ export interface CustomIntegrationsModule {
100
54
  * @throws {Base44Error} If the integration or operation is not found (404).
101
55
  * @throws {Base44Error} If the external API call fails (502).
102
56
  * @throws {Base44Error} If the request times out (504).
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * // Call a custom CRM integration
61
+ * const response = await base44.integrations.custom.call(
62
+ * "my-crm",
63
+ * "get:/contacts",
64
+ * { queryParams: { limit: 10 } }
65
+ * );
66
+ *
67
+ * if (response.success) {
68
+ * console.log("Contacts:", response.data);
69
+ * }
70
+ * ```
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * // Call with path params and request body
75
+ * const response = await base44.integrations.custom.call(
76
+ * "github",
77
+ * "post:/repos/{owner}/{repo}/issues",
78
+ * {
79
+ * pathParams: { owner: "myorg", repo: "myrepo" },
80
+ * payload: {
81
+ * title: "Bug report",
82
+ * body: "Something is broken"
83
+ * }
84
+ * }
85
+ * );
86
+ * ```
103
87
  */
104
88
  call(slug: string, operationId: string, params?: CustomIntegrationCallParams): Promise<CustomIntegrationCallResponse>;
105
89
  }
@@ -19,10 +19,6 @@ export interface RealtimeEvent {
19
19
  * Callback function invoked when a realtime event occurs.
20
20
  */
21
21
  export type RealtimeCallback = (event: RealtimeEvent) => void;
22
- /**
23
- * Function returned from subscribe, call it to unsubscribe.
24
- */
25
- export type Subscription = () => void;
26
22
  /**
27
23
  * Entity handler providing CRUD operations for a specific entity type.
28
24
  *
@@ -35,6 +31,8 @@ export interface EntityHandler {
35
31
  * Retrieves all records of this type with support for sorting,
36
32
  * pagination, and field selection.
37
33
  *
34
+ * **Note:** The maximum limit is 5,000 items per request.
35
+ *
38
36
  * @param sort - Sort parameter, such as `'-created_date'` for descending. Defaults to `'-created_date'`.
39
37
  * @param limit - Maximum number of results to return. Defaults to `50`.
40
38
  * @param skip - Number of results to skip for pagination. Defaults to `0`.
@@ -73,6 +71,8 @@ export interface EntityHandler {
73
71
  * Retrieves records that match specific criteria with support for
74
72
  * sorting, pagination, and field selection.
75
73
  *
74
+ * **Note:** The maximum limit is 5,000 items per request.
75
+ *
76
76
  * @param query - Query object with field-value pairs. Each key should be a field name
77
77
  * from your entity schema, and each value is the criteria to match. Records matching all
78
78
  * specified criteria are returned. Field names are case-sensitive.
@@ -270,10 +270,16 @@ export interface EntityHandler {
270
270
  /**
271
271
  * Subscribes to realtime updates for all records of this entity type.
272
272
  *
273
- * Receives notifications whenever any record is created, updated, or deleted.
273
+ * Establishes a WebSocket connection to receive instant updates when any
274
+ * record is created, updated, or deleted. Returns an unsubscribe function
275
+ * to clean up the connection.
274
276
  *
275
- * @param callback - Function called when an entity changes.
276
- * @returns Unsubscribe function to stop listening.
277
+ * @param callback - Callback function called when an entity changes. The callback receives an event object with the following properties:
278
+ * - `type`: The type of change that occurred - `'create'`, `'update'`, or `'delete'`.
279
+ * - `data`: The entity data after the change.
280
+ * - `id`: The unique identifier of the affected entity.
281
+ * - `timestamp`: ISO 8601 timestamp of when the event occurred.
282
+ * @returns Unsubscribe function to stop receiving updates.
277
283
  *
278
284
  * @example
279
285
  * ```typescript
@@ -282,11 +288,11 @@ export interface EntityHandler {
282
288
  * console.log(`Task ${event.id} was ${event.type}d:`, event.data);
283
289
  * });
284
290
  *
285
- * // Later, unsubscribe
291
+ * // Later, clean up the subscription
286
292
  * unsubscribe();
287
293
  * ```
288
294
  */
289
- subscribe(callback: RealtimeCallback): Subscription;
295
+ subscribe(callback: RealtimeCallback): () => void;
290
296
  }
291
297
  /**
292
298
  * Entities module for managing app data.
@@ -320,22 +320,28 @@ export interface CoreIntegrations {
320
320
  CreateFileSignedUrl(params: CreateFileSignedUrlParams): Promise<CreateFileSignedUrlResult>;
321
321
  }
322
322
  /**
323
- * Integrations module for calling integration endpoints.
323
+ * Integrations module for calling integration methods.
324
324
  *
325
- * This module provides access to integration endpoints for interacting with external
326
- * services. Integrations are organized into packages. Base44 provides built-in integrations
327
- * in the `Core` package.
325
+ * This module provides access to integration methods for interacting with external services. Unlike the connectors module that gives you raw OAuth tokens, integrations provide pre-built functions that Base44 executes on your behalf.
328
326
  *
329
- * Unlike the connectors module that gives you raw OAuth tokens, integrations provide
330
- * pre-built functions that Base44 executes on your behalf.
327
+ * There are two types of integrations:
331
328
  *
332
- * Integration endpoints are accessed dynamically using the pattern:
333
- * `base44.integrations.PackageName.EndpointName(params)`
329
+ * - **Built-in integrations** (`Core`): Pre-built functions provided by Base44 for common tasks such as AI-powered text generation, image creation, file uploads, and email. Access core integration methods using:
330
+ * ```
331
+ * base44.integrations.Core.FunctionName(params)
332
+ * ```
333
+ *
334
+ * - **Custom integrations** (`custom`): Pre-configured external APIs. Custom integration calls are proxied through Base44's backend, so credentials are never exposed to the frontend. Access custom integration methods using:
335
+ * ```
336
+ * base44.integrations.custom.call(slug, operationId, params)
337
+ * ```
338
+ *
339
+ * <Info>To call a custom integration, it must be pre-configured by a workspace administrator who imports an OpenAPI specification.</Info>
334
340
  *
335
341
  * This module is available to use with a client in all authentication modes:
336
342
  *
337
- * - **Anonymous or User authentication** (`base44.integrations`): Integration endpoints are invoked with the current user's permissions. Anonymous users invoke endpoints without authentication, while authenticated users invoke endpoints with their authentication context.
338
- * - **Service role authentication** (`base44.asServiceRole.integrations`): Integration endpoints are invoked with elevated admin-level permissions. The endpoints execute with admin authentication context.
343
+ * - **Anonymous or User authentication** (`base44.integrations`): Integration methods are invoked with the current user's permissions. Anonymous users invoke methods without authentication, while authenticated users invoke methods with their authentication context.
344
+ * - **Service role authentication** (`base44.asServiceRole.integrations`): Integration methods are invoked with elevated admin-level permissions. The methods execute with admin authentication context.
339
345
  */
340
346
  export type IntegrationsModule = {
341
347
  /**
@@ -343,22 +349,7 @@ export type IntegrationsModule = {
343
349
  */
344
350
  Core: CoreIntegrations;
345
351
  /**
346
- * Custom integrations module for calling workspace-level API integrations.
347
- *
348
- * Allows calling external APIs that workspace admins have configured
349
- * by importing OpenAPI specifications.
350
- *
351
- * @example
352
- * ```typescript
353
- * const response = await base44.integrations.custom.call(
354
- * "github", // integration slug
355
- * "listIssues", // operation ID
356
- * {
357
- * pathParams: { owner: "myorg", repo: "myrepo" },
358
- * queryParams: { state: "open" }
359
- * }
360
- * );
361
- * ```
352
+ * Custom integrations module for calling pre-configured external APIs.
362
353
  */
363
354
  custom: CustomIntegrationsModule;
364
355
  } & {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@base44-preview/sdk",
3
- "version": "0.8.17-pr.77.dfc0f63",
3
+ "version": "0.8.18-pr.106.9dda1d0",
4
4
  "description": "JavaScript SDK for Base44 API",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -19,7 +19,8 @@
19
19
  "docs": "typedoc",
20
20
  "prepublishOnly": "npm run build",
21
21
  "create-docs": "npm run create-docs:generate && npm run create-docs:process",
22
- "push-docs": "node scripts/mintlify-post-processing/push-to-docs-repo.js",
22
+ "create-docs-local": "npm run create-docs && npm run copy-docs-local",
23
+ "copy-docs-local": "node scripts/mintlify-post-processing/copy-to-local-docs.js",
23
24
  "create-docs:generate": "typedoc",
24
25
  "create-docs:process": "node scripts/mintlify-post-processing/file-processing/file-processing.js"
25
26
  },