@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/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>;