@oxy.so/core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (673) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +16 -0
  3. package/README.md +221 -0
  4. package/dist/cjs/.tsbuildinfo +1 -0
  5. package/dist/cjs/HttpService.js +1270 -0
  6. package/dist/cjs/OxyServices.base.js +390 -0
  7. package/dist/cjs/OxyServices.errors.js +95 -0
  8. package/dist/cjs/OxyServices.js +72 -0
  9. package/dist/cjs/boot/sessionColdBoot.js +395 -0
  10. package/dist/cjs/constants/version.js +16 -0
  11. package/dist/cjs/crypto/aead.js +79 -0
  12. package/dist/cjs/crypto/ecdh.js +35 -0
  13. package/dist/cjs/crypto/identityMarker.js +255 -0
  14. package/dist/cjs/crypto/kdf.js +39 -0
  15. package/dist/cjs/crypto/keyManager.js +2234 -0
  16. package/dist/cjs/crypto/polyfill.js +131 -0
  17. package/dist/cjs/crypto/recoveryPhrase.js +242 -0
  18. package/dist/cjs/crypto/signatureService.js +273 -0
  19. package/dist/cjs/i18n/accountCategoryLabels.js +44 -0
  20. package/dist/cjs/i18n/accountRoleLabels.js +27 -0
  21. package/dist/cjs/i18n/index.js +90 -0
  22. package/dist/cjs/i18n/locales/ar-SA.json +282 -0
  23. package/dist/cjs/i18n/locales/ca-ES.json +282 -0
  24. package/dist/cjs/i18n/locales/de-DE.json +282 -0
  25. package/dist/cjs/i18n/locales/en-US.json +2161 -0
  26. package/dist/cjs/i18n/locales/es-ES.json +2161 -0
  27. package/dist/cjs/i18n/locales/fr-FR.json +282 -0
  28. package/dist/cjs/i18n/locales/it-IT.json +282 -0
  29. package/dist/cjs/i18n/locales/ja-JP.json +282 -0
  30. package/dist/cjs/i18n/locales/ko-KR.json +282 -0
  31. package/dist/cjs/i18n/locales/locales/ar-SA.json +282 -0
  32. package/dist/cjs/i18n/locales/locales/ca-ES.json +282 -0
  33. package/dist/cjs/i18n/locales/locales/de-DE.json +282 -0
  34. package/dist/cjs/i18n/locales/locales/en-US.json +2161 -0
  35. package/dist/cjs/i18n/locales/locales/es-ES.json +2161 -0
  36. package/dist/cjs/i18n/locales/locales/fr-FR.json +282 -0
  37. package/dist/cjs/i18n/locales/locales/it-IT.json +282 -0
  38. package/dist/cjs/i18n/locales/locales/ja-JP.json +282 -0
  39. package/dist/cjs/i18n/locales/locales/ko-KR.json +282 -0
  40. package/dist/cjs/i18n/locales/locales/pt-PT.json +282 -0
  41. package/dist/cjs/i18n/locales/locales/zh-CN.json +282 -0
  42. package/dist/cjs/i18n/locales/pt-PT.json +282 -0
  43. package/dist/cjs/i18n/locales/zh-CN.json +282 -0
  44. package/dist/cjs/i18n/reputationCategoryLabels.js +20 -0
  45. package/dist/cjs/i18n/trustTierLabels.js +19 -0
  46. package/dist/cjs/index.js +498 -0
  47. package/dist/cjs/inference/OxyInferenceClient.js +544 -0
  48. package/dist/cjs/logger/index.js +149 -0
  49. package/dist/cjs/mixins/OxyServices.accounts.js +555 -0
  50. package/dist/cjs/mixins/OxyServices.analytics.js +49 -0
  51. package/dist/cjs/mixins/OxyServices.appData.js +108 -0
  52. package/dist/cjs/mixins/OxyServices.assets.js +764 -0
  53. package/dist/cjs/mixins/OxyServices.auth.js +1254 -0
  54. package/dist/cjs/mixins/OxyServices.chains.js +73 -0
  55. package/dist/cjs/mixins/OxyServices.civic.js +611 -0
  56. package/dist/cjs/mixins/OxyServices.connectedApps.js +78 -0
  57. package/dist/cjs/mixins/OxyServices.contacts.js +50 -0
  58. package/dist/cjs/mixins/OxyServices.deviceBoot.js +191 -0
  59. package/dist/cjs/mixins/OxyServices.deviceTransfer.js +314 -0
  60. package/dist/cjs/mixins/OxyServices.devices.js +116 -0
  61. package/dist/cjs/mixins/OxyServices.features.js +335 -0
  62. package/dist/cjs/mixins/OxyServices.followGraph.js +221 -0
  63. package/dist/cjs/mixins/OxyServices.identity.js +461 -0
  64. package/dist/cjs/mixins/OxyServices.identityBackup.js +172 -0
  65. package/dist/cjs/mixins/OxyServices.inference.js +59 -0
  66. package/dist/cjs/mixins/OxyServices.language.js +125 -0
  67. package/dist/cjs/mixins/OxyServices.links.js +72 -0
  68. package/dist/cjs/mixins/OxyServices.location.js +43 -0
  69. package/dist/cjs/mixins/OxyServices.nodes.js +175 -0
  70. package/dist/cjs/mixins/OxyServices.notifications.js +63 -0
  71. package/dist/cjs/mixins/OxyServices.payment.js +158 -0
  72. package/dist/cjs/mixins/OxyServices.privacy.js +199 -0
  73. package/dist/cjs/mixins/OxyServices.reputation.js +289 -0
  74. package/dist/cjs/mixins/OxyServices.security.js +89 -0
  75. package/dist/cjs/mixins/OxyServices.store.js +266 -0
  76. package/dist/cjs/mixins/OxyServices.topics.js +137 -0
  77. package/dist/cjs/mixins/OxyServices.user.js +902 -0
  78. package/dist/cjs/mixins/OxyServices.utility.js +1098 -0
  79. package/dist/cjs/mixins/index.js +135 -0
  80. package/dist/cjs/mixins/mixinHelpers.js +53 -0
  81. package/dist/cjs/models/Topic.js +16 -0
  82. package/dist/cjs/models/interfaces.js +20 -0
  83. package/dist/cjs/models/session.js +2 -0
  84. package/dist/cjs/server/auth.js +167 -0
  85. package/dist/cjs/server/capabilityTicket.js +192 -0
  86. package/dist/cjs/server/cors.js +225 -0
  87. package/dist/cjs/server/index.js +97 -0
  88. package/dist/cjs/server/rateLimit.js +207 -0
  89. package/dist/cjs/server/safeFetch.js +458 -0
  90. package/dist/cjs/server/securityHeaders.js +377 -0
  91. package/dist/cjs/server/userInvalidation.js +156 -0
  92. package/dist/cjs/server/verifySecret.js +50 -0
  93. package/dist/cjs/session/SessionClient.js +865 -0
  94. package/dist/cjs/session/accountDelegationAccess.js +48 -0
  95. package/dist/cjs/session/accountDialogController.js +1131 -0
  96. package/dist/cjs/session/accountSwitchTargets.js +81 -0
  97. package/dist/cjs/session/authStateStore.js +404 -0
  98. package/dist/cjs/session/createSessionClient.js +32 -0
  99. package/dist/cjs/session/deviceDirectory.js +143 -0
  100. package/dist/cjs/session/deviceSwitcherRows.js +76 -0
  101. package/dist/cjs/session/identityPin.js +256 -0
  102. package/dist/cjs/session/identitySession.js +135 -0
  103. package/dist/cjs/session/projectSessionState.js +121 -0
  104. package/dist/cjs/session/refresh.js +398 -0
  105. package/dist/cjs/session/sessionClientHost.js +34 -0
  106. package/dist/cjs/session/sharedDeviceCredential.js +247 -0
  107. package/dist/cjs/session/socketLoader.js +55 -0
  108. package/dist/cjs/shared/utils/colorUtils.js +153 -0
  109. package/dist/cjs/shared/utils/errorUtils.js +183 -0
  110. package/dist/cjs/shared/utils/index.js +49 -0
  111. package/dist/cjs/shared/utils/networkUtils.js +183 -0
  112. package/dist/cjs/shared/utils/themeUtils.js +106 -0
  113. package/dist/cjs/utils/accountCacheSweep.js +80 -0
  114. package/dist/cjs/utils/accountUtils.js +140 -0
  115. package/dist/cjs/utils/activityId.js +6 -0
  116. package/dist/cjs/utils/apiUtils.js +91 -0
  117. package/dist/cjs/utils/asyncUtils.js +222 -0
  118. package/dist/cjs/utils/authHelpers.js +120 -0
  119. package/dist/cjs/utils/authWebUrl.js +19 -0
  120. package/dist/cjs/utils/avatarUtils.js +29 -0
  121. package/dist/cjs/utils/cache.js +235 -0
  122. package/dist/cjs/utils/cacheKey.js +85 -0
  123. package/dist/cjs/utils/coldBoot.js +122 -0
  124. package/dist/cjs/utils/commonsApproval.js +31 -0
  125. package/dist/cjs/utils/commonsDelivery.js +59 -0
  126. package/dist/cjs/utils/deviceManager.js +174 -0
  127. package/dist/cjs/utils/displayNamePolicyRanges.generated.js +60 -0
  128. package/dist/cjs/utils/edgeRegion.js +6 -0
  129. package/dist/cjs/utils/errorUtils.js +243 -0
  130. package/dist/cjs/utils/identityCacheSweep.js +97 -0
  131. package/dist/cjs/utils/languageUtils.js +224 -0
  132. package/dist/cjs/utils/oauthPkce.js +311 -0
  133. package/dist/cjs/utils/officialOrigins.js +64 -0
  134. package/dist/cjs/utils/oxyServiceEnvironment.js +19 -0
  135. package/dist/cjs/utils/platform.js +119 -0
  136. package/dist/cjs/utils/profileLinks.js +63 -0
  137. package/dist/cjs/utils/redactUrl.js +29 -0
  138. package/dist/cjs/utils/registrableApex.js +45 -0
  139. package/dist/cjs/utils/requestUtils.js +209 -0
  140. package/dist/cjs/utils/sessionUtils.js +181 -0
  141. package/dist/cjs/utils/textNormalization.js +158 -0
  142. package/dist/cjs/utils/userHandle.js +37 -0
  143. package/dist/cjs/utils/userIdentity.js +50 -0
  144. package/dist/cjs/utils/validationUtils.js +370 -0
  145. package/dist/cjs/utils/webauthnOrigin.js +51 -0
  146. package/dist/esm/.tsbuildinfo +1 -0
  147. package/dist/esm/HttpService.js +1266 -0
  148. package/dist/esm/OxyServices.base.js +386 -0
  149. package/dist/esm/OxyServices.errors.js +88 -0
  150. package/dist/esm/OxyServices.js +66 -0
  151. package/dist/esm/boot/sessionColdBoot.js +392 -0
  152. package/dist/esm/constants/version.js +13 -0
  153. package/dist/esm/crypto/aead.js +74 -0
  154. package/dist/esm/crypto/ecdh.js +32 -0
  155. package/dist/esm/crypto/identityMarker.js +248 -0
  156. package/dist/esm/crypto/kdf.js +36 -0
  157. package/dist/esm/crypto/keyManager.js +2227 -0
  158. package/dist/esm/crypto/polyfill.js +129 -0
  159. package/dist/esm/crypto/recoveryPhrase.js +238 -0
  160. package/dist/esm/crypto/signatureService.js +269 -0
  161. package/dist/esm/i18n/accountCategoryLabels.js +37 -0
  162. package/dist/esm/i18n/accountRoleLabels.js +20 -0
  163. package/dist/esm/i18n/index.js +83 -0
  164. package/dist/esm/i18n/locales/ar-SA.json +282 -0
  165. package/dist/esm/i18n/locales/ca-ES.json +282 -0
  166. package/dist/esm/i18n/locales/de-DE.json +282 -0
  167. package/dist/esm/i18n/locales/en-US.json +2161 -0
  168. package/dist/esm/i18n/locales/es-ES.json +2161 -0
  169. package/dist/esm/i18n/locales/fr-FR.json +282 -0
  170. package/dist/esm/i18n/locales/it-IT.json +282 -0
  171. package/dist/esm/i18n/locales/ja-JP.json +282 -0
  172. package/dist/esm/i18n/locales/ko-KR.json +282 -0
  173. package/dist/esm/i18n/locales/locales/ar-SA.json +282 -0
  174. package/dist/esm/i18n/locales/locales/ca-ES.json +282 -0
  175. package/dist/esm/i18n/locales/locales/de-DE.json +282 -0
  176. package/dist/esm/i18n/locales/locales/en-US.json +2161 -0
  177. package/dist/esm/i18n/locales/locales/es-ES.json +2161 -0
  178. package/dist/esm/i18n/locales/locales/fr-FR.json +282 -0
  179. package/dist/esm/i18n/locales/locales/it-IT.json +282 -0
  180. package/dist/esm/i18n/locales/locales/ja-JP.json +282 -0
  181. package/dist/esm/i18n/locales/locales/ko-KR.json +282 -0
  182. package/dist/esm/i18n/locales/locales/pt-PT.json +282 -0
  183. package/dist/esm/i18n/locales/locales/zh-CN.json +282 -0
  184. package/dist/esm/i18n/locales/pt-PT.json +282 -0
  185. package/dist/esm/i18n/locales/zh-CN.json +282 -0
  186. package/dist/esm/i18n/reputationCategoryLabels.js +13 -0
  187. package/dist/esm/i18n/trustTierLabels.js +12 -0
  188. package/dist/esm/index.js +254 -0
  189. package/dist/esm/inference/OxyInferenceClient.js +538 -0
  190. package/dist/esm/logger/index.js +140 -0
  191. package/dist/esm/mixins/OxyServices.accounts.js +543 -0
  192. package/dist/esm/mixins/OxyServices.analytics.js +46 -0
  193. package/dist/esm/mixins/OxyServices.appData.js +103 -0
  194. package/dist/esm/mixins/OxyServices.assets.js +761 -0
  195. package/dist/esm/mixins/OxyServices.auth.js +1247 -0
  196. package/dist/esm/mixins/OxyServices.chains.js +70 -0
  197. package/dist/esm/mixins/OxyServices.civic.js +605 -0
  198. package/dist/esm/mixins/OxyServices.connectedApps.js +75 -0
  199. package/dist/esm/mixins/OxyServices.contacts.js +47 -0
  200. package/dist/esm/mixins/OxyServices.deviceBoot.js +186 -0
  201. package/dist/esm/mixins/OxyServices.deviceTransfer.js +311 -0
  202. package/dist/esm/mixins/OxyServices.devices.js +113 -0
  203. package/dist/esm/mixins/OxyServices.features.js +332 -0
  204. package/dist/esm/mixins/OxyServices.followGraph.js +218 -0
  205. package/dist/esm/mixins/OxyServices.identity.js +457 -0
  206. package/dist/esm/mixins/OxyServices.identityBackup.js +169 -0
  207. package/dist/esm/mixins/OxyServices.inference.js +56 -0
  208. package/dist/esm/mixins/OxyServices.language.js +122 -0
  209. package/dist/esm/mixins/OxyServices.links.js +69 -0
  210. package/dist/esm/mixins/OxyServices.location.js +40 -0
  211. package/dist/esm/mixins/OxyServices.nodes.js +172 -0
  212. package/dist/esm/mixins/OxyServices.notifications.js +60 -0
  213. package/dist/esm/mixins/OxyServices.payment.js +155 -0
  214. package/dist/esm/mixins/OxyServices.privacy.js +196 -0
  215. package/dist/esm/mixins/OxyServices.reputation.js +286 -0
  216. package/dist/esm/mixins/OxyServices.security.js +86 -0
  217. package/dist/esm/mixins/OxyServices.store.js +263 -0
  218. package/dist/esm/mixins/OxyServices.topics.js +134 -0
  219. package/dist/esm/mixins/OxyServices.user.js +899 -0
  220. package/dist/esm/mixins/OxyServices.utility.js +1095 -0
  221. package/dist/esm/mixins/index.js +132 -0
  222. package/dist/esm/mixins/mixinHelpers.js +48 -0
  223. package/dist/esm/models/Topic.js +13 -0
  224. package/dist/esm/models/interfaces.js +17 -0
  225. package/dist/esm/models/session.js +1 -0
  226. package/dist/esm/server/auth.js +154 -0
  227. package/dist/esm/server/capabilityTicket.js +183 -0
  228. package/dist/esm/server/cors.js +220 -0
  229. package/dist/esm/server/index.js +47 -0
  230. package/dist/esm/server/rateLimit.js +201 -0
  231. package/dist/esm/server/safeFetch.js +447 -0
  232. package/dist/esm/server/securityHeaders.js +364 -0
  233. package/dist/esm/server/userInvalidation.js +152 -0
  234. package/dist/esm/server/verifySecret.js +47 -0
  235. package/dist/esm/session/SessionClient.js +861 -0
  236. package/dist/esm/session/accountDelegationAccess.js +45 -0
  237. package/dist/esm/session/accountDialogController.js +1126 -0
  238. package/dist/esm/session/accountSwitchTargets.js +77 -0
  239. package/dist/esm/session/authStateStore.js +398 -0
  240. package/dist/esm/session/createSessionClient.js +29 -0
  241. package/dist/esm/session/deviceDirectory.js +135 -0
  242. package/dist/esm/session/deviceSwitcherRows.js +72 -0
  243. package/dist/esm/session/identityPin.js +249 -0
  244. package/dist/esm/session/identitySession.js +131 -0
  245. package/dist/esm/session/projectSessionState.js +114 -0
  246. package/dist/esm/session/refresh.js +390 -0
  247. package/dist/esm/session/sessionClientHost.js +31 -0
  248. package/dist/esm/session/sharedDeviceCredential.js +239 -0
  249. package/dist/esm/session/socketLoader.js +19 -0
  250. package/dist/esm/shared/utils/colorUtils.js +143 -0
  251. package/dist/esm/shared/utils/errorUtils.js +170 -0
  252. package/dist/esm/shared/utils/index.js +15 -0
  253. package/dist/esm/shared/utils/networkUtils.js +173 -0
  254. package/dist/esm/shared/utils/themeUtils.js +98 -0
  255. package/dist/esm/utils/accountCacheSweep.js +75 -0
  256. package/dist/esm/utils/accountUtils.js +131 -0
  257. package/dist/esm/utils/activityId.js +2 -0
  258. package/dist/esm/utils/apiUtils.js +84 -0
  259. package/dist/esm/utils/asyncUtils.js +207 -0
  260. package/dist/esm/utils/authHelpers.js +111 -0
  261. package/dist/esm/utils/authWebUrl.js +16 -0
  262. package/dist/esm/utils/avatarUtils.js +26 -0
  263. package/dist/esm/utils/cache.js +227 -0
  264. package/dist/esm/utils/cacheKey.js +80 -0
  265. package/dist/esm/utils/coldBoot.js +119 -0
  266. package/dist/esm/utils/commonsApproval.js +27 -0
  267. package/dist/esm/utils/commonsDelivery.js +54 -0
  268. package/dist/esm/utils/deviceManager.js +170 -0
  269. package/dist/esm/utils/displayNamePolicyRanges.generated.js +57 -0
  270. package/dist/esm/utils/edgeRegion.js +2 -0
  271. package/dist/esm/utils/errorUtils.js +232 -0
  272. package/dist/esm/utils/identityCacheSweep.js +92 -0
  273. package/dist/esm/utils/languageUtils.js +212 -0
  274. package/dist/esm/utils/oauthPkce.js +297 -0
  275. package/dist/esm/utils/officialOrigins.js +59 -0
  276. package/dist/esm/utils/oxyServiceEnvironment.js +16 -0
  277. package/dist/esm/utils/platform.js +110 -0
  278. package/dist/esm/utils/profileLinks.js +60 -0
  279. package/dist/esm/utils/redactUrl.js +26 -0
  280. package/dist/esm/utils/registrableApex.js +42 -0
  281. package/dist/esm/utils/requestUtils.js +203 -0
  282. package/dist/esm/utils/sessionUtils.js +171 -0
  283. package/dist/esm/utils/textNormalization.js +154 -0
  284. package/dist/esm/utils/userHandle.js +33 -0
  285. package/dist/esm/utils/userIdentity.js +45 -0
  286. package/dist/esm/utils/validationUtils.js +350 -0
  287. package/dist/esm/utils/webauthnOrigin.js +48 -0
  288. package/dist/types/.tsbuildinfo +1 -0
  289. package/dist/types/HttpService.d.ts +413 -0
  290. package/dist/types/OxyServices.base.d.ts +187 -0
  291. package/dist/types/OxyServices.d.ts +139 -0
  292. package/dist/types/OxyServices.errors.d.ts +84 -0
  293. package/dist/types/boot/sessionColdBoot.d.ts +140 -0
  294. package/dist/types/constants/version.d.ts +13 -0
  295. package/dist/types/crypto/aead.d.ts +56 -0
  296. package/dist/types/crypto/ecdh.d.ts +29 -0
  297. package/dist/types/crypto/identityMarker.d.ts +94 -0
  298. package/dist/types/crypto/kdf.d.ts +25 -0
  299. package/dist/types/crypto/keyManager.d.ts +582 -0
  300. package/dist/types/crypto/polyfill.d.ts +25 -0
  301. package/dist/types/crypto/recoveryPhrase.d.ts +173 -0
  302. package/dist/types/crypto/signatureService.d.ts +136 -0
  303. package/dist/types/i18n/accountCategoryLabels.d.ts +34 -0
  304. package/dist/types/i18n/accountRoleLabels.d.ts +10 -0
  305. package/dist/types/i18n/index.d.ts +3 -0
  306. package/dist/types/i18n/reputationCategoryLabels.d.ts +10 -0
  307. package/dist/types/i18n/trustTierLabels.d.ts +9 -0
  308. package/dist/types/index.d.ts +145 -0
  309. package/dist/types/inference/OxyInferenceClient.d.ts +342 -0
  310. package/dist/types/logger/index.d.ts +104 -0
  311. package/dist/types/mixins/OxyServices.accounts.d.ts +868 -0
  312. package/dist/types/mixins/OxyServices.analytics.d.ts +72 -0
  313. package/dist/types/mixins/OxyServices.appData.d.ts +108 -0
  314. package/dist/types/mixins/OxyServices.assets.d.ts +329 -0
  315. package/dist/types/mixins/OxyServices.auth.d.ts +908 -0
  316. package/dist/types/mixins/OxyServices.chains.d.ts +156 -0
  317. package/dist/types/mixins/OxyServices.civic.d.ts +510 -0
  318. package/dist/types/mixins/OxyServices.connectedApps.d.ts +169 -0
  319. package/dist/types/mixins/OxyServices.contacts.d.ts +100 -0
  320. package/dist/types/mixins/OxyServices.deviceBoot.d.ts +185 -0
  321. package/dist/types/mixins/OxyServices.deviceTransfer.d.ts +149 -0
  322. package/dist/types/mixins/OxyServices.devices.d.ts +103 -0
  323. package/dist/types/mixins/OxyServices.features.d.ts +250 -0
  324. package/dist/types/mixins/OxyServices.followGraph.d.ts +223 -0
  325. package/dist/types/mixins/OxyServices.identity.d.ts +351 -0
  326. package/dist/types/mixins/OxyServices.identityBackup.d.ts +129 -0
  327. package/dist/types/mixins/OxyServices.inference.d.ts +95 -0
  328. package/dist/types/mixins/OxyServices.language.d.ts +87 -0
  329. package/dist/types/mixins/OxyServices.links.d.ts +104 -0
  330. package/dist/types/mixins/OxyServices.location.d.ts +70 -0
  331. package/dist/types/mixins/OxyServices.nodes.d.ts +198 -0
  332. package/dist/types/mixins/OxyServices.notifications.d.ts +143 -0
  333. package/dist/types/mixins/OxyServices.payment.d.ts +117 -0
  334. package/dist/types/mixins/OxyServices.privacy.d.ts +146 -0
  335. package/dist/types/mixins/OxyServices.reputation.d.ts +202 -0
  336. package/dist/types/mixins/OxyServices.security.d.ts +84 -0
  337. package/dist/types/mixins/OxyServices.store.d.ts +334 -0
  338. package/dist/types/mixins/OxyServices.topics.d.ts +110 -0
  339. package/dist/types/mixins/OxyServices.user.d.ts +558 -0
  340. package/dist/types/mixins/OxyServices.utility.d.ts +393 -0
  341. package/dist/types/mixins/index.d.ts +87 -0
  342. package/dist/types/mixins/mixinHelpers.d.ts +31 -0
  343. package/dist/types/models/Topic.d.ts +42 -0
  344. package/dist/types/models/interfaces.d.ts +675 -0
  345. package/dist/types/models/session.d.ts +51 -0
  346. package/dist/types/server/auth.d.ts +130 -0
  347. package/dist/types/server/capabilityTicket.d.ts +41 -0
  348. package/dist/types/server/cors.d.ts +98 -0
  349. package/dist/types/server/index.d.ts +35 -0
  350. package/dist/types/server/rateLimit.d.ts +40 -0
  351. package/dist/types/server/safeFetch.d.ts +137 -0
  352. package/dist/types/server/securityHeaders.d.ts +221 -0
  353. package/dist/types/server/userInvalidation.d.ts +114 -0
  354. package/dist/types/server/verifySecret.d.ts +29 -0
  355. package/dist/types/session/SessionClient.d.ts +418 -0
  356. package/dist/types/session/accountDelegationAccess.d.ts +40 -0
  357. package/dist/types/session/accountDialogController.d.ts +648 -0
  358. package/dist/types/session/accountSwitchTargets.d.ts +70 -0
  359. package/dist/types/session/authStateStore.d.ts +153 -0
  360. package/dist/types/session/createSessionClient.d.ts +30 -0
  361. package/dist/types/session/deviceDirectory.d.ts +182 -0
  362. package/dist/types/session/deviceSwitcherRows.d.ts +92 -0
  363. package/dist/types/session/identityPin.d.ts +87 -0
  364. package/dist/types/session/identitySession.d.ts +105 -0
  365. package/dist/types/session/projectSessionState.d.ts +74 -0
  366. package/dist/types/session/refresh.d.ts +179 -0
  367. package/dist/types/session/sessionClientHost.d.ts +18 -0
  368. package/dist/types/session/sharedDeviceCredential.d.ts +202 -0
  369. package/dist/types/session/socketLoader.d.ts +11 -0
  370. package/dist/types/shared/utils/colorUtils.d.ts +104 -0
  371. package/dist/types/shared/utils/errorUtils.d.ts +97 -0
  372. package/dist/types/shared/utils/index.d.ts +13 -0
  373. package/dist/types/shared/utils/networkUtils.d.ts +139 -0
  374. package/dist/types/shared/utils/themeUtils.d.ts +90 -0
  375. package/dist/types/utils/accountCacheSweep.d.ts +75 -0
  376. package/dist/types/utils/accountUtils.d.ts +100 -0
  377. package/dist/types/utils/activityId.d.ts +2 -0
  378. package/dist/types/utils/apiUtils.d.ts +95 -0
  379. package/dist/types/utils/asyncUtils.d.ts +62 -0
  380. package/dist/types/utils/authHelpers.d.ts +58 -0
  381. package/dist/types/utils/authWebUrl.d.ts +16 -0
  382. package/dist/types/utils/avatarUtils.d.ts +16 -0
  383. package/dist/types/utils/cache.d.ts +130 -0
  384. package/dist/types/utils/cacheKey.d.ts +66 -0
  385. package/dist/types/utils/coldBoot.d.ts +131 -0
  386. package/dist/types/utils/commonsApproval.d.ts +13 -0
  387. package/dist/types/utils/commonsDelivery.d.ts +105 -0
  388. package/dist/types/utils/deviceManager.d.ts +65 -0
  389. package/dist/types/utils/displayNamePolicyRanges.generated.d.ts +57 -0
  390. package/dist/types/utils/edgeRegion.d.ts +2 -0
  391. package/dist/types/utils/errorUtils.d.ts +125 -0
  392. package/dist/types/utils/identityCacheSweep.d.ts +80 -0
  393. package/dist/types/utils/languageUtils.d.ts +100 -0
  394. package/dist/types/utils/oauthPkce.d.ts +157 -0
  395. package/dist/types/utils/officialOrigins.d.ts +13 -0
  396. package/dist/types/utils/oxyServiceEnvironment.d.ts +17 -0
  397. package/dist/types/utils/platform.d.ts +49 -0
  398. package/dist/types/utils/profileLinks.d.ts +44 -0
  399. package/dist/types/utils/redactUrl.d.ts +17 -0
  400. package/dist/types/utils/registrableApex.d.ts +27 -0
  401. package/dist/types/utils/requestUtils.d.ts +123 -0
  402. package/dist/types/utils/sessionUtils.d.ts +54 -0
  403. package/dist/types/utils/textNormalization.d.ts +103 -0
  404. package/dist/types/utils/userHandle.d.ts +26 -0
  405. package/dist/types/utils/userIdentity.d.ts +21 -0
  406. package/dist/types/utils/validationUtils.d.ts +268 -0
  407. package/dist/types/utils/webauthnOrigin.d.ts +32 -0
  408. package/package.json +168 -0
  409. package/src/HttpService.ts +1553 -0
  410. package/src/OxyServices.base.ts +478 -0
  411. package/src/OxyServices.errors.ts +122 -0
  412. package/src/OxyServices.ts +172 -0
  413. package/src/__tests__/authSocket.test.ts +96 -0
  414. package/src/__tests__/httpServiceActivityId.test.ts +49 -0
  415. package/src/__tests__/httpServiceAuthSelfAwait.test.ts +108 -0
  416. package/src/__tests__/httpServiceCache.test.ts +318 -0
  417. package/src/__tests__/httpServiceCsrf.test.ts +235 -0
  418. package/src/__tests__/httpServiceFormEncoded.test.ts +142 -0
  419. package/src/__tests__/httpServiceQueueDeadlock.test.ts +128 -0
  420. package/src/__tests__/httpServiceUnwrapEnvelope.test.ts +115 -0
  421. package/src/__tests__/inSessionRefresh.test.ts +260 -0
  422. package/src/__tests__/linkedClient.test.ts +370 -0
  423. package/src/__tests__/parseHttpErrorBody.test.ts +116 -0
  424. package/src/__tests__/serverValueImportsDeclared.test.ts +120 -0
  425. package/src/__tests__/userIdentity.test.ts +143 -0
  426. package/src/boot/__tests__/sessionColdBoot.identity.test.ts +393 -0
  427. package/src/boot/__tests__/sessionColdBoot.sharedDevice.test.ts +325 -0
  428. package/src/boot/__tests__/sessionColdBoot.test.ts +570 -0
  429. package/src/boot/sessionColdBoot.ts +529 -0
  430. package/src/constants/version.ts +15 -0
  431. package/src/crypto/__tests__/backupMaterial.test.ts +86 -0
  432. package/src/crypto/__tests__/cryptoPrimitives.test.ts +226 -0
  433. package/src/crypto/__tests__/identityMocks.ts +125 -0
  434. package/src/crypto/__tests__/keyManager.atomicity.test.ts +272 -0
  435. package/src/crypto/__tests__/keyManager.cacheSafety.test.ts +175 -0
  436. package/src/crypto/__tests__/keyManager.identityStatus.test.ts +217 -0
  437. package/src/crypto/__tests__/keyManager.recoveryLadder.test.ts +179 -0
  438. package/src/crypto/__tests__/keyManager.recoveryMnemonic.test.ts +138 -0
  439. package/src/crypto/__tests__/keyManager.storageMigration.test.ts +227 -0
  440. package/src/crypto/__tests__/keyManager.test.ts +329 -0
  441. package/src/crypto/__tests__/polyfill.test.ts +109 -0
  442. package/src/crypto/__tests__/recoveryPhrase.test.ts +61 -0
  443. package/src/crypto/__tests__/scopedSeed.test.ts +126 -0
  444. package/src/crypto/__tests__/signChallengeShared.test.ts +63 -0
  445. package/src/crypto/__tests__/signedRecord.test.ts +230 -0
  446. package/src/crypto/aead.ts +97 -0
  447. package/src/crypto/ecdh.ts +37 -0
  448. package/src/crypto/identityMarker.ts +291 -0
  449. package/src/crypto/kdf.ts +43 -0
  450. package/src/crypto/keyManager.ts +2607 -0
  451. package/src/crypto/polyfill.ts +143 -0
  452. package/src/crypto/recoveryPhrase.ts +337 -0
  453. package/src/crypto/signatureService.ts +350 -0
  454. package/src/i18n/__tests__/accountCategoryLabels.test.ts +62 -0
  455. package/src/i18n/__tests__/accountRoleLabels.test.ts +54 -0
  456. package/src/i18n/__tests__/reputationCategoryLabels.test.ts +56 -0
  457. package/src/i18n/__tests__/trustTierLabels.test.ts +47 -0
  458. package/src/i18n/accountCategoryLabels.ts +44 -0
  459. package/src/i18n/accountRoleLabels.ts +26 -0
  460. package/src/i18n/index.ts +88 -0
  461. package/src/i18n/locales/ar-SA.json +282 -0
  462. package/src/i18n/locales/ca-ES.json +282 -0
  463. package/src/i18n/locales/de-DE.json +282 -0
  464. package/src/i18n/locales/en-US.json +2161 -0
  465. package/src/i18n/locales/es-ES.json +2161 -0
  466. package/src/i18n/locales/fr-FR.json +282 -0
  467. package/src/i18n/locales/it-IT.json +282 -0
  468. package/src/i18n/locales/ja-JP.json +282 -0
  469. package/src/i18n/locales/ko-KR.json +282 -0
  470. package/src/i18n/locales/pt-PT.json +282 -0
  471. package/src/i18n/locales/zh-CN.json +282 -0
  472. package/src/i18n/reputationCategoryLabels.ts +20 -0
  473. package/src/i18n/trustTierLabels.ts +18 -0
  474. package/src/index.ts +881 -0
  475. package/src/inference/OxyInferenceClient.ts +888 -0
  476. package/src/inference/__tests__/OxyInferenceClient.test.ts +834 -0
  477. package/src/logger/__tests__/logger.test.ts +207 -0
  478. package/src/logger/index.ts +217 -0
  479. package/src/mixins/OxyServices.accounts.ts +1330 -0
  480. package/src/mixins/OxyServices.analytics.ts +53 -0
  481. package/src/mixins/OxyServices.appData.ts +158 -0
  482. package/src/mixins/OxyServices.assets.ts +861 -0
  483. package/src/mixins/OxyServices.auth.ts +1858 -0
  484. package/src/mixins/OxyServices.chains.ts +134 -0
  485. package/src/mixins/OxyServices.civic.ts +945 -0
  486. package/src/mixins/OxyServices.connectedApps.ts +174 -0
  487. package/src/mixins/OxyServices.contacts.ts +73 -0
  488. package/src/mixins/OxyServices.deviceBoot.ts +210 -0
  489. package/src/mixins/OxyServices.deviceTransfer.ts +393 -0
  490. package/src/mixins/OxyServices.devices.ts +120 -0
  491. package/src/mixins/OxyServices.features.ts +454 -0
  492. package/src/mixins/OxyServices.followGraph.ts +293 -0
  493. package/src/mixins/OxyServices.identity.ts +705 -0
  494. package/src/mixins/OxyServices.identityBackup.ts +250 -0
  495. package/src/mixins/OxyServices.inference.ts +57 -0
  496. package/src/mixins/OxyServices.language.ts +144 -0
  497. package/src/mixins/OxyServices.links.ts +107 -0
  498. package/src/mixins/OxyServices.location.ts +46 -0
  499. package/src/mixins/OxyServices.nodes.ts +337 -0
  500. package/src/mixins/OxyServices.notifications.ts +142 -0
  501. package/src/mixins/OxyServices.payment.ts +163 -0
  502. package/src/mixins/OxyServices.privacy.ts +219 -0
  503. package/src/mixins/OxyServices.reputation.ts +436 -0
  504. package/src/mixins/OxyServices.security.ts +110 -0
  505. package/src/mixins/OxyServices.store.ts +585 -0
  506. package/src/mixins/OxyServices.topics.ts +169 -0
  507. package/src/mixins/OxyServices.user.ts +1137 -0
  508. package/src/mixins/OxyServices.utility.ts +1370 -0
  509. package/src/mixins/__tests__/OxyServices.civic.test.ts +1095 -0
  510. package/src/mixins/__tests__/OxyServices.deviceBoot.test.ts +124 -0
  511. package/src/mixins/__tests__/OxyServices.deviceTransfer.test.ts +271 -0
  512. package/src/mixins/__tests__/OxyServices.identity.test.ts +376 -0
  513. package/src/mixins/__tests__/OxyServices.links.test.ts +154 -0
  514. package/src/mixins/__tests__/OxyServices.nodes.test.ts +341 -0
  515. package/src/mixins/__tests__/OxyServices.rotateKey.test.ts +276 -0
  516. package/src/mixins/__tests__/OxyServices.serviceAssetMetadata.test.ts +192 -0
  517. package/src/mixins/__tests__/OxyServices.serviceAssetMetadataBySha.test.ts +135 -0
  518. package/src/mixins/__tests__/accounts.test.ts +727 -0
  519. package/src/mixins/__tests__/appData.test.ts +203 -0
  520. package/src/mixins/__tests__/assetCredentials.test.ts +47 -0
  521. package/src/mixins/__tests__/assetUpload.test.ts +191 -0
  522. package/src/mixins/__tests__/backgroundCredential.httpIntegration.test.ts +135 -0
  523. package/src/mixins/__tests__/chains.test.ts +113 -0
  524. package/src/mixins/__tests__/commonsSignIn.test.ts +1144 -0
  525. package/src/mixins/__tests__/connectedApps.test.ts +123 -0
  526. package/src/mixins/__tests__/deviceTokenMintPinned.test.ts +113 -0
  527. package/src/mixins/__tests__/discoveryErrorHandling.test.ts +266 -0
  528. package/src/mixins/__tests__/followCacheInvalidation.test.ts +173 -0
  529. package/src/mixins/__tests__/followGraph.test.ts +147 -0
  530. package/src/mixins/__tests__/followGraphPagination.test.ts +271 -0
  531. package/src/mixins/__tests__/getFileDownloadUrl.test.ts +346 -0
  532. package/src/mixins/__tests__/getFollowStatuses.test.ts +95 -0
  533. package/src/mixins/__tests__/getUsersByIds.test.ts +149 -0
  534. package/src/mixins/__tests__/identityBackup.test.ts +315 -0
  535. package/src/mixins/__tests__/identityWriteCacheInvalidation.test.ts +407 -0
  536. package/src/mixins/__tests__/inferenceFactory.test.ts +58 -0
  537. package/src/mixins/__tests__/onTokensChanged.test.ts +129 -0
  538. package/src/mixins/__tests__/preSessionSkipAuth.test.ts +284 -0
  539. package/src/mixins/__tests__/privacyCacheInvalidation.test.ts +155 -0
  540. package/src/mixins/__tests__/reputation.test.ts +522 -0
  541. package/src/mixins/__tests__/serviceAuth.test.ts +832 -0
  542. package/src/mixins/__tests__/serviceTokenJwks.test.ts +208 -0
  543. package/src/mixins/__tests__/store.test.ts +304 -0
  544. package/src/mixins/__tests__/topics.test.ts +156 -0
  545. package/src/mixins/__tests__/userReadCacheBypass.test.ts +129 -0
  546. package/src/mixins/__tests__/userTokenAuth.test.ts +746 -0
  547. package/src/mixins/__tests__/verifyChallenge.test.ts +130 -0
  548. package/src/mixins/__tests__/verifyServiceActingAs.test.ts +167 -0
  549. package/src/mixins/__tests__/webauthnAuth.test.ts +205 -0
  550. package/src/mixins/index.ts +201 -0
  551. package/src/mixins/mixinHelpers.ts +69 -0
  552. package/src/models/Topic.ts +46 -0
  553. package/src/models/interfaces.ts +786 -0
  554. package/src/models/session.ts +55 -0
  555. package/src/server/__tests__/auth.test.ts +78 -0
  556. package/src/server/__tests__/capabilityTicket.test.ts +111 -0
  557. package/src/server/__tests__/cors.socket.test.ts +225 -0
  558. package/src/server/__tests__/cors.test.ts +158 -0
  559. package/src/server/__tests__/rateLimit.test.ts +257 -0
  560. package/src/server/__tests__/safeFetch.test.ts +232 -0
  561. package/src/server/__tests__/securityHeaders.test.ts +348 -0
  562. package/src/server/__tests__/serviceTokenAttribution.test.ts +396 -0
  563. package/src/server/__tests__/userInvalidation.test.ts +203 -0
  564. package/src/server/__tests__/verifySecret.test.ts +40 -0
  565. package/src/server/auth.ts +271 -0
  566. package/src/server/capabilityTicket.ts +258 -0
  567. package/src/server/cors.ts +277 -0
  568. package/src/server/index.ts +136 -0
  569. package/src/server/rateLimit.ts +313 -0
  570. package/src/server/safeFetch.ts +586 -0
  571. package/src/server/securityHeaders.ts +467 -0
  572. package/src/server/userInvalidation.ts +199 -0
  573. package/src/server/verifySecret.ts +52 -0
  574. package/src/session/SessionClient.ts +1001 -0
  575. package/src/session/__tests__/SessionClient.additive.test.ts +153 -0
  576. package/src/session/__tests__/SessionClient.broadcastChannel.test.ts +114 -0
  577. package/src/session/__tests__/SessionClient.diagnostics.test.ts +91 -0
  578. package/src/session/__tests__/SessionClient.directory.test.ts +688 -0
  579. package/src/session/__tests__/SessionClient.httpIntegration.test.ts +65 -0
  580. package/src/session/__tests__/SessionClient.identityPin.test.ts +175 -0
  581. package/src/session/__tests__/SessionClient.rest.test.ts +119 -0
  582. package/src/session/__tests__/SessionClient.serverEvents.test.ts +72 -0
  583. package/src/session/__tests__/SessionClient.socket.test.ts +202 -0
  584. package/src/session/__tests__/SessionClient.socketFactory.test.ts +81 -0
  585. package/src/session/__tests__/SessionClient.state.test.ts +78 -0
  586. package/src/session/__tests__/SessionClient.switchTokenOrder.test.ts +170 -0
  587. package/src/session/__tests__/accountDelegationAccess.test.ts +104 -0
  588. package/src/session/__tests__/accountDialogController.test.ts +1969 -0
  589. package/src/session/__tests__/accountDialogShape.test.ts +118 -0
  590. package/src/session/__tests__/accountSwitchTargets.test.ts +137 -0
  591. package/src/session/__tests__/authStateStore.test.ts +451 -0
  592. package/src/session/__tests__/deviceDirectory.test.ts +422 -0
  593. package/src/session/__tests__/deviceSwitcherRows.test.ts +223 -0
  594. package/src/session/__tests__/identityPin.test.ts +131 -0
  595. package/src/session/__tests__/identitySession.test.ts +194 -0
  596. package/src/session/__tests__/projectSessionState.test.ts +105 -0
  597. package/src/session/__tests__/refresh.identityPin.test.ts +307 -0
  598. package/src/session/__tests__/refresh.test.ts +443 -0
  599. package/src/session/__tests__/sessionIntegration.test.ts +209 -0
  600. package/src/session/__tests__/sharedDeviceCredential.test.ts +300 -0
  601. package/src/session/accountDelegationAccess.ts +72 -0
  602. package/src/session/accountDialogController.ts +1494 -0
  603. package/src/session/accountSwitchTargets.ts +93 -0
  604. package/src/session/authStateStore.ts +502 -0
  605. package/src/session/createSessionClient.ts +39 -0
  606. package/src/session/deviceDirectory.ts +269 -0
  607. package/src/session/deviceSwitcherRows.ts +145 -0
  608. package/src/session/identityPin.ts +310 -0
  609. package/src/session/identitySession.ts +206 -0
  610. package/src/session/projectSessionState.ts +137 -0
  611. package/src/session/refresh.ts +517 -0
  612. package/src/session/sessionClientHost.ts +39 -0
  613. package/src/session/sharedDeviceCredential.ts +349 -0
  614. package/src/session/socketLoader.ts +30 -0
  615. package/src/shared/utils/colorUtils.ts +155 -0
  616. package/src/shared/utils/errorUtils.ts +181 -0
  617. package/src/shared/utils/index.ts +59 -0
  618. package/src/shared/utils/networkUtils.ts +248 -0
  619. package/src/shared/utils/themeUtils.ts +115 -0
  620. package/src/types/buffer.d.ts +97 -0
  621. package/src/types/expo-crypto.d.ts +16 -0
  622. package/src/types/expo-secure-store.d.ts +17 -0
  623. package/src/utils/__tests__/accountUtils.test.ts +151 -0
  624. package/src/utils/__tests__/activityId.test.ts +45 -0
  625. package/src/utils/__tests__/asyncUtils.test.ts +187 -0
  626. package/src/utils/__tests__/authWebUrl.test.ts +15 -0
  627. package/src/utils/__tests__/cacheKey.test.ts +0 -0
  628. package/src/utils/__tests__/coldBoot.test.ts +496 -0
  629. package/src/utils/__tests__/commonsApproval.test.ts +60 -0
  630. package/src/utils/__tests__/identityCacheSweep.test.ts +151 -0
  631. package/src/utils/__tests__/languageUtils.test.ts +219 -0
  632. package/src/utils/__tests__/oauthPkce.test.ts +272 -0
  633. package/src/utils/__tests__/officialOrigins.test.ts +31 -0
  634. package/src/utils/__tests__/oxyServiceEnvironment.test.ts +7 -0
  635. package/src/utils/__tests__/profileLinks.test.ts +180 -0
  636. package/src/utils/__tests__/redactUrl.test.ts +33 -0
  637. package/src/utils/__tests__/registrableApex.test.ts +62 -0
  638. package/src/utils/__tests__/textNormalization.test.ts +205 -0
  639. package/src/utils/__tests__/validationUtils.test.ts +703 -0
  640. package/src/utils/__tests__/webauthnOrigin.test.ts +83 -0
  641. package/src/utils/accountCacheSweep.ts +93 -0
  642. package/src/utils/accountUtils.ts +194 -0
  643. package/src/utils/activityId.ts +2 -0
  644. package/src/utils/apiUtils.ts +137 -0
  645. package/src/utils/asyncUtils.ts +280 -0
  646. package/src/utils/authHelpers.ts +148 -0
  647. package/src/utils/authWebUrl.ts +17 -0
  648. package/src/utils/avatarUtils.ts +39 -0
  649. package/src/utils/cache.ts +273 -0
  650. package/src/utils/cacheKey.ts +93 -0
  651. package/src/utils/coldBoot.ts +218 -0
  652. package/src/utils/commonsApproval.ts +39 -0
  653. package/src/utils/commonsDelivery.ts +132 -0
  654. package/src/utils/deviceManager.ts +203 -0
  655. package/src/utils/displayNamePolicyRanges.generated.ts +69 -0
  656. package/src/utils/edgeRegion.ts +2 -0
  657. package/src/utils/errorUtils.ts +352 -0
  658. package/src/utils/identityCacheSweep.ts +104 -0
  659. package/src/utils/languageUtils.ts +256 -0
  660. package/src/utils/oauthPkce.ts +392 -0
  661. package/src/utils/officialOrigins.ts +62 -0
  662. package/src/utils/oxyServiceEnvironment.ts +17 -0
  663. package/src/utils/platform.ts +139 -0
  664. package/src/utils/profileLinks.ts +91 -0
  665. package/src/utils/redactUrl.ts +28 -0
  666. package/src/utils/registrableApex.ts +41 -0
  667. package/src/utils/requestUtils.ts +237 -0
  668. package/src/utils/sessionUtils.ts +206 -0
  669. package/src/utils/textNormalization.ts +162 -0
  670. package/src/utils/userHandle.ts +49 -0
  671. package/src/utils/userIdentity.ts +60 -0
  672. package/src/utils/validationUtils.ts +390 -0
  673. package/src/utils/webauthnOrigin.ts +52 -0
@@ -0,0 +1,538 @@
1
+ /**
2
+ * The Oxy inference client — one surface, two credential lanes (issue #972,
3
+ * workstream 15).
4
+ *
5
+ * ```typescript
6
+ * // An OpenAI-style machine key: one bearer string, no session, no exchange.
7
+ * const oxy = new OxyInferenceClient({ credential: process.env.OXY_API_KEY });
8
+ *
9
+ * // Oxy auth: whatever bearer the session or the service-token mint holds.
10
+ * const oxy = oxyServices.inference();
11
+ * ```
12
+ *
13
+ * Both lanes reach the SAME endpoints and are told apart only by how the bearer
14
+ * is produced: a machine key is a constant string, and an Oxy bearer rotates, so
15
+ * it is a function this client calls on every request rather than a value it
16
+ * captures once. There is no third lane, and no method behaves differently
17
+ * depending on which one you used.
18
+ *
19
+ * `respond()` returns one completed response. `stream()` reads the same
20
+ * `/v1/responses` endpoint without buffering and validates every SSE event
21
+ * against `inferenceStreamEventSchema` before exposing it to the caller.
22
+ *
23
+ * ## Why this is a client and not more methods on `OxyServices`
24
+ *
25
+ * Two reasons, both structural. A machine-key holder has no Oxy session at all,
26
+ * so a surface reached only through the session client would be unreachable for
27
+ * exactly the developer this workstream exists to serve. And the `/v1` error
28
+ * body is the contract's `InferenceError` at the top level rather than the
29
+ * platform's `{ error, message }` envelope — it carries `requestId`, `retryable`
30
+ * and `retryAfterMs`, all of which `OxyServices.handleError` would flatten into a
31
+ * message string. `oxyServices.inference()` binds the session bearer into this
32
+ * client so a session-holding app writes no plumbing of its own.
33
+ *
34
+ * ## Streaming is an explicit method
35
+ *
36
+ * `stream()` injects `stream: true` on the wire. The request type deliberately
37
+ * has no `stream` field, so `respond({ stream: true })` cannot promise a JSON
38
+ * response while the server sends SSE, and `stream({ stream: false })` cannot
39
+ * silently buffer. The method is the transport choice.
40
+ *
41
+ * ## Field names, and the one place they could drift
42
+ *
43
+ * Every VALUE type here comes from `@oxy.so/contracts` — messages, tools, tool
44
+ * choice, response format, usage quantities, unit prices, error codes. The
45
+ * request FIELD NAMES cannot: they belong to `responsesRequestSchema`, which
46
+ * lives in the API because it is a public dialect rather than an Oxy↔data-plane
47
+ * contract. `packages/api/src/schemas/__tests__/sdkRequestCompatibility.test.ts`
48
+ * is the gate — it parses a value of this module's request type against that
49
+ * schema, so a rename on either side fails a build rather than a customer's
50
+ * request.
51
+ */
52
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
53
+ if (kind === "m") throw new TypeError("Private method is not writable");
54
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
55
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
56
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
57
+ };
58
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
59
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
60
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
61
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
62
+ };
63
+ var _OxyInferenceClient_instances, _OxyInferenceClient_baseURL, _OxyInferenceClient_credential, _OxyInferenceClient_fetch, _OxyInferenceClient_bearer, _OxyInferenceClient_headers, _OxyInferenceClient_request;
64
+ import { INFERENCE_ERROR_CODES, inferenceStreamEventSchema, modelIdSchema } from '@oxy.so/contracts';
65
+ /** The base URL of the Oxy API, when a caller names none. */
66
+ export const OXY_INFERENCE_BASE_URL = 'https://api.oxy.so';
67
+ /**
68
+ * Anything the inference API refused.
69
+ *
70
+ * `retryable` is asserted by the server and looked up from a total map over the
71
+ * closed code set — never inferred here from the status. A client that decides
72
+ * retryability from an HTTP status is exactly what the contract's retryability
73
+ * rule exists to prevent, so this class carries the server's answer and does not
74
+ * compute one.
75
+ */
76
+ export class OxyInferenceError extends Error {
77
+ constructor(input) {
78
+ super(input.message);
79
+ this.name = 'OxyInferenceError';
80
+ this.code = input.code;
81
+ this.retryable = input.retryable;
82
+ this.requestId = input.requestId;
83
+ this.status = input.status;
84
+ if (input.retryAfterMs !== undefined)
85
+ this.retryAfterMs = input.retryAfterMs;
86
+ if (input.param !== undefined)
87
+ this.param = input.param;
88
+ }
89
+ }
90
+ /**
91
+ * The edge opened an SSE response but its framing or one of its events violated
92
+ * the published inference stream contract.
93
+ *
94
+ * This is distinct from {@link OxyInferenceError}: the latter is a refusal the
95
+ * server deliberately returned, while this error means the client could not
96
+ * safely interpret a nominally successful stream.
97
+ */
98
+ export class OxyInferenceProtocolError extends Error {
99
+ constructor(message, requestId) {
100
+ super(message);
101
+ this.name = 'OxyInferenceProtocolError';
102
+ if (requestId !== undefined)
103
+ this.requestId = requestId;
104
+ }
105
+ }
106
+ /**
107
+ * The Oxy inference API.
108
+ *
109
+ * Stateless: it holds a base URL, a way to get a bearer and a `fetch`. Nothing
110
+ * is cached, because the two things worth caching here are a catalogue that is
111
+ * audience-scoped and a receipt that is immutable but rarely re-read.
112
+ *
113
+ * Completed JSON responses are TYPED, not re-parsed. The server validates every
114
+ * one against its own schema before serving it, and a second client-side parse
115
+ * of a non-strict shape would silently DROP fields a newer API added — turning
116
+ * forward compatibility into data loss. Stream events are different: each is a
117
+ * versioned wire message and is parsed against the shared contract before it is
118
+ * yielded. Refusals are read defensively, because two routers answer under `/v1`
119
+ * and an unreadable failure must still reach the caller as one.
120
+ */
121
+ export class OxyInferenceClient {
122
+ constructor(options) {
123
+ _OxyInferenceClient_instances.add(this);
124
+ _OxyInferenceClient_baseURL.set(this, void 0);
125
+ _OxyInferenceClient_credential.set(this, void 0);
126
+ _OxyInferenceClient_fetch.set(this, void 0);
127
+ const baseURL = options.baseURL ?? OXY_INFERENCE_BASE_URL;
128
+ __classPrivateFieldSet(this, _OxyInferenceClient_baseURL, baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL, "f");
129
+ __classPrivateFieldSet(this, _OxyInferenceClient_credential, options.credential, "f");
130
+ const fetchImpl = options.fetch ?? globalThis.fetch;
131
+ if (fetchImpl === undefined) {
132
+ throw new Error('OxyInferenceClient needs a fetch implementation: this runtime has no global fetch, so pass one as `fetch`.');
133
+ }
134
+ __classPrivateFieldSet(this, _OxyInferenceClient_fetch, fetchImpl, "f");
135
+ }
136
+ /**
137
+ * The models this caller may use — `GET /v1/models`.
138
+ *
139
+ * Audience-scoped server-side. A machine credential and an anonymous caller
140
+ * both see the PUBLIC catalogue; only an internal/system application's
141
+ * service token sees internal-only routes.
142
+ *
143
+ * **`[]` is a normal answer**, and is the only answer today: the catalogue
144
+ * is populated by operators, and a route is not publicly exposed until
145
+ * somebody has reviewed the right to resell it.
146
+ */
147
+ async listModels(options = {}) {
148
+ const body = await __classPrivateFieldGet(this, _OxyInferenceClient_instances, "m", _OxyInferenceClient_request).call(this, 'GET', '/v1/models', { ...(options.signal === undefined ? {} : { signal: options.signal }) });
149
+ return body.data;
150
+ }
151
+ /**
152
+ * One catalogue entry by its canonical id — `GET /v1/models/:publisher/:model`.
153
+ *
154
+ * The id is TWO path segments, because a canonical model id contains a slash
155
+ * and a single encoded segment would never match the route.
156
+ *
157
+ * A model you may not see answers 404 identically to one that does not
158
+ * exist, deliberately: the catalogue is never an existence oracle for what
159
+ * Oxy runs internally.
160
+ *
161
+ * @param modelId - `<publisher>/<model>`. A revision pin
162
+ * (`<publisher>/<model>@<revision>`) names a model REFERENCE rather than a
163
+ * model and is rejected here rather than sent, because the catalogue is
164
+ * keyed on models and a pinned reference would 404 indistinguishably from
165
+ * "no such model".
166
+ */
167
+ async getModel(modelId, options = {}) {
168
+ const parsed = modelIdSchema.safeParse(modelId);
169
+ if (!parsed.success) {
170
+ throw new Error(`Not a canonical model id: ${modelId}. Expected <publisher>/<model>, e.g. acme/some-model.`);
171
+ }
172
+ const [publisher, model] = parsed.data.split('/');
173
+ const body = await __classPrivateFieldGet(this, _OxyInferenceClient_instances, "m", _OxyInferenceClient_request).call(this, 'GET', `/v1/models/${encodeURIComponent(publisher)}/${encodeURIComponent(model)}`, { ...(options.signal === undefined ? {} : { signal: options.signal }) });
174
+ return body.data;
175
+ }
176
+ /**
177
+ * The routing profiles this caller may select — `GET /v1/models/routing-profiles`.
178
+ *
179
+ * A profile is a named strategy for CHOOSING among routes, not a model: no
180
+ * publisher, no revision, no licence, no weights. Like the model list, `[]`
181
+ * is a normal answer.
182
+ */
183
+ async listRoutingProfiles(options = {}) {
184
+ const body = await __classPrivateFieldGet(this, _OxyInferenceClient_instances, "m", _OxyInferenceClient_request).call(this, 'GET', '/v1/models/routing-profiles', { ...(options.signal === undefined ? {} : { signal: options.signal }) });
185
+ return body.data;
186
+ }
187
+ /**
188
+ * Send one non-streaming inference request — `POST /v1/responses`.
189
+ *
190
+ * @throws {OxyInferenceError} for every refusal, carrying the server's own
191
+ * `code`, `retryable` and `requestId`.
192
+ */
193
+ async respond(request, options = {}) {
194
+ return __classPrivateFieldGet(this, _OxyInferenceClient_instances, "m", _OxyInferenceClient_request).call(this, 'POST', '/v1/responses', {
195
+ body: request,
196
+ ...(options.signal === undefined ? {} : { signal: options.signal }),
197
+ ...(options.idempotencyKey === undefined
198
+ ? {}
199
+ : { idempotencyKey: options.idempotencyKey }),
200
+ ...(options.delegatedUserId === undefined
201
+ ? {}
202
+ : { delegatedUserId: options.delegatedUserId }),
203
+ });
204
+ }
205
+ /**
206
+ * Stream one inference request from `POST /v1/responses`.
207
+ *
208
+ * The transport choice is method-level: this method adds `stream: true` and
209
+ * requests SSE, while {@link respond} never does. Every yielded value has
210
+ * already passed `inferenceStreamEventSchema`, belongs to the request id in
211
+ * the response header and advances the stream sequence. A terminal `error`
212
+ * event is yielded as part of the published union; an HTTP refusal before
213
+ * the stream opens throws {@link OxyInferenceError}.
214
+ *
215
+ * Breaking out of the iterator cancels the response body. Passing an abort
216
+ * signal additionally lets the caller cancel while waiting for the first or
217
+ * any later event.
218
+ *
219
+ * @throws {OxyInferenceError} when the edge refuses before opening SSE.
220
+ * @throws {OxyInferenceProtocolError} when a successful SSE response cannot
221
+ * be interpreted under the published stream contract.
222
+ */
223
+ async *stream(request, options = {}) {
224
+ const response = await __classPrivateFieldGet(this, _OxyInferenceClient_fetch, "f").call(this, `${__classPrivateFieldGet(this, _OxyInferenceClient_baseURL, "f")}/v1/responses`, {
225
+ method: 'POST',
226
+ headers: await __classPrivateFieldGet(this, _OxyInferenceClient_instances, "m", _OxyInferenceClient_headers).call(this, 'text/event-stream', {
227
+ hasBody: true,
228
+ ...(options.idempotencyKey === undefined
229
+ ? {}
230
+ : { idempotencyKey: options.idempotencyKey }),
231
+ ...(options.delegatedUserId === undefined
232
+ ? {}
233
+ : { delegatedUserId: options.delegatedUserId }),
234
+ }),
235
+ body: JSON.stringify({ ...request, stream: true }),
236
+ ...(options.signal === undefined ? {} : { signal: options.signal }),
237
+ });
238
+ if (!response.ok) {
239
+ const payload = await response.json().catch(() => undefined);
240
+ throw toInferenceError(payload, response.status, response.headers.get('X-Oxy-Request-Id'));
241
+ }
242
+ const requestId = response.headers.get('X-Oxy-Request-Id') ?? undefined;
243
+ const mediaType = response.headers
244
+ .get('Content-Type')
245
+ ?.split(';', 1)[0]
246
+ ?.trim()
247
+ .toLowerCase();
248
+ if (mediaType !== 'text/event-stream') {
249
+ await cancelUnreadResponse(response);
250
+ throw protocolError(`The inference API answered a streaming request with ${mediaType ?? 'no Content-Type'} instead of text/event-stream.`, requestId);
251
+ }
252
+ if (requestId === undefined || requestId.length === 0) {
253
+ await cancelUnreadResponse(response);
254
+ throw protocolError('The inference API opened a stream without X-Oxy-Request-Id.', requestId);
255
+ }
256
+ if (response.body === null) {
257
+ throw protocolError('The inference API opened a stream with no response body.', requestId);
258
+ }
259
+ let lastSequence = -1;
260
+ let terminal = false;
261
+ for await (const frame of decodeEventStream(response.body, requestId)) {
262
+ if (terminal) {
263
+ throw protocolError('The inference API sent an event after a terminal event.', requestId);
264
+ }
265
+ let payload;
266
+ try {
267
+ payload = JSON.parse(frame.data);
268
+ }
269
+ catch (_error) {
270
+ throw protocolError(`The inference API sent a ${frame.name || 'unnamed'} SSE event that is not JSON.`, requestId);
271
+ }
272
+ const parsed = inferenceStreamEventSchema.safeParse(payload);
273
+ if (!parsed.success) {
274
+ const path = parsed.error.issues[0]?.path;
275
+ throw protocolError(`The inference API sent an event outside the published stream contract at ${path === undefined || path.length === 0 ? 'an unknown field' : path.join('.')}.`, requestId);
276
+ }
277
+ const event = parsed.data;
278
+ if (frame.name !== event.type) {
279
+ throw protocolError(`The inference API framed a ${event.type} event as ${frame.name || 'unnamed'}.`, requestId);
280
+ }
281
+ if (event.requestId !== requestId) {
282
+ throw protocolError('The inference API sent an event for a different request id.', requestId);
283
+ }
284
+ if (event.sequence <= lastSequence) {
285
+ throw protocolError('The inference API sent a stream sequence that did not advance.', requestId);
286
+ }
287
+ lastSequence = event.sequence;
288
+ terminal = event.type === 'done' || event.type === 'error';
289
+ yield event;
290
+ }
291
+ if (!terminal) {
292
+ throw protocolError('The inference API closed the stream before a terminal done or error event.', requestId);
293
+ }
294
+ }
295
+ /**
296
+ * Read back the settled receipt for one request —
297
+ * `GET /v1/generations/:id`.
298
+ *
299
+ * `id` is the `requestId` you already hold (it is on every response and
300
+ * every error) or the `generationId`. Requires the `inference:usage:read`
301
+ * scope; a caller without it, or one whose application did not make the
302
+ * request, is told the receipt does not exist rather than that it belongs to
303
+ * somebody else.
304
+ */
305
+ async getGeneration(id, options = {}) {
306
+ const body = await __classPrivateFieldGet(this, _OxyInferenceClient_instances, "m", _OxyInferenceClient_request).call(this, 'GET', `/v1/generations/${encodeURIComponent(id)}`, { ...(options.signal === undefined ? {} : { signal: options.signal }) });
307
+ return body.data;
308
+ }
309
+ }
310
+ _OxyInferenceClient_baseURL = new WeakMap(), _OxyInferenceClient_credential = new WeakMap(), _OxyInferenceClient_fetch = new WeakMap(), _OxyInferenceClient_instances = new WeakSet(), _OxyInferenceClient_bearer =
311
+ /** The bearer for this request, from whichever lane was configured. */
312
+ async function _OxyInferenceClient_bearer() {
313
+ const value = typeof __classPrivateFieldGet(this, _OxyInferenceClient_credential, "f") === 'string'
314
+ ? __classPrivateFieldGet(this, _OxyInferenceClient_credential, "f")
315
+ : await __classPrivateFieldGet(this, _OxyInferenceClient_credential, "f").call(this);
316
+ if (value === null || value === undefined || value.length === 0) {
317
+ throw new Error('OxyInferenceClient has no bearer: the configured credential resolved to nothing. On the Oxy auth lane this usually means the session is not restored yet.');
318
+ }
319
+ return value;
320
+ }, _OxyInferenceClient_headers =
321
+ /** Build the authenticated headers for one request, re-reading its bearer. */
322
+ async function _OxyInferenceClient_headers(accept, options) {
323
+ const headers = {
324
+ Authorization: `Bearer ${await __classPrivateFieldGet(this, _OxyInferenceClient_instances, "m", _OxyInferenceClient_bearer).call(this)}`,
325
+ Accept: accept,
326
+ };
327
+ if (options.hasBody)
328
+ headers['Content-Type'] = 'application/json';
329
+ if (options.idempotencyKey !== undefined) {
330
+ headers['Idempotency-Key'] = options.idempotencyKey;
331
+ }
332
+ if (options.delegatedUserId !== undefined) {
333
+ headers['X-Oxy-User-Id'] = options.delegatedUserId;
334
+ }
335
+ return headers;
336
+ }, _OxyInferenceClient_request =
337
+ /**
338
+ * One request, and the one place a refusal becomes an
339
+ * {@link OxyInferenceError}.
340
+ *
341
+ * Two error shapes arrive here, because two routers serve `/v1`. The edge
342
+ * returns the contract error at the top level; the catalogue returns the
343
+ * platform's `{ error, message }` envelope. Both are read, and a body that
344
+ * is neither still produces an `OxyInferenceError` — with the code the
345
+ * status maps to — rather than a bare `Error`, so a caller's `catch` never
346
+ * has to branch on which router answered.
347
+ */
348
+ async function _OxyInferenceClient_request(method, path, options) {
349
+ const response = await __classPrivateFieldGet(this, _OxyInferenceClient_fetch, "f").call(this, `${__classPrivateFieldGet(this, _OxyInferenceClient_baseURL, "f")}${path}`, {
350
+ method,
351
+ headers: await __classPrivateFieldGet(this, _OxyInferenceClient_instances, "m", _OxyInferenceClient_headers).call(this, 'application/json', {
352
+ hasBody: options.body !== undefined,
353
+ ...(options.idempotencyKey === undefined
354
+ ? {}
355
+ : { idempotencyKey: options.idempotencyKey }),
356
+ ...(options.delegatedUserId === undefined
357
+ ? {}
358
+ : { delegatedUserId: options.delegatedUserId }),
359
+ }),
360
+ ...(options.body === undefined ? {} : { body: JSON.stringify(options.body) }),
361
+ ...(options.signal === undefined ? {} : { signal: options.signal }),
362
+ });
363
+ const payload = await response.json().catch(() => undefined);
364
+ if (!response.ok) {
365
+ throw toInferenceError(payload, response.status, response.headers.get('X-Oxy-Request-Id'));
366
+ }
367
+ return payload;
368
+ };
369
+ /** Bound one public SSE event before parsing it as JSON. */
370
+ const MAX_INFERENCE_STREAM_EVENT_CHARACTERS = 8 * 1024 * 1024;
371
+ /** Bound the `data:` array too; empty lines consume memory without characters. */
372
+ const MAX_INFERENCE_STREAM_EVENT_DATA_LINES = 4096;
373
+ function protocolError(message, requestId) {
374
+ return new OxyInferenceProtocolError(message, requestId);
375
+ }
376
+ /** Cancel a nominally successful response whose stream contract is unreadable. */
377
+ async function cancelUnreadResponse(response) {
378
+ await response.body?.cancel().catch(() => undefined);
379
+ }
380
+ /**
381
+ * Decode SSE incrementally, preserving chunk boundaries only until a complete
382
+ * line is available.
383
+ *
384
+ * Multiple `data:` lines join with a newline, comments are ignored and a final
385
+ * frame does not need a trailing blank line. Cancelling the iterator cancels the
386
+ * body reader, which is how breaking out of `for await` closes the HTTP request
387
+ * instead of leaving generation running upstream.
388
+ */
389
+ async function* decodeEventStream(body, requestId) {
390
+ const reader = body.getReader();
391
+ const decoder = new TextDecoder('utf-8', { fatal: true });
392
+ let pending = '';
393
+ let name = '';
394
+ let data = [];
395
+ let accumulated = 0;
396
+ let dataLines = 0;
397
+ let reachedEnd = false;
398
+ const decode = (chunk, options) => {
399
+ try {
400
+ return decoder.decode(chunk, options);
401
+ }
402
+ catch (_error) {
403
+ throw protocolError('The inference API sent an SSE stream that is not valid UTF-8.', requestId);
404
+ }
405
+ };
406
+ const dispatch = () => {
407
+ if (data.length === 0 && name.length === 0)
408
+ return undefined;
409
+ const frame = { name, data: data.join('\n') };
410
+ name = '';
411
+ data = [];
412
+ accumulated = 0;
413
+ dataLines = 0;
414
+ return frame;
415
+ };
416
+ const consume = (raw) => {
417
+ const line = raw.endsWith('\r') ? raw.slice(0, -1) : raw;
418
+ if (line.length === 0)
419
+ return dispatch();
420
+ if (line.startsWith(':'))
421
+ return undefined;
422
+ const separator = line.indexOf(':');
423
+ const field = separator === -1 ? line : line.slice(0, separator);
424
+ const rawValue = separator === -1 ? '' : line.slice(separator + 1);
425
+ const value = rawValue.startsWith(' ') ? rawValue.slice(1) : rawValue;
426
+ if (field === 'data') {
427
+ dataLines += 1;
428
+ if (dataLines > MAX_INFERENCE_STREAM_EVENT_DATA_LINES) {
429
+ throw protocolError(`The inference API sent an SSE event with over ${MAX_INFERENCE_STREAM_EVENT_DATA_LINES} data lines.`, requestId);
430
+ }
431
+ accumulated += value.length;
432
+ if (accumulated > MAX_INFERENCE_STREAM_EVENT_CHARACTERS) {
433
+ throw protocolError(`The inference API sent an SSE event over ${MAX_INFERENCE_STREAM_EVENT_CHARACTERS} characters.`, requestId);
434
+ }
435
+ data.push(value);
436
+ }
437
+ else if (field === 'event') {
438
+ name = value.trim();
439
+ }
440
+ return undefined;
441
+ };
442
+ try {
443
+ for (;;) {
444
+ const chunk = await reader.read();
445
+ if (chunk.done) {
446
+ reachedEnd = true;
447
+ break;
448
+ }
449
+ pending += decode(chunk.value, { stream: true });
450
+ if (pending.length > MAX_INFERENCE_STREAM_EVENT_CHARACTERS) {
451
+ throw protocolError(`The inference API sent an SSE line over ${MAX_INFERENCE_STREAM_EVENT_CHARACTERS} characters with no boundary.`, requestId);
452
+ }
453
+ let newline = pending.indexOf('\n');
454
+ while (newline !== -1) {
455
+ const frame = consume(pending.slice(0, newline));
456
+ pending = pending.slice(newline + 1);
457
+ if (frame !== undefined)
458
+ yield frame;
459
+ newline = pending.indexOf('\n');
460
+ }
461
+ }
462
+ pending += decode();
463
+ if (pending.length > 0) {
464
+ const frame = consume(pending);
465
+ if (frame !== undefined)
466
+ yield frame;
467
+ }
468
+ const trailing = dispatch();
469
+ if (trailing !== undefined)
470
+ yield trailing;
471
+ }
472
+ finally {
473
+ if (!reachedEnd) {
474
+ // Preserve the original parse/abort error if transport cancellation
475
+ // itself also refuses: cancellation is cleanup, never the diagnosis.
476
+ await reader.cancel().catch(() => undefined);
477
+ }
478
+ reader.releaseLock();
479
+ }
480
+ }
481
+ /**
482
+ * Which code a status means when the body did not name one.
483
+ *
484
+ * Deliberately partial: only the statuses whose meaning is unambiguous without a
485
+ * body. Everything else becomes `internal_error`, which is non-retryable — the
486
+ * safe direction, since inventing a retryable code for an unreadable failure is
487
+ * how one outage becomes a retry storm.
488
+ */
489
+ const STATUS_FALLBACK_CODE = {
490
+ 400: 'invalid_request',
491
+ 401: 'authentication_failed',
492
+ 403: 'permission_denied',
493
+ 404: 'model_not_found',
494
+ 409: 'idempotency_conflict',
495
+ 413: 'request_too_large',
496
+ 429: 'rate_limited',
497
+ 502: 'provider_error',
498
+ 503: 'service_unavailable',
499
+ 504: 'provider_timeout',
500
+ };
501
+ /**
502
+ * The closed set the contract defines, as a lookup.
503
+ *
504
+ * A `code` outside it is a contract violation rather than a code this client
505
+ * has not caught up with — `INFERENCE_ERROR_CODES` and the version header move
506
+ * together — so an unrecognised one falls back to the status map instead of
507
+ * being asserted into the type.
508
+ */
509
+ const INFERENCE_ERROR_CODE_SET = new Set(INFERENCE_ERROR_CODES);
510
+ /** Read whichever error shape arrived into the one this client throws. */
511
+ function toInferenceError(payload, status, requestIdHeader) {
512
+ const body = (payload ?? {});
513
+ // The edge's own shape is the contract error at the top level; the
514
+ // catalogue's is the platform envelope, whose `error` is a string.
515
+ const code = typeof body.code === 'string' && INFERENCE_ERROR_CODE_SET.has(body.code)
516
+ ? body.code
517
+ : (STATUS_FALLBACK_CODE[status] ?? 'internal_error');
518
+ const message = typeof body.message === 'string' && body.message.length > 0
519
+ ? body.message
520
+ : typeof body.error === 'string' && body.error.length > 0
521
+ ? body.error
522
+ : `The inference API answered ${status}.`;
523
+ return new OxyInferenceError({
524
+ code,
525
+ message,
526
+ // A body that did not assert retryability is not retryable: the server
527
+ // is the only thing that may say a retry could succeed.
528
+ retryable: body.retryable === true,
529
+ requestId: typeof body.requestId === 'string' && body.requestId.length > 0
530
+ ? body.requestId
531
+ : (requestIdHeader ?? ''),
532
+ status,
533
+ ...(body.retryable === true && typeof body.retryAfterMs === 'number'
534
+ ? { retryAfterMs: body.retryAfterMs }
535
+ : {}),
536
+ ...(typeof body.param === 'string' ? { param: body.param } : {}),
537
+ });
538
+ }
@@ -0,0 +1,140 @@
1
+ /**
2
+ * @oxy.so/core/logger — the ecosystem-wide logging chokepoint.
3
+ *
4
+ * A tiny, dependency-free, universal logger that works unchanged in React
5
+ * Native, browsers, Node, and Bun. Every Oxy app and package should log
6
+ * through here instead of calling `console.*` directly, so that level,
7
+ * formatting, and transport are controlled in ONE place.
8
+ *
9
+ * Design goals:
10
+ * - Zero dependencies. No Node-only imports, no `process.stdout` assumptions.
11
+ * - Four levels (`debug` | `info` | `warn` | `error`) plus `silent`.
12
+ * - Namespaced child loggers via `createLogger('mention:feed')` / `.child()`.
13
+ * - Structured context objects carried through to the sink.
14
+ * - A single pluggable sink so backends can pipe to pino / CloudWatch / etc.
15
+ * without touching any call site.
16
+ * - Debug is off in production by default (`__DEV__` on RN, `NODE_ENV`
17
+ * elsewhere); override globally with `configureLogger({ level })`.
18
+ *
19
+ * @module logger
20
+ */
21
+ const LEVEL_WEIGHT = {
22
+ silent: 0,
23
+ error: 1,
24
+ warn: 2,
25
+ info: 3,
26
+ debug: 4,
27
+ };
28
+ /**
29
+ * True in development. Uses React Native's `__DEV__` when present, otherwise
30
+ * falls back to `process.env.NODE_ENV === 'development'`. Never throws.
31
+ */
32
+ export function isDev() {
33
+ if (typeof __DEV__ !== 'undefined')
34
+ return __DEV__ === true;
35
+ try {
36
+ return typeof process !== 'undefined' && process.env?.NODE_ENV === 'development';
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ }
42
+ function formatPrefix(entry) {
43
+ const parts = [entry.timestamp, entry.level.toUpperCase()];
44
+ if (entry.namespace)
45
+ parts.push(`[${entry.namespace}]`);
46
+ return parts.join(' ');
47
+ }
48
+ /**
49
+ * Default sink: routes each entry to the matching `console` method. `info` and
50
+ * `debug` go to `console.log` (RN/browser-safe — `console.debug`/`console.info`
51
+ * are inconsistently surfaced across runtimes).
52
+ */
53
+ export const consoleSink = (entry) => {
54
+ const extras = [];
55
+ if (entry.context && Object.keys(entry.context).length > 0)
56
+ extras.push(entry.context);
57
+ if (entry.error !== undefined)
58
+ extras.push(entry.error);
59
+ if (entry.args.length > 0)
60
+ extras.push(...entry.args);
61
+ const line = `${formatPrefix(entry)} ${entry.message}`;
62
+ if (entry.level === 'error')
63
+ console.error(line, ...extras);
64
+ else if (entry.level === 'warn')
65
+ console.warn(line, ...extras);
66
+ else
67
+ console.log(line, ...extras);
68
+ };
69
+ function defaultLevel() {
70
+ return isDev() ? 'debug' : 'info';
71
+ }
72
+ const config = {
73
+ level: defaultLevel(),
74
+ sink: consoleSink,
75
+ };
76
+ /**
77
+ * Update the global logger configuration. Affects every logger instance
78
+ * (root and children) immediately. Pass `{ level }` to gate output and/or
79
+ * `{ sink }` to redirect transport (pino, CloudWatch, a test capture, …).
80
+ */
81
+ export function configureLogger(partial) {
82
+ if (partial.level !== undefined)
83
+ config.level = partial.level;
84
+ if (partial.sink !== undefined)
85
+ config.sink = partial.sink;
86
+ }
87
+ /** Read a snapshot of the current global configuration. */
88
+ export function getLoggerConfig() {
89
+ return { level: config.level, sink: config.sink };
90
+ }
91
+ /** Restore the default level (env-derived) and the console sink. */
92
+ export function resetLoggerConfig() {
93
+ config.level = defaultLevel();
94
+ config.sink = consoleSink;
95
+ }
96
+ function mergeContext(base, extra) {
97
+ if (!base)
98
+ return extra;
99
+ if (!extra)
100
+ return base;
101
+ return { ...base, ...extra };
102
+ }
103
+ function emit(level, namespace, baseContext, message, error, context, args) {
104
+ if (LEVEL_WEIGHT[level] > LEVEL_WEIGHT[config.level])
105
+ return;
106
+ config.sink({
107
+ level,
108
+ message,
109
+ namespace,
110
+ context: mergeContext(baseContext, context),
111
+ error,
112
+ args,
113
+ timestamp: new Date().toISOString(),
114
+ });
115
+ }
116
+ function makeLogger(namespace, baseContext) {
117
+ return {
118
+ namespace,
119
+ debug: (message, context, ...args) => emit('debug', namespace, baseContext, message, undefined, context, args),
120
+ info: (message, context, ...args) => emit('info', namespace, baseContext, message, undefined, context, args),
121
+ warn: (message, context, ...args) => emit('warn', namespace, baseContext, message, undefined, context, args),
122
+ error: (message, error, context, ...args) => emit('error', namespace, baseContext, message, error, context, args),
123
+ child: (childNamespace, childContext) => makeLogger(namespace ? `${namespace}:${childNamespace}` : childNamespace, mergeContext(baseContext, childContext)),
124
+ };
125
+ }
126
+ /** The shared root logger. Prefer a namespaced `createLogger(...)` in modules. */
127
+ export const logger = makeLogger(undefined, undefined);
128
+ /**
129
+ * Create a namespaced logger.
130
+ *
131
+ * @example
132
+ * ```ts
133
+ * const log = createLogger('mention:feed');
134
+ * log.info('loaded', { count: 20 });
135
+ * const sub = log.child('prefetch'); // namespace → 'mention:feed:prefetch'
136
+ * ```
137
+ */
138
+ export function createLogger(namespace, context) {
139
+ return makeLogger(namespace, context);
140
+ }