@atlaskit/rovo-agent-analytics 0.18.0 → 0.19.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.
- package/CHANGELOG.md +7 -0
- package/README.md +69 -18
- package/actions/add-tools-prompt/package.json +17 -0
- package/actions/agent-interactions/package.json +17 -0
- package/actions/create-flow/package.json +17 -0
- package/actions/debug/package.json +17 -0
- package/actions/editing/package.json +17 -0
- package/actions/tool-actions/package.json +5 -5
- package/dist/cjs/actions/groups/add-tools-prompt.js +32 -0
- package/dist/cjs/actions/groups/agent-interactions.js +44 -0
- package/dist/cjs/actions/groups/create-flow.js +39 -0
- package/dist/cjs/actions/groups/debug.js +31 -0
- package/dist/cjs/actions/groups/editing.js +26 -0
- package/dist/cjs/actions/{tool-actions/index.js → groups/tools.js} +16 -1
- package/dist/cjs/actions/index.js +14 -35
- package/dist/cjs/actions/registry.js +53 -0
- package/dist/cjs/create/index.js +11 -30
- package/dist/es2019/actions/groups/add-tools-prompt.js +26 -0
- package/dist/es2019/actions/groups/agent-interactions.js +38 -0
- package/dist/es2019/actions/groups/create-flow.js +33 -0
- package/dist/es2019/actions/groups/debug.js +25 -0
- package/dist/es2019/actions/groups/editing.js +20 -0
- package/dist/es2019/actions/{tool-actions/index.js → groups/tools.js} +15 -0
- package/dist/es2019/actions/index.js +19 -35
- package/dist/es2019/actions/registry.js +52 -0
- package/dist/es2019/create/index.js +14 -29
- package/dist/esm/actions/groups/add-tools-prompt.js +26 -0
- package/dist/esm/actions/groups/agent-interactions.js +38 -0
- package/dist/esm/actions/groups/create-flow.js +33 -0
- package/dist/esm/actions/groups/debug.js +25 -0
- package/dist/esm/actions/groups/editing.js +20 -0
- package/dist/esm/actions/{tool-actions/index.js → groups/tools.js} +15 -0
- package/dist/esm/actions/index.js +15 -35
- package/dist/esm/actions/registry.js +48 -0
- package/dist/esm/create/index.js +12 -30
- package/dist/types/actions/groups/add-tools-prompt.d.ts +21 -0
- package/dist/types/actions/groups/agent-interactions.d.ts +39 -0
- package/dist/types/actions/groups/create-flow.d.ts +22 -0
- package/dist/types/actions/groups/debug.d.ts +30 -0
- package/dist/types/actions/groups/editing.d.ts +24 -0
- package/dist/types/actions/groups/tools.d.ts +38 -0
- package/dist/types/actions/index.d.ts +17 -47
- package/dist/types/actions/registry.d.ts +16 -0
- package/dist/types/create/index.d.ts +17 -15
- package/dist/types-ts4.5/actions/groups/add-tools-prompt.d.ts +21 -0
- package/dist/types-ts4.5/actions/groups/agent-interactions.d.ts +39 -0
- package/dist/types-ts4.5/actions/groups/create-flow.d.ts +22 -0
- package/dist/types-ts4.5/actions/groups/debug.d.ts +30 -0
- package/dist/types-ts4.5/actions/groups/editing.d.ts +24 -0
- package/dist/types-ts4.5/actions/groups/tools.d.ts +38 -0
- package/dist/types-ts4.5/actions/index.d.ts +17 -47
- package/dist/types-ts4.5/actions/registry.d.ts +16 -0
- package/dist/types-ts4.5/create/index.d.ts +17 -15
- package/package.json +1 -1
- package/dist/types/actions/tool-actions/index.d.ts +0 -18
- package/dist/types-ts4.5/actions/tool-actions/index.d.ts +0 -18
|
@@ -5,40 +5,17 @@ import { useCallback, useContext, useRef } from 'react';
|
|
|
5
5
|
import { AnalyticsReactContext, useAnalyticsEvents } from '@atlaskit/analytics-next';
|
|
6
6
|
import { ANALYTICS_CHANNEL } from '../common/constants';
|
|
7
7
|
import { getAttributesFromContexts, getDefaultTrackEventConfig } from '../common/utils';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
export var AgentCommonActions = /*#__PURE__*/function (AgentCommonActions) {
|
|
20
|
-
/* View agent clicked - https://data-portal.internal.atlassian.com/analytics/registry/97125 */
|
|
21
|
-
AgentCommonActions["VIEW"] = "view";
|
|
22
|
-
/* Edit agent clicked - https://data-portal.internal.atlassian.com/analytics/registry/97126 */
|
|
23
|
-
AgentCommonActions["EDIT"] = "edit";
|
|
24
|
-
/* Agent updated - https://data-portal.internal.atlassian.com/analytics/registry/97122 */
|
|
25
|
-
AgentCommonActions["UPDATED"] = "updated";
|
|
26
|
-
/* Copy link clicked - https://data-portal.internal.atlassian.com/analytics/registry/97128 */
|
|
27
|
-
AgentCommonActions["COPY_LINK"] = "copyLink";
|
|
28
|
-
/* Delete agent clicked - https://data-portal.internal.atlassian.com/analytics/registry/97129 */
|
|
29
|
-
AgentCommonActions["DELETE"] = "delete";
|
|
30
|
-
/* Duplicate agent clicked - https://data-portal.internal.atlassian.com/analytics/registry/97130 */
|
|
31
|
-
AgentCommonActions["DUPLICATE"] = "duplicate";
|
|
32
|
-
/* Star agent clicked - https://data-portal.internal.atlassian.com/analytics/registry/97133 */
|
|
33
|
-
AgentCommonActions["STAR"] = "star";
|
|
34
|
-
/* Chat with agent clicked - https://data-portal.internal.atlassian.com/analytics/registry/97095 */
|
|
35
|
-
AgentCommonActions["CHAT"] = "chat";
|
|
36
|
-
/* Verify agent clicked - https://data-portal.internal.atlassian.com/analytics/registry/97134 */
|
|
37
|
-
AgentCommonActions["VERIFY"] = "verify";
|
|
38
|
-
/* Unverify agent clicked - https://data-portal.internal.atlassian.com/analytics/registry/97135 */
|
|
39
|
-
AgentCommonActions["UNVERIFY"] = "unverify";
|
|
40
|
-
return AgentCommonActions;
|
|
41
|
-
}({});
|
|
8
|
+
import { AgentInteractionActions } from './groups/agent-interactions';
|
|
9
|
+
import { AgentDebugActions as AgentDebugActionsEnum } from './groups/debug';
|
|
10
|
+
import { AgentEditingActions } from './groups/editing';
|
|
11
|
+
import { ACTION_TO_GROUP } from './registry';
|
|
12
|
+
|
|
13
|
+
// Backward-compatible aliases
|
|
14
|
+
// TODO: migrate consumers to use group-specific imports, then remove
|
|
15
|
+
export var AgentCommonActions = _objectSpread(_objectSpread({}, AgentInteractionActions), AgentEditingActions);
|
|
16
|
+
|
|
17
|
+
// TODO: Remove the alias, will be breaking change, this is just for backward compatibility
|
|
18
|
+
export var AgentDebugActions = AgentDebugActionsEnum;
|
|
42
19
|
var globalEventConfig = getDefaultTrackEventConfig();
|
|
43
20
|
export var useRovoAgentActionAnalytics = function useRovoAgentActionAnalytics(commonAttributes) {
|
|
44
21
|
var analyticsContext = useContext(AnalyticsReactContext);
|
|
@@ -56,7 +33,9 @@ export var useRovoAgentActionAnalytics = function useRovoAgentActionAnalytics(co
|
|
|
56
33
|
fireAnalyticsEvent({
|
|
57
34
|
actionSubject: 'rovoAgent',
|
|
58
35
|
action: action,
|
|
59
|
-
attributes: attributes
|
|
36
|
+
attributes: _objectSpread(_objectSpread({}, attributes), {}, {
|
|
37
|
+
actionGroup: ACTION_TO_GROUP[action]
|
|
38
|
+
})
|
|
60
39
|
});
|
|
61
40
|
}, [fireAnalyticsEvent]);
|
|
62
41
|
var trackAgentActionError = useCallback(function (action, error, attributes) {
|
|
@@ -64,6 +43,7 @@ export var useRovoAgentActionAnalytics = function useRovoAgentActionAnalytics(co
|
|
|
64
43
|
actionSubject: 'rovoAgentError',
|
|
65
44
|
action: action,
|
|
66
45
|
attributes: _objectSpread(_objectSpread({}, attributes), {}, {
|
|
46
|
+
actionGroup: ACTION_TO_GROUP[action],
|
|
67
47
|
error: {
|
|
68
48
|
message: error.message
|
|
69
49
|
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
/**
|
|
5
|
+
* Action Registry
|
|
6
|
+
*
|
|
7
|
+
* Single source of truth for ALL action groups across the library.
|
|
8
|
+
* This file composes all groups into a type-safe registry and builds the
|
|
9
|
+
* runtime mapping from action values to their group names, which gets
|
|
10
|
+
* automatically attached as `attributes.actionGroup` in every fired event.
|
|
11
|
+
*
|
|
12
|
+
* Both `useRovoAgentActionAnalytics` and `useRovoAgentCreateAnalytics` hooks
|
|
13
|
+
* use `ACTION_TO_GROUP` from this registry.
|
|
14
|
+
*
|
|
15
|
+
* ## Adding a new action group
|
|
16
|
+
* 1. Create a new file in ./groups/ following the template of existing group files
|
|
17
|
+
* 2. Import the group's ACTION_GROUP, action enum, and attribute type below
|
|
18
|
+
* 3. If the group is used by the actions hook, add the attribute type to `ActionAttributes`
|
|
19
|
+
* 4. Add the enum + group to `ACTION_TO_GROUP` using `mapActionsToGroup`
|
|
20
|
+
*/
|
|
21
|
+
import { AddToolsPromptActions, ACTION_GROUP as ADD_TOOLS_PROMPT_GROUP } from './groups/add-tools-prompt';
|
|
22
|
+
import { AgentInteractionActions, ACTION_GROUP as AGENT_INTERACTIONS_GROUP } from './groups/agent-interactions';
|
|
23
|
+
import { CreateFlowActions, ACTION_GROUP as CREATE_FLOW_GROUP } from './groups/create-flow';
|
|
24
|
+
import { AgentDebugActions, ACTION_GROUP as DEBUG_GROUP } from './groups/debug';
|
|
25
|
+
import { AgentEditingActions, ACTION_GROUP as EDITING_GROUP } from './groups/editing';
|
|
26
|
+
import { AgentToolActions, ACTION_GROUP as TOOLS_GROUP } from './groups/tools';
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Combined attribute map for action-hook groups (type-safe attributes).
|
|
30
|
+
* Create-flow groups are excluded — they use a looser attribute type via the create hook.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Helper to build a Record mapping each enum value to its group name.
|
|
35
|
+
*/
|
|
36
|
+
var mapActionsToGroup = function mapActionsToGroup(actionEnum, group) {
|
|
37
|
+
return Object.fromEntries(Object.values(actionEnum).map(function (action) {
|
|
38
|
+
return [action, group];
|
|
39
|
+
}));
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Runtime lookup: action value → group name.
|
|
44
|
+
* Used by ALL analytics hooks to auto-inject `attributes.actionGroup`.
|
|
45
|
+
*
|
|
46
|
+
* When you add a new group, add it here too.
|
|
47
|
+
*/
|
|
48
|
+
export var ACTION_TO_GROUP = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({}, mapActionsToGroup(AgentInteractionActions, AGENT_INTERACTIONS_GROUP)), mapActionsToGroup(AgentEditingActions, EDITING_GROUP)), mapActionsToGroup(AgentDebugActions, DEBUG_GROUP)), mapActionsToGroup(AgentToolActions, TOOLS_GROUP)), mapActionsToGroup(CreateFlowActions, CREATE_FLOW_GROUP)), mapActionsToGroup(AddToolsPromptActions, ADD_TOOLS_PROMPT_GROUP));
|
package/dist/esm/create/index.js
CHANGED
|
@@ -1,39 +1,19 @@
|
|
|
1
|
-
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
1
|
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
3
3
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
4
4
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
5
5
|
import { useCallback, useContext, useRef } from 'react';
|
|
6
6
|
import { AnalyticsReactContext, useAnalyticsEvents } from '@atlaskit/analytics-next';
|
|
7
|
+
import { AddToolsPromptActions } from '../actions/groups/add-tools-prompt';
|
|
8
|
+
import { CreateFlowActions } from '../actions/groups/create-flow';
|
|
9
|
+
import { ACTION_TO_GROUP } from '../actions/registry';
|
|
7
10
|
import { ANALYTICS_CHANNEL } from '../common/constants';
|
|
8
11
|
import { useRovoAgentCSID } from '../common/csid';
|
|
9
12
|
import { getAttributesFromContexts, getDefaultTrackEventConfig } from '../common/utils';
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
AgentCreateActions["SKIP_NL"] = "createFlowSkipNL";
|
|
15
|
-
/* Review natural language - https://data-portal.internal.atlassian.com/analytics/registry/97124 */
|
|
16
|
-
AgentCreateActions["REVIEW_NL"] = "createFlowReviewNL";
|
|
17
|
-
/* Activate agent - https://data-portal.internal.atlassian.com/analytics/registry/97123 */
|
|
18
|
-
AgentCreateActions["ACTIVATE"] = "createFlowActivate";
|
|
19
|
-
/* Restart create flow - https://data-portal.internal.atlassian.com/analytics/registry/97131 */
|
|
20
|
-
AgentCreateActions["RESTART"] = "createFlowRestart";
|
|
21
|
-
/* Error occurred - https://data-portal.internal.atlassian.com/analytics/registry/97132 */
|
|
22
|
-
AgentCreateActions["ERROR"] = "createFlowError";
|
|
23
|
-
/* Land in studio - https://data-portal.internal.atlassian.com/analytics/registry/97136 */
|
|
24
|
-
AgentCreateActions["LAND"] = "createLandInStudio";
|
|
25
|
-
/* Discard agent - https://data-portal.internal.atlassian.com/analytics/registry/97137 */
|
|
26
|
-
AgentCreateActions["DISCARD"] = "createDiscard";
|
|
27
|
-
/* Show no skills modal - https://data-portal.internal.atlassian.com/analytics/registry/97435 */
|
|
28
|
-
AgentCreateActions["SHOW_NO_SKILLS_MODAL"] = "showNoSkillsModal";
|
|
29
|
-
/* Browse click no skills modal - https://data-portal.internal.atlassian.com/analytics/registry/97436 */
|
|
30
|
-
AgentCreateActions["BROWSE_CLICK_NO_SKILLS_MODAL"] = "browseClickNoSkillsModal";
|
|
31
|
-
/* Discard no skills modal - https://data-portal.internal.atlassian.com/analytics/registry/97437 */
|
|
32
|
-
AgentCreateActions["DISCARD_NO_SKILLS_MODAL"] = "discardNoSkillsModal";
|
|
33
|
-
/* Draft created from solution architect plan card - https://data-portal.internal.atlassian.com/analytics/registry/97924 */
|
|
34
|
-
AgentCreateActions["SA_DRAFT"] = "saDraft";
|
|
35
|
-
return AgentCreateActions;
|
|
36
|
-
}({});
|
|
13
|
+
|
|
14
|
+
// Backward-compatible alias
|
|
15
|
+
// TODO: migrate consumers to use CreateFlowActions / AddToolsPromptActions directly, then remove
|
|
16
|
+
export var AgentCreateActions = _objectSpread(_objectSpread({}, CreateFlowActions), AddToolsPromptActions);
|
|
37
17
|
var globalEventConfig = getDefaultTrackEventConfig();
|
|
38
18
|
export var useRovoAgentCreateAnalytics = function useRovoAgentCreateAnalytics(commonAttributes) {
|
|
39
19
|
var _useRovoAgentCSID = useRovoAgentCSID(),
|
|
@@ -46,7 +26,9 @@ export var useRovoAgentCreateAnalytics = function useRovoAgentCreateAnalytics(co
|
|
|
46
26
|
var commonAttributesRef = useRef(commonAttributes);
|
|
47
27
|
var fireAnalyticsEvent = useCallback(function (event) {
|
|
48
28
|
var referrer = typeof window !== 'undefined' ? window.document.referrer : 'unknown';
|
|
29
|
+
var action = event.action;
|
|
49
30
|
var attributes = _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, getAttributesFromContexts(analyticsContext.getAtlaskitAnalyticsContext())), commonAttributesRef.current), event.attributes), {}, {
|
|
31
|
+
actionGroup: ACTION_TO_GROUP[action],
|
|
50
32
|
csid: csid,
|
|
51
33
|
referrer: referrer
|
|
52
34
|
});
|
|
@@ -74,7 +56,7 @@ export var useRovoAgentCreateAnalytics = function useRovoAgentCreateAnalytics(co
|
|
|
74
56
|
var trackCreateSessionStart = useCallback(function (attributes) {
|
|
75
57
|
fireAnalyticsEvent({
|
|
76
58
|
actionSubject: 'rovoAgent',
|
|
77
|
-
action:
|
|
59
|
+
action: CreateFlowActions.START,
|
|
78
60
|
attributes: attributes
|
|
79
61
|
});
|
|
80
62
|
refreshCSID();
|
|
@@ -82,7 +64,7 @@ export var useRovoAgentCreateAnalytics = function useRovoAgentCreateAnalytics(co
|
|
|
82
64
|
var trackCreateSessionError = useCallback(function (error, attributes) {
|
|
83
65
|
fireAnalyticsEvent({
|
|
84
66
|
actionSubject: 'rovoAgent',
|
|
85
|
-
action:
|
|
67
|
+
action: CreateFlowActions.ERROR,
|
|
86
68
|
attributes: _objectSpread({
|
|
87
69
|
error: {
|
|
88
70
|
message: error.message
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action Group: addToolsPrompt
|
|
3
|
+
*
|
|
4
|
+
* Add tools prompt modal — shown when a user tries to activate/publish an agent that has no tools.
|
|
5
|
+
* The user can browse tools or dismiss and proceed without them.
|
|
6
|
+
*
|
|
7
|
+
* This group is intentionally flow-agnostic so the action values stay stable
|
|
8
|
+
* regardless of whether the prompt fires from the create flow or a future publish flow.
|
|
9
|
+
*
|
|
10
|
+
* ## Adding a new action
|
|
11
|
+
* 1. Add the action to the `AddToolsPromptActions` enum below with a data-portal link
|
|
12
|
+
* 2. Register this group in ../registry.ts (if this is a new group file)
|
|
13
|
+
*
|
|
14
|
+
*/
|
|
15
|
+
/** The group name sent as `attributes.actionGroup` in analytics events */
|
|
16
|
+
export declare const ACTION_GROUP: "addToolsPrompt";
|
|
17
|
+
export declare enum AddToolsPromptActions {
|
|
18
|
+
SHOWN = "addToolsPromptShown",
|
|
19
|
+
BROWSE = "addToolsPromptBrowse",
|
|
20
|
+
DISMISS = "addToolsPromptDismiss"
|
|
21
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action Group: agentInteractions
|
|
3
|
+
*
|
|
4
|
+
* User-initiated interactions with an agent — typically from the overflow menu ("...")
|
|
5
|
+
* or agent profile surfaces (viewing, editing, deleting, duplicating, starring, sharing, verifying).
|
|
6
|
+
*
|
|
7
|
+
* NOTE: This is about UI interactions, not backend "actions" (which are being replaced by "tools").
|
|
8
|
+
*
|
|
9
|
+
* ## Adding a new action
|
|
10
|
+
* 1. Add the action to the `AgentInteractionActions` enum below with a data-portal link
|
|
11
|
+
* 2. Add the corresponding attribute type in `AgentInteractionAttributes`
|
|
12
|
+
* 3. If this action doesn't fit user interactions, create a new group file instead
|
|
13
|
+
* (see other files in this directory for the template)
|
|
14
|
+
*/
|
|
15
|
+
import type { BaseAgentAnalyticsAttributes } from '../../common/types';
|
|
16
|
+
/** The group name sent as `attributes.actionGroup` in analytics events */
|
|
17
|
+
export declare const ACTION_GROUP: "agentInteractions";
|
|
18
|
+
export declare enum AgentInteractionActions {
|
|
19
|
+
VIEW = "view",
|
|
20
|
+
EDIT = "edit",
|
|
21
|
+
COPY_LINK = "copyLink",
|
|
22
|
+
DELETE = "delete",
|
|
23
|
+
DUPLICATE = "duplicate",
|
|
24
|
+
STAR = "star",
|
|
25
|
+
CHAT = "chat",
|
|
26
|
+
VERIFY = "verify",
|
|
27
|
+
UNVERIFY = "unverify"
|
|
28
|
+
}
|
|
29
|
+
export type AgentInteractionAttributes = {
|
|
30
|
+
[AgentInteractionActions.VIEW]: BaseAgentAnalyticsAttributes;
|
|
31
|
+
[AgentInteractionActions.EDIT]: BaseAgentAnalyticsAttributes;
|
|
32
|
+
[AgentInteractionActions.COPY_LINK]: BaseAgentAnalyticsAttributes;
|
|
33
|
+
[AgentInteractionActions.DELETE]: BaseAgentAnalyticsAttributes;
|
|
34
|
+
[AgentInteractionActions.DUPLICATE]: BaseAgentAnalyticsAttributes;
|
|
35
|
+
[AgentInteractionActions.STAR]: BaseAgentAnalyticsAttributes;
|
|
36
|
+
[AgentInteractionActions.CHAT]: BaseAgentAnalyticsAttributes;
|
|
37
|
+
[AgentInteractionActions.VERIFY]: BaseAgentAnalyticsAttributes;
|
|
38
|
+
[AgentInteractionActions.UNVERIFY]: BaseAgentAnalyticsAttributes;
|
|
39
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action Group: createFlow
|
|
3
|
+
*
|
|
4
|
+
* Create agent funnel steps — from clicking "Create agent" through to activation or discard,
|
|
5
|
+
*
|
|
6
|
+
* ## Adding a new action
|
|
7
|
+
* 1. Add the action to the `CreateFlowActions` enum below with a data-portal link
|
|
8
|
+
* 2. Register this group in ../registry.ts (if this is a new group file)
|
|
9
|
+
*/
|
|
10
|
+
/** The group name sent as `attributes.actionGroup` in analytics events */
|
|
11
|
+
export declare const ACTION_GROUP: "createFlow";
|
|
12
|
+
export declare enum CreateFlowActions {
|
|
13
|
+
START = "createFlowStart",
|
|
14
|
+
SKIP_NL = "createFlowSkipNL",
|
|
15
|
+
REVIEW_NL = "createFlowReviewNL",
|
|
16
|
+
ACTIVATE = "createFlowActivate",
|
|
17
|
+
RESTART = "createFlowRestart",
|
|
18
|
+
ERROR = "createFlowError",
|
|
19
|
+
LAND = "createLandInStudio",
|
|
20
|
+
DISCARD = "createDiscard",
|
|
21
|
+
SA_DRAFT = "saDraft"
|
|
22
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action Group: debug
|
|
3
|
+
*
|
|
4
|
+
* Actions related to the agent debug modal (viewing, copying debug data, toggling skill info).
|
|
5
|
+
*
|
|
6
|
+
* ## Adding a new action
|
|
7
|
+
* 1. Add the action to the `AgentDebugActions` enum below with a data-portal link
|
|
8
|
+
* 2. Add the corresponding attribute type in `DebugActionAttributes`
|
|
9
|
+
* 3. If this action doesn't fit this group, consider creating a new group file instead
|
|
10
|
+
* (see other files in this directory for the template)
|
|
11
|
+
*/
|
|
12
|
+
/** The group name sent as `attributes.actionGroup` in analytics events */
|
|
13
|
+
export declare const ACTION_GROUP: "debug";
|
|
14
|
+
export declare enum AgentDebugActions {
|
|
15
|
+
VIEW = "debugView",
|
|
16
|
+
COPY_ALL = "debugCopyAll",
|
|
17
|
+
COPY = "debugCopy",
|
|
18
|
+
TOGGLE_SKILL_INFO = "debugToggleSkillInfo"
|
|
19
|
+
}
|
|
20
|
+
type EmptyAttributes = {};
|
|
21
|
+
export type DebugActionAttributes = {
|
|
22
|
+
[AgentDebugActions.COPY_ALL]: EmptyAttributes;
|
|
23
|
+
[AgentDebugActions.COPY]: EmptyAttributes;
|
|
24
|
+
[AgentDebugActions.TOGGLE_SKILL_INFO]: {
|
|
25
|
+
toolId: string;
|
|
26
|
+
isExpanded: boolean;
|
|
27
|
+
};
|
|
28
|
+
[AgentDebugActions.VIEW]: EmptyAttributes;
|
|
29
|
+
};
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action Group: editing
|
|
3
|
+
*
|
|
4
|
+
* Agent editing/mutation events — fired when an agent's configuration is saved or modified.
|
|
5
|
+
* Unlike agentInteractions (user clicks), these track actual data changes.
|
|
6
|
+
*
|
|
7
|
+
* ## Adding a new action
|
|
8
|
+
* 1. Add the action to the `AgentEditingActions` enum below with a data-portal link
|
|
9
|
+
* 2. Add the corresponding attribute type in `EditingActionAttributes`
|
|
10
|
+
* 3. If this action doesn't fit editing/mutation events, create a new group file instead
|
|
11
|
+
* (see other files in this directory for the template)
|
|
12
|
+
*/
|
|
13
|
+
import type { BaseAgentAnalyticsAttributes } from '../../common/types';
|
|
14
|
+
/** The group name sent as `attributes.actionGroup` in analytics events */
|
|
15
|
+
export declare const ACTION_GROUP: "editing";
|
|
16
|
+
export declare enum AgentEditingActions {
|
|
17
|
+
UPDATED = "updated"
|
|
18
|
+
}
|
|
19
|
+
export type EditingActionAttributes = {
|
|
20
|
+
[AgentEditingActions.UPDATED]: BaseAgentAnalyticsAttributes & {
|
|
21
|
+
agentType: string;
|
|
22
|
+
field: string;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action Group: tools
|
|
3
|
+
*
|
|
4
|
+
* Actions related to agent tool execution during chat
|
|
5
|
+
* (confirming, streaming, viewing results, errors).
|
|
6
|
+
*
|
|
7
|
+
* ## Adding a new action
|
|
8
|
+
* 1. Add the action to the `AgentToolActions` enum below with a data-portal link
|
|
9
|
+
* 2. Add the corresponding attribute type in `ToolsActionAttributes`
|
|
10
|
+
* 3. If this action doesn't fit this group, consider creating a new group file instead
|
|
11
|
+
* (see other files in this directory for the template)
|
|
12
|
+
*/
|
|
13
|
+
import type { BaseAgentAnalyticsAttributes } from '../../common/types';
|
|
14
|
+
/** The group name sent as `attributes.actionGroup` in analytics events */
|
|
15
|
+
export declare const ACTION_GROUP: "tools";
|
|
16
|
+
export declare enum AgentToolActions {
|
|
17
|
+
TOOLS_EXECUTION_CONFIRMED = "toolsExecutionConfirmed",
|
|
18
|
+
TOOLS_EXECUTION_STREAM_STOPPED = "toolsExecutionStreamStopped",
|
|
19
|
+
TOOLS_EXECUTION_RESULT_VIEWED = "toolsExecutionResultViewed",
|
|
20
|
+
TOOLS_EXECUTION_RESULT_ERROR = "toolsExecutionResultError"
|
|
21
|
+
}
|
|
22
|
+
export type ToolsExecutionAttributes = BaseAgentAnalyticsAttributes & {
|
|
23
|
+
tools: {
|
|
24
|
+
toolId: string;
|
|
25
|
+
toolSource: string;
|
|
26
|
+
resolutionType: string;
|
|
27
|
+
}[];
|
|
28
|
+
singleInstrumentationId: string | undefined;
|
|
29
|
+
};
|
|
30
|
+
export type ToolsExecutionResultAttributes = ToolsExecutionAttributes & {
|
|
31
|
+
scenarioId: string | null | undefined;
|
|
32
|
+
};
|
|
33
|
+
export type ToolsActionAttributes = {
|
|
34
|
+
[AgentToolActions.TOOLS_EXECUTION_CONFIRMED]: ToolsExecutionAttributes;
|
|
35
|
+
[AgentToolActions.TOOLS_EXECUTION_STREAM_STOPPED]: ToolsExecutionAttributes;
|
|
36
|
+
[AgentToolActions.TOOLS_EXECUTION_RESULT_VIEWED]: ToolsExecutionResultAttributes;
|
|
37
|
+
[AgentToolActions.TOOLS_EXECUTION_RESULT_ERROR]: ToolsExecutionAttributes;
|
|
38
|
+
};
|
|
@@ -1,52 +1,22 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
CHAT = "chat",
|
|
18
|
-
VERIFY = "verify",
|
|
19
|
-
UNVERIFY = "unverify"
|
|
20
|
-
}
|
|
21
|
-
type EmptyAttributes = {};
|
|
22
|
-
type ActionAttributes = {
|
|
23
|
-
[AgentCommonActions.VIEW]: BaseAgentAnalyticsAttributes;
|
|
24
|
-
[AgentCommonActions.EDIT]: BaseAgentAnalyticsAttributes;
|
|
25
|
-
[AgentCommonActions.UPDATED]: BaseAgentAnalyticsAttributes & {
|
|
26
|
-
agentType: string;
|
|
27
|
-
field: string;
|
|
28
|
-
};
|
|
29
|
-
[AgentCommonActions.COPY_LINK]: BaseAgentAnalyticsAttributes;
|
|
30
|
-
[AgentCommonActions.DELETE]: BaseAgentAnalyticsAttributes;
|
|
31
|
-
[AgentCommonActions.DUPLICATE]: BaseAgentAnalyticsAttributes;
|
|
32
|
-
[AgentCommonActions.STAR]: BaseAgentAnalyticsAttributes;
|
|
33
|
-
[AgentCommonActions.CHAT]: BaseAgentAnalyticsAttributes;
|
|
34
|
-
[AgentCommonActions.VERIFY]: BaseAgentAnalyticsAttributes;
|
|
35
|
-
[AgentCommonActions.UNVERIFY]: BaseAgentAnalyticsAttributes;
|
|
36
|
-
[AgentDebugActions.COPY_ALL]: EmptyAttributes;
|
|
37
|
-
[AgentDebugActions.COPY]: EmptyAttributes;
|
|
38
|
-
[AgentDebugActions.TOGGLE_SKILL_INFO]: {
|
|
39
|
-
toolId: string;
|
|
40
|
-
isExpanded: boolean;
|
|
41
|
-
};
|
|
42
|
-
[AgentDebugActions.VIEW]: EmptyAttributes;
|
|
43
|
-
[AgentToolActions.TOOLS_EXECUTION_CONFIRMED]: ToolsExecutionAttributes;
|
|
44
|
-
[AgentToolActions.TOOLS_EXECUTION_STREAM_STOPPED]: ToolsExecutionAttributes;
|
|
45
|
-
[AgentToolActions.TOOLS_EXECUTION_RESULT_VIEWED]: ToolsExecutionResultAttributes;
|
|
46
|
-
[AgentToolActions.TOOLS_EXECUTION_RESULT_ERROR]: ToolsExecutionAttributes;
|
|
1
|
+
import type { RemainingRequired } from '../common/types';
|
|
2
|
+
import { AgentInteractionActions } from './groups/agent-interactions';
|
|
3
|
+
import { AgentDebugActions as AgentDebugActionsEnum } from './groups/debug';
|
|
4
|
+
import { AgentEditingActions } from './groups/editing';
|
|
5
|
+
import type { ActionAttributes } from './registry';
|
|
6
|
+
export declare const AgentCommonActions: {
|
|
7
|
+
readonly UPDATED: AgentEditingActions.UPDATED;
|
|
8
|
+
readonly VIEW: AgentInteractionActions.VIEW;
|
|
9
|
+
readonly EDIT: AgentInteractionActions.EDIT;
|
|
10
|
+
readonly COPY_LINK: AgentInteractionActions.COPY_LINK;
|
|
11
|
+
readonly DELETE: AgentInteractionActions.DELETE;
|
|
12
|
+
readonly DUPLICATE: AgentInteractionActions.DUPLICATE;
|
|
13
|
+
readonly STAR: AgentInteractionActions.STAR;
|
|
14
|
+
readonly CHAT: AgentInteractionActions.CHAT;
|
|
15
|
+
readonly VERIFY: AgentInteractionActions.VERIFY;
|
|
16
|
+
readonly UNVERIFY: AgentInteractionActions.UNVERIFY;
|
|
47
17
|
};
|
|
18
|
+
export declare const AgentDebugActions: typeof AgentDebugActionsEnum;
|
|
48
19
|
export declare const useRovoAgentActionAnalytics: <T extends {}>(commonAttributes: T) => {
|
|
49
20
|
trackAgentAction: <A extends keyof ActionAttributes>(action: A, attributes: RemainingRequired<ActionAttributes[A], T>) => void;
|
|
50
21
|
trackAgentActionError: <A extends keyof ActionAttributes>(action: A, error: Error, attributes?: RemainingRequired<ActionAttributes[A], T>) => void;
|
|
51
22
|
};
|
|
52
|
-
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type AgentInteractionAttributes } from './groups/agent-interactions';
|
|
2
|
+
import { type DebugActionAttributes } from './groups/debug';
|
|
3
|
+
import { type EditingActionAttributes } from './groups/editing';
|
|
4
|
+
import { type ToolsActionAttributes } from './groups/tools';
|
|
5
|
+
/**
|
|
6
|
+
* Combined attribute map for action-hook groups (type-safe attributes).
|
|
7
|
+
* Create-flow groups are excluded — they use a looser attribute type via the create hook.
|
|
8
|
+
*/
|
|
9
|
+
export type ActionAttributes = AgentInteractionAttributes & EditingActionAttributes & DebugActionAttributes & ToolsActionAttributes;
|
|
10
|
+
/**
|
|
11
|
+
* Runtime lookup: action value → group name.
|
|
12
|
+
* Used by ALL analytics hooks to auto-inject `attributes.actionGroup`.
|
|
13
|
+
*
|
|
14
|
+
* When you add a new group, add it here too.
|
|
15
|
+
*/
|
|
16
|
+
export declare const ACTION_TO_GROUP: Record<string, string>;
|
|
@@ -1,22 +1,24 @@
|
|
|
1
|
+
import { AddToolsPromptActions } from '../actions/groups/add-tools-prompt';
|
|
2
|
+
import { CreateFlowActions } from '../actions/groups/create-flow';
|
|
3
|
+
export declare const AgentCreateActions: {
|
|
4
|
+
readonly SHOWN: AddToolsPromptActions.SHOWN;
|
|
5
|
+
readonly BROWSE: AddToolsPromptActions.BROWSE;
|
|
6
|
+
readonly DISMISS: AddToolsPromptActions.DISMISS;
|
|
7
|
+
readonly START: CreateFlowActions.START;
|
|
8
|
+
readonly SKIP_NL: CreateFlowActions.SKIP_NL;
|
|
9
|
+
readonly REVIEW_NL: CreateFlowActions.REVIEW_NL;
|
|
10
|
+
readonly ACTIVATE: CreateFlowActions.ACTIVATE;
|
|
11
|
+
readonly RESTART: CreateFlowActions.RESTART;
|
|
12
|
+
readonly ERROR: CreateFlowActions.ERROR;
|
|
13
|
+
readonly LAND: CreateFlowActions.LAND;
|
|
14
|
+
readonly DISCARD: CreateFlowActions.DISCARD;
|
|
15
|
+
readonly SA_DRAFT: CreateFlowActions.SA_DRAFT;
|
|
16
|
+
};
|
|
1
17
|
type CommonAnalyticsAttributes = {
|
|
2
18
|
touchPoint?: string;
|
|
3
19
|
} & Record<string, any>;
|
|
4
|
-
export declare enum AgentCreateActions {
|
|
5
|
-
START = "createFlowStart",
|
|
6
|
-
SKIP_NL = "createFlowSkipNL",
|
|
7
|
-
REVIEW_NL = "createFlowReviewNL",
|
|
8
|
-
ACTIVATE = "createFlowActivate",
|
|
9
|
-
RESTART = "createFlowRestart",
|
|
10
|
-
ERROR = "createFlowError",
|
|
11
|
-
LAND = "createLandInStudio",
|
|
12
|
-
DISCARD = "createDiscard",
|
|
13
|
-
SHOW_NO_SKILLS_MODAL = "showNoSkillsModal",
|
|
14
|
-
BROWSE_CLICK_NO_SKILLS_MODAL = "browseClickNoSkillsModal",
|
|
15
|
-
DISCARD_NO_SKILLS_MODAL = "discardNoSkillsModal",
|
|
16
|
-
SA_DRAFT = "saDraft"
|
|
17
|
-
}
|
|
18
20
|
export declare const useRovoAgentCreateAnalytics: (commonAttributes: CommonAnalyticsAttributes) => readonly [string | null, {
|
|
19
|
-
readonly trackCreateSession: (action:
|
|
21
|
+
readonly trackCreateSession: (action: (typeof AgentCreateActions)[keyof typeof AgentCreateActions], attributes?: CommonAnalyticsAttributes) => void;
|
|
20
22
|
readonly trackCreateSessionStart: (attributes?: CommonAnalyticsAttributes) => void;
|
|
21
23
|
readonly trackCreateSessionError: (error: Error, attributes?: CommonAnalyticsAttributes) => void;
|
|
22
24
|
readonly refreshCSID: () => `${string}-${string}-${string}-${string}-${string}`;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action Group: addToolsPrompt
|
|
3
|
+
*
|
|
4
|
+
* Add tools prompt modal — shown when a user tries to activate/publish an agent that has no tools.
|
|
5
|
+
* The user can browse tools or dismiss and proceed without them.
|
|
6
|
+
*
|
|
7
|
+
* This group is intentionally flow-agnostic so the action values stay stable
|
|
8
|
+
* regardless of whether the prompt fires from the create flow or a future publish flow.
|
|
9
|
+
*
|
|
10
|
+
* ## Adding a new action
|
|
11
|
+
* 1. Add the action to the `AddToolsPromptActions` enum below with a data-portal link
|
|
12
|
+
* 2. Register this group in ../registry.ts (if this is a new group file)
|
|
13
|
+
*
|
|
14
|
+
*/
|
|
15
|
+
/** The group name sent as `attributes.actionGroup` in analytics events */
|
|
16
|
+
export declare const ACTION_GROUP: "addToolsPrompt";
|
|
17
|
+
export declare enum AddToolsPromptActions {
|
|
18
|
+
SHOWN = "addToolsPromptShown",
|
|
19
|
+
BROWSE = "addToolsPromptBrowse",
|
|
20
|
+
DISMISS = "addToolsPromptDismiss"
|
|
21
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action Group: agentInteractions
|
|
3
|
+
*
|
|
4
|
+
* User-initiated interactions with an agent — typically from the overflow menu ("...")
|
|
5
|
+
* or agent profile surfaces (viewing, editing, deleting, duplicating, starring, sharing, verifying).
|
|
6
|
+
*
|
|
7
|
+
* NOTE: This is about UI interactions, not backend "actions" (which are being replaced by "tools").
|
|
8
|
+
*
|
|
9
|
+
* ## Adding a new action
|
|
10
|
+
* 1. Add the action to the `AgentInteractionActions` enum below with a data-portal link
|
|
11
|
+
* 2. Add the corresponding attribute type in `AgentInteractionAttributes`
|
|
12
|
+
* 3. If this action doesn't fit user interactions, create a new group file instead
|
|
13
|
+
* (see other files in this directory for the template)
|
|
14
|
+
*/
|
|
15
|
+
import type { BaseAgentAnalyticsAttributes } from '../../common/types';
|
|
16
|
+
/** The group name sent as `attributes.actionGroup` in analytics events */
|
|
17
|
+
export declare const ACTION_GROUP: "agentInteractions";
|
|
18
|
+
export declare enum AgentInteractionActions {
|
|
19
|
+
VIEW = "view",
|
|
20
|
+
EDIT = "edit",
|
|
21
|
+
COPY_LINK = "copyLink",
|
|
22
|
+
DELETE = "delete",
|
|
23
|
+
DUPLICATE = "duplicate",
|
|
24
|
+
STAR = "star",
|
|
25
|
+
CHAT = "chat",
|
|
26
|
+
VERIFY = "verify",
|
|
27
|
+
UNVERIFY = "unverify"
|
|
28
|
+
}
|
|
29
|
+
export type AgentInteractionAttributes = {
|
|
30
|
+
[AgentInteractionActions.VIEW]: BaseAgentAnalyticsAttributes;
|
|
31
|
+
[AgentInteractionActions.EDIT]: BaseAgentAnalyticsAttributes;
|
|
32
|
+
[AgentInteractionActions.COPY_LINK]: BaseAgentAnalyticsAttributes;
|
|
33
|
+
[AgentInteractionActions.DELETE]: BaseAgentAnalyticsAttributes;
|
|
34
|
+
[AgentInteractionActions.DUPLICATE]: BaseAgentAnalyticsAttributes;
|
|
35
|
+
[AgentInteractionActions.STAR]: BaseAgentAnalyticsAttributes;
|
|
36
|
+
[AgentInteractionActions.CHAT]: BaseAgentAnalyticsAttributes;
|
|
37
|
+
[AgentInteractionActions.VERIFY]: BaseAgentAnalyticsAttributes;
|
|
38
|
+
[AgentInteractionActions.UNVERIFY]: BaseAgentAnalyticsAttributes;
|
|
39
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action Group: createFlow
|
|
3
|
+
*
|
|
4
|
+
* Create agent funnel steps — from clicking "Create agent" through to activation or discard,
|
|
5
|
+
*
|
|
6
|
+
* ## Adding a new action
|
|
7
|
+
* 1. Add the action to the `CreateFlowActions` enum below with a data-portal link
|
|
8
|
+
* 2. Register this group in ../registry.ts (if this is a new group file)
|
|
9
|
+
*/
|
|
10
|
+
/** The group name sent as `attributes.actionGroup` in analytics events */
|
|
11
|
+
export declare const ACTION_GROUP: "createFlow";
|
|
12
|
+
export declare enum CreateFlowActions {
|
|
13
|
+
START = "createFlowStart",
|
|
14
|
+
SKIP_NL = "createFlowSkipNL",
|
|
15
|
+
REVIEW_NL = "createFlowReviewNL",
|
|
16
|
+
ACTIVATE = "createFlowActivate",
|
|
17
|
+
RESTART = "createFlowRestart",
|
|
18
|
+
ERROR = "createFlowError",
|
|
19
|
+
LAND = "createLandInStudio",
|
|
20
|
+
DISCARD = "createDiscard",
|
|
21
|
+
SA_DRAFT = "saDraft"
|
|
22
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action Group: debug
|
|
3
|
+
*
|
|
4
|
+
* Actions related to the agent debug modal (viewing, copying debug data, toggling skill info).
|
|
5
|
+
*
|
|
6
|
+
* ## Adding a new action
|
|
7
|
+
* 1. Add the action to the `AgentDebugActions` enum below with a data-portal link
|
|
8
|
+
* 2. Add the corresponding attribute type in `DebugActionAttributes`
|
|
9
|
+
* 3. If this action doesn't fit this group, consider creating a new group file instead
|
|
10
|
+
* (see other files in this directory for the template)
|
|
11
|
+
*/
|
|
12
|
+
/** The group name sent as `attributes.actionGroup` in analytics events */
|
|
13
|
+
export declare const ACTION_GROUP: "debug";
|
|
14
|
+
export declare enum AgentDebugActions {
|
|
15
|
+
VIEW = "debugView",
|
|
16
|
+
COPY_ALL = "debugCopyAll",
|
|
17
|
+
COPY = "debugCopy",
|
|
18
|
+
TOGGLE_SKILL_INFO = "debugToggleSkillInfo"
|
|
19
|
+
}
|
|
20
|
+
type EmptyAttributes = {};
|
|
21
|
+
export type DebugActionAttributes = {
|
|
22
|
+
[AgentDebugActions.COPY_ALL]: EmptyAttributes;
|
|
23
|
+
[AgentDebugActions.COPY]: EmptyAttributes;
|
|
24
|
+
[AgentDebugActions.TOGGLE_SKILL_INFO]: {
|
|
25
|
+
toolId: string;
|
|
26
|
+
isExpanded: boolean;
|
|
27
|
+
};
|
|
28
|
+
[AgentDebugActions.VIEW]: EmptyAttributes;
|
|
29
|
+
};
|
|
30
|
+
export {};
|