@ghostspeak/sdk 2.0.5 → 2.0.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/README.md +152 -30
- package/dist/GhostSpeakClient-CWmGaM9Q.d.ts +1007 -0
- package/dist/StakingModule-C5rzuOWb.d.ts +2526 -0
- package/dist/{agent-M74TCRON.js → agent-5YLZ7DAC.js} +4 -4
- package/dist/{agent-M74TCRON.js.map → agent-5YLZ7DAC.js.map} +1 -1
- package/dist/batch-operations-45CQFEID.js +4 -0
- package/dist/batch-operations-45CQFEID.js.map +1 -0
- package/dist/browser.d.ts +45 -554
- package/dist/browser.js +15 -842
- package/dist/browser.js.map +1 -1
- package/dist/chunk-AL3HQN73.js +754 -0
- package/dist/chunk-AL3HQN73.js.map +1 -0
- package/dist/chunk-BF3IQ35I.js +284 -0
- package/dist/chunk-BF3IQ35I.js.map +1 -0
- package/dist/chunk-BQDGRTVP.js +168 -0
- package/dist/chunk-BQDGRTVP.js.map +1 -0
- package/dist/chunk-C5CDA3WX.js +7314 -0
- package/dist/chunk-C5CDA3WX.js.map +1 -0
- package/dist/chunk-E3FD2CNY.js +1869 -0
- package/dist/chunk-E3FD2CNY.js.map +1 -0
- package/dist/{chunk-V3SOFUAZ.js → chunk-G7S6B6WB.js} +327 -493
- package/dist/chunk-G7S6B6WB.js.map +1 -0
- package/dist/chunk-IHVDQ4YI.js +4231 -0
- package/dist/chunk-IHVDQ4YI.js.map +1 -0
- package/dist/chunk-JV2SWONF.js +98 -0
- package/dist/chunk-JV2SWONF.js.map +1 -0
- package/dist/chunk-KB6CKIUK.js +231 -0
- package/dist/chunk-KB6CKIUK.js.map +1 -0
- package/dist/chunk-RIZZPLLB.js +343 -0
- package/dist/chunk-RIZZPLLB.js.map +1 -0
- package/dist/chunk-S74EH3KD.js +7890 -0
- package/dist/chunk-S74EH3KD.js.map +1 -0
- package/dist/chunk-SFTSZ3LC.js +156 -0
- package/dist/chunk-SFTSZ3LC.js.map +1 -0
- package/dist/chunk-SKMJJ3Q6.js +125 -0
- package/dist/chunk-SKMJJ3Q6.js.map +1 -0
- package/dist/chunk-SZGFSCNU.js +3682 -0
- package/dist/chunk-SZGFSCNU.js.map +1 -0
- package/dist/chunk-TTB4OS2D.js +69 -0
- package/dist/chunk-TTB4OS2D.js.map +1 -0
- package/dist/chunk-UP2VWCW5.js +33 -0
- package/dist/{chunk-NSBPE2FW.js.map → chunk-UP2VWCW5.js.map} +1 -1
- package/dist/{chunk-UJUGGLMT.js → chunk-VQZQCHUT.js} +5 -5
- package/dist/{chunk-UJUGGLMT.js.map → chunk-VQZQCHUT.js.map} +1 -1
- package/dist/client.d.ts +6 -4
- package/dist/client.js +12 -10
- package/dist/createAgentAuthorization-ULG47ZJI.js +5 -0
- package/dist/createAgentAuthorization-ULG47ZJI.js.map +1 -0
- package/dist/credentials.d.ts +155 -0
- package/dist/credentials.js +4 -0
- package/dist/credentials.js.map +1 -0
- package/dist/crypto.js +2 -2
- package/dist/errors.js +1 -1
- package/dist/feature-flags-B1g0DCPe.d.ts +1181 -0
- package/dist/generated-EG5USUFG.js +9 -0
- package/dist/{generated-VNLHMR6Y.js.map → generated-EG5USUFG.js.map} +1 -1
- package/dist/{ghostspeak_wasm-SB2RPJ3D.js → ghostspeak_wasm-F227HOSM.js} +3 -3
- package/dist/{ghostspeak_wasm-SB2RPJ3D.js.map → ghostspeak_wasm-F227HOSM.js.map} +1 -1
- package/dist/index.d.ts +1210 -1506
- package/dist/index.js +601 -3532
- package/dist/index.js.map +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/minimal/core-minimal.d.ts +2383 -1264
- package/dist/minimal/core-minimal.js +9 -9
- package/dist/minimal/core-minimal.js.map +1 -1
- package/dist/nacl-fast-W5BJ3KZ2.js +2229 -0
- package/dist/nacl-fast-W5BJ3KZ2.js.map +1 -0
- package/dist/pda-4KP7CURF.js +4 -0
- package/dist/pda-4KP7CURF.js.map +1 -0
- package/dist/pda-Ce7VYg4T.d.ts +25 -0
- package/dist/reputation-types-Yebf0Rm_.d.ts +1071 -0
- package/dist/revokeAuthorization-OK7E7OK3.js +5 -0
- package/dist/revokeAuthorization-OK7E7OK3.js.map +1 -0
- package/dist/signature-verification-DGxR4aYQ.d.ts +448 -0
- package/dist/types.js +1 -1
- package/dist/updateReputationWithAuth-Y4ONEVSP.js +5 -0
- package/dist/updateReputationWithAuth-Y4ONEVSP.js.map +1 -0
- package/dist/utils.d.ts +69 -203
- package/dist/utils.js +15 -153
- package/dist/utils.js.map +1 -1
- package/package.json +28 -31
- package/dist/.tsbuildinfo +0 -1
- package/dist/GhostSpeakClient-hsGuGg__.d.ts +0 -860
- package/dist/GovernanceModule-DQYYys-H.d.ts +0 -1766
- package/dist/chunk-ASQXX4IT.js +0 -572
- package/dist/chunk-ASQXX4IT.js.map +0 -1
- package/dist/chunk-COGZFWOT.js +0 -19657
- package/dist/chunk-COGZFWOT.js.map +0 -1
- package/dist/chunk-FKRN4PW5.js +0 -1667
- package/dist/chunk-FKRN4PW5.js.map +0 -1
- package/dist/chunk-GMHIUK2R.js +0 -7526
- package/dist/chunk-GMHIUK2R.js.map +0 -1
- package/dist/chunk-IAWBZYPE.js +0 -356
- package/dist/chunk-IAWBZYPE.js.map +0 -1
- package/dist/chunk-NSBPE2FW.js +0 -15
- package/dist/chunk-OWYHJG6H.js +0 -13311
- package/dist/chunk-OWYHJG6H.js.map +0 -1
- package/dist/chunk-RDDPOFR5.js +0 -3
- package/dist/chunk-RDDPOFR5.js.map +0 -1
- package/dist/chunk-RERCHKZP.js +0 -35
- package/dist/chunk-RERCHKZP.js.map +0 -1
- package/dist/chunk-TVVGXYCI.js +0 -2887
- package/dist/chunk-TVVGXYCI.js.map +0 -1
- package/dist/chunk-V3SOFUAZ.js.map +0 -1
- package/dist/chunk-ZGP5552B.js +0 -377
- package/dist/chunk-ZGP5552B.js.map +0 -1
- package/dist/chunk-ZWOYNHVK.js +0 -196
- package/dist/chunk-ZWOYNHVK.js.map +0 -1
- package/dist/dist/.tsbuildinfo +0 -1
- package/dist/elgamal-VZLWB3XK.js +0 -5
- package/dist/elgamal-VZLWB3XK.js.map +0 -1
- package/dist/feature-flags-V722ZuXO.d.ts +0 -3512
- package/dist/generated-VNLHMR6Y.js +0 -5
- package/dist/ipfs-types-BOt9ZNg4.d.ts +0 -592
- package/dist/multisigConfig-BzEhy6jy.d.ts +0 -58
- package/dist/pda-B_nS8SbD.d.ts +0 -114
- package/dist/pda-S4BFJVGE.js +0 -4
- package/dist/pda-S4BFJVGE.js.map +0 -1
- package/dist/system-addresses-BFNLEbFx.d.ts +0 -857
- package/dist/token-2022-rpc-RALH4RK7.js +0 -593
- package/dist/token-2022-rpc-RALH4RK7.js.map +0 -1
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
// src/modules/credentials/CrossmintVCClient.ts
|
|
2
|
+
var CROSSMINT_STAGING_URL = "https://staging.crossmint.com";
|
|
3
|
+
var CROSSMINT_PROD_URL = "https://www.crossmint.com";
|
|
4
|
+
var GHOSTSPEAK_CREDENTIAL_TYPES = {
|
|
5
|
+
AGENT_IDENTITY: "GhostSpeakAgentIdentity",
|
|
6
|
+
REPUTATION_SCORE: "GhostSpeakReputation",
|
|
7
|
+
JOB_COMPLETION: "GhostSpeakJobCompletion"
|
|
8
|
+
};
|
|
9
|
+
var CrossmintVCClient = class {
|
|
10
|
+
apiKey;
|
|
11
|
+
baseUrl;
|
|
12
|
+
chain;
|
|
13
|
+
constructor(options) {
|
|
14
|
+
this.apiKey = options.apiKey;
|
|
15
|
+
this.baseUrl = options.environment === "production" ? CROSSMINT_PROD_URL : CROSSMINT_STAGING_URL;
|
|
16
|
+
this.chain = options.chain || "base-sepolia";
|
|
17
|
+
}
|
|
18
|
+
// ===================================
|
|
19
|
+
// Types & Templates
|
|
20
|
+
// ===================================
|
|
21
|
+
/**
|
|
22
|
+
* Create the GhostSpeak Agent Identity credential type
|
|
23
|
+
*/
|
|
24
|
+
async createAgentIdentityType() {
|
|
25
|
+
const typeName = GHOSTSPEAK_CREDENTIAL_TYPES.AGENT_IDENTITY;
|
|
26
|
+
const schema = {
|
|
27
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
28
|
+
title: "GhostSpeak Agent Identity",
|
|
29
|
+
description: "Verified AI agent identity on the GhostSpeak Protocol",
|
|
30
|
+
type: "object",
|
|
31
|
+
properties: {
|
|
32
|
+
credentialSubject: {
|
|
33
|
+
type: "object",
|
|
34
|
+
properties: {
|
|
35
|
+
agentId: { type: "string" },
|
|
36
|
+
owner: { type: "string" },
|
|
37
|
+
capabilities: { type: "array", items: { type: "string" } },
|
|
38
|
+
registeredAt: { type: "string" },
|
|
39
|
+
reputationScore: { type: "number" },
|
|
40
|
+
totalJobsCompleted: { type: "integer" },
|
|
41
|
+
verified: { type: "boolean" },
|
|
42
|
+
id: { type: "string" }
|
|
43
|
+
// Auto-added by Crossmint
|
|
44
|
+
},
|
|
45
|
+
required: ["agentId", "owner", "capabilities", "registeredAt", "verified"],
|
|
46
|
+
additionalProperties: false
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
return this.createCredentialType(typeName, schema);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Create the GhostSpeak Reputation credential type
|
|
54
|
+
*/
|
|
55
|
+
async createReputationType() {
|
|
56
|
+
const typeName = GHOSTSPEAK_CREDENTIAL_TYPES.REPUTATION_SCORE;
|
|
57
|
+
const schema = {
|
|
58
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
59
|
+
title: "GhostSpeak Reputation",
|
|
60
|
+
description: "Verified reputation score for GhostSpeak users",
|
|
61
|
+
type: "object",
|
|
62
|
+
properties: {
|
|
63
|
+
credentialSubject: {
|
|
64
|
+
type: "object",
|
|
65
|
+
properties: {
|
|
66
|
+
userId: { type: "string" },
|
|
67
|
+
walletAddress: { type: "string" },
|
|
68
|
+
reputationScore: { type: "number" },
|
|
69
|
+
totalTransactions: { type: "integer" },
|
|
70
|
+
disputeRate: { type: "number" },
|
|
71
|
+
memberSince: { type: "string" },
|
|
72
|
+
id: { type: "string" }
|
|
73
|
+
},
|
|
74
|
+
required: ["userId", "walletAddress", "reputationScore", "memberSince"],
|
|
75
|
+
additionalProperties: false
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
return this.createCredentialType(typeName, schema);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Create the GhostSpeak Job Completion credential type
|
|
83
|
+
*/
|
|
84
|
+
async createJobCompletionType() {
|
|
85
|
+
const typeName = GHOSTSPEAK_CREDENTIAL_TYPES.JOB_COMPLETION;
|
|
86
|
+
const schema = {
|
|
87
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
88
|
+
title: "GhostSpeak Job Completion",
|
|
89
|
+
description: "Certificate of successful job completion on GhostSpeak",
|
|
90
|
+
type: "object",
|
|
91
|
+
properties: {
|
|
92
|
+
credentialSubject: {
|
|
93
|
+
type: "object",
|
|
94
|
+
properties: {
|
|
95
|
+
jobId: { type: "string" },
|
|
96
|
+
agentId: { type: "string" },
|
|
97
|
+
clientAddress: { type: "string" },
|
|
98
|
+
completedAt: { type: "string" },
|
|
99
|
+
amountPaid: { type: "string" },
|
|
100
|
+
rating: { type: "integer" },
|
|
101
|
+
review: { type: "string" },
|
|
102
|
+
id: { type: "string" }
|
|
103
|
+
},
|
|
104
|
+
required: ["jobId", "agentId", "clientAddress", "completedAt", "amountPaid", "rating"],
|
|
105
|
+
additionalProperties: false
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
return this.createCredentialType(typeName, schema);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Initialize all GhostSpeak credential types
|
|
113
|
+
*/
|
|
114
|
+
async initializeAllTypes() {
|
|
115
|
+
const [agentIdentity, reputation, jobCompletion] = await Promise.all([
|
|
116
|
+
this.createAgentIdentityType(),
|
|
117
|
+
this.createReputationType(),
|
|
118
|
+
this.createJobCompletionType()
|
|
119
|
+
]);
|
|
120
|
+
return { agentIdentity, reputation, jobCompletion };
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Create all GhostSpeak credential templates
|
|
124
|
+
*/
|
|
125
|
+
async createAllTemplates(types) {
|
|
126
|
+
const [agentIdentityTemplate, reputationTemplate, jobCompletionTemplate] = await Promise.all([
|
|
127
|
+
this.createTemplate(types.agentIdentity.id, {
|
|
128
|
+
name: "GhostSpeak Agent Identity",
|
|
129
|
+
description: "Verified AI agent identity on the GhostSpeak Protocol",
|
|
130
|
+
imageUrl: "https://www.ghostspeak.io/assets/credential-agent.png"
|
|
131
|
+
}),
|
|
132
|
+
this.createTemplate(types.reputation.id, {
|
|
133
|
+
name: "GhostSpeak Reputation",
|
|
134
|
+
description: "Verified reputation score for GhostSpeak users",
|
|
135
|
+
imageUrl: "https://www.ghostspeak.io/assets/credential-reputation.png"
|
|
136
|
+
}),
|
|
137
|
+
this.createTemplate(types.jobCompletion.id, {
|
|
138
|
+
name: "GhostSpeak Job Completion Certificate",
|
|
139
|
+
description: "Certificate of successful job completion on GhostSpeak",
|
|
140
|
+
imageUrl: "https://www.ghostspeak.io/assets/credential-job.png"
|
|
141
|
+
})
|
|
142
|
+
]);
|
|
143
|
+
return { agentIdentityTemplate, reputationTemplate, jobCompletionTemplate };
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Issue an agent identity credential
|
|
147
|
+
*/
|
|
148
|
+
async issueAgentCredential(templateId, recipientEmail, subject, expiresAt) {
|
|
149
|
+
return this.issueCredential(templateId, recipientEmail, subject, expiresAt);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Issue a reputation credential
|
|
153
|
+
*/
|
|
154
|
+
async issueReputationCredential(templateId, recipientEmail, subject, expiresAt) {
|
|
155
|
+
return this.issueCredential(templateId, recipientEmail, subject, expiresAt);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Issue a job completion credential
|
|
159
|
+
*/
|
|
160
|
+
async issueJobCompletionCredential(templateId, recipientEmail, subject, expiresAt) {
|
|
161
|
+
return this.issueCredential(templateId, recipientEmail, subject, expiresAt);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Create a credential type (JSON Schema)
|
|
165
|
+
*/
|
|
166
|
+
async createCredentialType(typeName, schema) {
|
|
167
|
+
const response = await fetch(
|
|
168
|
+
`${this.baseUrl}/api/v1-alpha1/credentials/types/${typeName}`,
|
|
169
|
+
{
|
|
170
|
+
method: "PUT",
|
|
171
|
+
headers: {
|
|
172
|
+
"Content-Type": "application/json",
|
|
173
|
+
"X-API-KEY": this.apiKey
|
|
174
|
+
},
|
|
175
|
+
body: JSON.stringify(schema)
|
|
176
|
+
}
|
|
177
|
+
);
|
|
178
|
+
if (!response.ok) {
|
|
179
|
+
const error = await response.json().catch(() => ({ message: response.statusText }));
|
|
180
|
+
throw new Error(`Failed to create credential type: ${JSON.stringify(error)}`);
|
|
181
|
+
}
|
|
182
|
+
return response.json();
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Create a credential template
|
|
186
|
+
*/
|
|
187
|
+
async createTemplate(typeId, metadata) {
|
|
188
|
+
const response = await fetch(
|
|
189
|
+
`${this.baseUrl}/api/v1-alpha1/credentials/templates/`,
|
|
190
|
+
{
|
|
191
|
+
method: "POST",
|
|
192
|
+
headers: {
|
|
193
|
+
"Content-Type": "application/json",
|
|
194
|
+
"X-API-KEY": this.apiKey
|
|
195
|
+
},
|
|
196
|
+
body: JSON.stringify({
|
|
197
|
+
credentials: {
|
|
198
|
+
type: typeId,
|
|
199
|
+
encryption: "none",
|
|
200
|
+
storage: "crossmint"
|
|
201
|
+
},
|
|
202
|
+
metadata,
|
|
203
|
+
chain: this.chain
|
|
204
|
+
})
|
|
205
|
+
}
|
|
206
|
+
);
|
|
207
|
+
if (!response.ok) {
|
|
208
|
+
const text = await response.text();
|
|
209
|
+
try {
|
|
210
|
+
const error = JSON.parse(text);
|
|
211
|
+
throw new Error(`Failed to create template: ${JSON.stringify(error)}`);
|
|
212
|
+
} catch (e) {
|
|
213
|
+
throw new Error(`Failed to create template (${response.status}): ${text}`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
const action = await response.json();
|
|
217
|
+
const result = await this.waitForAction(action.id);
|
|
218
|
+
if (result.data && result.data.collection) {
|
|
219
|
+
return result.data.collection;
|
|
220
|
+
}
|
|
221
|
+
return result.data || result;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Poll an action until completion
|
|
225
|
+
*/
|
|
226
|
+
async waitForAction(actionId) {
|
|
227
|
+
let retries = 0;
|
|
228
|
+
while (retries < 60) {
|
|
229
|
+
await new Promise((resolve) => setTimeout(resolve, 2e3));
|
|
230
|
+
const response = await fetch(
|
|
231
|
+
`${this.baseUrl}/api/2022-06-09/actions/${actionId}`,
|
|
232
|
+
{
|
|
233
|
+
headers: {
|
|
234
|
+
"X-API-KEY": this.apiKey
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
);
|
|
238
|
+
if (!response.ok) {
|
|
239
|
+
throw new Error(`Failed to poll action: ${response.statusText}`);
|
|
240
|
+
}
|
|
241
|
+
const action = await response.json();
|
|
242
|
+
if (action.status === "succeeded") {
|
|
243
|
+
return action;
|
|
244
|
+
}
|
|
245
|
+
if (action.status === "failed") {
|
|
246
|
+
throw new Error(`Action failed: ${JSON.stringify(action)}`);
|
|
247
|
+
}
|
|
248
|
+
retries++;
|
|
249
|
+
}
|
|
250
|
+
throw new Error("Action polling timed out");
|
|
251
|
+
}
|
|
252
|
+
// ===================================
|
|
253
|
+
// Issuance
|
|
254
|
+
// ===================================
|
|
255
|
+
/**
|
|
256
|
+
* Issue a credential using a template
|
|
257
|
+
*/
|
|
258
|
+
async issueCredential(templateId, recipientEmail, subject, expiresAt) {
|
|
259
|
+
const response = await fetch(
|
|
260
|
+
`${this.baseUrl}/api/v1-alpha1/credentials/templates/${templateId}/vcs`,
|
|
261
|
+
{
|
|
262
|
+
method: "POST",
|
|
263
|
+
headers: {
|
|
264
|
+
"Content-Type": "application/json",
|
|
265
|
+
"X-API-KEY": this.apiKey
|
|
266
|
+
},
|
|
267
|
+
body: JSON.stringify({
|
|
268
|
+
recipient: `email:${recipientEmail}:${this.chain}`,
|
|
269
|
+
credential: {
|
|
270
|
+
subject,
|
|
271
|
+
expiresAt: expiresAt || this.getDefaultExpiry()
|
|
272
|
+
}
|
|
273
|
+
})
|
|
274
|
+
}
|
|
275
|
+
);
|
|
276
|
+
if (!response.ok) {
|
|
277
|
+
const error = await response.json().catch(() => ({ message: response.statusText }));
|
|
278
|
+
throw new Error(`Failed to issue credential: ${JSON.stringify(error)}`);
|
|
279
|
+
}
|
|
280
|
+
return response.json();
|
|
281
|
+
}
|
|
282
|
+
// ===================================
|
|
283
|
+
// Verification & Retrieval
|
|
284
|
+
// ===================================
|
|
285
|
+
async getCredential(credentialId) {
|
|
286
|
+
const response = await fetch(
|
|
287
|
+
`${this.baseUrl}/api/v1-alpha1/credentials/${credentialId}`,
|
|
288
|
+
{
|
|
289
|
+
headers: {
|
|
290
|
+
"X-API-KEY": this.apiKey
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
);
|
|
294
|
+
if (!response.ok) {
|
|
295
|
+
const error = await response.json().catch(() => ({ message: response.statusText }));
|
|
296
|
+
throw new Error(`Failed to get credential: ${JSON.stringify(error)}`);
|
|
297
|
+
}
|
|
298
|
+
return response.json();
|
|
299
|
+
}
|
|
300
|
+
async verifyCredential(credential) {
|
|
301
|
+
const response = await fetch(
|
|
302
|
+
`${this.baseUrl}/api/v1-alpha1/credentials/verification/verify`,
|
|
303
|
+
{
|
|
304
|
+
method: "POST",
|
|
305
|
+
headers: {
|
|
306
|
+
"Content-Type": "application/json",
|
|
307
|
+
"X-API-KEY": this.apiKey
|
|
308
|
+
},
|
|
309
|
+
body: JSON.stringify({ credential })
|
|
310
|
+
}
|
|
311
|
+
);
|
|
312
|
+
if (!response.ok) {
|
|
313
|
+
const error = await response.json().catch(() => ({ message: response.statusText }));
|
|
314
|
+
throw new Error(`Failed to verify credential: ${JSON.stringify(error)}`);
|
|
315
|
+
}
|
|
316
|
+
return response.json();
|
|
317
|
+
}
|
|
318
|
+
async revokeCredential(credentialId) {
|
|
319
|
+
const response = await fetch(
|
|
320
|
+
`${this.baseUrl}/api/v1-alpha1/credentials/${credentialId}`,
|
|
321
|
+
{
|
|
322
|
+
method: "DELETE",
|
|
323
|
+
headers: {
|
|
324
|
+
"X-API-KEY": this.apiKey
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
);
|
|
328
|
+
if (!response.ok) {
|
|
329
|
+
const error = await response.json().catch(() => ({ message: response.statusText }));
|
|
330
|
+
throw new Error(`Failed to revoke credential: ${JSON.stringify(error)}`);
|
|
331
|
+
}
|
|
332
|
+
return response.json();
|
|
333
|
+
}
|
|
334
|
+
getDefaultExpiry() {
|
|
335
|
+
const date = /* @__PURE__ */ new Date();
|
|
336
|
+
date.setFullYear(date.getFullYear() + 1);
|
|
337
|
+
return date.toISOString().split("T")[0];
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
|
|
341
|
+
export { CrossmintVCClient, GHOSTSPEAK_CREDENTIAL_TYPES };
|
|
342
|
+
//# sourceMappingURL=chunk-RIZZPLLB.js.map
|
|
343
|
+
//# sourceMappingURL=chunk-RIZZPLLB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/credentials/CrossmintVCClient.ts"],"names":[],"mappings":"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","file":"chunk-RIZZPLLB.js","sourcesContent":["/**\n * Crossmint Verifiable Credentials API Client\n * \n * Integrates with Crossmint's VC system to issue and verify credentials.\n * Ported from packages/web for SDK consumption.\n */\n\n// Constants\nconst CROSSMINT_STAGING_URL = 'https://staging.crossmint.com'\nconst CROSSMINT_PROD_URL = 'https://www.crossmint.com'\n\n// GhostSpeak credential type names (registered with Crossmint)\nexport const GHOSTSPEAK_CREDENTIAL_TYPES = {\n AGENT_IDENTITY: 'GhostSpeakAgentIdentity',\n REPUTATION_SCORE: 'GhostSpeakReputation',\n JOB_COMPLETION: 'GhostSpeakJobCompletion',\n} as const\n\ninterface ActionResponse {\n id: string\n status: string\n data?: {\n collection?: CredentialTemplate\n }\n}\n\ninterface ErrorResponse {\n message?: string\n error?: unknown\n}\n\n// Type definitions\nexport interface CredentialType {\n id: string // e.g., \"crossmint:xxx:MyType\"\n typeSchema: {\n $schema: string\n $id: string\n title: string\n description: string\n type: string\n properties: Record<string, unknown>\n }\n}\n\nexport interface CredentialTemplate {\n id: string\n metadata: {\n name: string\n description: string\n imageUrl: string\n }\n fungibility: string\n onChain: {\n chain: string\n type: string\n }\n actionId: string\n}\n\nexport interface IssuedCredential {\n id: string\n credentialId: string\n onChain: {\n status: 'pending' | 'completed'\n chain: string\n contractAddress: string\n tokenId?: string\n }\n actionId: string\n}\n\nexport interface VerificationResult {\n isValid: boolean\n errors?: string[]\n}\n\nexport interface CrossmintClientOptions {\n apiKey: string\n environment?: 'staging' | 'production'\n chain?: 'base-sepolia' | 'polygon-amoy' | 'ethereum-sepolia' | 'base' | 'polygon' | 'ethereum'\n}\n\n/**\n * Crossmint Verifiable Credentials Client\n * \n * Handles the complete credential lifecycle:\n * 1. Create credential types (JSON schemas)\n * 2. Create credential templates (on-chain configuration)\n * 3. Issue credentials to recipients\n * 4. Retrieve credentials\n * 5. Verify credentials\n * 6. Revoke credentials\n * \n * NOTE: Crossmint VCs are only supported on EVM chains.\n */\nexport class CrossmintVCClient {\n private apiKey: string\n private baseUrl: string\n private chain: string\n\n constructor(options: CrossmintClientOptions) {\n this.apiKey = options.apiKey\n this.baseUrl = options.environment === 'production' \n ? CROSSMINT_PROD_URL \n : CROSSMINT_STAGING_URL\n this.chain = options.chain || 'base-sepolia'\n }\n\n // ===================================\n // Types & Templates\n // ===================================\n\n /**\n * Create the GhostSpeak Agent Identity credential type\n */\n async createAgentIdentityType(): Promise<CredentialType> {\n const typeName = GHOSTSPEAK_CREDENTIAL_TYPES.AGENT_IDENTITY\n const schema = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n title: 'GhostSpeak Agent Identity',\n description: 'Verified AI agent identity on the GhostSpeak Protocol',\n type: 'object',\n properties: {\n credentialSubject: {\n type: 'object',\n properties: {\n agentId: { type: 'string' },\n owner: { type: 'string' },\n capabilities: { type: 'array', items: { type: 'string' } },\n registeredAt: { type: 'string' },\n reputationScore: { type: 'number' },\n totalJobsCompleted: { type: 'integer' },\n verified: { type: 'boolean' },\n id: { type: 'string' }, // Auto-added by Crossmint\n },\n required: ['agentId', 'owner', 'capabilities', 'registeredAt', 'verified'],\n additionalProperties: false,\n },\n },\n }\n return this.createCredentialType(typeName, schema)\n }\n\n /**\n * Create the GhostSpeak Reputation credential type\n */\n async createReputationType(): Promise<CredentialType> {\n const typeName = GHOSTSPEAK_CREDENTIAL_TYPES.REPUTATION_SCORE\n const schema = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n title: 'GhostSpeak Reputation',\n description: 'Verified reputation score for GhostSpeak users',\n type: 'object',\n properties: {\n credentialSubject: {\n type: 'object',\n properties: {\n userId: { type: 'string' },\n walletAddress: { type: 'string' },\n reputationScore: { type: 'number' },\n totalTransactions: { type: 'integer' },\n disputeRate: { type: 'number' },\n memberSince: { type: 'string' },\n id: { type: 'string' },\n },\n required: ['userId', 'walletAddress', 'reputationScore', 'memberSince'],\n additionalProperties: false,\n },\n },\n }\n return this.createCredentialType(typeName, schema)\n }\n\n /**\n * Create the GhostSpeak Job Completion credential type\n */\n async createJobCompletionType(): Promise<CredentialType> {\n const typeName = GHOSTSPEAK_CREDENTIAL_TYPES.JOB_COMPLETION\n const schema = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n title: 'GhostSpeak Job Completion',\n description: 'Certificate of successful job completion on GhostSpeak',\n type: 'object',\n properties: {\n credentialSubject: {\n type: 'object',\n properties: {\n jobId: { type: 'string' },\n agentId: { type: 'string' },\n clientAddress: { type: 'string' },\n completedAt: { type: 'string' },\n amountPaid: { type: 'string' },\n rating: { type: 'integer' },\n review: { type: 'string' },\n id: { type: 'string' },\n },\n required: ['jobId', 'agentId', 'clientAddress', 'completedAt', 'amountPaid', 'rating'],\n additionalProperties: false,\n },\n },\n }\n return this.createCredentialType(typeName, schema)\n }\n\n /**\n * Initialize all GhostSpeak credential types\n */\n async initializeAllTypes(): Promise<{\n agentIdentity: CredentialType\n reputation: CredentialType\n jobCompletion: CredentialType\n }> {\n const [agentIdentity, reputation, jobCompletion] = await Promise.all([\n this.createAgentIdentityType(),\n this.createReputationType(),\n this.createJobCompletionType(),\n ])\n\n return { agentIdentity, reputation, jobCompletion }\n }\n\n /**\n * Create all GhostSpeak credential templates\n */\n async createAllTemplates(types: {\n agentIdentity: CredentialType\n reputation: CredentialType\n jobCompletion: CredentialType\n }): Promise<{\n agentIdentityTemplate: CredentialTemplate\n reputationTemplate: CredentialTemplate\n jobCompletionTemplate: CredentialTemplate\n }> {\n const [agentIdentityTemplate, reputationTemplate, jobCompletionTemplate] = await Promise.all([\n this.createTemplate(types.agentIdentity.id, {\n name: 'GhostSpeak Agent Identity',\n description: 'Verified AI agent identity on the GhostSpeak Protocol',\n imageUrl: 'https://www.ghostspeak.io/assets/credential-agent.png',\n }),\n this.createTemplate(types.reputation.id, {\n name: 'GhostSpeak Reputation',\n description: 'Verified reputation score for GhostSpeak users',\n imageUrl: 'https://www.ghostspeak.io/assets/credential-reputation.png',\n }),\n this.createTemplate(types.jobCompletion.id, {\n name: 'GhostSpeak Job Completion Certificate',\n description: 'Certificate of successful job completion on GhostSpeak',\n imageUrl: 'https://www.ghostspeak.io/assets/credential-job.png',\n }),\n ])\n\n return { agentIdentityTemplate, reputationTemplate, jobCompletionTemplate }\n }\n\n /**\n * Issue an agent identity credential\n */\n async issueAgentCredential(\n templateId: string,\n recipientEmail: string,\n subject: Record<string, unknown>,\n expiresAt?: string\n ): Promise<IssuedCredential> {\n return this.issueCredential(templateId, recipientEmail, subject, expiresAt)\n }\n\n /**\n * Issue a reputation credential\n */\n async issueReputationCredential(\n templateId: string,\n recipientEmail: string,\n subject: Record<string, unknown>,\n expiresAt?: string\n ): Promise<IssuedCredential> {\n return this.issueCredential(templateId, recipientEmail, subject, expiresAt)\n }\n\n /**\n * Issue a job completion credential\n */\n async issueJobCompletionCredential(\n templateId: string,\n recipientEmail: string,\n subject: Record<string, unknown>,\n expiresAt?: string\n ): Promise<IssuedCredential> {\n return this.issueCredential(templateId, recipientEmail, subject, expiresAt)\n }\n\n\n\n /**\n * Create a credential type (JSON Schema)\n */\n async createCredentialType(typeName: string, schema: Record<string, unknown>): Promise<CredentialType> {\n const response = await fetch(\n `${this.baseUrl}/api/v1-alpha1/credentials/types/${typeName}`,\n {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-KEY': this.apiKey,\n },\n body: JSON.stringify(schema),\n }\n )\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: response.statusText })) as ErrorResponse\n throw new Error(`Failed to create credential type: ${JSON.stringify(error)}`)\n }\n\n return response.json() as Promise<CredentialType>\n }\n\n /**\n * Create a credential template\n */\n async createTemplate(\n typeId: string,\n metadata: {\n name: string\n description: string\n imageUrl: string\n }\n ): Promise<CredentialTemplate> {\n // Note: Ensuring trailing slash\n const response = await fetch(\n `${this.baseUrl}/api/v1-alpha1/credentials/templates/`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-KEY': this.apiKey,\n },\n body: JSON.stringify({\n credentials: {\n type: typeId,\n encryption: 'none',\n storage: 'crossmint',\n },\n metadata,\n chain: this.chain,\n }),\n }\n )\n\n if (!response.ok) {\n const text = await response.text();\n try {\n const error = JSON.parse(text);\n throw new Error(`Failed to create template: ${JSON.stringify(error)}`);\n } catch (e) {\n throw new Error(`Failed to create template (${response.status}): ${text}`);\n }\n }\n\n const action = await response.json() as ActionResponse\n // console.log(`Template Creation Action Started: ${action.id}`)\n \n // Poll for completion\n const result = await this.waitForAction(action.id)\n \n // Return the created template\n if (result.data && result.data.collection) {\n return result.data.collection;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (result.data || result) as any\n }\n\n /**\n * Poll an action until completion\n */\n async waitForAction(actionId: string): Promise<ActionResponse> {\n let retries = 0;\n while (retries < 60) { // 2 minutes timeout\n await new Promise(resolve => setTimeout(resolve, 2000));\n \n const response = await fetch(\n `${this.baseUrl}/api/2022-06-09/actions/${actionId}`,\n {\n headers: {\n 'X-API-KEY': this.apiKey,\n },\n }\n )\n\n if (!response.ok) {\n throw new Error(`Failed to poll action: ${response.statusText}`)\n }\n\n const action = await response.json() as ActionResponse\n \n if (action.status === 'succeeded') {\n return action\n }\n \n if (action.status === 'failed') {\n throw new Error(`Action failed: ${JSON.stringify(action)}`)\n }\n \n retries++\n }\n \n throw new Error('Action polling timed out')\n }\n\n // ===================================\n // Issuance\n // ===================================\n\n /**\n * Issue a credential using a template\n */\n async issueCredential(\n templateId: string,\n recipientEmail: string,\n subject: Record<string, unknown>,\n expiresAt?: string\n ): Promise<IssuedCredential> {\n const response = await fetch(\n `${this.baseUrl}/api/v1-alpha1/credentials/templates/${templateId}/vcs`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-KEY': this.apiKey,\n },\n body: JSON.stringify({\n recipient: `email:${recipientEmail}:${this.chain}`,\n credential: {\n subject,\n expiresAt: expiresAt || this.getDefaultExpiry(),\n },\n }),\n }\n )\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: response.statusText })) as ErrorResponse\n throw new Error(`Failed to issue credential: ${JSON.stringify(error)}`)\n }\n\n return response.json() as Promise<IssuedCredential>\n }\n\n // ===================================\n // Verification & Retrieval\n // ===================================\n\n async getCredential(credentialId: string): Promise<unknown> {\n const response = await fetch(\n `${this.baseUrl}/api/v1-alpha1/credentials/${credentialId}`,\n {\n headers: {\n 'X-API-KEY': this.apiKey,\n },\n }\n )\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: response.statusText })) as ErrorResponse\n throw new Error(`Failed to get credential: ${JSON.stringify(error)}`)\n }\n\n return response.json() as Promise<unknown>\n }\n\n async verifyCredential(credential: unknown): Promise<VerificationResult> {\n const response = await fetch(\n `${this.baseUrl}/api/v1-alpha1/credentials/verification/verify`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-KEY': this.apiKey,\n },\n body: JSON.stringify({ credential }),\n }\n )\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: response.statusText })) as ErrorResponse\n throw new Error(`Failed to verify credential: ${JSON.stringify(error)}`)\n }\n\n return response.json() as Promise<VerificationResult>\n }\n\n async revokeCredential(credentialId: string): Promise<{ actionId: string; status: string }> {\n const response = await fetch(\n `${this.baseUrl}/api/v1-alpha1/credentials/${credentialId}`,\n {\n method: 'DELETE',\n headers: {\n 'X-API-KEY': this.apiKey,\n },\n }\n )\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: response.statusText })) as ErrorResponse\n throw new Error(`Failed to revoke credential: ${JSON.stringify(error)}`)\n }\n\n return response.json() as Promise<{ actionId: string; status: string }>\n }\n\n private getDefaultExpiry(): string {\n const date = new Date()\n date.setFullYear(date.getFullYear() + 1)\n return date.toISOString().split('T')[0]\n }\n}\n"]}
|