@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/src/a2a.js CHANGED
@@ -332,7 +332,7 @@ class JACSA2AIntegration {
332
332
  wrapped.jacsParentSignatures = parentSignatures;
333
333
  }
334
334
 
335
- return jacs.signRequest(wrapped);
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.verifyResponse(wrappedArtifact);
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel-ai.js","sourceRoot":"","sources":["vercel-ai.ts"],"names":[],"mappings":"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"}