@hai.ai/jacs 0.6.0 → 0.8.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 +336 -52
- package/client.d.ts +96 -0
- package/client.js +560 -0
- package/express.d.ts +69 -0
- package/express.js +130 -0
- package/express.js.map +1 -0
- package/index.d.ts +117 -96
- package/index.js +19 -17
- 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/koa.d.ts +59 -0
- package/koa.js +124 -0
- package/koa.js.map +1 -0
- package/langchain.d.ts +97 -0
- package/langchain.js +439 -0
- package/langchain.js.map +1 -0
- package/mcp.d.ts +75 -42
- package/mcp.js +449 -422
- package/mcp.js.map +1 -1
- package/package.json +91 -7
- package/scripts/install-cli.js +125 -0
- package/simple.d.ts +92 -430
- package/simple.js +507 -524
- package/src/a2a.js +2 -2
- package/testing.d.ts +39 -0
- package/testing.js +49 -0
- package/vercel-ai.d.ts +54 -0
- package/vercel-ai.js +162 -0
- package/vercel-ai.js.map +1 -0
- package/mcp.ts +0 -521
package/src/a2a.js
CHANGED
|
@@ -332,7 +332,7 @@ class JACSA2AIntegration {
|
|
|
332
332
|
wrapped.jacsParentSignatures = parentSignatures;
|
|
333
333
|
}
|
|
334
334
|
|
|
335
|
-
return jacs.
|
|
335
|
+
return jacs.legacySignRequest(wrapped);
|
|
336
336
|
}
|
|
337
337
|
|
|
338
338
|
/**
|
|
@@ -449,7 +449,7 @@ class JACSA2AIntegration {
|
|
|
449
449
|
}
|
|
450
450
|
|
|
451
451
|
try {
|
|
452
|
-
const isValid = jacs.
|
|
452
|
+
const isValid = jacs.legacyVerifyResponse(wrappedArtifact);
|
|
453
453
|
const signatureInfo = wrappedArtifact.jacsSignature || {};
|
|
454
454
|
|
|
455
455
|
const result = {
|
package/testing.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JACS Test Helpers
|
|
3
|
+
*
|
|
4
|
+
* Utilities for creating ephemeral clients in tests. Each client gets its own
|
|
5
|
+
* in-memory agent -- no config files, no key files, no env vars needed.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { createTestClient, createTestClientSync } from '@hai.ai/jacs/testing';
|
|
10
|
+
*
|
|
11
|
+
* // Async (preferred)
|
|
12
|
+
* const client = await createTestClient('ring-Ed25519');
|
|
13
|
+
* const signed = await client.signMessage({ hello: 'test' });
|
|
14
|
+
* const result = await client.verify(signed.raw);
|
|
15
|
+
* assert(result.valid);
|
|
16
|
+
*
|
|
17
|
+
* // Sync
|
|
18
|
+
* const client2 = createTestClientSync('ring-Ed25519');
|
|
19
|
+
* const signed2 = client2.signMessageSync({ hello: 'test' });
|
|
20
|
+
* const result2 = client2.verifySync(signed2.raw);
|
|
21
|
+
* assert(result2.valid);
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
import { JacsClient } from './client';
|
|
25
|
+
export { JacsClient };
|
|
26
|
+
/**
|
|
27
|
+
* Create an ephemeral JacsClient for testing (async). No files or env vars needed.
|
|
28
|
+
*
|
|
29
|
+
* @param algorithm - Signing algorithm (default: "ring-Ed25519" for speed)
|
|
30
|
+
* @returns A fully-initialized JacsClient backed by an in-memory agent
|
|
31
|
+
*/
|
|
32
|
+
export declare function createTestClient(algorithm?: string): Promise<JacsClient>;
|
|
33
|
+
/**
|
|
34
|
+
* Create an ephemeral JacsClient for testing (sync). No files or env vars needed.
|
|
35
|
+
*
|
|
36
|
+
* @param algorithm - Signing algorithm (default: "ring-Ed25519" for speed)
|
|
37
|
+
* @returns A fully-initialized JacsClient backed by an in-memory agent
|
|
38
|
+
*/
|
|
39
|
+
export declare function createTestClientSync(algorithm?: string): JacsClient;
|
package/testing.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* JACS Test Helpers
|
|
4
|
+
*
|
|
5
|
+
* Utilities for creating ephemeral clients in tests. Each client gets its own
|
|
6
|
+
* in-memory agent -- no config files, no key files, no env vars needed.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { createTestClient, createTestClientSync } from '@hai.ai/jacs/testing';
|
|
11
|
+
*
|
|
12
|
+
* // Async (preferred)
|
|
13
|
+
* const client = await createTestClient('ring-Ed25519');
|
|
14
|
+
* const signed = await client.signMessage({ hello: 'test' });
|
|
15
|
+
* const result = await client.verify(signed.raw);
|
|
16
|
+
* assert(result.valid);
|
|
17
|
+
*
|
|
18
|
+
* // Sync
|
|
19
|
+
* const client2 = createTestClientSync('ring-Ed25519');
|
|
20
|
+
* const signed2 = client2.signMessageSync({ hello: 'test' });
|
|
21
|
+
* const result2 = client2.verifySync(signed2.raw);
|
|
22
|
+
* assert(result2.valid);
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.JacsClient = void 0;
|
|
27
|
+
exports.createTestClient = createTestClient;
|
|
28
|
+
exports.createTestClientSync = createTestClientSync;
|
|
29
|
+
const client_1 = require("./client");
|
|
30
|
+
Object.defineProperty(exports, "JacsClient", { enumerable: true, get: function () { return client_1.JacsClient; } });
|
|
31
|
+
/**
|
|
32
|
+
* Create an ephemeral JacsClient for testing (async). No files or env vars needed.
|
|
33
|
+
*
|
|
34
|
+
* @param algorithm - Signing algorithm (default: "ring-Ed25519" for speed)
|
|
35
|
+
* @returns A fully-initialized JacsClient backed by an in-memory agent
|
|
36
|
+
*/
|
|
37
|
+
async function createTestClient(algorithm) {
|
|
38
|
+
return client_1.JacsClient.ephemeral(algorithm ?? 'ring-Ed25519');
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create an ephemeral JacsClient for testing (sync). No files or env vars needed.
|
|
42
|
+
*
|
|
43
|
+
* @param algorithm - Signing algorithm (default: "ring-Ed25519" for speed)
|
|
44
|
+
* @returns A fully-initialized JacsClient backed by an in-memory agent
|
|
45
|
+
*/
|
|
46
|
+
function createTestClientSync(algorithm) {
|
|
47
|
+
return client_1.JacsClient.ephemeralSync(algorithm ?? 'ring-Ed25519');
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=testing.js.map
|
package/vercel-ai.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JACS Vercel AI SDK Adapter
|
|
3
|
+
*
|
|
4
|
+
* Provides cryptographic provenance signing for AI model outputs
|
|
5
|
+
* using the Vercel AI SDK's LanguageModelV3Middleware pattern.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { JacsClient } from '@hai.ai/jacs/client';
|
|
10
|
+
* import { withProvenance } from '@hai.ai/jacs/vercel-ai';
|
|
11
|
+
* import { openai } from '@ai-sdk/openai';
|
|
12
|
+
* import { generateText } from 'ai';
|
|
13
|
+
*
|
|
14
|
+
* const client = await JacsClient.quickstart();
|
|
15
|
+
* const model = withProvenance(openai('gpt-4'), { client });
|
|
16
|
+
*
|
|
17
|
+
* const { text, providerMetadata } = await generateText({
|
|
18
|
+
* model,
|
|
19
|
+
* prompt: 'Hello!',
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* console.log(providerMetadata?.jacs?.documentId);
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
import type { JacsClient } from './client.js';
|
|
26
|
+
interface LanguageModelV3Middleware {
|
|
27
|
+
specificationVersion: 'v3';
|
|
28
|
+
transformParams?: (opts: any) => Promise<any>;
|
|
29
|
+
wrapGenerate?: (opts: any) => Promise<any>;
|
|
30
|
+
wrapStream?: (opts: any) => Promise<any>;
|
|
31
|
+
}
|
|
32
|
+
export interface ProvenanceOptions {
|
|
33
|
+
/** An initialized JacsClient instance. */
|
|
34
|
+
client: JacsClient;
|
|
35
|
+
/** Sign generated text output. Default: true. */
|
|
36
|
+
signText?: boolean;
|
|
37
|
+
/** Sign tool call results. Default: true. */
|
|
38
|
+
signToolResults?: boolean;
|
|
39
|
+
/** Throw on signing failure instead of logging. Default: false. */
|
|
40
|
+
strict?: boolean;
|
|
41
|
+
/** Additional metadata to include in provenance records. */
|
|
42
|
+
metadata?: Record<string, unknown>;
|
|
43
|
+
}
|
|
44
|
+
export interface ProvenanceRecord {
|
|
45
|
+
signed: boolean;
|
|
46
|
+
documentId: string;
|
|
47
|
+
agentId: string;
|
|
48
|
+
timestamp: string;
|
|
49
|
+
error?: string;
|
|
50
|
+
metadata?: Record<string, unknown>;
|
|
51
|
+
}
|
|
52
|
+
export declare function jacsProvenance(options: ProvenanceOptions): LanguageModelV3Middleware;
|
|
53
|
+
export declare function withProvenance(model: any, options: ProvenanceOptions): any;
|
|
54
|
+
export {};
|
package/vercel-ai.js
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* JACS Vercel AI SDK Adapter
|
|
4
|
+
*
|
|
5
|
+
* Provides cryptographic provenance signing for AI model outputs
|
|
6
|
+
* using the Vercel AI SDK's LanguageModelV3Middleware pattern.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { JacsClient } from '@hai.ai/jacs/client';
|
|
11
|
+
* import { withProvenance } from '@hai.ai/jacs/vercel-ai';
|
|
12
|
+
* import { openai } from '@ai-sdk/openai';
|
|
13
|
+
* import { generateText } from 'ai';
|
|
14
|
+
*
|
|
15
|
+
* const client = await JacsClient.quickstart();
|
|
16
|
+
* const model = withProvenance(openai('gpt-4'), { client });
|
|
17
|
+
*
|
|
18
|
+
* const { text, providerMetadata } = await generateText({
|
|
19
|
+
* model,
|
|
20
|
+
* prompt: 'Hello!',
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* console.log(providerMetadata?.jacs?.documentId);
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.jacsProvenance = jacsProvenance;
|
|
28
|
+
exports.withProvenance = withProvenance;
|
|
29
|
+
// =============================================================================
|
|
30
|
+
// Helpers
|
|
31
|
+
// =============================================================================
|
|
32
|
+
async function signContent(client, content, opts) {
|
|
33
|
+
try {
|
|
34
|
+
const signed = await client.signMessage(opts.metadata
|
|
35
|
+
? { content, provenance: opts.metadata }
|
|
36
|
+
: content);
|
|
37
|
+
return {
|
|
38
|
+
signed: true,
|
|
39
|
+
documentId: signed.documentId,
|
|
40
|
+
agentId: signed.agentId,
|
|
41
|
+
timestamp: signed.timestamp,
|
|
42
|
+
metadata: opts.metadata,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
if (opts.strict) {
|
|
47
|
+
throw err;
|
|
48
|
+
}
|
|
49
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
50
|
+
console.error('[jacs/vercel-ai] signing failed:', message);
|
|
51
|
+
return {
|
|
52
|
+
signed: false,
|
|
53
|
+
documentId: '',
|
|
54
|
+
agentId: '',
|
|
55
|
+
timestamp: '',
|
|
56
|
+
error: message,
|
|
57
|
+
metadata: opts.metadata,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function extractTextFromContent(content) {
|
|
62
|
+
if (!Array.isArray(content))
|
|
63
|
+
return '';
|
|
64
|
+
return content
|
|
65
|
+
.filter((part) => part.type === 'text')
|
|
66
|
+
.map((part) => part.text)
|
|
67
|
+
.join('');
|
|
68
|
+
}
|
|
69
|
+
// =============================================================================
|
|
70
|
+
// jacsProvenance — returns a LanguageModelV3Middleware
|
|
71
|
+
// =============================================================================
|
|
72
|
+
function jacsProvenance(options) {
|
|
73
|
+
const signText = options.signText !== false;
|
|
74
|
+
const signToolResults = options.signToolResults !== false;
|
|
75
|
+
const middleware = {
|
|
76
|
+
specificationVersion: 'v3',
|
|
77
|
+
wrapGenerate: async ({ doGenerate, params }) => {
|
|
78
|
+
const result = await doGenerate();
|
|
79
|
+
if (!signText && !signToolResults) {
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
const provenance = {};
|
|
83
|
+
// Sign text content
|
|
84
|
+
if (signText) {
|
|
85
|
+
const text = extractTextFromContent(result.content);
|
|
86
|
+
if (text) {
|
|
87
|
+
provenance.text = await signContent(options.client, text, options);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Sign tool results if present in params prompt
|
|
91
|
+
if (signToolResults && params.prompt) {
|
|
92
|
+
const toolResults = params.prompt.filter((part) => part.role === 'tool');
|
|
93
|
+
if (toolResults.length > 0) {
|
|
94
|
+
const toolData = toolResults.map((tr) => ({
|
|
95
|
+
role: tr.role,
|
|
96
|
+
content: tr.content,
|
|
97
|
+
}));
|
|
98
|
+
provenance.toolResults = await signContent(options.client, toolData, options);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Attach provenance to provider metadata
|
|
102
|
+
return {
|
|
103
|
+
...result,
|
|
104
|
+
providerMetadata: {
|
|
105
|
+
...result.providerMetadata,
|
|
106
|
+
jacs: provenance,
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
},
|
|
110
|
+
wrapStream: async ({ doStream, params }) => {
|
|
111
|
+
const streamResult = await doStream();
|
|
112
|
+
if (!signText) {
|
|
113
|
+
return streamResult;
|
|
114
|
+
}
|
|
115
|
+
// Accumulate text chunks, sign on stream completion
|
|
116
|
+
let accumulatedText = '';
|
|
117
|
+
const originalStream = streamResult.stream;
|
|
118
|
+
const transform = new TransformStream({
|
|
119
|
+
transform(chunk, controller) {
|
|
120
|
+
if (chunk.type === 'text-delta') {
|
|
121
|
+
accumulatedText += chunk.textDelta;
|
|
122
|
+
}
|
|
123
|
+
controller.enqueue(chunk);
|
|
124
|
+
},
|
|
125
|
+
async flush(controller) {
|
|
126
|
+
if (accumulatedText) {
|
|
127
|
+
const provenance = await signContent(options.client, accumulatedText, options);
|
|
128
|
+
controller.enqueue({
|
|
129
|
+
type: 'provider-metadata',
|
|
130
|
+
providerMetadata: {
|
|
131
|
+
jacs: { text: provenance },
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
return {
|
|
138
|
+
...streamResult,
|
|
139
|
+
stream: originalStream.pipeThrough(transform),
|
|
140
|
+
};
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
return middleware;
|
|
144
|
+
}
|
|
145
|
+
// =============================================================================
|
|
146
|
+
// withProvenance — convenience wrapper
|
|
147
|
+
// =============================================================================
|
|
148
|
+
function withProvenance(model, options) {
|
|
149
|
+
// Lazy import of wrapLanguageModel from 'ai'
|
|
150
|
+
let wrapLanguageModel;
|
|
151
|
+
try {
|
|
152
|
+
wrapLanguageModel = require('ai').wrapLanguageModel;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
throw new Error("Could not import 'ai' package. Install it as a dependency: npm install ai");
|
|
156
|
+
}
|
|
157
|
+
return wrapLanguageModel({
|
|
158
|
+
model,
|
|
159
|
+
middleware: jacsProvenance(options),
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=vercel-ai.js.map
|
package/vercel-ai.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vercel-ai.js","sourceRoot":"","sources":["vercel-ai.ts"],"names":[],"mappings":"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"}
|