@bytexbyte/nxtlinq-ai-agent-sdk 1.1.0 → 1.1.1
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/components/ChatBot.d.ts +0 -1
- package/dist/components/ChatBot.d.ts.map +1 -1
- package/dist/components/ChatBot.js +18 -12
- package/dist/hooks/useNxtlinqAIT.d.ts +3 -3
- package/dist/index.d.ts +0 -111
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -300
- package/dist/types/ait-api.d.ts +0 -3
- package/dist/types/ait-api.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatBot.d.ts","sourceRoot":"","sources":["../../src/components/ChatBot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,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,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,WAAW,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ChatBot.d.ts","sourceRoot":"","sources":["../../src/components/ChatBot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,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,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,WAAW,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,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,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC1D,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,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;QAC5C,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;CACJ;AAsUD,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAgzB1C,CAAC"}
|
|
@@ -213,7 +213,6 @@ export const ChatBot = ({ projectId, onMessage, onError, onToolUse, presetMessag
|
|
|
213
213
|
const messagesEndRef = React.useRef(null);
|
|
214
214
|
const [isDisabled, setIsDisabled] = React.useState(true);
|
|
215
215
|
const [signer, setSigner] = React.useState(null);
|
|
216
|
-
const [provider, setProvider] = React.useState(null);
|
|
217
216
|
const [accessToken, setAccessToken] = React.useState(null);
|
|
218
217
|
const [walletInfo, setWalletInfo] = React.useState(null);
|
|
219
218
|
const verifyWalletBtnRef = React.useRef(null);
|
|
@@ -281,6 +280,10 @@ export const ChatBot = ({ projectId, onMessage, onError, onToolUse, presetMessag
|
|
|
281
280
|
}
|
|
282
281
|
const getWalletResponse = await nxtlinqApi.wallet.getWallet({ address: hitAddress }, accessToken);
|
|
283
282
|
if ('error' in getWalletResponse) {
|
|
283
|
+
if (getWalletResponse.error === 'Wallet not found') {
|
|
284
|
+
console.log('Wallet not found - this is expected for new users');
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
284
287
|
console.error(getWalletResponse.error);
|
|
285
288
|
return;
|
|
286
289
|
}
|
|
@@ -446,13 +449,12 @@ export const ChatBot = ({ projectId, onMessage, onError, onToolUse, presetMessag
|
|
|
446
449
|
throw new Error('Web3 provider not available');
|
|
447
450
|
}
|
|
448
451
|
await web3Provider.enable();
|
|
449
|
-
const ethersProvider = new ethers.
|
|
452
|
+
const ethersProvider = new ethers.providers.Web3Provider(web3Provider);
|
|
450
453
|
const userSigner = await ethersProvider.getSigner();
|
|
451
454
|
const userAddress = await userSigner.getAddress();
|
|
452
455
|
localStorage.setItem('walletAddress', userAddress);
|
|
453
456
|
setHitAddress(userAddress);
|
|
454
457
|
setSigner(userSigner);
|
|
455
|
-
setProvider(ethersProvider);
|
|
456
458
|
return userAddress;
|
|
457
459
|
}
|
|
458
460
|
catch (error) {
|
|
@@ -460,7 +462,6 @@ export const ChatBot = ({ projectId, onMessage, onError, onToolUse, presetMessag
|
|
|
460
462
|
localStorage.removeItem('walletAddress');
|
|
461
463
|
setHitAddress(null);
|
|
462
464
|
setSigner(null);
|
|
463
|
-
setProvider(null);
|
|
464
465
|
throw error;
|
|
465
466
|
}
|
|
466
467
|
}, []);
|
|
@@ -529,6 +530,18 @@ export const ChatBot = ({ projectId, onMessage, onError, onToolUse, presetMessag
|
|
|
529
530
|
const novaResponse = response;
|
|
530
531
|
if (novaResponse.toolCall?.toolUse && novaResponse.result !== 'Authentication data retrieved') {
|
|
531
532
|
if (onToolUse) {
|
|
533
|
+
const isToolAllowed = await hasPermission(novaResponse.toolCall.toolUse.name);
|
|
534
|
+
if (!isToolAllowed) {
|
|
535
|
+
if (ait) {
|
|
536
|
+
const message = {
|
|
537
|
+
id: Date.now().toString(),
|
|
538
|
+
content: 'You have not been granted this permission for the AI agent.',
|
|
539
|
+
role: 'assistant',
|
|
540
|
+
timestamp: new Date().toISOString()
|
|
541
|
+
};
|
|
542
|
+
return message;
|
|
543
|
+
}
|
|
544
|
+
}
|
|
532
545
|
const toolUseResult = await onToolUse(novaResponse.toolCall.toolUse);
|
|
533
546
|
if (toolUseResult) {
|
|
534
547
|
onMessage?.(toolUseResult);
|
|
@@ -628,27 +641,21 @@ export const ChatBot = ({ projectId, onMessage, onError, onToolUse, presetMessag
|
|
|
628
641
|
model: 'gpt-4',
|
|
629
642
|
permissions,
|
|
630
643
|
issuedBy: hitAddress,
|
|
631
|
-
controller: hitAddress
|
|
632
644
|
};
|
|
633
645
|
const metadataStr = stringify(metadata);
|
|
634
|
-
const metadataHash = ethers.keccak256(ethers.toUtf8Bytes(metadataStr
|
|
646
|
+
const metadataHash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(metadataStr));
|
|
635
647
|
// 1️⃣ Upload metadata to Pinata, get CID
|
|
636
648
|
const uploadResponse = await nxtlinqApi.metadata.createMetadata(metadata, accessToken || '');
|
|
637
649
|
if ('error' in uploadResponse) {
|
|
638
650
|
throw new Error(`Failed to upload metadata: ${uploadResponse.error}`);
|
|
639
651
|
}
|
|
640
652
|
const { metadataCid } = uploadResponse;
|
|
641
|
-
// 2️⃣ Sign the message
|
|
642
|
-
const messageHash = ethers.solidityPackedKeccak256(['string', 'address', 'string', 'bytes32', 'uint256'], [aitId, hitAddress, serviceId, metadataHash, timestamp]);
|
|
643
|
-
const signature = await signer.signMessage(ethers.getBytes(messageHash));
|
|
644
653
|
await nxtlinqApi.ait.createAIT({
|
|
645
654
|
aitId,
|
|
646
655
|
controller: hitAddress,
|
|
647
656
|
serviceId,
|
|
648
657
|
metadataHash,
|
|
649
658
|
metadataCid,
|
|
650
|
-
timestamp,
|
|
651
|
-
signature
|
|
652
659
|
}, accessToken || '');
|
|
653
660
|
const aitInfo = {
|
|
654
661
|
aitId,
|
|
@@ -656,7 +663,6 @@ export const ChatBot = ({ projectId, onMessage, onError, onToolUse, presetMessag
|
|
|
656
663
|
metadata,
|
|
657
664
|
metadataHash,
|
|
658
665
|
metadataCid,
|
|
659
|
-
signature
|
|
660
666
|
};
|
|
661
667
|
setAit(aitInfo);
|
|
662
668
|
};
|
|
@@ -7,8 +7,8 @@ export declare function useNxtlinqAIT(sdk: NxtlinqAITSDK): {
|
|
|
7
7
|
isLoading: boolean;
|
|
8
8
|
error: string | null;
|
|
9
9
|
connectWallet: () => Promise<void>;
|
|
10
|
-
verifyWallet: (token: string, method: string) => Promise<
|
|
11
|
-
signInWithWallet: () => Promise<
|
|
12
|
-
generateAndRegisterAIT: (permissions: string[]) => Promise<
|
|
10
|
+
verifyWallet: (token: string, method: string) => Promise<any>;
|
|
11
|
+
signInWithWallet: () => Promise<any>;
|
|
12
|
+
generateAndRegisterAIT: (permissions: string[]) => Promise<any>;
|
|
13
13
|
};
|
|
14
14
|
//# sourceMappingURL=useNxtlinqAIT.d.ts.map
|
package/dist/index.d.ts
CHANGED
|
@@ -1,114 +1,3 @@
|
|
|
1
|
-
import { ethers } from 'ethers';
|
|
2
|
-
import { AITInfo, AITMetadata, PermissionGroup, PermissionOption, WalletInfo, CreateAITParams, CreateMetadataParams, VerifyWalletParams, SignInParams } from './types/ait-api';
|
|
3
1
|
export { ChatBot } from './components/ChatBot';
|
|
4
2
|
export type { Message, PresetMessage, ToolUse, ChatBotProps } from './components/ChatBot';
|
|
5
|
-
export type { AITInfo, AITMetadata, PermissionGroup, PermissionOption, WalletInfo, CreateAITParams, CreateMetadataParams, VerifyWalletParams, SignInParams };
|
|
6
|
-
export interface AITPermission {
|
|
7
|
-
hasPermission: boolean;
|
|
8
|
-
reason?: string;
|
|
9
|
-
permissions?: string[];
|
|
10
|
-
}
|
|
11
|
-
export interface AIT {
|
|
12
|
-
aitId: string;
|
|
13
|
-
controller: string;
|
|
14
|
-
metadata: AITMetadata;
|
|
15
|
-
metadataHash: string;
|
|
16
|
-
metadataCid: string;
|
|
17
|
-
signature: string;
|
|
18
|
-
}
|
|
19
|
-
export interface GenerateAITOptions {
|
|
20
|
-
hitAddress: string;
|
|
21
|
-
signer: ethers.Signer;
|
|
22
|
-
permissions: string[];
|
|
23
|
-
serviceId: string;
|
|
24
|
-
}
|
|
25
|
-
export interface MessageResponse {
|
|
26
|
-
reply: string;
|
|
27
|
-
timestamp: string;
|
|
28
|
-
}
|
|
29
|
-
export declare class NxtlinqAITSDK {
|
|
30
|
-
private serviceId;
|
|
31
|
-
private signer;
|
|
32
|
-
private walletAddress;
|
|
33
|
-
private api;
|
|
34
|
-
constructor(serviceId: string, apiKey: string, apiSecret: string);
|
|
35
|
-
connectWallet(): Promise<string>;
|
|
36
|
-
verifyWallet(token: string, method: string): Promise<WalletInfo>;
|
|
37
|
-
signInWithWallet(): Promise<string>;
|
|
38
|
-
generateAndRegisterAIT(permissions: string[]): Promise<AITInfo>;
|
|
39
|
-
getAIT(): Promise<AITInfo | null>;
|
|
40
|
-
getWalletInfo(): Promise<WalletInfo | null>;
|
|
41
|
-
createPermissionForm(permissionGroups: PermissionGroup[]): PermissionGroup[];
|
|
42
|
-
getSelectedPermissions(form: PermissionGroup[]): string[];
|
|
43
|
-
}
|
|
44
|
-
export declare class NxtlinqAIAgent {
|
|
45
|
-
private projectId;
|
|
46
|
-
private apiKey?;
|
|
47
|
-
private ait?;
|
|
48
|
-
private permissions;
|
|
49
|
-
private signer?;
|
|
50
|
-
private api;
|
|
51
|
-
constructor(projectId: string, apiKey: string, apiSecret: string);
|
|
52
|
-
setAIT(ait: AIT, signer?: ethers.Signer): void;
|
|
53
|
-
private hasPermission;
|
|
54
|
-
private checkAITPermission;
|
|
55
|
-
generateAIT(options: GenerateAITOptions): Promise<AIT>;
|
|
56
|
-
getAITInfo(serviceId: string, controller: string, signer?: ethers.Signer): Promise<AIT | null>;
|
|
57
|
-
sendMessage(message: string, toolName?: string): Promise<MessageResponse>;
|
|
58
|
-
}
|
|
59
|
-
export interface AITApi {
|
|
60
|
-
ait: {
|
|
61
|
-
getAITByServiceIdAndController: (params: {
|
|
62
|
-
serviceId: string;
|
|
63
|
-
controller: string;
|
|
64
|
-
}, token: string) => Promise<AITInfo | {
|
|
65
|
-
error: string;
|
|
66
|
-
}>;
|
|
67
|
-
createAIT: (params: CreateAITParams, token: string) => Promise<AITInfo | {
|
|
68
|
-
error: string;
|
|
69
|
-
}>;
|
|
70
|
-
};
|
|
71
|
-
wallet: {
|
|
72
|
-
verifyWallet: (params: VerifyWalletParams, token: string) => Promise<WalletInfo | {
|
|
73
|
-
error: string;
|
|
74
|
-
}>;
|
|
75
|
-
getWallet: (params: {
|
|
76
|
-
address: string;
|
|
77
|
-
}, token: string) => Promise<WalletInfo | {
|
|
78
|
-
error: string;
|
|
79
|
-
}>;
|
|
80
|
-
};
|
|
81
|
-
metadata: {
|
|
82
|
-
createMetadata: (metadata: CreateMetadataParams, token: string) => Promise<{
|
|
83
|
-
metadataCid: string;
|
|
84
|
-
} | {
|
|
85
|
-
error: string;
|
|
86
|
-
}>;
|
|
87
|
-
};
|
|
88
|
-
auth: {
|
|
89
|
-
getNonce: (params: {
|
|
90
|
-
address: string;
|
|
91
|
-
}) => Promise<{
|
|
92
|
-
code: string;
|
|
93
|
-
timestamp: number;
|
|
94
|
-
} | {
|
|
95
|
-
error: string;
|
|
96
|
-
}>;
|
|
97
|
-
signIn: (params: SignInParams) => Promise<{
|
|
98
|
-
accessToken: string;
|
|
99
|
-
} | {
|
|
100
|
-
error: string;
|
|
101
|
-
}>;
|
|
102
|
-
};
|
|
103
|
-
agent: {
|
|
104
|
-
sendMessage: (params: {
|
|
105
|
-
message: string;
|
|
106
|
-
projectId: string;
|
|
107
|
-
}) => Promise<{
|
|
108
|
-
reply: string;
|
|
109
|
-
} | {
|
|
110
|
-
error: string;
|
|
111
|
-
}>;
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
3
|
//# 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,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,301 +1 @@
|
|
|
1
|
-
import { ethers } from 'ethers';
|
|
2
|
-
import stringify from 'json-stable-stringify';
|
|
3
|
-
import { createNxtlinqApi } from './api/nxtlinq-api';
|
|
4
1
|
export { ChatBot } from './components/ChatBot';
|
|
5
|
-
export class NxtlinqAITSDK {
|
|
6
|
-
constructor(serviceId, apiKey, apiSecret) {
|
|
7
|
-
this.signer = null;
|
|
8
|
-
this.walletAddress = null;
|
|
9
|
-
this.serviceId = serviceId;
|
|
10
|
-
this.api = createNxtlinqApi(apiKey, apiSecret);
|
|
11
|
-
}
|
|
12
|
-
async connectWallet() {
|
|
13
|
-
if (typeof window === 'undefined' || !window.ethereum) {
|
|
14
|
-
throw new Error('MetaMask is not installed');
|
|
15
|
-
}
|
|
16
|
-
const provider = new ethers.BrowserProvider(window.ethereum);
|
|
17
|
-
this.signer = await provider.getSigner();
|
|
18
|
-
this.walletAddress = await this.signer.getAddress();
|
|
19
|
-
return this.walletAddress;
|
|
20
|
-
}
|
|
21
|
-
async verifyWallet(token, method) {
|
|
22
|
-
if (!this.walletAddress) {
|
|
23
|
-
throw new Error('Please connect wallet first');
|
|
24
|
-
}
|
|
25
|
-
const response = await this.api.wallet.verifyWallet({
|
|
26
|
-
address: this.walletAddress,
|
|
27
|
-
token,
|
|
28
|
-
method,
|
|
29
|
-
timestamp: Date.now()
|
|
30
|
-
}, token);
|
|
31
|
-
if ('error' in response) {
|
|
32
|
-
throw new Error(response.error);
|
|
33
|
-
}
|
|
34
|
-
return response;
|
|
35
|
-
}
|
|
36
|
-
async signInWithWallet() {
|
|
37
|
-
if (!this.walletAddress || !this.signer) {
|
|
38
|
-
throw new Error('Please connect wallet first');
|
|
39
|
-
}
|
|
40
|
-
const nonceResponse = await this.api.auth.getNonce({ address: this.walletAddress });
|
|
41
|
-
if ('error' in nonceResponse) {
|
|
42
|
-
throw new Error(nonceResponse.error);
|
|
43
|
-
}
|
|
44
|
-
const payload = {
|
|
45
|
-
address: this.walletAddress,
|
|
46
|
-
code: nonceResponse.code,
|
|
47
|
-
timestamp: nonceResponse.timestamp
|
|
48
|
-
};
|
|
49
|
-
const stringToSign = stringify(payload);
|
|
50
|
-
const signature = await this.signer.signMessage(stringToSign || '');
|
|
51
|
-
const response = await this.api.auth.signIn({
|
|
52
|
-
...payload,
|
|
53
|
-
signature
|
|
54
|
-
});
|
|
55
|
-
if ('error' in response) {
|
|
56
|
-
throw new Error(response.error);
|
|
57
|
-
}
|
|
58
|
-
return response.accessToken;
|
|
59
|
-
}
|
|
60
|
-
async generateAndRegisterAIT(permissions) {
|
|
61
|
-
if (!this.signer || !this.walletAddress) {
|
|
62
|
-
throw new Error('Please connect wallet first');
|
|
63
|
-
}
|
|
64
|
-
const token = localStorage.getItem('nxtlinqAITServiceAccessToken');
|
|
65
|
-
if (!token) {
|
|
66
|
-
throw new Error('Access token not found');
|
|
67
|
-
}
|
|
68
|
-
const timestamp = Math.floor(Date.now() / 1000);
|
|
69
|
-
const aitId = `did:polygon:ike-dashboard:${this.walletAddress}:${timestamp}`;
|
|
70
|
-
const metadata = {
|
|
71
|
-
model: 'gpt-4',
|
|
72
|
-
permissions,
|
|
73
|
-
issuedBy: this.walletAddress
|
|
74
|
-
};
|
|
75
|
-
const metadataStr = stringify(metadata);
|
|
76
|
-
const metadataHash = ethers.keccak256(ethers.toUtf8Bytes(metadataStr || ''));
|
|
77
|
-
// Upload metadata
|
|
78
|
-
const uploadResponse = await this.api.metadata.createMetadata({
|
|
79
|
-
...metadata,
|
|
80
|
-
controller: this.walletAddress
|
|
81
|
-
}, token);
|
|
82
|
-
if ('error' in uploadResponse) {
|
|
83
|
-
throw new Error(`Failed to upload metadata: ${uploadResponse.error}`);
|
|
84
|
-
}
|
|
85
|
-
const { metadataCid } = uploadResponse;
|
|
86
|
-
// Sign the message
|
|
87
|
-
const messageHash = ethers.solidityPackedKeccak256(['string', 'address', 'string', 'bytes32', 'uint256'], [aitId, this.walletAddress, this.serviceId, metadataHash, timestamp]);
|
|
88
|
-
const signature = await this.signer.signMessage(ethers.getBytes(messageHash));
|
|
89
|
-
// Register AIT
|
|
90
|
-
const response = await this.api.ait.createAIT({
|
|
91
|
-
aitId,
|
|
92
|
-
controller: this.walletAddress,
|
|
93
|
-
serviceId: this.serviceId,
|
|
94
|
-
metadataHash,
|
|
95
|
-
metadataCid,
|
|
96
|
-
timestamp,
|
|
97
|
-
signature
|
|
98
|
-
}, token);
|
|
99
|
-
if ('error' in response) {
|
|
100
|
-
throw new Error(response.error);
|
|
101
|
-
}
|
|
102
|
-
return response;
|
|
103
|
-
}
|
|
104
|
-
async getAIT() {
|
|
105
|
-
if (!this.walletAddress) {
|
|
106
|
-
return null;
|
|
107
|
-
}
|
|
108
|
-
const token = localStorage.getItem('nxtlinqAITServiceAccessToken');
|
|
109
|
-
if (!token) {
|
|
110
|
-
throw new Error('Access token not found');
|
|
111
|
-
}
|
|
112
|
-
const response = await this.api.ait.getAITByServiceIdAndController({
|
|
113
|
-
serviceId: this.serviceId,
|
|
114
|
-
controller: this.walletAddress
|
|
115
|
-
}, token);
|
|
116
|
-
if ('error' in response) {
|
|
117
|
-
return null;
|
|
118
|
-
}
|
|
119
|
-
return response;
|
|
120
|
-
}
|
|
121
|
-
async getWalletInfo() {
|
|
122
|
-
if (!this.walletAddress) {
|
|
123
|
-
return null;
|
|
124
|
-
}
|
|
125
|
-
const token = localStorage.getItem('nxtlinqAITServiceAccessToken');
|
|
126
|
-
if (!token) {
|
|
127
|
-
throw new Error('Access token not found');
|
|
128
|
-
}
|
|
129
|
-
const response = await this.api.wallet.getWallet({ address: this.walletAddress }, token);
|
|
130
|
-
if ('error' in response) {
|
|
131
|
-
return null;
|
|
132
|
-
}
|
|
133
|
-
return response;
|
|
134
|
-
}
|
|
135
|
-
createPermissionForm(permissionGroups) {
|
|
136
|
-
return permissionGroups.map(group => ({
|
|
137
|
-
label: group.label,
|
|
138
|
-
options: group.options.map((option) => ({
|
|
139
|
-
...option,
|
|
140
|
-
isChecked: false,
|
|
141
|
-
}))
|
|
142
|
-
}));
|
|
143
|
-
}
|
|
144
|
-
getSelectedPermissions(form) {
|
|
145
|
-
return form.flatMap(group => group.options.filter((opt) => opt.isChecked).map((opt) => opt.value));
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
export class NxtlinqAIAgent {
|
|
149
|
-
constructor(projectId, apiKey, apiSecret) {
|
|
150
|
-
this.permissions = [];
|
|
151
|
-
this.projectId = projectId;
|
|
152
|
-
this.apiKey = apiKey;
|
|
153
|
-
this.api = createNxtlinqApi(apiKey, apiSecret);
|
|
154
|
-
}
|
|
155
|
-
setAIT(ait, signer) {
|
|
156
|
-
this.ait = ait;
|
|
157
|
-
this.permissions = ait.metadata.permissions;
|
|
158
|
-
if (signer) {
|
|
159
|
-
this.signer = signer;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
async hasPermission(toolName) {
|
|
163
|
-
if (!this.ait) {
|
|
164
|
-
throw new Error('Please connect wallet first to access permissions');
|
|
165
|
-
}
|
|
166
|
-
return this.permissions.includes(toolName);
|
|
167
|
-
}
|
|
168
|
-
async checkAITPermission(toolName) {
|
|
169
|
-
try {
|
|
170
|
-
if (!this.ait) {
|
|
171
|
-
return {
|
|
172
|
-
hasPermission: false,
|
|
173
|
-
reason: 'Please connect wallet first to access permissions'
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
if (!toolName) {
|
|
177
|
-
return {
|
|
178
|
-
hasPermission: true,
|
|
179
|
-
permissions: this.permissions
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
const hasPermission = await this.hasPermission(toolName);
|
|
183
|
-
return {
|
|
184
|
-
hasPermission,
|
|
185
|
-
reason: hasPermission ? undefined : 'No permission to use this tool',
|
|
186
|
-
permissions: this.permissions
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
|
-
catch (error) {
|
|
190
|
-
return {
|
|
191
|
-
hasPermission: false,
|
|
192
|
-
reason: error instanceof Error ? error.message : 'Unknown error',
|
|
193
|
-
permissions: this.permissions
|
|
194
|
-
};
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
async generateAIT(options) {
|
|
198
|
-
const { hitAddress, signer, permissions, serviceId } = options;
|
|
199
|
-
const token = localStorage.getItem('nxtlinqAITServiceAccessToken');
|
|
200
|
-
if (!token) {
|
|
201
|
-
throw new Error('Access token not found');
|
|
202
|
-
}
|
|
203
|
-
const timestamp = Math.floor(Date.now() / 1000);
|
|
204
|
-
const aitId = `did:polygon:ike-dashboard:${hitAddress}:${timestamp}`;
|
|
205
|
-
const metadata = {
|
|
206
|
-
model: 'gpt-4',
|
|
207
|
-
permissions,
|
|
208
|
-
issuedBy: hitAddress
|
|
209
|
-
};
|
|
210
|
-
const metadataStr = stringify(metadata);
|
|
211
|
-
const metadataHash = ethers.keccak256(ethers.toUtf8Bytes(metadataStr || ''));
|
|
212
|
-
// Upload metadata
|
|
213
|
-
const uploadResponse = await this.api.metadata.createMetadata({
|
|
214
|
-
...metadata,
|
|
215
|
-
controller: hitAddress
|
|
216
|
-
}, token);
|
|
217
|
-
if ('error' in uploadResponse) {
|
|
218
|
-
throw new Error(`Failed to upload metadata: ${uploadResponse.error}`);
|
|
219
|
-
}
|
|
220
|
-
const { metadataCid } = uploadResponse;
|
|
221
|
-
// Sign the message
|
|
222
|
-
const messageHash = ethers.solidityPackedKeccak256(['string', 'address', 'string', 'bytes32', 'uint256'], [aitId, hitAddress, serviceId, metadataHash, timestamp]);
|
|
223
|
-
const signature = await signer.signMessage(ethers.getBytes(messageHash));
|
|
224
|
-
// Register AIT
|
|
225
|
-
const response = await this.api.ait.createAIT({
|
|
226
|
-
aitId,
|
|
227
|
-
controller: hitAddress,
|
|
228
|
-
serviceId,
|
|
229
|
-
metadataHash,
|
|
230
|
-
metadataCid,
|
|
231
|
-
timestamp,
|
|
232
|
-
signature
|
|
233
|
-
}, token);
|
|
234
|
-
if ('error' in response) {
|
|
235
|
-
throw new Error(response.error);
|
|
236
|
-
}
|
|
237
|
-
return {
|
|
238
|
-
aitId: response.aitId,
|
|
239
|
-
controller: response.controller,
|
|
240
|
-
metadata: response.metadata,
|
|
241
|
-
metadataHash: response.metadataHash,
|
|
242
|
-
metadataCid: response.metadataCid,
|
|
243
|
-
signature: response.signature
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
async getAITInfo(serviceId, controller, signer) {
|
|
247
|
-
const token = localStorage.getItem('nxtlinqAITServiceAccessToken');
|
|
248
|
-
if (!token) {
|
|
249
|
-
throw new Error('Access token not found');
|
|
250
|
-
}
|
|
251
|
-
const response = await this.api.ait.getAITByServiceIdAndController({
|
|
252
|
-
serviceId,
|
|
253
|
-
controller
|
|
254
|
-
}, token);
|
|
255
|
-
if ('error' in response) {
|
|
256
|
-
return null;
|
|
257
|
-
}
|
|
258
|
-
if (signer) {
|
|
259
|
-
this.signer = signer;
|
|
260
|
-
}
|
|
261
|
-
return {
|
|
262
|
-
aitId: response.aitId,
|
|
263
|
-
controller: response.controller,
|
|
264
|
-
metadata: response.metadata,
|
|
265
|
-
metadataHash: response.metadataHash,
|
|
266
|
-
metadataCid: response.metadataCid,
|
|
267
|
-
signature: response.signature
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
async sendMessage(message, toolName) {
|
|
271
|
-
const permission = await this.checkAITPermission(toolName);
|
|
272
|
-
if (!permission.hasPermission) {
|
|
273
|
-
throw new Error(permission.reason || 'No permission to use this tool');
|
|
274
|
-
}
|
|
275
|
-
if (!this.ait || !this.signer) {
|
|
276
|
-
throw new Error('Please connect wallet first to access permissions');
|
|
277
|
-
}
|
|
278
|
-
const timestamp = Math.floor(Date.now() / 1000);
|
|
279
|
-
const stringToSign = stringify({
|
|
280
|
-
message,
|
|
281
|
-
aitId: this.ait.aitId,
|
|
282
|
-
controller: this.ait.controller,
|
|
283
|
-
metadata: this.ait.metadata,
|
|
284
|
-
metadataHash: this.ait.metadataHash,
|
|
285
|
-
serviceId: this.projectId,
|
|
286
|
-
timestamp
|
|
287
|
-
}) || '';
|
|
288
|
-
const signature = await this.signer.signMessage(stringToSign);
|
|
289
|
-
const response = await this.api.agent.sendMessage({
|
|
290
|
-
message,
|
|
291
|
-
projectId: this.projectId,
|
|
292
|
-
});
|
|
293
|
-
if ('error' in response) {
|
|
294
|
-
throw new Error(response.error);
|
|
295
|
-
}
|
|
296
|
-
return {
|
|
297
|
-
reply: response.reply,
|
|
298
|
-
timestamp: new Date().toISOString()
|
|
299
|
-
};
|
|
300
|
-
}
|
|
301
|
-
}
|
package/dist/types/ait-api.d.ts
CHANGED
|
@@ -41,11 +41,8 @@ export interface CreateAITParams {
|
|
|
41
41
|
serviceId: string;
|
|
42
42
|
metadataHash: string;
|
|
43
43
|
metadataCid: string;
|
|
44
|
-
timestamp: number;
|
|
45
|
-
signature: string;
|
|
46
44
|
}
|
|
47
45
|
export interface CreateMetadataParams extends AITMetadata {
|
|
48
|
-
controller: string;
|
|
49
46
|
}
|
|
50
47
|
export interface VerifyWalletParams {
|
|
51
48
|
address: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ait-api.d.ts","sourceRoot":"","sources":["../../src/types/ait-api.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,WAAW,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,WAAW,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ait-api.d.ts","sourceRoot":"","sources":["../../src/types/ait-api.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bytexbyte/nxtlinq-ai-agent-sdk",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Nxtlinq AI Agent SDK - Proprietary Software",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"typescript": "^5.4.2"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"ethers": "
|
|
34
|
+
"ethers": "5.7.0",
|
|
35
35
|
"json-stable-stringify": "^1.0.2",
|
|
36
36
|
"metakeep": "^2.2.8"
|
|
37
37
|
}
|