@hai.ai/jacs 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +237 -0
- package/http.d.ts +13 -0
- package/http.js +154 -0
- package/index.d.ts +178 -0
- package/index.js +343 -0
- package/jacs.darwin-arm64.node +0 -0
- package/jacs.darwin-x64.node +0 -0
- package/jacs.linux-arm-gnueabihf.node +0 -0
- package/jacs.linux-arm-musleabihf.node +0 -0
- package/jacs.linux-arm64-gnu.node +0 -0
- package/jacs.linux-x64-gnu.node +0 -0
- package/jacs.linux-x64-musl.node +0 -0
- package/mcp.d.ts +61 -0
- package/mcp.js +514 -0
- package/mcp.js.map +1 -0
- package/mcp.ts +521 -0
- package/package.json +103 -0
- package/simple.d.ts +573 -0
- package/simple.js +920 -0
- package/src/a2a.d.ts +79 -0
- package/src/a2a.js +617 -0
package/index.js
ADDED
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
/* tslint:disable */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
/* prettier-ignore */
|
|
4
|
+
|
|
5
|
+
/* auto-generated by NAPI-RS */
|
|
6
|
+
|
|
7
|
+
const { existsSync, readFileSync } = require('fs')
|
|
8
|
+
const { join } = require('path')
|
|
9
|
+
|
|
10
|
+
const { platform, arch } = process
|
|
11
|
+
|
|
12
|
+
let nativeBinding = null
|
|
13
|
+
let localFileExisted = false
|
|
14
|
+
let loadError = null
|
|
15
|
+
|
|
16
|
+
function isMusl() {
|
|
17
|
+
// For Node 10
|
|
18
|
+
if (!process.report || typeof process.report.getReport !== 'function') {
|
|
19
|
+
try {
|
|
20
|
+
const lddPath = require('child_process').execSync('which ldd').toString().trim()
|
|
21
|
+
return readFileSync(lddPath, 'utf8').includes('musl')
|
|
22
|
+
} catch (e) {
|
|
23
|
+
return true
|
|
24
|
+
}
|
|
25
|
+
} else {
|
|
26
|
+
const { glibcVersionRuntime } = process.report.getReport().header
|
|
27
|
+
return !glibcVersionRuntime
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
switch (platform) {
|
|
32
|
+
case 'android':
|
|
33
|
+
switch (arch) {
|
|
34
|
+
case 'arm64':
|
|
35
|
+
localFileExisted = existsSync(join(__dirname, 'jacs.android-arm64.node'))
|
|
36
|
+
try {
|
|
37
|
+
if (localFileExisted) {
|
|
38
|
+
nativeBinding = require('./jacs.android-arm64.node')
|
|
39
|
+
} else {
|
|
40
|
+
nativeBinding = require('@hai.ai/jacs-android-arm64')
|
|
41
|
+
}
|
|
42
|
+
} catch (e) {
|
|
43
|
+
loadError = e
|
|
44
|
+
}
|
|
45
|
+
break
|
|
46
|
+
case 'arm':
|
|
47
|
+
localFileExisted = existsSync(join(__dirname, 'jacs.android-arm-eabi.node'))
|
|
48
|
+
try {
|
|
49
|
+
if (localFileExisted) {
|
|
50
|
+
nativeBinding = require('./jacs.android-arm-eabi.node')
|
|
51
|
+
} else {
|
|
52
|
+
nativeBinding = require('@hai.ai/jacs-android-arm-eabi')
|
|
53
|
+
}
|
|
54
|
+
} catch (e) {
|
|
55
|
+
loadError = e
|
|
56
|
+
}
|
|
57
|
+
break
|
|
58
|
+
default:
|
|
59
|
+
throw new Error(`Unsupported architecture on Android ${arch}`)
|
|
60
|
+
}
|
|
61
|
+
break
|
|
62
|
+
case 'win32':
|
|
63
|
+
switch (arch) {
|
|
64
|
+
case 'x64':
|
|
65
|
+
localFileExisted = existsSync(
|
|
66
|
+
join(__dirname, 'jacs.win32-x64-msvc.node')
|
|
67
|
+
)
|
|
68
|
+
try {
|
|
69
|
+
if (localFileExisted) {
|
|
70
|
+
nativeBinding = require('./jacs.win32-x64-msvc.node')
|
|
71
|
+
} else {
|
|
72
|
+
nativeBinding = require('@hai.ai/jacs-win32-x64-msvc')
|
|
73
|
+
}
|
|
74
|
+
} catch (e) {
|
|
75
|
+
loadError = e
|
|
76
|
+
}
|
|
77
|
+
break
|
|
78
|
+
case 'ia32':
|
|
79
|
+
localFileExisted = existsSync(
|
|
80
|
+
join(__dirname, 'jacs.win32-ia32-msvc.node')
|
|
81
|
+
)
|
|
82
|
+
try {
|
|
83
|
+
if (localFileExisted) {
|
|
84
|
+
nativeBinding = require('./jacs.win32-ia32-msvc.node')
|
|
85
|
+
} else {
|
|
86
|
+
nativeBinding = require('@hai.ai/jacs-win32-ia32-msvc')
|
|
87
|
+
}
|
|
88
|
+
} catch (e) {
|
|
89
|
+
loadError = e
|
|
90
|
+
}
|
|
91
|
+
break
|
|
92
|
+
case 'arm64':
|
|
93
|
+
localFileExisted = existsSync(
|
|
94
|
+
join(__dirname, 'jacs.win32-arm64-msvc.node')
|
|
95
|
+
)
|
|
96
|
+
try {
|
|
97
|
+
if (localFileExisted) {
|
|
98
|
+
nativeBinding = require('./jacs.win32-arm64-msvc.node')
|
|
99
|
+
} else {
|
|
100
|
+
nativeBinding = require('@hai.ai/jacs-win32-arm64-msvc')
|
|
101
|
+
}
|
|
102
|
+
} catch (e) {
|
|
103
|
+
loadError = e
|
|
104
|
+
}
|
|
105
|
+
break
|
|
106
|
+
default:
|
|
107
|
+
throw new Error(`Unsupported architecture on Windows: ${arch}`)
|
|
108
|
+
}
|
|
109
|
+
break
|
|
110
|
+
case 'darwin':
|
|
111
|
+
localFileExisted = existsSync(join(__dirname, 'jacs.darwin-universal.node'))
|
|
112
|
+
try {
|
|
113
|
+
if (localFileExisted) {
|
|
114
|
+
nativeBinding = require('./jacs.darwin-universal.node')
|
|
115
|
+
} else {
|
|
116
|
+
nativeBinding = require('@hai.ai/jacs-darwin-universal')
|
|
117
|
+
}
|
|
118
|
+
break
|
|
119
|
+
} catch {}
|
|
120
|
+
switch (arch) {
|
|
121
|
+
case 'x64':
|
|
122
|
+
localFileExisted = existsSync(join(__dirname, 'jacs.darwin-x64.node'))
|
|
123
|
+
try {
|
|
124
|
+
if (localFileExisted) {
|
|
125
|
+
nativeBinding = require('./jacs.darwin-x64.node')
|
|
126
|
+
} else {
|
|
127
|
+
nativeBinding = require('@hai.ai/jacs-darwin-x64')
|
|
128
|
+
}
|
|
129
|
+
} catch (e) {
|
|
130
|
+
loadError = e
|
|
131
|
+
}
|
|
132
|
+
break
|
|
133
|
+
case 'arm64':
|
|
134
|
+
localFileExisted = existsSync(
|
|
135
|
+
join(__dirname, 'jacs.darwin-arm64.node')
|
|
136
|
+
)
|
|
137
|
+
try {
|
|
138
|
+
if (localFileExisted) {
|
|
139
|
+
nativeBinding = require('./jacs.darwin-arm64.node')
|
|
140
|
+
} else {
|
|
141
|
+
nativeBinding = require('@hai.ai/jacs-darwin-arm64')
|
|
142
|
+
}
|
|
143
|
+
} catch (e) {
|
|
144
|
+
loadError = e
|
|
145
|
+
}
|
|
146
|
+
break
|
|
147
|
+
default:
|
|
148
|
+
throw new Error(`Unsupported architecture on macOS: ${arch}`)
|
|
149
|
+
}
|
|
150
|
+
break
|
|
151
|
+
case 'freebsd':
|
|
152
|
+
if (arch !== 'x64') {
|
|
153
|
+
throw new Error(`Unsupported architecture on FreeBSD: ${arch}`)
|
|
154
|
+
}
|
|
155
|
+
localFileExisted = existsSync(join(__dirname, 'jacs.freebsd-x64.node'))
|
|
156
|
+
try {
|
|
157
|
+
if (localFileExisted) {
|
|
158
|
+
nativeBinding = require('./jacs.freebsd-x64.node')
|
|
159
|
+
} else {
|
|
160
|
+
nativeBinding = require('@hai.ai/jacs-freebsd-x64')
|
|
161
|
+
}
|
|
162
|
+
} catch (e) {
|
|
163
|
+
loadError = e
|
|
164
|
+
}
|
|
165
|
+
break
|
|
166
|
+
case 'linux':
|
|
167
|
+
switch (arch) {
|
|
168
|
+
case 'x64':
|
|
169
|
+
if (isMusl()) {
|
|
170
|
+
localFileExisted = existsSync(
|
|
171
|
+
join(__dirname, 'jacs.linux-x64-musl.node')
|
|
172
|
+
)
|
|
173
|
+
try {
|
|
174
|
+
if (localFileExisted) {
|
|
175
|
+
nativeBinding = require('./jacs.linux-x64-musl.node')
|
|
176
|
+
} else {
|
|
177
|
+
nativeBinding = require('@hai.ai/jacs-linux-x64-musl')
|
|
178
|
+
}
|
|
179
|
+
} catch (e) {
|
|
180
|
+
loadError = e
|
|
181
|
+
}
|
|
182
|
+
} else {
|
|
183
|
+
localFileExisted = existsSync(
|
|
184
|
+
join(__dirname, 'jacs.linux-x64-gnu.node')
|
|
185
|
+
)
|
|
186
|
+
try {
|
|
187
|
+
if (localFileExisted) {
|
|
188
|
+
nativeBinding = require('./jacs.linux-x64-gnu.node')
|
|
189
|
+
} else {
|
|
190
|
+
nativeBinding = require('@hai.ai/jacs-linux-x64-gnu')
|
|
191
|
+
}
|
|
192
|
+
} catch (e) {
|
|
193
|
+
loadError = e
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
break
|
|
197
|
+
case 'arm64':
|
|
198
|
+
if (isMusl()) {
|
|
199
|
+
localFileExisted = existsSync(
|
|
200
|
+
join(__dirname, 'jacs.linux-arm64-musl.node')
|
|
201
|
+
)
|
|
202
|
+
try {
|
|
203
|
+
if (localFileExisted) {
|
|
204
|
+
nativeBinding = require('./jacs.linux-arm64-musl.node')
|
|
205
|
+
} else {
|
|
206
|
+
nativeBinding = require('@hai.ai/jacs-linux-arm64-musl')
|
|
207
|
+
}
|
|
208
|
+
} catch (e) {
|
|
209
|
+
loadError = e
|
|
210
|
+
}
|
|
211
|
+
} else {
|
|
212
|
+
localFileExisted = existsSync(
|
|
213
|
+
join(__dirname, 'jacs.linux-arm64-gnu.node')
|
|
214
|
+
)
|
|
215
|
+
try {
|
|
216
|
+
if (localFileExisted) {
|
|
217
|
+
nativeBinding = require('./jacs.linux-arm64-gnu.node')
|
|
218
|
+
} else {
|
|
219
|
+
nativeBinding = require('@hai.ai/jacs-linux-arm64-gnu')
|
|
220
|
+
}
|
|
221
|
+
} catch (e) {
|
|
222
|
+
loadError = e
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
break
|
|
226
|
+
case 'arm':
|
|
227
|
+
if (isMusl()) {
|
|
228
|
+
localFileExisted = existsSync(
|
|
229
|
+
join(__dirname, 'jacs.linux-arm-musleabihf.node')
|
|
230
|
+
)
|
|
231
|
+
try {
|
|
232
|
+
if (localFileExisted) {
|
|
233
|
+
nativeBinding = require('./jacs.linux-arm-musleabihf.node')
|
|
234
|
+
} else {
|
|
235
|
+
nativeBinding = require('@hai.ai/jacs-linux-arm-musleabihf')
|
|
236
|
+
}
|
|
237
|
+
} catch (e) {
|
|
238
|
+
loadError = e
|
|
239
|
+
}
|
|
240
|
+
} else {
|
|
241
|
+
localFileExisted = existsSync(
|
|
242
|
+
join(__dirname, 'jacs.linux-arm-gnueabihf.node')
|
|
243
|
+
)
|
|
244
|
+
try {
|
|
245
|
+
if (localFileExisted) {
|
|
246
|
+
nativeBinding = require('./jacs.linux-arm-gnueabihf.node')
|
|
247
|
+
} else {
|
|
248
|
+
nativeBinding = require('@hai.ai/jacs-linux-arm-gnueabihf')
|
|
249
|
+
}
|
|
250
|
+
} catch (e) {
|
|
251
|
+
loadError = e
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
break
|
|
255
|
+
case 'riscv64':
|
|
256
|
+
if (isMusl()) {
|
|
257
|
+
localFileExisted = existsSync(
|
|
258
|
+
join(__dirname, 'jacs.linux-riscv64-musl.node')
|
|
259
|
+
)
|
|
260
|
+
try {
|
|
261
|
+
if (localFileExisted) {
|
|
262
|
+
nativeBinding = require('./jacs.linux-riscv64-musl.node')
|
|
263
|
+
} else {
|
|
264
|
+
nativeBinding = require('@hai.ai/jacs-linux-riscv64-musl')
|
|
265
|
+
}
|
|
266
|
+
} catch (e) {
|
|
267
|
+
loadError = e
|
|
268
|
+
}
|
|
269
|
+
} else {
|
|
270
|
+
localFileExisted = existsSync(
|
|
271
|
+
join(__dirname, 'jacs.linux-riscv64-gnu.node')
|
|
272
|
+
)
|
|
273
|
+
try {
|
|
274
|
+
if (localFileExisted) {
|
|
275
|
+
nativeBinding = require('./jacs.linux-riscv64-gnu.node')
|
|
276
|
+
} else {
|
|
277
|
+
nativeBinding = require('@hai.ai/jacs-linux-riscv64-gnu')
|
|
278
|
+
}
|
|
279
|
+
} catch (e) {
|
|
280
|
+
loadError = e
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
break
|
|
284
|
+
case 's390x':
|
|
285
|
+
localFileExisted = existsSync(
|
|
286
|
+
join(__dirname, 'jacs.linux-s390x-gnu.node')
|
|
287
|
+
)
|
|
288
|
+
try {
|
|
289
|
+
if (localFileExisted) {
|
|
290
|
+
nativeBinding = require('./jacs.linux-s390x-gnu.node')
|
|
291
|
+
} else {
|
|
292
|
+
nativeBinding = require('@hai.ai/jacs-linux-s390x-gnu')
|
|
293
|
+
}
|
|
294
|
+
} catch (e) {
|
|
295
|
+
loadError = e
|
|
296
|
+
}
|
|
297
|
+
break
|
|
298
|
+
default:
|
|
299
|
+
throw new Error(`Unsupported architecture on Linux: ${arch}`)
|
|
300
|
+
}
|
|
301
|
+
break
|
|
302
|
+
default:
|
|
303
|
+
throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`)
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (!nativeBinding) {
|
|
307
|
+
if (loadError) {
|
|
308
|
+
throw loadError
|
|
309
|
+
}
|
|
310
|
+
throw new Error(`Failed to load native binding`)
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const { JacsAgent, hashString, createConfig, createAgent, trustAgent, listTrustedAgents, untrustAgent, isTrusted, getTrustedAgent, audit, load, signAgent, verifyString, signString, verifyAgent, updateAgent, verifyDocumentStandalone, verifyDocument, updateDocument, verifySignature, createAgreement, signAgreement, createDocument, checkAgreement, signRequest, verifyResponse, verifyResponseWithAgentId, fetchRemoteKey, generateVerifyLink } = nativeBinding
|
|
314
|
+
|
|
315
|
+
module.exports.JacsAgent = JacsAgent
|
|
316
|
+
module.exports.hashString = hashString
|
|
317
|
+
module.exports.createConfig = createConfig
|
|
318
|
+
module.exports.createAgent = createAgent
|
|
319
|
+
module.exports.trustAgent = trustAgent
|
|
320
|
+
module.exports.listTrustedAgents = listTrustedAgents
|
|
321
|
+
module.exports.untrustAgent = untrustAgent
|
|
322
|
+
module.exports.isTrusted = isTrusted
|
|
323
|
+
module.exports.getTrustedAgent = getTrustedAgent
|
|
324
|
+
module.exports.audit = audit
|
|
325
|
+
module.exports.load = load
|
|
326
|
+
module.exports.signAgent = signAgent
|
|
327
|
+
module.exports.verifyString = verifyString
|
|
328
|
+
module.exports.signString = signString
|
|
329
|
+
module.exports.verifyAgent = verifyAgent
|
|
330
|
+
module.exports.updateAgent = updateAgent
|
|
331
|
+
module.exports.verifyDocumentStandalone = verifyDocumentStandalone
|
|
332
|
+
module.exports.verifyDocument = verifyDocument
|
|
333
|
+
module.exports.updateDocument = updateDocument
|
|
334
|
+
module.exports.verifySignature = verifySignature
|
|
335
|
+
module.exports.createAgreement = createAgreement
|
|
336
|
+
module.exports.signAgreement = signAgreement
|
|
337
|
+
module.exports.createDocument = createDocument
|
|
338
|
+
module.exports.checkAgreement = checkAgreement
|
|
339
|
+
module.exports.signRequest = signRequest
|
|
340
|
+
module.exports.verifyResponse = verifyResponse
|
|
341
|
+
module.exports.verifyResponseWithAgentId = verifyResponseWithAgentId
|
|
342
|
+
module.exports.fetchRemoteKey = fetchRemoteKey
|
|
343
|
+
module.exports.generateVerifyLink = generateVerifyLink
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/mcp.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
|
|
2
|
+
import { JSONRPCMessage } from "@modelcontextprotocol/sdk/types.js";
|
|
3
|
+
import { IncomingMessage, ServerResponse } from "node:http";
|
|
4
|
+
/**
|
|
5
|
+
* JACS Transport Proxy - Wraps any transport with JACS encryption
|
|
6
|
+
*
|
|
7
|
+
* This proxy sits between the MCP SDK and the actual transport,
|
|
8
|
+
* intercepting serialized JSON strings (not JSON-RPC objects)
|
|
9
|
+
*/
|
|
10
|
+
export declare class JACSTransportProxy implements Transport {
|
|
11
|
+
private transport;
|
|
12
|
+
private jacsConfigPath?;
|
|
13
|
+
private jacsOperational;
|
|
14
|
+
private proxyId;
|
|
15
|
+
constructor(transport: Transport, role: "client" | "server", jacsConfigPath?: string | undefined);
|
|
16
|
+
onclose?: () => void;
|
|
17
|
+
onerror?: (error: Error) => void;
|
|
18
|
+
onmessage?: (message: JSONRPCMessage) => void;
|
|
19
|
+
start(): Promise<void>;
|
|
20
|
+
close(): Promise<void>;
|
|
21
|
+
send(message: JSONRPCMessage): Promise<void>;
|
|
22
|
+
get sessionId(): string | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* REQUIRED for SSE (Server-Sent Events) transport pattern in MCP.
|
|
25
|
+
*
|
|
26
|
+
* WHY THIS EXISTS:
|
|
27
|
+
* SSE is inherently unidirectional (server→client), but MCP requires bidirectional communication.
|
|
28
|
+
* The MCP SSE implementation solves this with a hybrid approach:
|
|
29
|
+
* - Server→Client: Uses SSE stream for real-time messages
|
|
30
|
+
* - Client→Server: Uses HTTP POST to a specific endpoint
|
|
31
|
+
*
|
|
32
|
+
* This function intercepts those client POST requests, decrypts JACS payloads,
|
|
33
|
+
* and forwards the decrypted messages to the underlying SSE transport handler.
|
|
34
|
+
*
|
|
35
|
+
* Without this, JACS-encrypted client messages would never reach the MCP server.
|
|
36
|
+
*/
|
|
37
|
+
handlePostMessage?(req: IncomingMessage & {
|
|
38
|
+
auth?: any;
|
|
39
|
+
}, res: ServerResponse, rawBodyString?: string): Promise<void>;
|
|
40
|
+
private handleIncomingMessage;
|
|
41
|
+
/**
|
|
42
|
+
* Removes null and undefined values from JSON objects to prevent MCP schema validation failures.
|
|
43
|
+
*
|
|
44
|
+
* WORKAROUND for MCP JSON Schema validation issues:
|
|
45
|
+
* - Addresses strict validators (like Anthropic's API) that reject schemas with null values
|
|
46
|
+
* - Handles edge cases where tools have null inputSchema causing client validation errors
|
|
47
|
+
* - Prevents "invalid_type: expected object, received undefined" errors in TypeScript SDK v1.9.0
|
|
48
|
+
* - Cleans up malformed schemas before transmission to avoid -32602 JSON-RPC errors
|
|
49
|
+
*
|
|
50
|
+
* Related issues:
|
|
51
|
+
* - https://github.com/modelcontextprotocol/typescript-sdk/issues/400 (null schema tools)
|
|
52
|
+
* - https://github.com/anthropics/claude-code/issues/586 (Anthropic strict Draft 2020-12)
|
|
53
|
+
* - https://github.com/agno-agi/agno/issues/2791 (missing type field)
|
|
54
|
+
*
|
|
55
|
+
* @param obj - The object to clean (typically MCP tool/resource schemas)
|
|
56
|
+
* @returns A new object with all null/undefined values recursively removed
|
|
57
|
+
*/
|
|
58
|
+
private removeNullValues;
|
|
59
|
+
}
|
|
60
|
+
export declare function createJACSTransportProxy(transport: Transport, configPath: string, role: "client" | "server"): JACSTransportProxy;
|
|
61
|
+
export declare function createJACSTransportProxyAsync(transport: Transport, configPath: string, role: "client" | "server"): Promise<JACSTransportProxy>;
|