@hashgraphonline/standards-sdk 0.1.160 → 0.1.161

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 (293) hide show
  1. package/dist/cjs/hcs-14/resolvers/registry.d.ts +18 -1
  2. package/dist/cjs/hcs-14/resolvers/registry.d.ts.map +1 -1
  3. package/dist/cjs/hcs-14/resolvers/types.d.ts +17 -0
  4. package/dist/cjs/hcs-14/resolvers/types.d.ts.map +1 -1
  5. package/dist/cjs/hcs-14/sdk.d.ts +24 -13
  6. package/dist/cjs/hcs-14/sdk.d.ts.map +1 -1
  7. package/dist/cjs/standards-sdk.cjs +3 -3
  8. package/dist/cjs/standards-sdk.cjs.map +1 -1
  9. package/dist/es/hcs-14/resolvers/registry.d.ts +18 -1
  10. package/dist/es/hcs-14/resolvers/registry.d.ts.map +1 -1
  11. package/dist/es/hcs-14/resolvers/types.d.ts +17 -0
  12. package/dist/es/hcs-14/resolvers/types.d.ts.map +1 -1
  13. package/dist/es/hcs-14/sdk.d.ts +24 -13
  14. package/dist/es/hcs-14/sdk.d.ts.map +1 -1
  15. package/dist/es/standards-sdk.es.js +94 -90
  16. package/dist/es/standards-sdk.es.js.map +1 -1
  17. package/dist/es/standards-sdk.es100.js +138 -42
  18. package/dist/es/standards-sdk.es100.js.map +1 -1
  19. package/dist/es/standards-sdk.es101.js +43 -259
  20. package/dist/es/standards-sdk.es101.js.map +1 -1
  21. package/dist/es/standards-sdk.es102.js +245 -82
  22. package/dist/es/standards-sdk.es102.js.map +1 -1
  23. package/dist/es/standards-sdk.es103.js +50 -49
  24. package/dist/es/standards-sdk.es103.js.map +1 -1
  25. package/dist/es/standards-sdk.es104.js +100 -29
  26. package/dist/es/standards-sdk.es104.js.map +1 -1
  27. package/dist/es/standards-sdk.es105.js +27 -229
  28. package/dist/es/standards-sdk.es105.js.map +1 -1
  29. package/dist/es/standards-sdk.es106.js +228 -109
  30. package/dist/es/standards-sdk.es106.js.map +1 -1
  31. package/dist/es/standards-sdk.es107.js +94 -15
  32. package/dist/es/standards-sdk.es107.js.map +1 -1
  33. package/dist/es/standards-sdk.es108.js +30 -80
  34. package/dist/es/standards-sdk.es108.js.map +1 -1
  35. package/dist/es/standards-sdk.es109.js +80 -27
  36. package/dist/es/standards-sdk.es109.js.map +1 -1
  37. package/dist/es/standards-sdk.es11.js +1 -1
  38. package/dist/es/standards-sdk.es110.js +27 -248
  39. package/dist/es/standards-sdk.es110.js.map +1 -1
  40. package/dist/es/standards-sdk.es111.js +246 -472
  41. package/dist/es/standards-sdk.es111.js.map +1 -1
  42. package/dist/es/standards-sdk.es112.js +458 -85
  43. package/dist/es/standards-sdk.es112.js.map +1 -1
  44. package/dist/es/standards-sdk.es113.js +96 -151
  45. package/dist/es/standards-sdk.es113.js.map +1 -1
  46. package/dist/es/standards-sdk.es114.js +155 -29
  47. package/dist/es/standards-sdk.es114.js.map +1 -1
  48. package/dist/es/standards-sdk.es115.js +26 -4
  49. package/dist/es/standards-sdk.es115.js.map +1 -1
  50. package/dist/es/standards-sdk.es116.js +10 -140
  51. package/dist/es/standards-sdk.es116.js.map +1 -1
  52. package/dist/es/standards-sdk.es117.js +140 -27
  53. package/dist/es/standards-sdk.es117.js.map +1 -1
  54. package/dist/es/standards-sdk.es118.js +27 -20
  55. package/dist/es/standards-sdk.es118.js.map +1 -1
  56. package/dist/es/standards-sdk.es119.js +18 -156
  57. package/dist/es/standards-sdk.es119.js.map +1 -1
  58. package/dist/es/standards-sdk.es12.js +1 -1
  59. package/dist/es/standards-sdk.es120.js +148 -191
  60. package/dist/es/standards-sdk.es120.js.map +1 -1
  61. package/dist/es/standards-sdk.es121.js +160 -747
  62. package/dist/es/standards-sdk.es121.js.map +1 -1
  63. package/dist/es/standards-sdk.es122.js +786 -9
  64. package/dist/es/standards-sdk.es122.js.map +1 -1
  65. package/dist/es/standards-sdk.es123.js +13 -567
  66. package/dist/es/standards-sdk.es123.js.map +1 -1
  67. package/dist/es/standards-sdk.es124.js +541 -576
  68. package/dist/es/standards-sdk.es124.js.map +1 -1
  69. package/dist/es/standards-sdk.es125.js +601 -12
  70. package/dist/es/standards-sdk.es125.js.map +1 -1
  71. package/dist/es/standards-sdk.es126.js +13 -2
  72. package/dist/es/standards-sdk.es126.js.map +1 -1
  73. package/dist/es/standards-sdk.es127.js +2 -87
  74. package/dist/es/standards-sdk.es127.js.map +1 -1
  75. package/dist/es/standards-sdk.es128.js +84 -37
  76. package/dist/es/standards-sdk.es128.js.map +1 -1
  77. package/dist/es/standards-sdk.es129.js +40 -2
  78. package/dist/es/standards-sdk.es129.js.map +1 -1
  79. package/dist/es/standards-sdk.es13.js +1 -1
  80. package/dist/es/standards-sdk.es130.js +2 -235
  81. package/dist/es/standards-sdk.es130.js.map +1 -1
  82. package/dist/es/standards-sdk.es131.js +204 -1109
  83. package/dist/es/standards-sdk.es131.js.map +1 -1
  84. package/dist/es/standards-sdk.es132.js +1059 -225
  85. package/dist/es/standards-sdk.es132.js.map +1 -1
  86. package/dist/es/standards-sdk.es133.js +303 -419
  87. package/dist/es/standards-sdk.es133.js.map +1 -1
  88. package/dist/es/standards-sdk.es134.js +418 -351
  89. package/dist/es/standards-sdk.es134.js.map +1 -1
  90. package/dist/es/standards-sdk.es135.js +347 -1108
  91. package/dist/es/standards-sdk.es135.js.map +1 -1
  92. package/dist/es/standards-sdk.es136.js +1088 -180
  93. package/dist/es/standards-sdk.es136.js.map +1 -1
  94. package/dist/es/standards-sdk.es137.js +153 -1512
  95. package/dist/es/standards-sdk.es137.js.map +1 -1
  96. package/dist/es/standards-sdk.es138.js +1567 -1255
  97. package/dist/es/standards-sdk.es138.js.map +1 -1
  98. package/dist/es/standards-sdk.es139.js +1255 -17
  99. package/dist/es/standards-sdk.es139.js.map +1 -1
  100. package/dist/es/standards-sdk.es14.js +1 -1
  101. package/dist/es/standards-sdk.es140.js +15 -85
  102. package/dist/es/standards-sdk.es140.js.map +1 -1
  103. package/dist/es/standards-sdk.es141.js +77 -71
  104. package/dist/es/standards-sdk.es141.js.map +1 -1
  105. package/dist/es/standards-sdk.es142.js +79 -891
  106. package/dist/es/standards-sdk.es142.js.map +1 -1
  107. package/dist/es/standards-sdk.es143.js +886 -53
  108. package/dist/es/standards-sdk.es143.js.map +1 -1
  109. package/dist/es/standards-sdk.es144.js +53 -152
  110. package/dist/es/standards-sdk.es144.js.map +1 -1
  111. package/dist/es/standards-sdk.es145.js +159 -7
  112. package/dist/es/standards-sdk.es145.js.map +1 -1
  113. package/dist/es/standards-sdk.es146.js +7 -86
  114. package/dist/es/standards-sdk.es146.js.map +1 -1
  115. package/dist/es/standards-sdk.es147.js +65 -44
  116. package/dist/es/standards-sdk.es147.js.map +1 -1
  117. package/dist/es/standards-sdk.es148.js +65 -30
  118. package/dist/es/standards-sdk.es148.js.map +1 -1
  119. package/dist/es/standards-sdk.es149.js +30 -34
  120. package/dist/es/standards-sdk.es149.js.map +1 -1
  121. package/dist/es/standards-sdk.es15.js +1 -1
  122. package/dist/es/standards-sdk.es150.js +34 -41
  123. package/dist/es/standards-sdk.es150.js.map +1 -1
  124. package/dist/es/standards-sdk.es151.js +45 -138
  125. package/dist/es/standards-sdk.es151.js.map +1 -1
  126. package/dist/es/standards-sdk.es152.js +133 -37
  127. package/dist/es/standards-sdk.es152.js.map +1 -1
  128. package/dist/es/standards-sdk.es153.js +34 -12474
  129. package/dist/es/standards-sdk.es153.js.map +1 -1
  130. package/dist/es/standards-sdk.es154.js +12444 -134
  131. package/dist/es/standards-sdk.es154.js.map +1 -1
  132. package/dist/es/standards-sdk.es155.js +13 -318
  133. package/dist/es/standards-sdk.es155.js.map +1 -1
  134. package/dist/es/standards-sdk.es156.js +55 -345
  135. package/dist/es/standards-sdk.es156.js.map +1 -1
  136. package/dist/es/standards-sdk.es157.js +68 -437
  137. package/dist/es/standards-sdk.es157.js.map +1 -1
  138. package/dist/es/standards-sdk.es158.js +71 -321
  139. package/dist/es/standards-sdk.es158.js.map +1 -1
  140. package/dist/es/standards-sdk.es159.js +63 -66
  141. package/dist/es/standards-sdk.es159.js.map +1 -1
  142. package/dist/es/standards-sdk.es16.js +5 -5
  143. package/dist/es/standards-sdk.es160.js +168 -13
  144. package/dist/es/standards-sdk.es160.js.map +1 -1
  145. package/dist/es/standards-sdk.es161.js +312 -232
  146. package/dist/es/standards-sdk.es161.js.map +1 -1
  147. package/dist/es/standards-sdk.es162.js +345 -55
  148. package/dist/es/standards-sdk.es162.js.map +1 -1
  149. package/dist/es/standards-sdk.es163.js +437 -68
  150. package/dist/es/standards-sdk.es163.js.map +1 -1
  151. package/dist/es/standards-sdk.es164.js +321 -71
  152. package/dist/es/standards-sdk.es164.js.map +1 -1
  153. package/dist/es/standards-sdk.es165.js +66 -63
  154. package/dist/es/standards-sdk.es165.js.map +1 -1
  155. package/dist/es/standards-sdk.es166.js +220 -150
  156. package/dist/es/standards-sdk.es166.js.map +1 -1
  157. package/dist/es/standards-sdk.es167.js +152 -202
  158. package/dist/es/standards-sdk.es167.js.map +1 -1
  159. package/dist/es/standards-sdk.es168.js +206 -223
  160. package/dist/es/standards-sdk.es168.js.map +1 -1
  161. package/dist/es/standards-sdk.es169.js +227 -107
  162. package/dist/es/standards-sdk.es169.js.map +1 -1
  163. package/dist/es/standards-sdk.es170.js +98 -105
  164. package/dist/es/standards-sdk.es170.js.map +1 -1
  165. package/dist/es/standards-sdk.es171.js +105 -140
  166. package/dist/es/standards-sdk.es171.js.map +1 -1
  167. package/dist/es/standards-sdk.es172.js +140 -164
  168. package/dist/es/standards-sdk.es172.js.map +1 -1
  169. package/dist/es/standards-sdk.es173.js +165 -119
  170. package/dist/es/standards-sdk.es173.js.map +1 -1
  171. package/dist/es/standards-sdk.es174.js +111 -303
  172. package/dist/es/standards-sdk.es174.js.map +1 -1
  173. package/dist/es/standards-sdk.es175.js +297 -225
  174. package/dist/es/standards-sdk.es175.js.map +1 -1
  175. package/dist/es/standards-sdk.es176.js +253 -110
  176. package/dist/es/standards-sdk.es176.js.map +1 -1
  177. package/dist/es/standards-sdk.es177.js +119 -0
  178. package/dist/es/standards-sdk.es177.js.map +1 -0
  179. package/dist/es/standards-sdk.es18.js +12 -12
  180. package/dist/es/standards-sdk.es19.js +9 -9
  181. package/dist/es/standards-sdk.es2.js +2 -2
  182. package/dist/es/standards-sdk.es20.js +1 -1
  183. package/dist/es/standards-sdk.es21.js +1 -1
  184. package/dist/es/standards-sdk.es22.js +1 -1
  185. package/dist/es/standards-sdk.es23.js +1 -1
  186. package/dist/es/standards-sdk.es24.js +1 -1
  187. package/dist/es/standards-sdk.es25.js +1 -1
  188. package/dist/es/standards-sdk.es26.js +1 -1
  189. package/dist/es/standards-sdk.es27.js +12 -12
  190. package/dist/es/standards-sdk.es30.js +2 -2
  191. package/dist/es/standards-sdk.es31.js +4 -4
  192. package/dist/es/standards-sdk.es32.js +1 -1
  193. package/dist/es/standards-sdk.es35.js +6 -6
  194. package/dist/es/standards-sdk.es36.js +4 -4
  195. package/dist/es/standards-sdk.es37.js +2 -2
  196. package/dist/es/standards-sdk.es38.js +2 -2
  197. package/dist/es/standards-sdk.es39.js +1 -1
  198. package/dist/es/standards-sdk.es4.js +2 -2
  199. package/dist/es/standards-sdk.es40.js +1 -1
  200. package/dist/es/standards-sdk.es41.js +2 -2
  201. package/dist/es/standards-sdk.es46.js +1 -1
  202. package/dist/es/standards-sdk.es5.js +2 -2
  203. package/dist/es/standards-sdk.es51.js +1 -1
  204. package/dist/es/standards-sdk.es53.js +1 -1
  205. package/dist/es/standards-sdk.es56.js +2 -2
  206. package/dist/es/standards-sdk.es58.js +11 -236
  207. package/dist/es/standards-sdk.es58.js.map +1 -1
  208. package/dist/es/standards-sdk.es59.js +321 -35
  209. package/dist/es/standards-sdk.es59.js.map +1 -1
  210. package/dist/es/standards-sdk.es6.js +2 -2
  211. package/dist/es/standards-sdk.es60.js +32 -101
  212. package/dist/es/standards-sdk.es60.js.map +1 -1
  213. package/dist/es/standards-sdk.es61.js +86 -156
  214. package/dist/es/standards-sdk.es61.js.map +1 -1
  215. package/dist/es/standards-sdk.es62.js +112 -153
  216. package/dist/es/standards-sdk.es62.js.map +1 -1
  217. package/dist/es/standards-sdk.es63.js +179 -87
  218. package/dist/es/standards-sdk.es63.js.map +1 -1
  219. package/dist/es/standards-sdk.es64.js +124 -40
  220. package/dist/es/standards-sdk.es64.js.map +1 -1
  221. package/dist/es/standards-sdk.es65.js +41 -251
  222. package/dist/es/standards-sdk.es65.js.map +1 -1
  223. package/dist/es/standards-sdk.es66.js +257 -24
  224. package/dist/es/standards-sdk.es66.js.map +1 -1
  225. package/dist/es/standards-sdk.es67.js +25 -87
  226. package/dist/es/standards-sdk.es67.js.map +1 -1
  227. package/dist/es/standards-sdk.es68.js +95 -3
  228. package/dist/es/standards-sdk.es68.js.map +1 -1
  229. package/dist/es/standards-sdk.es69.js +3 -100
  230. package/dist/es/standards-sdk.es69.js.map +1 -1
  231. package/dist/es/standards-sdk.es7.js +1 -1
  232. package/dist/es/standards-sdk.es70.js +62 -61
  233. package/dist/es/standards-sdk.es70.js.map +1 -1
  234. package/dist/es/standards-sdk.es71.js +98 -17
  235. package/dist/es/standards-sdk.es71.js.map +1 -1
  236. package/dist/es/standards-sdk.es72.js +19 -77
  237. package/dist/es/standards-sdk.es72.js.map +1 -1
  238. package/dist/es/standards-sdk.es73.js +77 -458
  239. package/dist/es/standards-sdk.es73.js.map +1 -1
  240. package/dist/es/standards-sdk.es74.js +240 -106
  241. package/dist/es/standards-sdk.es74.js.map +1 -1
  242. package/dist/es/standards-sdk.es75.js +286 -170
  243. package/dist/es/standards-sdk.es75.js.map +1 -1
  244. package/dist/es/standards-sdk.es76.js +207 -71
  245. package/dist/es/standards-sdk.es76.js.map +1 -1
  246. package/dist/es/standards-sdk.es77.js +72 -71
  247. package/dist/es/standards-sdk.es77.js.map +1 -1
  248. package/dist/es/standards-sdk.es78.js +71 -143
  249. package/dist/es/standards-sdk.es78.js.map +1 -1
  250. package/dist/es/standards-sdk.es79.js +136 -62
  251. package/dist/es/standards-sdk.es79.js.map +1 -1
  252. package/dist/es/standards-sdk.es80.js +45 -380
  253. package/dist/es/standards-sdk.es80.js.map +1 -1
  254. package/dist/es/standards-sdk.es81.js +130 -222
  255. package/dist/es/standards-sdk.es81.js.map +1 -1
  256. package/dist/es/standards-sdk.es82.js +444 -313
  257. package/dist/es/standards-sdk.es82.js.map +1 -1
  258. package/dist/es/standards-sdk.es83.js +364 -88
  259. package/dist/es/standards-sdk.es83.js.map +1 -1
  260. package/dist/es/standards-sdk.es84.js +89 -125
  261. package/dist/es/standards-sdk.es84.js.map +1 -1
  262. package/dist/es/standards-sdk.es85.js +125 -8
  263. package/dist/es/standards-sdk.es85.js.map +1 -1
  264. package/dist/es/standards-sdk.es86.js +6 -45
  265. package/dist/es/standards-sdk.es86.js.map +1 -1
  266. package/dist/es/standards-sdk.es87.js +44 -98
  267. package/dist/es/standards-sdk.es87.js.map +1 -1
  268. package/dist/es/standards-sdk.es88.js +84 -331
  269. package/dist/es/standards-sdk.es88.js.map +1 -1
  270. package/dist/es/standards-sdk.es89.js +160 -93
  271. package/dist/es/standards-sdk.es89.js.map +1 -1
  272. package/dist/es/standards-sdk.es9.js +2 -2
  273. package/dist/es/standards-sdk.es90.js +275 -55
  274. package/dist/es/standards-sdk.es90.js.map +1 -1
  275. package/dist/es/standards-sdk.es91.js +55 -43
  276. package/dist/es/standards-sdk.es91.js.map +1 -1
  277. package/dist/es/standards-sdk.es92.js +44 -145
  278. package/dist/es/standards-sdk.es92.js.map +1 -1
  279. package/dist/es/standards-sdk.es93.js +113 -30
  280. package/dist/es/standards-sdk.es93.js.map +1 -1
  281. package/dist/es/standards-sdk.es94.js +59 -22
  282. package/dist/es/standards-sdk.es94.js.map +1 -1
  283. package/dist/es/standards-sdk.es95.js +28 -23
  284. package/dist/es/standards-sdk.es95.js.map +1 -1
  285. package/dist/es/standards-sdk.es96.js +23 -238
  286. package/dist/es/standards-sdk.es96.js.map +1 -1
  287. package/dist/es/standards-sdk.es97.js +225 -267
  288. package/dist/es/standards-sdk.es97.js.map +1 -1
  289. package/dist/es/standards-sdk.es98.js +220 -95
  290. package/dist/es/standards-sdk.es98.js.map +1 -1
  291. package/dist/es/standards-sdk.es99.js +136 -124
  292. package/dist/es/standards-sdk.es99.js.map +1 -1
  293. package/package.json +4 -1
@@ -1,108 +1,481 @@
1
- import { z } from "zod";
2
- import { hcs26TopicTypeEnumSchema, HCS26_PROTOCOL, hcs26OperationEnumSchema } from "./standards-sdk.es110.js";
3
- const HCS26_DEFAULT_TTL_SECONDS = 86400;
4
- function toPositiveInt(value) {
5
- if (!Number.isFinite(value)) {
6
- throw new Error("Expected a finite number");
7
- }
8
- const intValue = Math.floor(value);
9
- if (intValue <= 0) {
10
- throw new Error("Expected a positive integer");
11
- }
12
- return intValue;
13
- }
14
- function buildHcs26TopicMemo(input) {
15
- const indexed = input.indexed ?? true;
16
- const ttlSeconds = toPositiveInt(
17
- input.ttlSeconds ?? HCS26_DEFAULT_TTL_SECONDS
1
+ import { Logger } from "./standards-sdk.es117.js";
2
+ import { HederaMirrorNode } from "./standards-sdk.es138.js";
3
+ import { HRLResolver } from "./standards-sdk.es121.js";
4
+ import { hash } from "./standards-sdk.es131.js";
5
+ import { hcs26DiscoveryMetadataSchema, hcs26DiscoveryMetadataPatchSchema, hcs26DiscoveryRegisterSchema, hcs26DiscoveryRegisterLegacySchema, hcs26DiscoveryDeleteSchema, hcs26DiscoveryUpdateSchema, hcs26DiscoveryUpdateLegacySchema, hcs26VersionRegisterSchema, hcs26VersionRegisterLegacySchema, hcs26VersionUpdateSchema, hcs26VersionDeleteSchema, hcs26SkillManifestSchema } from "./standards-sdk.es111.js";
6
+ function parseSemver(versionRaw) {
7
+ const trimmed = versionRaw.trim().replace(/^v/i, "");
8
+ const match = trimmed.match(
9
+ /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/
18
10
  );
19
- const topicType = hcs26TopicTypeEnumSchema.parse(input.topicType);
20
- const indexedSegment = indexed ? "0" : "1";
21
- return `${HCS26_PROTOCOL}:${indexedSegment}:${ttlSeconds}:${topicType}`;
22
- }
23
- function parseHcs26TopicMemo(memoRaw) {
24
- const memo = memoRaw.trim();
25
- if (!memo) {
26
- return null;
27
- }
28
- const match = memo.match(/^hcs-26:(\d+):(\d+):(\d+)$/);
29
11
  if (!match) {
30
12
  return null;
31
13
  }
32
- const indexedSegment = Number(match[1]);
33
- const ttlSeconds = Number(match[2]);
34
- const topicType = Number(match[3]);
35
- if (![indexedSegment, ttlSeconds, topicType].every(Number.isFinite)) {
14
+ const major = Number(match[1]);
15
+ const minor = Number(match[2]);
16
+ const patch = Number(match[3]);
17
+ if (![major, minor, patch].every(Number.isFinite)) {
36
18
  return null;
37
19
  }
38
- const parsedTopicType = hcs26TopicTypeEnumSchema.safeParse(topicType);
39
- if (!parsedTopicType.success) {
40
- return null;
20
+ const prereleaseRaw = match[4];
21
+ const prerelease = prereleaseRaw ? prereleaseRaw.split(".").map((part) => {
22
+ if (/^(0|[1-9]\d*)$/.test(part)) {
23
+ return Number(part);
24
+ }
25
+ return part;
26
+ }) : [];
27
+ return { major, minor, patch, prerelease };
28
+ }
29
+ function compareSemver(a, b) {
30
+ if (a.major !== b.major) return a.major - b.major;
31
+ if (a.minor !== b.minor) return a.minor - b.minor;
32
+ if (a.patch !== b.patch) return a.patch - b.patch;
33
+ const aHasPre = a.prerelease.length > 0;
34
+ const bHasPre = b.prerelease.length > 0;
35
+ if (!aHasPre && bHasPre) return 1;
36
+ if (aHasPre && !bHasPre) return -1;
37
+ if (!aHasPre && !bHasPre) return 0;
38
+ const len = Math.max(a.prerelease.length, b.prerelease.length);
39
+ for (let index = 0; index < len; index += 1) {
40
+ const aId = a.prerelease[index];
41
+ const bId = b.prerelease[index];
42
+ if (aId === void 0 && bId !== void 0) return -1;
43
+ if (aId !== void 0 && bId === void 0) return 1;
44
+ if (aId === bId) continue;
45
+ if (typeof aId === "number" && typeof bId === "number") {
46
+ return aId - bId;
47
+ }
48
+ if (typeof aId === "number" && typeof bId === "string") {
49
+ return -1;
50
+ }
51
+ if (typeof aId === "string" && typeof bId === "number") {
52
+ return 1;
53
+ }
54
+ if (typeof aId === "string" && typeof bId === "string") {
55
+ return aId < bId ? -1 : 1;
56
+ }
41
57
  }
42
- if (indexedSegment !== 0 && indexedSegment !== 1) {
58
+ return 0;
59
+ }
60
+ function isActiveStatus(status) {
61
+ return !status || status === "active";
62
+ }
63
+ function normalizeUidString(value) {
64
+ if (typeof value !== "string") {
43
65
  return null;
44
66
  }
45
- return {
46
- protocol: HCS26_PROTOCOL,
47
- indexed: indexedSegment === 0,
48
- ttlSeconds,
49
- topicType: parsedTopicType.data
50
- };
67
+ const trimmed = value.trim();
68
+ return trimmed.length > 0 ? trimmed : null;
51
69
  }
52
- function buildHcs26TransactionMemo(input) {
53
- const operation = hcs26OperationEnumSchema.parse(input.operation);
54
- const topicType = hcs26TopicTypeEnumSchema.parse(input.topicType);
55
- return `${HCS26_PROTOCOL}:op:${operation}:${topicType}`;
70
+ function resolveSequenceNumber(primary, fallback) {
71
+ if (typeof primary === "number") {
72
+ return primary;
73
+ }
74
+ if (typeof fallback === "number") {
75
+ return fallback;
76
+ }
77
+ return null;
56
78
  }
57
- function parseHcs26TransactionMemo(memoRaw) {
58
- const memo = memoRaw.trim();
59
- if (!memo) {
79
+ function parseSequenceFromUid(uid) {
80
+ if (!/^\d+$/.test(uid)) {
60
81
  return null;
61
82
  }
62
- const match = memo.match(/^hcs-26:op:(\d+):(\d+)$/);
63
- if (!match) {
64
- return null;
83
+ const parsed = Number(uid);
84
+ return Number.isSafeInteger(parsed) ? parsed : null;
85
+ }
86
+ function ensureNonEmptyString(value, field) {
87
+ if (typeof value !== "string") {
88
+ throw new Error(`Expected ${field} to be a string`);
65
89
  }
66
- const operation = Number(match[1]);
67
- const topicType = Number(match[2]);
68
- if (![operation, topicType].every(Number.isFinite)) {
69
- return null;
90
+ const trimmed = value.trim();
91
+ if (!trimmed) {
92
+ throw new Error(`Expected ${field} to be a non-empty string`);
70
93
  }
71
- const parsedOperation = hcs26OperationEnumSchema.safeParse(operation);
72
- if (!parsedOperation.success) {
73
- return null;
94
+ return trimmed;
95
+ }
96
+ function mergeDiscoveryMetadata(base, update) {
97
+ if (!update) {
98
+ return base;
74
99
  }
75
- const parsedTopicType = hcs26TopicTypeEnumSchema.safeParse(topicType);
76
- if (!parsedTopicType.success) {
77
- return null;
100
+ return { ...base, ...update };
101
+ }
102
+ function normalizeDiscoveryRegister(input, messageSequenceNumber) {
103
+ const seq = typeof input.sequence_number === "number" ? input.sequence_number : typeof messageSequenceNumber === "number" ? messageSequenceNumber : void 0;
104
+ if ("t_id" in input) {
105
+ return {
106
+ p: "hcs-26",
107
+ op: "register",
108
+ t_id: ensureNonEmptyString(input.t_id, "t_id"),
109
+ account_id: ensureNonEmptyString(input.account_id, "account_id"),
110
+ metadata: input.metadata,
111
+ ...input.m ? { m: input.m } : {},
112
+ ...typeof seq === "number" ? { sequence_number: seq } : {}
113
+ };
78
114
  }
79
115
  return {
80
- protocol: HCS26_PROTOCOL,
81
- operation: parsedOperation.data,
82
- topicType: parsedTopicType.data
116
+ p: "hcs-26",
117
+ op: "register",
118
+ t_id: ensureNonEmptyString(input.version_registry, "version_registry"),
119
+ account_id: ensureNonEmptyString(input.publisher, "publisher"),
120
+ metadata: input.metadata,
121
+ ...input.m ? { m: input.m } : {},
122
+ ...typeof seq === "number" ? { sequence_number: seq } : {}
83
123
  };
84
124
  }
85
- const hcs26TopicMemoSchema = z.string().transform((value) => {
86
- const parsed = parseHcs26TopicMemo(value);
87
- if (!parsed) {
88
- throw new Error("Invalid HCS-26 topic memo");
89
- }
90
- return parsed;
91
- });
92
- const hcs26TransactionMemoSchema = z.string().transform((value) => {
93
- const parsed = parseHcs26TransactionMemo(value);
94
- if (!parsed) {
95
- throw new Error("Invalid HCS-26 transaction memo");
96
- }
97
- return parsed;
98
- });
125
+ class Hcs26SkillRegistryResolver {
126
+ constructor(deps) {
127
+ this.network = deps.network;
128
+ this.logger = deps.logger ?? Logger.getInstance({
129
+ module: "HCS26Resolver",
130
+ level: "info"
131
+ });
132
+ this.mirrorNode = new HederaMirrorNode(
133
+ deps.network,
134
+ this.logger,
135
+ deps.mirrorNode
136
+ );
137
+ this.hrlResolver = new HRLResolver("warn");
138
+ }
139
+ async resolveDiscoveryMetadataHrl(metadataHrl, mode) {
140
+ const resolved = await this.hrlResolver.resolve(metadataHrl, {
141
+ network: this.network,
142
+ returnRaw: true
143
+ });
144
+ const bytes = resolved.content instanceof ArrayBuffer ? Buffer.from(resolved.content) : Buffer.from(String(resolved.content), "utf8");
145
+ let raw;
146
+ try {
147
+ raw = JSON.parse(bytes.toString("utf8"));
148
+ } catch {
149
+ throw new Error("Discovery metadata HRL content is not valid JSON");
150
+ }
151
+ const schema = mode === "full" ? hcs26DiscoveryMetadataSchema : hcs26DiscoveryMetadataPatchSchema;
152
+ const parsed = schema.safeParse(raw);
153
+ if (!parsed.success) {
154
+ throw new Error(`Invalid discovery metadata: ${parsed.error.message}`);
155
+ }
156
+ return this.normalizeDiscoveryMetadataObject(
157
+ parsed.data
158
+ );
159
+ }
160
+ normalizeDiscoveryMetadataObject(metadata) {
161
+ if (typeof metadata.icon !== "string" || metadata.icon.trim().length === 0) {
162
+ const iconLegacy = metadata.icon_hcs1;
163
+ if (typeof iconLegacy === "string" && iconLegacy.trim().length > 0) {
164
+ return { ...metadata, icon: iconLegacy };
165
+ }
166
+ }
167
+ return metadata;
168
+ }
169
+ async resolveDiscoveryMetadataUri(metadataUri, mode) {
170
+ const trimmed = metadataUri.trim();
171
+ if (trimmed.startsWith("hcs://1/")) {
172
+ return this.resolveDiscoveryMetadataHrl(trimmed, mode);
173
+ }
174
+ throw new Error(`Unsupported discovery metadata URI: ${trimmed}`);
175
+ }
176
+ resolveDiscoveryMetadataObject(params) {
177
+ if (typeof params.metadata === "string") {
178
+ return this.resolveDiscoveryMetadataUri(params.metadata, params.mode);
179
+ }
180
+ const schema = params.mode === "full" ? hcs26DiscoveryMetadataSchema : hcs26DiscoveryMetadataPatchSchema;
181
+ const parsed = schema.safeParse(params.metadata);
182
+ if (!parsed.success) {
183
+ throw new Error(`Invalid discovery metadata: ${parsed.error.message}`);
184
+ }
185
+ return Promise.resolve(
186
+ this.normalizeDiscoveryMetadataObject(
187
+ parsed.data
188
+ )
189
+ );
190
+ }
191
+ async getDiscoveryRegister(params) {
192
+ const messages = await this.mirrorNode.getTopicMessages(
193
+ params.directoryTopicId,
194
+ {
195
+ sequenceNumber: `eq:${params.skillUid}`,
196
+ limit: 5,
197
+ order: "asc"
198
+ }
199
+ );
200
+ for (const message of messages) {
201
+ const parsedNew = hcs26DiscoveryRegisterSchema.safeParse(message);
202
+ const parsedLegacy = parsedNew.success ? null : hcs26DiscoveryRegisterLegacySchema.safeParse(message);
203
+ const parsed = parsedNew.success ? parsedNew : parsedLegacy && parsedLegacy.success ? parsedLegacy : null;
204
+ if (!parsed) {
205
+ continue;
206
+ }
207
+ const normalized = normalizeDiscoveryRegister(
208
+ parsed.data,
209
+ message.sequence_number
210
+ );
211
+ const seq = normalized.sequence_number;
212
+ if (typeof seq === "number" && seq === params.skillUid) {
213
+ const metadata = await this.resolveDiscoveryMetadataObject({
214
+ metadata: normalized.metadata,
215
+ mode: "full"
216
+ });
217
+ return { ...normalized, metadata };
218
+ }
219
+ }
220
+ return null;
221
+ }
222
+ async resolveDiscoveryRecord(params) {
223
+ const register = await this.getDiscoveryRegister({
224
+ directoryTopicId: params.directoryTopicId,
225
+ skillUid: params.skillUid
226
+ });
227
+ if (!register) {
228
+ return null;
229
+ }
230
+ const scanLimit = typeof params.scanLimit === "number" && params.scanLimit > 0 ? Math.min(5e3, Math.floor(params.scanLimit)) : 1e3;
231
+ const messages = await this.mirrorNode.getTopicMessages(
232
+ params.directoryTopicId,
233
+ {
234
+ limit: scanLimit,
235
+ order: "asc"
236
+ }
237
+ );
238
+ const uid = String(params.skillUid);
239
+ const registerSequence = resolveSequenceNumber(
240
+ register.sequence_number,
241
+ params.skillUid
242
+ );
243
+ let current = register;
244
+ for (const message of messages) {
245
+ const messageSequence = resolveSequenceNumber(
246
+ void 0,
247
+ message.sequence_number
248
+ );
249
+ const deleteParsed = hcs26DiscoveryDeleteSchema.safeParse(message);
250
+ if (deleteParsed.success && deleteParsed.data.uid === uid) {
251
+ const deleteSequence = resolveSequenceNumber(
252
+ deleteParsed.data.sequence_number,
253
+ messageSequence
254
+ );
255
+ if (registerSequence !== null && deleteSequence !== null && deleteSequence <= registerSequence) {
256
+ continue;
257
+ }
258
+ return null;
259
+ }
260
+ const updateParsedNew = hcs26DiscoveryUpdateSchema.safeParse(message);
261
+ const updateParsedLegacy = updateParsedNew.success ? null : hcs26DiscoveryUpdateLegacySchema.safeParse(message);
262
+ const updateParsed = updateParsedNew.success ? updateParsedNew : updateParsedLegacy && updateParsedLegacy.success ? updateParsedLegacy : null;
263
+ if (!updateParsed || updateParsed.data.uid !== uid) {
264
+ continue;
265
+ }
266
+ const updateSequence = resolveSequenceNumber(
267
+ updateParsed.data.sequence_number,
268
+ messageSequence
269
+ );
270
+ if (registerSequence !== null && updateSequence !== null && updateSequence <= registerSequence) {
271
+ continue;
272
+ }
273
+ const nextAccountId = "account_id" in updateParsed.data ? normalizeUidString(updateParsed.data.account_id) : normalizeUidString(updateParsed.data.publisher);
274
+ const nextMetadataRaw = updateParsed.data.metadata;
275
+ const nextMetadata = nextMetadataRaw !== void 0 ? await this.resolveDiscoveryMetadataObject({
276
+ metadata: nextMetadataRaw,
277
+ mode: "patch"
278
+ }) : void 0;
279
+ current = {
280
+ ...current,
281
+ ...nextAccountId ? { account_id: nextAccountId } : {},
282
+ metadata: mergeDiscoveryMetadata(current.metadata, nextMetadata)
283
+ };
284
+ }
285
+ return current;
286
+ }
287
+ async listVersionRegisters(params) {
288
+ const limit = typeof params.limit === "number" && params.limit > 0 ? Math.min(1e3, params.limit) : 500;
289
+ const messages = await this.mirrorNode.getTopicMessages(
290
+ params.versionRegistryTopicId,
291
+ {
292
+ limit,
293
+ order: "desc"
294
+ }
295
+ );
296
+ const registersByUid = /* @__PURE__ */ new Map();
297
+ const updatesByUid = /* @__PURE__ */ new Map();
298
+ const deletedByUid = /* @__PURE__ */ new Map();
299
+ for (const message of messages) {
300
+ const parsedNew = hcs26VersionRegisterSchema.safeParse(message);
301
+ const parsedLegacy = parsedNew.success ? null : hcs26VersionRegisterLegacySchema.safeParse(message);
302
+ const registerParsed = parsedNew.success ? parsedNew : parsedLegacy && parsedLegacy.success ? parsedLegacy : null;
303
+ if (registerParsed) {
304
+ if (registerParsed.data.skill_uid !== params.skillUid) {
305
+ continue;
306
+ }
307
+ const uid = typeof registerParsed.data.sequence_number === "number" ? String(registerParsed.data.sequence_number) : typeof message.sequence_number === "number" ? String(message.sequence_number) : null;
308
+ if (uid) {
309
+ const registerSequence = resolveSequenceNumber(
310
+ registerParsed.data.sequence_number,
311
+ message.sequence_number
312
+ );
313
+ registersByUid.set(uid, {
314
+ register: registerParsed.data,
315
+ sequenceNumber: registerSequence
316
+ });
317
+ }
318
+ continue;
319
+ }
320
+ const updateParsed = hcs26VersionUpdateSchema.safeParse(message);
321
+ if (updateParsed.success) {
322
+ const uid = updateParsed.data.uid.trim();
323
+ const list = updatesByUid.get(uid) ?? [];
324
+ list.push({
325
+ update: updateParsed.data,
326
+ sequenceNumber: resolveSequenceNumber(
327
+ updateParsed.data.sequence_number,
328
+ message.sequence_number
329
+ )
330
+ });
331
+ updatesByUid.set(uid, list);
332
+ continue;
333
+ }
334
+ const deleteParsed = hcs26VersionDeleteSchema.safeParse(message);
335
+ if (deleteParsed.success) {
336
+ const uid = deleteParsed.data.uid.trim();
337
+ const list = deletedByUid.get(uid) ?? [];
338
+ const sequenceNumber = resolveSequenceNumber(
339
+ deleteParsed.data.sequence_number,
340
+ message.sequence_number
341
+ );
342
+ if (sequenceNumber !== null) {
343
+ list.push(sequenceNumber);
344
+ deletedByUid.set(uid, list);
345
+ }
346
+ }
347
+ }
348
+ const entries = [];
349
+ for (const [uid, registerState] of registersByUid.entries()) {
350
+ const registerSequence = registerState.sequenceNumber ?? parseSequenceFromUid(uid);
351
+ const deleteSequences = deletedByUid.get(uid) ?? [];
352
+ const hasDeleteAfterRegister = deleteSequences.some(
353
+ (sequence) => registerSequence === null ? true : sequence > registerSequence
354
+ );
355
+ if (hasDeleteAfterRegister) {
356
+ continue;
357
+ }
358
+ const updates = updatesByUid.get(uid);
359
+ if (!updates || updates.length === 0) {
360
+ entries.push(registerState.register);
361
+ continue;
362
+ }
363
+ const sorted = [...updates].filter(
364
+ (update) => registerSequence === null ? true : update.sequenceNumber !== null && update.sequenceNumber > registerSequence
365
+ ).sort((a, b) => {
366
+ const aSeq = a.sequenceNumber ?? 0;
367
+ const bSeq = b.sequenceNumber ?? 0;
368
+ return aSeq - bSeq;
369
+ });
370
+ if (sorted.length === 0) {
371
+ entries.push(registerState.register);
372
+ continue;
373
+ }
374
+ const final = sorted.reduce((acc, updateState) => {
375
+ if (updateState.update.status) {
376
+ return { ...acc, status: updateState.update.status };
377
+ }
378
+ return acc;
379
+ }, registerState.register);
380
+ entries.push(final);
381
+ }
382
+ return entries;
383
+ }
384
+ async getLatestVersionRegister(params) {
385
+ const entries = await this.listVersionRegisters({
386
+ versionRegistryTopicId: params.versionRegistryTopicId,
387
+ skillUid: params.skillUid,
388
+ limit: 100
389
+ });
390
+ const active = entries.filter((entry) => isActiveStatus(entry.status));
391
+ if (active.length === 0) {
392
+ return null;
393
+ }
394
+ let best = active[0];
395
+ let bestParsed = parseSemver(best.version);
396
+ for (let index = 1; index < active.length; index += 1) {
397
+ const candidate = active[index];
398
+ const candidateParsed = parseSemver(candidate.version);
399
+ if (!bestParsed && candidateParsed) {
400
+ best = candidate;
401
+ bestParsed = candidateParsed;
402
+ continue;
403
+ }
404
+ if (bestParsed && candidateParsed) {
405
+ const cmp = compareSemver(candidateParsed, bestParsed);
406
+ if (cmp > 0) {
407
+ best = candidate;
408
+ bestParsed = candidateParsed;
409
+ continue;
410
+ }
411
+ if (cmp === 0) {
412
+ const bestSeq = typeof best.sequence_number === "number" ? best.sequence_number : 0;
413
+ const candSeq = typeof candidate.sequence_number === "number" ? candidate.sequence_number : 0;
414
+ if (candSeq > bestSeq) {
415
+ best = candidate;
416
+ bestParsed = candidateParsed;
417
+ }
418
+ }
419
+ }
420
+ }
421
+ return best;
422
+ }
423
+ async resolveManifest(params) {
424
+ const manifestHrl = typeof params.manifestHrl === "string" && params.manifestHrl.trim().length > 0 ? params.manifestHrl.trim() : typeof params.manifestTopicId === "string" && params.manifestTopicId.trim().length > 0 ? `hcs://1/${params.manifestTopicId.trim()}` : null;
425
+ if (!manifestHrl) {
426
+ throw new Error("Manifest HRL or topic id is required");
427
+ }
428
+ const resolved = await this.hrlResolver.resolve(manifestHrl, {
429
+ network: this.network,
430
+ returnRaw: true
431
+ });
432
+ const contentType = resolved.contentType ?? "";
433
+ if (!contentType.toLowerCase().startsWith("application/json")) {
434
+ throw new Error(
435
+ `Expected application/json for manifest, got ${resolved.contentType ?? "unknown"}`
436
+ );
437
+ }
438
+ const bytes = resolved.content instanceof ArrayBuffer ? Buffer.from(resolved.content) : Buffer.from(String(resolved.content), "utf8");
439
+ const sha256Hex = await hash(bytes, "sha256");
440
+ let raw;
441
+ try {
442
+ raw = JSON.parse(bytes.toString("utf8"));
443
+ } catch {
444
+ throw new Error("Manifest content is not valid JSON");
445
+ }
446
+ const parsed = hcs26SkillManifestSchema.safeParse(raw);
447
+ if (!parsed.success) {
448
+ throw new Error(`Invalid HCS-26 manifest: ${parsed.error.message}`);
449
+ }
450
+ const hasSkillMd = parsed.data.files.some((file) => file.path === "SKILL.md");
451
+ if (!hasSkillMd) {
452
+ throw new Error(
453
+ 'HCS-26 manifest must include SKILL.md at path "SKILL.md"'
454
+ );
455
+ }
456
+ return { manifest: parsed.data, raw, sha256Hex };
457
+ }
458
+ async verifyVersionRegisterMatchesManifest(params) {
459
+ const checksumRaw = params.versionRegister.checksum;
460
+ if (!checksumRaw) {
461
+ this.logger.warn(
462
+ "HCS-26 version register is missing checksum; skipping manifest verification."
463
+ );
464
+ return;
465
+ }
466
+ const checksum = checksumRaw.trim();
467
+ if (!checksum.startsWith("sha256:")) {
468
+ throw new Error(`Unsupported checksum: ${checksum}`);
469
+ }
470
+ const expectedHex = checksum.slice("sha256:".length);
471
+ if (params.manifestSha256Hex !== expectedHex) {
472
+ throw new Error(
473
+ `Manifest checksum mismatch (expected ${expectedHex}, got ${params.manifestSha256Hex})`
474
+ );
475
+ }
476
+ }
477
+ }
99
478
  export {
100
- HCS26_DEFAULT_TTL_SECONDS,
101
- buildHcs26TopicMemo,
102
- buildHcs26TransactionMemo,
103
- hcs26TopicMemoSchema,
104
- hcs26TransactionMemoSchema,
105
- parseHcs26TopicMemo,
106
- parseHcs26TransactionMemo
479
+ Hcs26SkillRegistryResolver
107
480
  };
108
481
  //# sourceMappingURL=standards-sdk.es112.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es112.js","sources":["../../src/hcs-26/memos.ts"],"sourcesContent":["import { z } from 'zod';\nimport {\n HCS26_PROTOCOL,\n hcs26OperationEnumSchema,\n hcs26TopicTypeEnumSchema,\n type Hcs26OperationEnum,\n type Hcs26TopicTypeEnum,\n} from './types';\n\nexport type Hcs26TopicMemo = {\n protocol: typeof HCS26_PROTOCOL;\n indexed: boolean;\n ttlSeconds: number;\n topicType: Hcs26TopicTypeEnum;\n};\n\nexport const HCS26_DEFAULT_TTL_SECONDS = 86400;\n\nfunction toPositiveInt(value: number): number {\n if (!Number.isFinite(value)) {\n throw new Error('Expected a finite number');\n }\n const intValue = Math.floor(value);\n if (intValue <= 0) {\n throw new Error('Expected a positive integer');\n }\n return intValue;\n}\n\nexport function buildHcs26TopicMemo(input: {\n indexed?: boolean;\n ttlSeconds?: number;\n topicType: Hcs26TopicTypeEnum;\n}): string {\n const indexed = input.indexed ?? true;\n const ttlSeconds = toPositiveInt(\n input.ttlSeconds ?? HCS26_DEFAULT_TTL_SECONDS,\n );\n const topicType = hcs26TopicTypeEnumSchema.parse(input.topicType);\n\n // HCS-2 memo convention: indexed topics use \"0\" in the second segment.\n const indexedSegment = indexed ? '0' : '1';\n return `${HCS26_PROTOCOL}:${indexedSegment}:${ttlSeconds}:${topicType}`;\n}\n\nexport function parseHcs26TopicMemo(memoRaw: string): Hcs26TopicMemo | null {\n const memo = memoRaw.trim();\n if (!memo) {\n return null;\n }\n\n const match = memo.match(/^hcs-26:(\\d+):(\\d+):(\\d+)$/);\n if (!match) {\n return null;\n }\n\n const indexedSegment = Number(match[1]);\n const ttlSeconds = Number(match[2]);\n const topicType = Number(match[3]);\n\n if (![indexedSegment, ttlSeconds, topicType].every(Number.isFinite)) {\n return null;\n }\n\n const parsedTopicType = hcs26TopicTypeEnumSchema.safeParse(topicType);\n if (!parsedTopicType.success) {\n return null;\n }\n\n if (indexedSegment !== 0 && indexedSegment !== 1) {\n return null;\n }\n\n return {\n protocol: HCS26_PROTOCOL,\n indexed: indexedSegment === 0,\n ttlSeconds,\n topicType: parsedTopicType.data,\n };\n}\n\nexport function buildHcs26TransactionMemo(input: {\n operation: Hcs26OperationEnum;\n topicType: Hcs26TopicTypeEnum;\n}): string {\n const operation = hcs26OperationEnumSchema.parse(input.operation);\n const topicType = hcs26TopicTypeEnumSchema.parse(input.topicType);\n return `${HCS26_PROTOCOL}:op:${operation}:${topicType}`;\n}\n\nexport type Hcs26TransactionMemo = {\n protocol: typeof HCS26_PROTOCOL;\n operation: Hcs26OperationEnum;\n topicType: Hcs26TopicTypeEnum;\n};\n\nexport function parseHcs26TransactionMemo(\n memoRaw: string,\n): Hcs26TransactionMemo | null {\n const memo = memoRaw.trim();\n if (!memo) {\n return null;\n }\n\n const match = memo.match(/^hcs-26:op:(\\d+):(\\d+)$/);\n if (!match) {\n return null;\n }\n\n const operation = Number(match[1]);\n const topicType = Number(match[2]);\n if (![operation, topicType].every(Number.isFinite)) {\n return null;\n }\n\n const parsedOperation = hcs26OperationEnumSchema.safeParse(operation);\n if (!parsedOperation.success) {\n return null;\n }\n const parsedTopicType = hcs26TopicTypeEnumSchema.safeParse(topicType);\n if (!parsedTopicType.success) {\n return null;\n }\n\n return {\n protocol: HCS26_PROTOCOL,\n operation: parsedOperation.data,\n topicType: parsedTopicType.data,\n };\n}\n\nexport const hcs26TopicMemoSchema = z.string().transform(value => {\n const parsed = parseHcs26TopicMemo(value);\n if (!parsed) {\n throw new Error('Invalid HCS-26 topic memo');\n }\n return parsed;\n});\n\nexport const hcs26TransactionMemoSchema = z.string().transform(value => {\n const parsed = parseHcs26TransactionMemo(value);\n if (!parsed) {\n throw new Error('Invalid HCS-26 transaction memo');\n }\n return parsed;\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es112.js","sources":["../../src/hcs-26/resolver.ts"],"sourcesContent":["import { Logger, type ILogger } from '../utils/logger';\nimport { HederaMirrorNode } from '../services/mirror-node';\nimport { HRLResolver } from '../utils/hrl-resolver';\nimport type { MirrorNodeConfig } from '../services/mirror-node';\nimport { hash } from '../utils/crypto-abstraction';\nimport {\n hcs26DiscoveryRegisterSchema,\n hcs26DiscoveryRegisterLegacySchema,\n hcs26DiscoveryMetadataSchema,\n hcs26DiscoveryMetadataPatchSchema,\n hcs26DiscoveryUpdateSchema,\n hcs26DiscoveryUpdateLegacySchema,\n hcs26DiscoveryDeleteSchema,\n hcs26SkillManifestSchema,\n hcs26VersionRegisterSchema,\n hcs26VersionRegisterLegacySchema,\n hcs26VersionUpdateSchema,\n hcs26VersionDeleteSchema,\n type HCS26Network,\n type Hcs26DiscoveryRegister,\n type Hcs26DiscoveryRegisterLegacy,\n type Hcs26SkillManifest,\n type Hcs26VersionRegister,\n type Hcs26VersionRegisterLegacy,\n type Hcs26VersionUpdate,\n} from './types';\n\ntype Hcs26ResolverDeps = {\n network: HCS26Network;\n logger?: ILogger;\n mirrorNode?: MirrorNodeConfig;\n};\n\ntype ParsedSemver = {\n major: number;\n minor: number;\n patch: number;\n prerelease: (string | number)[];\n};\n\nfunction parseSemver(versionRaw: string): ParsedSemver | null {\n const trimmed = versionRaw.trim().replace(/^v/i, '');\n const match = trimmed.match(\n /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?(?:\\+[0-9A-Za-z.-]+)?$/,\n );\n if (!match) {\n return null;\n }\n\n const major = Number(match[1]);\n const minor = Number(match[2]);\n const patch = Number(match[3]);\n if (![major, minor, patch].every(Number.isFinite)) {\n return null;\n }\n\n const prereleaseRaw = match[4];\n const prerelease = prereleaseRaw\n ? prereleaseRaw.split('.').map(part => {\n if (/^(0|[1-9]\\d*)$/.test(part)) {\n return Number(part);\n }\n return part;\n })\n : [];\n\n return { major, minor, patch, prerelease };\n}\n\nfunction compareSemver(a: ParsedSemver, b: ParsedSemver): number {\n if (a.major !== b.major) return a.major - b.major;\n if (a.minor !== b.minor) return a.minor - b.minor;\n if (a.patch !== b.patch) return a.patch - b.patch;\n\n const aHasPre = a.prerelease.length > 0;\n const bHasPre = b.prerelease.length > 0;\n if (!aHasPre && bHasPre) return 1;\n if (aHasPre && !bHasPre) return -1;\n if (!aHasPre && !bHasPre) return 0;\n\n const len = Math.max(a.prerelease.length, b.prerelease.length);\n for (let index = 0; index < len; index += 1) {\n const aId = a.prerelease[index];\n const bId = b.prerelease[index];\n if (aId === undefined && bId !== undefined) return -1;\n if (aId !== undefined && bId === undefined) return 1;\n if (aId === bId) continue;\n\n if (typeof aId === 'number' && typeof bId === 'number') {\n return aId - bId;\n }\n if (typeof aId === 'number' && typeof bId === 'string') {\n return -1;\n }\n if (typeof aId === 'string' && typeof bId === 'number') {\n return 1;\n }\n if (typeof aId === 'string' && typeof bId === 'string') {\n return aId < bId ? -1 : 1;\n }\n }\n\n return 0;\n}\n\nfunction isActiveStatus(\n status: (Hcs26VersionRegister | Hcs26VersionRegisterLegacy)['status'],\n): boolean {\n return !status || status === 'active';\n}\n\nfunction normalizeUidString(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction resolveSequenceNumber(\n primary: unknown,\n fallback: unknown,\n): number | null {\n if (typeof primary === 'number') {\n return primary;\n }\n if (typeof fallback === 'number') {\n return fallback;\n }\n return null;\n}\n\nfunction parseSequenceFromUid(uid: string): number | null {\n if (!/^\\d+$/.test(uid)) {\n return null;\n }\n const parsed = Number(uid);\n return Number.isSafeInteger(parsed) ? parsed : null;\n}\n\nfunction ensureNonEmptyString(value: unknown, field: string): string {\n if (typeof value !== 'string') {\n throw new Error(`Expected ${field} to be a string`);\n }\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error(`Expected ${field} to be a non-empty string`);\n }\n return trimmed;\n}\n\ntype NormalizedDiscoveryRegister = {\n p: 'hcs-26';\n op: 'register';\n t_id: string;\n account_id: string;\n metadata: Record<string, unknown>;\n m?: string;\n sequence_number?: number;\n};\n\ntype NormalizedDiscoveryRegisterRaw = Omit<\n NormalizedDiscoveryRegister,\n 'metadata'\n> & {\n metadata: Record<string, unknown> | string;\n};\n\nfunction mergeDiscoveryMetadata(\n base: Record<string, unknown>,\n update?: Record<string, unknown>,\n): Record<string, unknown> {\n if (!update) {\n return base;\n }\n return { ...base, ...update };\n}\n\nfunction normalizeDiscoveryRegister(\n input: Hcs26DiscoveryRegister | Hcs26DiscoveryRegisterLegacy,\n messageSequenceNumber?: number,\n): NormalizedDiscoveryRegisterRaw {\n const seq =\n typeof input.sequence_number === 'number'\n ? input.sequence_number\n : typeof messageSequenceNumber === 'number'\n ? messageSequenceNumber\n : undefined;\n\n if ('t_id' in input) {\n return {\n p: 'hcs-26',\n op: 'register',\n t_id: ensureNonEmptyString(input.t_id, 't_id'),\n account_id: ensureNonEmptyString(input.account_id, 'account_id'),\n metadata: input.metadata,\n ...(input.m ? { m: input.m } : {}),\n ...(typeof seq === 'number' ? { sequence_number: seq } : {}),\n };\n }\n\n return {\n p: 'hcs-26',\n op: 'register',\n t_id: ensureNonEmptyString(input.version_registry, 'version_registry'),\n account_id: ensureNonEmptyString(input.publisher, 'publisher'),\n metadata: input.metadata,\n ...(input.m ? { m: input.m } : {}),\n ...(typeof seq === 'number' ? { sequence_number: seq } : {}),\n };\n}\n\nexport class Hcs26SkillRegistryResolver {\n private readonly logger: ILogger;\n private readonly mirrorNode: HederaMirrorNode;\n private readonly hrlResolver: HRLResolver;\n private readonly network: HCS26Network;\n\n constructor(deps: Hcs26ResolverDeps) {\n this.network = deps.network;\n this.logger =\n deps.logger ??\n Logger.getInstance({\n module: 'HCS26Resolver',\n level: 'info',\n });\n this.mirrorNode = new HederaMirrorNode(\n deps.network,\n this.logger,\n deps.mirrorNode,\n );\n this.hrlResolver = new HRLResolver('warn');\n }\n\n private async resolveDiscoveryMetadataHrl(\n metadataHrl: string,\n mode: 'full' | 'patch',\n ): Promise<Record<string, unknown>> {\n const resolved = await this.hrlResolver.resolve(metadataHrl, {\n network: this.network,\n returnRaw: true,\n });\n\n const bytes =\n resolved.content instanceof ArrayBuffer\n ? Buffer.from(resolved.content)\n : Buffer.from(String(resolved.content), 'utf8');\n\n let raw: unknown;\n try {\n raw = JSON.parse(bytes.toString('utf8'));\n } catch {\n throw new Error('Discovery metadata HRL content is not valid JSON');\n }\n\n const schema =\n mode === 'full'\n ? hcs26DiscoveryMetadataSchema\n : hcs26DiscoveryMetadataPatchSchema;\n const parsed = schema.safeParse(raw);\n if (!parsed.success) {\n throw new Error(`Invalid discovery metadata: ${parsed.error.message}`);\n }\n return this.normalizeDiscoveryMetadataObject(\n parsed.data as unknown as Record<string, unknown>,\n );\n }\n\n private normalizeDiscoveryMetadataObject(\n metadata: Record<string, unknown>,\n ): Record<string, unknown> {\n if (\n typeof metadata.icon !== 'string' ||\n metadata.icon.trim().length === 0\n ) {\n const iconLegacy = metadata.icon_hcs1;\n if (typeof iconLegacy === 'string' && iconLegacy.trim().length > 0) {\n return { ...metadata, icon: iconLegacy };\n }\n }\n return metadata;\n }\n\n private async resolveDiscoveryMetadataUri(\n metadataUri: string,\n mode: 'full' | 'patch',\n ): Promise<Record<string, unknown>> {\n const trimmed = metadataUri.trim();\n if (trimmed.startsWith('hcs://1/')) {\n return this.resolveDiscoveryMetadataHrl(trimmed, mode);\n }\n throw new Error(`Unsupported discovery metadata URI: ${trimmed}`);\n }\n\n private resolveDiscoveryMetadataObject(params: {\n metadata: unknown;\n mode: 'full' | 'patch';\n }): Promise<Record<string, unknown>> {\n if (typeof params.metadata === 'string') {\n return this.resolveDiscoveryMetadataUri(params.metadata, params.mode);\n }\n\n const schema =\n params.mode === 'full'\n ? hcs26DiscoveryMetadataSchema\n : hcs26DiscoveryMetadataPatchSchema;\n const parsed = schema.safeParse(params.metadata);\n if (!parsed.success) {\n throw new Error(`Invalid discovery metadata: ${parsed.error.message}`);\n }\n return Promise.resolve(\n this.normalizeDiscoveryMetadataObject(\n parsed.data as unknown as Record<string, unknown>,\n ),\n );\n }\n\n async getDiscoveryRegister(params: {\n directoryTopicId: string;\n skillUid: number;\n }): Promise<NormalizedDiscoveryRegister | null> {\n const messages = await this.mirrorNode.getTopicMessages(\n params.directoryTopicId,\n {\n sequenceNumber: `eq:${params.skillUid}`,\n limit: 5,\n order: 'asc',\n },\n );\n\n for (const message of messages) {\n const parsedNew = hcs26DiscoveryRegisterSchema.safeParse(message);\n const parsedLegacy = parsedNew.success\n ? null\n : hcs26DiscoveryRegisterLegacySchema.safeParse(message);\n const parsed = parsedNew.success\n ? parsedNew\n : parsedLegacy && parsedLegacy.success\n ? parsedLegacy\n : null;\n if (!parsed) {\n continue;\n }\n\n const normalized = normalizeDiscoveryRegister(\n parsed.data as Hcs26DiscoveryRegister | Hcs26DiscoveryRegisterLegacy,\n message.sequence_number,\n );\n const seq = normalized.sequence_number;\n if (typeof seq === 'number' && seq === params.skillUid) {\n const metadata = await this.resolveDiscoveryMetadataObject({\n metadata: normalized.metadata,\n mode: 'full',\n });\n return { ...normalized, metadata };\n }\n }\n\n return null;\n }\n\n async resolveDiscoveryRecord(params: {\n directoryTopicId: string;\n skillUid: number;\n scanLimit?: number;\n }): Promise<NormalizedDiscoveryRegister | null> {\n const register = await this.getDiscoveryRegister({\n directoryTopicId: params.directoryTopicId,\n skillUid: params.skillUid,\n });\n if (!register) {\n return null;\n }\n\n const scanLimit =\n typeof params.scanLimit === 'number' && params.scanLimit > 0\n ? Math.min(5000, Math.floor(params.scanLimit))\n : 1000;\n\n const messages = await this.mirrorNode.getTopicMessages(\n params.directoryTopicId,\n {\n limit: scanLimit,\n order: 'asc',\n },\n );\n\n const uid = String(params.skillUid);\n const registerSequence = resolveSequenceNumber(\n register.sequence_number,\n params.skillUid,\n );\n\n let current: NormalizedDiscoveryRegister = register;\n for (const message of messages) {\n const messageSequence = resolveSequenceNumber(\n undefined,\n message.sequence_number,\n );\n const deleteParsed = hcs26DiscoveryDeleteSchema.safeParse(message);\n if (deleteParsed.success && deleteParsed.data.uid === uid) {\n const deleteSequence = resolveSequenceNumber(\n deleteParsed.data.sequence_number,\n messageSequence,\n );\n if (\n registerSequence !== null &&\n deleteSequence !== null &&\n deleteSequence <= registerSequence\n ) {\n continue;\n }\n return null;\n }\n\n const updateParsedNew = hcs26DiscoveryUpdateSchema.safeParse(message);\n const updateParsedLegacy = updateParsedNew.success\n ? null\n : hcs26DiscoveryUpdateLegacySchema.safeParse(message);\n const updateParsed = updateParsedNew.success\n ? updateParsedNew\n : updateParsedLegacy && updateParsedLegacy.success\n ? updateParsedLegacy\n : null;\n if (!updateParsed || updateParsed.data.uid !== uid) {\n continue;\n }\n const updateSequence = resolveSequenceNumber(\n updateParsed.data.sequence_number,\n messageSequence,\n );\n if (\n registerSequence !== null &&\n updateSequence !== null &&\n updateSequence <= registerSequence\n ) {\n continue;\n }\n\n const nextAccountId =\n 'account_id' in updateParsed.data\n ? normalizeUidString(updateParsed.data.account_id)\n : normalizeUidString(updateParsed.data.publisher);\n const nextMetadataRaw = updateParsed.data.metadata;\n const nextMetadata =\n nextMetadataRaw !== undefined\n ? await this.resolveDiscoveryMetadataObject({\n metadata: nextMetadataRaw,\n mode: 'patch',\n })\n : undefined;\n current = {\n ...current,\n ...(nextAccountId ? { account_id: nextAccountId } : {}),\n metadata: mergeDiscoveryMetadata(current.metadata, nextMetadata),\n };\n }\n\n return current;\n }\n\n async listVersionRegisters(params: {\n versionRegistryTopicId: string;\n skillUid: number;\n limit?: number;\n }): Promise<Array<Hcs26VersionRegister | Hcs26VersionRegisterLegacy>> {\n const limit =\n typeof params.limit === 'number' && params.limit > 0\n ? Math.min(1000, params.limit)\n : 500;\n const messages = await this.mirrorNode.getTopicMessages(\n params.versionRegistryTopicId,\n {\n limit,\n order: 'desc',\n },\n );\n\n const registersByUid = new Map<\n string,\n {\n register: Hcs26VersionRegister | Hcs26VersionRegisterLegacy;\n sequenceNumber: number | null;\n }\n >();\n const updatesByUid = new Map<\n string,\n Array<{ update: Hcs26VersionUpdate; sequenceNumber: number | null }>\n >();\n const deletedByUid = new Map<string, number[]>();\n\n for (const message of messages) {\n const parsedNew = hcs26VersionRegisterSchema.safeParse(message);\n const parsedLegacy = parsedNew.success\n ? null\n : hcs26VersionRegisterLegacySchema.safeParse(message);\n const registerParsed = parsedNew.success\n ? parsedNew\n : parsedLegacy && parsedLegacy.success\n ? parsedLegacy\n : null;\n\n if (registerParsed) {\n if (registerParsed.data.skill_uid !== params.skillUid) {\n continue;\n }\n const uid =\n typeof registerParsed.data.sequence_number === 'number'\n ? String(registerParsed.data.sequence_number)\n : typeof message.sequence_number === 'number'\n ? String(message.sequence_number)\n : null;\n if (uid) {\n const registerSequence = resolveSequenceNumber(\n registerParsed.data.sequence_number,\n message.sequence_number,\n );\n registersByUid.set(uid, {\n register: registerParsed.data as\n | Hcs26VersionRegister\n | Hcs26VersionRegisterLegacy,\n sequenceNumber: registerSequence,\n });\n }\n continue;\n }\n\n const updateParsed = hcs26VersionUpdateSchema.safeParse(message);\n if (updateParsed.success) {\n const uid = updateParsed.data.uid.trim();\n const list = updatesByUid.get(uid) ?? [];\n list.push({\n update: updateParsed.data,\n sequenceNumber: resolveSequenceNumber(\n updateParsed.data.sequence_number,\n message.sequence_number,\n ),\n });\n updatesByUid.set(uid, list);\n continue;\n }\n\n const deleteParsed = hcs26VersionDeleteSchema.safeParse(message);\n if (deleteParsed.success) {\n const uid = deleteParsed.data.uid.trim();\n const list = deletedByUid.get(uid) ?? [];\n const sequenceNumber = resolveSequenceNumber(\n deleteParsed.data.sequence_number,\n message.sequence_number,\n );\n if (sequenceNumber !== null) {\n list.push(sequenceNumber);\n deletedByUid.set(uid, list);\n }\n }\n }\n\n const entries: Array<Hcs26VersionRegister | Hcs26VersionRegisterLegacy> =\n [];\n for (const [uid, registerState] of registersByUid.entries()) {\n const registerSequence =\n registerState.sequenceNumber ?? parseSequenceFromUid(uid);\n const deleteSequences = deletedByUid.get(uid) ?? [];\n const hasDeleteAfterRegister = deleteSequences.some(sequence =>\n registerSequence === null ? true : sequence > registerSequence,\n );\n if (hasDeleteAfterRegister) {\n continue;\n }\n\n const updates = updatesByUid.get(uid);\n if (!updates || updates.length === 0) {\n entries.push(registerState.register);\n continue;\n }\n\n const sorted = [...updates]\n .filter(update =>\n registerSequence === null\n ? true\n : update.sequenceNumber !== null &&\n update.sequenceNumber > registerSequence,\n )\n .sort((a, b) => {\n const aSeq = a.sequenceNumber ?? 0;\n const bSeq = b.sequenceNumber ?? 0;\n return aSeq - bSeq;\n });\n if (sorted.length === 0) {\n entries.push(registerState.register);\n continue;\n }\n\n const final = sorted.reduce<\n Hcs26VersionRegister | Hcs26VersionRegisterLegacy\n >((acc, updateState) => {\n if (updateState.update.status) {\n return { ...acc, status: updateState.update.status };\n }\n return acc;\n }, registerState.register);\n entries.push(final);\n }\n\n return entries;\n }\n\n async getLatestVersionRegister(params: {\n versionRegistryTopicId: string;\n skillUid: number;\n }): Promise<(Hcs26VersionRegister | Hcs26VersionRegisterLegacy) | null> {\n const entries = await this.listVersionRegisters({\n versionRegistryTopicId: params.versionRegistryTopicId,\n skillUid: params.skillUid,\n limit: 100,\n });\n const active = entries.filter(entry => isActiveStatus(entry.status));\n if (active.length === 0) {\n return null;\n }\n\n let best = active[0];\n let bestParsed = parseSemver(best.version);\n\n for (let index = 1; index < active.length; index += 1) {\n const candidate = active[index];\n const candidateParsed = parseSemver(candidate.version);\n\n if (!bestParsed && candidateParsed) {\n best = candidate;\n bestParsed = candidateParsed;\n continue;\n }\n\n if (bestParsed && candidateParsed) {\n const cmp = compareSemver(candidateParsed, bestParsed);\n if (cmp > 0) {\n best = candidate;\n bestParsed = candidateParsed;\n continue;\n }\n\n if (cmp === 0) {\n const bestSeq =\n typeof best.sequence_number === 'number' ? best.sequence_number : 0;\n const candSeq =\n typeof candidate.sequence_number === 'number'\n ? candidate.sequence_number\n : 0;\n if (candSeq > bestSeq) {\n best = candidate;\n bestParsed = candidateParsed;\n }\n }\n }\n }\n\n return best;\n }\n\n async resolveManifest(params: {\n manifestHrl?: string;\n manifestTopicId?: string;\n }): Promise<{\n manifest: Hcs26SkillManifest;\n raw: unknown;\n sha256Hex: string;\n }> {\n const manifestHrl =\n typeof params.manifestHrl === 'string' &&\n params.manifestHrl.trim().length > 0\n ? params.manifestHrl.trim()\n : typeof params.manifestTopicId === 'string' &&\n params.manifestTopicId.trim().length > 0\n ? `hcs://1/${params.manifestTopicId.trim()}`\n : null;\n if (!manifestHrl) {\n throw new Error('Manifest HRL or topic id is required');\n }\n\n const resolved = await this.hrlResolver.resolve(manifestHrl, {\n network: this.network,\n returnRaw: true,\n });\n\n const contentType = resolved.contentType ?? '';\n if (!contentType.toLowerCase().startsWith('application/json')) {\n throw new Error(\n `Expected application/json for manifest, got ${resolved.contentType ?? 'unknown'}`,\n );\n }\n\n const bytes =\n resolved.content instanceof ArrayBuffer\n ? Buffer.from(resolved.content)\n : Buffer.from(String(resolved.content), 'utf8');\n\n const sha256Hex = await hash(bytes, 'sha256');\n\n let raw: unknown;\n try {\n raw = JSON.parse(bytes.toString('utf8'));\n } catch {\n throw new Error('Manifest content is not valid JSON');\n }\n\n const parsed = hcs26SkillManifestSchema.safeParse(raw);\n if (!parsed.success) {\n throw new Error(`Invalid HCS-26 manifest: ${parsed.error.message}`);\n }\n\n const hasSkillMd = parsed.data.files.some(file => file.path === 'SKILL.md');\n if (!hasSkillMd) {\n throw new Error(\n 'HCS-26 manifest must include SKILL.md at path \"SKILL.md\"',\n );\n }\n\n return { manifest: parsed.data, raw, sha256Hex };\n }\n\n async verifyVersionRegisterMatchesManifest(params: {\n versionRegister: Hcs26VersionRegister | Hcs26VersionRegisterLegacy;\n manifestSha256Hex: string;\n }): Promise<void> {\n const checksumRaw = params.versionRegister.checksum;\n if (!checksumRaw) {\n this.logger.warn(\n 'HCS-26 version register is missing checksum; skipping manifest verification.',\n );\n return;\n }\n\n const checksum = checksumRaw.trim();\n if (!checksum.startsWith('sha256:')) {\n throw new Error(`Unsupported checksum: ${checksum}`);\n }\n const expectedHex = checksum.slice('sha256:'.length);\n if (params.manifestSha256Hex !== expectedHex) {\n throw new Error(\n `Manifest checksum mismatch (expected ${expectedHex}, got ${params.manifestSha256Hex})`,\n );\n }\n }\n}\n"],"names":[],"mappings":"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"}