@slopus/happy-agent-client 0.0.38 → 0.0.39

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 CHANGED
@@ -81,6 +81,42 @@ Tool calls expose the complete `ToolPresentation` discriminated union — explor
81
81
  background-terminal interaction, file diff, and web/X search — together with an exported TypeBox
82
82
  schema for each variant and `toolPresentationSchema` for the whole set.
83
83
 
84
+ Cloud key setup uses two-secret key derivation inspired by 1Password. The caller supplies 16 bytes
85
+ from a cryptographically secure random source, stores the canonical generated secret, and combines
86
+ it with the person's password. Passwords are trimmed, normalized with Unicode NFKD, and stretched
87
+ with PBKDF2-HMAC-SHA-256; the generated factor uses HKDF-SHA-256. Independent encryption and
88
+ authentication results can be passed directly to the create or restore mutation.
89
+
90
+ The versioned generated-secret format is
91
+ `H1-XXXXX-XXXXX-XXXXX-XXXXX-XXXXXX`. Its 26 body characters are the big-endian base-31 encoding
92
+ of the 16-byte seed using `23456789ABCDEFGHJKLMNPQRSTVWXYZ`; the dashes and `H1` prefix are not
93
+ part of the seed. For each of the `encryption` and `authentication` purposes, H1 performs:
94
+
95
+ ```text
96
+ password = UTF8(NFKD(trim(input)))
97
+ salt = HKDF-SHA-256(seed, "happy-agent-cloud-keys/H1",
98
+ "happy-agent-cloud-keys/H1/password-salt/<purpose>", 32)
99
+ passwordPart = PBKDF2-HMAC-SHA-256(password, salt, 650000, 32)
100
+ generatedPart = HKDF-SHA-256(seed, "happy-agent-cloud-keys/H1",
101
+ "happy-agent-cloud-keys/H1/generated-factor/<purpose>", 32)
102
+ result = passwordPart XOR generatedPart
103
+ ```
104
+
105
+ Results are unpadded base64url. The `encryption` result is `encryptionKey`; the `authentication`
106
+ result is `authHash`. The design follows 1Password's published
107
+ [password preprocessing and two-secret derivation](https://agilebits.github.io/security-design/deepKeys.html)
108
+ and [human-readable Secret Key](https://agilebits.github.io/security-design/apsk.html), but H1 is a
109
+ separate Happy format and is not an A3-compatible 1Password Secret Key.
110
+
111
+ ```ts
112
+ const seed = crypto.getRandomValues(new Uint8Array(CLOUD_GENERATED_SECRET_SEED_BYTES));
113
+ const generatedSecret = stringifyCloudGeneratedSecret(seed);
114
+ seed.fill(0);
115
+
116
+ const keys = await deriveCloudKeys(generatedSecret, password);
117
+ await client.createCloudKeys(keys);
118
+ ```
119
+
84
120
  Focused agent responses and agent bootstrap include the current module-contributed slash-command
85
121
  catalog. `invokeSlashCommand` executes one through its owning module, while
86
122
  `agent.slash_commands.updated` carries complete catalog replacements discovered at turn time.
@@ -0,0 +1,27 @@
1
+ import { type Static } from "@sinclair/typebox";
2
+ /** The number of cryptographically secure random bytes encoded by an H1 generated secret. */
3
+ export declare const CLOUD_GENERATED_SECRET_SEED_BYTES = 16;
4
+ /** A canonical, versioned H1 generated secret. */
5
+ export declare const cloudGeneratedSecretSchema: import("@sinclair/typebox").TString;
6
+ export type CloudGeneratedSecret = Static<typeof cloudGeneratedSecretSchema>;
7
+ /** The two derived values accepted by the Cloud key create and restore mutations. */
8
+ export declare const cloudDerivedKeysSchema: import("@sinclair/typebox").TObject<{
9
+ authHash: import("@sinclair/typebox").TString;
10
+ encryptionKey: import("@sinclair/typebox").TString;
11
+ }>;
12
+ export type CloudDerivedKeys = Static<typeof cloudDerivedKeysSchema>;
13
+ /**
14
+ * Removes surrounding Unicode whitespace and applies the NFKD normalization
15
+ * used by 1Password before password key derivation.
16
+ */
17
+ export declare function normalizeCloudPassword(password: string): string;
18
+ /** Encodes a caller-provided 128-bit secure random seed as a canonical H1 generated secret. */
19
+ export declare function stringifyCloudGeneratedSecret(seed: Uint8Array): CloudGeneratedSecret;
20
+ /** Decodes one canonical H1 generated secret into a new 128-bit seed buffer. */
21
+ export declare function parseCloudGeneratedSecret(secret: string): Uint8Array<ArrayBuffer>;
22
+ /**
23
+ * Combines the generated and password factors into independent Cloud bundle
24
+ * encryption and authentication values.
25
+ */
26
+ export declare function deriveCloudKeys(generatedSecret: CloudGeneratedSecret, password: string): Promise<CloudDerivedKeys>;
27
+ //# sourceMappingURL=cloudEncryption.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudEncryption.d.ts","sourceRoot":"","sources":["../sources/cloudEncryption.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAoBtD,6FAA6F;AAC7F,eAAO,MAAM,iCAAiC,KAAK,CAAC;AAEpD,kDAAkD;AAClD,eAAO,MAAM,0BAA0B,qCAIrC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE7E,qFAAqF;AACrF,eAAO,MAAM,sBAAsB;;;EAMlC,CAAC;AACF,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAOrE;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS/D;AAED,+FAA+F;AAC/F,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,UAAU,GAAG,oBAAoB,CAoBpF;AAED,gFAAgF;AAChF,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,CAejF;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACjC,eAAe,EAAE,oBAAoB,EACrC,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,CAAC,CAmB3B"}
@@ -0,0 +1,180 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { Value } from "@sinclair/typebox/value";
3
+ import { cloudKeyValueSchema } from "./protocol/cloud.js";
4
+ const exact = { additionalProperties: false };
5
+ const encoder = new TextEncoder();
6
+ const GENERATED_SECRET_ALPHABET = "23456789ABCDEFGHJKLMNPQRSTVWXYZ";
7
+ const GENERATED_SECRET_BASE = BigInt(GENERATED_SECRET_ALPHABET.length);
8
+ const GENERATED_SECRET_BODY_CHARACTERS = 26;
9
+ const GENERATED_SECRET_PATTERN = "^H1-[2-9A-HJ-NP-TV-Z]{5}-[2-9A-HJ-NP-TV-Z]{5}-[2-9A-HJ-NP-TV-Z]{5}-[2-9A-HJ-NP-TV-Z]{5}-[2-9A-HJ-NP-TV-Z]{6}$";
10
+ const GENERATED_SECRET_PREFIX = "H1";
11
+ const GENERATED_SECRET_VALUE_LIMIT = 1n << 128n;
12
+ const KEY_BYTES = 32;
13
+ const PBKDF2_ITERATIONS = 650_000;
14
+ const KDF_SALT = encoder.encode("happy-agent-cloud-keys/H1");
15
+ const passwordInputSchema = Type.String();
16
+ const normalizedPasswordSchema = Type.String({ minLength: 1 });
17
+ /** The number of cryptographically secure random bytes encoded by an H1 generated secret. */
18
+ export const CLOUD_GENERATED_SECRET_SEED_BYTES = 16;
19
+ /** A canonical, versioned H1 generated secret. */
20
+ export const cloudGeneratedSecretSchema = Type.String({
21
+ minLength: 33,
22
+ maxLength: 33,
23
+ pattern: GENERATED_SECRET_PATTERN,
24
+ });
25
+ /** The two derived values accepted by the Cloud key create and restore mutations. */
26
+ export const cloudDerivedKeysSchema = Type.Object({
27
+ authHash: cloudKeyValueSchema,
28
+ encryptionKey: cloudKeyValueSchema,
29
+ }, exact);
30
+ const cloudGeneratedSecretSeedSchema = Type.Uint8Array({
31
+ maxByteLength: CLOUD_GENERATED_SECRET_SEED_BYTES,
32
+ minByteLength: CLOUD_GENERATED_SECRET_SEED_BYTES,
33
+ });
34
+ /**
35
+ * Removes surrounding Unicode whitespace and applies the NFKD normalization
36
+ * used by 1Password before password key derivation.
37
+ */
38
+ export function normalizeCloudPassword(password) {
39
+ if (!Value.Check(passwordInputSchema, password)) {
40
+ throw new TypeError("Password must be a string.");
41
+ }
42
+ const normalized = password.trim().normalize("NFKD");
43
+ if (!Value.Check(normalizedPasswordSchema, normalized)) {
44
+ throw new TypeError("Password must not be empty after trimming.");
45
+ }
46
+ return normalized;
47
+ }
48
+ /** Encodes a caller-provided 128-bit secure random seed as a canonical H1 generated secret. */
49
+ export function stringifyCloudGeneratedSecret(seed) {
50
+ if (!Value.Check(cloudGeneratedSecretSeedSchema, seed)) {
51
+ throw new TypeError(`Generated secret seed must contain exactly ${CLOUD_GENERATED_SECRET_SEED_BYTES} bytes.`);
52
+ }
53
+ let value = bytesToInteger(seed);
54
+ let body = "";
55
+ for (let index = 0; index < GENERATED_SECRET_BODY_CHARACTERS; index += 1) {
56
+ body = GENERATED_SECRET_ALPHABET[Number(value % GENERATED_SECRET_BASE)] + body;
57
+ value /= GENERATED_SECRET_BASE;
58
+ }
59
+ if (value !== 0n)
60
+ throw new TypeError("Generated secret seed is out of range.");
61
+ const formatted = `${GENERATED_SECRET_PREFIX}-${body.slice(0, 5)}-${body.slice(5, 10)}-${body.slice(10, 15)}-${body.slice(15, 20)}-${body.slice(20)}`;
62
+ if (!Value.Check(cloudGeneratedSecretSchema, formatted)) {
63
+ throw new TypeError("Generated secret could not be encoded.");
64
+ }
65
+ return formatted;
66
+ }
67
+ /** Decodes one canonical H1 generated secret into a new 128-bit seed buffer. */
68
+ export function parseCloudGeneratedSecret(secret) {
69
+ if (!Value.Check(cloudGeneratedSecretSchema, secret)) {
70
+ throw new TypeError("Generated secret is not a canonical H1 secret.");
71
+ }
72
+ const body = secret.slice(GENERATED_SECRET_PREFIX.length + 1).replaceAll("-", "");
73
+ let value = 0n;
74
+ for (const character of body) {
75
+ value =
76
+ value * GENERATED_SECRET_BASE + BigInt(GENERATED_SECRET_ALPHABET.indexOf(character));
77
+ }
78
+ if (value >= GENERATED_SECRET_VALUE_LIMIT) {
79
+ throw new TypeError("Generated secret is outside the H1 value range.");
80
+ }
81
+ return integerToBytes(value, CLOUD_GENERATED_SECRET_SEED_BYTES);
82
+ }
83
+ /**
84
+ * Combines the generated and password factors into independent Cloud bundle
85
+ * encryption and authentication values.
86
+ */
87
+ export async function deriveCloudKeys(generatedSecret, password) {
88
+ const normalizedPassword = normalizeCloudPassword(password);
89
+ const seed = parseCloudGeneratedSecret(generatedSecret);
90
+ const passwordBytes = encoder.encode(normalizedPassword);
91
+ let encryptionKey;
92
+ let authHash;
93
+ try {
94
+ encryptionKey = await deriveCombinedKey(seed, passwordBytes, "encryption");
95
+ authHash = await deriveCombinedKey(seed, passwordBytes, "authentication");
96
+ return {
97
+ authHash: encodeBase64Url(authHash),
98
+ encryptionKey: encodeBase64Url(encryptionKey),
99
+ };
100
+ }
101
+ finally {
102
+ encryptionKey?.fill(0);
103
+ authHash?.fill(0);
104
+ seed.fill(0);
105
+ passwordBytes.fill(0);
106
+ }
107
+ }
108
+ async function deriveCombinedKey(seed, password, purpose) {
109
+ const passwordSalt = await deriveHkdf(seed, `password-salt/${purpose}`);
110
+ let generatedPart;
111
+ let passwordPart;
112
+ try {
113
+ generatedPart = await deriveHkdf(seed, `generated-factor/${purpose}`);
114
+ passwordPart = await derivePbkdf2(password, passwordSalt);
115
+ const combined = new Uint8Array(KEY_BYTES);
116
+ for (let index = 0; index < combined.length; index += 1) {
117
+ combined[index] = passwordPart[index] ^ generatedPart[index];
118
+ }
119
+ return combined;
120
+ }
121
+ finally {
122
+ passwordSalt.fill(0);
123
+ generatedPart?.fill(0);
124
+ passwordPart?.fill(0);
125
+ }
126
+ }
127
+ async function deriveHkdf(seed, info) {
128
+ const key = await globalThis.crypto.subtle.importKey("raw", seed, "HKDF", false, [
129
+ "deriveBits",
130
+ ]);
131
+ return new Uint8Array(await globalThis.crypto.subtle.deriveBits({
132
+ hash: "SHA-256",
133
+ info: encoder.encode(`happy-agent-cloud-keys/H1/${info}`),
134
+ name: "HKDF",
135
+ salt: KDF_SALT,
136
+ }, key, KEY_BYTES * 8));
137
+ }
138
+ async function derivePbkdf2(password, salt) {
139
+ const key = await globalThis.crypto.subtle.importKey("raw", password, "PBKDF2", false, [
140
+ "deriveBits",
141
+ ]);
142
+ return new Uint8Array(await globalThis.crypto.subtle.deriveBits({
143
+ hash: "SHA-256",
144
+ iterations: PBKDF2_ITERATIONS,
145
+ name: "PBKDF2",
146
+ salt,
147
+ }, key, KEY_BYTES * 8));
148
+ }
149
+ function bytesToInteger(bytes) {
150
+ let value = 0n;
151
+ for (const byte of bytes)
152
+ value = (value << 8n) | BigInt(byte);
153
+ return value;
154
+ }
155
+ function integerToBytes(value, length) {
156
+ const bytes = new Uint8Array(length);
157
+ for (let index = bytes.length - 1; index >= 0; index -= 1) {
158
+ bytes[index] = Number(value & 0xffn);
159
+ value >>= 8n;
160
+ }
161
+ return bytes;
162
+ }
163
+ function encodeBase64Url(bytes) {
164
+ const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
165
+ let encoded = "";
166
+ let bits = 0;
167
+ let buffer = 0;
168
+ for (const byte of bytes) {
169
+ buffer = (buffer << 8) | byte;
170
+ bits += 8;
171
+ while (bits >= 6) {
172
+ bits -= 6;
173
+ encoded += alphabet[(buffer >>> bits) & 0x3f];
174
+ }
175
+ }
176
+ if (bits > 0)
177
+ encoded += alphabet[(buffer << (6 - bits)) & 0x3f];
178
+ return encoded;
179
+ }
180
+ //# sourceMappingURL=cloudEncryption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudEncryption.js","sourceRoot":"","sources":["../sources/cloudEncryption.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -11,6 +11,8 @@ export type { SseFrame } from "./readSseFrames.js";
11
11
  export type { HappyAgentUpdate, HappyAgentUpdatesOptions } from "./updates.js";
12
12
  export { endpointUrl } from "./endpointUrl.js";
13
13
  export type { QueryParameters, QueryValue } from "./endpointUrl.js";
14
+ export { CLOUD_GENERATED_SECRET_SEED_BYTES, cloudDerivedKeysSchema, cloudGeneratedSecretSchema, deriveCloudKeys, normalizeCloudPassword, parseCloudGeneratedSecret, stringifyCloudGeneratedSecret, } from "./cloudEncryption.js";
15
+ export type { CloudDerivedKeys, CloudGeneratedSecret } from "./cloudEncryption.js";
14
16
  export { applyMessageDelta } from "./applyMessageDelta.js";
15
17
  export type { MessageDeltaApplication } from "./applyMessageDelta.js";
16
18
  export * from "./requestOptions.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../sources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EACR,mBAAmB,EACnB,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,GAC7B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACR,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,cAAc,qBAAqB,CAAC;AAEpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../sources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EACR,mBAAmB,EACnB,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,GAC7B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACR,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EACH,iCAAiC,EACjC,sBAAsB,EACtB,0BAA0B,EAC1B,eAAe,EACf,sBAAsB,EACtB,yBAAyB,EACzB,6BAA6B,GAChC,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,cAAc,qBAAqB,CAAC;AAEpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -4,6 +4,7 @@ export { HappyAgentApiError } from "./HappyAgentApiError.js";
4
4
  export { EventStreamProtocolError, readEventStream } from "./readEventStream.js";
5
5
  export { readSseFrames } from "./readSseFrames.js";
6
6
  export { endpointUrl } from "./endpointUrl.js";
7
+ export { CLOUD_GENERATED_SECRET_SEED_BYTES, cloudDerivedKeysSchema, cloudGeneratedSecretSchema, deriveCloudKeys, normalizeCloudPassword, parseCloudGeneratedSecret, stringifyCloudGeneratedSecret, } from "./cloudEncryption.js";
7
8
  export { applyMessageDelta } from "./applyMessageDelta.js";
8
9
  export * from "./requestOptions.js";
9
10
  export * from "./protocol/agents.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../sources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAajD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,cAAc,qBAAqB,CAAC;AAEpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../sources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAajD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EACH,iCAAiC,EACjC,sBAAsB,EACtB,0BAA0B,EAC1B,eAAe,EACf,sBAAsB,EACtB,yBAAyB,EACzB,6BAA6B,GAChC,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,cAAc,qBAAqB,CAAC;AAEpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slopus/happy-agent-client",
3
- "version": "0.0.38",
3
+ "version": "0.0.39",
4
4
  "description": "Typed client for the Happy agent HTTP API.",
5
5
  "license": "MIT",
6
6
  "repository": {