@hashgraphonline/standards-sdk 0.1.146 → 0.1.148-fix-wc-updates.canary.3273eda.101

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.
Files changed (181) hide show
  1. package/README.md +3 -3
  2. package/dist/cjs/hcs-3/src/types.d.ts +64 -0
  3. package/dist/cjs/hcs-3/src/types.d.ts.map +1 -0
  4. package/dist/cjs/inscribe/inscriber.d.ts.map +1 -1
  5. package/dist/cjs/services/registry-broker/client/adapters.d.ts +15 -18
  6. package/dist/cjs/services/registry-broker/client/adapters.d.ts.map +1 -1
  7. package/dist/cjs/services/registry-broker/client/agents.d.ts +11 -14
  8. package/dist/cjs/services/registry-broker/client/agents.d.ts.map +1 -1
  9. package/dist/cjs/services/registry-broker/client/base-client.d.ts +100 -1
  10. package/dist/cjs/services/registry-broker/client/base-client.d.ts.map +1 -1
  11. package/dist/cjs/services/registry-broker/client/chat-history.d.ts +8 -12
  12. package/dist/cjs/services/registry-broker/client/chat-history.d.ts.map +1 -1
  13. package/dist/cjs/services/registry-broker/client/chat.d.ts +29 -30
  14. package/dist/cjs/services/registry-broker/client/chat.d.ts.map +1 -1
  15. package/dist/cjs/services/registry-broker/client/credits.d.ts +14 -18
  16. package/dist/cjs/services/registry-broker/client/credits.d.ts.map +1 -1
  17. package/dist/cjs/services/registry-broker/client/encrypted-chat-manager.d.ts +0 -5
  18. package/dist/cjs/services/registry-broker/client/encrypted-chat-manager.d.ts.map +1 -1
  19. package/dist/cjs/services/registry-broker/client/encryption.d.ts +32 -30
  20. package/dist/cjs/services/registry-broker/client/encryption.d.ts.map +1 -1
  21. package/dist/cjs/services/registry-broker/client/ledger-auth.d.ts +5 -8
  22. package/dist/cjs/services/registry-broker/client/ledger-auth.d.ts.map +1 -1
  23. package/dist/cjs/services/registry-broker/client/search.d.ts +14 -17
  24. package/dist/cjs/services/registry-broker/client/search.d.ts.map +1 -1
  25. package/dist/cjs/services/registry-broker/schemas.d.ts +9 -9
  26. package/dist/cjs/services/registry-broker/types.d.ts +1 -0
  27. package/dist/cjs/services/registry-broker/types.d.ts.map +1 -1
  28. package/dist/cjs/standards-sdk.cjs +3 -3
  29. package/dist/cjs/standards-sdk.cjs.map +1 -1
  30. package/dist/es/hcs-3/src/types.d.ts +64 -0
  31. package/dist/es/hcs-3/src/types.d.ts.map +1 -0
  32. package/dist/es/inscribe/inscriber.d.ts.map +1 -1
  33. package/dist/es/services/registry-broker/client/adapters.d.ts +15 -18
  34. package/dist/es/services/registry-broker/client/adapters.d.ts.map +1 -1
  35. package/dist/es/services/registry-broker/client/agents.d.ts +11 -14
  36. package/dist/es/services/registry-broker/client/agents.d.ts.map +1 -1
  37. package/dist/es/services/registry-broker/client/base-client.d.ts +100 -1
  38. package/dist/es/services/registry-broker/client/base-client.d.ts.map +1 -1
  39. package/dist/es/services/registry-broker/client/chat-history.d.ts +8 -12
  40. package/dist/es/services/registry-broker/client/chat-history.d.ts.map +1 -1
  41. package/dist/es/services/registry-broker/client/chat.d.ts +29 -30
  42. package/dist/es/services/registry-broker/client/chat.d.ts.map +1 -1
  43. package/dist/es/services/registry-broker/client/credits.d.ts +14 -18
  44. package/dist/es/services/registry-broker/client/credits.d.ts.map +1 -1
  45. package/dist/es/services/registry-broker/client/encrypted-chat-manager.d.ts +0 -5
  46. package/dist/es/services/registry-broker/client/encrypted-chat-manager.d.ts.map +1 -1
  47. package/dist/es/services/registry-broker/client/encryption.d.ts +32 -30
  48. package/dist/es/services/registry-broker/client/encryption.d.ts.map +1 -1
  49. package/dist/es/services/registry-broker/client/ledger-auth.d.ts +5 -8
  50. package/dist/es/services/registry-broker/client/ledger-auth.d.ts.map +1 -1
  51. package/dist/es/services/registry-broker/client/search.d.ts +14 -17
  52. package/dist/es/services/registry-broker/client/search.d.ts.map +1 -1
  53. package/dist/es/services/registry-broker/schemas.d.ts +9 -9
  54. package/dist/es/services/registry-broker/types.d.ts +1 -0
  55. package/dist/es/services/registry-broker/types.d.ts.map +1 -1
  56. package/dist/es/standards-sdk.es.js +13 -16
  57. package/dist/es/standards-sdk.es.js.map +1 -1
  58. package/dist/es/standards-sdk.es101.js +1 -1
  59. package/dist/es/standards-sdk.es103.js +1 -1
  60. package/dist/es/standards-sdk.es109.js +3 -10
  61. package/dist/es/standards-sdk.es109.js.map +1 -1
  62. package/dist/es/standards-sdk.es11.js +1 -1
  63. package/dist/es/standards-sdk.es110.js +5 -5
  64. package/dist/es/standards-sdk.es12.js +1 -1
  65. package/dist/es/standards-sdk.es120.js +1 -1
  66. package/dist/es/standards-sdk.es121.js +1 -1
  67. package/dist/es/standards-sdk.es122.js +5 -5
  68. package/dist/es/standards-sdk.es124.js +20 -1
  69. package/dist/es/standards-sdk.es124.js.map +1 -1
  70. package/dist/es/standards-sdk.es125.js +1 -1
  71. package/dist/es/standards-sdk.es127.js +960 -178
  72. package/dist/es/standards-sdk.es127.js.map +1 -1
  73. package/dist/es/standards-sdk.es128.js +15 -205
  74. package/dist/es/standards-sdk.es128.js.map +1 -1
  75. package/dist/es/standards-sdk.es129.js +79 -96
  76. package/dist/es/standards-sdk.es129.js.map +1 -1
  77. package/dist/es/standards-sdk.es130.js +72 -112
  78. package/dist/es/standards-sdk.es130.js.map +1 -1
  79. package/dist/es/standards-sdk.es131.js +760 -213
  80. package/dist/es/standards-sdk.es131.js.map +1 -1
  81. package/dist/es/standards-sdk.es132.js +53 -173
  82. package/dist/es/standards-sdk.es132.js.map +1 -1
  83. package/dist/es/standards-sdk.es133.js +156 -119
  84. package/dist/es/standards-sdk.es133.js.map +1 -1
  85. package/dist/es/standards-sdk.es134.js +8 -327
  86. package/dist/es/standards-sdk.es134.js.map +1 -1
  87. package/dist/es/standards-sdk.es135.js +74 -452
  88. package/dist/es/standards-sdk.es135.js.map +1 -1
  89. package/dist/es/standards-sdk.es136.js +61 -13
  90. package/dist/es/standards-sdk.es136.js.map +1 -1
  91. package/dist/es/standards-sdk.es137.js +30 -81
  92. package/dist/es/standards-sdk.es137.js.map +1 -1
  93. package/dist/es/standards-sdk.es138.js +34 -87
  94. package/dist/es/standards-sdk.es138.js.map +1 -1
  95. package/dist/es/standards-sdk.es139.js +28 -60
  96. package/dist/es/standards-sdk.es139.js.map +1 -1
  97. package/dist/es/standards-sdk.es140.js +121 -142
  98. package/dist/es/standards-sdk.es140.js.map +1 -1
  99. package/dist/es/standards-sdk.es141.js +42 -7
  100. package/dist/es/standards-sdk.es141.js.map +1 -1
  101. package/dist/es/standards-sdk.es142.js +12255 -52
  102. package/dist/es/standards-sdk.es142.js.map +1 -1
  103. package/dist/es/standards-sdk.es143.js +49 -58
  104. package/dist/es/standards-sdk.es143.js.map +1 -1
  105. package/dist/es/standards-sdk.es144.js +84 -30
  106. package/dist/es/standards-sdk.es144.js.map +1 -1
  107. package/dist/es/standards-sdk.es145.js +17 -34
  108. package/dist/es/standards-sdk.es145.js.map +1 -1
  109. package/dist/es/standards-sdk.es146.js +172 -28
  110. package/dist/es/standards-sdk.es146.js.map +1 -1
  111. package/dist/es/standards-sdk.es147.js +322 -959
  112. package/dist/es/standards-sdk.es147.js.map +1 -1
  113. package/dist/es/standards-sdk.es148.js +293 -12236
  114. package/dist/es/standards-sdk.es148.js.map +1 -1
  115. package/dist/es/standards-sdk.es149.js +427 -112
  116. package/dist/es/standards-sdk.es149.js.map +1 -1
  117. package/dist/es/standards-sdk.es150.js +329 -40
  118. package/dist/es/standards-sdk.es150.js.map +1 -1
  119. package/dist/es/standards-sdk.es151.js +69 -49
  120. package/dist/es/standards-sdk.es151.js.map +1 -1
  121. package/dist/es/standards-sdk.es152.js +153 -65
  122. package/dist/es/standards-sdk.es152.js.map +1 -1
  123. package/dist/es/standards-sdk.es153.js +219 -14
  124. package/dist/es/standards-sdk.es153.js.map +1 -1
  125. package/dist/es/standards-sdk.es154.js +223 -156
  126. package/dist/es/standards-sdk.es154.js.map +1 -1
  127. package/dist/es/standards-sdk.es155.js +112 -315
  128. package/dist/es/standards-sdk.es155.js.map +1 -1
  129. package/dist/es/standards-sdk.es156.js +116 -336
  130. package/dist/es/standards-sdk.es156.js.map +1 -1
  131. package/dist/es/standards-sdk.es157.js +151 -443
  132. package/dist/es/standards-sdk.es157.js.map +1 -1
  133. package/dist/es/standards-sdk.es158.js +170 -316
  134. package/dist/es/standards-sdk.es158.js.map +1 -1
  135. package/dist/es/standards-sdk.es159.js +132 -69
  136. package/dist/es/standards-sdk.es159.js.map +1 -1
  137. package/dist/es/standards-sdk.es16.js +3 -10
  138. package/dist/es/standards-sdk.es16.js.map +1 -1
  139. package/dist/es/standards-sdk.es160.js +300 -208
  140. package/dist/es/standards-sdk.es160.js.map +1 -1
  141. package/dist/es/standards-sdk.es161.js +16 -1
  142. package/dist/es/standards-sdk.es161.js.map +1 -1
  143. package/dist/es/standards-sdk.es18.js +6 -13
  144. package/dist/es/standards-sdk.es18.js.map +1 -1
  145. package/dist/es/standards-sdk.es19.js +4 -11
  146. package/dist/es/standards-sdk.es19.js.map +1 -1
  147. package/dist/es/standards-sdk.es22.js +1 -1
  148. package/dist/es/standards-sdk.es27.js +6 -13
  149. package/dist/es/standards-sdk.es27.js.map +1 -1
  150. package/dist/es/standards-sdk.es30.js +1 -1
  151. package/dist/es/standards-sdk.es31.js +1 -1
  152. package/dist/es/standards-sdk.es35.js +5 -11
  153. package/dist/es/standards-sdk.es35.js.map +1 -1
  154. package/dist/es/standards-sdk.es36.js +3 -3
  155. package/dist/es/standards-sdk.es37.js +1 -1
  156. package/dist/es/standards-sdk.es4.js +1 -1
  157. package/dist/es/standards-sdk.es53.js +1 -1
  158. package/dist/es/standards-sdk.es56.js +1 -1
  159. package/dist/es/standards-sdk.es58.js +1 -1
  160. package/dist/es/standards-sdk.es59.js +1 -1
  161. package/dist/es/standards-sdk.es60.js +4 -11
  162. package/dist/es/standards-sdk.es60.js.map +1 -1
  163. package/dist/es/standards-sdk.es62.js +1 -1
  164. package/dist/es/standards-sdk.es64.js +1 -1
  165. package/dist/es/standards-sdk.es65.js +2 -2
  166. package/dist/es/standards-sdk.es68.js +2 -2
  167. package/dist/es/standards-sdk.es69.js +1 -1
  168. package/dist/es/standards-sdk.es7.js +1 -1
  169. package/dist/es/standards-sdk.es71.js +1 -1
  170. package/dist/es/standards-sdk.es76.js +1 -1
  171. package/dist/es/standards-sdk.es77.js +3 -10
  172. package/dist/es/standards-sdk.es77.js.map +1 -1
  173. package/dist/es/standards-sdk.es78.js +1 -1
  174. package/dist/es/standards-sdk.es81.js +1 -1
  175. package/dist/es/standards-sdk.es83.js +1 -1
  176. package/dist/es/standards-sdk.es87.js +3 -3
  177. package/dist/es/standards-sdk.es91.js +1 -1
  178. package/dist/es/standards-sdk.es92.js +1 -1
  179. package/dist/es/standards-sdk.es97.js +1 -1
  180. package/dist/es/standards-sdk.es99.js +1 -1
  181. package/package.json +63 -73
@@ -1,87 +1,175 @@
1
- import { isBrowser } from "./standards-sdk.es118.js";
2
- let nodeRequire;
3
- function isModuleNotFound(specifier, error) {
4
- if (!error || typeof error !== "object") {
5
- return false;
1
+ import * as path from "path";
2
+ import { Buffer } from "buffer";
3
+ import { randomBytes } from "crypto";
4
+ import { secp256k1 } from "@noble/curves/secp256k1.js";
5
+ import { registerEncryptionKeyResponseSchema } from "./standards-sdk.es127.js";
6
+ import { optionalImport } from "./standards-sdk.es144.js";
7
+ const getFs = async () => {
8
+ const fsModule = await optionalImport("node:fs");
9
+ if (fsModule && typeof fsModule.existsSync === "function" && typeof fsModule.readFileSync === "function" && typeof fsModule.writeFileSync === "function" && typeof fsModule.appendFileSync === "function") {
10
+ return fsModule;
6
11
  }
7
- const code = Reflect.get(error, "code");
8
- const message = Reflect.get(error, "message");
9
- const messageText = typeof message === "string" ? message : "";
10
- if (typeof code === "string" && code.includes("MODULE_NOT_FOUND")) {
11
- return messageText.includes(specifier);
12
+ return null;
13
+ };
14
+ async function registerEncryptionKey(client, payload) {
15
+ const raw = await client.requestJson("/encryption/keys", {
16
+ method: "POST",
17
+ headers: { "content-type": "application/json" },
18
+ body: payload
19
+ });
20
+ return client.parseWithSchema(
21
+ raw,
22
+ registerEncryptionKeyResponseSchema,
23
+ "register encryption key response"
24
+ );
25
+ }
26
+ function normalizeAutoRegisterIdentity(config) {
27
+ const identity = {};
28
+ if (config.uaid) {
29
+ identity.uaid = config.uaid;
12
30
  }
13
- if (messageText) {
14
- const lowered = messageText.toLowerCase();
15
- if (lowered.includes("cannot find module") || lowered.includes("module not found") || lowered.includes("cannot find package")) {
16
- return lowered.includes(specifier.toLowerCase());
31
+ if (config.ledgerAccountId) {
32
+ identity.ledgerAccountId = config.ledgerAccountId;
33
+ if (config.ledgerNetwork) {
34
+ identity.ledgerNetwork = config.ledgerNetwork;
17
35
  }
18
36
  }
19
- return false;
37
+ if (config.email) {
38
+ identity.email = config.email;
39
+ }
40
+ if (identity.uaid || identity.ledgerAccountId || identity.email) {
41
+ return identity;
42
+ }
43
+ return null;
44
+ }
45
+ function derivePublicKeyFromPrivateKey(client, privateKey) {
46
+ const normalized = client.hexToBuffer(privateKey);
47
+ const publicKey = secp256k1.getPublicKey(normalized, true);
48
+ return Buffer.from(publicKey).toString("hex");
20
49
  }
21
- async function resolveNodeRequire() {
22
- if (nodeRequire !== void 0) {
23
- return nodeRequire;
50
+ async function resolveAutoRegisterKeyMaterial(client, config) {
51
+ if (config.publicKey?.trim()) {
52
+ return { publicKey: config.publicKey.trim() };
24
53
  }
25
- if (isBrowser) {
26
- nodeRequire = null;
27
- return nodeRequire;
54
+ let privateKey = config.privateKey?.trim();
55
+ const envVar = config.envVar ?? "RB_ENCRYPTION_PRIVATE_KEY";
56
+ if (!privateKey && envVar && process?.env?.[envVar]?.trim()) {
57
+ privateKey = process.env[envVar]?.trim();
28
58
  }
29
- try {
30
- const globalObject = typeof global !== "undefined" ? global : globalThis;
31
- const req = globalObject.process?.mainModule?.require ?? globalObject.require;
32
- nodeRequire = typeof req === "function" && typeof req.resolve === "function" ? req : null;
33
- } catch {
34
- nodeRequire = null;
59
+ if (!privateKey && config.generateIfMissing) {
60
+ const pair = await client.generateEncryptionKeyPair({
61
+ keyType: config.keyType ?? "secp256k1",
62
+ envVar,
63
+ envPath: config.envPath,
64
+ overwrite: config.overwriteEnv
65
+ });
66
+ return { publicKey: pair.publicKey, privateKey: pair.privateKey };
35
67
  }
36
- return nodeRequire;
37
- }
38
- async function dynamicImport(specifier) {
39
- try {
40
- return await import(specifier);
41
- } catch (error) {
42
- if (isModuleNotFound(specifier, error)) {
43
- return null;
44
- }
45
- throw error;
68
+ if (privateKey) {
69
+ const publicKey = derivePublicKeyFromPrivateKey(client, privateKey);
70
+ return { publicKey, privateKey };
46
71
  }
72
+ return null;
47
73
  }
48
- async function optionalImport(specifier, options = {}) {
49
- if (isBrowser) {
50
- return dynamicImport(specifier);
74
+ async function autoRegisterEncryptionKey(client, config) {
75
+ const identity = normalizeAutoRegisterIdentity(config);
76
+ if (!identity) {
77
+ throw new Error(
78
+ "Auto-registration requires uaid, ledgerAccountId, or email"
79
+ );
51
80
  }
52
- if (!options.preferImport) {
53
- const requireFn = await resolveNodeRequire();
54
- if (requireFn) {
55
- try {
56
- return requireFn(specifier);
57
- } catch (error) {
58
- if (!isModuleNotFound(specifier, error)) {
59
- throw error;
60
- }
61
- }
62
- }
81
+ const material = await resolveAutoRegisterKeyMaterial(client, config);
82
+ if (!material) {
83
+ throw new Error(
84
+ "Unable to resolve encryption public key for auto-registration"
85
+ );
63
86
  }
64
- return dynamicImport(specifier);
87
+ await registerEncryptionKey(client, {
88
+ keyType: config.keyType ?? "secp256k1",
89
+ publicKey: material.publicKey,
90
+ ...identity
91
+ });
92
+ return material;
93
+ }
94
+ async function ensureAgentEncryptionKey(client, options) {
95
+ return autoRegisterEncryptionKey(client, {
96
+ ...options,
97
+ uaid: options.uaid
98
+ });
99
+ }
100
+ function createEncryptionApi(client) {
101
+ return {
102
+ registerKey: (payload) => registerEncryptionKey(client, payload),
103
+ generateEphemeralKeyPair: () => client.createEphemeralKeyPair(),
104
+ deriveSharedSecret: (options) => client.deriveSharedSecret(options),
105
+ encryptCipherEnvelope: (options) => client.buildCipherEnvelope(options),
106
+ decryptCipherEnvelope: (options) => client.openCipherEnvelope(options),
107
+ ensureAgentKey: (options) => ensureAgentEncryptionKey(client, options)
108
+ };
65
109
  }
66
- function optionalImportSync(specifier) {
67
- if (isBrowser) {
110
+ async function bootstrapEncryptionOptions(client, options) {
111
+ if (!options?.autoRegister || options.autoRegister.enabled === false) {
68
112
  return null;
69
113
  }
70
- try {
71
- const globalObject = typeof global !== "undefined" ? global : globalThis;
72
- const req = globalObject.process?.mainModule?.require ?? globalObject.require;
73
- if (typeof req === "function" && typeof req.resolve === "function") {
74
- return req(specifier);
114
+ return autoRegisterEncryptionKey(client, options.autoRegister);
115
+ }
116
+ async function generateEncryptionKeyPair(client, options = {}) {
117
+ client.assertNodeRuntime("generateEncryptionKeyPair");
118
+ const keyType = options.keyType ?? "secp256k1";
119
+ if (keyType !== "secp256k1") {
120
+ throw new Error("Only secp256k1 key generation is supported currently");
121
+ }
122
+ const privateKeyBytes = randomBytes(32);
123
+ const privateKey = Buffer.from(privateKeyBytes).toString("hex");
124
+ const publicKeyBytes = secp256k1.getPublicKey(privateKeyBytes, true);
125
+ const publicKey = Buffer.from(publicKeyBytes).toString("hex");
126
+ const envVar = options.envVar ?? "RB_ENCRYPTION_PRIVATE_KEY";
127
+ const resolvedPath = options.envPath ? path.resolve(options.envPath) : void 0;
128
+ if (resolvedPath) {
129
+ const fsModule = await getFs();
130
+ if (!fsModule) {
131
+ throw new Error(
132
+ "File system module is not available; cannot write encryption key env file"
133
+ );
75
134
  }
76
- } catch (error) {
77
- if (!isModuleNotFound(specifier, error)) {
78
- throw error;
135
+ const envLine = `${envVar}=${privateKey}`;
136
+ if (fsModule.existsSync(resolvedPath)) {
137
+ const content = fsModule.readFileSync(resolvedPath, "utf-8");
138
+ const lineRegex = new RegExp(`^${envVar}=.*$`, "m");
139
+ if (lineRegex.test(content)) {
140
+ if (!options.overwrite) {
141
+ throw new Error(
142
+ `${envVar} already exists in ${resolvedPath}; set overwrite=true to replace it`
143
+ );
144
+ }
145
+ const updated = content.replace(lineRegex, envLine);
146
+ fsModule.writeFileSync(resolvedPath, updated);
147
+ } else {
148
+ const needsNewline = !content.endsWith("\n");
149
+ fsModule.appendFileSync(
150
+ resolvedPath,
151
+ `${needsNewline ? "\n" : ""}${envLine}
152
+ `
153
+ );
154
+ }
155
+ } else {
156
+ fsModule.writeFileSync(resolvedPath, `${envLine}
157
+ `);
79
158
  }
80
159
  }
81
- return null;
160
+ return {
161
+ privateKey,
162
+ publicKey,
163
+ envPath: resolvedPath,
164
+ envVar
165
+ };
82
166
  }
83
167
  export {
84
- optionalImport,
85
- optionalImportSync
168
+ autoRegisterEncryptionKey,
169
+ bootstrapEncryptionOptions,
170
+ createEncryptionApi,
171
+ ensureAgentEncryptionKey,
172
+ generateEncryptionKeyPair,
173
+ registerEncryptionKey
86
174
  };
87
175
  //# sourceMappingURL=standards-sdk.es152.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es152.js","sources":["../../src/utils/dynamic-import.ts"],"sourcesContent":["import { isBrowser } from './is-browser';\n\nlet nodeRequire: NodeRequire | null | undefined;\n\nfunction isModuleNotFound(specifier: string, error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n const code = Reflect.get(error, 'code');\n const message = Reflect.get(error, 'message');\n const messageText = typeof message === 'string' ? message : '';\n\n if (typeof code === 'string' && code.includes('MODULE_NOT_FOUND')) {\n return messageText.includes(specifier);\n }\n\n if (messageText) {\n const lowered = messageText.toLowerCase();\n if (\n lowered.includes('cannot find module') ||\n lowered.includes('module not found') ||\n lowered.includes('cannot find package')\n ) {\n return lowered.includes(specifier.toLowerCase());\n }\n }\n\n return false;\n}\n\nasync function resolveNodeRequire(): Promise<NodeRequire | null> {\n if (nodeRequire !== undefined) {\n return nodeRequire;\n }\n\n if (isBrowser) {\n nodeRequire = null;\n return nodeRequire;\n }\n\n try {\n const globalObject =\n typeof global !== 'undefined'\n ? (global as typeof globalThis)\n : globalThis;\n const req =\n globalObject.process?.mainModule?.require ??\n (globalObject as { require?: NodeRequire }).require;\n\n nodeRequire =\n typeof req === 'function' &&\n typeof (req as NodeRequire).resolve === 'function'\n ? (req as NodeRequire)\n : null;\n } catch {\n nodeRequire = null;\n }\n\n return nodeRequire;\n}\n\nasync function dynamicImport<T>(specifier: string): Promise<T | null> {\n try {\n return (await import(specifier)) as T;\n } catch (error) {\n if (isModuleNotFound(specifier, error)) {\n return null;\n }\n throw error as Error;\n }\n}\n\ntype OptionalImportOptions = {\n preferImport?: boolean;\n};\n\nexport async function optionalImport<T>(\n specifier: string,\n options: OptionalImportOptions = {},\n): Promise<T | null> {\n if (isBrowser) {\n return dynamicImport<T>(specifier);\n }\n\n if (!options.preferImport) {\n const requireFn = await resolveNodeRequire();\n if (requireFn) {\n try {\n return requireFn(specifier) as T;\n } catch (error) {\n if (!isModuleNotFound(specifier, error)) {\n throw error as Error;\n }\n }\n }\n }\n\n return dynamicImport<T>(specifier);\n}\n\nexport function optionalImportSync<T>(specifier: string): T | null {\n if (isBrowser) {\n return null;\n }\n\n try {\n const globalObject =\n typeof global !== 'undefined'\n ? (global as typeof globalThis)\n : globalThis;\n const req =\n globalObject.process?.mainModule?.require ??\n (globalObject as { require?: NodeRequire }).require;\n\n if (\n typeof req === 'function' &&\n typeof (req as NodeRequire).resolve === 'function'\n ) {\n return req(specifier) as T;\n }\n } catch (error) {\n if (!isModuleNotFound(specifier, error)) {\n throw error as Error;\n }\n }\n\n return null;\n}\n"],"names":[],"mappings":";AAEA,IAAI;AAEJ,SAAS,iBAAiB,WAAmB,OAAyB;AACpE,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AACA,QAAM,OAAO,QAAQ,IAAI,OAAO,MAAM;AACtC,QAAM,UAAU,QAAQ,IAAI,OAAO,SAAS;AAC5C,QAAM,cAAc,OAAO,YAAY,WAAW,UAAU;AAE5D,MAAI,OAAO,SAAS,YAAY,KAAK,SAAS,kBAAkB,GAAG;AACjE,WAAO,YAAY,SAAS,SAAS;AAAA,EACvC;AAEA,MAAI,aAAa;AACf,UAAM,UAAU,YAAY,YAAA;AAC5B,QACE,QAAQ,SAAS,oBAAoB,KACrC,QAAQ,SAAS,kBAAkB,KACnC,QAAQ,SAAS,qBAAqB,GACtC;AACA,aAAO,QAAQ,SAAS,UAAU,YAAA,CAAa;AAAA,IACjD;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,qBAAkD;AAC/D,MAAI,gBAAgB,QAAW;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,WAAW;AACb,kBAAc;AACd,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,eACJ,OAAO,WAAW,cACb,SACD;AACN,UAAM,MACJ,aAAa,SAAS,YAAY,WACjC,aAA2C;AAE9C,kBACE,OAAO,QAAQ,cACf,OAAQ,IAAoB,YAAY,aACnC,MACD;AAAA,EACR,QAAQ;AACN,kBAAc;AAAA,EAChB;AAEA,SAAO;AACT;AAEA,eAAe,cAAiB,WAAsC;AACpE,MAAI;AACF,WAAQ,MAAM,OAAO;AAAA,EACvB,SAAS,OAAO;AACd,QAAI,iBAAiB,WAAW,KAAK,GAAG;AACtC,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;AAMA,eAAsB,eACpB,WACA,UAAiC,IACd;AACnB,MAAI,WAAW;AACb,WAAO,cAAiB,SAAS;AAAA,EACnC;AAEA,MAAI,CAAC,QAAQ,cAAc;AACzB,UAAM,YAAY,MAAM,mBAAA;AACxB,QAAI,WAAW;AACb,UAAI;AACF,eAAO,UAAU,SAAS;AAAA,MAC5B,SAAS,OAAO;AACd,YAAI,CAAC,iBAAiB,WAAW,KAAK,GAAG;AACvC,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,cAAiB,SAAS;AACnC;AAEO,SAAS,mBAAsB,WAA6B;AACjE,MAAI,WAAW;AACb,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,eACJ,OAAO,WAAW,cACb,SACD;AACN,UAAM,MACJ,aAAa,SAAS,YAAY,WACjC,aAA2C;AAE9C,QACE,OAAO,QAAQ,cACf,OAAQ,IAAoB,YAAY,YACxC;AACA,aAAO,IAAI,SAAS;AAAA,IACtB;AAAA,EACF,SAAS,OAAO;AACd,QAAI,CAAC,iBAAiB,WAAW,KAAK,GAAG;AACvC,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AACT;"}
1
+ {"version":3,"file":"standards-sdk.es152.js","sources":["../../src/services/registry-broker/client/encryption.ts"],"sourcesContent":["import * as path from 'path';\nimport { Buffer } from 'buffer';\nimport { randomBytes } from 'crypto';\nimport { secp256k1 } from '@noble/curves/secp256k1.js';\nimport type {\n AutoRegisterEncryptionKeyOptions,\n CipherEnvelope,\n ClientEncryptionOptions,\n DecryptCipherEnvelopeOptions,\n DeriveSharedSecretOptions,\n EncryptCipherEnvelopeOptions,\n EphemeralKeyPair,\n EnsureAgentKeyOptions,\n RegisterEncryptionKeyPayload,\n RegisterEncryptionKeyResponse,\n SharedSecretInput,\n} from '../types';\nimport { registerEncryptionKeyResponseSchema } from '../schemas';\nimport { optionalImport } from '../../../utils/dynamic-import';\nimport type {\n RegistryBrokerClient,\n GenerateEncryptionKeyPairOptions,\n} from './base-client';\n\ntype FsModule = {\n existsSync: (path: string) => boolean;\n readFileSync: (path: string, encoding: BufferEncoding) => string;\n writeFileSync: (path: string, data: string) => void;\n appendFileSync: (path: string, data: string) => void;\n};\n\nconst getFs = async (): Promise<FsModule | null> => {\n const fsModule = await optionalImport<Partial<FsModule>>('node:fs');\n\n if (\n fsModule &&\n typeof fsModule.existsSync === 'function' &&\n typeof fsModule.readFileSync === 'function' &&\n typeof fsModule.writeFileSync === 'function' &&\n typeof fsModule.appendFileSync === 'function'\n ) {\n return fsModule as FsModule;\n }\n\n return null;\n};\n\nexport interface RegistryBrokerEncryptionApi {\n registerKey: (\n payload: RegisterEncryptionKeyPayload,\n ) => Promise<RegisterEncryptionKeyResponse>;\n generateEphemeralKeyPair: () => EphemeralKeyPair;\n deriveSharedSecret: (options: DeriveSharedSecretOptions) => Buffer;\n encryptCipherEnvelope: (\n options: EncryptCipherEnvelopeOptions,\n ) => CipherEnvelope;\n decryptCipherEnvelope: (options: DecryptCipherEnvelopeOptions) => string;\n ensureAgentKey: (\n options: EnsureAgentKeyOptions,\n ) => Promise<{ publicKey: string; privateKey?: string }>;\n}\n\nexport async function registerEncryptionKey(\n client: RegistryBrokerClient,\n payload: RegisterEncryptionKeyPayload,\n): Promise<RegisterEncryptionKeyResponse> {\n const raw = await client.requestJson('/encryption/keys', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: payload,\n });\n return client.parseWithSchema(\n raw,\n registerEncryptionKeyResponseSchema,\n 'register encryption key response',\n );\n}\n\nfunction normalizeAutoRegisterIdentity(\n config: AutoRegisterEncryptionKeyOptions,\n): Pick<\n RegisterEncryptionKeyPayload,\n 'uaid' | 'ledgerAccountId' | 'ledgerNetwork' | 'email'\n> | null {\n const identity: Pick<\n RegisterEncryptionKeyPayload,\n 'uaid' | 'ledgerAccountId' | 'ledgerNetwork' | 'email'\n > = {};\n if (config.uaid) {\n identity.uaid = config.uaid;\n }\n if (config.ledgerAccountId) {\n identity.ledgerAccountId = config.ledgerAccountId;\n if (config.ledgerNetwork) {\n identity.ledgerNetwork = config.ledgerNetwork;\n }\n }\n if (config.email) {\n identity.email = config.email;\n }\n if (identity.uaid || identity.ledgerAccountId || identity.email) {\n return identity;\n }\n return null;\n}\n\nfunction derivePublicKeyFromPrivateKey(\n client: RegistryBrokerClient,\n privateKey: string,\n): string {\n const normalized = client.hexToBuffer(privateKey);\n const publicKey = secp256k1.getPublicKey(normalized, true);\n return Buffer.from(publicKey).toString('hex');\n}\n\nasync function resolveAutoRegisterKeyMaterial(\n client: RegistryBrokerClient,\n config: AutoRegisterEncryptionKeyOptions,\n): Promise<{ publicKey: string; privateKey?: string } | null> {\n if (config.publicKey?.trim()) {\n return { publicKey: config.publicKey.trim() };\n }\n let privateKey = config.privateKey?.trim();\n const envVar = config.envVar ?? 'RB_ENCRYPTION_PRIVATE_KEY';\n if (!privateKey && envVar && process?.env?.[envVar]?.trim()) {\n privateKey = process.env[envVar]?.trim();\n }\n if (!privateKey && config.generateIfMissing) {\n const pair = await client.generateEncryptionKeyPair({\n keyType: config.keyType ?? 'secp256k1',\n envVar,\n envPath: config.envPath,\n overwrite: config.overwriteEnv,\n });\n return { publicKey: pair.publicKey, privateKey: pair.privateKey };\n }\n if (privateKey) {\n const publicKey = derivePublicKeyFromPrivateKey(client, privateKey);\n return { publicKey, privateKey };\n }\n return null;\n}\n\nexport async function autoRegisterEncryptionKey(\n client: RegistryBrokerClient,\n config: AutoRegisterEncryptionKeyOptions,\n): Promise<{ publicKey: string; privateKey?: string }> {\n const identity = normalizeAutoRegisterIdentity(config);\n if (!identity) {\n throw new Error(\n 'Auto-registration requires uaid, ledgerAccountId, or email',\n );\n }\n const material = await resolveAutoRegisterKeyMaterial(client, config);\n if (!material) {\n throw new Error(\n 'Unable to resolve encryption public key for auto-registration',\n );\n }\n await registerEncryptionKey(client, {\n keyType: config.keyType ?? 'secp256k1',\n publicKey: material.publicKey,\n ...identity,\n });\n return material;\n}\n\nexport async function ensureAgentEncryptionKey(\n client: RegistryBrokerClient,\n options: EnsureAgentKeyOptions,\n): Promise<{ publicKey: string; privateKey?: string }> {\n return autoRegisterEncryptionKey(client, {\n ...options,\n uaid: options.uaid,\n enabled: true,\n });\n}\n\nexport function createEncryptionApi(\n client: RegistryBrokerClient,\n): RegistryBrokerEncryptionApi {\n return {\n registerKey: (payload: RegisterEncryptionKeyPayload) =>\n registerEncryptionKey(client, payload),\n generateEphemeralKeyPair: () => client.createEphemeralKeyPair(),\n deriveSharedSecret: (options: DeriveSharedSecretOptions) =>\n client.deriveSharedSecret(options),\n encryptCipherEnvelope: (options: EncryptCipherEnvelopeOptions) =>\n client.buildCipherEnvelope(options),\n decryptCipherEnvelope: (options: DecryptCipherEnvelopeOptions) =>\n client.openCipherEnvelope(options),\n ensureAgentKey: (options: EnsureAgentKeyOptions) =>\n ensureAgentEncryptionKey(client, options),\n };\n}\n\nexport async function bootstrapEncryptionOptions(\n client: RegistryBrokerClient,\n options?: ClientEncryptionOptions,\n): Promise<{ publicKey: string; privateKey?: string } | null> {\n if (!options?.autoRegister || options.autoRegister.enabled === false) {\n return null;\n }\n return autoRegisterEncryptionKey(client, options.autoRegister);\n}\n\nexport async function generateEncryptionKeyPair(\n client: RegistryBrokerClient,\n options: GenerateEncryptionKeyPairOptions = {},\n): Promise<{\n privateKey: string;\n publicKey: string;\n envPath?: string;\n envVar: string;\n}> {\n client.assertNodeRuntime('generateEncryptionKeyPair');\n\n const keyType = options.keyType ?? 'secp256k1';\n if (keyType !== 'secp256k1') {\n throw new Error('Only secp256k1 key generation is supported currently');\n }\n\n const privateKeyBytes = randomBytes(32);\n const privateKey = Buffer.from(privateKeyBytes).toString('hex');\n const publicKeyBytes = secp256k1.getPublicKey(privateKeyBytes, true);\n const publicKey = Buffer.from(publicKeyBytes).toString('hex');\n\n const envVar = options.envVar ?? 'RB_ENCRYPTION_PRIVATE_KEY';\n const resolvedPath = options.envPath\n ? path.resolve(options.envPath)\n : undefined;\n\n if (resolvedPath) {\n const fsModule = await getFs();\n\n if (!fsModule) {\n throw new Error(\n 'File system module is not available; cannot write encryption key env file',\n );\n }\n\n const envLine = `${envVar}=${privateKey}`;\n if (fsModule.existsSync(resolvedPath)) {\n const content = fsModule.readFileSync(resolvedPath, 'utf-8');\n const lineRegex = new RegExp(`^${envVar}=.*$`, 'm');\n if (lineRegex.test(content)) {\n if (!options.overwrite) {\n throw new Error(\n `${envVar} already exists in ${resolvedPath}; set overwrite=true to replace it`,\n );\n }\n const updated = content.replace(lineRegex, envLine);\n fsModule.writeFileSync(resolvedPath, updated);\n } else {\n const needsNewline = !content.endsWith('\\n');\n fsModule.appendFileSync(\n resolvedPath,\n `${needsNewline ? '\\n' : ''}${envLine}\\n`,\n );\n }\n } else {\n fsModule.writeFileSync(resolvedPath, `${envLine}\\n`);\n }\n }\n\n return {\n privateKey,\n publicKey,\n envPath: resolvedPath,\n envVar,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -1,20 +1,225 @@
1
- import { Logger } from "./standards-sdk.es105.js";
2
- import { HederaMirrorNode } from "./standards-sdk.es126.js";
3
- class HCS5BaseClient {
4
- /**
5
- * Create a new HCS-5 base client
6
- */
7
- constructor(config) {
8
- this.network = config.network;
9
- this.logger = config.logger || Logger.getInstance({
10
- level: config.logLevel || "info",
11
- module: "HCS5Client",
12
- silent: config.silent
1
+ import { searchResponseSchema, statsResponseSchema, registriesResponseSchema, additionalRegistryCatalogResponseSchema, popularResponseSchema, protocolsResponseSchema, detectProtocolResponseSchema, registrySearchByNamespaceSchema, vectorSearchResponseSchema, searchStatusResponseSchema, websocketStatsResponseSchema, metricsSummaryResponseSchema, searchFacetsResponseSchema } from "./standards-sdk.es127.js";
2
+ import { buildSearchQuery } from "./standards-sdk.es154.js";
3
+ import { RegistryBrokerError } from "./standards-sdk.es128.js";
4
+ function buildVectorFallbackSearchParams(request) {
5
+ const params = {
6
+ q: request.query
7
+ };
8
+ let effectiveLimit;
9
+ if (typeof request.limit === "number" && Number.isFinite(request.limit)) {
10
+ effectiveLimit = request.limit;
11
+ params.limit = request.limit;
12
+ }
13
+ if (typeof request.offset === "number" && Number.isFinite(request.offset) && request.offset > 0) {
14
+ const limit = effectiveLimit && effectiveLimit > 0 ? effectiveLimit : 20;
15
+ params.limit = limit;
16
+ params.page = Math.floor(request.offset / limit) + 1;
17
+ }
18
+ if (request.filter?.registry) {
19
+ params.registry = request.filter.registry;
20
+ }
21
+ if (request.filter?.protocols?.length) {
22
+ params.protocols = [...request.filter.protocols];
23
+ }
24
+ if (request.filter?.adapter?.length) {
25
+ params.adapters = [...request.filter.adapter];
26
+ }
27
+ if (request.filter?.capabilities?.length) {
28
+ params.capabilities = request.filter.capabilities.map(
29
+ (value) => typeof value === "number" ? value.toString(10) : value
30
+ );
31
+ }
32
+ if (request.filter?.type) {
33
+ params.type = request.filter.type;
34
+ }
35
+ return params;
36
+ }
37
+ function convertSearchResultToVectorResponse(result) {
38
+ const hits = result.hits.map((agent) => ({
39
+ agent,
40
+ score: 0,
41
+ highlights: {}
42
+ }));
43
+ const total = result.total;
44
+ const limit = result.limit;
45
+ const page = result.page;
46
+ const totalVisible = page * limit;
47
+ const limited = total > totalVisible || page > 1;
48
+ return {
49
+ hits,
50
+ total,
51
+ took: 0,
52
+ totalAvailable: total,
53
+ visible: hits.length,
54
+ limited,
55
+ credits_used: 0
56
+ };
57
+ }
58
+ async function search(client, params = {}) {
59
+ const query = buildSearchQuery(params);
60
+ const raw = await client.requestJson(`/search${query}`, {
61
+ method: "GET"
62
+ });
63
+ return client.parseWithSchema(raw, searchResponseSchema, "search response");
64
+ }
65
+ async function stats(client) {
66
+ const raw = await client.requestJson("/stats", { method: "GET" });
67
+ return client.parseWithSchema(raw, statsResponseSchema, "stats response");
68
+ }
69
+ async function registries(client) {
70
+ const raw = await client.requestJson("/registries", {
71
+ method: "GET"
72
+ });
73
+ return client.parseWithSchema(
74
+ raw,
75
+ registriesResponseSchema,
76
+ "registries response"
77
+ );
78
+ }
79
+ async function getAdditionalRegistries(client) {
80
+ const raw = await client.requestJson(
81
+ "/register/additional-registries",
82
+ {
83
+ method: "GET"
84
+ }
85
+ );
86
+ return client.parseWithSchema(
87
+ raw,
88
+ additionalRegistryCatalogResponseSchema,
89
+ "additional registry catalog response"
90
+ );
91
+ }
92
+ async function popularSearches(client) {
93
+ const raw = await client.requestJson("/popular", {
94
+ method: "GET"
95
+ });
96
+ return client.parseWithSchema(
97
+ raw,
98
+ popularResponseSchema,
99
+ "popular searches response"
100
+ );
101
+ }
102
+ async function listProtocols(client) {
103
+ const raw = await client.requestJson("/protocols", {
104
+ method: "GET"
105
+ });
106
+ return client.parseWithSchema(
107
+ raw,
108
+ protocolsResponseSchema,
109
+ "protocols response"
110
+ );
111
+ }
112
+ async function detectProtocol(client, message) {
113
+ const raw = await client.requestJson("/detect-protocol", {
114
+ method: "POST",
115
+ body: { message },
116
+ headers: { "content-type": "application/json" }
117
+ });
118
+ return client.parseWithSchema(
119
+ raw,
120
+ detectProtocolResponseSchema,
121
+ "detect protocol response"
122
+ );
123
+ }
124
+ async function registrySearchByNamespace(client, registry, query) {
125
+ const params = new URLSearchParams();
126
+ if (query) {
127
+ params.set("q", query);
128
+ }
129
+ const suffix = params.size > 0 ? `?${params.toString()}` : "";
130
+ const raw = await client.requestJson(
131
+ `/registries/${encodeURIComponent(registry)}/search${suffix}`,
132
+ {
133
+ method: "GET"
134
+ }
135
+ );
136
+ return client.parseWithSchema(
137
+ raw,
138
+ registrySearchByNamespaceSchema,
139
+ "registry search response"
140
+ );
141
+ }
142
+ async function vectorSearch(client, request) {
143
+ try {
144
+ const raw = await client.requestJson("/search", {
145
+ method: "POST",
146
+ body: request,
147
+ headers: { "content-type": "application/json" }
13
148
  });
14
- this.mirrorNode = new HederaMirrorNode(this.network, this.logger);
149
+ return client.parseWithSchema(
150
+ raw,
151
+ vectorSearchResponseSchema,
152
+ "vector search response"
153
+ );
154
+ } catch (error) {
155
+ if (error instanceof RegistryBrokerError && error.status === 501) {
156
+ const fallback = await search(
157
+ client,
158
+ buildVectorFallbackSearchParams(request)
159
+ );
160
+ return convertSearchResultToVectorResponse(fallback);
161
+ }
162
+ throw error;
163
+ }
164
+ }
165
+ async function searchStatus(client) {
166
+ const raw = await client.requestJson("/search/status", {
167
+ method: "GET"
168
+ });
169
+ return client.parseWithSchema(
170
+ raw,
171
+ searchStatusResponseSchema,
172
+ "search status response"
173
+ );
174
+ }
175
+ async function websocketStats(client) {
176
+ const raw = await client.requestJson("/websocket/stats", {
177
+ method: "GET"
178
+ });
179
+ return client.parseWithSchema(
180
+ raw,
181
+ websocketStatsResponseSchema,
182
+ "websocket stats response"
183
+ );
184
+ }
185
+ async function metricsSummary(client) {
186
+ const raw = await client.requestJson("/metrics", {
187
+ method: "GET"
188
+ });
189
+ return client.parseWithSchema(
190
+ raw,
191
+ metricsSummaryResponseSchema,
192
+ "metrics summary response"
193
+ );
194
+ }
195
+ async function facets(client, adapter) {
196
+ const params = new URLSearchParams();
197
+ if (adapter) {
198
+ params.set("adapter", adapter);
15
199
  }
200
+ const suffix = params.size > 0 ? `?${params.toString()}` : "";
201
+ const raw = await client.requestJson(`/search/facets${suffix}`, {
202
+ method: "GET"
203
+ });
204
+ return client.parseWithSchema(
205
+ raw,
206
+ searchFacetsResponseSchema,
207
+ "search facets response"
208
+ );
16
209
  }
17
210
  export {
18
- HCS5BaseClient
211
+ detectProtocol,
212
+ facets,
213
+ getAdditionalRegistries,
214
+ listProtocols,
215
+ metricsSummary,
216
+ popularSearches,
217
+ registries,
218
+ registrySearchByNamespace,
219
+ search,
220
+ searchStatus,
221
+ stats,
222
+ vectorSearch,
223
+ websocketStats
19
224
  };
20
225
  //# sourceMappingURL=standards-sdk.es153.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es153.js","sources":["../../src/hcs-5/base-client.ts"],"sourcesContent":["import { Logger, ILogger } from '../utils/logger';\nimport { HederaMirrorNode } from '../services/mirror-node';\nimport { HCS5ClientConfig } from './types';\nimport { NetworkType } from '../utils/types';\n\n/**\n * Base client for HCS-5 operations\n */\nexport abstract class HCS5BaseClient {\n protected logger: ILogger;\n protected mirrorNode: HederaMirrorNode;\n protected network: NetworkType;\n\n /**\n * Create a new HCS-5 base client\n */\n constructor(config: HCS5ClientConfig) {\n this.network = config.network;\n this.logger =\n config.logger ||\n Logger.getInstance({\n level: config.logLevel || 'info',\n module: 'HCS5Client',\n silent: config.silent,\n });\n\n this.mirrorNode = new HederaMirrorNode(this.network, this.logger);\n }\n}\n"],"names":[],"mappings":";;AAQO,MAAe,eAAe;AAAA;AAAA;AAAA;AAAA,EAQnC,YAAY,QAA0B;AACpC,SAAK,UAAU,OAAO;AACtB,SAAK,SACH,OAAO,UACP,OAAO,YAAY;AAAA,MACjB,OAAO,OAAO,YAAY;AAAA,MAC1B,QAAQ;AAAA,MACR,QAAQ,OAAO;AAAA,IAAA,CAChB;AAEH,SAAK,aAAa,IAAI,iBAAiB,KAAK,SAAS,KAAK,MAAM;AAAA,EAClE;AACF;"}
1
+ {"version":3,"file":"standards-sdk.es153.js","sources":["../../src/services/registry-broker/client/search.ts"],"sourcesContent":["import type {\n JsonValue,\n PopularSearchesResponse,\n ProtocolDetectionMessage,\n DetectProtocolResponse,\n ProtocolsResponse,\n RegistriesResponse,\n AdditionalRegistryCatalogResponse,\n RegistrySearchByNamespaceResponse,\n RegistryStatsResponse,\n SearchFacetsResponse,\n SearchParams,\n SearchResult,\n SearchStatusResponse,\n VectorSearchRequest,\n VectorSearchResponse,\n WebsocketStatsResponse,\n MetricsSummaryResponse,\n} from '../types';\nimport {\n additionalRegistryCatalogResponseSchema,\n detectProtocolResponseSchema,\n metricsSummaryResponseSchema,\n popularResponseSchema,\n protocolsResponseSchema,\n registriesResponseSchema,\n registrySearchByNamespaceSchema,\n searchFacetsResponseSchema,\n searchResponseSchema,\n searchStatusResponseSchema,\n statsResponseSchema,\n vectorSearchResponseSchema,\n websocketStatsResponseSchema,\n} from '../schemas';\nimport type { RegistryBrokerClient } from './base-client';\nimport { buildSearchQuery } from './utils';\nimport { RegistryBrokerError } from './errors';\n\nfunction buildVectorFallbackSearchParams(\n request: VectorSearchRequest,\n): SearchParams {\n const params: SearchParams = {\n q: request.query,\n };\n let effectiveLimit: number | undefined;\n if (typeof request.limit === 'number' && Number.isFinite(request.limit)) {\n effectiveLimit = request.limit;\n params.limit = request.limit;\n }\n if (\n typeof request.offset === 'number' &&\n Number.isFinite(request.offset) &&\n request.offset > 0\n ) {\n const limit = effectiveLimit && effectiveLimit > 0 ? effectiveLimit : 20;\n params.limit = limit;\n params.page = Math.floor(request.offset / limit) + 1;\n }\n if (request.filter?.registry) {\n params.registry = request.filter.registry;\n }\n if (request.filter?.protocols?.length) {\n params.protocols = [...request.filter.protocols];\n }\n if (request.filter?.adapter?.length) {\n params.adapters = [...request.filter.adapter];\n }\n if (request.filter?.capabilities?.length) {\n params.capabilities = request.filter.capabilities.map(value =>\n typeof value === 'number' ? value.toString(10) : value,\n );\n }\n if (request.filter?.type) {\n params.type = request.filter.type;\n }\n return params;\n}\n\nfunction convertSearchResultToVectorResponse(\n result: SearchResult,\n): VectorSearchResponse {\n const hits = result.hits.map(agent => ({\n agent,\n score: 0,\n highlights: {},\n }));\n const total = result.total;\n const limit = result.limit;\n const page = result.page;\n const totalVisible = page * limit;\n const limited = total > totalVisible || page > 1;\n\n return {\n hits,\n total,\n took: 0,\n totalAvailable: total,\n visible: hits.length,\n limited,\n credits_used: 0,\n };\n}\n\nexport async function search(\n client: RegistryBrokerClient,\n params: SearchParams = {},\n): Promise<SearchResult> {\n const query = buildSearchQuery(params);\n const raw = await client.requestJson<JsonValue>(`/search${query}`, {\n method: 'GET',\n });\n return client.parseWithSchema(raw, searchResponseSchema, 'search response');\n}\n\nexport async function stats(\n client: RegistryBrokerClient,\n): Promise<RegistryStatsResponse> {\n const raw = await client.requestJson<JsonValue>('/stats', { method: 'GET' });\n return client.parseWithSchema(raw, statsResponseSchema, 'stats response');\n}\n\nexport async function registries(\n client: RegistryBrokerClient,\n): Promise<RegistriesResponse> {\n const raw = await client.requestJson<JsonValue>('/registries', {\n method: 'GET',\n });\n return client.parseWithSchema(\n raw,\n registriesResponseSchema,\n 'registries response',\n );\n}\n\nexport async function getAdditionalRegistries(\n client: RegistryBrokerClient,\n): Promise<AdditionalRegistryCatalogResponse> {\n const raw = await client.requestJson<JsonValue>(\n '/register/additional-registries',\n {\n method: 'GET',\n },\n );\n return client.parseWithSchema(\n raw,\n additionalRegistryCatalogResponseSchema,\n 'additional registry catalog response',\n );\n}\n\nexport async function popularSearches(\n client: RegistryBrokerClient,\n): Promise<PopularSearchesResponse> {\n const raw = await client.requestJson<JsonValue>('/popular', {\n method: 'GET',\n });\n return client.parseWithSchema(\n raw,\n popularResponseSchema,\n 'popular searches response',\n );\n}\n\nexport async function listProtocols(\n client: RegistryBrokerClient,\n): Promise<ProtocolsResponse> {\n const raw = await client.requestJson<JsonValue>('/protocols', {\n method: 'GET',\n });\n return client.parseWithSchema(\n raw,\n protocolsResponseSchema,\n 'protocols response',\n );\n}\n\nexport async function detectProtocol(\n client: RegistryBrokerClient,\n message: ProtocolDetectionMessage,\n): Promise<DetectProtocolResponse> {\n const raw = await client.requestJson<JsonValue>('/detect-protocol', {\n method: 'POST',\n body: { message },\n headers: { 'content-type': 'application/json' },\n });\n return client.parseWithSchema(\n raw,\n detectProtocolResponseSchema,\n 'detect protocol response',\n );\n}\n\nexport async function registrySearchByNamespace(\n client: RegistryBrokerClient,\n registry: string,\n query?: string,\n): Promise<RegistrySearchByNamespaceResponse> {\n const params = new URLSearchParams();\n if (query) {\n params.set('q', query);\n }\n const suffix = params.size > 0 ? `?${params.toString()}` : '';\n const raw = await client.requestJson<JsonValue>(\n `/registries/${encodeURIComponent(registry)}/search${suffix}`,\n {\n method: 'GET',\n },\n );\n return client.parseWithSchema(\n raw,\n registrySearchByNamespaceSchema,\n 'registry search response',\n );\n}\n\nexport async function vectorSearch(\n client: RegistryBrokerClient,\n request: VectorSearchRequest,\n): Promise<VectorSearchResponse> {\n try {\n const raw = await client.requestJson<JsonValue>('/search', {\n method: 'POST',\n body: request,\n headers: { 'content-type': 'application/json' },\n });\n return client.parseWithSchema(\n raw,\n vectorSearchResponseSchema,\n 'vector search response',\n );\n } catch (error) {\n if (error instanceof RegistryBrokerError && error.status === 501) {\n const fallback = await search(\n client,\n buildVectorFallbackSearchParams(request),\n );\n return convertSearchResultToVectorResponse(fallback);\n }\n throw error;\n }\n}\n\nexport async function searchStatus(\n client: RegistryBrokerClient,\n): Promise<SearchStatusResponse> {\n const raw = await client.requestJson<JsonValue>('/search/status', {\n method: 'GET',\n });\n return client.parseWithSchema(\n raw,\n searchStatusResponseSchema,\n 'search status response',\n );\n}\n\nexport async function websocketStats(\n client: RegistryBrokerClient,\n): Promise<WebsocketStatsResponse> {\n const raw = await client.requestJson<JsonValue>('/websocket/stats', {\n method: 'GET',\n });\n return client.parseWithSchema(\n raw,\n websocketStatsResponseSchema,\n 'websocket stats response',\n );\n}\n\nexport async function metricsSummary(\n client: RegistryBrokerClient,\n): Promise<MetricsSummaryResponse> {\n const raw = await client.requestJson<JsonValue>('/metrics', {\n method: 'GET',\n });\n return client.parseWithSchema(\n raw,\n metricsSummaryResponseSchema,\n 'metrics summary response',\n );\n}\n\nexport async function facets(\n client: RegistryBrokerClient,\n adapter?: string,\n): Promise<SearchFacetsResponse> {\n const params = new URLSearchParams();\n if (adapter) {\n params.set('adapter', adapter);\n }\n const suffix = params.size > 0 ? `?${params.toString()}` : '';\n const raw = await client.requestJson<JsonValue>(`/search/facets${suffix}`, {\n method: 'GET',\n });\n return client.parseWithSchema(\n raw,\n searchFacetsResponseSchema,\n 'search facets response',\n );\n}\n"],"names":[],"mappings":"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"}