@bytexbyte/nxtlinq-ai-agent-ui-react-development 0.4.4 → 0.4.7
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/dist/aitPermissionPropagation.d.ts +16 -0
- package/dist/aitPermissionPropagation.d.ts.map +1 -0
- package/dist/aitPermissionPropagation.js +21 -0
- package/dist/context/ChatBotContext.d.ts.map +1 -1
- package/dist/context/ChatBotContext.js +230 -231
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/piiMessageState.d.ts +16 -0
- package/dist/piiMessageState.d.ts.map +1 -0
- package/dist/piiMessageState.js +18 -0
- package/dist/suggestionState.d.ts +4 -0
- package/dist/suggestionState.d.ts.map +1 -0
- package/dist/suggestionState.js +14 -0
- package/dist/types/ChatBotTypes.d.ts +7 -6
- package/dist/types/ChatBotTypes.d.ts.map +1 -1
- package/dist/ui/ModelSelector.js +2 -2
- package/dist/ui/PermissionForm.d.ts.map +1 -1
- package/dist/ui/PermissionForm.js +14 -28
- package/dist/ui/PresetMessages.d.ts.map +1 -1
- package/dist/ui/PresetMessages.js +7 -4
- package/package.json +4 -4
- package/src/aitPermissionPropagation.ts +40 -0
- package/src/context/ChatBotContext.tsx +309 -266
- package/src/index.ts +0 -1
- package/src/permissionState.ts +313 -0
- package/src/piiMessageState.ts +35 -0
- package/src/suggestionState.ts +20 -0
- package/src/types/ChatBotTypes.ts +7 -7
- package/src/ui/ModelSelector.tsx +5 -5
- package/src/ui/PermissionForm.tsx +19 -30
- package/src/ui/PresetMessages.tsx +9 -6
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { ChatBot } from './ChatBot';
|
|
2
2
|
export { ChatBotProvider, useChatBot } from './context/ChatBotContext';
|
|
3
3
|
export { ChatBotUI, MessageInput, MessageList, ModelSelector, NotificationModal, PermissionForm, PresetMessages, BerifyMeModal, } from './ui/index';
|
|
4
|
-
export type { AIModel,
|
|
4
|
+
export type { AIModel, ChatBotContextType, ChatBotProps, NovaError, NovaResponse, ToolCall, ToolUse, PresetMessage, } from './types/ChatBotTypes';
|
|
5
5
|
export type { AgentEnvironment, AgentConfig, Attachment, AgentResponse, Message, SendMessageOptions, NxtlinqAgentSnapshot, TextToolAuthorizationSnapshot, TextToolAuthorizationOutcome, VoiceSession, VoiceStatus, } from '@bytexbyte/nxtlinq-ai-agent-core-development';
|
|
6
6
|
export { NxtlinqAgent, setApiHosts, VoiceNotSupportedError, STORAGE_KEYS, authorizeTextFrontendTool, hasRecordedWalletVerification, validateWalletSession, } from '@bytexbyte/nxtlinq-ai-agent-core-development';
|
|
7
7
|
export { createNxtlinqApi, useLocalStorage, useSessionStorage, useSpeechToTextFromMic, useVoiceMode, metakeepClient, getEthers, sleep, walletTextUtils, } from '@bytexbyte/nxtlinq-ai-agent-web-development';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEvE,OAAO,EACL,SAAS,EACT,YAAY,EACZ,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,OAAO,EACP,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEvE,OAAO,EACL,SAAS,EACT,YAAY,EACZ,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,OAAO,EACP,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,OAAO,EACP,aAAa,GACd,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,aAAa,EACb,OAAO,EACP,kBAAkB,EAClB,oBAAoB,EACpB,6BAA6B,EAC7B,4BAA4B,EAC5B,YAAY,EACZ,WAAW,GACZ,MAAM,8CAA8C,CAAC;AAEtD,OAAO,EACL,YAAY,EACZ,WAAW,EACX,sBAAsB,EACtB,YAAY,EACZ,yBAAyB,EACzB,6BAA6B,EAC7B,qBAAqB,GACtB,MAAM,8CAA8C,CAAC;AAEtD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,YAAY,EACZ,cAAc,EACd,SAAS,EACT,KAAK,EACL,eAAe,GAChB,MAAM,6CAA6C,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
type PiiMessage = {
|
|
2
|
+
piiStatus?: 'scanning' | 'complete' | 'none';
|
|
3
|
+
piiStep?: 0 | 1 | 2;
|
|
4
|
+
piiProtection?: {
|
|
5
|
+
anonymizedContent?: string;
|
|
6
|
+
mapping?: Record<string, string>;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
export type PiiScanCompleteData = {
|
|
10
|
+
entityCount?: number;
|
|
11
|
+
anonymizedUserMessage?: string | null;
|
|
12
|
+
mapping?: Record<string, string> | null;
|
|
13
|
+
};
|
|
14
|
+
export declare function completePiiScan<T extends PiiMessage>(message: T, data?: PiiScanCompleteData): T;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=piiMessageState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"piiMessageState.d.ts","sourceRoot":"","sources":["../src/piiMessageState.ts"],"names":[],"mappings":"AAAA,KAAK,UAAU,GAAG;IAChB,SAAS,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpB,aAAa,CAAC,EAAE;QACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CACzC,CAAC;AAEF,wBAAgB,eAAe,CAAC,CAAC,SAAS,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,CAAC,CAmB/F"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export function completePiiScan(message, data) {
|
|
2
|
+
const mapping = data?.mapping || {};
|
|
3
|
+
const entityCount = typeof data?.entityCount === 'number'
|
|
4
|
+
? data.entityCount
|
|
5
|
+
: Object.keys(mapping).length;
|
|
6
|
+
if (entityCount <= 0 || !data?.anonymizedUserMessage) {
|
|
7
|
+
return { ...message, piiStatus: 'none', piiStep: 1 };
|
|
8
|
+
}
|
|
9
|
+
return {
|
|
10
|
+
...message,
|
|
11
|
+
piiStatus: 'complete',
|
|
12
|
+
piiStep: 1,
|
|
13
|
+
piiProtection: {
|
|
14
|
+
anonymizedContent: data.anonymizedUserMessage,
|
|
15
|
+
mapping,
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { PresetMessage } from './types/ChatBotTypes';
|
|
2
|
+
export declare function normalizeSuggestionText(value: string): string;
|
|
3
|
+
export declare function filterSuggestions(suggestions: readonly PresetMessage[], lastUserMessage?: string): PresetMessage[];
|
|
4
|
+
//# sourceMappingURL=suggestionState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggestionState.d.ts","sourceRoot":"","sources":["../src/suggestionState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,SAAS,aAAa,EAAE,EACrC,eAAe,CAAC,EAAE,MAAM,GACvB,aAAa,EAAE,CAUjB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function normalizeSuggestionText(value) {
|
|
2
|
+
return value.trim().replace(/\s+/g, ' ').toLocaleLowerCase();
|
|
3
|
+
}
|
|
4
|
+
export function filterSuggestions(suggestions, lastUserMessage) {
|
|
5
|
+
const lastUserText = normalizeSuggestionText(lastUserMessage || '');
|
|
6
|
+
const seen = new Set();
|
|
7
|
+
return suggestions.filter((suggestion) => {
|
|
8
|
+
const normalized = normalizeSuggestionText(suggestion.text || '');
|
|
9
|
+
if (!normalized || normalized === lastUserText || seen.has(normalized))
|
|
10
|
+
return false;
|
|
11
|
+
seen.add(normalized);
|
|
12
|
+
return true;
|
|
13
|
+
});
|
|
14
|
+
}
|
|
@@ -20,10 +20,6 @@ export interface NovaResponse {
|
|
|
20
20
|
export interface NovaError {
|
|
21
21
|
error: string;
|
|
22
22
|
}
|
|
23
|
-
export interface AITMetadata {
|
|
24
|
-
permissions: string[];
|
|
25
|
-
issuedBy: string;
|
|
26
|
-
}
|
|
27
23
|
export interface AIModel {
|
|
28
24
|
label: string;
|
|
29
25
|
value: string;
|
|
@@ -53,6 +49,8 @@ export interface ChatBotProps {
|
|
|
53
49
|
token: string;
|
|
54
50
|
} | undefined>;
|
|
55
51
|
permissionGroup?: string;
|
|
52
|
+
/** Ordered runtime identity-provider roles. Order is preserved for Group fallback. */
|
|
53
|
+
roles?: string[];
|
|
56
54
|
children?: React.ReactNode;
|
|
57
55
|
onModelChange?: (model: AIModel) => void;
|
|
58
56
|
storageMode?: "session-storage" | "local-storage";
|
|
@@ -84,6 +82,9 @@ export interface ChatBotContextType {
|
|
|
84
82
|
hitAddress: string | null;
|
|
85
83
|
ait: AIT | null;
|
|
86
84
|
permissions: string[];
|
|
85
|
+
maximumPermissions: string[];
|
|
86
|
+
deniedPermissions: string[];
|
|
87
|
+
runtimePermissionsUnavailable: boolean;
|
|
87
88
|
availablePermissions: ServicePermission[];
|
|
88
89
|
showPermissionForm: boolean;
|
|
89
90
|
isPermissionFormOpen: boolean;
|
|
@@ -125,7 +126,6 @@ export interface ChatBotContextType {
|
|
|
125
126
|
setIsOpen: (open: boolean) => void;
|
|
126
127
|
setShowPermissionForm: (show: boolean) => void;
|
|
127
128
|
setIsPermissionFormOpen: (open: boolean) => void;
|
|
128
|
-
setPermissions: (permissions: string[]) => void;
|
|
129
129
|
setIsDisabled: (disabled: boolean) => void;
|
|
130
130
|
setIsWalletLoading: (loading: boolean) => void;
|
|
131
131
|
setNotification: (notification: any) => void;
|
|
@@ -138,7 +138,7 @@ export interface ChatBotContextType {
|
|
|
138
138
|
retryPendingTextTool: () => Promise<boolean>;
|
|
139
139
|
sendMessage: (content: string, retryCount?: number, isPresetMessage?: boolean, attachments?: Attachment[]) => Promise<void>;
|
|
140
140
|
handleSubmit: (e: React.FormEvent, attachments?: Attachment[]) => Promise<void>;
|
|
141
|
-
handlePresetMessage: (message: PresetMessage) => void
|
|
141
|
+
handlePresetMessage: (message: PresetMessage) => Promise<void>;
|
|
142
142
|
savePermissions: (newPermissions?: string[]) => Promise<void>;
|
|
143
143
|
enableAIT: (toolName: string) => Promise<boolean>;
|
|
144
144
|
handleVerifyWalletClick: (method: 'berifyme' | 'custom') => Promise<void>;
|
|
@@ -171,6 +171,7 @@ export interface ChatBotContextType {
|
|
|
171
171
|
onVerifyWallet: (method: 'berifyme' | 'custom') => Promise<void>;
|
|
172
172
|
serviceId: string;
|
|
173
173
|
permissionGroup?: string;
|
|
174
|
+
roles?: string[];
|
|
174
175
|
props: ChatBotProps;
|
|
175
176
|
nxtlinqApi: AITApi;
|
|
176
177
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatBotTypes.d.ts","sourceRoot":"","sources":["../../src/types/ChatBotTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAErI,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;
|
|
1
|
+
{"version":3,"file":"ChatBotTypes.d.ts","sourceRoot":"","sources":["../../src/types/ChatBotTypes.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/ModelSelector.js
CHANGED
|
@@ -85,7 +85,7 @@ export const ModelSelector = () => {
|
|
|
85
85
|
font-size: 12px !important;
|
|
86
86
|
font-weight: 500 !important;
|
|
87
87
|
gap: 6px !important;
|
|
88
|
-
|
|
88
|
+
|
|
89
89
|
&:hover {
|
|
90
90
|
background-color: rgba(255, 255, 255, 0.2) !important;
|
|
91
91
|
}
|
|
@@ -107,7 +107,7 @@ export const ModelSelector = () => {
|
|
|
107
107
|
color: ${index === safeSelectedModelIndex ? '#007bff' : '#333'} !important;
|
|
108
108
|
font-size: 12px !important;
|
|
109
109
|
border-bottom: ${index < availableModels.length - 1 ? '1px solid #eee' : 'none'} !important;
|
|
110
|
-
|
|
110
|
+
|
|
111
111
|
&:hover {
|
|
112
112
|
background-color: ${index === safeSelectedModelIndex ? '#f0f0f0' : '#f8f9fa'} !important;
|
|
113
113
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionForm.d.ts","sourceRoot":"","sources":["../../src/ui/PermissionForm.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,UAAU,mBAAmB;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,
|
|
1
|
+
{"version":3,"file":"PermissionForm.d.ts","sourceRoot":"","sources":["../../src/ui/PermissionForm.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,UAAU,mBAAmB;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA2lBxD,CAAC"}
|
|
@@ -7,8 +7,7 @@ import { walletTextUtils } from '@bytexbyte/nxtlinq-ai-agent-web-development';
|
|
|
7
7
|
import { hasRecordedWalletVerification } from '@bytexbyte/nxtlinq-ai-agent-core-development';
|
|
8
8
|
import { actionButton } from './styles/isolatedStyles';
|
|
9
9
|
export const PermissionForm = ({ onClose }) => {
|
|
10
|
-
const { hitAddress, permissions,
|
|
11
|
-
const [availablePermissions, setAvailablePermissions] = React.useState([]);
|
|
10
|
+
const { hitAddress, permissions, availablePermissions, runtimePermissionsUnavailable, setIsDisabled, onSave, onConnectWallet, onSignIn, isNeedSignInWithWallet, walletInfo, onVerifyWallet, serviceId, isAITLoading, isWalletLoading = false, refreshAIT, props } = useChatBot();
|
|
12
11
|
const [isSaving, setIsSaving] = React.useState(false);
|
|
13
12
|
const [tempPermissions, setTempPermissions] = React.useState(permissions);
|
|
14
13
|
const [hasUserInteracted, setHasUserInteracted] = React.useState(false);
|
|
@@ -35,27 +34,6 @@ export const PermissionForm = ({ onClose }) => {
|
|
|
35
34
|
}
|
|
36
35
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
37
36
|
}, [isAllSelected, availablePermissions.length]);
|
|
38
|
-
const fetchAvailablePermissions = async () => {
|
|
39
|
-
if (!serviceId)
|
|
40
|
-
return;
|
|
41
|
-
try {
|
|
42
|
-
const result = await nxtlinqApi.permissions.getServicePermissions({
|
|
43
|
-
serviceId,
|
|
44
|
-
...(permissionGroup && { groupName: permissionGroup })
|
|
45
|
-
});
|
|
46
|
-
if ('error' in result) {
|
|
47
|
-
console.error('Failed to fetch permissions:', result.error);
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
setAvailablePermissions(result.permissions);
|
|
51
|
-
}
|
|
52
|
-
catch (error) {
|
|
53
|
-
console.error('Error fetching permissions:', error);
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
React.useEffect(() => {
|
|
57
|
-
fetchAvailablePermissions();
|
|
58
|
-
}, [serviceId, nxtlinqApi, permissionGroup]);
|
|
59
37
|
// Refresh wallet info when component mounts or when hitAddress changes
|
|
60
38
|
React.useEffect(() => {
|
|
61
39
|
if (hitAddress) {
|
|
@@ -81,8 +59,6 @@ export const PermissionForm = ({ onClose }) => {
|
|
|
81
59
|
const handleSave = async () => {
|
|
82
60
|
setIsSaving(true);
|
|
83
61
|
try {
|
|
84
|
-
// Update the actual permissions with temp permissions
|
|
85
|
-
setPermissions(tempPermissions);
|
|
86
62
|
await onSave(tempPermissions);
|
|
87
63
|
setHasUserInteracted(false);
|
|
88
64
|
}
|
|
@@ -348,7 +324,17 @@ export const PermissionForm = ({ onClose }) => {
|
|
|
348
324
|
border: 1px solid #e9ecef !important;
|
|
349
325
|
text-align: center !important;
|
|
350
326
|
color: #666 !important;
|
|
351
|
-
`, children: "Loading permissions..." })) : (
|
|
327
|
+
`, children: "Loading permissions..." })) : runtimePermissionsUnavailable ? (_jsxs("div", { css: css `
|
|
328
|
+
background-color: #fff4e5 !important;
|
|
329
|
+
padding: 16px !important;
|
|
330
|
+
border-radius: 8px !important;
|
|
331
|
+
border: 1px solid #ffb74d !important;
|
|
332
|
+
text-align: center !important;
|
|
333
|
+
color: #8a4b00 !important;
|
|
334
|
+
`, children: ["Permissions are unavailable. Retry to load the authoritative state.", _jsx("button", { type: "button", onClick: () => refreshAIT(), css: css `
|
|
335
|
+
display: block !important;
|
|
336
|
+
margin: 12px auto 0 !important;
|
|
337
|
+
`, children: "Retry" })] })) : (_jsx("div", { css: css `
|
|
352
338
|
background-color: #f8f9fa !important;
|
|
353
339
|
padding: 16px !important;
|
|
354
340
|
border-radius: 8px !important;
|
|
@@ -406,7 +392,7 @@ export const PermissionForm = ({ onClose }) => {
|
|
|
406
392
|
setHasUserInteracted(true);
|
|
407
393
|
setIsDisabled(false);
|
|
408
394
|
}
|
|
409
|
-
}, disabled: isAITLoading || isOtherPermissionDisabled, css: css `
|
|
395
|
+
}, disabled: isAITLoading || runtimePermissionsUnavailable || isOtherPermissionDisabled, css: css `
|
|
410
396
|
margin: 0 !important;
|
|
411
397
|
width: 18px !important;
|
|
412
398
|
height: 18px !important;
|
|
@@ -439,7 +425,7 @@ export const PermissionForm = ({ onClose }) => {
|
|
|
439
425
|
background-color: #e9ecef !important;
|
|
440
426
|
border-color: #ced4da !important;
|
|
441
427
|
}
|
|
442
|
-
`, children: "Cancel" }), _jsx("button", { onClick: handleSave, disabled: !hasPermissionChanges() || isSaving || isAITLoading, css: css `
|
|
428
|
+
`, children: "Cancel" }), _jsx("button", { onClick: handleSave, disabled: !hasPermissionChanges() || isSaving || isAITLoading || runtimePermissionsUnavailable, css: css `
|
|
443
429
|
padding: 10px 20px !important;
|
|
444
430
|
background-color: ${!hasPermissionChanges() || isSaving || isAITLoading ? '#e9ecef' : '#007bff'} !important;
|
|
445
431
|
color: ${!hasPermissionChanges() || isSaving || isAITLoading ? '#6c757d' : 'white'} !important;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PresetMessages.d.ts","sourceRoot":"","sources":["../../src/ui/PresetMessages.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"PresetMessages.d.ts","sourceRoot":"","sources":["../../src/ui/PresetMessages.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EA4ClC,CAAC"}
|
|
@@ -2,9 +2,12 @@ import { jsx as _jsx } from "@emotion/react/jsx-runtime";
|
|
|
2
2
|
import { css } from '@emotion/react';
|
|
3
3
|
import { useChatBot } from '../context/ChatBotContext';
|
|
4
4
|
import { actionButton } from './styles/isolatedStyles';
|
|
5
|
+
import { filterSuggestions, normalizeSuggestionText } from '../suggestionState';
|
|
5
6
|
export const PresetMessages = () => {
|
|
6
|
-
const { suggestions, handlePresetMessage } = useChatBot();
|
|
7
|
-
|
|
7
|
+
const { suggestions, messages, handlePresetMessage } = useChatBot();
|
|
8
|
+
const lastUserMessage = [...messages].reverse().find(message => message.role === 'user')?.content;
|
|
9
|
+
const visibleSuggestions = filterSuggestions(suggestions || [], lastUserMessage);
|
|
10
|
+
if (visibleSuggestions.length === 0) {
|
|
8
11
|
return null;
|
|
9
12
|
}
|
|
10
13
|
return (_jsx("div", { css: css `
|
|
@@ -15,7 +18,7 @@ export const PresetMessages = () => {
|
|
|
15
18
|
display: flex !important;
|
|
16
19
|
gap: 10px !important;
|
|
17
20
|
align-items: center !important;
|
|
18
|
-
`, children:
|
|
21
|
+
`, children: visibleSuggestions.map((preset) => (_jsx("button", { onClick: () => { void handlePresetMessage(preset); }, css: css `
|
|
19
22
|
${actionButton}
|
|
20
23
|
padding: 5px 10px !important;
|
|
21
24
|
font-size: 12px !important;
|
|
@@ -29,5 +32,5 @@ export const PresetMessages = () => {
|
|
|
29
32
|
&:active {
|
|
30
33
|
background-color: #004085 !important;
|
|
31
34
|
}
|
|
32
|
-
`, children: preset.text },
|
|
35
|
+
`, children: preset.text }, normalizeSuggestionText(preset.text)))) }));
|
|
33
36
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bytexbyte/nxtlinq-ai-agent-ui-react-development",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.7",
|
|
4
4
|
"description": "Official React Web UI for nxtlinq AI Agent — drop-in chat widget",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"scripts": {
|
|
12
12
|
"build": "tsc",
|
|
13
13
|
"clean": "rm -rf dist",
|
|
14
|
-
"prepublishOnly": "yarn build"
|
|
14
|
+
"prepublishOnly": "yarn clean && yarn build"
|
|
15
15
|
},
|
|
16
16
|
"keywords": [
|
|
17
17
|
"nxtlinq",
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
"react-dom": ">=18.0.0"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@bytexbyte/nxtlinq-ai-agent-core-development": "2.0.
|
|
42
|
-
"@bytexbyte/nxtlinq-ai-agent-web-development": "1.0.
|
|
41
|
+
"@bytexbyte/nxtlinq-ai-agent-core-development": "2.0.2",
|
|
42
|
+
"@bytexbyte/nxtlinq-ai-agent-web-development": "1.0.3",
|
|
43
43
|
"@emotion/react": "^11.14.0",
|
|
44
44
|
"@emotion/styled": "^11.14.1",
|
|
45
45
|
"@mui/icons-material": "^7.2.0",
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export type WaitForAITPermissionsOptions<T> = {
|
|
2
|
+
readAIT: () => Promise<T | undefined>;
|
|
3
|
+
getPermissions: (ait: T) => readonly string[];
|
|
4
|
+
expectedPermissions: readonly string[];
|
|
5
|
+
attempts?: number;
|
|
6
|
+
delayMs?: number;
|
|
7
|
+
sleep?: (delayMs: number) => Promise<void>;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export function includesAITPermissions(
|
|
11
|
+
actualPermissions: readonly string[],
|
|
12
|
+
expectedPermissions: readonly string[],
|
|
13
|
+
): boolean {
|
|
14
|
+
return actualPermissions.includes('ALL')
|
|
15
|
+
|| expectedPermissions.every((permission) => actualPermissions.includes(permission));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Wait until the AIT read path can observe a newly submitted permission set.
|
|
20
|
+
* Stale reads are deliberately discarded so callers never downgrade their
|
|
21
|
+
* optimistic local state while the chain/RPC read path is catching up.
|
|
22
|
+
*/
|
|
23
|
+
export async function waitForAITPermissions<T>({
|
|
24
|
+
readAIT,
|
|
25
|
+
getPermissions,
|
|
26
|
+
expectedPermissions,
|
|
27
|
+
attempts = 10,
|
|
28
|
+
delayMs = 750,
|
|
29
|
+
sleep = (duration) => new Promise((resolve) => setTimeout(resolve, duration)),
|
|
30
|
+
}: WaitForAITPermissionsOptions<T>): Promise<T | undefined> {
|
|
31
|
+
const totalAttempts = Math.max(1, attempts);
|
|
32
|
+
for (let attempt = 0; attempt < totalAttempts; attempt += 1) {
|
|
33
|
+
const ait = await readAIT();
|
|
34
|
+
if (ait && includesAITPermissions(getPermissions(ait), expectedPermissions)) {
|
|
35
|
+
return ait;
|
|
36
|
+
}
|
|
37
|
+
if (attempt + 1 < totalAttempts) await sleep(delayMs);
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|