capacitor-gleap-plugin 15.3.4 → 16.4.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.
@@ -13,6 +13,6 @@ Pod::Spec.new do |s|
13
13
  s.source_files = 'ios/Plugin/**/*.{swift,h,m,c,cc,mm,cpp}'
14
14
  s.ios.deployment_target = '14.0'
15
15
  s.dependency 'Capacitor'
16
- s.dependency 'Gleap', '15.3.4'
16
+ s.dependency 'Gleap', '16.4.0'
17
17
  s.swift_version = '5.1'
18
18
  end
package/README.md CHANGED
@@ -39,7 +39,9 @@ Please install the plugin version from our capacitor-v4 brunch with `npm install
39
39
  * [`setTags(...)`](#settags)
40
40
  * [`setNetworkLogsBlacklist(...)`](#setnetworklogsblacklist)
41
41
  * [`setNetworkLogPropsToIgnore(...)`](#setnetworklogpropstoignore)
42
- * [`setAiTools(...)`](#setaitools)
42
+ * [`registerAgentTool(...)`](#registeragenttool)
43
+ * [`sendAgentToolResult(...)`](#sendagenttoolresult)
44
+ * [`addListener('agentToolExecution', ...)`](#addlisteneragenttoolexecution-)
43
45
  * [`setTicketAttribute(...)`](#setticketattribute)
44
46
  * [`unsetTicketAttribute(...)`](#unsetticketattribute)
45
47
  * [`clearTicketAttributes()`](#clearticketattributes)
@@ -299,21 +301,60 @@ Set network logs props to ignore
299
301
  --------------------
300
302
 
301
303
 
302
- ### setAiTools(...)
304
+ ### registerAgentTool(...)
303
305
 
304
306
  ```typescript
305
- setAiTools(options: { tools: { name: string; description: string; response: string; executionType: "auto" | "button"; parameters: { name: string; description: string; type: "string" | "number" | "boolean"; required: boolean; enums?: string[]; }[]; }[]; }) => Promise<{ aiToolsSet: boolean; }>
307
+ registerAgentTool(options: { name: string; }) => Promise<void>
306
308
  ```
307
309
 
308
- Sets the AI tools to use
310
+ Registers a Frontend tool defined on your AI agent in the Gleap dashboard.
311
+ Prefer the `registerAgentTool(name, handler)` helper exported by this
312
+ package — it wires the agentToolExecution event and result round-trip for
313
+ you.
309
314
 
310
- | Param | Type |
311
- | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
312
- | **`options`** | <code>{ tools: { name: string; description: string; response: string; executionType: 'auto' \| 'button'; parameters: { name: string; description: string; type: 'string' \| 'number' \| 'boolean'; required: boolean; enums?: string[]; }[]; }[]; }</code> |
315
+ | Param | Type |
316
+ | ------------- | ------------------------------ |
317
+ | **`options`** | <code>{ name: string; }</code> |
313
318
 
314
- **Returns:** <code>Promise&lt;{ aiToolsSet: boolean; }&gt;</code>
319
+ **Since:** 15.0.0
315
320
 
316
- **Since:** 13.5.0
321
+ --------------------
322
+
323
+
324
+ ### sendAgentToolResult(...)
325
+
326
+ ```typescript
327
+ sendAgentToolResult(options: { executionId: string; result: string; }) => Promise<void>
328
+ ```
329
+
330
+ Resolves a pending agent tool execution with the handler's result.
331
+ Used by the `registerAgentTool(name, handler)` helper.
332
+
333
+ | Param | Type |
334
+ | ------------- | ----------------------------------------------------- |
335
+ | **`options`** | <code>{ executionId: string; result: string; }</code> |
336
+
337
+ **Since:** 15.0.0
338
+
339
+ --------------------
340
+
341
+
342
+ ### addListener('agentToolExecution', ...)
343
+
344
+ ```typescript
345
+ addListener(eventName: 'agentToolExecution', listenerFunc: (data: { executionId: string; name: string; params: any; }) => void) => Promise<PluginListenerHandle>
346
+ ```
347
+
348
+ Called when a registered agent tool should execute.
349
+
350
+ | Param | Type |
351
+ | ------------------ | ----------------------------------------------------------------------------------- |
352
+ | **`eventName`** | <code>'agentToolExecution'</code> |
353
+ | **`listenerFunc`** | <code>(data: { executionId: string; name: string; params: any; }) =&gt; void</code> |
354
+
355
+ **Returns:** <code>Promise&lt;<a href="#pluginlistenerhandle">PluginListenerHandle</a>&gt;</code>
356
+
357
+ **Since:** 15.0.0
317
358
 
318
359
  --------------------
319
360
 
@@ -1643,6 +1684,13 @@ Creates a new function.
1643
1684
  | **`value`** | <code>string</code> |
1644
1685
 
1645
1686
 
1687
+ #### PluginListenerHandle
1688
+
1689
+ | Prop | Type |
1690
+ | ------------ | ----------------------------------------- |
1691
+ | **`remove`** | <code>() =&gt; Promise&lt;void&gt;</code> |
1692
+
1693
+
1646
1694
  #### GleapEventMessage
1647
1695
 
1648
1696
  | Prop | Type |
@@ -55,5 +55,5 @@ dependencies {
55
55
  testImplementation "junit:junit:$junitVersion"
56
56
  androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
57
57
  androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
58
- implementation group: 'io.gleap', name: 'gleap-android-sdk', version: '15.3.1'
58
+ implementation group: 'io.gleap', name: 'gleap-android-sdk', version: '16.4.0'
59
59
  }
@@ -12,13 +12,13 @@ import com.getcapacitor.annotation.CapacitorPlugin;
12
12
  import com.getcapacitor.annotation.Permission;
13
13
  import io.gleap.APPLICATIONTYPE;
14
14
  import io.gleap.Gleap;
15
- import io.gleap.GleapAiTool;
16
- import io.gleap.GleapAiToolParameter;
17
15
  import io.gleap.GleapLogLevel;
18
16
  import io.gleap.GleapNotInitialisedException;
19
17
  import io.gleap.GleapSessionProperties;
20
18
  import io.gleap.SurveyType;
21
19
  import io.gleap.callbacks.AiToolExecutedCallback;
20
+ import io.gleap.callbacks.GleapAgentToolHandler;
21
+ import io.gleap.callbacks.GleapAgentToolResultCallback;
22
22
  import io.gleap.callbacks.InitializedCallback;
23
23
  import io.gleap.callbacks.ConfigLoadedCallback;
24
24
  import io.gleap.callbacks.CustomActionCallback;
@@ -37,6 +37,9 @@ import java.io.OutputStream;
37
37
  import java.util.ArrayList;
38
38
  import java.util.Base64;
39
39
  import java.util.List;
40
+ import java.util.Map;
41
+ import java.util.UUID;
42
+ import java.util.concurrent.ConcurrentHashMap;
40
43
  import java.util.regex.Matcher;
41
44
  import java.util.regex.Pattern;
42
45
 
@@ -54,6 +57,7 @@ import org.json.JSONObject;
54
57
  public class GleapPlugin extends Plugin {
55
58
 
56
59
  private Gleap implementation;
60
+ private final Map<String, GleapAgentToolResultCallback> pendingAgentToolExecutions = new ConcurrentHashMap<>();
57
61
 
58
62
  @Override
59
63
  public void load() {
@@ -315,87 +319,53 @@ public class GleapPlugin extends Plugin {
315
319
  call.resolve(ret);
316
320
  }
317
321
 
322
+ /**
323
+ * Registers the handler for a dashboard-defined Frontend tool. Executions
324
+ * round-trip to JS via the agentToolExecution event and sendAgentToolResult.
325
+ */
318
326
  @PluginMethod
319
- public void setAiTools(PluginCall call) {
320
- JSONArray toolsArray = call.getArray("tools");
321
- if (toolsArray == null) {
322
- call.reject("Must provide tools");
327
+ public void registerAgentTool(PluginCall call) {
328
+ final String name = call.getString("name");
329
+ if (name == null || name.isEmpty()) {
330
+ call.reject("Must provide a name");
323
331
  return;
324
332
  }
325
333
 
326
- List<GleapAiTool> aiTools = new ArrayList<>();
327
-
328
- for (int i = 0; i < toolsArray.length(); i++) {
329
- JSONObject toolDict = toolsArray.optJSONObject(i);
330
- if (toolDict == null) {
331
- continue; // Skip if it's not a JSONObject
332
- }
333
-
334
- String name = toolDict.optString("name", null);
335
- String toolDescription = toolDict.optString("description", null);
336
- String response = toolDict.optString("response", null);
337
- String executionType = toolDict.optString("executionType", null);
338
- JSONArray parametersArray = toolDict.optJSONArray("parameters");
339
-
340
- if (name == null || toolDescription == null || response == null || parametersArray == null) {
341
- continue; // Skip if any required fields are missing
342
- }
343
-
344
- List<GleapAiToolParameter> parameters = new ArrayList<>();
345
-
346
- for (int j = 0; j < parametersArray.length(); j++) {
347
- JSONObject paramDict = parametersArray.optJSONObject(j);
348
- if (paramDict == null) {
349
- continue; // Skip if it's not a JSONObject
350
- }
351
-
352
- String paramName = paramDict.optString("name", null);
353
- String paramDescription = paramDict.optString("description", null);
354
- String type = paramDict.optString("type", null);
355
- boolean required = paramDict.optBoolean("required", false);
356
- JSONArray enumArray = paramDict.optJSONArray
357
- ("enum");
358
- String[] enums = null;
359
- if (enumArray != null) {
360
- enums = new String[enumArray.length()];
361
- for (int k = 0; k < enumArray.length(); k++) {
362
- enums[k] = enumArray.optString(k);
363
- }
364
- }
365
-
366
- if (paramName == null || paramDescription == null || type == null) {
367
- continue; // Skip if any required parameter fields are missing
368
- }
334
+ implementation.registerAgentTool(name, new GleapAgentToolHandler() {
335
+ @Override
336
+ public void execute(JSONObject params, GleapAgentToolResultCallback callback) {
337
+ String executionId = UUID.randomUUID().toString();
338
+ pendingAgentToolExecutions.put(executionId, callback);
369
339
 
370
- GleapAiToolParameter parameter = new GleapAiToolParameter(
371
- paramName,
372
- paramDescription,
373
- type,
374
- required,
375
- enums
376
- );
340
+ JSObject eventData = new JSObject();
341
+ eventData.put("executionId", executionId);
342
+ eventData.put("name", name);
343
+ eventData.put("params", params != null ? params : new JSONObject());
377
344
 
378
- parameters.add(parameter);
345
+ notifyListeners("agentToolExecution", eventData);
379
346
  }
347
+ });
380
348
 
381
- GleapAiTool aiTool = new GleapAiTool(
382
- name,
383
- toolDescription,
384
- response,
385
- executionType,
386
- parameters.toArray(new GleapAiToolParameter[0]) // Convert List to Array
387
- );
349
+ call.resolve();
350
+ }
388
351
 
389
- aiTools.add(aiTool);
352
+ /**
353
+ * Resolves a pending agent tool execution with the handler's result.
354
+ */
355
+ @PluginMethod
356
+ public void sendAgentToolResult(PluginCall call) {
357
+ String executionId = call.getString("executionId");
358
+ if (executionId == null || executionId.isEmpty()) {
359
+ call.reject("Must provide an executionId");
360
+ return;
390
361
  }
391
362
 
392
- // Set the AI tools using the static method from Gleap SDK
393
- Gleap.getInstance().setAiTools(aiTools.toArray(new GleapAiTool[0])); // Convert List to Array
363
+ GleapAgentToolResultCallback callback = pendingAgentToolExecutions.remove(executionId);
364
+ if (callback != null) {
365
+ callback.onResult(call.getString("result"));
366
+ }
394
367
 
395
- // Build Json object and resolve success
396
- JSObject ret = new JSObject();
397
- ret.put("aiToolsSet", true);
398
- call.resolve(ret);
368
+ call.resolve();
399
369
  }
400
370
 
401
371
  /**
package/dist/docs.json CHANGED
@@ -244,25 +244,74 @@
244
244
  "slug": "setnetworklogpropstoignore"
245
245
  },
246
246
  {
247
- "name": "setAiTools",
248
- "signature": "(options: { tools: { name: string; description: string; response: string; executionType: \"auto\" | \"button\"; parameters: { name: string; description: string; type: \"string\" | \"number\" | \"boolean\"; required: boolean; enums?: string[]; }[]; }[]; }) => Promise<{ aiToolsSet: boolean; }>",
247
+ "name": "registerAgentTool",
248
+ "signature": "(options: { name: string; }) => Promise<void>",
249
249
  "parameters": [
250
250
  {
251
251
  "name": "options",
252
252
  "docs": "",
253
- "type": "{ tools: { name: string; description: string; response: string; executionType: 'auto' | 'button'; parameters: { name: string; description: string; type: 'string' | 'number' | 'boolean'; required: boolean; enums?: string[] | undefined; }[]; }[]; }"
253
+ "type": "{ name: string; }"
254
254
  }
255
255
  ],
256
- "returns": "Promise<{ aiToolsSet: boolean; }>",
256
+ "returns": "Promise<void>",
257
257
  "tags": [
258
258
  {
259
259
  "name": "since",
260
- "text": "13.5.0"
260
+ "text": "15.0.0"
261
261
  }
262
262
  ],
263
- "docs": "Sets the AI tools to use",
263
+ "docs": "Registers a Frontend tool defined on your AI agent in the Gleap dashboard.\nPrefer the `registerAgentTool(name, handler)` helper exported by this\npackage — it wires the agentToolExecution event and result round-trip for\nyou.",
264
264
  "complexTypes": [],
265
- "slug": "setaitools"
265
+ "slug": "registeragenttool"
266
+ },
267
+ {
268
+ "name": "sendAgentToolResult",
269
+ "signature": "(options: { executionId: string; result: string; }) => Promise<void>",
270
+ "parameters": [
271
+ {
272
+ "name": "options",
273
+ "docs": "",
274
+ "type": "{ executionId: string; result: string; }"
275
+ }
276
+ ],
277
+ "returns": "Promise<void>",
278
+ "tags": [
279
+ {
280
+ "name": "since",
281
+ "text": "15.0.0"
282
+ }
283
+ ],
284
+ "docs": "Resolves a pending agent tool execution with the handler's result.\nUsed by the `registerAgentTool(name, handler)` helper.",
285
+ "complexTypes": [],
286
+ "slug": "sendagenttoolresult"
287
+ },
288
+ {
289
+ "name": "addListener",
290
+ "signature": "(eventName: 'agentToolExecution', listenerFunc: (data: { executionId: string; name: string; params: any; }) => void) => Promise<PluginListenerHandle>",
291
+ "parameters": [
292
+ {
293
+ "name": "eventName",
294
+ "docs": "",
295
+ "type": "'agentToolExecution'"
296
+ },
297
+ {
298
+ "name": "listenerFunc",
299
+ "docs": "",
300
+ "type": "(data: { executionId: string; name: string; params: any; }) => void"
301
+ }
302
+ ],
303
+ "returns": "Promise<PluginListenerHandle>",
304
+ "tags": [
305
+ {
306
+ "name": "since",
307
+ "text": "15.0.0"
308
+ }
309
+ ],
310
+ "docs": "Called when a registered agent tool should execute.",
311
+ "complexTypes": [
312
+ "PluginListenerHandle"
313
+ ],
314
+ "slug": "addlisteneragenttoolexecution-"
266
315
  },
267
316
  {
268
317
  "name": "setTicketAttribute",
@@ -4348,6 +4397,22 @@
4348
4397
  }
4349
4398
  ]
4350
4399
  },
4400
+ {
4401
+ "name": "PluginListenerHandle",
4402
+ "slug": "pluginlistenerhandle",
4403
+ "docs": "",
4404
+ "tags": [],
4405
+ "methods": [],
4406
+ "properties": [
4407
+ {
4408
+ "name": "remove",
4409
+ "tags": [],
4410
+ "docs": "",
4411
+ "complexTypes": [],
4412
+ "type": "() => Promise<void>"
4413
+ }
4414
+ ]
4415
+ },
4351
4416
  {
4352
4417
  "name": "GleapEventMessage",
4353
4418
  "slug": "gleapeventmessage",
@@ -1,3 +1,4 @@
1
+ import type { PluginListenerHandle } from '@capacitor/core';
1
2
  export declare type CallbackID = string;
2
3
  export interface GleapEventMessage {
3
4
  name: string;
@@ -148,27 +149,36 @@ export interface GleapPlugin {
148
149
  propsToIgnoreSet: boolean;
149
150
  }>;
150
151
  /**
151
- * Sets the AI tools to use
152
+ * Registers a Frontend tool defined on your AI agent in the Gleap dashboard.
153
+ * Prefer the `registerAgentTool(name, handler)` helper exported by this
154
+ * package — it wires the agentToolExecution event and result round-trip for
155
+ * you.
152
156
  *
153
- * @since 13.5.0
157
+ * @since 15.0.0
154
158
  */
155
- setAiTools(options: {
156
- tools: {
157
- name: string;
158
- description: string;
159
- response: string;
160
- executionType: "auto" | "button";
161
- parameters: {
162
- name: string;
163
- description: string;
164
- type: "string" | "number" | "boolean";
165
- required: boolean;
166
- enums?: string[];
167
- }[];
168
- }[];
169
- }): Promise<{
170
- aiToolsSet: boolean;
171
- }>;
159
+ registerAgentTool(options: {
160
+ name: string;
161
+ }): Promise<void>;
162
+ /**
163
+ * Resolves a pending agent tool execution with the handler's result.
164
+ * Used by the `registerAgentTool(name, handler)` helper.
165
+ *
166
+ * @since 15.0.0
167
+ */
168
+ sendAgentToolResult(options: {
169
+ executionId: string;
170
+ result: string;
171
+ }): Promise<void>;
172
+ /**
173
+ * Called when a registered agent tool should execute.
174
+ *
175
+ * @since 15.0.0
176
+ */
177
+ addListener(eventName: 'agentToolExecution', listenerFunc: (data: {
178
+ executionId: string;
179
+ name: string;
180
+ params: any;
181
+ }) => void): Promise<PluginListenerHandle>;
172
182
  /**
173
183
  * Sets the value of a ticket attribute
174
184
  *
@@ -1 +1 @@
1
- {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"","sourcesContent":["export type CallbackID = string;\n\nexport interface GleapEventMessage {\n name: string,\n data?: any,\n}\n\nexport type GleapEventCallback = (message: GleapEventMessage | null, err?: any) => void;\n\nexport interface GleapPlugin {\n /**\n * Initialize Gleap with an API key\n *\n * @since 7.0.0\n */\n initialize(options: {\n API_KEY: string;\n }): Promise<{\n initialized: boolean;\n }>;\n\n /**\n * Set user identity\n *\n * @since 7.0.0\n */\n identify(options: {\n userId: string;\n userHash?: string;\n name?: string;\n email?: string;\n phone?: string;\n companyId?: string;\n companyName?: string;\n avatar?: string;\n sla?: number;\n plan?: string;\n value?: number;\n customData?: Object;\n }): Promise<{\n identify: boolean;\n }>;\n\n /**\n * Update user properties\n *\n * @since 13.2.1\n */\n updateContact(options: {\n name?: string;\n email?: string;\n phone?: string;\n companyId?: string;\n companyName?: string;\n avatar?: string;\n sla?: number;\n plan?: string;\n value?: number;\n customData?: Object;\n }): Promise<{\n identify: boolean;\n }>;\n\n /**\n * Clear user identity\n *\n * @since 7.0.0\n */\n clearIdentity(): Promise<{\n clearIdentity: boolean;\n }>;\n\n /**\n * Get the current user identity\n *\n * @since 8.1.0\n */\n getIdentity(): Promise<{\n identity: {\n userId: string;\n name?: string;\n email?: string;\n phone?: string;\n value?: number;\n };\n }>;\n\n /**\n * User identified status.\n *\n * @since 8.1.0\n */\n isUserIdentified(): Promise<{\n isUserIdentified: boolean;\n }>;\n\n /**\n * Submit a custom log message with the given level\n *\n * @since 7.0.0\n */\n log(options: {\n message: string;\n logLevel?: \"ERROR\" | \"WARNING\" | \"INFO\";\n }): Promise<{\n logged: boolean;\n }>;\n\n /**\n * Manually show a survey.\n *\n * @since 8.5.1\n */\n showSurvey(options: {\n surveyId: string;\n format?: \"survey\" | \"survey_full\";\n }): Promise<{\n opened: boolean;\n }>;\n\n /**\n * Add custom data\n *\n * @since 7.0.0\n */\n attachCustomData(options: {\n data: any;\n }): Promise<{\n attachedCustomData: boolean;\n }>;\n\n /**\n * Set tags\n *\n * @since 8.6.0\n */\n setTags(options: {\n tags: string[];\n }): Promise<{\n tagsSet: boolean;\n }>;\n\n /**\n * Set network logs blacklist\n *\n * @since 13.2.1\n */\n setNetworkLogsBlacklist(options: {\n blacklist: string[];\n }): Promise<{\n blacklistSet: boolean;\n }>;\n\n /**\n * Set network logs props to ignore\n *\n * @since 13.2.1\n */\n setNetworkLogPropsToIgnore(options: {\n propsToIgnore: string[];\n }): Promise<{\n propsToIgnoreSet: boolean;\n }>;\n\n /**\n * Sets the AI tools to use\n *\n * @since 13.5.0\n */\n setAiTools(options: {\n tools: {\n name: string;\n description: string;\n response: string;\n executionType: \"auto\" | \"button\";\n parameters: {\n name: string;\n description: string;\n type: \"string\" | \"number\" | \"boolean\";\n required: boolean;\n enums?: string[];\n }[];\n }[];\n }): Promise<{\n aiToolsSet: boolean;\n }>;\n\n /**\n * Sets the value of a ticket attribute\n *\n * @since 13.5.0\n */\n setTicketAttribute(options: {\n key: string;\n value: string;\n }): Promise<{\n setTicketAttribute: boolean;\n }>;\n\n /**\n * Unset a ticket attribute\n *\n * @since 14.1.0\n */\n unsetTicketAttribute(options: {\n key: string;\n }): Promise<{\n unsetTicketAttribute: boolean;\n }>;\n\n /**\n * Clear all ticket attributes\n *\n * @since 14.1.0\n */\n clearTicketAttributes(): Promise<{\n clearTicketAttributes: boolean;\n }>;\n\n /**\n * Set custom data\n *\n * @since 7.0.0\n */\n setCustomData(options: {\n key: string;\n value: string;\n }): Promise<{\n setCustomData: boolean;\n }>;\n\n /**\n * Remove custom data by key\n *\n * @since 7.0.0\n */\n removeCustomData(options: {\n key: string;\n }): Promise<{\n removedCustomData: boolean;\n }>;\n\n /**\n * Clear custom data\n *\n * @since 7.0.0\n */\n clearCustomData(): Promise<{\n clearedCustomData: boolean;\n }>;\n\n /**\n * Log event to Gleap\n *\n * @since 8.0.0\n */\n trackEvent(options: {\n name: string;\n data?: any;\n }): Promise<{\n loggedEvent: boolean;\n }>;\n\n /**\n * Track a page view\n *\n * @since 8.4.1\n */\n trackPage(options: {\n pageName: string;\n }): Promise<{\n trackedPage: boolean;\n }>;\n\n /**\n * \n *\n * @since 7.0.0\n */\n setEventCallback(\n callback: GleapEventCallback,\n ): Promise<CallbackID>;\n\n /**\n * Log event to Gleap\n *\n * @since 7.0.0\n */\n sendSilentCrashReport(options: {\n description: string,\n severity?: \"LOW\" | \"MEDIUM\" | \"HIGH\";\n dataExclusion?: {\n customData: Boolean;\n metaData: Boolean;\n attachments: Boolean;\n consoleLog: Boolean;\n networkLogs: Boolean;\n customEventLog: Boolean;\n screenshot: Boolean;\n replays: Boolean;\n };\n }): Promise<{\n sentSilentBugReport: boolean;\n }>;\n\n /**\n * Prefills the widget's form data\n *\n * @since 7.0.0\n */\n preFillForm(options: {\n data: any;\n }): Promise<{\n preFilledForm: boolean;\n }>;\n\n /**\n * Add attachment as bas64 string\n *\n * @since 7.0.0\n */\n addAttachment(options: {\n base64data: string;\n name: string;\n }): Promise<{\n attachmentAdded: boolean;\n }>;\n\n /**\n * All attachments removed\n *\n * @since 7.0.0\n */\n removeAllAttachments(): Promise<{\n allAttachmentsRemoved: boolean;\n }>;\n\n /**\n * Open widget\n *\n * @since 7.0.0\n */\n open(): Promise<{\n openedWidget: boolean;\n }>;\n\n /**\n * Open news\n *\n * @since 8.4.0\n */\n openNews(options: {\n showBackButton?: boolean;\n }): Promise<{\n openedNews: boolean;\n }>;\n\n /**\n * Open news article\n *\n * @since 8.4.0\n */\n openNewsArticle(options: {\n articleId: string;\n showBackButton?: boolean;\n }): Promise<{\n opened: boolean;\n }>;\n\n /**\n * Open help center\n *\n * @since 8.4.0\n */\n openHelpCenter(options: {\n showBackButton?: boolean;\n }): Promise<{\n opened: boolean;\n }>;\n\n /**\n * Open help center article\n *\n * @since 8.4.0\n */\n openHelpCenterArticle(options: {\n articleId: string;\n showBackButton?: boolean;\n }): Promise<{\n opened: boolean;\n }>;\n\n /**\n * Ask the AI a question\n *\n * @since 15.0.0\n */\n askAI(options: {\n question: string;\n showBackButton?: boolean;\n }): Promise<{\n opened: boolean;\n }>;\n\n /**\n * Open help center collection\n *\n * @since 8.4.0\n */\n openHelpCenterCollection(options: {\n collectionId: string;\n showBackButton?: boolean;\n }): Promise<{\n opened: boolean;\n }>;\n\n /**\n * Search help center\n *\n * @since 8.4.0\n */\n searchHelpCenter(options: {\n term: string;\n showBackButton?: boolean;\n }): Promise<{\n opened: boolean;\n }>;\n\n /**\n * Open feature requests\n *\n * @since 8.4.0\n */\n openFeatureRequests(options: {\n showBackButton?: boolean;\n }): Promise<{\n openedFeatureRequests: boolean;\n }>;\n\n /**\n * Close widget\n *\n * @since 7.0.0\n */\n close(): Promise<{\n closedWidget: boolean;\n }>;\n\n /**\n * Check widget status code\n *\n * @since 7.0.0\n */\n isOpened(): Promise<{\n isOpened: boolean;\n }>;\n\n /**\n * Start feedback flow\n *\n * @since 7.0.0\n */\n startFeedbackFlow(options: {\n feedbackFlow?: string;\n showBackButton?: boolean;\n }): Promise<{\n startedFeedbackFlow: boolean;\n }>;\n\n /**\n * Start a classic form\n *\n * @since 13.1.0\n */\n startClassicForm(options: {\n formId?: string;\n showBackButton?: boolean;\n }): Promise<{\n classicFormStarted: boolean;\n }>;\n\n /**\n * Start a new conversation\n *\n * @since 13.1.0\n */\n startConversation(options: {\n showBackButton?: boolean;\n }): Promise<{\n conversationStarted: boolean;\n }>;\n\n /**\n * Opens the conversations tab.\n *\n * @since 13.9.0\n */\n openConversation(options: {\n showBackButton?: boolean;\n }): Promise<{\n conversationsOpened: boolean;\n }>;\n\n /**\n * Start bot\n *\n * @since 10.0.3\n */\n startBot(options: {\n botId?: string;\n showBackButton?: boolean;\n }): Promise<{\n startedBot: boolean;\n }>;\n\n /**\n * Show or hide the feedback button.\n *\n * @since 8.0.0\n */\n showFeedbackButton(options: {\n show?: boolean;\n }): Promise<{\n feedbackButtonShown: boolean;\n }>;\n\n /**\n* Disable in app notifications.\n*\n* @since 8.6.1\n*/\n setDisableInAppNotifications(options: {\n disableInAppNotifications?: boolean;\n }): Promise<{\n inAppNotificationsDisabled: boolean;\n }>;\n\n /**\n * Set Language\n *\n * @since 7.0.0\n */\n setLanguage(options: {\n languageCode: string;\n }): Promise<{\n setLanguage: string;\n }>;\n\n /**\n * Disable console log overwrite\n *\n * @since 7.0.0\n */\n disableConsoleLogOverwrite(): Promise<{\n consoleLogDisabled: boolean;\n }>;\n\n /**\n * Enable debug console log\n *\n * @since 7.0.0\n */\n enableDebugConsoleLog(): Promise<{\n debugConsoleLogEnabled: boolean;\n }>;\n\n /**\n * Set the notification container offset\n *\n * @since 15.2.0\n */\n setNotificationContainerOffset(options: {\n x: number;\n y: number;\n }): Promise<{\n notificationContainerOffsetSet: boolean;\n }>;\n\n}"]}
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"","sourcesContent":["import type { PluginListenerHandle } from '@capacitor/core';\n\nexport type CallbackID = string;\n\nexport interface GleapEventMessage {\n name: string,\n data?: any,\n}\n\nexport type GleapEventCallback = (message: GleapEventMessage | null, err?: any) => void;\n\nexport interface GleapPlugin {\n /**\n * Initialize Gleap with an API key\n *\n * @since 7.0.0\n */\n initialize(options: {\n API_KEY: string;\n }): Promise<{\n initialized: boolean;\n }>;\n\n /**\n * Set user identity\n *\n * @since 7.0.0\n */\n identify(options: {\n userId: string;\n userHash?: string;\n name?: string;\n email?: string;\n phone?: string;\n companyId?: string;\n companyName?: string;\n avatar?: string;\n sla?: number;\n plan?: string;\n value?: number;\n customData?: Object;\n }): Promise<{\n identify: boolean;\n }>;\n\n /**\n * Update user properties\n *\n * @since 13.2.1\n */\n updateContact(options: {\n name?: string;\n email?: string;\n phone?: string;\n companyId?: string;\n companyName?: string;\n avatar?: string;\n sla?: number;\n plan?: string;\n value?: number;\n customData?: Object;\n }): Promise<{\n identify: boolean;\n }>;\n\n /**\n * Clear user identity\n *\n * @since 7.0.0\n */\n clearIdentity(): Promise<{\n clearIdentity: boolean;\n }>;\n\n /**\n * Get the current user identity\n *\n * @since 8.1.0\n */\n getIdentity(): Promise<{\n identity: {\n userId: string;\n name?: string;\n email?: string;\n phone?: string;\n value?: number;\n };\n }>;\n\n /**\n * User identified status.\n *\n * @since 8.1.0\n */\n isUserIdentified(): Promise<{\n isUserIdentified: boolean;\n }>;\n\n /**\n * Submit a custom log message with the given level\n *\n * @since 7.0.0\n */\n log(options: {\n message: string;\n logLevel?: \"ERROR\" | \"WARNING\" | \"INFO\";\n }): Promise<{\n logged: boolean;\n }>;\n\n /**\n * Manually show a survey.\n *\n * @since 8.5.1\n */\n showSurvey(options: {\n surveyId: string;\n format?: \"survey\" | \"survey_full\";\n }): Promise<{\n opened: boolean;\n }>;\n\n /**\n * Add custom data\n *\n * @since 7.0.0\n */\n attachCustomData(options: {\n data: any;\n }): Promise<{\n attachedCustomData: boolean;\n }>;\n\n /**\n * Set tags\n *\n * @since 8.6.0\n */\n setTags(options: {\n tags: string[];\n }): Promise<{\n tagsSet: boolean;\n }>;\n\n /**\n * Set network logs blacklist\n *\n * @since 13.2.1\n */\n setNetworkLogsBlacklist(options: {\n blacklist: string[];\n }): Promise<{\n blacklistSet: boolean;\n }>;\n\n /**\n * Set network logs props to ignore\n *\n * @since 13.2.1\n */\n setNetworkLogPropsToIgnore(options: {\n propsToIgnore: string[];\n }): Promise<{\n propsToIgnoreSet: boolean;\n }>;\n\n /**\n * Registers a Frontend tool defined on your AI agent in the Gleap dashboard.\n * Prefer the `registerAgentTool(name, handler)` helper exported by this\n * package — it wires the agentToolExecution event and result round-trip for\n * you.\n *\n * @since 15.0.0\n */\n registerAgentTool(options: {\n name: string;\n }): Promise<void>;\n\n /**\n * Resolves a pending agent tool execution with the handler's result.\n * Used by the `registerAgentTool(name, handler)` helper.\n *\n * @since 15.0.0\n */\n sendAgentToolResult(options: {\n executionId: string;\n result: string;\n }): Promise<void>;\n\n /**\n * Called when a registered agent tool should execute.\n *\n * @since 15.0.0\n */\n addListener(\n eventName: 'agentToolExecution',\n listenerFunc: (data: {\n executionId: string;\n name: string;\n params: any;\n }) => void,\n ): Promise<PluginListenerHandle>;\n\n /**\n * Sets the value of a ticket attribute\n *\n * @since 13.5.0\n */\n setTicketAttribute(options: {\n key: string;\n value: string;\n }): Promise<{\n setTicketAttribute: boolean;\n }>;\n\n /**\n * Unset a ticket attribute\n *\n * @since 14.1.0\n */\n unsetTicketAttribute(options: {\n key: string;\n }): Promise<{\n unsetTicketAttribute: boolean;\n }>;\n\n /**\n * Clear all ticket attributes\n *\n * @since 14.1.0\n */\n clearTicketAttributes(): Promise<{\n clearTicketAttributes: boolean;\n }>;\n\n /**\n * Set custom data\n *\n * @since 7.0.0\n */\n setCustomData(options: {\n key: string;\n value: string;\n }): Promise<{\n setCustomData: boolean;\n }>;\n\n /**\n * Remove custom data by key\n *\n * @since 7.0.0\n */\n removeCustomData(options: {\n key: string;\n }): Promise<{\n removedCustomData: boolean;\n }>;\n\n /**\n * Clear custom data\n *\n * @since 7.0.0\n */\n clearCustomData(): Promise<{\n clearedCustomData: boolean;\n }>;\n\n /**\n * Log event to Gleap\n *\n * @since 8.0.0\n */\n trackEvent(options: {\n name: string;\n data?: any;\n }): Promise<{\n loggedEvent: boolean;\n }>;\n\n /**\n * Track a page view\n *\n * @since 8.4.1\n */\n trackPage(options: {\n pageName: string;\n }): Promise<{\n trackedPage: boolean;\n }>;\n\n /**\n * \n *\n * @since 7.0.0\n */\n setEventCallback(\n callback: GleapEventCallback,\n ): Promise<CallbackID>;\n\n /**\n * Log event to Gleap\n *\n * @since 7.0.0\n */\n sendSilentCrashReport(options: {\n description: string,\n severity?: \"LOW\" | \"MEDIUM\" | \"HIGH\";\n dataExclusion?: {\n customData: Boolean;\n metaData: Boolean;\n attachments: Boolean;\n consoleLog: Boolean;\n networkLogs: Boolean;\n customEventLog: Boolean;\n screenshot: Boolean;\n replays: Boolean;\n };\n }): Promise<{\n sentSilentBugReport: boolean;\n }>;\n\n /**\n * Prefills the widget's form data\n *\n * @since 7.0.0\n */\n preFillForm(options: {\n data: any;\n }): Promise<{\n preFilledForm: boolean;\n }>;\n\n /**\n * Add attachment as bas64 string\n *\n * @since 7.0.0\n */\n addAttachment(options: {\n base64data: string;\n name: string;\n }): Promise<{\n attachmentAdded: boolean;\n }>;\n\n /**\n * All attachments removed\n *\n * @since 7.0.0\n */\n removeAllAttachments(): Promise<{\n allAttachmentsRemoved: boolean;\n }>;\n\n /**\n * Open widget\n *\n * @since 7.0.0\n */\n open(): Promise<{\n openedWidget: boolean;\n }>;\n\n /**\n * Open news\n *\n * @since 8.4.0\n */\n openNews(options: {\n showBackButton?: boolean;\n }): Promise<{\n openedNews: boolean;\n }>;\n\n /**\n * Open news article\n *\n * @since 8.4.0\n */\n openNewsArticle(options: {\n articleId: string;\n showBackButton?: boolean;\n }): Promise<{\n opened: boolean;\n }>;\n\n /**\n * Open help center\n *\n * @since 8.4.0\n */\n openHelpCenter(options: {\n showBackButton?: boolean;\n }): Promise<{\n opened: boolean;\n }>;\n\n /**\n * Open help center article\n *\n * @since 8.4.0\n */\n openHelpCenterArticle(options: {\n articleId: string;\n showBackButton?: boolean;\n }): Promise<{\n opened: boolean;\n }>;\n\n /**\n * Ask the AI a question\n *\n * @since 15.0.0\n */\n askAI(options: {\n question: string;\n showBackButton?: boolean;\n }): Promise<{\n opened: boolean;\n }>;\n\n /**\n * Open help center collection\n *\n * @since 8.4.0\n */\n openHelpCenterCollection(options: {\n collectionId: string;\n showBackButton?: boolean;\n }): Promise<{\n opened: boolean;\n }>;\n\n /**\n * Search help center\n *\n * @since 8.4.0\n */\n searchHelpCenter(options: {\n term: string;\n showBackButton?: boolean;\n }): Promise<{\n opened: boolean;\n }>;\n\n /**\n * Open feature requests\n *\n * @since 8.4.0\n */\n openFeatureRequests(options: {\n showBackButton?: boolean;\n }): Promise<{\n openedFeatureRequests: boolean;\n }>;\n\n /**\n * Close widget\n *\n * @since 7.0.0\n */\n close(): Promise<{\n closedWidget: boolean;\n }>;\n\n /**\n * Check widget status code\n *\n * @since 7.0.0\n */\n isOpened(): Promise<{\n isOpened: boolean;\n }>;\n\n /**\n * Start feedback flow\n *\n * @since 7.0.0\n */\n startFeedbackFlow(options: {\n feedbackFlow?: string;\n showBackButton?: boolean;\n }): Promise<{\n startedFeedbackFlow: boolean;\n }>;\n\n /**\n * Start a classic form\n *\n * @since 13.1.0\n */\n startClassicForm(options: {\n formId?: string;\n showBackButton?: boolean;\n }): Promise<{\n classicFormStarted: boolean;\n }>;\n\n /**\n * Start a new conversation\n *\n * @since 13.1.0\n */\n startConversation(options: {\n showBackButton?: boolean;\n }): Promise<{\n conversationStarted: boolean;\n }>;\n\n /**\n * Opens the conversations tab.\n *\n * @since 13.9.0\n */\n openConversation(options: {\n showBackButton?: boolean;\n }): Promise<{\n conversationsOpened: boolean;\n }>;\n\n /**\n * Start bot\n *\n * @since 10.0.3\n */\n startBot(options: {\n botId?: string;\n showBackButton?: boolean;\n }): Promise<{\n startedBot: boolean;\n }>;\n\n /**\n * Show or hide the feedback button.\n *\n * @since 8.0.0\n */\n showFeedbackButton(options: {\n show?: boolean;\n }): Promise<{\n feedbackButtonShown: boolean;\n }>;\n\n /**\n* Disable in app notifications.\n*\n* @since 8.6.1\n*/\n setDisableInAppNotifications(options: {\n disableInAppNotifications?: boolean;\n }): Promise<{\n inAppNotificationsDisabled: boolean;\n }>;\n\n /**\n * Set Language\n *\n * @since 7.0.0\n */\n setLanguage(options: {\n languageCode: string;\n }): Promise<{\n setLanguage: string;\n }>;\n\n /**\n * Disable console log overwrite\n *\n * @since 7.0.0\n */\n disableConsoleLogOverwrite(): Promise<{\n consoleLogDisabled: boolean;\n }>;\n\n /**\n * Enable debug console log\n *\n * @since 7.0.0\n */\n enableDebugConsoleLog(): Promise<{\n debugConsoleLogEnabled: boolean;\n }>;\n\n /**\n * Set the notification container offset\n *\n * @since 15.2.0\n */\n setNotificationContainerOffset(options: {\n x: number;\n y: number;\n }): Promise<{\n notificationContainerOffsetSet: boolean;\n }>;\n\n}"]}
@@ -1,4 +1,11 @@
1
1
  import type { GleapPlugin } from './definitions';
2
2
  declare const Gleap: GleapPlugin;
3
+ /**
4
+ * Registers the handler for a Frontend tool defined on your AI agent in the
5
+ * Gleap dashboard. The agent calls the handler with the configured parameters
6
+ * and waits for the returned result (string or object, which gets
7
+ * stringified).
8
+ */
9
+ declare const registerAgentTool: (name: string, handler: (params: any) => any | Promise<any>) => Promise<void>;
3
10
  export * from './definitions';
4
- export { Gleap };
11
+ export { Gleap, registerAgentTool };
package/dist/esm/index.js CHANGED
@@ -2,6 +2,57 @@ import { registerPlugin } from '@capacitor/core';
2
2
  const Gleap = registerPlugin('Gleap', {
3
3
  web: () => import('./web').then(m => new m.GleapWeb()),
4
4
  });
5
+ const registeredAgentTools = {};
6
+ let agentToolListenerAttached = false;
7
+ /**
8
+ * Registers the handler for a Frontend tool defined on your AI agent in the
9
+ * Gleap dashboard. The agent calls the handler with the configured parameters
10
+ * and waits for the returned result (string or object, which gets
11
+ * stringified).
12
+ */
13
+ const registerAgentTool = async (name, handler) => {
14
+ if (!name || typeof handler !== 'function') {
15
+ return;
16
+ }
17
+ registeredAgentTools[name] = handler;
18
+ if (!agentToolListenerAttached) {
19
+ agentToolListenerAttached = true;
20
+ await Gleap.addListener('agentToolExecution', async (data) => {
21
+ var _a;
22
+ try {
23
+ const { executionId, name: toolName, params } = data !== null && data !== void 0 ? data : {};
24
+ if (!executionId || !toolName) {
25
+ return;
26
+ }
27
+ let result;
28
+ const toolHandler = registeredAgentTools[toolName];
29
+ if (!toolHandler) {
30
+ result = `No handler registered for tool '${toolName}' in the app. Register one via Gleap.registerAgentTool('${toolName}', handler).`;
31
+ }
32
+ else {
33
+ try {
34
+ const handlerResult = await toolHandler(params !== null && params !== void 0 ? params : {});
35
+ result =
36
+ typeof handlerResult === 'string'
37
+ ? handlerResult
38
+ : JSON.stringify(handlerResult !== null && handlerResult !== void 0 ? handlerResult : '');
39
+ if (!result) {
40
+ result = 'The action completed without returning a result.';
41
+ }
42
+ }
43
+ catch (error) {
44
+ result = `Tool execution failed: ${(_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : 'unknown error'}`;
45
+ }
46
+ }
47
+ await Gleap.sendAgentToolResult({ executionId, result });
48
+ }
49
+ catch (exp) {
50
+ // Ignore.
51
+ }
52
+ });
53
+ }
54
+ await Gleap.registerAgentTool({ name });
55
+ };
5
56
  export * from './definitions';
6
- export { Gleap };
57
+ export { Gleap, registerAgentTool };
7
58
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIjD,MAAM,KAAK,GAAG,cAAc,CAAc,OAAO,EAAE;IACjD,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;CACvD,CAAC,CAAC;AAEH,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,CAAC","sourcesContent":["import { registerPlugin } from '@capacitor/core';\n\nimport type { GleapPlugin } from './definitions';\n\nconst Gleap = registerPlugin<GleapPlugin>('Gleap', {\n web: () => import('./web').then(m => new m.GleapWeb()),\n});\n\nexport * from './definitions';\nexport { Gleap };\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIjD,MAAM,KAAK,GAAG,cAAc,CAAc,OAAO,EAAE;IACjD,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;CACvD,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAEtB,EAAE,CAAC;AACP,IAAI,yBAAyB,GAAG,KAAK,CAAC;AAEtC;;;;;GAKG;AACH,MAAM,iBAAiB,GAAG,KAAK,EAC7B,IAAY,EACZ,OAA4C,EAC7B,EAAE;IACjB,IAAI,CAAC,IAAI,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;QAC1C,OAAO;KACR;IAED,oBAAoB,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;IAErC,IAAI,CAAC,yBAAyB,EAAE;QAC9B,yBAAyB,GAAG,IAAI,CAAC;QAEjC,MAAM,KAAK,CAAC,WAAW,CAAC,oBAAoB,EAAE,KAAK,EAAC,IAAI,EAAC,EAAE;;YACzD,IAAI;gBACF,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAK,EAAU,CAAC;gBACpE,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ,EAAE;oBAC7B,OAAO;iBACR;gBAED,IAAI,MAAM,CAAC;gBACX,MAAM,WAAW,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;gBACnD,IAAI,CAAC,WAAW,EAAE;oBAChB,MAAM,GAAG,mCAAmC,QAAQ,2DAA2D,QAAQ,cAAc,CAAC;iBACvI;qBAAM;oBACL,IAAI;wBACF,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,CAAC;wBACtD,MAAM;4BACJ,OAAO,aAAa,KAAK,QAAQ;gCAC/B,CAAC,CAAC,aAAa;gCACf,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,EAAE,CAAC,CAAC;wBAC1C,IAAI,CAAC,MAAM,EAAE;4BACX,MAAM,GAAG,kDAAkD,CAAC;yBAC7D;qBACF;oBAAC,OAAO,KAAU,EAAE;wBACnB,MAAM,GAAG,0BACP,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,mCAAI,eACpB,EAAE,CAAC;qBACJ;iBACF;gBAED,MAAM,KAAK,CAAC,mBAAmB,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;aAC1D;YAAC,OAAO,GAAG,EAAE;gBACZ,UAAU;aACX;QACH,CAAC,CAAC,CAAC;KACJ;IAED,MAAM,KAAK,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["import { registerPlugin } from '@capacitor/core';\n\nimport type { GleapPlugin } from './definitions';\n\nconst Gleap = registerPlugin<GleapPlugin>('Gleap', {\n web: () => import('./web').then(m => new m.GleapWeb()),\n});\n\nconst registeredAgentTools: {\n [name: string]: (params: any) => any | Promise<any>;\n} = {};\nlet agentToolListenerAttached = false;\n\n/**\n * Registers the handler for a Frontend tool defined on your AI agent in the\n * Gleap dashboard. The agent calls the handler with the configured parameters\n * and waits for the returned result (string or object, which gets\n * stringified).\n */\nconst registerAgentTool = async (\n name: string,\n handler: (params: any) => any | Promise<any>,\n): Promise<void> => {\n if (!name || typeof handler !== 'function') {\n return;\n }\n\n registeredAgentTools[name] = handler;\n\n if (!agentToolListenerAttached) {\n agentToolListenerAttached = true;\n\n await Gleap.addListener('agentToolExecution', async data => {\n try {\n const { executionId, name: toolName, params } = data ?? ({} as any);\n if (!executionId || !toolName) {\n return;\n }\n\n let result;\n const toolHandler = registeredAgentTools[toolName];\n if (!toolHandler) {\n result = `No handler registered for tool '${toolName}' in the app. Register one via Gleap.registerAgentTool('${toolName}', handler).`;\n } else {\n try {\n const handlerResult = await toolHandler(params ?? {});\n result =\n typeof handlerResult === 'string'\n ? handlerResult\n : JSON.stringify(handlerResult ?? '');\n if (!result) {\n result = 'The action completed without returning a result.';\n }\n } catch (error: any) {\n result = `Tool execution failed: ${\n error?.message ?? 'unknown error'\n }`;\n }\n }\n\n await Gleap.sendAgentToolResult({ executionId, result });\n } catch (exp) {\n // Ignore.\n }\n });\n }\n\n await Gleap.registerAgentTool({ name });\n};\n\nexport * from './definitions';\nexport { Gleap, registerAgentTool };\n"]}
package/dist/esm/web.d.ts CHANGED
@@ -5,29 +5,21 @@ export declare class GleapWeb extends WebPlugin implements GleapPlugin {
5
5
  [key: string]: GleapEventCallback;
6
6
  };
7
7
  static initialized: boolean;
8
+ static agentToolExecutionCounter: number;
9
+ private pendingAgentToolExecutions;
8
10
  initialize(options: {
9
11
  API_KEY: string;
10
12
  }): Promise<{
11
13
  initialized: boolean;
12
14
  }>;
13
15
  registerCallbackListeners(): void;
14
- setAiTools(options: {
15
- tools: {
16
- name: string;
17
- description: string;
18
- response: string;
19
- executionType: 'auto' | 'button';
20
- parameters: {
21
- name: string;
22
- description: string;
23
- type: 'string' | 'number' | 'boolean';
24
- required: boolean;
25
- enums?: string[] | undefined;
26
- }[];
27
- }[];
28
- }): Promise<{
29
- aiToolsSet: boolean;
30
- }>;
16
+ registerAgentTool(options: {
17
+ name: string;
18
+ }): Promise<void>;
19
+ sendAgentToolResult(options: {
20
+ executionId: string;
21
+ result: string;
22
+ }): Promise<void>;
31
23
  setTicketAttribute(options: {
32
24
  key: string;
33
25
  value: string;