@atlaskit/rovo-agent-components 4.5.0 → 4.6.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 CHANGED
@@ -1,5 +1,33 @@
1
1
  # @atlaskit/rovo-agent-components
2
2
 
3
+ ## 4.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`2f13c6822ad55`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/2f13c6822ad55) -
8
+ [TREX-1413] Add presentational `AgentResponseHat` (above assistant messages) and `AgentInputHat`
9
+ (above the chat prompt input) components for per-turn agent attribution. Both render under the
10
+ `rovo_chat_agent_identity_ui` feature gate; data wiring (selected agent, dismiss callback) is
11
+ intentionally not yet connected and will land with TREX-1410/TREX-1411.
12
+
13
+ Also:
14
+ - Adds shared `deriveAgentIdentity` helper in `@atlaskit/rovo-agent-components` (subpath:
15
+ `ui/agent-identity/derive-agent-identity`) that centralises specialist-vs-default detection,
16
+ visible/accessible name derivation, and Forge prop gating via `rovo_agent_support_a2a_avatar`.
17
+ Both hats consume this helper to avoid drift.
18
+ - Extends `Message.author` in `@atlassian/conversation-assistant-service-api` with
19
+ `external_config_reference`, `identity_account_id`, `creator_type`, and `icon` so
20
+ `AgentResponseHat` receives the right inputs once TREX-1411 wires live data. Also marks the
21
+ existing `named_id` field as `@deprecated` in favour of `external_config_reference` for OOTB
22
+ avatar lookup.
23
+ - Adds storybook examples (`73-agent-response`, `74-chat-prompt-input`) for visual validation.
24
+
25
+ ## 4.5.1
26
+
27
+ ### Patch Changes
28
+
29
+ - Updated dependencies
30
+
3
31
  ## 4.5.0
4
32
 
5
33
  ### Minor Changes
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.deriveAgentIdentity = deriveAgentIdentity;
7
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
8
+ var _isAgentCreatorType = require("../../common/utils/is-agent-creator-type");
9
+ var _isForgeAgent = require("../../common/utils/is-forge-agent");
10
+ /**
11
+ * Shared identity-derivation helper used by AgentInputHat (above the prompt
12
+ * input) and AgentResponseHat (above an assistant message). Both components
13
+ * need to translate raw agent identity props into the inputs that AgentAvatar
14
+ * expects, plus an accessible/visible name pair, with the same fallback
15
+ * semantics. Centralising the logic here avoids drift between the two hats —
16
+ * historically every change to one needed a paired change to the other.
17
+ */
18
+
19
+ /** Raw identity input — typically a subset of `Agent` or `message.author`. */
20
+
21
+ /** Derived props ready to forward to AgentAvatar + the visible name slot. */
22
+
23
+ /**
24
+ * Derive `AgentAvatar` inputs and visible/accessible labels from raw identity.
25
+ *
26
+ * Behaviour:
27
+ * - Specialist path (`agentId` is a non-empty string): visible text is the
28
+ * supplied `agentName`, omitted entirely if absent (no "Rovo" text next to
29
+ * a specialist avatar). Accessible label falls back to the agent id so the
30
+ * avatar is never announced as "Rovo".
31
+ * - Default Rovo path (no `agentId`): visible and accessible labels are the
32
+ * localized default name (typically "Rovo").
33
+ * - Forge identity props are gated internally via `rovo_agent_support_a2a_avatar`
34
+ * so callers don't have to.
35
+ */
36
+ function deriveAgentIdentity(_ref) {
37
+ var agentId = _ref.agentId,
38
+ agentName = _ref.agentName,
39
+ agentNamedId = _ref.agentNamedId,
40
+ agentIdentityAccountId = _ref.agentIdentityAccountId,
41
+ imageUrl = _ref.imageUrl,
42
+ creatorType = _ref.creatorType,
43
+ isForgeAgentOverride = _ref.isForgeAgent,
44
+ forgeAgentIconUrl = _ref.forgeAgentIconUrl,
45
+ defaultName = _ref.defaultName;
46
+ var trimmedAgentId = typeof agentId === 'string' ? agentId.trim() : undefined;
47
+ var specialistAgentId = trimmedAgentId && trimmedAgentId.length > 0 ? trimmedAgentId : undefined;
48
+ var trimmedAgentName = agentName === null || agentName === void 0 ? void 0 : agentName.trim();
49
+ var visibleName = specialistAgentId ? trimmedAgentName || undefined : defaultName;
50
+ var accessibleName = specialistAgentId ? trimmedAgentName || specialistAgentId : defaultName;
51
+ var a2aGateOn = (0, _platformFeatureFlags.fg)('rovo_agent_support_a2a_avatar');
52
+
53
+ // Prefer the explicit override; otherwise validate creatorType via the
54
+ // type guard so the call site doesn't need an unsafe cast.
55
+ var isForgeAgent = isForgeAgentOverride !== undefined ? isForgeAgentOverride : creatorType && (0, _isAgentCreatorType.isAgentCreatorType)(creatorType) ? (0, _isForgeAgent.isForgeAgentByCreatorType)(creatorType) : undefined;
56
+ return {
57
+ specialistAgentId: specialistAgentId,
58
+ visibleName: visibleName,
59
+ accessibleName: accessibleName,
60
+ avatarProps: {
61
+ agentId: specialistAgentId,
62
+ agentNamedId: agentNamedId,
63
+ agentIdentityAccountId: agentIdentityAccountId,
64
+ imageUrl: imageUrl,
65
+ isForgeAgent: a2aGateOn ? isForgeAgent : undefined,
66
+ forgeAgentIconUrl: a2aGateOn ? forgeAgentIconUrl : undefined
67
+ }
68
+ };
69
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Shared identity-derivation helper used by AgentInputHat (above the prompt
3
+ * input) and AgentResponseHat (above an assistant message). Both components
4
+ * need to translate raw agent identity props into the inputs that AgentAvatar
5
+ * expects, plus an accessible/visible name pair, with the same fallback
6
+ * semantics. Centralising the logic here avoids drift between the two hats —
7
+ * historically every change to one needed a paired change to the other.
8
+ */
9
+
10
+ import { fg } from '@atlaskit/platform-feature-flags';
11
+ import { isAgentCreatorType } from '../../common/utils/is-agent-creator-type';
12
+ import { isForgeAgentByCreatorType } from '../../common/utils/is-forge-agent';
13
+
14
+ /** Raw identity input — typically a subset of `Agent` or `message.author`. */
15
+
16
+ /** Derived props ready to forward to AgentAvatar + the visible name slot. */
17
+
18
+ /**
19
+ * Derive `AgentAvatar` inputs and visible/accessible labels from raw identity.
20
+ *
21
+ * Behaviour:
22
+ * - Specialist path (`agentId` is a non-empty string): visible text is the
23
+ * supplied `agentName`, omitted entirely if absent (no "Rovo" text next to
24
+ * a specialist avatar). Accessible label falls back to the agent id so the
25
+ * avatar is never announced as "Rovo".
26
+ * - Default Rovo path (no `agentId`): visible and accessible labels are the
27
+ * localized default name (typically "Rovo").
28
+ * - Forge identity props are gated internally via `rovo_agent_support_a2a_avatar`
29
+ * so callers don't have to.
30
+ */
31
+ export function deriveAgentIdentity({
32
+ agentId,
33
+ agentName,
34
+ agentNamedId,
35
+ agentIdentityAccountId,
36
+ imageUrl,
37
+ creatorType,
38
+ isForgeAgent: isForgeAgentOverride,
39
+ forgeAgentIconUrl,
40
+ defaultName
41
+ }) {
42
+ const trimmedAgentId = typeof agentId === 'string' ? agentId.trim() : undefined;
43
+ const specialistAgentId = trimmedAgentId && trimmedAgentId.length > 0 ? trimmedAgentId : undefined;
44
+ const trimmedAgentName = agentName === null || agentName === void 0 ? void 0 : agentName.trim();
45
+ const visibleName = specialistAgentId ? trimmedAgentName || undefined : defaultName;
46
+ const accessibleName = specialistAgentId ? trimmedAgentName || specialistAgentId : defaultName;
47
+ const a2aGateOn = fg('rovo_agent_support_a2a_avatar');
48
+
49
+ // Prefer the explicit override; otherwise validate creatorType via the
50
+ // type guard so the call site doesn't need an unsafe cast.
51
+ const isForgeAgent = isForgeAgentOverride !== undefined ? isForgeAgentOverride : creatorType && isAgentCreatorType(creatorType) ? isForgeAgentByCreatorType(creatorType) : undefined;
52
+ return {
53
+ specialistAgentId,
54
+ visibleName,
55
+ accessibleName,
56
+ avatarProps: {
57
+ agentId: specialistAgentId,
58
+ agentNamedId,
59
+ agentIdentityAccountId,
60
+ imageUrl,
61
+ isForgeAgent: a2aGateOn ? isForgeAgent : undefined,
62
+ forgeAgentIconUrl: a2aGateOn ? forgeAgentIconUrl : undefined
63
+ }
64
+ };
65
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Shared identity-derivation helper used by AgentInputHat (above the prompt
3
+ * input) and AgentResponseHat (above an assistant message). Both components
4
+ * need to translate raw agent identity props into the inputs that AgentAvatar
5
+ * expects, plus an accessible/visible name pair, with the same fallback
6
+ * semantics. Centralising the logic here avoids drift between the two hats —
7
+ * historically every change to one needed a paired change to the other.
8
+ */
9
+
10
+ import { fg } from '@atlaskit/platform-feature-flags';
11
+ import { isAgentCreatorType } from '../../common/utils/is-agent-creator-type';
12
+ import { isForgeAgentByCreatorType } from '../../common/utils/is-forge-agent';
13
+
14
+ /** Raw identity input — typically a subset of `Agent` or `message.author`. */
15
+
16
+ /** Derived props ready to forward to AgentAvatar + the visible name slot. */
17
+
18
+ /**
19
+ * Derive `AgentAvatar` inputs and visible/accessible labels from raw identity.
20
+ *
21
+ * Behaviour:
22
+ * - Specialist path (`agentId` is a non-empty string): visible text is the
23
+ * supplied `agentName`, omitted entirely if absent (no "Rovo" text next to
24
+ * a specialist avatar). Accessible label falls back to the agent id so the
25
+ * avatar is never announced as "Rovo".
26
+ * - Default Rovo path (no `agentId`): visible and accessible labels are the
27
+ * localized default name (typically "Rovo").
28
+ * - Forge identity props are gated internally via `rovo_agent_support_a2a_avatar`
29
+ * so callers don't have to.
30
+ */
31
+ export function deriveAgentIdentity(_ref) {
32
+ var agentId = _ref.agentId,
33
+ agentName = _ref.agentName,
34
+ agentNamedId = _ref.agentNamedId,
35
+ agentIdentityAccountId = _ref.agentIdentityAccountId,
36
+ imageUrl = _ref.imageUrl,
37
+ creatorType = _ref.creatorType,
38
+ isForgeAgentOverride = _ref.isForgeAgent,
39
+ forgeAgentIconUrl = _ref.forgeAgentIconUrl,
40
+ defaultName = _ref.defaultName;
41
+ var trimmedAgentId = typeof agentId === 'string' ? agentId.trim() : undefined;
42
+ var specialistAgentId = trimmedAgentId && trimmedAgentId.length > 0 ? trimmedAgentId : undefined;
43
+ var trimmedAgentName = agentName === null || agentName === void 0 ? void 0 : agentName.trim();
44
+ var visibleName = specialistAgentId ? trimmedAgentName || undefined : defaultName;
45
+ var accessibleName = specialistAgentId ? trimmedAgentName || specialistAgentId : defaultName;
46
+ var a2aGateOn = fg('rovo_agent_support_a2a_avatar');
47
+
48
+ // Prefer the explicit override; otherwise validate creatorType via the
49
+ // type guard so the call site doesn't need an unsafe cast.
50
+ var isForgeAgent = isForgeAgentOverride !== undefined ? isForgeAgentOverride : creatorType && isAgentCreatorType(creatorType) ? isForgeAgentByCreatorType(creatorType) : undefined;
51
+ return {
52
+ specialistAgentId: specialistAgentId,
53
+ visibleName: visibleName,
54
+ accessibleName: accessibleName,
55
+ avatarProps: {
56
+ agentId: specialistAgentId,
57
+ agentNamedId: agentNamedId,
58
+ agentIdentityAccountId: agentIdentityAccountId,
59
+ imageUrl: imageUrl,
60
+ isForgeAgent: a2aGateOn ? isForgeAgent : undefined,
61
+ forgeAgentIconUrl: a2aGateOn ? forgeAgentIconUrl : undefined
62
+ }
63
+ };
64
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Shared identity-derivation helper used by AgentInputHat (above the prompt
3
+ * input) and AgentResponseHat (above an assistant message). Both components
4
+ * need to translate raw agent identity props into the inputs that AgentAvatar
5
+ * expects, plus an accessible/visible name pair, with the same fallback
6
+ * semantics. Centralising the logic here avoids drift between the two hats —
7
+ * historically every change to one needed a paired change to the other.
8
+ */
9
+ /** Raw identity input — typically a subset of `Agent` or `message.author`. */
10
+ export type AgentIdentityInput = {
11
+ /** Specialist agent id. Falsy/empty/whitespace = default Rovo turn. */
12
+ agentId?: string;
13
+ agentName?: string;
14
+ agentNamedId?: string;
15
+ agentIdentityAccountId?: string;
16
+ imageUrl?: string;
17
+ /**
18
+ * Raw backend `creator_type` (e.g. "FORGE", "REMOTE_A2A"). Validated via
19
+ * `isAgentCreatorType` internally so callers don't need an unsafe cast.
20
+ * Ignored when `isForgeAgent` is provided explicitly.
21
+ */
22
+ creatorType?: string;
23
+ /** Pre-resolved Forge/REMOTE_A2A flag. Takes precedence over `creatorType`. */
24
+ isForgeAgent?: boolean;
25
+ forgeAgentIconUrl?: string;
26
+ /** Localized fallback used when the default Rovo path renders text. */
27
+ defaultName: string;
28
+ };
29
+ /** Derived props ready to forward to AgentAvatar + the visible name slot. */
30
+ export type DerivedAgentIdentity = {
31
+ /** Non-empty agentId when on the specialist path; undefined otherwise. */
32
+ specialistAgentId: string | undefined;
33
+ /** Visible label to render in the hat's text slot, or undefined to omit. */
34
+ visibleName: string | undefined;
35
+ /** Always-non-empty accessible label for the avatar. */
36
+ accessibleName: string;
37
+ /** Props to spread onto AgentAvatar — only meaningful on the specialist path. */
38
+ avatarProps: {
39
+ agentId: string | undefined;
40
+ agentNamedId: string | undefined;
41
+ agentIdentityAccountId: string | undefined;
42
+ imageUrl: string | undefined;
43
+ isForgeAgent: boolean | undefined;
44
+ forgeAgentIconUrl: string | undefined;
45
+ };
46
+ };
47
+ /**
48
+ * Derive `AgentAvatar` inputs and visible/accessible labels from raw identity.
49
+ *
50
+ * Behaviour:
51
+ * - Specialist path (`agentId` is a non-empty string): visible text is the
52
+ * supplied `agentName`, omitted entirely if absent (no "Rovo" text next to
53
+ * a specialist avatar). Accessible label falls back to the agent id so the
54
+ * avatar is never announced as "Rovo".
55
+ * - Default Rovo path (no `agentId`): visible and accessible labels are the
56
+ * localized default name (typically "Rovo").
57
+ * - Forge identity props are gated internally via `rovo_agent_support_a2a_avatar`
58
+ * so callers don't have to.
59
+ */
60
+ export declare function deriveAgentIdentity({ agentId, agentName, agentNamedId, agentIdentityAccountId, imageUrl, creatorType, isForgeAgent: isForgeAgentOverride, forgeAgentIconUrl, defaultName, }: AgentIdentityInput): DerivedAgentIdentity;
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Shared identity-derivation helper used by AgentInputHat (above the prompt
3
+ * input) and AgentResponseHat (above an assistant message). Both components
4
+ * need to translate raw agent identity props into the inputs that AgentAvatar
5
+ * expects, plus an accessible/visible name pair, with the same fallback
6
+ * semantics. Centralising the logic here avoids drift between the two hats —
7
+ * historically every change to one needed a paired change to the other.
8
+ */
9
+ /** Raw identity input — typically a subset of `Agent` or `message.author`. */
10
+ export type AgentIdentityInput = {
11
+ /** Specialist agent id. Falsy/empty/whitespace = default Rovo turn. */
12
+ agentId?: string;
13
+ agentName?: string;
14
+ agentNamedId?: string;
15
+ agentIdentityAccountId?: string;
16
+ imageUrl?: string;
17
+ /**
18
+ * Raw backend `creator_type` (e.g. "FORGE", "REMOTE_A2A"). Validated via
19
+ * `isAgentCreatorType` internally so callers don't need an unsafe cast.
20
+ * Ignored when `isForgeAgent` is provided explicitly.
21
+ */
22
+ creatorType?: string;
23
+ /** Pre-resolved Forge/REMOTE_A2A flag. Takes precedence over `creatorType`. */
24
+ isForgeAgent?: boolean;
25
+ forgeAgentIconUrl?: string;
26
+ /** Localized fallback used when the default Rovo path renders text. */
27
+ defaultName: string;
28
+ };
29
+ /** Derived props ready to forward to AgentAvatar + the visible name slot. */
30
+ export type DerivedAgentIdentity = {
31
+ /** Non-empty agentId when on the specialist path; undefined otherwise. */
32
+ specialistAgentId: string | undefined;
33
+ /** Visible label to render in the hat's text slot, or undefined to omit. */
34
+ visibleName: string | undefined;
35
+ /** Always-non-empty accessible label for the avatar. */
36
+ accessibleName: string;
37
+ /** Props to spread onto AgentAvatar — only meaningful on the specialist path. */
38
+ avatarProps: {
39
+ agentId: string | undefined;
40
+ agentNamedId: string | undefined;
41
+ agentIdentityAccountId: string | undefined;
42
+ imageUrl: string | undefined;
43
+ isForgeAgent: boolean | undefined;
44
+ forgeAgentIconUrl: string | undefined;
45
+ };
46
+ };
47
+ /**
48
+ * Derive `AgentAvatar` inputs and visible/accessible labels from raw identity.
49
+ *
50
+ * Behaviour:
51
+ * - Specialist path (`agentId` is a non-empty string): visible text is the
52
+ * supplied `agentName`, omitted entirely if absent (no "Rovo" text next to
53
+ * a specialist avatar). Accessible label falls back to the agent id so the
54
+ * avatar is never announced as "Rovo".
55
+ * - Default Rovo path (no `agentId`): visible and accessible labels are the
56
+ * localized default name (typically "Rovo").
57
+ * - Forge identity props are gated internally via `rovo_agent_support_a2a_avatar`
58
+ * so callers don't have to.
59
+ */
60
+ export declare function deriveAgentIdentity({ agentId, agentName, agentNamedId, agentIdentityAccountId, imageUrl, creatorType, isForgeAgent: isForgeAgentOverride, forgeAgentIconUrl, defaultName, }: AgentIdentityInput): DerivedAgentIdentity;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/rovo-agent-components",
3
- "version": "4.5.0",
3
+ "version": "4.6.0",
4
4
  "description": "This package host public components related to rovo agents, the components here are needed for other public atlaskit packages",
5
5
  "repository": "https://bitbucket.org/atlassian/atlassian-frontend-monorepo",
6
6
  "atlassian": {
@@ -47,7 +47,7 @@
47
47
  "@atlaskit/dropdown-menu": "^16.8.0",
48
48
  "@atlaskit/flag": "^17.11.0",
49
49
  "@atlaskit/heading": "^5.4.0",
50
- "@atlaskit/icon": "^34.5.0",
50
+ "@atlaskit/icon": "^35.0.0",
51
51
  "@atlaskit/link": "^3.4.0",
52
52
  "@atlaskit/logo": "^20.1.0",
53
53
  "@atlaskit/platform-feature-flags": "^1.1.0",
@@ -70,7 +70,7 @@
70
70
  "@atlassian/agent-studio-test-utils": "workspace:^",
71
71
  "@atlassian/feature-flags-test-utils": "^1.1.0",
72
72
  "@atlassian/react-compiler-gating": "workspace:^",
73
- "@atlassian/testing-library": "^0.5.0",
73
+ "@atlassian/testing-library": "^0.6.0",
74
74
  "@testing-library/react": "^16.3.0",
75
75
  "@testing-library/user-event": "^14.4.3",
76
76
  "@types/relay-test-utils": "^18.0.0",
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "@atlaskit/rovo-agent-components/ui/agent-identity/derive-agent-identity",
3
+ "main": "../../../dist/cjs/ui/agent-identity/derive-agent-identity.js",
4
+ "module": "../../../dist/esm/ui/agent-identity/derive-agent-identity.js",
5
+ "module:es2019": "../../../dist/es2019/ui/agent-identity/derive-agent-identity.js",
6
+ "sideEffects": [
7
+ "*.compiled.css"
8
+ ],
9
+ "types": "../../../dist/types/ui/agent-identity/derive-agent-identity.d.ts",
10
+ "typesVersions": {
11
+ ">=4.5 <5.9": {
12
+ "*": [
13
+ "../../../dist/types-ts4.5/ui/agent-identity/derive-agent-identity.d.ts"
14
+ ]
15
+ }
16
+ }
17
+ }