@xylabs/aries 0.1.1

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 (421) hide show
  1. package/README.md +693 -0
  2. package/dist/actions/audit/auditPaths.mjs +22 -0
  3. package/dist/actions/audit/auditPaths.mjs.map +1 -0
  4. package/dist/actions/audit/index.mjs +739 -0
  5. package/dist/actions/audit/index.mjs.map +1 -0
  6. package/dist/actions/audit/installPlugin.mjs +298 -0
  7. package/dist/actions/audit/installPlugin.mjs.map +1 -0
  8. package/dist/actions/audit/listSessions.mjs +93 -0
  9. package/dist/actions/audit/listSessions.mjs.map +1 -0
  10. package/dist/actions/audit/openAuditDir.mjs +44 -0
  11. package/dist/actions/audit/openAuditDir.mjs.map +1 -0
  12. package/dist/actions/audit/searchAudit.mjs +77 -0
  13. package/dist/actions/audit/searchAudit.mjs.map +1 -0
  14. package/dist/actions/audit/showAiMeta.mjs +105 -0
  15. package/dist/actions/audit/showAiMeta.mjs.map +1 -0
  16. package/dist/actions/audit/showSession.mjs +105 -0
  17. package/dist/actions/audit/showSession.mjs.map +1 -0
  18. package/dist/actions/audit/statusAudit.mjs +98 -0
  19. package/dist/actions/audit/statusAudit.mjs.map +1 -0
  20. package/dist/actions/clamp/clampAudit.mjs +53 -0
  21. package/dist/actions/clamp/clampAudit.mjs.map +1 -0
  22. package/dist/actions/clamp/index.mjs +2258 -0
  23. package/dist/actions/clamp/index.mjs.map +1 -0
  24. package/dist/actions/clamp/ipcServer.mjs +55 -0
  25. package/dist/actions/clamp/ipcServer.mjs.map +1 -0
  26. package/dist/actions/clamp/policyManagement.mjs +144 -0
  27. package/dist/actions/clamp/policyManagement.mjs.map +1 -0
  28. package/dist/actions/clamp/promptUser.mjs +91 -0
  29. package/dist/actions/clamp/promptUser.mjs.map +1 -0
  30. package/dist/actions/clamp/runClamped.mjs +2107 -0
  31. package/dist/actions/clamp/runClamped.mjs.map +1 -0
  32. package/dist/actions/clamp/sandboxExec.mjs +1612 -0
  33. package/dist/actions/clamp/sandboxExec.mjs.map +1 -0
  34. package/dist/actions/clamp/shellEnvSetup.mjs +59 -0
  35. package/dist/actions/clamp/shellEnvSetup.mjs.map +1 -0
  36. package/dist/actions/clamp/shimGenerator.mjs +68 -0
  37. package/dist/actions/clamp/shimGenerator.mjs.map +1 -0
  38. package/dist/actions/clamp/terminalRenderer.mjs +145 -0
  39. package/dist/actions/clamp/terminalRenderer.mjs.map +1 -0
  40. package/dist/actions/datalake/audit/auditLog.mjs +191 -0
  41. package/dist/actions/datalake/audit/auditLog.mjs.map +1 -0
  42. package/dist/actions/datalake/createDatalake.mjs +127 -0
  43. package/dist/actions/datalake/createDatalake.mjs.map +1 -0
  44. package/dist/actions/datalake/describeDatalake.mjs +159 -0
  45. package/dist/actions/datalake/describeDatalake.mjs.map +1 -0
  46. package/dist/actions/datalake/destroyDatalake.mjs +34 -0
  47. package/dist/actions/datalake/destroyDatalake.mjs.map +1 -0
  48. package/dist/actions/datalake/dev/downDevServer.mjs +102 -0
  49. package/dist/actions/datalake/dev/downDevServer.mjs.map +1 -0
  50. package/dist/actions/datalake/dev/index.mjs +369 -0
  51. package/dist/actions/datalake/dev/index.mjs.map +1 -0
  52. package/dist/actions/datalake/dev/logsDevServer.mjs +44 -0
  53. package/dist/actions/datalake/dev/logsDevServer.mjs.map +1 -0
  54. package/dist/actions/datalake/dev/paths.mjs +25 -0
  55. package/dist/actions/datalake/dev/paths.mjs.map +1 -0
  56. package/dist/actions/datalake/dev/resetDevServer.mjs +118 -0
  57. package/dist/actions/datalake/dev/resetDevServer.mjs.map +1 -0
  58. package/dist/actions/datalake/dev/resolveServerBin.mjs +26 -0
  59. package/dist/actions/datalake/dev/resolveServerBin.mjs.map +1 -0
  60. package/dist/actions/datalake/dev/state.mjs +62 -0
  61. package/dist/actions/datalake/dev/state.mjs.map +1 -0
  62. package/dist/actions/datalake/dev/statusDevServer.mjs +101 -0
  63. package/dist/actions/datalake/dev/statusDevServer.mjs.map +1 -0
  64. package/dist/actions/datalake/dev/upDevServer.mjs +221 -0
  65. package/dist/actions/datalake/dev/upDevServer.mjs.map +1 -0
  66. package/dist/actions/datalake/dev/waitForHealth.mjs +22 -0
  67. package/dist/actions/datalake/dev/waitForHealth.mjs.map +1 -0
  68. package/dist/actions/datalake/formatters.mjs +90 -0
  69. package/dist/actions/datalake/formatters.mjs.map +1 -0
  70. package/dist/actions/datalake/grantAccess.mjs +116 -0
  71. package/dist/actions/datalake/grantAccess.mjs.map +1 -0
  72. package/dist/actions/datalake/index.mjs +361 -0
  73. package/dist/actions/datalake/index.mjs.map +1 -0
  74. package/dist/actions/datalake/listDatalakes.mjs +54 -0
  75. package/dist/actions/datalake/listDatalakes.mjs.map +1 -0
  76. package/dist/actions/datalake/login.mjs +20 -0
  77. package/dist/actions/datalake/login.mjs.map +1 -0
  78. package/dist/actions/datalake/logout.mjs +11 -0
  79. package/dist/actions/datalake/logout.mjs.map +1 -0
  80. package/dist/actions/datalake/mintToken.mjs +37 -0
  81. package/dist/actions/datalake/mintToken.mjs.map +1 -0
  82. package/dist/actions/datalake/parseSize.mjs +21 -0
  83. package/dist/actions/datalake/parseSize.mjs.map +1 -0
  84. package/dist/actions/datalake/payloads/fetchPayload.mjs +76 -0
  85. package/dist/actions/datalake/payloads/fetchPayload.mjs.map +1 -0
  86. package/dist/actions/datalake/payloads/index.mjs +271 -0
  87. package/dist/actions/datalake/payloads/index.mjs.map +1 -0
  88. package/dist/actions/datalake/payloads/mintAndConnect.mjs +46 -0
  89. package/dist/actions/datalake/payloads/mintAndConnect.mjs.map +1 -0
  90. package/dist/actions/datalake/payloads/parsePayloadsFile.mjs +71 -0
  91. package/dist/actions/datalake/payloads/parsePayloadsFile.mjs.map +1 -0
  92. package/dist/actions/datalake/payloads/pushPayloads.mjs +181 -0
  93. package/dist/actions/datalake/payloads/pushPayloads.mjs.map +1 -0
  94. package/dist/actions/datalake/payloads/tailPayloads.mjs +106 -0
  95. package/dist/actions/datalake/payloads/tailPayloads.mjs.map +1 -0
  96. package/dist/actions/datalake/resolveTarget.mjs +15 -0
  97. package/dist/actions/datalake/resolveTarget.mjs.map +1 -0
  98. package/dist/actions/datalake/revokeAccess.mjs +108 -0
  99. package/dist/actions/datalake/revokeAccess.mjs.map +1 -0
  100. package/dist/actions/datalake/useDatalake.mjs +22 -0
  101. package/dist/actions/datalake/useDatalake.mjs.map +1 -0
  102. package/dist/actions/detect/detectAiClients.mjs +405 -0
  103. package/dist/actions/detect/detectAiClients.mjs.map +1 -0
  104. package/dist/actions/detect/index.mjs +405 -0
  105. package/dist/actions/detect/index.mjs.map +1 -0
  106. package/dist/actions/hash/algorithms/blockhash.mjs +61 -0
  107. package/dist/actions/hash/algorithms/blockhash.mjs.map +1 -0
  108. package/dist/actions/hash/algorithms/chromaprint.mjs +205 -0
  109. package/dist/actions/hash/algorithms/chromaprint.mjs.map +1 -0
  110. package/dist/actions/hash/algorithms/dhash.mjs +75 -0
  111. package/dist/actions/hash/algorithms/dhash.mjs.map +1 -0
  112. package/dist/actions/hash/algorithms/index.mjs +818 -0
  113. package/dist/actions/hash/algorithms/index.mjs.map +1 -0
  114. package/dist/actions/hash/algorithms/nilsimsa.mjs +27 -0
  115. package/dist/actions/hash/algorithms/nilsimsa.mjs.map +1 -0
  116. package/dist/actions/hash/algorithms/pdq.mjs +83 -0
  117. package/dist/actions/hash/algorithms/pdq.mjs.map +1 -0
  118. package/dist/actions/hash/algorithms/phash.mjs +71 -0
  119. package/dist/actions/hash/algorithms/phash.mjs.map +1 -0
  120. package/dist/actions/hash/algorithms/sha256.mjs +24 -0
  121. package/dist/actions/hash/algorithms/sha256.mjs.map +1 -0
  122. package/dist/actions/hash/algorithms/ssdeep.mjs +203 -0
  123. package/dist/actions/hash/algorithms/ssdeep.mjs.map +1 -0
  124. package/dist/actions/hash/algorithms/tlsh.mjs +66 -0
  125. package/dist/actions/hash/algorithms/tlsh.mjs.map +1 -0
  126. package/dist/actions/hash/algorithms/types.mjs +1 -0
  127. package/dist/actions/hash/algorithms/types.mjs.map +1 -0
  128. package/dist/actions/hash/algorithms/videoFrames.mjs +404 -0
  129. package/dist/actions/hash/algorithms/videoFrames.mjs.map +1 -0
  130. package/dist/actions/hash/algorithms/xyo.mjs +30 -0
  131. package/dist/actions/hash/algorithms/xyo.mjs.map +1 -0
  132. package/dist/actions/hash/compareHashes.mjs +823 -0
  133. package/dist/actions/hash/compareHashes.mjs.map +1 -0
  134. package/dist/actions/hash/hashInput.mjs +868 -0
  135. package/dist/actions/hash/hashInput.mjs.map +1 -0
  136. package/dist/actions/hash/index.mjs +881 -0
  137. package/dist/actions/hash/index.mjs.map +1 -0
  138. package/dist/actions/hash/lib/hamming.mjs +44 -0
  139. package/dist/actions/hash/lib/hamming.mjs.map +1 -0
  140. package/dist/actions/hash/lib/levenshtein.mjs +36 -0
  141. package/dist/actions/hash/lib/levenshtein.mjs.map +1 -0
  142. package/dist/actions/hash/lib/runBinary.mjs +54 -0
  143. package/dist/actions/hash/lib/runBinary.mjs.map +1 -0
  144. package/dist/actions/hash/lib/which.mjs +36 -0
  145. package/dist/actions/hash/lib/which.mjs.map +1 -0
  146. package/dist/actions/hash/lib/withTempfile.mjs +19 -0
  147. package/dist/actions/hash/lib/withTempfile.mjs.map +1 -0
  148. package/dist/actions/index.mjs +4615 -0
  149. package/dist/actions/index.mjs.map +1 -0
  150. package/dist/actions/printVersion.mjs +12 -0
  151. package/dist/actions/printVersion.mjs.map +1 -0
  152. package/dist/actions/sync/index.mjs +51 -0
  153. package/dist/actions/sync/index.mjs.map +1 -0
  154. package/dist/actions/sync/syncAiConfig.mjs +51 -0
  155. package/dist/actions/sync/syncAiConfig.mjs.map +1 -0
  156. package/dist/actions/wallet/account/deriveAndAdd.mjs +394 -0
  157. package/dist/actions/wallet/account/deriveAndAdd.mjs.map +1 -0
  158. package/dist/actions/wallet/account/getActiveWallet.mjs +338 -0
  159. package/dist/actions/wallet/account/getActiveWallet.mjs.map +1 -0
  160. package/dist/actions/wallet/account/labelAccount.mjs +389 -0
  161. package/dist/actions/wallet/account/labelAccount.mjs.map +1 -0
  162. package/dist/actions/wallet/account/listAccounts.mjs +374 -0
  163. package/dist/actions/wallet/account/listAccounts.mjs.map +1 -0
  164. package/dist/actions/wallet/account/removeAccount.mjs +384 -0
  165. package/dist/actions/wallet/account/removeAccount.mjs.map +1 -0
  166. package/dist/actions/wallet/account/showAccount.mjs +368 -0
  167. package/dist/actions/wallet/account/showAccount.mjs.map +1 -0
  168. package/dist/actions/wallet/addressBook/storage.mjs +110 -0
  169. package/dist/actions/wallet/addressBook/storage.mjs.map +1 -0
  170. package/dist/actions/wallet/backup/exportBackup.mjs +93 -0
  171. package/dist/actions/wallet/backup/exportBackup.mjs.map +1 -0
  172. package/dist/actions/wallet/backup/importBackup.mjs +142 -0
  173. package/dist/actions/wallet/backup/importBackup.mjs.map +1 -0
  174. package/dist/actions/wallet/balance/getBalance.mjs +434 -0
  175. package/dist/actions/wallet/balance/getBalance.mjs.map +1 -0
  176. package/dist/actions/wallet/client/walletClient.mjs +64 -0
  177. package/dist/actions/wallet/client/walletClient.mjs.map +1 -0
  178. package/dist/actions/wallet/contact/contactActions.mjs +120 -0
  179. package/dist/actions/wallet/contact/contactActions.mjs.map +1 -0
  180. package/dist/actions/wallet/contact/storage.mjs +69 -0
  181. package/dist/actions/wallet/contact/storage.mjs.map +1 -0
  182. package/dist/actions/wallet/index.mjs +1439 -0
  183. package/dist/actions/wallet/index.mjs.map +1 -0
  184. package/dist/actions/wallet/network/networkActions.mjs +137 -0
  185. package/dist/actions/wallet/network/networkActions.mjs.map +1 -0
  186. package/dist/actions/wallet/network/storage.mjs +93 -0
  187. package/dist/actions/wallet/network/storage.mjs.map +1 -0
  188. package/dist/actions/wallet/password/changePassword.mjs +282 -0
  189. package/dist/actions/wallet/password/changePassword.mjs.map +1 -0
  190. package/dist/actions/wallet/password/getActiveKey.mjs +297 -0
  191. package/dist/actions/wallet/password/getActiveKey.mjs.map +1 -0
  192. package/dist/actions/wallet/password/initOrUnlock.mjs +337 -0
  193. package/dist/actions/wallet/password/initOrUnlock.mjs.map +1 -0
  194. package/dist/actions/wallet/password/passwordStorage.mjs +69 -0
  195. package/dist/actions/wallet/password/passwordStorage.mjs.map +1 -0
  196. package/dist/actions/wallet/password/setPassword.mjs +138 -0
  197. package/dist/actions/wallet/password/setPassword.mjs.map +1 -0
  198. package/dist/actions/wallet/password/validatePassword.mjs +123 -0
  199. package/dist/actions/wallet/password/validatePassword.mjs.map +1 -0
  200. package/dist/actions/wallet/passwordKey.mjs +87 -0
  201. package/dist/actions/wallet/passwordKey.mjs.map +1 -0
  202. package/dist/actions/wallet/paths.mjs +26 -0
  203. package/dist/actions/wallet/paths.mjs.map +1 -0
  204. package/dist/actions/wallet/prompt.mjs +93 -0
  205. package/dist/actions/wallet/prompt.mjs.map +1 -0
  206. package/dist/actions/wallet/seedPhrase/createPhrase.mjs +392 -0
  207. package/dist/actions/wallet/seedPhrase/createPhrase.mjs.map +1 -0
  208. package/dist/actions/wallet/seedPhrase/exportPhrase.mjs +334 -0
  209. package/dist/actions/wallet/seedPhrase/exportPhrase.mjs.map +1 -0
  210. package/dist/actions/wallet/seedPhrase/idGen.mjs +11 -0
  211. package/dist/actions/wallet/seedPhrase/idGen.mjs.map +1 -0
  212. package/dist/actions/wallet/seedPhrase/importPhrase.mjs +393 -0
  213. package/dist/actions/wallet/seedPhrase/importPhrase.mjs.map +1 -0
  214. package/dist/actions/wallet/seedPhrase/listPhrases.mjs +62 -0
  215. package/dist/actions/wallet/seedPhrase/listPhrases.mjs.map +1 -0
  216. package/dist/actions/wallet/seedPhrase/phraseStorage.mjs +89 -0
  217. package/dist/actions/wallet/seedPhrase/phraseStorage.mjs.map +1 -0
  218. package/dist/actions/wallet/seedPhrase/removePhrase.mjs +366 -0
  219. package/dist/actions/wallet/seedPhrase/removePhrase.mjs.map +1 -0
  220. package/dist/actions/wallet/seedPhrase/renamePhrase.mjs +78 -0
  221. package/dist/actions/wallet/seedPhrase/renamePhrase.mjs.map +1 -0
  222. package/dist/actions/wallet/seedPhrase/types.mjs +1 -0
  223. package/dist/actions/wallet/seedPhrase/types.mjs.map +1 -0
  224. package/dist/actions/wallet/seedPhrase/usePhrase.mjs +83 -0
  225. package/dist/actions/wallet/seedPhrase/usePhrase.mjs.map +1 -0
  226. package/dist/actions/wallet/session/machineId.mjs +145 -0
  227. package/dist/actions/wallet/session/machineId.mjs.map +1 -0
  228. package/dist/actions/wallet/session/sessionCache.mjs +221 -0
  229. package/dist/actions/wallet/session/sessionCache.mjs.map +1 -0
  230. package/dist/actions/wallet/session/unlock.mjs +307 -0
  231. package/dist/actions/wallet/session/unlock.mjs.map +1 -0
  232. package/dist/actions/wallet/sign/signPayload.mjs +637 -0
  233. package/dist/actions/wallet/sign/signPayload.mjs.map +1 -0
  234. package/dist/actions/wallet/storage.mjs +51 -0
  235. package/dist/actions/wallet/storage.mjs.map +1 -0
  236. package/dist/actions/wallet/transaction/broadcastTransaction.mjs +453 -0
  237. package/dist/actions/wallet/transaction/broadcastTransaction.mjs.map +1 -0
  238. package/dist/actions/wallet/transaction/sendTransaction.mjs +457 -0
  239. package/dist/actions/wallet/transaction/sendTransaction.mjs.map +1 -0
  240. package/dist/actions/wallet/transaction/signTransactionFile.mjs +378 -0
  241. package/dist/actions/wallet/transaction/signTransactionFile.mjs.map +1 -0
  242. package/dist/actions/xyo/index.mjs +138 -0
  243. package/dist/actions/xyo/index.mjs.map +1 -0
  244. package/dist/actions/xyo/transaction/index.mjs +138 -0
  245. package/dist/actions/xyo/transaction/index.mjs.map +1 -0
  246. package/dist/actions/xyo/transaction/validateTransactions.mjs +138 -0
  247. package/dist/actions/xyo/transaction/validateTransactions.mjs.map +1 -0
  248. package/dist/aries.mjs +8466 -0
  249. package/dist/aries.mjs.map +1 -0
  250. package/dist/bin/aries.mjs +8472 -0
  251. package/dist/bin/aries.mjs.map +1 -0
  252. package/dist/commands/aiCommand.mjs +492 -0
  253. package/dist/commands/aiCommand.mjs.map +1 -0
  254. package/dist/commands/auditAiCommand.mjs +119 -0
  255. package/dist/commands/auditAiCommand.mjs.map +1 -0
  256. package/dist/commands/auditCommand.mjs +857 -0
  257. package/dist/commands/auditCommand.mjs.map +1 -0
  258. package/dist/commands/auditInstallCommand.mjs +324 -0
  259. package/dist/commands/auditInstallCommand.mjs.map +1 -0
  260. package/dist/commands/auditListCommand.mjs +107 -0
  261. package/dist/commands/auditListCommand.mjs.map +1 -0
  262. package/dist/commands/auditOpenCommand.mjs +51 -0
  263. package/dist/commands/auditOpenCommand.mjs.map +1 -0
  264. package/dist/commands/auditSearchCommand.mjs +98 -0
  265. package/dist/commands/auditSearchCommand.mjs.map +1 -0
  266. package/dist/commands/auditShowCommand.mjs +123 -0
  267. package/dist/commands/auditShowCommand.mjs.map +1 -0
  268. package/dist/commands/auditStatusCommand.mjs +105 -0
  269. package/dist/commands/auditStatusCommand.mjs.map +1 -0
  270. package/dist/commands/clampCommand.mjs +2328 -0
  271. package/dist/commands/clampCommand.mjs.map +1 -0
  272. package/dist/commands/clampPolicyCommand.mjs +184 -0
  273. package/dist/commands/clampPolicyCommand.mjs.map +1 -0
  274. package/dist/commands/clampPolicyInitCommand.mjs +63 -0
  275. package/dist/commands/clampPolicyInitCommand.mjs.map +1 -0
  276. package/dist/commands/clampPolicyListCommand.mjs +56 -0
  277. package/dist/commands/clampPolicyListCommand.mjs.map +1 -0
  278. package/dist/commands/clampPolicyShowCommand.mjs +83 -0
  279. package/dist/commands/clampPolicyShowCommand.mjs.map +1 -0
  280. package/dist/commands/clampRunCommand.mjs +2137 -0
  281. package/dist/commands/clampRunCommand.mjs.map +1 -0
  282. package/dist/commands/datalakeAuditCommand.mjs +273 -0
  283. package/dist/commands/datalakeAuditCommand.mjs.map +1 -0
  284. package/dist/commands/datalakeCommand.mjs +1637 -0
  285. package/dist/commands/datalakeCommand.mjs.map +1 -0
  286. package/dist/commands/datalakeCreateCommand.mjs +189 -0
  287. package/dist/commands/datalakeCreateCommand.mjs.map +1 -0
  288. package/dist/commands/datalakeDescribeCommand.mjs +172 -0
  289. package/dist/commands/datalakeDescribeCommand.mjs.map +1 -0
  290. package/dist/commands/datalakeDestroyCommand.mjs +53 -0
  291. package/dist/commands/datalakeDestroyCommand.mjs.map +1 -0
  292. package/dist/commands/datalakeDevCommand.mjs +470 -0
  293. package/dist/commands/datalakeDevCommand.mjs.map +1 -0
  294. package/dist/commands/datalakeDevDownCommand.mjs +111 -0
  295. package/dist/commands/datalakeDevDownCommand.mjs.map +1 -0
  296. package/dist/commands/datalakeDevLogsCommand.mjs +65 -0
  297. package/dist/commands/datalakeDevLogsCommand.mjs.map +1 -0
  298. package/dist/commands/datalakeDevResetCommand.mjs +125 -0
  299. package/dist/commands/datalakeDevResetCommand.mjs.map +1 -0
  300. package/dist/commands/datalakeDevStatusCommand.mjs +110 -0
  301. package/dist/commands/datalakeDevStatusCommand.mjs.map +1 -0
  302. package/dist/commands/datalakeDevUpCommand.mjs +268 -0
  303. package/dist/commands/datalakeDevUpCommand.mjs.map +1 -0
  304. package/dist/commands/datalakeFetchCommand.mjs +106 -0
  305. package/dist/commands/datalakeFetchCommand.mjs.map +1 -0
  306. package/dist/commands/datalakeGrantCommand.mjs +147 -0
  307. package/dist/commands/datalakeGrantCommand.mjs.map +1 -0
  308. package/dist/commands/datalakeListCommand.mjs +61 -0
  309. package/dist/commands/datalakeListCommand.mjs.map +1 -0
  310. package/dist/commands/datalakeLoginCommand.mjs +39 -0
  311. package/dist/commands/datalakeLoginCommand.mjs.map +1 -0
  312. package/dist/commands/datalakeLogoutCommand.mjs +20 -0
  313. package/dist/commands/datalakeLogoutCommand.mjs.map +1 -0
  314. package/dist/commands/datalakePushCommand.mjs +214 -0
  315. package/dist/commands/datalakePushCommand.mjs.map +1 -0
  316. package/dist/commands/datalakeRevokeCommand.mjs +127 -0
  317. package/dist/commands/datalakeRevokeCommand.mjs.map +1 -0
  318. package/dist/commands/datalakeTailCommand.mjs +144 -0
  319. package/dist/commands/datalakeTailCommand.mjs.map +1 -0
  320. package/dist/commands/datalakeTokenCommand.mjs +61 -0
  321. package/dist/commands/datalakeTokenCommand.mjs.map +1 -0
  322. package/dist/commands/datalakeUseCommand.mjs +35 -0
  323. package/dist/commands/datalakeUseCommand.mjs.map +1 -0
  324. package/dist/commands/detectCommand.mjs +419 -0
  325. package/dist/commands/detectCommand.mjs.map +1 -0
  326. package/dist/commands/hashCommand.mjs +976 -0
  327. package/dist/commands/hashCommand.mjs.map +1 -0
  328. package/dist/commands/hashCompareCommand.mjs +865 -0
  329. package/dist/commands/hashCompareCommand.mjs.map +1 -0
  330. package/dist/commands/index.mjs +8461 -0
  331. package/dist/commands/index.mjs.map +1 -0
  332. package/dist/commands/syncCommand.mjs +66 -0
  333. package/dist/commands/syncCommand.mjs.map +1 -0
  334. package/dist/commands/versionCommand.mjs +24 -0
  335. package/dist/commands/versionCommand.mjs.map +1 -0
  336. package/dist/commands/walletAccountCommand.mjs +536 -0
  337. package/dist/commands/walletAccountCommand.mjs.map +1 -0
  338. package/dist/commands/walletAccountDeriveCommand.mjs +415 -0
  339. package/dist/commands/walletAccountDeriveCommand.mjs.map +1 -0
  340. package/dist/commands/walletAccountLabelCommand.mjs +405 -0
  341. package/dist/commands/walletAccountLabelCommand.mjs.map +1 -0
  342. package/dist/commands/walletAccountListCommand.mjs +381 -0
  343. package/dist/commands/walletAccountListCommand.mjs.map +1 -0
  344. package/dist/commands/walletAccountRemoveCommand.mjs +396 -0
  345. package/dist/commands/walletAccountRemoveCommand.mjs.map +1 -0
  346. package/dist/commands/walletAccountShowCommand.mjs +380 -0
  347. package/dist/commands/walletAccountShowCommand.mjs.map +1 -0
  348. package/dist/commands/walletBackupCommand.mjs +222 -0
  349. package/dist/commands/walletBackupCommand.mjs.map +1 -0
  350. package/dist/commands/walletBackupExportCommand.mjs +107 -0
  351. package/dist/commands/walletBackupExportCommand.mjs.map +1 -0
  352. package/dist/commands/walletBackupImportCommand.mjs +154 -0
  353. package/dist/commands/walletBackupImportCommand.mjs.map +1 -0
  354. package/dist/commands/walletBalanceCommand.mjs +448 -0
  355. package/dist/commands/walletBalanceCommand.mjs.map +1 -0
  356. package/dist/commands/walletCommand.mjs +1968 -0
  357. package/dist/commands/walletCommand.mjs.map +1 -0
  358. package/dist/commands/walletContactAddCommand.mjs +111 -0
  359. package/dist/commands/walletContactAddCommand.mjs.map +1 -0
  360. package/dist/commands/walletContactCommand.mjs +184 -0
  361. package/dist/commands/walletContactCommand.mjs.map +1 -0
  362. package/dist/commands/walletContactListCommand.mjs +66 -0
  363. package/dist/commands/walletContactListCommand.mjs.map +1 -0
  364. package/dist/commands/walletContactRemoveCommand.mjs +97 -0
  365. package/dist/commands/walletContactRemoveCommand.mjs.map +1 -0
  366. package/dist/commands/walletContactRenameCommand.mjs +114 -0
  367. package/dist/commands/walletContactRenameCommand.mjs.map +1 -0
  368. package/dist/commands/walletCreateCommand.mjs +407 -0
  369. package/dist/commands/walletCreateCommand.mjs.map +1 -0
  370. package/dist/commands/walletExportCommand.mjs +345 -0
  371. package/dist/commands/walletExportCommand.mjs.map +1 -0
  372. package/dist/commands/walletImportCommand.mjs +413 -0
  373. package/dist/commands/walletImportCommand.mjs.map +1 -0
  374. package/dist/commands/walletListCommand.mjs +69 -0
  375. package/dist/commands/walletListCommand.mjs.map +1 -0
  376. package/dist/commands/walletLockCommand.mjs +56 -0
  377. package/dist/commands/walletLockCommand.mjs.map +1 -0
  378. package/dist/commands/walletNetworkAddCommand.mjs +131 -0
  379. package/dist/commands/walletNetworkAddCommand.mjs.map +1 -0
  380. package/dist/commands/walletNetworkCommand.mjs +206 -0
  381. package/dist/commands/walletNetworkCommand.mjs.map +1 -0
  382. package/dist/commands/walletNetworkListCommand.mjs +104 -0
  383. package/dist/commands/walletNetworkListCommand.mjs.map +1 -0
  384. package/dist/commands/walletNetworkRemoveCommand.mjs +112 -0
  385. package/dist/commands/walletNetworkRemoveCommand.mjs.map +1 -0
  386. package/dist/commands/walletNetworkUseCommand.mjs +110 -0
  387. package/dist/commands/walletNetworkUseCommand.mjs.map +1 -0
  388. package/dist/commands/walletPasswordChangeCommand.mjs +291 -0
  389. package/dist/commands/walletPasswordChangeCommand.mjs.map +1 -0
  390. package/dist/commands/walletPasswordCommand.mjs +301 -0
  391. package/dist/commands/walletPasswordCommand.mjs.map +1 -0
  392. package/dist/commands/walletRemoveCommand.mjs +378 -0
  393. package/dist/commands/walletRemoveCommand.mjs.map +1 -0
  394. package/dist/commands/walletRenameCommand.mjs +94 -0
  395. package/dist/commands/walletRenameCommand.mjs.map +1 -0
  396. package/dist/commands/walletSignCommand.mjs +662 -0
  397. package/dist/commands/walletSignCommand.mjs.map +1 -0
  398. package/dist/commands/walletTxBroadcastCommand.mjs +473 -0
  399. package/dist/commands/walletTxBroadcastCommand.mjs.map +1 -0
  400. package/dist/commands/walletTxCommand.mjs +612 -0
  401. package/dist/commands/walletTxCommand.mjs.map +1 -0
  402. package/dist/commands/walletTxSendCommand.mjs +492 -0
  403. package/dist/commands/walletTxSendCommand.mjs.map +1 -0
  404. package/dist/commands/walletTxSignCommand.mjs +403 -0
  405. package/dist/commands/walletTxSignCommand.mjs.map +1 -0
  406. package/dist/commands/walletUnlockCommand.mjs +308 -0
  407. package/dist/commands/walletUnlockCommand.mjs.map +1 -0
  408. package/dist/commands/walletUseCommand.mjs +95 -0
  409. package/dist/commands/walletUseCommand.mjs.map +1 -0
  410. package/dist/commands/xyoCommand.mjs +188 -0
  411. package/dist/commands/xyoCommand.mjs.map +1 -0
  412. package/dist/commands/xyoTxCommand.mjs +178 -0
  413. package/dist/commands/xyoTxCommand.mjs.map +1 -0
  414. package/dist/commands/xyoTxValidateCommand.mjs +168 -0
  415. package/dist/commands/xyoTxValidateCommand.mjs.map +1 -0
  416. package/dist/index.d.ts +3 -0
  417. package/dist/index.mjs +8466 -0
  418. package/dist/index.mjs.map +1 -0
  419. package/dist/types/modules.d.mjs +1 -0
  420. package/dist/types/modules.d.mjs.map +1 -0
  421. package/package.json +197 -0
@@ -0,0 +1,205 @@
1
+ // src/actions/hash/lib/hamming.ts
2
+ function popcount32(value) {
3
+ let v = Math.trunc(value);
4
+ v = v - (v >>> 1 & 1431655765);
5
+ v = (v & 858993459) + (v >>> 2 & 858993459);
6
+ v = v + (v >>> 4) & 252645135;
7
+ return v * 16843009 >>> 24 & 255;
8
+ }
9
+
10
+ // src/actions/hash/lib/runBinary.ts
11
+ import { spawn } from "child_process";
12
+ async function runBinary(options) {
13
+ const maxBytes = options.maxBytes ?? 64 * 1024 * 1024;
14
+ return await new Promise((resolve, reject) => {
15
+ const child = spawn(options.binary, [...options.args ?? []], { stdio: ["pipe", "pipe", "pipe"] });
16
+ const stdoutChunks = [];
17
+ let stdoutBytes = 0;
18
+ let stderr = "";
19
+ let killedForOverflow = false;
20
+ child.stdout.on("data", (chunk) => {
21
+ stdoutBytes += chunk.length;
22
+ if (stdoutBytes > maxBytes) {
23
+ if (!killedForOverflow) {
24
+ killedForOverflow = true;
25
+ child.kill("SIGKILL");
26
+ }
27
+ return;
28
+ }
29
+ stdoutChunks.push(chunk);
30
+ });
31
+ child.stderr.on("data", (chunk) => {
32
+ stderr += chunk.toString("utf8");
33
+ });
34
+ child.on("error", (err) => reject(err));
35
+ child.on("close", (code) => {
36
+ if (killedForOverflow) {
37
+ reject(new Error(`${options.binary} stdout exceeded ${maxBytes} bytes`));
38
+ return;
39
+ }
40
+ const exitCode = code ?? -1;
41
+ const stdout = Buffer.concat(stdoutChunks);
42
+ if (exitCode !== 0) {
43
+ const tail = stderr.trim().split(/\r?\n/).slice(-3).join("\n");
44
+ reject(new Error(`${options.binary} exited ${exitCode}${tail.length > 0 ? `: ${tail}` : ""}`));
45
+ return;
46
+ }
47
+ resolve({
48
+ stdout,
49
+ stderr,
50
+ exitCode
51
+ });
52
+ });
53
+ if (options.stdin === void 0) {
54
+ child.stdin.end();
55
+ } else {
56
+ child.stdin.end(options.stdin);
57
+ }
58
+ });
59
+ }
60
+
61
+ // src/actions/hash/lib/which.ts
62
+ import { spawn as spawn2 } from "child_process";
63
+ async function which(binary) {
64
+ return await new Promise((resolve) => {
65
+ const cmd = process.platform === "win32" ? "where" : "command";
66
+ const args = process.platform === "win32" ? [binary] : ["-v", binary];
67
+ const child = spawn2(cmd, args, { shell: process.platform !== "win32" });
68
+ let stdout = "";
69
+ child.stdout.on("data", (chunk) => {
70
+ stdout += chunk.toString("utf8");
71
+ });
72
+ child.on("error", () => resolve(null));
73
+ child.on("close", (code) => {
74
+ if (code === 0) {
75
+ const path = stdout.split(/\r?\n/).find((line) => line.trim().length > 0)?.trim() ?? null;
76
+ resolve(path);
77
+ } else {
78
+ resolve(null);
79
+ }
80
+ });
81
+ });
82
+ }
83
+ async function requireBinary(req) {
84
+ const path = await which(req.binary);
85
+ if (path !== null) return path;
86
+ const lines = [`${req.binary} binary not found on PATH. Install with:`];
87
+ if (req.install.brew !== void 0) lines.push(` macOS: brew install ${req.install.brew}`);
88
+ if (req.install.apt !== void 0) lines.push(` Debian: apt install ${req.install.apt}`);
89
+ if (req.install.choco !== void 0) lines.push(` Windows: choco install ${req.install.choco}`);
90
+ throw new Error(lines.join("\n"));
91
+ }
92
+
93
+ // src/actions/hash/lib/withTempfile.ts
94
+ import { randomBytes } from "crypto";
95
+ import { rm, writeFile } from "fs/promises";
96
+ import OS from "os";
97
+ import PATH from "path";
98
+ async function withTempfile(bytes, extension, fn) {
99
+ const ext = extension !== void 0 && extension.length > 0 ? `.${extension}` : "";
100
+ const path = PATH.join(OS.tmpdir(), `aries-hash-${randomBytes(8).toString("hex")}${ext}`);
101
+ await writeFile(path, bytes);
102
+ try {
103
+ return await fn(path);
104
+ } finally {
105
+ await rm(path, { force: true });
106
+ }
107
+ }
108
+
109
+ // src/actions/hash/algorithms/chromaprint.ts
110
+ var FPCALC_BIN = {
111
+ binary: "fpcalc",
112
+ install: {
113
+ brew: "chromaprint",
114
+ apt: "libchromaprint-tools",
115
+ choco: "chromaprint"
116
+ }
117
+ };
118
+ async function runFpcalc(path) {
119
+ await requireBinary(FPCALC_BIN);
120
+ const { stdout } = await runBinary({ binary: "fpcalc", args: ["-raw", "-json", path] });
121
+ const parsed = JSON.parse(stdout.toString("utf8"));
122
+ if (typeof parsed.duration !== "number" || !Array.isArray(parsed.fingerprint)) {
123
+ throw new TypeError("fpcalc returned unexpected JSON shape.");
124
+ }
125
+ return {
126
+ algorithm: "chromaprint",
127
+ duration: parsed.duration,
128
+ fingerprint: parsed.fingerprint
129
+ };
130
+ }
131
+ function parseChromaprintHash(raw) {
132
+ let parsed;
133
+ try {
134
+ parsed = JSON.parse(raw);
135
+ } catch {
136
+ throw new Error("chromaprint hash must be a JSON document produced by `aries hash --algorithm chromaprint`.");
137
+ }
138
+ const obj = parsed;
139
+ if (obj.algorithm !== "chromaprint" || typeof obj.duration !== "number" || !Array.isArray(obj.fingerprint)) {
140
+ throw new Error("chromaprint hash JSON missing required fields (algorithm, duration, fingerprint).");
141
+ }
142
+ return obj;
143
+ }
144
+ function compareFingerprints(a, b) {
145
+ if (a.length === 0 || b.length === 0) {
146
+ return {
147
+ similarity: 0,
148
+ distance: Number.NaN,
149
+ offset: 0
150
+ };
151
+ }
152
+ const span = Math.min(a.length, b.length);
153
+ const maxOffset = Math.max(a.length, b.length) - span;
154
+ let best = {
155
+ similarity: 0,
156
+ distance: 32 * span,
157
+ offset: 0
158
+ };
159
+ for (let offset = -maxOffset; offset <= maxOffset; offset++) {
160
+ const aStart = Math.max(0, -offset);
161
+ const bStart = Math.max(0, offset);
162
+ const overlap = Math.min(a.length - aStart, b.length - bStart);
163
+ if (overlap < Math.max(8, span / 4)) continue;
164
+ let bits = 0;
165
+ for (let i = 0; i < overlap; i++) {
166
+ bits += popcount32(a[aStart + i] ^ b[bStart + i]);
167
+ }
168
+ const similarity = 1 - bits / (32 * overlap);
169
+ if (similarity > best.similarity) {
170
+ best = {
171
+ similarity,
172
+ distance: bits,
173
+ offset
174
+ };
175
+ }
176
+ }
177
+ return best;
178
+ }
179
+ var chromaprintAlgorithm = {
180
+ name: "chromaprint",
181
+ family: "audio",
182
+ inputType: "audio",
183
+ requires: [FPCALC_BIN],
184
+ async hash(input) {
185
+ const fp = input.path === void 0 ? input.bytes === void 0 ? null : await withTempfile(input.bytes, "audio.bin", async (path) => await runFpcalc(path)) : await runFpcalc(input.path);
186
+ if (fp === null) {
187
+ throw new Error("chromaprint requires bytes or a path.");
188
+ }
189
+ return JSON.stringify(fp);
190
+ },
191
+ async compare(a, b) {
192
+ const fpA = parseChromaprintHash(a);
193
+ const fpB = parseChromaprintHash(b);
194
+ const result = compareFingerprints(fpA.fingerprint, fpB.fingerprint);
195
+ return {
196
+ similarity: result.similarity,
197
+ distance: Number.isFinite(result.distance) ? result.distance : void 0,
198
+ metric: "chromaprint-windowed-hamming"
199
+ };
200
+ }
201
+ };
202
+ export {
203
+ chromaprintAlgorithm
204
+ };
205
+ //# sourceMappingURL=chromaprint.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/actions/hash/lib/hamming.ts","../../../../src/actions/hash/lib/runBinary.ts","../../../../src/actions/hash/lib/which.ts","../../../../src/actions/hash/lib/withTempfile.ts","../../../../src/actions/hash/algorithms/chromaprint.ts"],"sourcesContent":["/**\n * Population count for an 8-bit value (number of set bits).\n */\nfunction popcount8(byte: number): number {\n let count = 0\n let value = byte & 0xff\n while (value !== 0) {\n count += value & 1\n value >>>= 1\n }\n return count\n}\n\n/**\n * Hamming distance between two equal-length lowercase-hex strings.\n * Throws when the lengths differ.\n */\nexport function hammingHex(a: string, b: string): number {\n if (a.length !== b.length) {\n throw new Error(`Hash length mismatch: ${a.length} vs ${b.length}`)\n }\n if (a.length % 2 !== 0) {\n throw new Error(`Hash hex length must be even, got ${a.length}`)\n }\n let dist = 0\n for (let i = 0; i < a.length; i += 2) {\n const xa = Number.parseInt(a.slice(i, i + 2), 16)\n const xb = Number.parseInt(b.slice(i, i + 2), 16)\n if (Number.isNaN(xa) || Number.isNaN(xb)) {\n throw new TypeError(`Invalid hex at position ${i}: '${a.slice(i, i + 2)}' / '${b.slice(i, i + 2)}'`)\n }\n dist += popcount8(xa ^ xb)\n }\n return dist\n}\n\n/**\n * Bit-length of an even-length hex string.\n */\nexport function bitLengthHex(hex: string): number {\n return (hex.length / 2) * 8\n}\n\n/**\n * Population count for a 32-bit unsigned value (number of set bits).\n * Uses the parallel-prefix bit trick.\n */\nexport function popcount32(value: number): number {\n let v = Math.trunc(value)\n v = v - ((v >>> 1) & 0x55_55_55_55)\n v = (v & 0x33_33_33_33) + ((v >>> 2) & 0x33_33_33_33)\n v = (v + (v >>> 4)) & 0x0f_0f_0f_0f\n return ((v * 0x01_01_01_01) >>> 24) & 0xff\n}\n","import { spawn } from 'node:child_process'\n\nexport interface RunBinaryOptions {\n binary: string\n args?: readonly string[]\n /** When provided, written to the child's stdin and stdin is closed. */\n stdin?: Buffer\n /** When true, the child's stdout is captured as a Buffer. Otherwise as utf8. */\n binaryOutput?: boolean\n /** Cap stdout capture at this many bytes. Default 64 MiB. */\n maxBytes?: number\n}\n\nexport interface RunBinaryResult {\n stdout: Buffer\n stderr: string\n exitCode: number\n}\n\n/**\n * Spawn a binary, optionally write to its stdin, and capture stdout/stderr.\n * Throws if the child exits non-zero.\n */\nexport async function runBinary(options: RunBinaryOptions): Promise<RunBinaryResult> {\n const maxBytes = options.maxBytes ?? 64 * 1024 * 1024\n return await new Promise((resolve, reject) => {\n const child = spawn(options.binary, [...(options.args ?? [])], { stdio: ['pipe', 'pipe', 'pipe'] })\n\n const stdoutChunks: Buffer[] = []\n let stdoutBytes = 0\n let stderr = ''\n let killedForOverflow = false\n\n child.stdout.on('data', (chunk: Buffer) => {\n stdoutBytes += chunk.length\n if (stdoutBytes > maxBytes) {\n if (!killedForOverflow) {\n killedForOverflow = true\n child.kill('SIGKILL')\n }\n return\n }\n stdoutChunks.push(chunk)\n })\n child.stderr.on('data', (chunk: Buffer) => {\n stderr += chunk.toString('utf8')\n })\n\n child.on('error', err => reject(err))\n child.on('close', (code) => {\n if (killedForOverflow) {\n reject(new Error(`${options.binary} stdout exceeded ${maxBytes} bytes`))\n return\n }\n const exitCode = code ?? -1\n const stdout = Buffer.concat(stdoutChunks)\n if (exitCode !== 0) {\n const tail = stderr.trim().split(/\\r?\\n/).slice(-3).join('\\n')\n reject(new Error(`${options.binary} exited ${exitCode}${tail.length > 0 ? `: ${tail}` : ''}`))\n return\n }\n resolve({\n stdout, stderr, exitCode,\n })\n })\n\n if (options.stdin === undefined) {\n child.stdin.end()\n } else {\n child.stdin.end(options.stdin)\n }\n })\n}\n","import { spawn } from 'node:child_process'\n\nimport type { RequiredBinary } from '../algorithms/types.ts'\n\n/**\n * Resolve a binary name to its absolute path on the user's PATH.\n * Returns null if not found.\n */\nexport async function which(binary: string): Promise<string | null> {\n return await new Promise((resolve) => {\n const cmd = process.platform === 'win32' ? 'where' : 'command'\n const args = process.platform === 'win32' ? [binary] : ['-v', binary]\n const child = spawn(cmd, args, { shell: process.platform !== 'win32' })\n\n let stdout = ''\n child.stdout.on('data', (chunk: Buffer) => {\n stdout += chunk.toString('utf8')\n })\n child.on('error', () => resolve(null))\n child.on('close', (code) => {\n if (code === 0) {\n const path = stdout.split(/\\r?\\n/).find(line => line.trim().length > 0)?.trim() ?? null\n resolve(path)\n } else {\n resolve(null)\n }\n })\n })\n}\n\n/**\n * Throw a clearly-actionable error when a required binary is missing.\n */\nexport async function requireBinary(req: RequiredBinary): Promise<string> {\n const path = await which(req.binary)\n if (path !== null) return path\n const lines = [`${req.binary} binary not found on PATH. Install with:`]\n if (req.install.brew !== undefined) lines.push(` macOS: brew install ${req.install.brew}`)\n if (req.install.apt !== undefined) lines.push(` Debian: apt install ${req.install.apt}`)\n if (req.install.choco !== undefined) lines.push(` Windows: choco install ${req.install.choco}`)\n throw new Error(lines.join('\\n'))\n}\n","import { randomBytes } from 'node:crypto'\nimport { rm, writeFile } from 'node:fs/promises'\nimport OS from 'node:os'\nimport PATH from 'node:path'\n\n/**\n * Write a buffer to a tempfile, run `fn` with its path, and unlink afterwards.\n * `extension` is included in the filename when provided (no leading dot).\n */\nexport async function withTempfile<T>(\n bytes: Buffer,\n extension: string | undefined,\n fn: (path: string) => Promise<T>,\n): Promise<T> {\n const ext = extension !== undefined && extension.length > 0 ? `.${extension}` : ''\n const path = PATH.join(OS.tmpdir(), `aries-hash-${randomBytes(8).toString('hex')}${ext}`)\n await writeFile(path, bytes)\n try {\n return await fn(path)\n } finally {\n await rm(path, { force: true })\n }\n}\n","import { popcount32 } from '../lib/hamming.ts'\nimport { runBinary } from '../lib/runBinary.ts'\nimport { requireBinary } from '../lib/which.ts'\nimport { withTempfile } from '../lib/withTempfile.ts'\nimport type { Algorithm, RequiredBinary } from './types.ts'\n\nconst FPCALC_BIN: RequiredBinary = {\n binary: 'fpcalc',\n install: {\n brew: 'chromaprint',\n apt: 'libchromaprint-tools',\n choco: 'chromaprint',\n },\n}\n\ninterface ChromaprintFingerprint {\n algorithm: 'chromaprint'\n duration: number\n fingerprint: number[]\n}\n\ninterface FpcalcJsonRaw {\n duration: number\n fingerprint: number[]\n}\n\nasync function runFpcalc(path: string): Promise<ChromaprintFingerprint> {\n await requireBinary(FPCALC_BIN)\n // -raw: output the fingerprint as a comma-separated list of 32-bit integers.\n // -json: combine with -raw to get JSON whose `fingerprint` is an int[].\n const { stdout } = await runBinary({ binary: 'fpcalc', args: ['-raw', '-json', path] })\n const parsed = JSON.parse(stdout.toString('utf8')) as FpcalcJsonRaw\n if (typeof parsed.duration !== 'number' || !Array.isArray(parsed.fingerprint)) {\n throw new TypeError('fpcalc returned unexpected JSON shape.')\n }\n return {\n algorithm: 'chromaprint',\n duration: parsed.duration,\n fingerprint: parsed.fingerprint,\n }\n}\n\nfunction parseChromaprintHash(raw: string): ChromaprintFingerprint {\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch {\n throw new Error('chromaprint hash must be a JSON document produced by `aries hash --algorithm chromaprint`.')\n }\n const obj = parsed as Partial<ChromaprintFingerprint>\n if (obj.algorithm !== 'chromaprint' || typeof obj.duration !== 'number' || !Array.isArray(obj.fingerprint)) {\n throw new Error('chromaprint hash JSON missing required fields (algorithm, duration, fingerprint).')\n }\n return obj as ChromaprintFingerprint\n}\n\n/**\n * Compare two chromaprint fingerprints by windowed Hamming distance over their 32-bit\n * frame integers. We slide one fingerprint over the other to find the best alignment\n * offset; bits matching across the overlap → similarity, lower is better.\n */\nfunction compareFingerprints(a: number[], b: number[]): { similarity: number; distance: number; offset: number } {\n if (a.length === 0 || b.length === 0) {\n return {\n similarity: 0, distance: Number.NaN, offset: 0,\n }\n }\n\n const span = Math.min(a.length, b.length)\n const maxOffset = Math.max(a.length, b.length) - span\n let best = {\n similarity: 0,\n distance: 32 * span,\n offset: 0,\n }\n\n for (let offset = -maxOffset; offset <= maxOffset; offset++) {\n const aStart = Math.max(0, -offset)\n const bStart = Math.max(0, offset)\n const overlap = Math.min(a.length - aStart, b.length - bStart)\n if (overlap < Math.max(8, span / 4)) continue\n let bits = 0\n for (let i = 0; i < overlap; i++) {\n bits += popcount32(a[aStart + i] ^ b[bStart + i])\n }\n const similarity = 1 - bits / (32 * overlap)\n if (similarity > best.similarity) {\n best = {\n similarity, distance: bits, offset,\n }\n }\n }\n return best\n}\n\nexport const chromaprintAlgorithm: Algorithm = {\n name: 'chromaprint',\n family: 'audio',\n inputType: 'audio',\n requires: [FPCALC_BIN],\n async hash(input) {\n const fp = input.path === undefined\n ? input.bytes === undefined\n ? null\n : await withTempfile(input.bytes, 'audio.bin', async path => await runFpcalc(path))\n : await runFpcalc(input.path)\n if (fp === null) {\n throw new Error('chromaprint requires bytes or a path.')\n }\n return JSON.stringify(fp)\n },\n async compare(a, b) {\n const fpA = parseChromaprintHash(a)\n const fpB = parseChromaprintHash(b)\n const result = compareFingerprints(fpA.fingerprint, fpB.fingerprint)\n return {\n similarity: result.similarity,\n distance: Number.isFinite(result.distance) ? result.distance : undefined,\n metric: 'chromaprint-windowed-hamming',\n }\n },\n}\n"],"mappings":"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","names":["spawn"]}
@@ -0,0 +1,75 @@
1
+ // src/actions/hash/algorithms/dhash.ts
2
+ import { readFile } from "fs/promises";
3
+ import sharp from "sharp";
4
+
5
+ // src/actions/hash/lib/hamming.ts
6
+ function popcount8(byte) {
7
+ let count = 0;
8
+ let value = byte & 255;
9
+ while (value !== 0) {
10
+ count += value & 1;
11
+ value >>>= 1;
12
+ }
13
+ return count;
14
+ }
15
+ function hammingHex(a, b) {
16
+ if (a.length !== b.length) {
17
+ throw new Error(`Hash length mismatch: ${a.length} vs ${b.length}`);
18
+ }
19
+ if (a.length % 2 !== 0) {
20
+ throw new Error(`Hash hex length must be even, got ${a.length}`);
21
+ }
22
+ let dist = 0;
23
+ for (let i = 0; i < a.length; i += 2) {
24
+ const xa = Number.parseInt(a.slice(i, i + 2), 16);
25
+ const xb = Number.parseInt(b.slice(i, i + 2), 16);
26
+ if (Number.isNaN(xa) || Number.isNaN(xb)) {
27
+ throw new TypeError(`Invalid hex at position ${i}: '${a.slice(i, i + 2)}' / '${b.slice(i, i + 2)}'`);
28
+ }
29
+ dist += popcount8(xa ^ xb);
30
+ }
31
+ return dist;
32
+ }
33
+
34
+ // src/actions/hash/algorithms/dhash.ts
35
+ var dhashAlgorithm = {
36
+ name: "dhash",
37
+ family: "perceptual-image",
38
+ inputType: "image",
39
+ async hash(input) {
40
+ const source = input.bytes ?? (input.path === void 0 ? void 0 : await readFile(input.path));
41
+ if (source === void 0) {
42
+ throw new Error("dhash requires bytes or a path.");
43
+ }
44
+ const raw = await sharp(source).resize(9, 8, { fit: "fill" }).grayscale().raw().toBuffer();
45
+ if (raw.length !== 9 * 8) {
46
+ throw new Error(`dhash unexpected raw buffer length ${raw.length}`);
47
+ }
48
+ let bits = "";
49
+ for (let row = 0; row < 8; row++) {
50
+ for (let col = 0; col < 8; col++) {
51
+ const left = raw[row * 9 + col];
52
+ const right = raw[row * 9 + col + 1];
53
+ bits += left > right ? "1" : "0";
54
+ }
55
+ }
56
+ let hex = "";
57
+ for (let i = 0; i < bits.length; i += 4) {
58
+ hex += Number.parseInt(bits.slice(i, i + 4), 2).toString(16);
59
+ }
60
+ return hex;
61
+ },
62
+ async compare(a, b) {
63
+ const dist = hammingHex(a, b);
64
+ const bits = a.length / 2 * 8;
65
+ return {
66
+ distance: dist,
67
+ similarity: 1 - dist / bits,
68
+ metric: `hamming-${bits}`
69
+ };
70
+ }
71
+ };
72
+ export {
73
+ dhashAlgorithm
74
+ };
75
+ //# sourceMappingURL=dhash.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/actions/hash/algorithms/dhash.ts","../../../../src/actions/hash/lib/hamming.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises'\n\nimport sharp from 'sharp'\n\nimport { hammingHex } from '../lib/hamming.ts'\nimport type { Algorithm } from './types.ts'\n\n/**\n * dHash (difference hash): resize to 9×8 grayscale, then for each row produce 8 bits\n * representing whether pixel[i] > pixel[i+1]. 8 rows × 8 bits = 64 bits → 16 hex chars.\n */\nexport const dhashAlgorithm: Algorithm = {\n name: 'dhash',\n family: 'perceptual-image',\n inputType: 'image',\n async hash(input) {\n const source = input.bytes ?? (input.path === undefined ? undefined : await readFile(input.path))\n if (source === undefined) {\n throw new Error('dhash requires bytes or a path.')\n }\n const raw = await sharp(source)\n .resize(9, 8, { fit: 'fill' })\n .grayscale()\n .raw()\n .toBuffer()\n if (raw.length !== 9 * 8) {\n throw new Error(`dhash unexpected raw buffer length ${raw.length}`)\n }\n let bits = ''\n for (let row = 0; row < 8; row++) {\n for (let col = 0; col < 8; col++) {\n const left = raw[row * 9 + col]\n const right = raw[row * 9 + col + 1]\n bits += left > right ? '1' : '0'\n }\n }\n let hex = ''\n for (let i = 0; i < bits.length; i += 4) {\n hex += Number.parseInt(bits.slice(i, i + 4), 2).toString(16)\n }\n return hex\n },\n async compare(a, b) {\n const dist = hammingHex(a, b)\n const bits = (a.length / 2) * 8\n return {\n distance: dist, similarity: 1 - dist / bits, metric: `hamming-${bits}`,\n }\n },\n}\n","/**\n * Population count for an 8-bit value (number of set bits).\n */\nfunction popcount8(byte: number): number {\n let count = 0\n let value = byte & 0xff\n while (value !== 0) {\n count += value & 1\n value >>>= 1\n }\n return count\n}\n\n/**\n * Hamming distance between two equal-length lowercase-hex strings.\n * Throws when the lengths differ.\n */\nexport function hammingHex(a: string, b: string): number {\n if (a.length !== b.length) {\n throw new Error(`Hash length mismatch: ${a.length} vs ${b.length}`)\n }\n if (a.length % 2 !== 0) {\n throw new Error(`Hash hex length must be even, got ${a.length}`)\n }\n let dist = 0\n for (let i = 0; i < a.length; i += 2) {\n const xa = Number.parseInt(a.slice(i, i + 2), 16)\n const xb = Number.parseInt(b.slice(i, i + 2), 16)\n if (Number.isNaN(xa) || Number.isNaN(xb)) {\n throw new TypeError(`Invalid hex at position ${i}: '${a.slice(i, i + 2)}' / '${b.slice(i, i + 2)}'`)\n }\n dist += popcount8(xa ^ xb)\n }\n return dist\n}\n\n/**\n * Bit-length of an even-length hex string.\n */\nexport function bitLengthHex(hex: string): number {\n return (hex.length / 2) * 8\n}\n\n/**\n * Population count for a 32-bit unsigned value (number of set bits).\n * Uses the parallel-prefix bit trick.\n */\nexport function popcount32(value: number): number {\n let v = Math.trunc(value)\n v = v - ((v >>> 1) & 0x55_55_55_55)\n v = (v & 0x33_33_33_33) + ((v >>> 2) & 0x33_33_33_33)\n v = (v + (v >>> 4)) & 0x0f_0f_0f_0f\n return ((v * 0x01_01_01_01) >>> 24) & 0xff\n}\n"],"mappings":";AAAA,SAAS,gBAAgB;AAEzB,OAAO,WAAW;;;ACClB,SAAS,UAAU,MAAsB;AACvC,MAAI,QAAQ;AACZ,MAAI,QAAQ,OAAO;AACnB,SAAO,UAAU,GAAG;AAClB,aAAS,QAAQ;AACjB,eAAW;AAAA,EACb;AACA,SAAO;AACT;AAMO,SAAS,WAAW,GAAW,GAAmB;AACvD,MAAI,EAAE,WAAW,EAAE,QAAQ;AACzB,UAAM,IAAI,MAAM,yBAAyB,EAAE,MAAM,OAAO,EAAE,MAAM,EAAE;AAAA,EACpE;AACA,MAAI,EAAE,SAAS,MAAM,GAAG;AACtB,UAAM,IAAI,MAAM,qCAAqC,EAAE,MAAM,EAAE;AAAA,EACjE;AACA,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,GAAG;AACpC,UAAM,KAAK,OAAO,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE;AAChD,UAAM,KAAK,OAAO,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE;AAChD,QAAI,OAAO,MAAM,EAAE,KAAK,OAAO,MAAM,EAAE,GAAG;AACxC,YAAM,IAAI,UAAU,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG;AAAA,IACrG;AACA,YAAQ,UAAU,KAAK,EAAE;AAAA,EAC3B;AACA,SAAO;AACT;;;ADvBO,IAAM,iBAA4B;AAAA,EACvC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,MAAM,KAAK,OAAO;AAChB,UAAM,SAAS,MAAM,UAAU,MAAM,SAAS,SAAY,SAAY,MAAM,SAAS,MAAM,IAAI;AAC/F,QAAI,WAAW,QAAW;AACxB,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AACA,UAAM,MAAM,MAAM,MAAM,MAAM,EAC3B,OAAO,GAAG,GAAG,EAAE,KAAK,OAAO,CAAC,EAC5B,UAAU,EACV,IAAI,EACJ,SAAS;AACZ,QAAI,IAAI,WAAW,IAAI,GAAG;AACxB,YAAM,IAAI,MAAM,sCAAsC,IAAI,MAAM,EAAE;AAAA,IACpE;AACA,QAAI,OAAO;AACX,aAAS,MAAM,GAAG,MAAM,GAAG,OAAO;AAChC,eAAS,MAAM,GAAG,MAAM,GAAG,OAAO;AAChC,cAAM,OAAO,IAAI,MAAM,IAAI,GAAG;AAC9B,cAAM,QAAQ,IAAI,MAAM,IAAI,MAAM,CAAC;AACnC,gBAAQ,OAAO,QAAQ,MAAM;AAAA,MAC/B;AAAA,IACF;AACA,QAAI,MAAM;AACV,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,aAAO,OAAO,SAAS,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE;AAAA,IAC7D;AACA,WAAO;AAAA,EACT;AAAA,EACA,MAAM,QAAQ,GAAG,GAAG;AAClB,UAAM,OAAO,WAAW,GAAG,CAAC;AAC5B,UAAM,OAAQ,EAAE,SAAS,IAAK;AAC9B,WAAO;AAAA,MACL,UAAU;AAAA,MAAM,YAAY,IAAI,OAAO;AAAA,MAAM,QAAQ,WAAW,IAAI;AAAA,IACtE;AAAA,EACF;AACF;","names":[]}