@bytexbyte/nxtlinq-ai-agent-ui-react-development 0.4.1 → 0.4.3
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/context/ChatBotContext.d.ts.map +1 -1
- package/dist/context/ChatBotContext.js +134 -426
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/pendingTextToolRetry.d.ts +16 -0
- package/dist/pendingTextToolRetry.d.ts.map +1 -0
- package/dist/pendingTextToolRetry.js +30 -0
- package/dist/permissionState.d.ts +53 -0
- package/dist/permissionState.d.ts.map +1 -0
- package/dist/permissionState.js +217 -0
- package/dist/types/ChatBotTypes.d.ts +4 -3
- package/dist/types/ChatBotTypes.d.ts.map +1 -1
- package/dist/ui/ChatBotUI.d.ts.map +1 -1
- package/dist/ui/ChatBotUI.js +6 -4
- package/dist/ui/MessageList.d.ts.map +1 -1
- package/dist/ui/MessageList.js +23 -14
- package/dist/ui/PermissionForm.d.ts.map +1 -1
- package/dist/ui/PermissionForm.js +6 -9
- package/package.json +4 -4
- package/src/context/ChatBotContext.tsx +151 -460
- package/src/index.ts +5 -0
- package/src/pendingTextToolRetry.ts +39 -0
- package/src/types/ChatBotTypes.ts +5 -4
- package/src/ui/ChatBotUI.tsx +6 -4
- package/src/ui/MessageList.tsx +17 -8
- package/src/ui/PermissionForm.tsx +7 -12
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ 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
4
|
export type { AIModel, AITMetadata, ChatBotContextType, ChatBotProps, NovaError, NovaResponse, ToolCall, ToolUse, PresetMessage, } from './types/ChatBotTypes';
|
|
5
|
-
export type { AgentEnvironment, AgentConfig, Attachment, AgentResponse, Message, SendMessageOptions, NxtlinqAgentSnapshot, VoiceSession, VoiceStatus, } from '@bytexbyte/nxtlinq-ai-agent-core-development';
|
|
6
|
-
export { NxtlinqAgent, setApiHosts, VoiceNotSupportedError, STORAGE_KEYS, } from '@bytexbyte/nxtlinq-ai-agent-core-development';
|
|
5
|
+
export type { AgentEnvironment, AgentConfig, Attachment, AgentResponse, Message, SendMessageOptions, NxtlinqAgentSnapshot, TextToolAuthorizationSnapshot, TextToolAuthorizationOutcome, VoiceSession, VoiceStatus, } from '@bytexbyte/nxtlinq-ai-agent-core-development';
|
|
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';
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
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,WAAW,EACX,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,YAAY,EACZ,WAAW,GACZ,MAAM,8CAA8C,CAAC;AAEtD,OAAO,EACL,YAAY,EACZ,WAAW,EACX,sBAAsB,EACtB,YAAY,
|
|
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,WAAW,EACX,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"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
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 { NxtlinqAgent, setApiHosts, VoiceNotSupportedError, STORAGE_KEYS, } from '@bytexbyte/nxtlinq-ai-agent-core-development';
|
|
4
|
+
export { NxtlinqAgent, setApiHosts, VoiceNotSupportedError, STORAGE_KEYS, authorizeTextFrontendTool, hasRecordedWalletVerification, validateWalletSession, } from '@bytexbyte/nxtlinq-ai-agent-core-development';
|
|
5
5
|
export { createNxtlinqApi, useLocalStorage, useSessionStorage, useSpeechToTextFromMic, useVoiceMode, metakeepClient, getEthers, sleep, walletTextUtils, } from '@bytexbyte/nxtlinq-ai-agent-web-development';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Attachment } from '@bytexbyte/nxtlinq-ai-agent-core-development';
|
|
2
|
+
export type PendingTextToolRequest = {
|
|
3
|
+
content: string;
|
|
4
|
+
isPresetMessage: boolean;
|
|
5
|
+
attachments?: Attachment[];
|
|
6
|
+
};
|
|
7
|
+
/** Keeps one interrupted text-tool request and serializes all resume attempts. */
|
|
8
|
+
export declare class PendingTextToolRetryController {
|
|
9
|
+
private pending;
|
|
10
|
+
private inFlight;
|
|
11
|
+
set(request: PendingTextToolRequest): void;
|
|
12
|
+
clear(): void;
|
|
13
|
+
hasPending(): boolean;
|
|
14
|
+
retry(execute: (request: PendingTextToolRequest) => Promise<void>): Promise<boolean>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=pendingTextToolRetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pendingTextToolRetry.d.ts","sourceRoot":"","sources":["../src/pendingTextToolRetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAE/E,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B,CAAC;AAEF,kFAAkF;AAClF,qBAAa,8BAA8B;IACzC,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,QAAQ,CAAiC;IAEjD,GAAG,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI;IAI1C,KAAK,IAAI,IAAI;IAIb,UAAU,IAAI,OAAO;IAIrB,KAAK,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;CAarF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** Keeps one interrupted text-tool request and serializes all resume attempts. */
|
|
2
|
+
export class PendingTextToolRetryController {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.pending = null;
|
|
5
|
+
this.inFlight = null;
|
|
6
|
+
}
|
|
7
|
+
set(request) {
|
|
8
|
+
this.pending = request;
|
|
9
|
+
}
|
|
10
|
+
clear() {
|
|
11
|
+
this.pending = null;
|
|
12
|
+
}
|
|
13
|
+
hasPending() {
|
|
14
|
+
return this.pending !== null;
|
|
15
|
+
}
|
|
16
|
+
retry(execute) {
|
|
17
|
+
if (this.inFlight)
|
|
18
|
+
return this.inFlight;
|
|
19
|
+
if (!this.pending)
|
|
20
|
+
return Promise.resolve(false);
|
|
21
|
+
const request = this.pending;
|
|
22
|
+
this.inFlight = (async () => {
|
|
23
|
+
await execute(request);
|
|
24
|
+
return true;
|
|
25
|
+
})().finally(() => {
|
|
26
|
+
this.inFlight = null;
|
|
27
|
+
});
|
|
28
|
+
return this.inFlight;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { AIT, RuntimeAITResult } from '@bytexbyte/nxtlinq-ai-agent-core-development';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
export declare function commitProviderRuntime<T, E>(identityRef: React.MutableRefObject<T>, identity: T, environment: E, publishEnvironment: (environment: E) => void): void;
|
|
4
|
+
export declare function useProviderRuntimeCommit<T, E>(identityRef: React.MutableRefObject<T>, identity: T, environment: E, publishEnvironment: (environment: E) => void): void;
|
|
5
|
+
export declare function replaceCurrentMaximumDenyList(persistedDeniedPermissions: readonly string[], maximumPermissions: readonly string[], checkedPermissions: readonly string[]): string[];
|
|
6
|
+
export declare function removeOneDeniedPermission(persistedDeniedPermissions: readonly string[], permission: string): string[];
|
|
7
|
+
export type RuntimeAITContext = {
|
|
8
|
+
controller: string;
|
|
9
|
+
serviceId: string;
|
|
10
|
+
roles?: string[];
|
|
11
|
+
permissionGroup?: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function runtimeAITContextKey(context: RuntimeAITContext): string;
|
|
14
|
+
export declare function runtimeAITSubjectKey(context: RuntimeAITContext): string;
|
|
15
|
+
export declare function runtimeAuthorizationMatchesContext(authorizationContextKey: string | null, renderedContext: RuntimeAITContext | null): boolean;
|
|
16
|
+
export declare class StaleRuntimeAITResponseError extends Error {
|
|
17
|
+
constructor();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Owns the authoritative recompute lifecycle. Only the newest request for the
|
|
21
|
+
* active captured context may write state; its failures clear state first.
|
|
22
|
+
*/
|
|
23
|
+
export declare class RuntimeAITRecomputeCoordinator {
|
|
24
|
+
private activeContextKey;
|
|
25
|
+
private activeContext;
|
|
26
|
+
private generation;
|
|
27
|
+
commitContext(context: RuntimeAITContext | null, invalidate: () => void): boolean;
|
|
28
|
+
getActiveContext(): RuntimeAITContext | null;
|
|
29
|
+
isContextActive(context: RuntimeAITContext): boolean;
|
|
30
|
+
assertContextActive(context: RuntimeAITContext): void;
|
|
31
|
+
run<T>(context: RuntimeAITContext, request: () => Promise<T>, apply: (result: T, context: RuntimeAITContext) => void, clear: () => void): Promise<T>;
|
|
32
|
+
}
|
|
33
|
+
export declare function useRuntimeAITContextCommit(coordinator: RuntimeAITRecomputeCoordinator, context: RuntimeAITContext | null, invalidate: () => void): void;
|
|
34
|
+
export declare function dispatchRuntimeAITCompleteReplacement(coordinator: RuntimeAITRecomputeCoordinator, context: RuntimeAITContext, update: () => Promise<unknown>, converge: (subjectKey: string) => Promise<void>, clear: () => void): Promise<void>;
|
|
35
|
+
/** Serializes reads, complete replacements, and convergence for one persistence subject. */
|
|
36
|
+
export declare class RuntimeAITMutationQueue {
|
|
37
|
+
private readonly tails;
|
|
38
|
+
run<T>(subjectKey: string, mutation: () => Promise<T>): Promise<T>;
|
|
39
|
+
}
|
|
40
|
+
export type RuntimeAuthorizationState = {
|
|
41
|
+
ait: AIT | null;
|
|
42
|
+
maximumPermissions: string[];
|
|
43
|
+
effectivePermissions: string[];
|
|
44
|
+
deniedPermissions: string[];
|
|
45
|
+
selectedRuleId: string | null;
|
|
46
|
+
selectedRuleType: RuntimeAITResult['selectedRuleType'];
|
|
47
|
+
expiresAt: string | null;
|
|
48
|
+
grantActive: boolean;
|
|
49
|
+
unavailable: boolean;
|
|
50
|
+
};
|
|
51
|
+
export declare function runtimeAuthorizationState(result: RuntimeAITResult, controller: string, serviceId: string): RuntimeAuthorizationState;
|
|
52
|
+
export declare function unavailableRuntimeAuthorization(persistedDeniedPermissions: readonly string[]): RuntimeAuthorizationState;
|
|
53
|
+
//# sourceMappingURL=permissionState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissionState.d.ts","sourceRoot":"","sources":["../src/permissionState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
const useCommitPhaseEffect = typeof window === 'undefined'
|
|
3
|
+
? React.useEffect
|
|
4
|
+
: React.useLayoutEffect;
|
|
5
|
+
export function commitProviderRuntime(identityRef, identity, environment, publishEnvironment) {
|
|
6
|
+
identityRef.current = identity;
|
|
7
|
+
publishEnvironment(environment);
|
|
8
|
+
}
|
|
9
|
+
export function useProviderRuntimeCommit(identityRef, identity, environment, publishEnvironment) {
|
|
10
|
+
useCommitPhaseEffect(() => {
|
|
11
|
+
commitProviderRuntime(identityRef, identity, environment, publishEnvironment);
|
|
12
|
+
}, [environment, identity, identityRef, publishEnvironment]);
|
|
13
|
+
}
|
|
14
|
+
function stableUnique(values) {
|
|
15
|
+
const seen = new Set();
|
|
16
|
+
const result = [];
|
|
17
|
+
for (const value of values) {
|
|
18
|
+
if (!seen.has(value)) {
|
|
19
|
+
seen.add(value);
|
|
20
|
+
result.push(value);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
export function replaceCurrentMaximumDenyList(persistedDeniedPermissions, maximumPermissions, checkedPermissions) {
|
|
26
|
+
const maximum = new Set(maximumPermissions);
|
|
27
|
+
const checked = new Set(checkedPermissions);
|
|
28
|
+
for (const permission of checked) {
|
|
29
|
+
if (!maximum.has(permission)) {
|
|
30
|
+
throw new Error(`Permission is outside the authoritative maximum: ${permission}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const retainedOutsideMaximum = persistedDeniedPermissions.filter((permission) => !maximum.has(permission));
|
|
34
|
+
const deniedInsideMaximum = maximumPermissions.filter((permission) => !checked.has(permission));
|
|
35
|
+
return stableUnique([...retainedOutsideMaximum, ...deniedInsideMaximum]);
|
|
36
|
+
}
|
|
37
|
+
export function removeOneDeniedPermission(persistedDeniedPermissions, permission) {
|
|
38
|
+
return stableUnique(persistedDeniedPermissions).filter((value) => value !== permission);
|
|
39
|
+
}
|
|
40
|
+
export function runtimeAITContextKey(context) {
|
|
41
|
+
return JSON.stringify([
|
|
42
|
+
context.controller,
|
|
43
|
+
context.serviceId,
|
|
44
|
+
context.roles === undefined ? null : [...context.roles],
|
|
45
|
+
context.permissionGroup ?? null,
|
|
46
|
+
]);
|
|
47
|
+
}
|
|
48
|
+
export function runtimeAITSubjectKey(context) {
|
|
49
|
+
return JSON.stringify([context.controller, context.serviceId]);
|
|
50
|
+
}
|
|
51
|
+
export function runtimeAuthorizationMatchesContext(authorizationContextKey, renderedContext) {
|
|
52
|
+
return authorizationContextKey === (renderedContext ? runtimeAITContextKey(renderedContext) : null);
|
|
53
|
+
}
|
|
54
|
+
export class StaleRuntimeAITResponseError extends Error {
|
|
55
|
+
constructor() {
|
|
56
|
+
super('Stale runtime AIT response was discarded');
|
|
57
|
+
this.name = 'StaleRuntimeAITResponseError';
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Owns the authoritative recompute lifecycle. Only the newest request for the
|
|
62
|
+
* active captured context may write state; its failures clear state first.
|
|
63
|
+
*/
|
|
64
|
+
export class RuntimeAITRecomputeCoordinator {
|
|
65
|
+
constructor() {
|
|
66
|
+
this.activeContextKey = null;
|
|
67
|
+
this.activeContext = null;
|
|
68
|
+
this.generation = 0;
|
|
69
|
+
}
|
|
70
|
+
commitContext(context, invalidate) {
|
|
71
|
+
const nextKey = context ? runtimeAITContextKey(context) : null;
|
|
72
|
+
if (nextKey === this.activeContextKey) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
this.activeContextKey = nextKey;
|
|
76
|
+
this.activeContext = context ? {
|
|
77
|
+
controller: context.controller,
|
|
78
|
+
serviceId: context.serviceId,
|
|
79
|
+
...(context.roles !== undefined ? { roles: [...context.roles] } : {}),
|
|
80
|
+
...(context.permissionGroup !== undefined
|
|
81
|
+
? { permissionGroup: context.permissionGroup }
|
|
82
|
+
: {}),
|
|
83
|
+
} : null;
|
|
84
|
+
this.generation += 1;
|
|
85
|
+
invalidate();
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
getActiveContext() {
|
|
89
|
+
return this.activeContext ? {
|
|
90
|
+
controller: this.activeContext.controller,
|
|
91
|
+
serviceId: this.activeContext.serviceId,
|
|
92
|
+
...(this.activeContext.roles !== undefined
|
|
93
|
+
? { roles: [...this.activeContext.roles] }
|
|
94
|
+
: {}),
|
|
95
|
+
...(this.activeContext.permissionGroup !== undefined
|
|
96
|
+
? { permissionGroup: this.activeContext.permissionGroup }
|
|
97
|
+
: {}),
|
|
98
|
+
} : null;
|
|
99
|
+
}
|
|
100
|
+
isContextActive(context) {
|
|
101
|
+
return runtimeAITContextKey(context) === this.activeContextKey;
|
|
102
|
+
}
|
|
103
|
+
assertContextActive(context) {
|
|
104
|
+
if (!this.isContextActive(context)) {
|
|
105
|
+
throw new StaleRuntimeAITResponseError();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async run(context, request, apply, clear) {
|
|
109
|
+
this.assertContextActive(context);
|
|
110
|
+
const contextKey = runtimeAITContextKey(context);
|
|
111
|
+
const generation = ++this.generation;
|
|
112
|
+
try {
|
|
113
|
+
const result = await request();
|
|
114
|
+
if (generation !== this.generation || contextKey !== this.activeContextKey) {
|
|
115
|
+
throw new StaleRuntimeAITResponseError();
|
|
116
|
+
}
|
|
117
|
+
apply(result, context);
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
if (!(error instanceof StaleRuntimeAITResponseError)
|
|
122
|
+
&& generation === this.generation
|
|
123
|
+
&& contextKey === this.activeContextKey) {
|
|
124
|
+
clear();
|
|
125
|
+
}
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
export function useRuntimeAITContextCommit(coordinator, context, invalidate) {
|
|
131
|
+
const contextKey = context ? runtimeAITContextKey(context) : null;
|
|
132
|
+
useCommitPhaseEffect(() => {
|
|
133
|
+
coordinator.commitContext(context, invalidate);
|
|
134
|
+
}, [contextKey, coordinator, invalidate]);
|
|
135
|
+
}
|
|
136
|
+
export async function dispatchRuntimeAITCompleteReplacement(coordinator, context, update, converge, clear) {
|
|
137
|
+
const subjectKey = runtimeAITSubjectKey(context);
|
|
138
|
+
coordinator.assertContextActive(context);
|
|
139
|
+
let updateFailed = false;
|
|
140
|
+
let updateError;
|
|
141
|
+
try {
|
|
142
|
+
await update();
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
updateFailed = true;
|
|
146
|
+
updateError = error;
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
await converge(subjectKey);
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
if (!updateFailed) {
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (updateFailed) {
|
|
157
|
+
if (!coordinator.isContextActive(context)) {
|
|
158
|
+
throw new StaleRuntimeAITResponseError();
|
|
159
|
+
}
|
|
160
|
+
clear();
|
|
161
|
+
throw updateError;
|
|
162
|
+
}
|
|
163
|
+
coordinator.assertContextActive(context);
|
|
164
|
+
}
|
|
165
|
+
/** Serializes reads, complete replacements, and convergence for one persistence subject. */
|
|
166
|
+
export class RuntimeAITMutationQueue {
|
|
167
|
+
constructor() {
|
|
168
|
+
this.tails = new Map();
|
|
169
|
+
}
|
|
170
|
+
async run(subjectKey, mutation) {
|
|
171
|
+
const previous = this.tails.get(subjectKey) ?? Promise.resolve();
|
|
172
|
+
const result = previous.catch(() => undefined).then(mutation);
|
|
173
|
+
const tail = result.then(() => undefined, () => undefined);
|
|
174
|
+
this.tails.set(subjectKey, tail);
|
|
175
|
+
try {
|
|
176
|
+
return await result;
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
if (this.tails.get(subjectKey) === tail) {
|
|
180
|
+
this.tails.delete(subjectKey);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
export function runtimeAuthorizationState(result, controller, serviceId) {
|
|
186
|
+
return {
|
|
187
|
+
ait: result.aitId
|
|
188
|
+
? {
|
|
189
|
+
aitId: result.aitId,
|
|
190
|
+
controller,
|
|
191
|
+
serviceId,
|
|
192
|
+
metadata: { permissions: [...result.effectivePermissions] },
|
|
193
|
+
}
|
|
194
|
+
: null,
|
|
195
|
+
maximumPermissions: [...result.maximumPermissions],
|
|
196
|
+
effectivePermissions: [...result.effectivePermissions],
|
|
197
|
+
deniedPermissions: [...result.deniedPermissions],
|
|
198
|
+
selectedRuleId: result.selectedRuleId,
|
|
199
|
+
selectedRuleType: result.selectedRuleType,
|
|
200
|
+
expiresAt: result.expiresAt,
|
|
201
|
+
grantActive: result.grantActive,
|
|
202
|
+
unavailable: false,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
export function unavailableRuntimeAuthorization(persistedDeniedPermissions) {
|
|
206
|
+
return {
|
|
207
|
+
ait: null,
|
|
208
|
+
maximumPermissions: [],
|
|
209
|
+
effectivePermissions: [],
|
|
210
|
+
deniedPermissions: [...persistedDeniedPermissions],
|
|
211
|
+
selectedRuleId: null,
|
|
212
|
+
selectedRuleType: 'none',
|
|
213
|
+
expiresAt: null,
|
|
214
|
+
grantActive: false,
|
|
215
|
+
unavailable: true,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
@@ -134,8 +134,9 @@ export interface ChatBotContextType {
|
|
|
134
134
|
setAutoSendEnabled: (enabled: boolean) => void;
|
|
135
135
|
setTextToSpeechEnabled: (enabled: boolean) => void;
|
|
136
136
|
connectWallet: (autoShowSignInMessage?: boolean) => Promise<string | false | undefined>;
|
|
137
|
-
signInWallet: (autoShowSuccessMessage?: boolean) => Promise<
|
|
138
|
-
|
|
137
|
+
signInWallet: (autoShowSuccessMessage?: boolean) => Promise<boolean>;
|
|
138
|
+
retryPendingTextTool: () => Promise<boolean>;
|
|
139
|
+
sendMessage: (content: string, retryCount?: number, isPresetMessage?: boolean, attachments?: Attachment[]) => Promise<void>;
|
|
139
140
|
handleSubmit: (e: React.FormEvent, attachments?: Attachment[]) => Promise<void>;
|
|
140
141
|
handlePresetMessage: (message: PresetMessage) => void;
|
|
141
142
|
savePermissions: (newPermissions?: string[]) => Promise<void>;
|
|
@@ -165,7 +166,7 @@ export interface ChatBotContextType {
|
|
|
165
166
|
interruptVoice: () => void;
|
|
166
167
|
onSave: (newPermissions?: string[]) => Promise<void>;
|
|
167
168
|
onConnectWallet: () => Promise<string | false | undefined>;
|
|
168
|
-
onSignIn: () => Promise<
|
|
169
|
+
onSignIn: () => Promise<boolean>;
|
|
169
170
|
isNeedSignInWithWallet: boolean;
|
|
170
171
|
onVerifyWallet: (method: 'berifyme' | 'custom') => Promise<void>;
|
|
171
172
|
serviceId: string;
|
|
@@ -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;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CACV,OAAO,EAAE,OAAO,EAChB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,KAAK,IAAI,KACP,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC;QAC7B,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,SAAS,CAAC,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE3B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAEzC,WAAW,CAAC,EAAE,iBAAiB,GAAG,eAAe,CAAC;IAElD,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAErC,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC,YAAY,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACvC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,eAAe,CAAC,EAAE;QAChB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,yEAAyE;IACzE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sGAAsG;IACtG,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IAEjC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,oBAAoB,EAAE,iBAAiB,EAAE,CAAC;IAC1C,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,GAAG,CAAC;IAChB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE;QACZ,IAAI,EAAE,OAAO,CAAC;QACd,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;QAC/C,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,YAAY,EAAE,OAAO,CAAC;IACtB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAChD,eAAe,EAAE,OAAO,CAAC;IAEzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,aAAa,EAAE,CAAC;IAG7B,cAAc,EAAE,OAAO,GAAG,UAAU,CAAC;IAErC,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;IAGvB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,qBAAqB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,uBAAuB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAChD,aAAa,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,eAAe,EAAE,CAAC,YAAY,EAAE,GAAG,KAAK,IAAI,CAAC;IAE7C,qBAAqB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,CAAC,WAAW,EAAE,aAAa,EAAE,KAAK,IAAI,CAAC;IACvD,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,sBAAsB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAGnD,aAAa,EAAE,CAAC,qBAAqB,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC,CAAC;IACxF,YAAY,EAAE,CAAC,sBAAsB,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"ChatBotTypes.d.ts","sourceRoot":"","sources":["../../src/types/ChatBotTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatBotUI.d.ts","sourceRoot":"","sources":["../../src/ui/ChatBotUI.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ChatBotUI.d.ts","sourceRoot":"","sources":["../../src/ui/ChatBotUI.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAsG/B,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAktB7B,CAAC"}
|
package/dist/ui/ChatBotUI.js
CHANGED
|
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "@emotion/reac
|
|
|
2
2
|
/** @jsxImportSource @emotion/react */
|
|
3
3
|
import { css } from '@emotion/react';
|
|
4
4
|
import * as React from 'react';
|
|
5
|
+
import { hasRecordedWalletVerification } from '@bytexbyte/nxtlinq-ai-agent-core-development';
|
|
5
6
|
import { useDraggable, useLocalStorage, useResizable, walletTextUtils } from '@bytexbyte/nxtlinq-ai-agent-web-development';
|
|
6
7
|
import { useChatBot } from '../context/ChatBotContext';
|
|
7
8
|
import { ChatBotHeader } from './ChatBotHeader';
|
|
@@ -93,7 +94,8 @@ export const ChatBotUI = () => {
|
|
|
93
94
|
// Check if there's a berifyme token in URL (indicating recent berifyme verification)
|
|
94
95
|
const urlParams = new URLSearchParams(window.location.search);
|
|
95
96
|
const hasBerifymeToken = urlParams.get('token') && urlParams.get('method') === 'berifyme';
|
|
96
|
-
const
|
|
97
|
+
const hasRecordedVerification = Boolean(walletInfo?.id)
|
|
98
|
+
&& hasRecordedWalletVerification(walletInfo);
|
|
97
99
|
// Helper function to update IDV suggestion state based on storage value
|
|
98
100
|
const updateIDVSuggestionState = React.useCallback((dismissedValue) => {
|
|
99
101
|
// Clear any existing countdown interval
|
|
@@ -150,14 +152,14 @@ export const ChatBotUI = () => {
|
|
|
150
152
|
const shouldShowBanner = hitAddress &&
|
|
151
153
|
!props.requireWalletIDVVerification &&
|
|
152
154
|
!hasBerifymeToken &&
|
|
153
|
-
!
|
|
155
|
+
!hasRecordedVerification &&
|
|
154
156
|
!isNeedSignInWithWallet;
|
|
155
157
|
if (shouldShowBanner) {
|
|
156
158
|
const timer = setTimeout(() => {
|
|
157
159
|
const shouldShowBannerAfterDelay = hitAddress &&
|
|
158
160
|
!props.requireWalletIDVVerification &&
|
|
159
161
|
!hasBerifymeToken &&
|
|
160
|
-
!
|
|
162
|
+
!hasRecordedVerification &&
|
|
161
163
|
!isNeedSignInWithWallet;
|
|
162
164
|
if (shouldShowBannerAfterDelay) {
|
|
163
165
|
const dismissed = localStorage.getItem('idv-suggestion-dismissed');
|
|
@@ -530,7 +532,7 @@ export const ChatBotUI = () => {
|
|
|
530
532
|
left: ${MOBILE_EDGE_MARGIN}px !important;
|
|
531
533
|
top: ${MOBILE_EDGE_MARGIN}px !important;
|
|
532
534
|
` : ''}
|
|
533
|
-
`], children: [!mobileLayout && (_jsxs(_Fragment, { children: [_jsx("div", { css: resizeHandleNW, onPointerDown: handleResizeStart('nw'), title: "Resize", "aria-label": "Resize chat window from top-left" }), _jsx("div", { css: resizeHandleNE, onPointerDown: handleResizeStart('ne'), title: "Resize", "aria-label": "Resize chat window from top-right" }), _jsx("div", { css: resizeHandleSW, onPointerDown: handleResizeStart('sw'), title: "Resize", "aria-label": "Resize chat window from bottom-left" }), _jsx("div", { css: resizeHandleSE, onPointerDown: handleResizeStart('se'), title: "Resize", "aria-label": "Resize chat window from bottom-right" })] })), _jsx(ChatBotHeader, { mobileLayout: headerCompactLayout, isDragging: isDragging, onDragStart: handleDragStart, isVoiceMode: isVoiceMode, isVoiceConnecting: isVoiceConnecting, onVoiceToggle: () => void ((isVoiceMode || isVoiceConnecting) ? exitVoiceMode() : enterVoiceMode()), piiDisplayMode: piiDisplayMode, isAITLoading: isAITLoading, onSettingsClick: handleSettingsClick, onClose: handleClose }), showIDVSuggestion && hitAddress && !props.requireWalletIDVVerification && !hasBerifymeToken && !
|
|
535
|
+
`], children: [!mobileLayout && (_jsxs(_Fragment, { children: [_jsx("div", { css: resizeHandleNW, onPointerDown: handleResizeStart('nw'), title: "Resize", "aria-label": "Resize chat window from top-left" }), _jsx("div", { css: resizeHandleNE, onPointerDown: handleResizeStart('ne'), title: "Resize", "aria-label": "Resize chat window from top-right" }), _jsx("div", { css: resizeHandleSW, onPointerDown: handleResizeStart('sw'), title: "Resize", "aria-label": "Resize chat window from bottom-left" }), _jsx("div", { css: resizeHandleSE, onPointerDown: handleResizeStart('se'), title: "Resize", "aria-label": "Resize chat window from bottom-right" })] })), _jsx(ChatBotHeader, { mobileLayout: headerCompactLayout, isDragging: isDragging, onDragStart: handleDragStart, isVoiceMode: isVoiceMode, isVoiceConnecting: isVoiceConnecting, onVoiceToggle: () => void ((isVoiceMode || isVoiceConnecting) ? exitVoiceMode() : enterVoiceMode()), piiDisplayMode: piiDisplayMode, isAITLoading: isAITLoading, onSettingsClick: handleSettingsClick, onClose: handleClose }), showIDVSuggestion && hitAddress && !props.requireWalletIDVVerification && !hasBerifymeToken && !hasRecordedVerification && (_jsxs("div", { "data-idv-banner": true, css: idvBanner, children: [_jsx("div", { css: css `
|
|
534
536
|
font-size: 20px !important;
|
|
535
537
|
color: #f39c12 !important;
|
|
536
538
|
`, children: "\uD83D\uDCA1" }), _jsxs("div", { css: css `flex: 1 !important;`, children: [_jsx("h5", { css: idvBannerTitle, children: walletTextUtils.getWalletText('Recommended: Verify Your Wallet', serviceId) }), _jsx("p", { css: idvBannerText, children: walletTextUtils.getWalletText('While not required, verifying your wallet with Berify.me provides additional security and trust for your AI agent interactions.', serviceId) }), _jsx("button", { onClick: () => onVerifyWallet('berifyme'), css: idvVerifyButton, children: walletTextUtils.getWalletText('Verify Wallet', serviceId) })] }), _jsx("button", { onClick: handleDismissIDV, css: idvDismissButton, title: `Hide for ${Math.floor((props.idvBannerDismissSeconds || 86400) / 3600)} hours`, children: "\u00D7" })] })), !showIDVSuggestion && dismissUntil && timeRemaining && (_jsxs("div", { css: css `
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../src/ui/MessageList.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAuT/B,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../src/ui/MessageList.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAuT/B,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EA4c/B,CAAC"}
|
package/dist/ui/MessageList.js
CHANGED
|
@@ -231,7 +231,7 @@ const PiiStatusHeader = React.memo(({ message }) => {
|
|
|
231
231
|
return (_jsxs("div", { css: piiHeaderRow, children: [_jsx(ShieldIcon, {}), _jsx("span", { children: "\u2713 Protected" })] }));
|
|
232
232
|
});
|
|
233
233
|
export const MessageList = () => {
|
|
234
|
-
const { messages, isLoading, isTtsProcessing, requiresGesture, retryTtsWithGesture, connectWallet, signInWallet, hitAddress, isAutoConnecting, isNeedSignInWithWallet, enableAIT, isAITLoading, isAITEnabling, sendMessage, permissions, availableModels, serviceId, piiDisplayMode, } = useChatBot();
|
|
234
|
+
const { messages, isLoading, isTtsProcessing, requiresGesture, retryTtsWithGesture, connectWallet, signInWallet, retryPendingTextTool, hitAddress, isAutoConnecting, isNeedSignInWithWallet, enableAIT, isAITLoading, isAITEnabling, sendMessage, permissions, availableModels, serviceId, piiDisplayMode, setShowPermissionForm, setIsPermissionFormOpen, } = useChatBot();
|
|
235
235
|
const messagesEndRef = React.useRef(null);
|
|
236
236
|
const scrollToBottom = () => {
|
|
237
237
|
messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
|
|
@@ -247,25 +247,33 @@ export const MessageList = () => {
|
|
|
247
247
|
return;
|
|
248
248
|
}
|
|
249
249
|
if (buttonType === 'connectWallet') {
|
|
250
|
-
connectWallet(
|
|
250
|
+
const connected = await connectWallet(false);
|
|
251
|
+
if (connected) {
|
|
252
|
+
// Continue the interrupted flow immediately. This opens the wallet
|
|
253
|
+
// signature UI instead of leaving the user on a stale connect prompt.
|
|
254
|
+
const signedIn = await signInWallet(true);
|
|
255
|
+
if (signedIn)
|
|
256
|
+
await retryPendingTextTool();
|
|
257
|
+
}
|
|
251
258
|
}
|
|
252
259
|
else if (buttonType === 'signIn') {
|
|
253
|
-
signInWallet(true);
|
|
260
|
+
const signedIn = await signInWallet(true);
|
|
261
|
+
if (signedIn)
|
|
262
|
+
await retryPendingTextTool();
|
|
254
263
|
}
|
|
255
264
|
else if (buttonType === 'enableAIT') {
|
|
256
265
|
const requiredPermission = message.metadata?.requiredPermission;
|
|
257
266
|
if (requiredPermission) {
|
|
258
267
|
const success = await enableAIT(requiredPermission);
|
|
259
268
|
if (success) {
|
|
260
|
-
|
|
261
|
-
const lastUserMsg = [...messages].reverse().find(m => m.role === 'user');
|
|
262
|
-
if (lastUserMsg && lastUserMsg.content) {
|
|
263
|
-
// Re-execute the previous user message (retryCount=1 to skip duplicate PII log)
|
|
264
|
-
await sendMessage(lastUserMsg.content, 1);
|
|
265
|
-
}
|
|
269
|
+
await retryPendingTextTool();
|
|
266
270
|
}
|
|
267
271
|
}
|
|
268
272
|
}
|
|
273
|
+
else if (buttonType === 'verifyWallet') {
|
|
274
|
+
setIsPermissionFormOpen(true);
|
|
275
|
+
setShowPermissionForm(true);
|
|
276
|
+
}
|
|
269
277
|
else if (buttonType === 'continue') {
|
|
270
278
|
const lastUserMsg = [...messages].reverse().find(m => m.role === 'user');
|
|
271
279
|
if (lastUserMsg && lastUserMsg.content) {
|
|
@@ -420,11 +428,12 @@ export const MessageList = () => {
|
|
|
420
428
|
chatbotButton, children: isAutoConnecting ? 'Connecting...' :
|
|
421
429
|
message.button === 'connectWallet' ? (Boolean(hitAddress) ? 'Connected' : walletTextUtils.getWalletText('Connect Wallet', serviceId)) :
|
|
422
430
|
message.button === 'signIn' ? (!isNeedSignInWithWallet ? 'Signed In' : 'Sign In') :
|
|
423
|
-
message.button === '
|
|
424
|
-
message.button === '
|
|
425
|
-
|
|
426
|
-
(
|
|
427
|
-
|
|
431
|
+
message.button === 'verifyWallet' ? 'Verify Wallet' :
|
|
432
|
+
message.button === 'continue' ? 'Continue' :
|
|
433
|
+
message.button === 'enableAIT' ?
|
|
434
|
+
((isAITLoading || isAITEnabling) ? 'Enabling...' :
|
|
435
|
+
(message.metadata?.requiredPermission && permissions.includes(message.metadata.requiredPermission)) ? 'AIT Enabled' : 'Enable AIT Permissions') :
|
|
436
|
+
message.button }) }))] }), showPiiHeader && message.piiStatus === 'complete' && entityCount > 0 && (_jsxs("div", { css: css `text-align: right !important;`, children: [_jsxs("button", { css: piiBelowBubbleBtn, onClick: () => setExpandedPiiMsgId(v => v === message.id ? null : message.id), type: "button", children: [_jsx(GreenCheckIcon, {}), entityCount, " item", entityCount !== 1 ? 's' : '', " protected ", isPiiExpanded ? '▴' : '▸'] }), isPiiExpanded && (_jsx("div", { css: piiEntityPanel, children: Object.entries(relevantMapping).map(([original, token]) => (_jsxs("div", { css: piiEntityRowStyle, children: [_jsx("span", { css: piiOriginalStyle, children: original }), _jsx("span", { css: piiArrowStyle, children: "\u2192" }), _jsx("span", { css: piiTokenMappingStyle, children: token })] }, original))) }))] })), message.role === 'assistant' && message.metadata?.model && (_jsxs("div", { css: css `
|
|
428
437
|
${modelIndicator}
|
|
429
438
|
gap: 8px !important;
|
|
430
439
|
`, children: [_jsxs("div", { css: modelBadge, children: [_jsx("span", { css: modelDot }), getModelDisplayName(message.metadata.model)] }), (isTtsProcessing || requiresGesture) && !isLoading && message.id === messages[messages.length - 1]?.id && (_jsxs("div", { css: css `
|
|
@@ -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;
|
|
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,CAsmBxD,CAAC"}
|
|
@@ -4,6 +4,7 @@ import * as React from 'react';
|
|
|
4
4
|
import { css } from '@emotion/react';
|
|
5
5
|
import { useChatBot } from '../context/ChatBotContext';
|
|
6
6
|
import { walletTextUtils } from '@bytexbyte/nxtlinq-ai-agent-web-development';
|
|
7
|
+
import { hasRecordedWalletVerification } from '@bytexbyte/nxtlinq-ai-agent-core-development';
|
|
7
8
|
import { actionButton } from './styles/isolatedStyles';
|
|
8
9
|
export const PermissionForm = ({ onClose }) => {
|
|
9
10
|
const { hitAddress, permissions, setPermissions, setIsDisabled, onSave, onConnectWallet, onSignIn, isNeedSignInWithWallet, walletInfo, onVerifyWallet, serviceId, nxtlinqApi, permissionGroup, isAITLoading, isWalletLoading = false, refreshAIT, props } = useChatBot();
|
|
@@ -73,12 +74,10 @@ export const PermissionForm = ({ onClose }) => {
|
|
|
73
74
|
}, [hitAddress]);
|
|
74
75
|
// Check if wallet IDV verification is required based on configuration
|
|
75
76
|
const requireWalletIDVVerification = props.requireWalletIDVVerification ?? true; // Default to true
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
// 2. IDV verification is required AND wallet is verified but not with Berifyme
|
|
81
|
-
const shouldShowVerificationPrompt = requireWalletIDVVerification && (!isWalletVerified || !isWalletVerifiedWithBerifyme);
|
|
77
|
+
// Any recorded verification source is valid. Custom additionally requires
|
|
78
|
+
// its explicit username evidence so synthetic AIT-provisioned rows do not count.
|
|
79
|
+
const shouldShowVerificationPrompt = requireWalletIDVVerification
|
|
80
|
+
&& (!walletInfo?.id || !hasRecordedWalletVerification(walletInfo));
|
|
82
81
|
const handleSave = async () => {
|
|
83
82
|
setIsSaving(true);
|
|
84
83
|
try {
|
|
@@ -309,9 +308,7 @@ export const PermissionForm = ({ onClose }) => {
|
|
|
309
308
|
margin-bottom: 24px !important;
|
|
310
309
|
font-size: 16px !important;
|
|
311
310
|
color: #666 !important;
|
|
312
|
-
`, children:
|
|
313
|
-
? walletTextUtils.getWalletText('Your wallet is verified with custom method, but Berify.me verification is required to continue.', serviceId)
|
|
314
|
-
: walletTextUtils.getWalletText('Please verify your wallet with Berify.me to continue', serviceId) }), _jsx("button", { onClick: () => onVerifyWallet('berifyme'), css: css `
|
|
311
|
+
`, children: walletTextUtils.getWalletText('Please verify your wallet identity to continue', serviceId) }), _jsx("button", { onClick: () => onVerifyWallet('berifyme'), css: css `
|
|
315
312
|
${actionButton}
|
|
316
313
|
padding: 12px 24px !important;
|
|
317
314
|
background-color: #007bff !important;
|
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.3",
|
|
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",
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
"react-dom": ">=18.0.0"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@bytexbyte/nxtlinq-ai-agent-core-development": "0.
|
|
42
|
-
"@bytexbyte/nxtlinq-ai-agent-web-development": "0.
|
|
41
|
+
"@bytexbyte/nxtlinq-ai-agent-core-development": "2.0.1",
|
|
42
|
+
"@bytexbyte/nxtlinq-ai-agent-web-development": "1.0.1",
|
|
43
43
|
"@emotion/react": "^11.14.0",
|
|
44
44
|
"@emotion/styled": "^11.14.1",
|
|
45
45
|
"@mui/icons-material": "^7.2.0",
|
|
@@ -55,4 +55,4 @@
|
|
|
55
55
|
"react-dom": "^18.2.0",
|
|
56
56
|
"typescript": "^5.4.2"
|
|
57
57
|
}
|
|
58
|
-
}
|
|
58
|
+
}
|