@preventive/triage 1.0.0-alpha.5 → 1.0.0-alpha.51

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 (368) hide show
  1. package/LICENSE-APACHE +202 -0
  2. package/README.md +16 -0
  3. package/api/reap.ts +17 -0
  4. package/cli.js +6 -0
  5. package/client/dependency-paths.d.ts +3 -0
  6. package/client/dependency-paths.js +36 -0
  7. package/client/finding-link.js +305 -0
  8. package/client/linked-findings.d.ts +1 -0
  9. package/client/linked-findings.js +115 -0
  10. package/common/bundle-commit.d.ts +1 -0
  11. package/common/bundle-commit.js +4 -0
  12. package/common/bundle-compare-diff.d.ts +3 -0
  13. package/common/bundle-compare-diff.js +357 -0
  14. package/common/bundle-compare-inputs.d.ts +2 -0
  15. package/common/bundle-compare-inputs.js +65 -0
  16. package/common/bundle-compare-versions.js +172 -0
  17. package/common/bundle-comparison.d.ts +8 -0
  18. package/common/bundle-comparison.js +62 -0
  19. package/common/bundle-metadata.d.ts +15 -0
  20. package/common/bundle-metadata.js +226 -0
  21. package/common/bundle-pkg-of.d.ts +1 -0
  22. package/common/bundle-pkg-of.js +90 -0
  23. package/common/bundle-reasons.d.ts +2 -0
  24. package/common/bundle-reasons.js +21 -0
  25. package/common/bundle-source-links.d.ts +6 -0
  26. package/common/bundle-source-links.js +216 -0
  27. package/common/bundle-sourcemap.d.ts +10 -0
  28. package/common/bundle-sourcemap.js +100 -0
  29. package/common/bundle-sources.d.ts +7 -0
  30. package/common/bundle-sources.js +333 -0
  31. package/common/bundle-stats.js +41 -0
  32. package/common/bundle-tabs.js +1 -0
  33. package/common/code-language.js +65 -0
  34. package/common/default-scan-models.ts +31 -0
  35. package/common/dependency-reviews.d.ts +18 -0
  36. package/common/dependency-reviews.js +64 -0
  37. package/common/finding-duplicates.js +58 -0
  38. package/common/finding-filters.js +274 -0
  39. package/common/finding-id.js +47 -0
  40. package/common/github-issue-labels.d.ts +1 -0
  41. package/common/github-issue-labels.js +11 -0
  42. package/common/github-pr.ts +56 -0
  43. package/common/gzip.js +59 -0
  44. package/common/line-diff.d.ts +8 -0
  45. package/common/line-diff.js +57 -0
  46. package/common/linked-workspace-groups.js +63 -0
  47. package/common/managed/agent-tasks.ts +292 -0
  48. package/common/managed/comments.ts +34 -0
  49. package/common/managed/finding-detail.d.ts +3 -0
  50. package/common/managed/finding-detail.js +66 -0
  51. package/common/managed/github-agents.ts +114 -0
  52. package/common/managed/github-logins.ts +49 -0
  53. package/common/managed/npm-packages.d.ts +7 -0
  54. package/common/managed/npm-packages.js +51 -0
  55. package/common/managed/permissions.ts +31 -0
  56. package/common/managed/report-content.ts +72 -0
  57. package/common/managed/report-filter.ts +109 -0
  58. package/common/managed/repository-alias.ts +65 -0
  59. package/common/managed/roles.ts +35 -0
  60. package/common/managed/routes.d.ts +2 -0
  61. package/common/managed/routes.js +359 -0
  62. package/common/managed/scan-models.ts +6 -0
  63. package/common/managed/team-app.d.ts +6 -0
  64. package/common/managed/team-app.js +47 -0
  65. package/common/managed/triage.ts +83 -0
  66. package/common/managed/upload-seal.ts +126 -0
  67. package/common/pretty-print.d.ts +5 -0
  68. package/common/pretty-print.js +24 -0
  69. package/common/revalidation-conflicts.js +48 -0
  70. package/common/revalidation-input-groups.js +56 -0
  71. package/common/save-error-reason.ts +20 -7
  72. package/common/scan-server.ts +13 -0
  73. package/common/security-links.d.ts +5 -0
  74. package/common/security-links.js +33 -0
  75. package/common/server-info.ts +46 -0
  76. package/common/utf8.d.ts +3 -0
  77. package/common/utf8.js +45 -0
  78. package/common/workspace-app.js +39 -0
  79. package/common/workspace-groups.js +176 -0
  80. package/out/activity.js +4 -0
  81. package/out/brotli-fallback.js +3 -3
  82. package/out/chunk-2K6UN3PC.js +3 -0
  83. package/out/chunk-2XUEZHIP.js +28 -0
  84. package/out/chunk-2ZDZWLFY.js +1 -0
  85. package/out/chunk-4HI2MSAV.js +17 -0
  86. package/out/chunk-6LNQTKAV.js +52 -0
  87. package/out/chunk-7BKKYVWR.js +7 -0
  88. package/out/chunk-7C7DWL7I.js +1 -0
  89. package/out/chunk-7JBSSRD7.js +3 -0
  90. package/out/chunk-7VAWINQF.js +6 -0
  91. package/out/chunk-C4Z6ZBXV.js +10 -0
  92. package/out/chunk-FMXWXDR4.js +36 -0
  93. package/out/chunk-GDPCLSOS.js +2 -0
  94. package/out/chunk-GO7FT4OD.js +1 -0
  95. package/out/chunk-HT2SSA3V.js +1 -0
  96. package/out/chunk-IPAH4LKF.js +232 -0
  97. package/out/chunk-IYPY47MC.js +1 -0
  98. package/out/chunk-IZ7POWI3.js +18 -0
  99. package/out/chunk-JCIIBLKR.js +1 -0
  100. package/out/chunk-KOGNQDSJ.js +1 -0
  101. package/out/chunk-NRPC74AM.js +1 -0
  102. package/out/chunk-OOJM4CTU.js +1 -0
  103. package/out/chunk-PBZPYIG7.js +1 -0
  104. package/out/chunk-PNHBZGDD.js +1 -0
  105. package/out/chunk-PWFUOLZK.js +17 -0
  106. package/out/chunk-PXK7EU4V.js +1 -0
  107. package/out/chunk-QB4CBOX2.js +1 -0
  108. package/out/chunk-R3NZFXVR.js +1 -0
  109. package/out/chunk-R5O6FAW4.js +2 -0
  110. package/out/chunk-SXV2T5C4.js +80 -0
  111. package/out/chunk-TQJDYHVE.js +2 -0
  112. package/out/chunk-TUII34K2.js +1 -0
  113. package/out/chunk-VDRXHIHN.js +3 -0
  114. package/out/chunk-VFWMQ3LG.js +2 -0
  115. package/out/chunk-VH4XMZIW.js +2 -0
  116. package/out/chunk-WCPJDAYA.js +10 -0
  117. package/out/chunk-WFYLMF6Z.js +10 -0
  118. package/out/chunk-WRAJVD35.js +1 -0
  119. package/out/chunk-WYLQWYLA.js +1 -0
  120. package/out/client-managed-import.js +4 -0
  121. package/out/client-managed.js +33 -0
  122. package/out/client-sync.js +11 -17
  123. package/out/compare.js +35 -0
  124. package/out/dialogs.js +55 -0
  125. package/out/github-issue-authorized.html +3 -0
  126. package/out/github-issue-authorized.js +1 -0
  127. package/out/graph.js +17 -4
  128. package/out/index.html +90 -8
  129. package/out/prism.js +14 -10
  130. package/out/scan.js +2 -0
  131. package/out/stasis.svg +20 -0
  132. package/out/terminal.js +366 -39
  133. package/out/view.css +1 -1
  134. package/out/view.js +19 -144
  135. package/package.json +364 -59
  136. package/risk/actions/findings.js +161 -0
  137. package/risk/actions/resolve.js +219 -0
  138. package/risk/actions/scripts/commands.js +182 -0
  139. package/risk/actions/scripts/grade.js +113 -0
  140. package/risk/actions/scripts/packages.js +123 -0
  141. package/risk/actions/scripts/shell.js +169 -0
  142. package/risk/actions/uses.js +76 -0
  143. package/risk/actions/workflow.js +110 -0
  144. package/risk/files/characters.js +196 -0
  145. package/risk/files/hosts.js +205 -0
  146. package/risk/files/readability.js +177 -0
  147. package/risk/files/runs-code.js +615 -0
  148. package/risk/files/script.js +118 -0
  149. package/risk/files/stamps.js +47 -0
  150. package/risk/index.d.ts +254 -0
  151. package/risk/index.js +11 -0
  152. package/risk/npm/assess.js +285 -0
  153. package/risk/npm/combined.js +68 -0
  154. package/risk/npm/compare.js +257 -0
  155. package/risk/npm/dependencies.js +172 -0
  156. package/risk/npm/diff.js +79 -0
  157. package/risk/npm/downloads.js +84 -0
  158. package/risk/npm/files.js +445 -0
  159. package/risk/npm/held.js +63 -0
  160. package/risk/npm/install-scripts.js +34 -0
  161. package/risk/npm/malware.js +36 -0
  162. package/risk/npm/manifest.js +65 -0
  163. package/risk/npm/new-dependency.js +60 -0
  164. package/risk/npm/old-version.js +108 -0
  165. package/risk/npm/registry.js +388 -0
  166. package/risk/npm/release.js +85 -0
  167. package/risk/npm/score.js +59 -0
  168. package/risk/npm/specs.js +124 -0
  169. package/risk/npm/tarball.js +96 -0
  170. package/server-common/database-config.ts +16 -0
  171. package/server-common/initialize.ts +18 -0
  172. package/server-common/npm-advisories.ts +101 -0
  173. package/{server → server-common}/origin.ts +5 -5
  174. package/server-common/reap.ts +48 -0
  175. package/server-common/scan-config.ts +19 -0
  176. package/server-common/standalone.ts +29 -0
  177. package/server-common/storage-crypto.ts +182 -0
  178. package/server-common/storage-log.ts +38 -0
  179. package/server-common/vercel-blob.ts +103 -0
  180. package/server-e2e/app.ts +487 -0
  181. package/{server → server-e2e}/bus-receiver.ts +2 -1
  182. package/{server → server-e2e}/cli.js +9 -4
  183. package/{server → server-e2e}/config.ts +50 -42
  184. package/{server → server-e2e}/db-neon.ts +2 -2
  185. package/{server → server-e2e}/db-revision-sql.ts +1 -1
  186. package/{server → server-e2e}/db-stmt.ts +2 -2
  187. package/{server → server-e2e}/db.ts +7 -7
  188. package/{server → server-e2e}/http.ts +44 -13
  189. package/{server → server-e2e}/hub.ts +40 -9
  190. package/server-e2e/index.ts +17 -0
  191. package/server-e2e/lifecycle.ts +95 -0
  192. package/{server → server-e2e}/neon-driver.ts +2 -2
  193. package/{server → server-e2e}/npm-proxy.ts +12 -145
  194. package/{server → server-e2e}/objstore/blob-vercel.ts +10 -114
  195. package/{server → server-e2e}/objstore/blob.ts +1 -1
  196. package/server-e2e/objstore/fetch-mint-guard.ts +74 -0
  197. package/{server → server-e2e}/objstore/handlers.ts +9 -8
  198. package/{server → server-e2e}/objstore/init.ts +19 -27
  199. package/{server → server-e2e}/objstore/reaper.ts +1 -1
  200. package/server-e2e/objstore/rest-deny.ts +28 -0
  201. package/server-e2e/objstore/rest-mint.ts +224 -0
  202. package/{server → server-e2e}/objstore/rest.ts +3 -3
  203. package/{server → server-e2e}/objstore/store-neon.ts +6 -10
  204. package/{server → server-e2e}/objstore/store.ts +7 -7
  205. package/{server → server-e2e}/objstore/tokens.ts +2 -2
  206. package/{server → server-e2e}/pubsub.ts +12 -9
  207. package/{server → server-e2e}/sign.ts +4 -4
  208. package/{server → server-e2e}/sse-server.ts +60 -33
  209. package/{server → server-e2e}/static.ts +31 -21
  210. package/{server → server-e2e}/sync-handlers.ts +64 -30
  211. package/{server → server-e2e}/ws-server.ts +20 -9
  212. package/server-managed/activity.ts +258 -0
  213. package/server-managed/agent-merges.ts +109 -0
  214. package/server-managed/app-agents.ts +23 -0
  215. package/server-managed/avatar-store.ts +13 -0
  216. package/server-managed/blob-store.ts +17 -0
  217. package/server-managed/brotli.ts +10 -0
  218. package/server-managed/bundle-advisories.ts +120 -0
  219. package/server-managed/bundle-advisory-inventory.ts +77 -0
  220. package/server-managed/bundle-build-diagnostics.d.ts +10 -0
  221. package/server-managed/bundle-build-diagnostics.js +23 -0
  222. package/server-managed/bundle-build-leases.ts +41 -0
  223. package/server-managed/bundle-build-worker.js +115 -0
  224. package/server-managed/bundle-build.ts +200 -0
  225. package/server-managed/bundle-cache.ts +211 -0
  226. package/server-managed/bundle-catalog.ts +29 -0
  227. package/server-managed/bundle-commits.ts +140 -0
  228. package/server-managed/bundle-store.ts +24 -0
  229. package/server-managed/bundle-summary-cache.ts +130 -0
  230. package/server-managed/bundle.ts +119 -0
  231. package/server-managed/cache-storage.ts +20 -0
  232. package/server-managed/cli.js +21 -0
  233. package/server-managed/combined.ts +47 -0
  234. package/server-managed/comments.ts +151 -0
  235. package/server-managed/commit-coauthors.ts +106 -0
  236. package/server-managed/commit-lockfiles.ts +76 -0
  237. package/server-managed/comparison.ts +52 -0
  238. package/server-managed/config.ts +164 -0
  239. package/server-managed/content-access.ts +15 -0
  240. package/server-managed/crypto.ts +25 -0
  241. package/server-managed/db-methods.ts +1923 -0
  242. package/server-managed/db-neon.ts +468 -0
  243. package/server-managed/db-schema.ts +238 -0
  244. package/server-managed/db-table-names.ts +22 -0
  245. package/server-managed/db.ts +143 -0
  246. package/server-managed/dependabot-access.ts +60 -0
  247. package/server-managed/dependabot-alerts.ts +185 -0
  248. package/server-managed/dependency-review-comments.ts +98 -0
  249. package/server-managed/dependency-reviews.ts +364 -0
  250. package/server-managed/github-accounts.ts +60 -0
  251. package/server-managed/github-actions.ts +71 -0
  252. package/server-managed/github-app.ts +376 -0
  253. package/server-managed/github-errors.ts +70 -0
  254. package/server-managed/github-graphql.ts +39 -0
  255. package/server-managed/github-issue-links.ts +140 -0
  256. package/server-managed/github-issue-oauth.ts +47 -0
  257. package/server-managed/github-issues.ts +152 -0
  258. package/server-managed/github-link-oauth.ts +69 -0
  259. package/server-managed/github-links.ts +204 -0
  260. package/server-managed/github-metadata.ts +213 -0
  261. package/server-managed/github-oauth.ts +238 -0
  262. package/server-managed/github-pulls.ts +227 -0
  263. package/server-managed/github-requests.ts +136 -0
  264. package/server-managed/github-users.ts +30 -0
  265. package/server-managed/http-response.ts +76 -0
  266. package/server-managed/http.ts +5503 -0
  267. package/server-managed/import-triage.ts +51 -0
  268. package/server-managed/index.ts +192 -0
  269. package/server-managed/kept-briefly.ts +37 -0
  270. package/server-managed/kept.ts +28 -0
  271. package/server-managed/link-reports.ts +162 -0
  272. package/server-managed/listed-activity.ts +39 -0
  273. package/server-managed/locked-packages.ts +152 -0
  274. package/server-managed/lockfile-scope.ts +49 -0
  275. package/server-managed/lru.ts +30 -0
  276. package/server-managed/managed-issues.ts +78 -0
  277. package/server-managed/management-catalog.ts +45 -0
  278. package/server-managed/management.ts +99 -0
  279. package/server-managed/npm-delta-worker.js +23 -0
  280. package/server-managed/npm-delta.ts +194 -0
  281. package/server-managed/npm-insights.ts +449 -0
  282. package/server-managed/npm-kept.ts +225 -0
  283. package/server-managed/npm-loads.ts +264 -0
  284. package/server-managed/npm-manifest.ts +115 -0
  285. package/server-managed/npm-packages.ts +454 -0
  286. package/server-managed/npm-patch.ts +325 -0
  287. package/server-managed/npm-provenance.ts +123 -0
  288. package/server-managed/npm-risk.ts +285 -0
  289. package/server-managed/object-storage-disk.ts +148 -0
  290. package/server-managed/object-storage-vercel.ts +67 -0
  291. package/server-managed/object-storage.ts +75 -0
  292. package/server-managed/package-entry-points.ts +51 -0
  293. package/server-managed/pretty-print.ts +434 -0
  294. package/server-managed/public-workspace.ts +238 -0
  295. package/server-managed/pull-comment-reviews.ts +161 -0
  296. package/server-managed/pull-dependencies.ts +351 -0
  297. package/server-managed/pull-dependency-reviews.ts +334 -0
  298. package/server-managed/pull-reviews.ts +205 -0
  299. package/server-managed/queue.ts +39 -0
  300. package/server-managed/release-commits.ts +84 -0
  301. package/server-managed/rename-diff-worker.js +26 -0
  302. package/server-managed/rename-diff.ts +279 -0
  303. package/server-managed/repo-path.ts +21 -0
  304. package/server-managed/report-migration.ts +35 -0
  305. package/server-managed/report-query.ts +10 -0
  306. package/server-managed/report-response.ts +16 -0
  307. package/server-managed/report-sources.ts +178 -0
  308. package/server-managed/report-store.ts +85 -0
  309. package/server-managed/repository-actions.ts +218 -0
  310. package/server-managed/repository-agents.ts +448 -0
  311. package/server-managed/repository-aliases.ts +91 -0
  312. package/server-managed/repository-browser.ts +294 -0
  313. package/server-managed/repository-changes.ts +284 -0
  314. package/server-managed/repository-code.ts +215 -0
  315. package/server-managed/repository-dependency-reviews.ts +166 -0
  316. package/server-managed/repository-discovery.ts +82 -0
  317. package/server-managed/repository-history.ts +432 -0
  318. package/server-managed/repository-issues.ts +195 -0
  319. package/server-managed/repository-policy.ts +27 -0
  320. package/server-managed/repository-pulls.ts +212 -0
  321. package/server-managed/repository-pulse.ts +460 -0
  322. package/server-managed/repository-risk-assess.ts +105 -0
  323. package/server-managed/repository-risk-audit.ts +79 -0
  324. package/server-managed/repository-risk-read.ts +170 -0
  325. package/server-managed/repository-risk.ts +491 -0
  326. package/server-managed/repository-squashes.ts +168 -0
  327. package/server-managed/request-timing.ts +63 -0
  328. package/server-managed/reviewed-dependencies.ts +149 -0
  329. package/server-managed/revisions.ts +35 -0
  330. package/server-managed/scan-downloads.ts +87 -0
  331. package/server-managed/session.ts +132 -0
  332. package/server-managed/slugs.ts +38 -0
  333. package/server-managed/solidity-entry-points.ts +71 -0
  334. package/server-managed/sql-postgres.ts +34 -0
  335. package/server-managed/sql.ts +88 -0
  336. package/server-managed/static.ts +28 -0
  337. package/server-managed/storage-command.ts +16 -0
  338. package/server-managed/storage-db.ts +183 -0
  339. package/server-managed/storage-encryption.ts +290 -0
  340. package/server-managed/storage-maintenance.ts +259 -0
  341. package/server-managed/storage-payload.ts +121 -0
  342. package/server-managed/storage-stores.ts +91 -0
  343. package/server-managed/storage.ts +82 -0
  344. package/server-managed/team-app.ts +134 -0
  345. package/server-managed/team-catalog.ts +7 -0
  346. package/server-managed/team-feed.ts +180 -0
  347. package/server-managed/team-npm-scopes.ts +106 -0
  348. package/server-managed/team-reports.ts +319 -0
  349. package/server-managed/triage-response.ts +16 -0
  350. package/server-managed/type-only-worker.js +19 -0
  351. package/server-managed/type-only.ts +105 -0
  352. package/server-managed/uploads.ts +106 -0
  353. package/server-managed/upstream-cache.ts +243 -0
  354. package/server-managed/view-as.ts +58 -0
  355. package/server-managed/workspace-shares.ts +169 -0
  356. package/server.ts +70 -0
  357. package/server/index.ts +0 -480
  358. package/server/lifecycle.ts +0 -208
  359. /package/{LICENSE → LICENSE-MIT} +0 -0
  360. /package/{server → server-e2e}/auth.ts +0 -0
  361. /package/{server → server-e2e}/config.example.json +0 -0
  362. /package/{server → server-e2e}/objstore/blob-fs.ts +0 -0
  363. /package/{server → server-e2e}/objstore/fs.ts +0 -0
  364. /package/{server → server-e2e}/objstore/sign.ts +0 -0
  365. /package/{server → server-e2e}/peer.ts +0 -0
  366. /package/{server → server-e2e}/sse-session.ts +0 -0
  367. /package/{server → server-e2e}/util.ts +0 -0
  368. /package/{server → server-e2e}/validation.ts +0 -0
@@ -1,22 +1,16 @@
1
- function Gr(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array"&&"BYTES_PER_ELEMENT"in e&&e.BYTES_PER_ELEMENT===1}function tt(e){if(typeof e!="boolean")throw new TypeError(`boolean expected, not ${e}`)}function Be(e){if(typeof e!="number")throw new TypeError("number expected, got "+typeof e);if(!Number.isSafeInteger(e)||e<0)throw new RangeError("positive integer expected, got "+e)}function ee(e,t,n=""){let r=Gr(e),o=e?.length,s=t!==void 0;if(!r||s&&o!==t){let i=n&&`"${n}" `,a=s?` of length ${t}`:"",f=r?`length=${o}`:`type=${typeof e}`,c=i+"expected Uint8Array"+a+", got "+f;throw r?new RangeError(c):new TypeError(c)}return e}function At(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function Tn(e,t,n=!1){ee(e,void 0,"output");let r=t.outputLen;if(e.length<r)throw new RangeError("digestInto() expects output buffer of length at least "+r);if(n&&!Re(e))throw new Error("invalid output, must be aligned")}function pe(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function ue(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}function Jr(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}var Se=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68,Yr=e=>e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255;var Xr=e=>{for(let t=0;t<e.length;t++)e[t]=Yr(e[t]);return e},be=Se?e=>e:Xr;function xn(e,t){if(t==null||typeof t!="object")throw new Error("options must be defined");return Object.assign(e,t)}function En(e,t){if(e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return n===0}function An(e,t,n){let r=t,o=n||(()=>[]),s=(a,f)=>r(f,...o(a)).update(a).digest(),i=r(new Uint8Array(e),...o(new Uint8Array(0)));return s.outputLen=i.outputLen,s.blockLen=i.blockLen,s.create=(a,...f)=>r(a,...f),s}var Pn=(e,t)=>{function n(r,...o){if(ee(r,void 0,"key"),e.nonceLength!==void 0){let p=o[0];ee(p,e.varSizeNonce?void 0:e.nonceLength,"nonce")}let s=e.tagLength;s&&o[1]!==void 0&&ee(o[1],void 0,"AAD");let i=t(r,...o),a=(p,w)=>{if(w!==void 0){if(p!==2)throw new Error("cipher output not supported");ee(w,void 0,"output")}},f=!1;return{encrypt(p,w){if(f)throw new Error("cannot encrypt() twice with same key + nonce");return f=!0,ee(p),a(i.encrypt.length,w),i.encrypt(p,w)},decrypt(p,w){if(ee(p),s&&p.length<s)throw new Error('"ciphertext" expected length bigger than tagLength='+s);return a(i.decrypt.length,w),i.decrypt(p,w)}}}return Object.assign(n,e),n};function De(e,t,n=!0){if(t===void 0)return new Uint8Array(e);if(ee(t,void 0,"output"),t.length!==e)throw new Error('"output" expected Uint8Array of length '+e+", got: "+t.length);if(n&&!Re(t))throw new Error("invalid output, must be aligned");return t}function Bn(e,t,n){Be(e),Be(t),tt(n);let r=new Uint8Array(16),o=Jr(r);return o.setBigUint64(0,BigInt(t),n),o.setBigUint64(8,BigInt(e),n),r}function Re(e){return e.byteOffset%4===0}function je(e){return Uint8Array.from(ee(e))}var jn=e=>Uint8Array.from(e.split(""),t=>t.charCodeAt(0)),Qr=be(pe(jn("expand 16-byte k"))),Zr=be(pe(jn("expand 32-byte k")));function C(e,t){return e<<t|e>>>32-t}var $e=64,eo=16,Pt=2**32-1,Rn=Uint32Array.of();function to(e,t,n,r,o,s,i,a){let f=o.length,c=new Uint8Array($e),p=pe(c),w=Se&&Re(o)&&Re(s),x=w?pe(o):Rn,A=w?pe(s):Rn;if(!Se){for(let y=0;y<f;i++){if(e(t,n,r,p,i,a),be(p),i>=Pt)throw new Error("arx: counter overflow");let T=Math.min($e,f-y);for(let E=0,j;E<T;E++)j=y+E,s[j]=o[j]^c[E];y+=T}return}for(let y=0;y<f;i++){if(e(t,n,r,p,i,a),i>=Pt)throw new Error("arx: counter overflow");let T=Math.min($e,f-y);if(w&&T===$e){let E=y/4;if(y%4!==0)throw new Error("arx: invalid block position");for(let j=0,V;j<eo;j++)V=E+j,A[V]=x[V]^p[j];y+=$e;continue}for(let E=0,j;E<T;E++)j=y+E,s[j]=o[j]^c[E];y+=T}}function On(e,t){let{allowShortKeys:n,extendNonceFn:r,counterLength:o,counterRight:s,rounds:i}=xn({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},t);if(typeof e!="function")throw new Error("core must be a function");return Be(o),Be(i),tt(s),tt(n),(a,f,c,p,w=0)=>{ee(a,void 0,"key"),ee(f,void 0,"nonce"),ee(c,void 0,"data");let x=c.length;if(p=De(x,p,!1),Be(w),w<0||w>=Pt)throw new Error("arx: counter overflow");let A=[],y=a.length,T,E;if(y===32)A.push(T=je(a)),E=Zr;else if(y===16&&n)T=new Uint8Array(32),T.set(a),T.set(a,16),E=Qr,A.push(T);else throw ee(a,32,"arx key"),new Error("invalid key size");(!Se||!Re(f))&&A.push(f=je(f));let j=pe(T);if(r){if(f.length!==24)throw new Error("arx: extended nonce must be 24 bytes");let ne=f.subarray(0,16);if(Se)r(E,j,pe(ne),j);else{let oe=be(Uint32Array.from(E));r(oe,j,pe(ne),j),ue(oe),be(j)}f=f.subarray(16)}else Se||be(j);let V=16-o;if(V!==f.length)throw new Error(`arx: nonce must be ${V} or 16 bytes`);if(V!==12){let ne=new Uint8Array(12);ne.set(f,s?0:12-f.length),f=ne,A.push(f)}let ie=be(pe(f));try{return to(e,E,j,ie,c,p,w,i),p}finally{ue(...A)}}}function re(e,t){return e[t++]&255|(e[t++]&255)<<8}var Bt=class{blockLen=16;outputLen=16;buffer=new Uint8Array(16);r=new Uint16Array(10);h=new Uint16Array(10);pad=new Uint16Array(8);pos=0;finished=!1;destroyed=!1;constructor(t){t=je(ee(t,32,"key"));let n=re(t,0),r=re(t,2),o=re(t,4),s=re(t,6),i=re(t,8),a=re(t,10),f=re(t,12),c=re(t,14);this.r[0]=n&8191,this.r[1]=(n>>>13|r<<3)&8191,this.r[2]=(r>>>10|o<<6)&7939,this.r[3]=(o>>>7|s<<9)&8191,this.r[4]=(s>>>4|i<<12)&255,this.r[5]=i>>>1&8190,this.r[6]=(i>>>14|a<<2)&8191,this.r[7]=(a>>>11|f<<5)&8065,this.r[8]=(f>>>8|c<<8)&8191,this.r[9]=c>>>5&127;for(let p=0;p<8;p++)this.pad[p]=re(t,16+2*p)}process(t,n,r=!1){let o=r?0:2048,{h:s,r:i}=this,a=i[0],f=i[1],c=i[2],p=i[3],w=i[4],x=i[5],A=i[6],y=i[7],T=i[8],E=i[9],j=re(t,n+0),V=re(t,n+2),ie=re(t,n+4),ne=re(t,n+6),oe=re(t,n+8),Z=re(t,n+10),Y=re(t,n+12),Q=re(t,n+14),U=s[0]+(j&8191),K=s[1]+((j>>>13|V<<3)&8191),L=s[2]+((V>>>10|ie<<6)&8191),$=s[3]+((ie>>>7|ne<<9)&8191),M=s[4]+((ne>>>4|oe<<12)&8191),N=s[5]+(oe>>>1&8191),I=s[6]+((oe>>>14|Z<<2)&8191),F=s[7]+((Z>>>11|Y<<5)&8191),H=s[8]+((Y>>>8|Q<<8)&8191),D=s[9]+(Q>>>5|o),k=0,z=k+U*a+K*(5*E)+L*(5*T)+$*(5*y)+M*(5*A);k=z>>>13,z&=8191,z+=N*(5*x)+I*(5*w)+F*(5*p)+H*(5*c)+D*(5*f),k+=z>>>13,z&=8191;let G=k+U*f+K*a+L*(5*E)+$*(5*T)+M*(5*y);k=G>>>13,G&=8191,G+=N*(5*A)+I*(5*x)+F*(5*w)+H*(5*p)+D*(5*c),k+=G>>>13,G&=8191;let b=k+U*c+K*f+L*a+$*(5*E)+M*(5*T);k=b>>>13,b&=8191,b+=N*(5*y)+I*(5*A)+F*(5*x)+H*(5*w)+D*(5*p),k+=b>>>13,b&=8191;let v=k+U*p+K*c+L*f+$*a+M*(5*E);k=v>>>13,v&=8191,v+=N*(5*T)+I*(5*y)+F*(5*A)+H*(5*x)+D*(5*w),k+=v>>>13,v&=8191;let _=k+U*w+K*p+L*c+$*f+M*a;k=_>>>13,_&=8191,_+=N*(5*E)+I*(5*T)+F*(5*y)+H*(5*A)+D*(5*x),k+=_>>>13,_&=8191;let l=k+U*x+K*w+L*p+$*c+M*f;k=l>>>13,l&=8191,l+=N*a+I*(5*E)+F*(5*T)+H*(5*y)+D*(5*A),k+=l>>>13,l&=8191;let g=k+U*A+K*x+L*w+$*p+M*c;k=g>>>13,g&=8191,g+=N*f+I*a+F*(5*E)+H*(5*T)+D*(5*y),k+=g>>>13,g&=8191;let d=k+U*y+K*A+L*x+$*w+M*p;k=d>>>13,d&=8191,d+=N*c+I*f+F*a+H*(5*E)+D*(5*T),k+=d>>>13,d&=8191;let m=k+U*T+K*y+L*A+$*x+M*w;k=m>>>13,m&=8191,m+=N*p+I*c+F*f+H*a+D*(5*E),k+=m>>>13,m&=8191;let u=k+U*E+K*T+L*y+$*A+M*x;k=u>>>13,u&=8191,u+=N*w+I*p+F*c+H*f+D*a,k+=u>>>13,u&=8191,k=(k<<2)+k|0,k=k+z|0,z=k&8191,k=k>>>13,G+=k,s[0]=z,s[1]=G,s[2]=b,s[3]=v,s[4]=_,s[5]=l,s[6]=g,s[7]=d,s[8]=m,s[9]=u}finalize(){let{h:t,pad:n}=this,r=new Uint16Array(10),o=t[1]>>>13;t[1]&=8191;for(let a=2;a<10;a++)t[a]+=o,o=t[a]>>>13,t[a]&=8191;t[0]+=o*5,o=t[0]>>>13,t[0]&=8191,t[1]+=o,o=t[1]>>>13,t[1]&=8191,t[2]+=o,r[0]=t[0]+5,o=r[0]>>>13,r[0]&=8191;for(let a=1;a<10;a++)r[a]=t[a]+o,o=r[a]>>>13,r[a]&=8191;r[9]-=8192;let s=(o^1)-1;for(let a=0;a<10;a++)r[a]&=s;s=~s;for(let a=0;a<10;a++)t[a]=t[a]&s|r[a];t[0]=(t[0]|t[1]<<13)&65535,t[1]=(t[1]>>>3|t[2]<<10)&65535,t[2]=(t[2]>>>6|t[3]<<7)&65535,t[3]=(t[3]>>>9|t[4]<<4)&65535,t[4]=(t[4]>>>12|t[5]<<1|t[6]<<14)&65535,t[5]=(t[6]>>>2|t[7]<<11)&65535,t[6]=(t[7]>>>5|t[8]<<8)&65535,t[7]=(t[8]>>>8|t[9]<<5)&65535;let i=t[0]+n[0];t[0]=i&65535;for(let a=1;a<8;a++)i=(t[a]+n[a]|0)+(i>>>16)|0,t[a]=i&65535;ue(r)}update(t){At(this),ee(t),t=je(t);let{buffer:n,blockLen:r}=this,o=t.length;for(let s=0;s<o;){let i=Math.min(r-this.pos,o-s);if(i===r){for(;r<=o-s;s+=r)this.process(t,s);continue}n.set(t.subarray(s,s+i),this.pos),this.pos+=i,s+=i,this.pos===r&&(this.process(n,0,!1),this.pos=0)}return this}destroy(){this.destroyed=!0,ue(this.h,this.r,this.buffer,this.pad)}digestInto(t){At(this),Tn(t,this),this.finished=!0;let{buffer:n,h:r}=this,{pos:o}=this;if(o){for(n[o++]=1;o<16;o++)n[o]=0;this.process(n,0,!0)}this.finalize();let s=0;for(let i=0;i<8;i++)t[s++]=r[i]>>>0,t[s++]=r[i]>>>8}digest(){let{buffer:t,outputLen:n}=this;this.digestInto(t);let r=t.slice(0,n);return this.destroy(),r}},Cn=An(32,e=>new Bt(e));function no(e,t,n,r,o,s=20){let i=e[0],a=e[1],f=e[2],c=e[3],p=t[0],w=t[1],x=t[2],A=t[3],y=t[4],T=t[5],E=t[6],j=t[7],V=o,ie=n[0],ne=n[1],oe=n[2],Z=i,Y=a,Q=f,U=c,K=p,L=w,$=x,M=A,N=y,I=T,F=E,H=j,D=V,k=ie,z=ne,G=oe;for(let v=0;v<s;v+=2)Z=Z+K|0,D=C(D^Z,16),N=N+D|0,K=C(K^N,12),Z=Z+K|0,D=C(D^Z,8),N=N+D|0,K=C(K^N,7),Y=Y+L|0,k=C(k^Y,16),I=I+k|0,L=C(L^I,12),Y=Y+L|0,k=C(k^Y,8),I=I+k|0,L=C(L^I,7),Q=Q+$|0,z=C(z^Q,16),F=F+z|0,$=C($^F,12),Q=Q+$|0,z=C(z^Q,8),F=F+z|0,$=C($^F,7),U=U+M|0,G=C(G^U,16),H=H+G|0,M=C(M^H,12),U=U+M|0,G=C(G^U,8),H=H+G|0,M=C(M^H,7),Z=Z+L|0,G=C(G^Z,16),F=F+G|0,L=C(L^F,12),Z=Z+L|0,G=C(G^Z,8),F=F+G|0,L=C(L^F,7),Y=Y+$|0,D=C(D^Y,16),H=H+D|0,$=C($^H,12),Y=Y+$|0,D=C(D^Y,8),H=H+D|0,$=C($^H,7),Q=Q+M|0,k=C(k^Q,16),N=N+k|0,M=C(M^N,12),Q=Q+M|0,k=C(k^Q,8),N=N+k|0,M=C(M^N,7),U=U+K|0,z=C(z^U,16),I=I+z|0,K=C(K^I,12),U=U+K|0,z=C(z^U,8),I=I+z|0,K=C(K^I,7);let b=0;r[b++]=i+Z|0,r[b++]=a+Y|0,r[b++]=f+Q|0,r[b++]=c+U|0,r[b++]=p+K|0,r[b++]=w+L|0,r[b++]=x+$|0,r[b++]=A+M|0,r[b++]=y+N|0,r[b++]=T+I|0,r[b++]=E+F|0,r[b++]=j+H|0,r[b++]=V+D|0,r[b++]=ie+k|0,r[b++]=ne+z|0,r[b++]=oe+G|0}var ro=On(no,{counterRight:!1,counterLength:4,allowShortKeys:!1});var oo=new Uint8Array(16),Un=(e,t)=>{e.update(t);let n=t.length%16;n&&e.update(oo.subarray(n))},so=new Uint8Array(32);function Ln(e,t,n,r,o){o!==void 0&&ee(o,void 0,"AAD");let s=e(t,n,so),i=Bn(r.length,o?o.length:0,!0),a=Cn.create(s);o&&Un(a,o),Un(a,r),a.update(i);let f=a.digest();return ue(s,i),f}var io=e=>(t,n,r)=>({encrypt(s,i){let a=s.length;i=De(a+16,i,!1),i.set(s);let f=i.subarray(0,-16);e(t,n,f,f,1);let c=Ln(e,t,n,f,r);return i.set(c,a),ue(c),i},decrypt(s,i){i=De(s.length-16,i,!1);let a=s.subarray(0,-16),f=s.subarray(-16),c=Ln(e,t,n,a,r);if(!En(f,c))throw ue(c),new Error("invalid tag");return i.set(s.subarray(0,-16)),e(t,n,i,i,1),ue(c),i}}),Oe=Pn({blockSize:64,nonceLength:12,tagLength:16},io(ro));var ao=new TextEncoder,co=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0});function X(e){if(typeof e!="string")throw new TypeError(`encodeUtf8 expects a string, got ${typeof e}`);if(!e.isWellFormed())throw new TypeError("encodeUtf8: input contains lone surrogates");return ao.encode(e)}function Ce(e){if(!ArrayBuffer.isView(e)&&!(e instanceof ArrayBuffer))throw new TypeError(`decodeUtf8 expects a BufferSource, got ${e===null?"null":typeof e}`);return co.decode(e)}async function Nn(e){let t=new Blob([e]).stream().pipeThrough(new CompressionStream("gzip"));return new Uint8Array(await new Response(t).arrayBuffer())}async function Kn(e){let t=new Blob([e]).stream().pipeThrough(new DecompressionStream("gzip"));return new Uint8Array(await new Response(t).arrayBuffer())}var lo="deepview-triage-sync.v1.content-key",uo="deepview-triage-sync.v1.sign-key",fo="deepview-triage-sync.v1.save",go="deepview-triage-sync.v1.subscribe",po=12,Rt=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,112,4,34,4,32]),nt=null;function Mn(){return nt||(nt=(async()=>{try{return await crypto.subtle.importKey("raw",new Uint8Array(32),{name:"ChaCha20-Poly1305"},!1,["encrypt","decrypt"]),!0}catch{return!1}})(),nt)}async function In(e,t){let n=Uint8Array.fromBase64(e);if(n.length!==32)throw new Error(`workspace private key must be 32 bytes (got ${n.length})`);let r=await crypto.subtle.importKey("raw",n,"HKDF",!1,["deriveBits"]),o=await crypto.subtle.deriveBits({name:"HKDF",hash:"SHA-256",salt:new Uint8Array,info:X(t)},r,256);return new Uint8Array(o)}async function Fn(e){return await In(e,lo)}async function rt(e,t){let n=await In(e,`${uo}|${t}`),r=new Uint8Array(Rt.length+32);r.set(Rt,0),r.set(n,Rt.length);let o=await crypto.subtle.importKey("pkcs8",r,{name:"Ed25519"},!0,["sign"]),s=await crypto.subtle.exportKey("jwk",o),i=s.x;if(delete s.d,i==null)throw new Error("Ed25519 JWK export returned no public key");let a=Uint8Array.fromBase64(i,{alphabet:"base64url"}),f=await crypto.subtle.importKey("pkcs8",r,{name:"Ed25519"},!1,["sign"]);return n.fill(0),r.fill(0),{privateKey:f,publicKey:a,publicKeyB64:i}}function jt({publicKeyB64:e,base:t,keyframe:n,nonceB64:r,ciphertextB64:o}){return X([fo,e,t==null?"":String(t),n===!0?"1":"",r,o].join(`
2
- `))}async function Dn(e,t){let n=await crypto.subtle.sign({name:"Ed25519"},e,t);return new Uint8Array(n).toBase64({alphabet:"base64url",omitPadding:!0})}async function $n(e,t){return await Dn(e,jt(t))}async function Ot(e){let t=jt(e),n=await crypto.subtle.digest("SHA-256",t);return new Uint8Array(n).toBase64({alphabet:"base64url",omitPadding:!0})}function yo(e,t,n){let r=t==null?"":String(t);return X([go,e,r,n].join(`
3
- `))}async function Hn(e,t,n,r){return await Dn(e,yo(t,n,r))}async function _n(e,t,n){try{let r=await crypto.subtle.importKey("raw",e,{name:"Ed25519"},!1,["verify"]),o=Uint8Array.fromBase64(n,{alphabet:"base64url"}),s=jt(t);return await crypto.subtle.verify({name:"Ed25519"},r,o,s)}catch{return!1}}function ho(){let e=new Uint8Array(po);return crypto.getRandomValues(e),e}function Ct(e,t){let n=t==null?"":String(t);return X(`${e}|${n}`)}async function mo(e,t,n){let r=ho();if(await Mn()){let s=await crypto.subtle.importKey("raw",e,{name:"ChaCha20-Poly1305"},!1,["encrypt"]),i=new Uint8Array(await crypto.subtle.encrypt({name:"ChaCha20-Poly1305",iv:r,additionalData:n},s,t));return{nonce:r,ciphertext:i}}let o=Oe(e,r,n);return{nonce:r,ciphertext:o.encrypt(t)}}async function bo(e,t,n,r){if(await Mn()){let s=await crypto.subtle.importKey("raw",e,{name:"ChaCha20-Poly1305"},!1,["decrypt"]);return new Uint8Array(await crypto.subtle.decrypt({name:"ChaCha20-Poly1305",iv:t,additionalData:r},s,n))}return Oe(e,t,r).decrypt(n)}var wo=64;function vo(e,t){return e<=t?t:2**(32-Math.clz32(e-1))}async function So(e){let t=X(JSON.stringify(e)),n=await Nn(t);if(n.length>1073741820)throw new Error("payload too large");let r=vo(4+n.length,wo),o=new Uint8Array(r);return new DataView(o.buffer,o.byteOffset,o.byteLength).setUint32(0,n.length,!1),o.set(n,4),o}async function ko(e){if(e.length<4)throw new Error("plaintext too short");let n=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint32(0,!1);if(n+4>e.length)throw new Error("length prefix exceeds buffer");let r=e.subarray(4,4+n),o=await Kn(r);return JSON.parse(Ce(o))}async function Wn(e,t,n){let r=await So(t),{nonce:o,ciphertext:s}=await mo(e,r,n);return{nonce:o.toBase64(),ciphertext:s.toBase64()}}async function Vn(e,t,n,r){let o=Uint8Array.fromBase64(t),s=Uint8Array.fromBase64(n),i=await bo(e,o,s,r);return ko(i)}var To="deepview-objstore.v1.content",xo="deepview-objstore.v1.tag",Eo=`objstore-tag
4
- `,Ao=`objstore-bundle-tag
5
- `,ke=12,Po=16;async function Ut(e,t){let n=Uint8Array.fromBase64(e);if(n.length!==32)throw new Error(`workspace private key must be 32 bytes (got ${n.length})`);let r=await zn(n,To,32),o=await zn(n,xo,32);n.fill(0);let{privateKey:s,publicKeyB64:i}=await rt(e,t);return{signingKey:s,contentKey:r,tagKey:o,workspaceTag:i}}async function zn(e,t,n){let r=await crypto.subtle.importKey("raw",e,"HKDF",!1,["deriveBits"]),o=await crypto.subtle.deriveBits({name:"HKDF",hash:"SHA-256",salt:new Uint8Array,info:X(t)},r,n*8);return new Uint8Array(o)}async function fe(e,t){let n=await crypto.subtle.importKey("raw",e,{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return new Uint8Array(await crypto.subtle.sign("HMAC",n,X(Eo+t))).toBase64({alphabet:"base64url",omitPadding:!0})}async function ye(e,t){let n=await crypto.subtle.importKey("raw",e,{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return new Uint8Array(await crypto.subtle.sign("HMAC",n,X(Ao+t))).toBase64({alphabet:"base64url",omitPadding:!0})}function Lt(e,t,n,r,o){let s=X(t);if(s.length>65535)throw new Error(`fileName too long: ${s.length} bytes (max 65535)`);let i=new Uint8Array(2+s.length+n.length);new DataView(i.buffer).setUint16(0,s.length,!1),i.set(s,2),i.set(n,2+s.length);let f=new Uint8Array(ke);crypto.getRandomValues(f);let c=X(`${r}
6
- ${o}`),p=Oe(e,f,c).encrypt(i),w=new Uint8Array(ke+p.length);return w.set(f,0),w.set(p,ke),w}function qn(e,t){return ke+2+X(e).length+t+Po}function Gn(e,t){let n=X(e);if(n.length>65535)throw new Error(`bundle name too long: ${n.length} bytes (max 65535)`);let r=new Uint8Array(2+n.length+t.length);return new DataView(r.buffer).setUint16(0,n.length,!1),r.set(n,2),r.set(t,2+n.length),r}function Nt(e){if(e.length<2)throw new Error(`bundle wrapped content truncated: ${e.length} bytes`);let n=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint16(0,!1);if(2+n>e.length)throw new Error(`bundle wrapped nameLen ${n} overflows ${e.length}`);let r=new TextDecoder("utf-8",{fatal:!0}).decode(e.subarray(2,2+n)),o=new Uint8Array(e.subarray(2+n));return{name:r,content:o}}function ot(e,t,n,r){if(t.length<ke+16)throw new Error(`objstore payload too short: ${t.length} bytes`);let o=t.subarray(0,ke),s=t.subarray(ke),i=X(`${n}
7
- ${r}`),a=Oe(e,o,i).decrypt(s);if(a.length<2)throw new Error(`objstore plaintext truncated: ${a.length} bytes`);let c=new DataView(a.buffer,a.byteOffset,a.byteLength).getUint16(0,!1);if(2+c>a.length)throw new Error(`objstore plaintext nameLen ${c} overflows ${a.length}`);let p=new TextDecoder("utf-8",{fatal:!0}).decode(a.subarray(2,2+c)),w=a.subarray(2+c);return{fileName:p,content:new Uint8Array(w)}}var Bo="deepview-objstore.v1.put",Ro="deepview-objstore.v1.delete",jo="deepview-objstore.v1.fetch",Oo="deepview-objstore.v1.fetch-rest",Co="deepview-objstore.v1.put-rest",Uo="deepview-objstore.v1.delete-rest";function st(e){return e==null?"":String(e)}function it(e){return e??""}function Lo(e,t){return X([Bo,e.workspaceTag,e.resourceTag,st(e.prevVersion),it(e.prevIncarnation),e.contentHash,String(e.expectedLength),t].join(`
8
- `))}function No(e,t){return X([Ro,e.workspaceTag,e.resourceTag,st(e.prevVersion),it(e.prevIncarnation),t].join(`
9
- `))}function Ko(e,t,n){return X([jo,e,t,n].join(`
10
- `))}async function Ue(e,t){return new Uint8Array(await crypto.subtle.sign({name:"Ed25519"},e,t)).toBase64({alphabet:"base64url",omitPadding:!0})}function Jn(e,t,n){return Ue(e,Lo(t,n))}function Yn(e,t,n){return Ue(e,No(t,n))}function Xn(e,t,n,r){return Ue(e,Ko(t,n,r))}function Mo(e,t,n){return X([Oo,e,t,String(n)].join(`
11
- `))}function Qn(e,t,n,r){return Ue(e,Mo(t,n,r))}function Io(e,t){return X([Co,e.workspaceTag,e.resourceTag,st(e.prevVersion),it(e.prevIncarnation),e.contentHash,String(e.expectedLength),String(t)].join(`
12
- `))}function Zn(e,t,n){return Ue(e,Io(t,n))}function Fo(e,t){return X([Uo,e.workspaceTag,e.resourceTag,st(e.prevVersion),it(e.prevIncarnation),String(t)].join(`
13
- `))}function er(e,t,n){return Ue(e,Fo(t,n))}async function Kt(e){let t=await crypto.subtle.digest("SHA-256",e);return new Uint8Array(t).toBase64({alphabet:"base64url",omitPadding:!0})}var Te=null,tr=[];function Do(e){if(Te===e)return;if(Te!==null)throw new Error("SyncHost: a different host is already installed");Te=e;let t=tr.splice(0);for(let n of t)try{n(e)}catch(r){console.warn("SyncHost install listener:",r)}}function ce(){if(Te===null)throw new Error("SyncHost: not installed \u2014 call installSyncHost(host) during app boot");return Te}function at(e){if(Te!==null){try{e(Te)}catch(t){console.warn("SyncHost install listener:",t)}return}tr.push(e)}var Mt="deepview.sync.password",It=null;function nr(){return It}function rr(){let e=ce().getSecureItem(Mt);It=typeof e=="string"&&e.length>0?e:null}async function He(e){It=e;let t=ce();e==null?await t.removeSecureItem(Mt):await t.setSecureItem(Mt,e)}function or(e){let t,n;if(e.startsWith("wss://"))t="https://",n=e.slice(6);else if(e.startsWith("ws://"))t="http://",n=e.slice(5);else if(e.startsWith("https://"))t="https://",n=e.slice(8);else if(e.startsWith("http://"))t="http://",n=e.slice(7);else throw new Error(`sse-transport: unsupported URL scheme: ${e}`);let r=n.indexOf("?");return r>=0&&(n=n.slice(0,r)),`${t}${n}`}function $o(e){return`${or(e)}/sse`}function sr(e){return`${or(e)}/save`}var Ho=100,_o=5e3,Ft=class{buf="";parse(t){this.buf+=t;let n=[],r;for(;(r=this.buf.indexOf(`
1
+ import{i as e,n as t,o as n,q as r,r as i,s as a,t as o,u as s,v as c,w as l}from"./chunk-7BKKYVWR.js";import{a as u,b as d,d as f,e as p,f as m,g as h,h as g,i as _}from"./chunk-7C7DWL7I.js";import{a as v,b as y}from"./chunk-PNHBZGDD.js";import{a as b,c as x}from"./chunk-TUII34K2.js";import"./chunk-OOJM4CTU.js";function S(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name===`Uint8Array`&&`BYTES_PER_ELEMENT`in e&&e.BYTES_PER_ELEMENT===1}var C=e=>e?`"${e}" `:``;function w(e,t=``){if(typeof e!=`boolean`)throw TypeError(C(t)+`expected boolean, got type=`+typeof e);return e}function T(e,t=``){if(typeof e!=`number`)throw TypeError(C(t)+`expected number, got `+typeof e);if(!Number.isSafeInteger(e)||e<0)throw RangeError(C(t)+`expected integer >= 0, got `+e);return e}function E(e,t,n=``){if(S(e)&&(t===void 0||e.length===t))return e;t!==void 0&&T(t,`length`);let r=S(e),i=t===void 0?``:` of length ${t}`,a=r?`length=${e.length}`:`type=${typeof e}`,o=C(n)+`expected Uint8Array`+i+`, got `+a;throw r?RangeError(o):TypeError(o)}var D=(e,t)=>{if(typeof e!=`object`||!e||Array.isArray(e))throw TypeError(t===`object`?`expected valid options object`:`"${t}" expected object, got type=${typeof e}`)};function O(e,t=!0){if(e.destroyed)throw Error(`hash was destroyed`);if(t&&e.finished)throw Error(`digest() was already called`)}function k(e,t){E(e,void 0,`output`);let n=t.outputLen;if(!(e.length>=n))throw RangeError(`"output" expected length >= `+n)}function A(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function j(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}function M(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}var N=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;function P(e){return e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255}function F(e){for(let t=0;t<e.length;t++)e[t]=P(e[t]);return e}var I=N?e=>e:F;function L(e,t){return!e.byteLength||!t.byteLength?!1:e.buffer===t.buffer&&e.byteOffset<t.byteOffset+t.byteLength&&t.byteOffset<e.byteOffset+e.byteLength}function R(e,t){if(L(e,t)&&e.byteOffset<t.byteOffset)throw Error(`complex overlap of input and output is not supported`)}function z(e,t){return D(e,`defaults`),D(t,`opts`),Object.assign(e,t)}function ee(e,t){if(e=E(e),t=E(t),e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return n===0}function te(e,t,n){let r=t,i=n||(()=>[]),a=(e,t)=>r(t,...i(e)).update(e).digest(),o=r(new Uint8Array(e),...i(new Uint8Array));return a.outputLen=o.outputLen,a.blockLen=o.blockLen,a.create=(e,...t)=>r(e,...t),a}var ne=(e,t)=>{function n(n,...r){if(E(n,void 0,`key`),e.nonceLength!==void 0){let t=r[0];E(t,e.varSizeNonce?void 0:e.nonceLength,`nonce`)}let i=e.tagLength,a=e.nonceLength===void 0?0:1;if(!e.withAAD){for(let e=a;e<r.length;e++)if(S(r[e]))throw Error(`AAD not supported`)}e.withAAD&&r[a]!==void 0&&E(r[a],void 0,`AAD`);let o=t(n,...r),s=(e,t)=>{if(t!==void 0){if(e!==2)throw Error(`cipher output not supported`);E(t,void 0,`output`)}},c=!1;return{encrypt(e,t){if(c)throw Error(`cannot encrypt() twice with same key + nonce`);return c=!0,E(e,void 0,`data`),s(o.encrypt.length,t),o.encrypt(e,t)},decrypt(e,t){if(E(e,void 0,`data`),i&&e.length<i)throw Error(`"ciphertext" expected length >= tagLength=`+i);return s(o.decrypt.length,t),o.decrypt(e,t)}}}return Object.assign(n,e),n};function B(e,t,n=!0){if(t===void 0)return new Uint8Array(e);if(E(t,e,`output`),n&&!ie(t))throw Error(`invalid output, must be aligned`);return t}function re(e,t,n){T(e),T(t),w(n);let r=new Uint8Array(16),i=M(r);return i.setBigUint64(0,BigInt(t),n),i.setBigUint64(8,BigInt(e),n),r}function ie(e){return e.byteOffset%4==0}function ae(e){return Uint8Array.from(E(e))}var oe=e=>Uint8Array.from(e.split(``),e=>e.charCodeAt(0)),se=I(A(oe(`expand 16-byte k`))),ce=I(A(oe(`expand 32-byte k`)));function V(e,t){return e<<t|e>>>32-t}var le=64,ue=16,de=2**32-1,fe=Uint32Array.of();function pe(e,t,n,r,i,a,o,s){let c=i.length,l=new Uint8Array(le),u=A(l),d=N&&ie(i)&&ie(a),f=d?A(i):fe,p=d?A(a):fe;if(!N){for(let d=0;d<c;o++){if(e(t,n,r,u,o,s),I(u),o>=de)throw Error(`arx: counter overflow`);let f=Math.min(le,c-d);for(let e=0,t;e<f;e++)t=d+e,a[t]=i[t]^l[e];d+=f}return}for(let m=0;m<c;o++){if(e(t,n,r,u,o,s),o>=de)throw Error(`arx: counter overflow`);let h=Math.min(le,c-m);if(d&&h===le){let e=m/4;if(m%4!=0)throw Error(`arx: invalid block position`);for(let t=0,n;t<ue;t++)n=e+t,p[n]=f[n]^u[t];m+=le;continue}for(let e=0,t;e<h;e++)t=m+e,a[t]=i[t]^l[e];m+=h}}function me(e,t){let{allowShortKeys:n,extendNonceFn:r,counterLength:i,counterRight:a,rounds:o}=z({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},t);if(typeof e!=`function`)throw Error(`core must be a function`);return T(i),T(o),w(a),w(n),(t,s,c,l,u=0)=>{E(t,void 0,`key`),E(s,void 0,`nonce`),E(c,void 0,`data`);let d=c.length,f=l!==void 0;if(l=B(d,l,!1),f&&R(c,l),T(u),u<0||u>=de)throw Error(`arx: counter overflow`);let p=[],m=t.length,h,g;if(m===32)p.push(h=ae(t)),g=ce;else if(m===16&&n)h=new Uint8Array(32),h.set(t),h.set(t,16),g=se,p.push(h);else throw E(t,32,`arx key`),Error(`invalid key size`);(!N||!ie(s))&&p.push(s=ae(s));let _=A(h);if(r){if(s.length!==24)throw Error(`arx: extended nonce must be 24 bytes`);let e=s.subarray(0,16);if(N)r(g,_,A(e),_);else{let t=I(Uint32Array.from(g));r(t,_,A(e),_),j(t),I(_)}s=s.subarray(16)}else N||I(_);let v=16-i;if(v!==s.length)throw Error(`arx: nonce must be ${v} or 16 bytes`);if(v!==12){let e=new Uint8Array(12);e.set(s,a?0:12-s.length),s=e,p.push(s)}let y=I(A(s));try{return pe(e,g,_,y,c,l,u,o),l}finally{j(...p)}}}function H(e,t){return e[t++]&255|(e[t++]&255)<<8}var he=class{blockLen=16;outputLen=16;buffer=new Uint8Array(16);r=new Uint16Array(10);h=new Uint16Array(10);pad=new Uint16Array(8);pos=0;finished=!1;destroyed=!1;constructor(e){e=ae(E(e,32,`key`));let t=H(e,0),n=H(e,2),r=H(e,4),i=H(e,6),a=H(e,8),o=H(e,10),s=H(e,12),c=H(e,14);this.r[0]=t&8191,this.r[1]=(t>>>13|n<<3)&8191,this.r[2]=(n>>>10|r<<6)&7939,this.r[3]=(r>>>7|i<<9)&8191,this.r[4]=(i>>>4|a<<12)&255,this.r[5]=a>>>1&8190,this.r[6]=(a>>>14|o<<2)&8191,this.r[7]=(o>>>11|s<<5)&8065,this.r[8]=(s>>>8|c<<8)&8191,this.r[9]=c>>>5&127;for(let t=0;t<8;t++)this.pad[t]=H(e,16+2*t)}process(e,t,n=!1){let r=n?0:2048,{h:i,r:a}=this,o=a[0],s=a[1],c=a[2],l=a[3],u=a[4],d=a[5],f=a[6],p=a[7],m=a[8],h=a[9],g=H(e,t+0),_=H(e,t+2),v=H(e,t+4),y=H(e,t+6),b=H(e,t+8),x=H(e,t+10),S=H(e,t+12),C=H(e,t+14),w=i[0]+(g&8191),T=i[1]+((g>>>13|_<<3)&8191),E=i[2]+((_>>>10|v<<6)&8191),D=i[3]+((v>>>7|y<<9)&8191),O=i[4]+((y>>>4|b<<12)&8191),k=i[5]+(b>>>1&8191),A=i[6]+((b>>>14|x<<2)&8191),j=i[7]+((x>>>11|S<<5)&8191),M=i[8]+((S>>>8|C<<8)&8191),N=i[9]+(C>>>5|r),P=0,F=P+w*o+5*h*T+5*m*E+5*p*D+5*f*O;P=F>>>13,F&=8191,F+=5*d*k+5*u*A+5*l*j+5*c*M+5*s*N,P+=F>>>13,F&=8191;let I=P+w*s+T*o+5*h*E+5*m*D+5*p*O;P=I>>>13,I&=8191,I+=5*f*k+5*d*A+5*u*j+5*l*M+5*c*N,P+=I>>>13,I&=8191;let L=P+w*c+T*s+E*o+5*h*D+5*m*O;P=L>>>13,L&=8191,L+=5*p*k+5*f*A+5*d*j+5*u*M+5*l*N,P+=L>>>13,L&=8191;let R=P+w*l+T*c+E*s+D*o+5*h*O;P=R>>>13,R&=8191,R+=5*m*k+5*p*A+5*f*j+5*d*M+5*u*N,P+=R>>>13,R&=8191;let z=P+w*u+T*l+E*c+D*s+O*o;P=z>>>13,z&=8191,z+=5*h*k+5*m*A+5*p*j+5*f*M+5*d*N,P+=z>>>13,z&=8191;let ee=P+w*d+T*u+E*l+D*c+O*s;P=ee>>>13,ee&=8191,ee+=k*o+5*h*A+5*m*j+5*p*M+5*f*N,P+=ee>>>13,ee&=8191;let te=P+w*f+T*d+E*u+D*l+O*c;P=te>>>13,te&=8191,te+=k*s+A*o+5*h*j+5*m*M+5*p*N,P+=te>>>13,te&=8191;let ne=P+w*p+T*f+E*d+D*u+O*l;P=ne>>>13,ne&=8191,ne+=k*c+A*s+j*o+5*h*M+5*m*N,P+=ne>>>13,ne&=8191;let B=P+w*m+T*p+E*f+D*d+O*u;P=B>>>13,B&=8191,B+=k*l+A*c+j*s+M*o+5*h*N,P+=B>>>13,B&=8191;let re=P+w*h+T*m+E*p+D*f+O*d;P=re>>>13,re&=8191,re+=k*u+A*l+j*c+M*s+N*o,P+=re>>>13,re&=8191,P=(P<<2)+P|0,P=P+F|0,F=P&8191,P>>>=13,I+=P,i[0]=F,i[1]=I,i[2]=L,i[3]=R,i[4]=z,i[5]=ee,i[6]=te,i[7]=ne,i[8]=B,i[9]=re}finalize(){let{h:e,pad:t}=this,n=new Uint16Array(10),r=e[1]>>>13;e[1]&=8191;for(let t=2;t<10;t++)e[t]+=r,r=e[t]>>>13,e[t]&=8191;e[0]+=r*5,r=e[0]>>>13,e[0]&=8191,e[1]+=r,r=e[1]>>>13,e[1]&=8191,e[2]+=r,n[0]=e[0]+5,r=n[0]>>>13,n[0]&=8191;for(let t=1;t<10;t++)n[t]=e[t]+r,r=n[t]>>>13,n[t]&=8191;n[9]-=8192;let i=(r^1)-1;for(let e=0;e<10;e++)n[e]&=i;i=~i;for(let t=0;t<10;t++)e[t]=e[t]&i|n[t];e[0]=(e[0]|e[1]<<13)&65535,e[1]=(e[1]>>>3|e[2]<<10)&65535,e[2]=(e[2]>>>6|e[3]<<7)&65535,e[3]=(e[3]>>>9|e[4]<<4)&65535,e[4]=(e[4]>>>12|e[5]<<1|e[6]<<14)&65535,e[5]=(e[6]>>>2|e[7]<<11)&65535,e[6]=(e[7]>>>5|e[8]<<8)&65535,e[7]=(e[8]>>>8|e[9]<<5)&65535;let a=e[0]+t[0];e[0]=a&65535;for(let n=1;n<8;n++)a=(e[n]+t[n]|0)+(a>>>16)|0,e[n]=a&65535;j(n)}update(e){O(this),E(e),e=ae(e);let{buffer:t,blockLen:n}=this,r=e.length;for(let i=0;i<r;){let a=Math.min(n-this.pos,r-i);if(a===n){for(;n<=r-i;i+=n)this.process(e,i);continue}t.set(e.subarray(i,i+a),this.pos),this.pos+=a,i+=a,this.pos===n&&(this.process(t,0,!1),this.pos=0)}return this}destroy(){this.destroyed=!0,j(this.h,this.r,this.buffer,this.pad)}digestInto(e){O(this),k(e,this),this.finished=!0;let{buffer:t,h:n}=this,{pos:r}=this;if(r){for(t[r++]=1;r<16;r++)t[r]=0;this.process(t,0,!0)}this.finalize();let i=0;for(let t=0;t<8;t++)e[i++]=n[t]>>>0,e[i++]=n[t]>>>8}digest(){let{buffer:e,outputLen:t}=this;this.digestInto(e);let n=e.slice(0,t);return this.destroy(),n}},ge=te(32,e=>new he(e));function _e(e,t,n,r,i,a=20){let o=e[0],s=e[1],c=e[2],l=e[3],u=t[0],d=t[1],f=t[2],p=t[3],m=t[4],h=t[5],g=t[6],_=t[7],v=i,y=n[0],b=n[1],x=n[2],S=o,C=s,w=c,T=l,E=u,D=d,O=f,k=p,A=m,j=h,M=g,N=_,P=v,F=y,I=b,L=x;for(let e=0;e<a;e+=2)S=S+E|0,P=V(P^S,16),A=A+P|0,E=V(E^A,12),S=S+E|0,P=V(P^S,8),A=A+P|0,E=V(E^A,7),C=C+D|0,F=V(F^C,16),j=j+F|0,D=V(D^j,12),C=C+D|0,F=V(F^C,8),j=j+F|0,D=V(D^j,7),w=w+O|0,I=V(I^w,16),M=M+I|0,O=V(O^M,12),w=w+O|0,I=V(I^w,8),M=M+I|0,O=V(O^M,7),T=T+k|0,L=V(L^T,16),N=N+L|0,k=V(k^N,12),T=T+k|0,L=V(L^T,8),N=N+L|0,k=V(k^N,7),S=S+D|0,L=V(L^S,16),M=M+L|0,D=V(D^M,12),S=S+D|0,L=V(L^S,8),M=M+L|0,D=V(D^M,7),C=C+O|0,P=V(P^C,16),N=N+P|0,O=V(O^N,12),C=C+O|0,P=V(P^C,8),N=N+P|0,O=V(O^N,7),w=w+k|0,F=V(F^w,16),A=A+F|0,k=V(k^A,12),w=w+k|0,F=V(F^w,8),A=A+F|0,k=V(k^A,7),T=T+E|0,I=V(I^T,16),j=j+I|0,E=V(E^j,12),T=T+E|0,I=V(I^T,8),j=j+I|0,E=V(E^j,7);let R=0;r[R++]=o+S|0,r[R++]=s+C|0,r[R++]=c+w|0,r[R++]=l+T|0,r[R++]=u+E|0,r[R++]=d+D|0,r[R++]=f+O|0,r[R++]=p+k|0,r[R++]=m+A|0,r[R++]=h+j|0,r[R++]=g+M|0,r[R++]=_+N|0,r[R++]=v+P|0,r[R++]=y+F|0,r[R++]=b+I|0,r[R++]=x+L|0}var ve=me(_e,{counterRight:!1,counterLength:4,allowShortKeys:!1}),ye=new Uint8Array(16),be=(e,t)=>{e.update(t);let n=t.length%16;n&&e.update(ye.subarray(n))},xe=new Uint8Array(32);function Se(e,t,n,r,i){i!==void 0&&E(i,void 0,`AAD`);let a=e(t,n,xe),o=re(r.length,i?i.length:0,!0),s=ge.create(a);i&&be(s,i),be(s,r),s.update(o);let c=s.digest();return j(a,o),c}var Ce=ne({blockSize:64,nonceLength:12,tagLength:16,withAAD:!0},(e=>(t,n,r)=>({encrypt(i,a){let o=i.length;a=B(o+16,a,!1),a.set(i);let s=a.subarray(0,-16);e(t,n,s,s,1);let c=Se(e,t,n,s,r);return a.set(c,o),j(c),a},decrypt(i,a){a=B(i.length-16,a,!1);let o=i.subarray(0,-16),s=i.subarray(-16),c=Se(e,t,n,o,r);if(!ee(s,c))throw j(c),Error(`invalid tag`);return a.set(i.subarray(0,-16)),e(t,n,a,a,1),j(c),a}}))(ve)),we=`deepview-triage-sync.v1.content-key`,Te=`deepview-triage-sync.v1.sign-key`,Ee=`deepview-triage-sync.v1.save`,De=`deepview-triage-sync.v1.subscribe`,Oe=12,ke=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,112,4,34,4,32]),Ae=null;function je(){return Ae||(Ae=(async()=>{try{return await crypto.subtle.importKey(`raw`,new Uint8Array(32),{name:`ChaCha20-Poly1305`},!1,[`encrypt`,`decrypt`]),!0}catch{return!1}})(),Ae)}async function Me(e,t){let n=Uint8Array.fromBase64(e);if(n.length!==32)throw Error(`workspace private key must be 32 bytes (got ${n.length})`);let r=await crypto.subtle.importKey(`raw`,n,`HKDF`,!1,[`deriveBits`]),i=await crypto.subtle.deriveBits({name:`HKDF`,hash:`SHA-256`,salt:new Uint8Array,info:b(t)},r,256);return new Uint8Array(i)}async function Ne(e){return await Me(e,we)}async function Pe(e,t){let n=await Me(e,`${Te}|${t}`),r=new Uint8Array(ke.length+32);r.set(ke,0),r.set(n,ke.length);let i=await crypto.subtle.importKey(`pkcs8`,r,{name:`Ed25519`},!0,[`sign`]),a=await crypto.subtle.exportKey(`jwk`,i),o=a.x;if(delete a.d,o==null)throw Error(`Ed25519 JWK export returned no public key`);let s=Uint8Array.fromBase64(o,{alphabet:`base64url`}),c=await crypto.subtle.importKey(`pkcs8`,r,{name:`Ed25519`},!1,[`sign`]);return n.fill(0),r.fill(0),{privateKey:c,publicKey:s,publicKeyB64:o}}function Fe({publicKeyB64:e,base:t,keyframe:n,nonceB64:r,ciphertextB64:i}){return b([Ee,e,t==null?``:String(t),n===!0?`1`:``,r,i].join(`
2
+ `))}async function Ie(e,t){let n=await crypto.subtle.sign({name:`Ed25519`},e,t);return new Uint8Array(n).toBase64({alphabet:`base64url`,omitPadding:!0})}async function Le(e,t){return await Ie(e,Fe(t))}async function Re(e){let t=Fe(e),n=await crypto.subtle.digest(`SHA-256`,t);return new Uint8Array(n).toBase64({alphabet:`base64url`,omitPadding:!0})}function ze(e,t,n){return b([De,e,t==null?``:String(t),n].join(`
3
+ `))}async function Be(e,t,n,r){return await Ie(e,ze(t,n,r))}async function Ve(e,t,n){try{let r=await crypto.subtle.importKey(`raw`,e,{name:`Ed25519`},!1,[`verify`]),i=Uint8Array.fromBase64(n,{alphabet:`base64url`}),a=Fe(t);return await crypto.subtle.verify({name:`Ed25519`},r,i,a)}catch{return!1}}function He(){let e=new Uint8Array(Oe);return crypto.getRandomValues(e),e}function Ue(e,t){return b(`${e}|${t==null?``:String(t)}`)}async function We(e,t,n){let r=He();if(await je()){let i=await crypto.subtle.importKey(`raw`,e,{name:`ChaCha20-Poly1305`},!1,[`encrypt`]);return{nonce:r,ciphertext:new Uint8Array(await crypto.subtle.encrypt({name:`ChaCha20-Poly1305`,iv:r,additionalData:n},i,t))}}return{nonce:r,ciphertext:Ce(e,r,n).encrypt(t)}}async function Ge(e,t,n,r){if(await je()){let i=await crypto.subtle.importKey(`raw`,e,{name:`ChaCha20-Poly1305`},!1,[`decrypt`]);return new Uint8Array(await crypto.subtle.decrypt({name:`ChaCha20-Poly1305`,iv:t,additionalData:r},i,n))}return Ce(e,t,r).decrypt(n)}var Ke=64;function qe(e,t){return e<=t?t:2**(32-Math.clz32(e-1))}async function Je(e){let t=b(JSON.stringify(e)),n=await v(t);if(n.length>1073741820)throw Error(`payload too large`);let r=qe(4+n.length,Ke),i=new Uint8Array(r);return new DataView(i.buffer,i.byteOffset,i.byteLength).setUint32(0,n.length,!1),i.set(n,4),i}var Ye=67108864;async function Xe(e){if(e.length<4)throw Error(`plaintext too short`);let t=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint32(0,!1);if(t+4>e.length)throw Error(`length prefix exceeds buffer`);let n=e.subarray(4,4+t),r=await y(n,{maxBytes:Ye});return JSON.parse(x(r))}async function Ze(e,t,n){let{nonce:r,ciphertext:i}=await We(e,await Je(t),n);return{nonce:r.toBase64(),ciphertext:i.toBase64()}}async function Qe(e,t,n,r){return Xe(await Ge(e,Uint8Array.fromBase64(t),Uint8Array.fromBase64(n),r))}var $e=`deepview-objstore.v1.content`,et=`deepview-objstore.v1.tag`,tt=`objstore-tag
4
+ `,nt=`objstore-bundle-tag
5
+ `,rt=12,it=16;async function at(e,t){let n=Uint8Array.fromBase64(e);if(n.length!==32)throw Error(`workspace private key must be 32 bytes (got ${n.length})`);let r=await ot(n,$e,32),i=await ot(n,et,32);n.fill(0);let{privateKey:a,publicKeyB64:o}=await Pe(e,t);return{signingKey:a,contentKey:r,tagKey:i,workspaceTag:o}}async function ot(e,t,n){let r=await crypto.subtle.importKey(`raw`,e,`HKDF`,!1,[`deriveBits`]),i=await crypto.subtle.deriveBits({name:`HKDF`,hash:`SHA-256`,salt:new Uint8Array,info:b(t)},r,n*8);return new Uint8Array(i)}async function U(e,t){let n=await crypto.subtle.importKey(`raw`,e,{name:`HMAC`,hash:`SHA-256`},!1,[`sign`]);return new Uint8Array(await crypto.subtle.sign(`HMAC`,n,b(tt+t))).toBase64({alphabet:`base64url`,omitPadding:!0})}async function st(e,t){let n=await crypto.subtle.importKey(`raw`,e,{name:`HMAC`,hash:`SHA-256`},!1,[`sign`]);return new Uint8Array(await crypto.subtle.sign(`HMAC`,n,b(nt+t))).toBase64({alphabet:`base64url`,omitPadding:!0})}function ct(e,t,n,r,i){let a=b(t);if(a.length>65535)throw Error(`fileName too long: ${a.length} bytes (max 65535)`);let o=new Uint8Array(2+a.length+n.length);new DataView(o.buffer).setUint16(0,a.length,!1),o.set(a,2),o.set(n,2+a.length);let s=new Uint8Array(rt);crypto.getRandomValues(s);let c=Ce(e,s,b(`${r}
6
+ ${i}`)).encrypt(o),l=new Uint8Array(rt+c.length);return l.set(s,0),l.set(c,rt),l}function lt(e,t){return rt+2+b(e).length+t+it}function ut(e,t){let n=b(e);if(n.length>65535)throw Error(`bundle name too long: ${n.length} bytes (max 65535)`);let r=new Uint8Array(2+n.length+t.length);return new DataView(r.buffer).setUint16(0,n.length,!1),r.set(n,2),r.set(t,2+n.length),r}function dt(e){if(e.length<2)throw Error(`bundle wrapped content truncated: ${e.length} bytes`);let t=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint16(0,!1);if(2+t>e.length)throw Error(`bundle wrapped nameLen ${t} overflows ${e.length}`);return{name:new TextDecoder(`utf-8`,{fatal:!0}).decode(e.subarray(2,2+t)),content:new Uint8Array(e.subarray(2+t))}}function ft(e,t,n,r){if(t.length<rt+16)throw Error(`objstore payload too short: ${t.length} bytes`);let i=t.subarray(0,rt),a=t.subarray(rt),o=Ce(e,i,b(`${n}
7
+ ${r}`)).decrypt(a);if(o.length<2)throw Error(`objstore plaintext truncated: ${o.length} bytes`);let s=new DataView(o.buffer,o.byteOffset,o.byteLength).getUint16(0,!1);if(2+s>o.length)throw Error(`objstore plaintext nameLen ${s} overflows ${o.length}`);let c=new TextDecoder(`utf-8`,{fatal:!0}).decode(o.subarray(2,2+s)),l=o.subarray(2+s);return{fileName:c,content:new Uint8Array(l)}}var pt=null,mt=[];function ht(e){if(pt===e)return;if(pt!==null)throw Error(`SyncHost: a different host is already installed`);pt=e;let t=mt.splice(0);for(let n of t)try{n(e)}catch(e){console.warn(`SyncHost install listener:`,e)}}function gt(){if(pt===null)throw Error(`SyncHost: not installed — call installSyncHost(host) during app boot`);return pt}function _t(e){if(pt!==null){try{e(pt)}catch(e){console.warn(`SyncHost install listener:`,e)}return}mt.push(e)}var vt=`deepview.sync.password`,yt=null;function bt(){return yt}function xt(){let e=gt().getSecureItem(vt);yt=typeof e==`string`&&e.length>0?e:null}async function St(e){yt=e;let t=gt();e==null?await t.removeSecureItem(vt):await t.setSecureItem(vt,e)}function Ct(e){let t,n;if(e.startsWith(`wss://`))t=`https://`,n=e.slice(6);else if(e.startsWith(`ws://`))t=`http://`,n=e.slice(5);else if(e.startsWith(`https://`))t=`https://`,n=e.slice(8);else if(e.startsWith(`http://`))t=`http://`,n=e.slice(7);else throw Error(`sse-transport: unsupported URL scheme: ${e}`);let r=n.indexOf(`?`);return r>=0&&(n=n.slice(0,r)),`${t}${n}`}function wt(e){return`${Ct(e)}/sse`}function Tt(e){return`${Ct(e)}/save`}var Et=100,Dt=5e3,Ot=75e3,kt=class{buf=``;parse(e){this.buf+=e;let t=[],n;for(;(n=this.buf.indexOf(`
14
8
 
15
- `))>=0;){let o=this.buf.slice(0,r);this.buf=this.buf.slice(r+2);let s="",i=[];for(let a of o.split(`
16
- `))if(!a.startsWith(":")){if(a.startsWith("event:")){s=a.slice(6).trim();continue}if(a.startsWith("data:")){i.push(a.slice(5).replace(/^ /u,""));continue}}i.length!==0&&n.push({event:s,data:i.join(`
17
- `)})}return n}},ct=class e extends EventTarget{static CONNECTING=0;static OPEN=1;static CLOSING=2;static CLOSED=3;CONNECTING=e.CONNECTING;OPEN=e.OPEN;CLOSING=e.CLOSING;CLOSED=e.CLOSED;readyState=e.CONNECTING;baseUrl;sessionId=null;cachedPassword=null;outbound=[];flushTimer=null;inFlightPost=null;activeReaders=new Set;fetchAbort=new AbortController;constructor(t){super(),this.baseUrl=$o(t),this.scheduleFlush(!0)}send(t){if(this.readyState===e.CLOSED)throw new Error("sse-transport: send on closed transport");let n;try{n=JSON.parse(t)}catch(r){throw new Error(`sse-transport: send received non-JSON payload: ${r.message}`,{cause:r})}if(n.type==="authenticate"&&typeof n.password=="string"){this.cachedPassword=n.password,this.scheduleFlush();return}this.outbound.push(n),this.scheduleFlush()}close(){this.shutdown()}scheduleFlush(t=!1){if(this.readyState===e.CLOSED)return;if(this.flushTimer!=null)if(t)clearTimeout(this.flushTimer),this.flushTimer=null;else return;let n=t?0:Ho;this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush()},n)}async flush(){if(this.readyState===e.CLOSED)return;if(this.inFlightPost){let s=new Promise(i=>{setTimeout(i,_o)});await Promise.race([this.inFlightPost.catch(()=>{}),s])}if(this.readyState===e.CLOSED)return;let t=this.outbound;this.outbound=[];let n={};this.cachedPassword!=null&&(n.password=this.cachedPassword),t.length>0&&(n.frames=t);let r=this.sessionId==null?this.baseUrl:`${this.baseUrl}?id=${encodeURIComponent(this.sessionId)}`,o=(async()=>{let s;try{s=await fetch(r,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(n),credentials:"same-origin",signal:this.fetchAbort.signal})}catch(a){this.readyState!==e.CLOSED&&console.warn("sse-transport: POST failed:",a),this.shutdown();return}if(!s.ok){this.readyState!==e.CLOSED&&console.warn(`sse-transport: POST ${s.status} ${s.statusText}; closing`),this.shutdown();return}let i=s.body;if(!i){this.shutdown();return}this.consumeStream(i)})();this.inFlightPost=o,o.finally(()=>{this.inFlightPost===o&&(this.inFlightPost=null)})}async consumeStream(t){let n=t.getReader();this.activeReaders.add(n);let r=new Ft,o=new TextDecoder;try{for(;;){let{value:s,done:i}=await n.read();if(i)break;if(this.readyState===e.CLOSED)return;let a=r.parse(o.decode(s,{stream:!0}));for(let f of a)this.dispatchEvent_(f)}if(this.readyState!==e.CLOSED){let s=o.decode();if(s.length>0)for(let i of r.parse(s))this.dispatchEvent_(i)}}catch(s){this.readyState!==e.CLOSED&&(console.warn("sse-transport: stream read failed:",s),this.shutdown())}finally{this.activeReaders.delete(n);try{n.releaseLock()}catch{}}}dispatchEvent_(t){if(t.event==="session"){if(this.readyState===e.CLOSED)return;this.sessionId=t.data,this.readyState===e.CONNECTING&&(this.readyState=e.OPEN,this.dispatchEvent(new Event("open")));return}if(t.event==="close"){let n,r;try{let o=JSON.parse(t.data);typeof o.code=="number"&&(n=o.code),typeof o.reason=="string"&&(r=o.reason)}catch{}this.shutdown(n,r);return}if(t.event===""||t.event==="message"){if(this.readyState!==e.OPEN)return;this.dispatchEvent(new MessageEvent("message",{data:t.data}))}}shutdown(t,n){if(this.readyState===e.CLOSED)return;this.readyState=e.CLOSING,this.flushTimer!=null&&(clearTimeout(this.flushTimer),this.flushTimer=null);try{this.fetchAbort.abort()}catch{}for(let o of this.activeReaders)try{o.cancel().catch(()=>{})}catch{}this.activeReaders.clear(),this.readyState=e.CLOSED;let r=new Event("close");t!=null&&(r.code=t),n!=null&&(r.reason=n),this.dispatchEvent(r)}};var lt=1e3,Wo=3e4,Dt="session restarted";function ut(e){let t=e.serverUrl,n=e.pingIntervalMs??15e3,r=e.pongTimeoutMs??5e3,o=null,s=!1,i=null,a=0,f=!1,c=null,p=lt,w=null,x=null,A=null,y=!1,T=null,E=new Set;function j(){c&&(clearTimeout(c),c=null)}function V(){j(),!f&&a!==0&&t&&(c=setTimeout(()=>{c=null,N()},p),p=Math.min(p*2,Wo))}function ie(){ne(),!(n<=0)&&(s||(w=setInterval(()=>{!o||o.readyState!==o.OPEN||x||(K({type:"ping"}),x=setTimeout(()=>{x=null,console.warn("socket-transport: heartbeat timeout; closing socket");try{o?.close()}catch{}},r))},n)))}function ne(){w&&(clearInterval(w),w=null),x&&(clearTimeout(x),x=null)}function oe(b){for(let v of E)try{v.onDisconnected(b)}catch(_){console.warn("socket-transport: consumer.onDisconnected threw:",_)}}function Z(b){for(let v of E)try{v.onConnected(b)}catch(_){console.warn("socket-transport: consumer.onConnected threw:",_)}}function Y(b){for(let v of E)try{v.onMessage(b)}catch(_){console.warn("socket-transport: consumer.onMessage threw:",_)}}function Q(b){let v;try{let _=typeof b.data=="string"?b.data:new TextDecoder().decode(b.data);v=JSON.parse(_)}catch(_){console.warn("socket-transport: dropping malformed wire frame:",_);return}if(!(!v||typeof v!="object")){if(v.type==="pong"){x&&(clearTimeout(x),x=null);return}if(v.type==="challenge"){if(typeof v.nonce!="string")return;i!=null&&i!==v.nonce&&oe(Dt),i=v.nonce,Z(i);return}if(v.type==="authenticated"){U(!0),Y(v);return}if(v.type==="unauthorized"&&v.kind==="auth-failed"){U(!1);return}Y(v)}}function U(b){if(!T)return;let v=T;T=null,v(b)}function K(b){if(!o||o.readyState!==o.OPEN)return!1;try{return o.send(JSON.stringify(b)),!0}catch(v){return console.warn("socket-transport: send failed:",v),!1}}function L(b){return new Promise(v=>{T=v,K({type:"authenticate",password:b})||(T=null,v(!1))})}function $(){if(A)return A;if(!o||o.readyState!==o.OPEN)return Promise.resolve(!1);let b=o,v=(async()=>{await Promise.resolve();try{let _=nr();if(_!=null&&!y){y=!0;let g=await L(_);if(o!==b)return!1;if(g)return!0;try{await He(null)}catch(d){console.warn("socket-transport: failed to clear cached auth password:",d)}}let l=!0;for(;;){if(o!==b||!o||o.readyState!==o.OPEN||!e.authResolver)return!1;let g;try{g=await e.authResolver({retry:!l})}catch(m){return console.warn("socket-transport: authentication resolver threw:",m),!1}if(o!==b||(l=!1,g==null||g===""))return!1;let d=await L(g);if(o!==b)return!1;if(d){try{await He(g)}catch(m){console.warn("socket-transport: failed to cache auth password:",m)}return!0}}}finally{A=null}})();return A=v,v}function M(b){if(!o)return;let v=o;o=null,i=null,y=!1,U(!1),ne(),oe(b);try{v.close()}catch{}}function N(){f||o||a!==0&&t&&I(!1)}function I(b){if(f||a===0||!t)return;let v;try{v=b?new ct(t):new WebSocket(t)}catch(l){if(!b){console.warn("socket-transport: WebSocket constructor failed; trying SSE fallback:",l),I(!0);return}console.warn("socket-transport: SSE constructor failed:",l),V();return}o=v,s=b,i=null,y=!1;let _=!1;v.addEventListener("open",()=>{o===v&&(_=!0,p=lt,ie())}),v.addEventListener("message",l=>{o===v&&Q(l)}),v.addEventListener("close",l=>{if(o!==v)return;if(o=null,i=null,y=!1,U(!1),ne(),!_&&!b&&!f&&a>0){if(typeof fetch>"u"){oe("socket closed"),V();return}console.warn("socket-transport: WebSocket failed to open; falling back to SSE"),I(!0);return}l?.code===1001&&(p=lt),oe("socket closed"),!f&&a>0&&V()}),v.addEventListener("error",()=>{})}function F(){if(f)return{release(){}};a+=1,a===1&&!o&&N();let b=!1;return{release(){b||(b=!0,!f&&(a-=1,a===0&&(j(),p=lt,M("released"))))}}}function H(b){b!==t&&(t=b,o&&M("serverUrl changed"),a>0&&t&&N())}function D(b){E.add(b);let v=!1;return{remove(){v||(v=!0,E.delete(b))}}}function k(){f||(f=!0,j(),M("transport closed"),E.clear(),a=0)}function z(b){let{pingMs:v,pongMs:_}=b;typeof v=="number"&&v>=0&&(n=v),typeof _=="number"&&_>0&&(r=_),w&&ie()}function G(){y=!1}return{acquire:F,setServerUrl:H,addConsumer:D,send:K,getNonce:()=>i,getSocket:()=>o,isSse:()=>o!=null&&s,runAuthFlow:$,close:k,setHeartbeatTimings:z,resetCachedReplayGuard:G}}var $t=64,Vo=5,ir=6,zo=25,qo=500;function Go(e,t){if(!/^\/api\/objstore\/[\w-]+\/[\w-]+$/u.test(e))throw new TypeError(`objstore: urlPath rejected (unexpected shape): ${JSON.stringify(e)}`);let n=new URL(t).origin,r=new URL(e,n);if(r.origin!==n)throw new TypeError(`objstore: urlPath origin mismatch \u2014 expected ${n}, got ${r.origin}`);return r.href}function ar(e){let t=e.requestTimeoutMs??1e4,n=new URL(e.httpOrigin).origin,r=e.transport===void 0,o=e.transport??ut(e.authResolver===void 0?{serverUrl:e.serverUrl}:{serverUrl:e.serverUrl,authResolver:e.authResolver}),s=!1,i=new Map,a=new Map,f=[],c=[];function p(l,g,d,m){let u=l.seenVersions.get(g);(!u||u.incarnation!==d||m>u.version)&&l.seenVersions.set(g,{incarnation:d,version:m})}function w(l){l.connectedPromise=new Promise((g,d)=>{l.resolveConnected=g,l.rejectConnected=d}),l.connectedPromise.catch(()=>{})}function x(l){l.listedPromise=new Promise((g,d)=>{l.resolveListed=g,l.rejectListed=d}),l.listedPromise.catch(()=>{})}function A(l,g){l.inventory.clear();for(let d of g)l.inventory.set(d.resourceTag,{version:d.version,incarnation:d.incarnation,contentLength:d.contentLength}),p(l,d.resourceTag,d.incarnation,d.version);l.resolveListed()}function y(l){if(!Array.isArray(l))return[];let g=[];for(let d of l)Le(d)&&g.push(Ne(d));return g}function T(l){let g;return new Promise((d,m)=>{g=setTimeout(()=>m(new Error(`objstore: inventory not seeded (no subscribe ack) after ${t}ms`)),t),l.listedPromise.then(d,m)}).finally(()=>clearTimeout(g))}function E(l){for(let g=0;g<f.length;g++)if(l(f[g]))return Promise.resolve(f.splice(g,1)[0]);return new Promise((g,d)=>{let m={predicate:l,resolve:()=>{},reject:h=>{clearTimeout(u);let R=c.indexOf(m);R>=0&&c.splice(R,1),d(h)}},u=setTimeout(()=>m.reject(new Error(`objstore: response timeout after ${t}ms`)),t);m.resolve=h=>{clearTimeout(u),g(h)},c.push(m)})}function j(l){if(!o.send(l))throw new Error("objstore: socket not open")}function V(l){for(let g of c.splice(0))try{g.reject(new Error(`objstore: ${l}`))}catch{}}function ie(l){if(l.type==="objstore-put"&&typeof l.workspaceTag=="string"&&Le(l)){let g=i.get(l.workspaceTag);if(!g)return;let d=Ne(l);p(g,d.resourceTag,d.incarnation,d.version),g.inventory.set(d.resourceTag,{version:d.version,incarnation:d.incarnation,contentLength:d.contentLength});let m={resourceTag:d.resourceTag,version:d.version,contentLength:d.contentLength};for(let u of g.putHandlers)try{u(m)}catch{}return}if(l.type==="objstore-deleted"&&typeof l.workspaceTag=="string"&&typeof l.resourceTag=="string"&&typeof l.version=="number"){let g=i.get(l.workspaceTag);if(!g)return;let d=l.resourceTag,m=l.version;g.seenVersions.delete(d),g.inventory.delete(d);let u={resourceTag:d,version:m};for(let h of g.deletedHandlers)try{h(u)}catch{}return}if(!(l.type==="workspace-state"||l.type==="workspace-save-ack"||l.type==="workspace-save-error"||l.type==="workspace-subscribed"||l.type==="authenticated")){for(let g=0;g<c.length;g++)if(c[g].predicate(l)){let d=c[g];c.splice(g,1),d.resolve(l);return}if(f.push(l),f.length>$t){let g=f.splice(0,f.length-$t),d=[...new Set(g.map(m=>m.type??"<no-type>"))].slice(0,4);console.warn(`objstore: dropping ${g.length} unmatched frame(s) over MAX_QUEUE_SIZE=${$t} (types: ${d.join(", ")})`)}}}function ne(){for(let l of i.values())l.closed||l.connected||(l.connected=!0,l.resolveConnected())}function oe(l){V(l);for(let g of i.values())g.closed||g.connected&&(g.connected=!1,w(g))}let Z=o.addConsumer({onMessage:ie,onConnected:ne,onDisconnected:oe}),Y=l=>Go(l,n),Q=(l,g)=>Y(`/api/objstore/${l}/${g}`);async function U(l,g,d){let m=o.getNonce();if(!m)throw new Error("objstore: socket not open");let u=await Jn(l.signingKey,d,m),h,R=!1;for(;j({type:"objstore-put-begin",...d,signature:u}),h=await E(ae=>ae.workspaceTag===l.workspaceTag&&ae.resourceTag===g&&(ae.type==="objstore-put-token"||ae.type==="objstore-put-error"||ae.type==="objstore-conflict"||ae.type==="unauthorized"&&ae.kind==="gated")),!(h.type!=="unauthorized"||R||(R=!0,!await o.runAuthFlow())););if(h.type==="unauthorized")return{kind:"unauthorized"};if(h.type==="objstore-put-error"){if(h.reason==="workspace-full")return{kind:"workspace-full"};throw new Error(`objstore: put-error reason='${String(h.reason)}'`)}if(h.type==="objstore-conflict")return{kind:"conflict",current:Le(h.current)?Ne(h.current):null};if(typeof h.urlPath!="string"||typeof h.token!="string")throw new TypeError("objstore: malformed put-token (missing urlPath/token)");return{kind:"token",urlPath:h.urlPath,token:h.token}}async function K(l,g,d,m){let u=Date.now(),h=await Zn(l.signingKey,d,u),R=await globalThis.fetch(Q(l.workspaceTag,g),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({op:"put",ts:u,signature:h,prevVersion:d.prevVersion,prevIncarnation:d.prevIncarnation,expectedLength:d.expectedLength,contentHash:m})});if(R.status===401)return{kind:"unauthorized"};if(R.status===403)return{kind:"workspace-full"};if(R.status===409)return{kind:"conflict",current:await Ht(R)};if(!R.ok){let ae="";try{ae=await R.text()}catch{}throw new Error(`objstore: REST put-begin failed ${R.status} ${ae.slice(0,200)}`)}let J;try{J=await R.json()}catch{throw new TypeError("objstore: put-mint JSON parse failed")}if(!J||typeof J!="object"||typeof J.urlPath!="string"||typeof J.token!="string")throw new TypeError("objstore: malformed put-mint (missing urlPath/token)");return{kind:"token",urlPath:J.urlPath,token:J.token}}async function L(l,g){let d=`objstore: ${Dt}`;for(let m=0;;m++)try{return await g()}catch(u){if(m<Vo&&!l.closed&&u instanceof Error&&u.message===d)continue;throw u}}function $(l,g){return L(l,()=>M(l,g))}async function M(l,g){if(await l.connectedPromise,l.closed)throw new Error("objstore: session closed");let d=await Kt(g.bytes),m={workspaceTag:l.workspaceTag,resourceTag:g.resourceTag,prevVersion:g.prev?.version??null,prevIncarnation:g.prev?.incarnation??null,expectedLength:g.bytes.byteLength,contentHash:d},u;if(o.isSse()?(u=await K(l,g.resourceTag,m,d),u.kind==="unauthorized"&&(u=await U(l,g.resourceTag,m))):u=await U(l,g.resourceTag,m),u.kind==="unauthorized")return{ok:!1,reason:"unauthorized"};if(u.kind==="workspace-full")return{ok:!1,reason:"workspace-full"};if(u.kind==="conflict")return{ok:!1,reason:"conflict",current:u.current};let h=await globalThis.fetch(Y(u.urlPath),{method:"PUT",headers:{authorization:`Bearer ${u.token}`,"content-type":"application/octet-stream"},body:g.bytes});if(!h.ok){if(h.status===409||h.status===410)return{ok:!1,reason:"conflict",current:h.status===409?await Ht(h):null};let ae="";try{ae=await h.text()}catch{}throw new Error(`objstore: REST PUT failed ${h.status} ${ae.slice(0,200)}`)}let R;try{R=await h.json()}catch{throw new TypeError("objstore: PUT ack JSON parse failed")}if(!R||typeof R!="object"||!_e(R.version)||typeof R.incarnation!="string"||typeof R.contentHash!="string"||!_e(R.contentLength))throw new TypeError("objstore: PUT ack malformed (missing/invalid version/incarnation/contentHash/contentLength)");let J=R;if(J.contentHash!==d||J.contentLength!==g.bytes.byteLength)throw new Error(`objstore: PUT ack mismatch \u2014 server returned contentHash=${J.contentHash.slice(0,16)}\u2026 length=${J.contentLength}, client signed ${d.slice(0,16)}\u2026 length=${g.bytes.byteLength}`);return{ok:!0,meta:J}}async function N(l,g){let d=o.getNonce();if(!d)throw new Error("objstore: socket not open");let m=await Xn(l.signingKey,l.workspaceTag,g,d);j({type:"objstore-fetch",workspaceTag:l.workspaceTag,resourceTag:g,signature:m});let u=await E(h=>h.workspaceTag===l.workspaceTag&&h.resourceTag===g&&(h.type==="objstore-fetch-token"||h.type==="objstore-fetch-not-found"));if(u.type==="objstore-fetch-not-found")return{kind:"not-found"};if(typeof u.urlPath!="string"||typeof u.token!="string"||!Le(u))throw new TypeError("objstore: malformed fetch-token (missing urlPath / token / metadata)");return{kind:"token",urlPath:u.urlPath,token:u.token,meta:Ne(u)}}async function I(l,g){let d=Date.now(),m=await Qn(l.signingKey,l.workspaceTag,g,d),u=await globalThis.fetch(Q(l.workspaceTag,g),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({op:"fetch",ts:d,signature:m})});if(u.status===404)return{kind:"not-found"};if(u.status===401)return{kind:"unauthorized"};if(!u.ok){let R="";try{R=await u.text()}catch{}throw new Error(`objstore: REST fetch-mint failed ${u.status} ${R.slice(0,200)}`)}let h;try{h=await u.json()}catch{throw new TypeError("objstore: fetch-mint JSON parse failed")}if(!h||typeof h!="object"||typeof h.urlPath!="string"||typeof h.token!="string"||!Le(h))throw new TypeError("objstore: malformed fetch-mint (missing urlPath / token / metadata)");return{kind:"token",urlPath:h.urlPath,token:h.token,meta:Ne(h)}}async function F(l,g){for(let d=0;d<ir;d++){let m=await L(l,()=>H(l,g));if(m.kind==="ok")return m.value;if(m.kind==="not-found")return null;if(d+1<ir){let u=Math.min(qo,zo*2**d);await new Promise(h=>{setTimeout(h,u)})}}return null}async function H(l,g){if(await l.connectedPromise,l.closed)throw new Error("objstore: session closed");let d;if(o.isSse()?(d=await I(l,g),d.kind==="unauthorized"&&(d=await N(l,g))):d=await N(l,g),d.kind==="not-found")return{kind:"not-found"};if(d.kind==="unauthorized")throw new Error("objstore: fetch-mint unauthorized");let m=d.meta,u=await globalThis.fetch(Y(d.urlPath),{method:"GET",headers:{authorization:`Bearer ${d.token}`}});if(!u.ok){if(u.status===404||u.status===503)return{kind:"retry"};let J="";try{J=await u.text()}catch{}throw new Error(`objstore: REST GET failed ${u.status} ${J.slice(0,200)}`)}let h=new Uint8Array(await u.arrayBuffer()),R=await Kt(h);if(R!==m.contentHash)throw new Error(`objstore: contentHash mismatch \u2014 expected ${m.contentHash.slice(0,16)}\u2026, got ${R.slice(0,16)}\u2026`);return{kind:"ok",value:{bytes:h,meta:m}}}async function D(l,g){let d=o.getNonce();if(!d)throw new Error("objstore: socket not open");let m=await Yn(l.signingKey,g,d);j({type:"objstore-delete",...g,signature:m});let u=await E(h=>h.workspaceTag===l.workspaceTag&&h.resourceTag===g.resourceTag&&(h.type==="objstore-deleted-ack"||h.type==="objstore-delete-error"||h.type==="objstore-conflict"));if(u.type==="objstore-deleted-ack"){if(typeof u.deletedVersion!="number")throw new TypeError("objstore: malformed deleted-ack (deletedVersion not a number)");return{kind:"ok",deletedVersion:u.deletedVersion}}if(u.type==="objstore-conflict")return{kind:"conflict",current:Le(u.current)?Ne(u.current):null};if(u.reason==="not-found")return{kind:"not-found"};throw new Error(`objstore: delete-error reason='${String(u.reason)}'`)}async function k(l,g,d){let m=Date.now(),u=await er(l.signingKey,d,m),h=await globalThis.fetch(Q(l.workspaceTag,g),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({op:"delete",ts:m,signature:u,prevVersion:d.prevVersion,prevIncarnation:d.prevIncarnation})});if(h.status===401)return{kind:"unauthorized"};if(h.status===404)return{kind:"not-found"};if(h.status===409)return{kind:"conflict",current:await Ht(h)};if(!h.ok){let J="";try{J=await h.text()}catch{}throw new Error(`objstore: REST delete failed ${h.status} ${J.slice(0,200)}`)}let R;try{R=await h.json()}catch{throw new TypeError("objstore: delete-ack JSON parse failed")}if(!R||typeof R!="object"||typeof R.deletedVersion!="number")throw new TypeError("objstore: malformed delete-ack (deletedVersion not a number)");return{kind:"ok",deletedVersion:R.deletedVersion}}function z(l,g,d){return L(l,()=>G(l,g,d))}async function G(l,g,d){if(await l.connectedPromise,l.closed)throw new Error("objstore: session closed");let m={workspaceTag:l.workspaceTag,resourceTag:g,prevVersion:d?.version??null,prevIncarnation:d?.incarnation??null},u;if(o.isSse()?(u=await k(l,g,m),u.kind==="unauthorized"&&(u=await D(l,m))):u=await D(l,m),u.kind==="ok")return{ok:!0,deletedVersion:u.deletedVersion};if(u.kind==="conflict")return{ok:!1,reason:"conflict",current:u.current};if(u.kind==="not-found")return{ok:!1,reason:"not-found"};throw new Error("objstore: delete unauthorized")}function b(l,g,d,m){let u=l.seenVersions.get(g);if(u&&u.incarnation===d&&m<u.version)throw new Error(`objstore: version-rollback rejected \u2014 fetched v${m} for an incarnation we've already seen at v${u.version}`)}async function v(l,g){if(s)throw new Error("objstore: client closed");if(!g||typeof g.workspaceId!="string")throw new Error("objstore: openWorkspace requires a WorkspaceSubscription (triageSync.ensureSubscription) \u2014 the client must not open a session for a tag with no backing sync subscribe");let d=l.workspaceTag;if(g.workspaceTag!=null&&g.workspaceTag!==d)throw new Error("objstore: openWorkspace \u2014 WorkspaceSubscription is for a different workspace than these keys");if(i.has(d))throw new Error(`objstore: workspace ${d.slice(0,8)}\u2026 is already open on this client`);let m={workspaceTag:d,signingKey:l.signingKey,contentKey:new Uint8Array(l.contentKey),tagKey:new Uint8Array(l.tagKey),putHandlers:new Set,deletedHandlers:new Set,seenVersions:new Map,inventory:new Map,connected:!1,closed:!1};w(m),x(m),i.set(d,m);let u=m;(async()=>{let S;try{S=await g.resources}catch{return}u.closed||A(u,y(S))})();let h=o.acquire();a.set(d,h),o.getNonce()&&(u.connected=!0,u.resolveConnected());let R=null;try{await new Promise((S,P)=>{R=setTimeout(()=>{P(new Error(`objstore: connect timeout after ${t}ms`))},t),u.connectedPromise.then(()=>S(),B=>P(B))})}catch(S){R&&clearTimeout(R),i.delete(d),a.delete(d),u.closed=!0;try{u.contentKey.fill(0)}catch{}try{u.tagKey.fill(0)}catch{}throw h.release(),S}R&&clearTimeout(R);async function J(S,P,B){let q=await $(u,{resourceTag:S,bytes:P,prev:B});return q.ok?(B==null&&u.seenVersions.delete(S),p(u,S,q.meta.incarnation,q.meta.version),u.inventory.set(S,{version:q.meta.version,incarnation:q.meta.incarnation,contentLength:q.meta.contentLength}),{ok:!0,meta:{version:q.meta.version,incarnation:q.meta.incarnation,contentLength:q.meta.contentLength}}):q.reason==="workspace-full"?{ok:!1,reason:"workspace-full"}:q.reason==="unauthorized"?{ok:!1,reason:"unauthorized"}:(q.current&&p(u,S,q.current.incarnation,q.current.version),{ok:!1,reason:"conflict",current:q.current})}async function ae(S){let P=await fe(u.tagKey,S.fileName),B=Lt(u.contentKey,S.fileName,S.content,d,P);return await J(P,B,S.prev)}async function vn(S){let P=await fe(u.tagKey,S),B=await F(u,P);if(!B)return null;b(u,P,B.meta.incarnation,B.meta.version);let{fileName:q,content:et}=ot(u.contentKey,B.bytes,d,P);if(q!==S)throw new Error(`objstore: fileName-binding mismatch \u2014 requested '${S}', payload encoded '${q}'`);return p(u,P,B.meta.incarnation,B.meta.version),{content:et,version:B.meta.version,incarnation:B.meta.incarnation}}async function $r(S){let P=await F(u,S);if(!P)return null;b(u,S,P.meta.incarnation,P.meta.version);let{fileName:B,content:q}=ot(u.contentKey,P.bytes,d,S);if(await fe(u.tagKey,B)===S)return p(u,S,P.meta.incarnation,P.meta.version),{kind:"report",fileName:B,content:q,version:P.meta.version,incarnation:P.meta.incarnation};if(await ye(u.tagKey,B)===S){let{name:Et,content:qr}=Nt(q);return p(u,S,P.meta.incarnation,P.meta.version),{kind:"bundle",integrity:B,name:Et,content:qr,version:P.meta.version,incarnation:P.meta.incarnation}}throw new Error("objstore: fetchByTag \u2014 decrypted name does not derive back to the requested resourceTag under either the report or bundle tag scheme (relay or workspace member produced a non-round-trippable tag-name pair)")}async function Sn(S,P){let B=await z(u,S,P);return B.ok?(u.seenVersions.delete(S),u.inventory.delete(S),B):B.reason==="not-found"?{ok:!1,reason:"not-found"}:(B.current&&p(u,S,B.current.incarnation,B.current.version),{ok:!1,reason:"conflict",current:B.current})}async function Hr(S,P){let B=await fe(u.tagKey,S);return await Sn(B,P)}async function _r(){if(await T(u),u.closed)throw new Error("objstore: session closed");return[...u.inventory.entries()].map(([S,P])=>({resourceTag:S,version:P.version,incarnation:P.incarnation,contentLength:P.contentLength}))}async function Wr(S){let P=await ye(u.tagKey,S.integrity),B=Gn(S.name,S.content),q=Lt(u.contentKey,S.integrity,B,d,P);return await J(P,q,S.prev)}async function Vr(S){let P=await ye(u.tagKey,S),B=await F(u,P);if(!B)return null;b(u,P,B.meta.incarnation,B.meta.version);let{fileName:q,content:et}=ot(u.contentKey,B.bytes,d,P);if(q!==S)throw new Error(`objstore: bundle-integrity binding mismatch \u2014 requested '${S}', payload encoded '${q}'`);let{name:kn,content:Et}=Nt(et);return p(u,P,B.meta.incarnation,B.meta.version),{name:kn,content:Et,version:B.meta.version,incarnation:B.meta.incarnation}}async function zr(S,P){let B=await ye(u.tagKey,S);return await Sn(B,P)}return{put:ae,fetch:vn,fetchByTag:$r,delete:Hr,list:_r,putBundle:Wr,fetchBundle:Vr,deleteBundle:zr,onPut(S){return u.putHandlers.add(S),()=>{u.putHandlers.delete(S)}},onDeleted(S){return u.deletedHandlers.add(S),()=>{u.deletedHandlers.delete(S)}},close(){if(u.closed)return;u.closed=!0,i.delete(d);try{u.contentKey.fill(0)}catch{}try{u.tagKey.fill(0)}catch{}try{u.rejectConnected(new Error("objstore: session closed"))}catch{}try{u.rejectListed(new Error("objstore: session closed"))}catch{}let S=a.get(d);a.delete(d),S&&S.release()}}}function _(){if(!s){s=!0;for(let l of i.values()){l.closed=!0;try{l.contentKey.fill(0)}catch{}try{l.tagKey.fill(0)}catch{}try{l.rejectConnected(new Error("objstore: client closed"))}catch{}try{l.rejectListed(new Error("objstore: client closed"))}catch{}}i.clear();for(let l of a.values())l.release();a.clear(),Z.remove(),r&&o.close()}}return{openWorkspace:v,close:_}}async function Ht(e){try{let t=await e.json();if(_e(t.currentVersion)&&typeof t.currentIncarnation=="string")return{version:t.currentVersion,incarnation:t.currentIncarnation}}catch{}return null}function _e(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0}function Le(e){return!e||typeof e!="object"?!1:typeof e.resourceTag=="string"&&_e(e.version)&&typeof e.incarnation=="string"&&typeof e.contentHash=="string"&&_e(e.contentLength)&&typeof e.signature=="string"}function Ne(e){return{resourceTag:e.resourceTag,version:e.version,incarnation:e.incarnation,contentHash:e.contentHash,contentLength:e.contentLength,signature:e.signature}}var _t=null;function cr(e){_t=typeof e=="function"?e:null}var Jo=ut({serverUrl:"",authResolver:e=>_t==null?Promise.resolve(null):_t(e)});function ft(){return Jo}var lr=new Set(["busy"]);function Yo(e){return typeof e?.color=="string"?e.color:""}function Xo(e){return e?.triage==="fixed"||e?.triage==="invalid"||e?.triage==="deleted"?e.triage:e?.deleted?"deleted":""}function Qo(e){return typeof e?.comment=="string"?e.comment:""}function Zo(e){return typeof e?.fix=="string"?e.fix:""}function ur(e,t,n){let r=[];for(let o of Object.keys(e)){let s=e[o],i=t[o],a=n[o],f=s??null,c=[{name:"color",norm:Yo},{name:"triage",norm:Xo},{name:"comment",norm:Qo},{name:"fix",norm:Zo}];for(let{name:p,norm:w}of c){let x=w(i),A=w(f),y=w(a);A!==x&&y!==x&&A!==y&&r.push({id:o,property:p,local:A,imported:y})}}return r}function es(e,t){let n=Array.isArray(e)?e:[],r=Array.isArray(t)?t:[];if(n.length!==r.length)return!1;if(n.length===0)return!0;let o=new Set(n);for(let s of r)if(!o.has(s))return!1;return!0}function fr(e,t){let n=e.triage??(e.deleted?"deleted":""),r=t.triage??(t.deleted?"deleted":"");return e.color===t.color&&n===r&&(e.comment??"")===(t.comment??"")&&(e.fix??"")===(t.fix??"")&&es(e.ignoredReports,t.ignoredReports)}function Wt(e,t){let n=new Set([...Object.keys(e),...Object.keys(t)]);for(let r of n)if(!fr(e[r]??{},t[r]??{}))return!1;return!0}function dt(e,t){let n=Object.assign(Object.create(null),e);for(let[r,o]of Object.entries(t))o===null?delete n[r]:o!==void 0&&(n[r]=o);return n}function Vt(e,t){let n=Object.create(null),r=new Set([...Object.keys(e),...Object.keys(t)]);for(let o of r){let s=e[o]??{},i=t[o]??{};fr(s,i)||(n[o]=t[o]??null)}return n}function dr(e){for(let t in e)return!1;return!0}function gr(e){return e==="fixed"||e==="invalid"||e==="deleted"?e:void 0}function we(e){if(e)return gr(e.triage)??(e.deleted?"deleted":void 0)}function ts(e){return e?!e.color&&!we(e)&&!e.comment&&!e.fix&&!(e.ignoredReports&&e.ignoredReports.length>0):!0}function gt(e){if(!e||typeof e!="object")return;let t=e,n={};typeof t.color=="string"&&t.color&&(n.color=t.color);let r=gr(t.triage)??(t.deleted?"deleted":void 0);if(r&&(n.triage=r),typeof t.comment=="string"&&t.comment&&(n.comment=t.comment),typeof t.fix=="string"&&t.fix&&(n.fix=t.fix),Array.isArray(t.ignoredReports)){let o=t.ignoredReports.filter(s=>typeof s=="string"&&s.length>0);o.length>0&&(n.ignoredReports=o)}return ts(n)?void 0:n}function ns(e,t){let n=e??[],r=t??[];if(n.length!==r.length)return!1;if(n.length===0)return!0;let o=new Set(n);for(let s of r)if(!o.has(s))return!1;return!0}function pr(e,t){let n=e??{},r=t??{};return(n.color??"")===(r.color??"")&&(we(n)??"")===(we(r)??"")&&(n.comment??"")===(r.comment??"")&&(n.fix??"")===(r.fix??"")&&ns(n.ignoredReports,r.ignoredReports)}function de(e,t,n){let r=e.get(t),o=gt({...r,...n});return o===void 0?e.delete(t):pr(r,o)?!1:(e.set(t,o),!0)}function yr(e,t,n){let r=gt(n),o=e.get(t);return r===void 0?e.delete(t):pr(o,r)?!1:(e.set(t,r),!0)}function hr(e,t,n,r){let o=new Set(e.get(t)?.ignoredReports??[]);return r?o.add(n):o.delete(n),de(e,t,{ignoredReports:o.size>0?[...o]:void 0})}function Ke(e,t){let n=Object.assign(Object.create(null),e),r=ce().state,o=t instanceof Set?t:new Set(t);for(let s of o){let i=gt(r.triage.get(s));i?n[s]=i:delete n[s]}return n}function zt(e,t){let n=ce().state,r=[];for(let o of t){let s=e[o];if(!s||typeof s!="object")continue;let i=n.triage.get(o);if(s.color){let c=i?.color;c===void 0?de(n.triage,o,{color:s.color}):c!==s.color&&r.push({id:o,property:"color",local:c,imported:s.color})}let a=we(s);if(a){let c=we(i);c===void 0?de(n.triage,o,{triage:a}):c!==a&&r.push({id:o,property:"triage",local:c,imported:a})}if(s.comment){let c=i?.comment;c===void 0?de(n.triage,o,{comment:s.comment}):c!==s.comment&&r.push({id:o,property:"comment",local:c,imported:s.comment})}if(s.fix){let c=i?.fix;c===void 0?de(n.triage,o,{fix:s.fix}):c!==s.fix&&r.push({id:o,property:"fix",local:c,imported:s.fix})}if(!(a!=null||we(i)!=null||!Array.isArray(s.ignoredReports))&&!((i?.ignoredReports?.length??0)>0))for(let c of s.ignoredReports)typeof c=="string"&&hr(n.triage,o,c,!0)}return r}function qt(e,t){let n=ce().state;for(let r of e){let o=`${r.id}:${r.property}`;t[o]==="imported"&&rs(r.id,r.property)===r.local&&(r.property==="color"?de(n.triage,r.id,{color:r.imported}):r.property==="comment"?de(n.triage,r.id,{comment:r.imported}):r.property==="fix"?de(n.triage,r.id,{fix:r.imported}):r.property==="triage"&&(r.imported==="fixed"||r.imported==="invalid"||r.imported==="deleted"?de(n.triage,r.id,{triage:r.imported,ignoredReports:void 0}):de(n.triage,r.id,{triage:void 0})))}}function rs(e,t){let n=ce().state.triage.get(e);return t==="color"?n?.color??"":t==="triage"?we(n)??"":t==="comment"?n?.comment??"":t==="fix"?n?.fix??"":""}function mr(e,t){let n=ce().state,r=t instanceof Set?t:new Set(t);for(let o of r){let s=e[o],i=we(s)?void 0:s?.ignoredReports;yr(n.triage,o,{...s,ignoredReports:i})}}var Jt="deepview.sync.sessions",os=Jt,Gt=1,yt=!1,pt=new Set;function br(){return yt}function We(e){if(yt!==e){yt=e,console.warn(e?"triage-sync: can't persist the sessions blob \u2014 either it's an unrecognised future version (writes skipped to avoid clobbering a newer build's data) or the write itself failed (storage full / vault locked). Your in-memory triage state still works this session but will not persist across reload. Free up storage and/or clear localStorage[deepview.sync.sessions]; the badge clears on the next successful save.":"triage-sync: persistence recovered; persisted-sessions blob is now writable.");for(let t of pt)try{t(e)}catch(n){console.warn("persistenceDegraded listener:",n)}}}function wr(e){let t=n=>e(n);return pt.add(t),queueMicrotask(()=>{if(pt.has(t))try{t(yt)}catch(n){console.warn("persistenceDegraded listener:",n)}}),()=>pt.delete(t)}function ht(){try{let e=ce().getSecureItem(Jt);if(!e)return{kind:"empty"};let t=JSON.parse(e);if(!t||typeof t!="object")return{kind:"empty"};let n=t;return n.version===Gt&&n.sessions&&typeof n.sessions=="object"&&!Array.isArray(n.sessions)?{kind:"v1",map:n.sessions}:n.version===Gt?{kind:"empty"}:"version"in n?{kind:"unknown-version"}:{kind:"legacy",map:n}}catch{return{kind:"empty"}}}function ss(){let e=ht();return e.kind==="v1"||e.kind==="legacy"?e.map:{}}async function is(e){try{return await ce().setSecureItem(Jt,JSON.stringify({version:Gt,sessions:e})),!0}catch(t){return console.warn("Triage sync: could not persist session state:",t),!1}}function Yt(e,t){if(!t)return null;let r=ss()[e];return!r||r.serverUrl!==t?null:{baseRevision:typeof r.baseRevision=="string"?r.baseRevision:null,baseState:r.baseState&&typeof r.baseState=="object"?Object.assign(Object.create(null),r.baseState):Object.create(null),savesSinceKeyframe:typeof r.savesSinceKeyframe=="number"?r.savesSinceKeyframe:0}}async function mt(e){await navigator.locks.request(os,async()=>{let t=ht();if(t.kind==="unknown-version"){We(!0);return}let n=t.kind==="v1"||t.kind==="legacy"?t.map:{};if(await e(n)===!1)return;let o=await is(n);We(!o)})}function Xt(e=null){mt(t=>{let n=Object.keys(t);if(n.length===0)return!1;let r=new Set(ce().listWorkspaces().map(s=>s.id)),o=!1;for(let s of n){let i=t[s];(!r.has(s)||e!=null&&i?.serverUrl!==e)&&(delete t[s],o=!0)}return o?void 0:!1}).catch(t=>{console.warn("Triage sync: prunePersistedSessions lock failed:",t)})}function bt(e){return mt(t=>{if(!(e in t))return!1;delete t[e]})}var Er,Je,vt,vr,Ar,as="deepview.triageSyncUrl",Pr="deepview.sync.userEnabled",cs=/^\d+$/u,on=()=>{},Ge=null,he="",qe=!0,en=!1,se=ft(),Ve=null,xe=100,ls=5;function St(){return qe&&!en&&!!he&&us()}function us(){try{return Je().length>0}catch{return!1}}var tn=new Set;function Br(){if(!St())return"off";for(let t of O.values())if(t.error)return"error";let e=se.getSocket();if(!e||e.readyState!==WebSocket.OPEN)return"offline";for(let t of O.values())if(t.subscribed&&!t.subscribeAcked)return"connecting";return"online"}var Sr="off";function te(){let e=Br();if(e!==Sr){Sr=e;for(let t of tn)try{t(e)}catch(n){console.warn("Triage sync status listener:",n)}}}var nn=0,O=new Map;function kr(e){for(let t of O.values())if(t.workspaceTag===e)return t;return null}function ge(e){return O.get(e.workspaceId)===e}function Tr(e){if(e.key){try{e.key.fill(0)}catch{}e.key=null}if(e.signingKey=null,e.verifyingKey=null,e.objstoreResourceWaiters.length>0){let t=e.objstoreResourceWaiters.splice(0);for(let n of t)try{n([])}catch{}}}function Rr(e){let t=new Set,n=Je().find(o=>o.id===e);if(!n)return t;let r=new Set(n.reports??[]);for(let o of Er.reports)if(r.has(o.fileName))for(let s of o.groups)for(let i of s){let a=i.id??String(i._id);cs.test(a)||t.add(a)}return t}function sn(e){let t=Rr(e.workspaceId),n=[];for(let o of t)e.ids.has(o)||n.push(o);let r=[];return n.length>0&&(r=zt(e.baseState,n)),e.ids=t,{conflicts:r,hydrated:n.length>0}}function fs(){let e=ht();e.kind==="unknown-version"?We(!0):(e.kind==="v1"||e.kind==="legacy")&&We(!1),rr(),se.resetCachedReplayGuard()}function jr(e){if(!e||!he)return;let t=he;mt(n=>{n[e.workspaceId]={serverUrl:t,baseRevision:e.baseRevision,savesSinceKeyframe:e.savesSinceKeyframe??0,baseState:e.baseState}}).catch(n=>{console.warn("Triage sync: persistSession lock failed:",n)})}function rn(e){let t=Je().find(r=>r.id===e.workspaceId);if(!t){e.error="workspace no longer exists",te();return}let n=(e.keyDerivationGen??0)+1;e.keyDerivationGen=n,(async()=>{try{let[r,o]=await Promise.all([Fn(t.privateKey),rt(t.privateKey,e.workspaceId)]);if(O.get(e.workspaceId)!==e||e.keyDerivationGen!==n)return;if(e.key=r,e.signingKey=o.privateKey,e.verifyingKey=o.publicKey,e.workspaceTag=o.publicKeyB64,se.getSocket()?.readyState!==WebSocket.OPEN){Ee();return}Me(e),le(e),te()}catch(r){console.warn("Triage sync: key derivation failed:",r),O.get(e.workspaceId)===e&&e.keyDerivationGen===n&&(e.error=`key derivation failed: ${r instanceof Error?r.message:String(r)}`,te())}})()}function wt(e){return se.send(e)}function ds(e){if(!se.isSse()){wt(e);return}gs(e).then(t=>(t&&wt(e),null)).catch(()=>{wt(e)})}async function gs(e){if(!he)return!0;let t;try{t=sr(he)}catch{return!0}let n;try{n=await globalThis.fetch(t,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}catch{return!0}let r=e.workspaceTag,o=e.base??null;if(n.status===401)return!0;if(n.ok){let s=null;try{s=await n.json()}catch{return!0}return!s||typeof s.id!="string"?!0:(ze({type:"workspace-save-ack",workspaceTag:r,base:o,id:s.id}),!1)}if(n.status===409){let s=null;try{s=await n.json()}catch{return!0}let i=s&&Array.isArray(s.revisions)?s.revisions:[];return ze({type:"workspace-state",workspaceTag:r,revisions:i}),ze({type:"workspace-save-error",workspaceTag:r,base:o,reason:"stale-base"}),!1}return n.status===413?(ze({type:"workspace-save-error",workspaceTag:r,base:o,reason:"too-large"}),!1):!0}function Me(e,t=!1){if(!e)return;let n=se.getSocket();if(!n||n.readyState!==WebSocket.OPEN||!t&&e.subscribed||!e.signingKey||!e.workspaceTag)return;let r=se.getNonce();if(r==null)return;let o=e.baseRevision,s=n,i=e.signingKey,a=e.workspaceTag;(async()=>{try{let f=await Hn(i,a,o,r);if(O.get(e.workspaceId)!==e||e.workspaceTag!==a||se.getSocket()!==s||se.getNonce()!==r)return;e.subscribed=!0,wt({type:"workspace-subscribe",workspaceTag:a,from:o,signature:f})}catch(f){console.warn("Triage sync: subscribe sign failed:",f)}})()}function le(e){if(!e||e.error)return;if(e.pending||e.encrypting){e.pendingSave=!0;return}if(!e.key||!e.signingKey||!e.workspaceTag){e.pendingSave=!0;return}sn(e),e.localState=Ke(e.baseState,e.ids);let t=se.getSocket();if(!t||t.readyState!==WebSocket.OPEN)return;let n=(e.savesSinceKeyframe??0)>=xe,r=n?Object.create(null):e.baseState,o=Vt(r,e.localState);if(dr(o)&&!n)return;let s=e.baseRevision,i=e.key,a=e.signingKey,f=e.workspaceTag;e.encrypting=!0,(async()=>{try{let c=Ct(f,s),{nonce:p,ciphertext:w}=await Wn(i,o,c),x={publicKeyB64:f,base:s,keyframe:n,nonceB64:p,ciphertextB64:w},A=await $n(a,x),y=await Ot(x);if(O.get(e.workspaceId)!==e||e.workspaceTag!==f)return;if(e.baseRevision!==s){e.pendingSave=!0;return}e.pending={base:s,id:y,changeset:o,keyframe:n},e.pendingSave=!1;let T={type:"workspace-save",workspaceTag:f,base:s,nonce:p,ciphertext:w,signature:A};n&&(T.keyframe=!0),ds(T),e.consecutiveFailures=0,e.error&&(e.error=null,te())}catch(c){console.warn("Triage sync: encrypt/sign failed:",c),O.get(e.workspaceId)===e&&(e.consecutiveFailures=(e.consecutiveFailures??0)+1,e.consecutiveFailures>=ls&&(e.error=`encrypt/sign failed: ${c instanceof Error?c.message:String(c)}`,te()))}finally{O.get(e.workspaceId)===e&&(e.encrypting=!1,!e.error&&e.pendingSave&&!e.pending&&(e.pendingSave=!1,le(e)))}})()}async function ps(e,t){for(let n of t){if(!n||typeof n!="object"||typeof n.id=="string"&&n.id===e.baseRevision)continue;let r=e.baseRevision,o=!!n.keyframe;if(!(r==null?n.base==null||o:n.base===r))return console.warn(`Triage sync: chain base mismatch (expected ${r}, got ${n.base})`),!1;if(typeof n.signature!="string"||typeof n.nonce!="string"||typeof n.ciphertext!="string"||typeof n.id!="string")return console.warn("Triage sync: revision missing signature/nonce/ciphertext/id; resyncing"),e.savesSinceKeyframe=xe,!1;if(!e.workspaceTag||!e.verifyingKey||!e.key)return!1;let i=typeof n.base=="string"?n.base:null,a={publicKeyB64:e.workspaceTag,base:i,keyframe:o,nonceB64:n.nonce,ciphertextB64:n.ciphertext},f=await _n(e.verifyingKey,a,n.signature);if(!ge(e))return!1;if(!f)return console.warn("Triage sync: revision signature did not verify; resyncing"),e.savesSinceKeyframe=xe,!1;let c=await Ot(a);if(!ge(e))return!1;if(n.id!==c)return console.warn("Triage sync: revision id does not match content hash; resyncing"),e.savesSinceKeyframe=xe,!1;let p;try{let x=Ct(e.workspaceTag,i);p=await Vn(e.key,n.nonce,n.ciphertext,x)}catch(x){return console.warn("Triage sync: decrypt failed; resyncing",x),e.savesSinceKeyframe=xe,!1}if(!ge(e))return!1;let w=o?Object.create(null):e.baseState;e.baseState=dt(w,p??{}),e.baseRevision=n.id,o?e.savesSinceKeyframe=0:e.savesSinceKeyframe=Math.min((e.savesSinceKeyframe??0)+1,xe)}return!0}async function Or(e,t,n=[],r=null){if(ge(e)){e.localState=dt(e.baseState,t),nn++;try{mr(e.localState,e.ids),r&&n.length>0&&(qt(n,r),e.localState=Ke(e.baseState,e.ids)),jr(e),await vt()}finally{nn--}if(ge(e)){on();for(let o of O.values())o!==e&&le(o)}}}function Cr(e){return sn(e),e.localState=Ke(e.baseState,e.ids),Vt(e.baseState,e.localState)}async function ys(e,t){if(e.pending&&t.base===e.pending.base&&typeof t.id=="string"&&t.id===e.pending.id){let n=Cr(e),r=e.pending.keyframe?Object.create(null):e.baseState;if(e.baseState=dt(r,e.pending.changeset),e.baseRevision=t.id,e.savesSinceKeyframe=e.pending.keyframe?0:Math.min((e.savesSinceKeyframe??0)+1,xe),e.pending=null,await Or(e,n),!ge(e))return;(e.pendingSave||!Wt(e.localState,e.baseState))&&(e.pendingSave=!1,le(e));return}if(e.pending){let n=typeof t.id=="string"?t.id.slice(0,8):String(t.id);console.warn(`Triage sync: ack mismatch (pending ${e.pending.base}/${e.pending.id.slice(0,8)}, ack ${t.base}/${n})`);return}if(t.id!==e.baseRevision){let n=typeof t.id=="string"?t.id.slice(0,8):String(t.id);console.warn(`Triage sync: late ack for base=${t.base} id=${n}\u2026; pending was already cleared`),e.pendingSave=!0,le(e)}}async function hs(e,t){if(!Array.isArray(t)||t.length===0||!e.key)return;let n=Cr(e),r=e.baseRevision,o=e.baseState,s=await ps(e,t);if(!ge(e))return;if(!s){if(!e.resyncAttempted){e.resyncAttempted=!0,console.warn("Triage sync: requesting catch-up from last known baseRevision"),Me(e,!0);return}console.warn("Triage sync: catch-up also broke continuity; full state push"),e.baseRevision=null,e.baseState=Object.create(null),e.pending=null,e.pendingSave=!1,e.resyncAttempted=!1,jr(e),on(),le(e);return}if(e.resyncAttempted=!1,e.pending&&(e.pending=null,e.pendingSave=!0),e.baseRevision===r){if(!ge(e))return;e.pendingSave&&(e.pendingSave=!1,le(e));return}let i=ur(n,o,e.baseState),a=null;if(i.length>0&&Ge){try{a=await Ge(i,e.baseState,"chain")??null}catch(f){console.warn("Triage sync: chain-conflict resolver failed:",f)}if(!ge(e))return}await Or(e,n,i,a),ge(e)&&(e.pendingSave||!Wt(e.localState,e.baseState))&&(e.pendingSave=!1,le(e))}async function ms(e){if(e.type==="authenticated"){for(let n of O.values())Me(n),le(n);return}if(e.type==="unauthorized"){if(e.kind==="gated"){if(typeof e.workspaceTag=="string"){let n=kr(e.workspaceTag);n&&typeof e.resourceTag!="string"&&bs(n,e)}se.runAuthFlow().catch(n=>{console.warn("Triage sync: auth flow failed:",n)})}return}if(typeof e.workspaceTag!="string")return;let t=kr(e.workspaceTag);if(t){if(e.type==="workspace-save-ack")await ys(t,e);else if(e.type==="workspace-state")await hs(t,e.revisions);else if(e.type==="workspace-save-error")vs(t,e);else if(e.type==="workspace-subscribed"){t.subscribeAcked=!0;let n=Array.isArray(e.resources)?e.resources:[],r=t.objstoreResourceWaiters.splice(0);for(let o of r)try{o(n)}catch{}te()}}}function bs(e,t){e.pending&&(typeof t.base!="string"&&t.base!==null||t.base===e.pending.base&&(e.pending=null,e.pendingSave=!0))}var ws=/^[\w-]+$/u;function vs(e,t){if(!e.pending||typeof t.base!="string"&&t.base!==null||t.base!==e.pending.base)return;let n=t.reason,r=typeof n=="string"&&n.length>0&&n.length<=64&&ws.test(n)?n:"rejected";if(e.pending=null,lr.has(r)){e.pendingSave=!0;return}e.consecutiveFailures=(e.consecutiveFailures??0)+1,e.error=`server rejected save: ${r}`,te()}var xr=Promise.resolve();function ze(e){xr=xr.then(()=>ms(e)).catch(t=>{console.warn("Triage sync handler error:",t)})}function Ss(e){for(let t of O.values())t.pending=null,t.pendingSave=!1,Me(t),le(t);te()}function ks(e){for(let t of O.values())t.pending=null,t.subscribed=!1,t.subscribeAcked=!1,t.resyncAttempted=!1,t.pendingSave=!0;te()}se.addConsumer({onMessage:ze,onConnected:Ss,onDisconnected:ks});function Ee(){St()?Ve||(Ve=se.acquire()):Ve&&(Ve.release(),Ve=null)}function Ts(e){on=typeof e=="function"?e:()=>{}}function xs(e){Ge=typeof e=="function"?e:null}function Es(e){cr(e)}function Qt(e){let t=e.error!=null;e.error=null,e.consecutiveFailures=0,t&&(!e.key||!e.signingKey)&&rn(e)}function Zt(e){e.pending=null,e.pendingSave=!1,e.encrypting=!1,e.subscribed=!1,e.subscribeAcked=!1,e.resyncAttempted=!1}var ve={setServerUrl(e){let t=(e??"").trim();if(t===he)return;let n=he;he=t,t&&Xt(t),n&&t&&n!==t&&He(null).catch(r=>{console.warn("Triage sync: failed to drop cached auth password on server change:",r)}),se.setServerUrl(t);for(let r of O.values()){Zt(r);let o=t?Yt(r.workspaceId,t):null;r.baseRevision=o?.baseRevision??null,r.baseState=o?.baseState??Object.create(null),r.savesSinceKeyframe=o?.savesSinceKeyframe??0,r.localState=Ke(r.baseState,r.ids),Qt(r)}Ee(),te()},setEnabled(e){let t=!!e;if(t!==qe){if(qe=t,Ar(Pr,t?"1":"0").catch(n=>{console.warn("Triage sync: could not persist user-enabled:",n)}),St())for(let n of O.values())Qt(n);else for(let n of O.values())Zt(n);Ee(),te()}},isEnabled(){return qe},setForcedOff(e){let t=!!e;if(t!==en){if(en=t,St())for(let n of O.values())Qt(n);else for(let n of O.values())Zt(n);Ee(),te()}},getServerUrl(){return he},get connected(){return se.getSocket()?.readyState===WebSocket.OPEN},get status(){return Br()},onStatusChange(e){return tn.add(e),()=>tn.delete(e)},notify(){if(!(nn>0))for(let e of O.values())le(e)},ensureSubscription(e){let t=O.has(e);ve.openSession(e);let n=O.get(e);if(!n)return null;let r=new Promise(o=>{n.objstoreResourceWaiters.push(o)});return t&&Me(n,!0),{workspaceId:e,workspaceTag:n.workspaceTag,resources:r}},openSession(e){if(!e||O.has(e)||!Je().find(i=>i.id===e))return;let n=Rr(e),r=Yt(e,he),o=r?.baseState??Object.create(null);zt(o,n);let s={workspaceId:e,workspaceTag:null,signingKey:null,verifyingKey:null,ids:n,baseRevision:r?.baseRevision??null,baseState:o,savesSinceKeyframe:r?.savesSinceKeyframe??0,localState:Ke(o,n),pending:null,pendingSave:!1,key:null,encrypting:!1,subscribed:!1,subscribeAcked:!1,resyncAttempted:!1,consecutiveFailures:0,error:null,objstoreResourceWaiters:[]};O.set(e,s),rn(s),Ee(),te()},closeSession(e){if(e==null){for(let t of O.values())Tr(t);O.clear()}else{let t=O.get(e);t&&Tr(t),O.delete(e)}te()},refreshSession(e){let t=O.get(e);if(!t){console.debug("triage-sync: refreshSession bail \u2014 no session for",e,"(caller must openSession first)");return}Ur(t)},sessionInfo(e){let t=O.get(e);return t?{workspaceId:t.workspaceId,workspaceTag:t.workspaceTag,baseRevision:t.baseRevision,pending:t.pending&&{base:t.pending.base,keyframe:t.pending.keyframe},pendingSave:t.pendingSave,keyReady:t.key!==null,encrypting:t.encrypting,tracked:t.ids.size,savesSinceKeyframe:t.savesSinceKeyframe??0,error:t.error??null}:null},get openSessions(){return[...O.keys()].map(e=>this.sessionInfo(e)).filter(e=>e!==null)},dismissError(e){let t=e==null?[...O.keys()]:[e],n=!1;for(let r of t){let o=O.get(r);!o||!o.error||(o.error=null,o.consecutiveFailures=0,n=!0,!o.key||!o.signingKey?rn(o):se.getSocket()?.readyState===WebSocket.OPEN&&(Me(o),le(o)))}n&&te()},get persistenceDegraded(){return br()},onPersistenceDegraded(e){return wr(e)}};at(e=>{Er=e.state,Je=e.listWorkspaces,vt=e.saveTriage,vr=e.getSecureItem,Ar=e.setSecureItem,e.onSecureStorageHydrated(fs);try{localStorage.removeItem(as),vr(Pr)==="0"&&(qe=!1),Ee()}catch{}e.onWorkspaceDeleted(t=>{let n=O.delete(t);bt(t).catch(r=>{console.warn("Triage sync: dropPersistedSession lock failed:",r)}),Ee(),n&&te()}),e.onWorkspacePrivateKeyChanged(t=>{let n=O.get(t);if(!n){bt(t).catch(r=>{console.warn("Triage sync: dropPersistedSession lock failed:",r)});return}n.signingKey=null,n.key=null,n.verifyingKey=null,n.workspaceTag=null,n.keyDerivationGen=(n.keyDerivationGen??0)+1,(async()=>{await bt(t),O.delete(t),ve.openSession(t),te()})().catch(r=>{console.warn("Triage sync: privateKey rotation IIFE failed:",r),O.delete(t),te()})}),e.onReportMembershipChanged(t=>{ve.openSession(t);let n=O.get(t);n&&Ur(n)}),Xt()});function Ur(e){let{conflicts:t,hydrated:n}=sn(e);(async()=>{if(t.length===0){n?await vt():le(e);return}let r=null;if(Ge)try{r=await Ge(t,e.baseState,"attach")}catch(o){console.warn("Triage sync: hydration conflict resolver failed:",o)}ge(e)&&(r&&qt(t,r),await vt())})().catch(r=>{console.warn("Triage sync: refreshAndPropagate failed:",r)})}async function an(e){let t=await crypto.subtle.digest("SHA-512",e);return`sha512-${new Uint8Array(t).toBase64()}`}var Ae,un,fn,gn,pn,yn,Ze,Tt,hn,Mr,mn,bn,W=new Map,dn=new Set,As="deepview.objstore-presence.";function wn(e){return As+e}function Ps(e){try{let t=localStorage.getItem(wn(e));if(!t)return null;let n=JSON.parse(t);return!n||typeof n!="object"?null:{names:n.names&&typeof n.names=="object"?n.names:{},bundles:n.bundles&&typeof n.bundles=="object"?n.bundles:{},bundleNames:n.bundleNames&&typeof n.bundleNames=="object"?n.bundleNames:{},localVersions:n.localVersions&&typeof n.localVersions=="object"?n.localVersions:{}}}catch{return null}}function Fe(e,t){try{let n={names:Object.fromEntries(t.remoteNameByTag),bundles:Object.fromEntries(t.remoteBundleByTag),bundleNames:Object.fromEntries(t.remoteBundleNameByIntegrity),localVersions:Object.fromEntries(t.localVersions)};localStorage.setItem(wn(e),JSON.stringify(n))}catch(n){console.warn(`objstore-presence: cache persist failed for ${e}:`,n)}}function Lr(e){try{localStorage.removeItem(wn(e))}catch{}}var cn=null;function Bs(e){return cn||(cn=ar({serverUrl:"",httpOrigin:e,transport:ft()})),cn}var Ye=new Set,Xe=new Set;function me(){for(let e of dn)try{e()}catch{}}function Rs(e){if(e==null)return"";if(e instanceof Error&&e.message)return`: ${e.message}`;if(typeof e=="string"&&e)return`: ${e}`;if(typeof e=="object"&&typeof e.message=="string"&&e.message)return`: ${e.message}`;try{return`: ${String(e)}`}catch{return""}}var Nr=256;function Ir(e){return typeof e!="string"?"":e.length<=Nr?e:e.slice(0,Nr)}function js(e){try{let t=new URL(e);return t.protocol=t.protocol==="wss:"?"https:":"http:",t.pathname="/",t.search="",t.hash="",t.origin}catch{return null}}function Ie(e){if(W.has(e))return;let t=Ae().find(s=>s.id===e);if(!t)return;let n=ve.ensureSubscription(e);if(!n)return;let r={workspaceId:e,session:null,keys:null,remoteTags:new Set,fileTags:new Map,bundleTags:new Map,remoteNameByTag:new Map,remoteBundleByTag:new Map,remoteBundleNameByIntegrity:new Map,remoteVersions:new Map,localVersions:new Map,inFlight:new Map,err:null,disposed:!1,ready:null};W.set(e,r),r.ready=(async()=>{if(r.keys=await Ut(t.privateKey,t.id),r.disposed)return;let s=new Map;for(let c of t.reports??[]){let p=await fe(r.keys.tagKey,c);r.fileTags.set(c,p),s.set(p,c)}if(r.disposed)return;let i=new Map;for(let c of t.bundles??[]){let p=await ye(r.keys.tagKey,c);r.bundleTags.set(c,p),i.set(p,c)}if(r.disposed)return;try{let c=await Ze();if(r.disposed)return;for(let p of c)r.bundleTags.has(p.integrity)&&r.remoteBundleNameByIntegrity.set(p.integrity,p.name)}catch(c){console.warn(`objstore-presence: listBundles failed during ${e} open:`,c)}me();let a=ve.getServerUrl();if(!a)return;let f=js(a);if(f)try{let p=await Bs(f).openWorkspace(r.keys,n);if(r.disposed){try{p.close()}catch{}return}r.session=p,o();let w=await p.list();if(r.disposed)return;for(let y of w){r.remoteTags.add(y.resourceTag);let T=r.remoteVersions.get(y.resourceTag);(T===void 0||y.version>T)&&r.remoteVersions.set(y.resourceTag,y.version)}let x=Ps(e),A=!1;if(x&&x.localVersions)for(let y of r.remoteTags){let T=x.localVersions[y];typeof T=="number"&&r.localVersions.set(y,T)}for(let y of r.remoteTags){let T=s.get(y);T!==void 0&&!r.remoteNameByTag.has(y)&&(r.remoteNameByTag.set(y,T),A=!0);let E=i.get(y);if(E!==void 0&&!r.remoteBundleByTag.has(y)&&(r.remoteBundleByTag.set(y,E),A=!0),x){let j=x.names[y];typeof j=="string"&&!r.remoteNameByTag.has(y)&&!r.remoteBundleByTag.has(y)&&(r.remoteNameByTag.set(y,j),r.fileTags.set(j,y),A=!0);let V=x.bundles[y];if(typeof V=="string"&&!r.remoteBundleByTag.has(y)&&!r.remoteNameByTag.has(y)){r.remoteBundleByTag.set(y,V),r.bundleTags.set(V,y);let ie=x.bundleNames[V];typeof ie=="string"&&!r.remoteBundleNameByIntegrity.has(V)&&r.remoteBundleNameByIntegrity.set(V,ie),A=!0}}}(A||x)&&Fe(e,r),me(),kt(r);for(let y of r.remoteTags){let T=r.localVersions.get(y),E=r.remoteVersions.get(y);typeof T!="number"||typeof E!="number"||E>T&&Kr(r,y).catch(()=>{})}}catch(c){r.err=c}})();function o(){let s=r.session;s.onPut(({resourceTag:i,version:a})=>{let f=r.remoteVersions.get(i),c=r.remoteTags.has(i)&&typeof f=="number"&&a>f;if(r.remoteTags.add(i),(f===void 0||a>f)&&r.remoteVersions.set(i,a),me(),c){Kr(r,i).catch(()=>{});return}kt(r)}),s.onDeleted(({resourceTag:i})=>{r.remoteTags.delete(i),r.remoteVersions.delete(i),r.localVersions.delete(i);let a=r.remoteNameByTag.get(i);r.remoteNameByTag.delete(i);let f=Ae().find(x=>x.id===e),c=f?.reports??[],p=f?.bundles??[];a&&!c.includes(a)&&r.fileTags.delete(a);let w=r.remoteBundleByTag.get(i);r.remoteBundleByTag.delete(i),w&&(r.remoteBundleNameByIntegrity.delete(w),p.includes(w)||r.bundleTags.delete(w)),Fe(e,r),me()})}r.ready.catch(()=>{})}function Qe(e){let t=W.get(e);if(t){t.disposed=!0;try{t.session?.close()}catch{}if(t.keys){try{t.keys.contentKey.fill(0)}catch{}try{t.keys.tagKey.fill(0)}catch{}t.keys=null}W.delete(e),me()}}at(e=>{Ae=e.listWorkspaces,un=e.addReportToWorkspace,fn=e.addBundleToWorkspace,gn=e.analyzeContent,pn=e.setCount,yn=e.gunzipBytes,Ze=e.listBundles,Tt=e.listFiles,hn=e.readBundle,Mr=e.readFileBytes,mn=e.saveBundle,bn=e.saveFileBytes,e.onReportMembershipChanged(t=>{W.has(t)||Ie(t);let n=W.get(t);if(!n)return;let r=Ae().find(o=>o.id===t);if(r)for(let o of r.reports??[])n.fileTags.has(o)||Us(t,o).catch(()=>{})}),e.onBundleMembershipChanged(t=>{W.has(t)||Ie(t);let n=W.get(t);if(!n)return;let r=Ae().find(o=>o.id===t);if(r)for(let o of r.bundles??[])n.bundleTags.has(o)||Ns(t,o).catch(()=>{})}),e.onWorkspaceDeleted(t=>{Qe(t),Lr(t)}),e.onWorkspacePrivateKeyChanged(t=>{W.has(t)&&(Qe(t),Lr(t),Ie(t))})});function Os(){return Array.from(W.keys())}function Cs(e,t){let n=W.get(e);if(!n)return!1;let r=n.fileTags.get(t);return r?n.remoteTags.has(r):!1}async function Us(e,t){let n=W.get(e);!n||n.fileTags.has(t)||(n.ready&&!n.keys&&await n.ready,n.keys&&(n.fileTags.set(t,await fe(n.keys.tagKey,t)),n.disposed||me()))}function Ls(e,t){let n=W.get(e);if(!n)return!1;let r=n.bundleTags.get(t);return r?n.remoteTags.has(r):!1}async function Ns(e,t){let n=W.get(e);!n||n.bundleTags.has(t)||(n.ready&&!n.keys&&await n.ready,n.keys&&(n.bundleTags.set(t,await ye(n.keys.tagKey,t)),n.disposed||me()))}function Ks(e){return dn.add(e),()=>dn.delete(e)}function Ms(e){return Ye.add(e),()=>Ye.delete(e)}function Is(e){return Xe.add(e),()=>Xe.delete(e)}function Fs(e){let t=W.get(e);return t?t.remoteTags.size:0}async function Ds(e){let t=W.get(e);return t?(t.ready&&!t.session&&await t.ready,t.session?(await kt(t),Array.from(t.remoteNameByTag.values())):[]):[]}async function $s(e){let t=W.get(e);return t?(t.ready&&!t.session&&await t.ready,t.session?(await kt(t),Array.from(t.remoteBundleByTag.values())):[]):[]}function Hs(e,t){let n=W.get(e);if(n)return n.remoteBundleNameByIntegrity.get(t)}async function kt(e){if(!e.session||e.disposed)return;let t=Ae().find(i=>i.id===e.workspaceId),n=new Set(t?.reports??[]),r=new Set(t?.bundles??[]),o=new Set;try{o=new Set(await Tt())}catch(i){console.warn(`objstore-presence: listFiles failed during discovery for "${e.workspaceId}":`,i)}if(e.disposed||!e.session)return;let s=[];for(let i of e.remoteTags){let a=e.remoteNameByTag.get(i);if(a!==void 0&&n.has(a)&&o.has(a))continue;if(e.remoteBundleByTag.has(i)){let c=e.remoteBundleByTag.get(i);if(e.remoteBundleNameByIntegrity.has(c)&&r.has(c))continue}let f=e.inFlight.get(i);f||(f=e.session.fetchByTag(i).then(async c=>(e.inFlight.delete(i),!c||e.disposed||!e.remoteTags.has(i)?null:c.kind==="bundle"?(e.remoteBundleByTag.set(i,c.integrity),e.bundleTags.set(c.integrity,i),c.name&&e.remoteBundleNameByIntegrity.set(c.integrity,c.name),await Ws(e,i,c.integrity,c.name,c.content),null):(e.remoteNameByTag.set(i,c.fileName),e.fileTags.set(c.fileName,i),await _s(e,i,c.fileName,c.content),null)),()=>(e.inFlight.delete(i),null)),e.inFlight.set(i,f)),s.push(f)}s.length!==0&&(await Promise.all(s),!e.disposed&&(Fe(e.workspaceId,e),me()))}async function _s(e,t,n,r){if(e.disposed||!e.remoteTags.has(t))return;let o=Ae().find(c=>c.id===e.workspaceId),s=!!(o&&Array.isArray(o.reports)&&o.reports.includes(n)),i;try{let c=await Tt();if(e.disposed||!e.remoteTags.has(t))return;i=c.includes(n)}catch(c){console.warn(`auto-download: listFiles failed before saving "${n}":`,c);return}if(i){if(s||e.disposed||!e.remoteTags.has(t))return;try{await un(n,e.workspaceId)}catch(c){console.warn(`auto-download: attaching local "${n}" to workspace "${e.workspaceId}" failed:`,c);return}if(e.disposed)return;for(let c of Ye)try{c(e.workspaceId,n)}catch{}return}let a;try{a=Ce(await yn(r))}catch(c){console.warn(`auto-download: gunzip/decode of "${n}" failed (likely forged peer payload):`,c);return}if(e.disposed||!e.remoteTags.has(t))return;let f=gn(a);if(f.recognized){try{if(await bn(n,r),e.disposed||!e.remoteTags.has(t))return;pn(n,f.count,f.source);let c=e.remoteVersions.get(t);if(typeof c=="number"&&e.localVersions.set(t,c),!e.remoteTags.has(t))return;await un(n,e.workspaceId),Fe(e.workspaceId,e)}catch(c){console.warn(`auto-download: persisting "${n}" to workspace "${e.workspaceId}" failed:`,c);return}if(!e.disposed)for(let c of Ye)try{c(e.workspaceId,n)}catch{}}}async function Kr(e,t){if(e.disposed||!e.remoteTags.has(t))return;let n;try{n=await e.session.fetchByTag(t)}catch(a){console.warn(`replace-refetch: fetchByTag failed for tag in workspace "${e.workspaceId}":`,a);return}if(!n||e.disposed||!e.remoteTags.has(t)||n.kind==="bundle")return;let r=n.fileName,o=n.content,s;try{s=Ce(await yn(o))}catch(a){console.warn(`replace-refetch: gunzip/decode of "${r}" failed (likely forged peer payload):`,a);return}if(e.disposed||!e.remoteTags.has(t))return;let i=gn(s);if(!i.recognized){console.warn(`replace-refetch: peer-uploaded replacement for "${r}" did not analyze as a recognized report \u2014 refusing to overwrite local copy`);return}try{if(await bn(r,o),e.disposed)return;pn(r,i.count,i.source),typeof n.version=="number"&&e.localVersions.set(t,n.version),Fe(e.workspaceId,e)}catch(a){console.warn(`replace-refetch: saveFileBytes failed for "${r}":`,a);return}if(!e.disposed)for(let a of Ye)try{a(e.workspaceId,r)}catch{}}async function Ws(e,t,n,r,o){if(e.disposed||!e.remoteTags.has(t))return;let s;try{s=await Ze()}catch(c){console.warn(`auto-download: listBundles failed before saving bundle "${n}":`,c);return}if(e.disposed||!e.remoteTags.has(t))return;if(s.some(c=>c.integrity===n)){try{await fn(n,e.workspaceId)}catch(p){console.warn("auto-download: attach pre-existing bundle failed:",p);return}if(e.disposed)return;let c=s.find(p=>p.integrity===n)?.name??"";for(let p of Xe)try{p(e.workspaceId,n,c)}catch{}return}let i=await an(o);if(e.disposed||!e.remoteTags.has(t))return;if(i!==n){console.warn(`auto-download: bundle integrity mismatch (claimed ${n}, got ${i}) \u2014 refusing to save`);return}let a=r&&r.length>0?r:`bundle-${n.slice(7,15)}`,f=Ir(a);try{if(await mn(f,o),e.disposed||!e.remoteTags.has(t))return;await fn(n,e.workspaceId)}catch(c){console.warn(`auto-download: persisting bundle "${n}" to workspace "${e.workspaceId}" failed:`,c);return}if(!e.disposed)for(let c of Xe)try{c(e.workspaceId,n,f)}catch{}}async function Pe(e){if(e.ready&&!e.session&&await e.ready,!e.session)throw new Error(`Objstore session is not connected${Rs(e.err)}`)}async function xt(e){let t=await e(null);return!t.ok&&t.reason==="conflict"&&t.current&&(t=await e(t.current)),t}async function Vs(e,t){let n=W.get(e);if(!n)throw new Error(`Workspace ${e} is not open`);return await Pe(n),n.session.fetch(t)}async function Fr(e,t,n){let r=W.get(e);if(!r)throw new Error(`Workspace ${e} is not open`);await Pe(r);let o=await xt(s=>r.session.put({fileName:t,content:n,prev:s}));if(o.ok&&r.keys&&!r.disposed)try{let s=r.fileTags.get(t)??await fe(r.keys.tagKey,t);r.fileTags.set(t,s),r.remoteVersions.set(s,o.meta.version),r.localVersions.set(s,o.meta.version),Fe(r.workspaceId,r)}catch{}return o}async function zs(e,t){let n=!1;W.has(e)||(Ie(e),n=!0);try{let r=W.get(e);if(!r)throw new Error(`Workspace ${e} could not be opened \u2014 not in listWorkspaces()?`);if(await Pe(r),!r.keys)throw new Error("Objstore session keys missing \u2014 derivation failed during open");r.fileTags.has(t)||r.fileTags.set(t,await fe(r.keys.tagKey,t));let o=r.fileTags.get(t),s=await xt(i=>r.session.delete(t,i));return s.ok&&(r.remoteTags.delete(o),r.remoteNameByTag.delete(o),r.remoteVersions.delete(o),r.localVersions.delete(o),me()),s}finally{n&&Qe(e)}}async function Dr(e,t){let n=W.get(e);if(!n)throw new Error(`Workspace ${e} is not open`);await Pe(n);let r=await hn(t),i=(await Ze()).find(a=>a.integrity===t)?.name??`bundle-${t.slice(7,15)}`;return await xt(a=>n.session.putBundle({integrity:t,name:i,content:r,prev:a}))}async function qs(e,t){let n=W.get(e);if(!n)throw new Error(`Workspace ${e} is not open`);await Pe(n);let r=await n.session.fetchBundle(t);if(!r)return{ok:!1,reason:"not-found"};if(await an(r.content)!==t)return{ok:!1,reason:"integrity-mismatch"};let s=r.name&&r.name.length>0?r.name:`bundle-${t.slice(7,15)}`,i=Ir(s);await mn(i,r.content);for(let a of Xe)try{a(e,t,i)}catch{}return{ok:!0,integrity:t,name:i}}async function Gs(e,t){let n=!1;W.has(e)||(Ie(e),n=!0);try{let r=W.get(e);if(!r)throw new Error(`Workspace ${e} could not be opened \u2014 not in listWorkspaces()?`);if(await Pe(r),!r.keys)throw new Error("Objstore session keys missing \u2014 derivation failed during open");r.bundleTags.has(t)||r.bundleTags.set(t,await ye(r.keys.tagKey,t));let o=r.bundleTags.get(t),s=await xt(i=>r.session.deleteBundle(t,i));return s.ok&&(r.remoteTags.delete(o),r.remoteBundleByTag.delete(o),me()),s}finally{n&&Qe(e)}}async function Js(e,{onList:t,onItem:n}={}){let r=W.get(e);if(!r)throw new Error(`Workspace ${e} is not open`);if(await Pe(r),!r.keys)throw new Error("Objstore session keys missing \u2014 derivation failed during open");let o=r.keys.tagKey,s=new Set,i=r.session.onDeleted(a=>{s.add(a.resourceTag)});try{let a=await Ys(r,e),f=await oi(),c=await si(),p=new Map;for(let y of f)p.set(await fe(o,y),y);let w=new Map;for(let y of c)w.set(await ye(o,y.integrity),y.integrity);let x=a.map(y=>{let T=p.get(y.resourceTag),E=w.get(y.resourceTag);return{resourceTag:y.resourceTag,kind:ti(r,y.resourceTag,T,E),label:ni(r,y.resourceTag,T,E),contentLength:y.contentLength,reportName:T,bundleIntegrity:E,identifier:T??E,status:"checking"}});if(typeof t=="function")try{t(x.map(ln))}catch{}let A={good:0,reuploaded:0,failed:0,"check-failed":0,missing:0};for(let y of x)if(y.status=await Qs(r,e,y,s),A[y.status]+=1,typeof n=="function")try{n(ln(y))}catch{}return{items:x.map(ln),counts:A}}finally{i()}}async function Ys(e,t){try{let n=ve.ensureSubscription(t);if(n){let r=await ri(n.resources,1e4);if(Array.isArray(r))return Xs(r)}}catch(n){console.warn(`objstore-recovery: fresh DB listing for ${t} failed; using cached inventory:`,n)}try{return(await e.session.list()).map(n=>({resourceTag:n.resourceTag,contentLength:n.contentLength}))}catch{return[]}}function Xs(e){let t=[];for(let n of e)!n||typeof n!="object"||typeof n.resourceTag=="string"&&t.push({resourceTag:n.resourceTag,contentLength:Number.isSafeInteger(n.contentLength)?n.contentLength:null});return t}async function Qs(e,t,n,r){let o;try{o=await e.session.fetchByTag(n.resourceTag)}catch(s){return n.detail=`verification fetch failed: ${s?.message??String(s)}`,"check-failed"}return o?(o.kind==="report"?(n.kind="report",n.label=o.fileName,n.identifier=o.fileName):(n.kind="bundle",n.label=o.name??n.label,n.bundleIntegrity=o.integrity,n.identifier=o.integrity),"good"):r.has(n.resourceTag)?"missing":n.reportName!==void 0?await Zs(t,n,r):n.bundleIntegrity!==void 0?await ei(t,n,r):"missing"}async function Zs(e,t,n){let r;try{r=await Mr(t.reportName)}catch{return"missing"}if(t.contentLength==null||qn(t.reportName,r.length)!==t.contentLength||n.has(t.resourceTag))return"missing";try{let o=await Fr(e,t.reportName,r);return o&&o.ok?"reuploaded":(t.detail=`re-upload rejected: ${o?.reason??"unknown"}`,"failed")}catch(o){return t.detail=`re-upload error: ${o?.message??String(o)}`,console.warn(`objstore-recovery: re-upload of "${t.reportName}" failed:`,o),"failed"}}async function ei(e,t,n){try{await hn(t.bundleIntegrity)}catch{return"missing"}if(n.has(t.resourceTag))return"missing";try{let r=await Dr(e,t.bundleIntegrity);return r&&r.ok?"reuploaded":(t.detail=`re-upload rejected: ${r?.reason??"unknown"}`,"failed")}catch(r){return t.detail=`re-upload error: ${r?.message??String(r)}`,console.warn(`objstore-recovery: bundle re-upload of "${t.bundleIntegrity}" failed:`,r),"failed"}}function ti(e,t,n,r){return n!==void 0?"report":r!==void 0||e.remoteBundleByTag.has(t)?"bundle":e.remoteNameByTag.has(t)?"report":"unknown"}function ni(e,t,n,r){if(n!==void 0)return n;if(r!==void 0)return e.remoteBundleNameByIntegrity.get(r)??r;let o=e.remoteNameByTag.get(t);if(o!==void 0)return o;let s=e.remoteBundleByTag.get(t);return s!==void 0?e.remoteBundleNameByIntegrity.get(s)??s:`${t.slice(0,10)}\u2026`}function ln(e){return{resourceTag:e.resourceTag,kind:e.kind,label:e.label,status:e.status,identifier:e.identifier,detail:e.detail}}function ri(e,t){let n,r=Promise.resolve(e);r.catch(()=>{});let o=new Promise((s,i)=>{n=setTimeout(()=>i(new Error(`objstore-recovery: timed out after ${t}ms`)),t)});return Promise.race([r,o]).finally(()=>clearTimeout(n))}async function oi(){try{return await Tt()}catch(e){return console.warn("objstore-recovery: listFiles failed; treating as no local reports:",e),[]}}async function si(){try{return await Ze()}catch(e){return console.warn("objstore-recovery: listBundles failed; treating as no local bundles:",e),[]}}export{Qe as closeWorkspace,Gs as deleteBundleFromRemote,zs as deleteFromRemote,$s as discoverRemoteBundleIntegrities,Ds as discoverRemoteFileNames,qs as fetchBundleFromRemote,Vs as fetchFile,Do as installSyncHost,Ls as isBundleInRemote,Cs as isInRemote,Ms as onAutoDownloaded,Is as onBundleAutoDownloaded,Ks as onChange,Ie as openWorkspace,Os as openWorkspaceIds,Dr as putBundleToRemote,Fr as putFile,Js as recheckRemoteStorage,Hs as remoteBundleName,Fs as remoteCount,Es as setAuthenticationResolver,xs as setHydrationConflictResolver,Ts as setRedraw,ve as triageSync};
9
+ `))>=0;){let e=this.buf.slice(0,n);this.buf=this.buf.slice(n+2);let r=``,i=[];for(let t of e.split(`
10
+ `))if(!t.startsWith(`:`)){if(t.startsWith(`event:`)){r=t.slice(6).trim();continue}if(t.startsWith(`data:`)){i.push(t.slice(5).replace(/^ /u,``));continue}}i.length!==0&&t.push({event:r,data:i.join(`
11
+ `)})}return t}},At=class e extends EventTarget{static CONNECTING=0;static OPEN=1;static CLOSING=2;static CLOSED=3;CONNECTING=e.CONNECTING;OPEN=e.OPEN;CLOSING=e.CLOSING;CLOSED=e.CLOSED;readyState=e.CONNECTING;baseUrl;sessionId=null;cachedPassword=null;outbound=[];flushTimer=null;inFlightPost=null;activeReaders=new Set;fetchAbort=new AbortController;postSeq=0;lastDispatchedSeq=0;downstreamWatchdog=null;constructor(e){super(),this.baseUrl=wt(e),this.scheduleFlush(!0)}send(t){if(this.readyState===e.CLOSED)throw Error(`sse-transport: send on closed transport`);let n;try{n=JSON.parse(t)}catch(e){throw Error(`sse-transport: send received non-JSON payload: ${e.message}`,{cause:e})}if(n.type===`authenticate`&&typeof n.password==`string`){this.cachedPassword=n.password,this.scheduleFlush();return}this.outbound.push(n),this.scheduleFlush()}close(){this.shutdown()}scheduleFlush(t=!1){if(this.readyState===e.CLOSED)return;if(this.flushTimer!=null){if(t)clearTimeout(this.flushTimer),this.flushTimer=null;else return}let n=t?0:Et;this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush()},n)}armDownstreamWatchdog(){this.readyState!==e.CLOSED&&(this.downstreamWatchdog!=null&&clearTimeout(this.downstreamWatchdog),this.downstreamWatchdog=setTimeout(()=>{this.downstreamWatchdog=null,this.readyState!==e.CLOSED&&(console.warn(`sse-transport: no downstream activity within the liveness window; reconnecting`),this.shutdown())},Ot),this.downstreamWatchdog.unref?.())}async flush(){if(this.readyState===e.CLOSED)return;if(this.inFlightPost){let e=new Promise(e=>{setTimeout(e,Dt)});await Promise.race([this.inFlightPost.catch(()=>{}),e])}if(this.readyState===e.CLOSED)return;let t=this.outbound;this.outbound=[];let n={};this.sessionId!=null&&(n.id=this.sessionId),this.cachedPassword!=null&&(n.password=this.cachedPassword),t.length>0&&(n.frames=t);let r=this.baseUrl,i=++this.postSeq;this.armDownstreamWatchdog();let a=(async()=>{let t;try{t=await fetch(r,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n),credentials:`same-origin`,signal:this.fetchAbort.signal})}catch(t){this.readyState!==e.CLOSED&&console.warn(`sse-transport: POST failed:`,t),this.shutdown();return}if(!t.ok){this.readyState!==e.CLOSED&&console.warn(`sse-transport: POST ${t.status} ${t.statusText}; closing`),this.shutdown();return}let a=t.body;if(!a){this.shutdown();return}this.consumeStream(a,i)})();this.inFlightPost=a,a.finally(()=>{this.inFlightPost===a&&(this.inFlightPost=null)})}async consumeStream(t,n){let r=t.getReader();this.activeReaders.add(r);let i=new kt,a=new TextDecoder,o=!1;try{for(;;){let{value:t,done:s}=await r.read();if(s){o=!0;break}if(this.readyState===e.CLOSED)return;n===this.postSeq&&this.armDownstreamWatchdog();let c=i.parse(a.decode(t,{stream:!0}));for(let e of c)this.dispatchOrderedEvent(e,n)}if(this.readyState!==e.CLOSED){let e=a.decode();if(e.length>0)for(let t of i.parse(e))this.dispatchOrderedEvent(t,n)}o&&this.readyState!==e.CLOSED&&n===this.postSeq&&(console.warn(`sse-transport: live downstream closed without a close frame; reconnecting`),this.shutdown())}catch(t){this.readyState!==e.CLOSED&&n===this.postSeq&&(console.warn(`sse-transport: stream read failed:`,t),this.shutdown())}finally{this.activeReaders.delete(r);try{r.releaseLock()}catch{}}}dispatchOrderedEvent(t,n){if(this.readyState!==e.CLOSED){if(n<this.lastDispatchedSeq){this.shutdown();return}this.lastDispatchedSeq=n,this.dispatchEvent_(t)}}dispatchEvent_(t){if(t.event===`session`){if(this.readyState===e.CLOSED)return;this.sessionId=t.data,this.readyState===e.CONNECTING&&(this.readyState=e.OPEN,this.dispatchEvent(new Event(`open`)));return}if(t.event===`close`){let e,n;try{let r=JSON.parse(t.data);typeof r.code==`number`&&(e=r.code),typeof r.reason==`string`&&(n=r.reason)}catch{}this.shutdown(e,n);return}if(t.event===``||t.event===`message`){if(this.readyState!==e.OPEN)return;this.dispatchEvent(new MessageEvent(`message`,{data:t.data}))}}shutdown(t,n){if(this.readyState===e.CLOSED)return;this.readyState=e.CLOSING,this.flushTimer!=null&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.downstreamWatchdog!=null&&(clearTimeout(this.downstreamWatchdog),this.downstreamWatchdog=null);try{this.fetchAbort.abort()}catch{}for(let e of this.activeReaders)try{e.cancel().catch(()=>{})}catch{}this.activeReaders.clear(),this.readyState=e.CLOSED;let r=new Event(`close`);t!=null&&(r.code=t),n!=null&&(r.reason=n),this.dispatchEvent(r)}},jt=1e3,Mt=3e4,Nt=3e4,Pt=`session restarted`;function Ft(e){let t=e.serverUrl,n=e.pingIntervalMs??15e3,r=e.pongTimeoutMs??5e3,i=null,a=!1,o=null,s=0,c=!1,l=!1,u=null,d=jt,f=null,p=null,m=null,h=null,g=!1,_=null,v=new Set;function y(){u&&=(clearTimeout(u),null)}function b(){f&&=(clearTimeout(f),null)}function x(){y(),!c&&(l||s!==0&&t&&(u=setTimeout(()=>{u=null,N()},Math.round(d*(.5+Math.random()*.5))),d=Math.min(d*2,Mt)))}function S(){C(),!(n<=0)&&(a||(p=setInterval(()=>{!i||i.readyState!==i.OPEN||m||(k({type:`ping`}),m=setTimeout(()=>{m=null,console.warn(`socket-transport: heartbeat timeout; closing socket`);try{i?.close()}catch{}},r))},n)))}function C(){p&&=(clearInterval(p),null),m&&=(clearTimeout(m),null)}function w(e){for(let t of v)try{t.onDisconnected(e)}catch(e){console.warn(`socket-transport: consumer.onDisconnected threw:`,e)}}function T(e){for(let t of v)try{t.onConnected(e)}catch(e){console.warn(`socket-transport: consumer.onConnected threw:`,e)}}function E(e){for(let t of v)try{t.onMessage(e)}catch(e){console.warn(`socket-transport: consumer.onMessage threw:`,e)}}function D(e){let t;try{let n=typeof e.data==`string`?e.data:new TextDecoder().decode(e.data);t=JSON.parse(n)}catch(e){console.warn(`socket-transport: dropping malformed wire frame:`,e);return}if(t&&typeof t==`object`){if(t.type===`pong`){m&&=(clearTimeout(m),null);return}if(t.type===`challenge`){if(typeof t.nonce!=`string`)return;o!=null&&o!==t.nonce&&w(Pt),o=t.nonce,T(o);return}if(t.type===`authenticated`){O(!0),E(t);return}if(t.type===`unauthorized`&&t.kind===`auth-failed`){O(!1);return}E(t)}}function O(e){if(!_)return;let t=_;_=null,t(e)}function k(e){if(!i||i.readyState!==i.OPEN)return!1;try{return i.send(JSON.stringify(e)),!0}catch(e){return console.warn(`socket-transport: send failed:`,e),!1}}function A(e){return new Promise(t=>{_=t,k({type:`authenticate`,password:e})||(_=null,t(!1))})}function j(){if(h)return h;if(!i||i.readyState!==i.OPEN)return Promise.resolve(!1);let t=i,n=(async()=>{await Promise.resolve();try{let n=bt();if(n!=null&&!g){g=!0;let e=await A(n);if(i!==t)return!1;if(e)return!0;try{await St(null)}catch(e){console.warn(`socket-transport: failed to clear cached auth password:`,e)}}let r=!0;for(;;){if(i!==t||!i||i.readyState!==i.OPEN||!e.authResolver)return!1;let n;try{n=await e.authResolver({retry:!r})}catch(e){return console.warn(`socket-transport: authentication resolver threw:`,e),!1}if(i!==t||(r=!1,n==null||n===``))return!1;let a=await A(n);if(i!==t)return!1;if(a){try{await St(n)}catch(e){console.warn(`socket-transport: failed to cache auth password:`,e)}return!0}}}finally{h=null}})();return h=n,n}function M(e){if(b(),!i)return;let t=i;i=null,o=null,g=!1,O(!1),C(),w(e);try{t.close()}catch{}}function N(){c||l||i||s!==0&&t&&P(!1)}function P(e){if(c||l||s===0||!t)return;let n;try{n=e?new At(t):new WebSocket(t)}catch(t){if(!e){console.warn(`socket-transport: WebSocket constructor failed; trying SSE fallback:`,t),P(!0);return}console.warn(`socket-transport: SSE constructor failed:`,t),x();return}i=n,a=e,o=null,g=!1;let r=!1;n.addEventListener(`open`,()=>{i===n&&(r=!0,b(),f=setTimeout(()=>{f=null,i===n&&(d=jt)},Nt),f.unref?.(),S())}),n.addEventListener(`message`,e=>{i===n&&D(e)}),n.addEventListener(`close`,t=>{if(i===n){if(b(),i=null,o=null,g=!1,O(!1),C(),!r&&!e&&!c&&s>0){if(typeof fetch>`u`){w(`socket closed`),x();return}console.warn(`socket-transport: WebSocket failed to open; falling back to SSE`),P(!0);return}t?.code===1001&&(d=jt),w(`socket closed`),!c&&s>0&&x()}}),n.addEventListener(`error`,()=>{})}function F(){if(c)return{release(){}};s+=1,s===1&&!i&&N();let e=!1;return{release(){e||(e=!0,!c&&(--s,s===0&&(y(),d=jt,M(`released`))))}}}function I(e){e!==t&&(y(),d=jt,t=e,i&&M(`serverUrl changed`),s>0&&t&&N())}function L(e){v.add(e);let t=!1;return{remove(){t||(t=!0,v.delete(e))}}}function R(){c||(c=!0,y(),M(`transport closed`),v.clear(),s=0)}function z(e){let{pingMs:t,pongMs:i}=e;typeof t==`number`&&t>=0&&(n=t),typeof i==`number`&&i>0&&(r=i),p&&S()}function ee(){g=!1}function te(e){e!==l&&(l=e,e?(y(),M(`protocol-locked`)):s>0&&t&&N())}return{acquire:F,setServerUrl:I,addConsumer:L,send:k,getNonce:()=>o,getSocket:()=>i,isSse:()=>i!=null&&a,runAuthFlow:j,close:R,setProtocolLocked:te,setHeartbeatTimings:z,resetCachedReplayGuard:ee}}var It=64,Lt=5,Rt=6,zt=25,Bt=500;function Vt(e,t){if(!/^\/api\/objstore\/[\w-]+\/[\w-]+$/u.test(e))throw TypeError(`objstore: urlPath rejected (unexpected shape): ${JSON.stringify(e)}`);let n=new URL(t).origin,r=new URL(e,n);if(r.origin!==n)throw TypeError(`objstore: urlPath origin mismatch \u2014 expected ${n}, got ${r.origin}`);return r.href}function Ht(e){let t=e.requestTimeoutMs??1e4,n=new URL(e.httpOrigin).origin,u=e.transport===void 0,d=e.transport??Ft(e.authResolver===void 0?{serverUrl:e.serverUrl}:{serverUrl:e.serverUrl,authResolver:e.authResolver}),f=!1,p=new Map,m=new Map,h=[],g=[];function _(e,t,n,r){let i=e.seenVersions.get(t);(!i||i.incarnation!==n||r>i.version)&&e.seenVersions.set(t,{incarnation:n,version:r})}function v(e){e.connectedPromise=new Promise((t,n)=>{e.resolveConnected=t,e.rejectConnected=n}),e.connectedPromise.catch(()=>{})}function y(e){e.listedPromise=new Promise((t,n)=>{e.resolveListed=t,e.rejectListed=n}),e.listedPromise.catch(()=>{})}function b(e,t){let n=new Map(e.inventory),r=e.inventorySeeded;e.inventorySeeded=!0,e.inventory.clear();for(let r of t){let t=e.inventory.get(r.resourceTag)??n.get(r.resourceTag),i=t?.incarnation===r.incarnation&&t.version>=r.version?t:{version:r.version,incarnation:r.incarnation,contentLength:r.contentLength};e.inventory.set(r.resourceTag,i),_(e,r.resourceTag,i.incarnation,i.version)}if(e.resolveListed(),r){for(let[t,r]of n){let n=e.inventory.get(t);if(n?.incarnation!==r.incarnation){n||e.seenVersions.delete(t);for(let n of e.deletedHandlers)try{n({resourceTag:t,version:r.version})}catch{}}}for(let[t,r]of e.inventory){let i=n.get(t);if(i?.version===r.version&&i.incarnation===r.incarnation)continue;let a={resourceTag:t,version:r.version,incarnation:r.incarnation,contentLength:r.contentLength};for(let t of e.putHandlers)try{t(a)}catch{}}}}function x(e){if(!Array.isArray(e))return[];let t=[];for(let n of e)Gt(n)&&t.push(Kt(n));return t}function S(e){let n;return new Promise((r,i)=>{n=setTimeout(()=>i(Error(`objstore: inventory not seeded (no subscribe ack) after ${t}ms`)),t),e.listedPromise.then(r,i)}).finally(()=>clearTimeout(n))}function C(e){for(let t=0;t<h.length;t++)if(e(h[t]))return Promise.resolve(h.splice(t,1)[0]);return new Promise((n,r)=>{let i={predicate:e,resolve:()=>{},reject:e=>{clearTimeout(a);let t=g.indexOf(i);t>=0&&g.splice(t,1),r(e)}},a=setTimeout(()=>i.reject(Error(`objstore: response timeout after ${t}ms`)),t);i.resolve=e=>{clearTimeout(a),n(e)},g.push(i)})}function w(e){if(!d.send(e))throw Error(`objstore: socket not open`)}function T(e){for(let t of g.splice(0))try{t.reject(Error(`objstore: ${e}`))}catch{}}function E(e){if(e.type===`workspace-subscribed`&&typeof e.workspaceTag==`string`){let t=p.get(e.workspaceTag);t&&Array.isArray(e.resources)&&b(t,x(e.resources));return}if(e.type===`objstore-put`&&typeof e.workspaceTag==`string`&&Gt(e)){let t=p.get(e.workspaceTag);if(!t)return;let n=Kt(e),r=t.inventory.get(n.resourceTag);if(r?.incarnation===n.incarnation&&r.version>n.version)return;_(t,n.resourceTag,n.incarnation,n.version),t.inventory.set(n.resourceTag,{version:n.version,incarnation:n.incarnation,contentLength:n.contentLength});let i={resourceTag:n.resourceTag,version:n.version,incarnation:n.incarnation,contentLength:n.contentLength};for(let e of t.putHandlers)try{e(i)}catch{}return}if(e.type===`objstore-deleted`&&typeof e.workspaceTag==`string`&&typeof e.resourceTag==`string`&&typeof e.version==`number`){let t=p.get(e.workspaceTag);if(!t)return;let n=e.resourceTag,r=e.version,i=e.incarnation;if(i!==void 0){if(typeof i!=`string`||i.length===0)return;let e=t.inventory.get(n)??t.seenVersions.get(n);if(e&&(i!==e.incarnation||e.version>r))return}t.seenVersions.delete(n),t.inventory.delete(n);let a={resourceTag:n,version:r};for(let e of t.deletedHandlers)try{e(a)}catch{}return}if(e.type!==`workspace-state`&&e.type!==`workspace-save-ack`&&e.type!==`workspace-save-error`&&e.type!==`workspace-subscribed`&&e.type!==`authenticated`&&e.type!==`server-info`){for(let t=0;t<g.length;t++)if(g[t].predicate(e)){let n=g[t];g.splice(t,1),n.resolve(e);return}if(h.push(e),h.length>It){let e=h.splice(0,h.length-It),t=[...new Set(e.map(e=>e.type??`<no-type>`))].slice(0,4);console.warn(`objstore: dropping ${e.length} unmatched frame(s) over MAX_QUEUE_SIZE=${It} (types: ${t.join(`, `)})`)}}}function D(){for(let e of p.values())e.closed||e.connected||(e.connected=!0,e.resolveConnected())}function O(e){T(e);for(let e of p.values())e.closed||e.connected&&(e.connected=!1,v(e))}let k=d.addConsumer({onMessage:E,onConnected:D,onDisconnected:O}),A=e=>Vt(e,n),j=(e,t)=>A(`/api/objstore/${e}/${t}`);async function M(e,t,n){let i=d.getNonce();if(!i)throw Error(`objstore: socket not open`);let a=await r(e.signingKey,n,i),o,s=!1;for(;w({type:`objstore-put-begin`,...n,signature:a}),o=await C(n=>n.workspaceTag===e.workspaceTag&&n.resourceTag===t&&(n.type===`objstore-put-token`||n.type===`objstore-put-error`||n.type===`objstore-conflict`||n.type===`unauthorized`&&n.kind===`gated`)),!(o.type!==`unauthorized`||s||(s=!0,!await d.runAuthFlow())););if(o.type===`unauthorized`)return{kind:`unauthorized`};if(o.type===`objstore-put-error`){if(o.reason===`workspace-full`)return{kind:`workspace-full`};throw Error(`objstore: put-error reason='${String(o.reason)}'`)}if(o.type===`objstore-conflict`)return{kind:`conflict`,current:Gt(o.current)?Kt(o.current):null};if(typeof o.urlPath!=`string`||typeof o.token!=`string`)throw TypeError(`objstore: malformed put-token (missing urlPath/token)`);return{kind:`token`,urlPath:o.urlPath,token:o.token}}async function N(e,t,n,r){let i=Date.now(),a=await s(e.signingKey,n,i),o=await globalThis.fetch(j(e.workspaceTag,t),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({op:`put`,ts:i,signature:a,prevVersion:n.prevVersion,prevIncarnation:n.prevIncarnation,expectedLength:n.expectedLength,contentHash:r})});if(o.status===401)return{kind:`unauthorized`};if(o.status===403)return{kind:`workspace-full`};if(o.status===409)return{kind:`conflict`,current:await Ut(o)};if(!o.ok){let e=``;try{e=await o.text()}catch{}throw Error(`objstore: REST put-begin failed ${o.status} ${e.slice(0,200)}`)}let c;try{c=await o.json()}catch{throw TypeError(`objstore: put-mint JSON parse failed`)}if(!c||typeof c!=`object`||typeof c.urlPath!=`string`||typeof c.token!=`string`)throw TypeError(`objstore: malformed put-mint (missing urlPath/token)`);return{kind:`token`,urlPath:c.urlPath,token:c.token}}async function P(e,t){let n=`objstore: ${Pt}`;for(let r=0;;r++)try{return await t()}catch(t){if(r<Lt&&!e.closed&&t instanceof Error&&t.message===n)continue;throw t}}function F(e,t){return P(e,()=>I(e,t))}async function I(e,t){if(await e.connectedPromise,e.closed)throw Error(`objstore: session closed`);let n=await l(t.bytes),r={workspaceTag:e.workspaceTag,resourceTag:t.resourceTag,prevVersion:t.prev?.version??null,prevIncarnation:t.prev?.incarnation??null,expectedLength:t.bytes.byteLength,contentHash:n},i;if(d.isSse()?(i=await N(e,t.resourceTag,r,n),i.kind===`unauthorized`&&(i=await M(e,t.resourceTag,r))):i=await M(e,t.resourceTag,r),i.kind===`unauthorized`)return{ok:!1,reason:`unauthorized`};if(i.kind===`workspace-full`)return{ok:!1,reason:`workspace-full`};if(i.kind===`conflict`)return{ok:!1,reason:`conflict`,current:i.current};let a=await globalThis.fetch(A(i.urlPath),{method:`PUT`,headers:{authorization:`Bearer ${i.token}`,"content-type":`application/octet-stream`},body:t.bytes});if(!a.ok){if(a.status===409||a.status===410)return{ok:!1,reason:`conflict`,current:a.status===409?await Ut(a):null};let e=``;try{e=await a.text()}catch{}throw Error(`objstore: REST PUT failed ${a.status} ${e.slice(0,200)}`)}let o;try{o=await a.json()}catch{throw TypeError(`objstore: PUT ack JSON parse failed`)}if(!o||typeof o!=`object`||!Wt(o.version)||typeof o.incarnation!=`string`||typeof o.contentHash!=`string`||!Wt(o.contentLength))throw TypeError(`objstore: PUT ack malformed (missing/invalid version/incarnation/contentHash/contentLength)`);let s=o;if(s.contentHash!==n||s.contentLength!==t.bytes.byteLength)throw Error(`objstore: PUT ack mismatch \u2014 server returned contentHash=${s.contentHash.slice(0,16)}\u2026 length=${s.contentLength}, client signed ${n.slice(0,16)}\u2026 length=${t.bytes.byteLength}`);return{ok:!0,meta:s}}async function L(e,t){let n=d.getNonce();if(!n)throw Error(`objstore: socket not open`);let r=await a(e.signingKey,e.workspaceTag,t,n);w({type:`objstore-fetch`,workspaceTag:e.workspaceTag,resourceTag:t,signature:r});let i=await C(n=>n.workspaceTag===e.workspaceTag&&n.resourceTag===t&&(n.type===`objstore-fetch-token`||n.type===`objstore-fetch-not-found`));if(i.type===`objstore-fetch-not-found`)return{kind:`not-found`};if(typeof i.urlPath!=`string`||typeof i.token!=`string`||!Gt(i))throw TypeError(`objstore: malformed fetch-token (missing urlPath / token / metadata)`);return{kind:`token`,urlPath:i.urlPath,token:i.token,meta:Kt(i)}}async function R(e,t){let n=Date.now(),r=await o(e.signingKey,e.workspaceTag,t,n),i=await globalThis.fetch(j(e.workspaceTag,t),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({op:`fetch`,ts:n,signature:r})});if(i.status===404)return{kind:`not-found`};if(i.status===401)return{kind:`unauthorized`};if(!i.ok){let e=``;try{e=await i.text()}catch{}throw Error(`objstore: REST fetch-mint failed ${i.status} ${e.slice(0,200)}`)}let a;try{a=await i.json()}catch{throw TypeError(`objstore: fetch-mint JSON parse failed`)}if(!a||typeof a!=`object`||typeof a.urlPath!=`string`||typeof a.token!=`string`||!Gt(a))throw TypeError(`objstore: malformed fetch-mint (missing urlPath / token / metadata)`);return{kind:`token`,urlPath:a.urlPath,token:a.token,meta:Kt(a)}}async function z(e,t){for(let n=0;n<Rt;n++){let r=await P(e,()=>ee(e,t));if(r.kind===`ok`)return r.value;if(r.kind===`not-found`)return null;if(n+1<Rt){let e=Math.min(Bt,zt*2**n);await new Promise(t=>{setTimeout(t,e)})}}return null}async function ee(e,t){if(await e.connectedPromise,e.closed)throw Error(`objstore: session closed`);let n;if(d.isSse()?(n=await R(e,t),n.kind===`unauthorized`&&(n=await L(e,t))):n=await L(e,t),n.kind===`not-found`)return{kind:`not-found`};if(n.kind===`unauthorized`)throw Error(`objstore: fetch-mint unauthorized`);let r=n.meta,i=await globalThis.fetch(A(n.urlPath),{method:`GET`,headers:{authorization:`Bearer ${n.token}`}});if(!i.ok){if(i.status===404||i.status===503)return{kind:`retry`};let e=``;try{e=await i.text()}catch{}throw Error(`objstore: REST GET failed ${i.status} ${e.slice(0,200)}`)}let a=new Uint8Array(await i.arrayBuffer()),o=await l(a);if(o!==r.contentHash)throw Error(`objstore: contentHash mismatch \u2014 expected ${r.contentHash.slice(0,16)}\u2026, got ${o.slice(0,16)}\u2026`);return{kind:`ok`,value:{bytes:a,meta:r}}}async function te(e,t){let n=d.getNonce();if(!n)throw Error(`objstore: socket not open`);let r=await i(e.signingKey,t,n);w({type:`objstore-delete`,...t,signature:r});let a=await C(n=>n.workspaceTag===e.workspaceTag&&n.resourceTag===t.resourceTag&&(n.type===`objstore-deleted-ack`||n.type===`objstore-delete-error`||n.type===`objstore-conflict`));if(a.type===`objstore-deleted-ack`){if(typeof a.deletedVersion!=`number`)throw TypeError(`objstore: malformed deleted-ack (deletedVersion not a number)`);return{kind:`ok`,deletedVersion:a.deletedVersion}}if(a.type===`objstore-conflict`)return{kind:`conflict`,current:Gt(a.current)?Kt(a.current):null};if(a.reason===`not-found`)return{kind:`not-found`};throw Error(`objstore: delete-error reason='${String(a.reason)}'`)}async function ne(e,t,n){let r=Date.now(),i=await c(e.signingKey,n,r),a=await globalThis.fetch(j(e.workspaceTag,t),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({op:`delete`,ts:r,signature:i,prevVersion:n.prevVersion,prevIncarnation:n.prevIncarnation})});if(a.status===401)return{kind:`unauthorized`};if(a.status===404)return{kind:`not-found`};if(a.status===409)return{kind:`conflict`,current:await Ut(a)};if(!a.ok){let e=``;try{e=await a.text()}catch{}throw Error(`objstore: REST delete failed ${a.status} ${e.slice(0,200)}`)}let o;try{o=await a.json()}catch{throw TypeError(`objstore: delete-ack JSON parse failed`)}if(!o||typeof o!=`object`||typeof o.deletedVersion!=`number`)throw TypeError(`objstore: malformed delete-ack (deletedVersion not a number)`);return{kind:`ok`,deletedVersion:o.deletedVersion}}function B(e,t,n){return P(e,()=>re(e,t,n))}async function re(e,t,n){if(await e.connectedPromise,e.closed)throw Error(`objstore: session closed`);let r={workspaceTag:e.workspaceTag,resourceTag:t,prevVersion:n?.version??null,prevIncarnation:n?.incarnation??null},i;if(d.isSse()?(i=await ne(e,t,r),i.kind===`unauthorized`&&(i=await te(e,r))):i=await te(e,r),i.kind===`ok`)return{ok:!0,deletedVersion:i.deletedVersion};if(i.kind===`conflict`)return{ok:!1,reason:`conflict`,current:i.current};if(i.kind===`not-found`)return{ok:!1,reason:`not-found`};throw Error(`objstore: delete unauthorized`)}function ie(e,t,n,r){let i=e.seenVersions.get(t);if(i&&i.incarnation===n&&r<i.version)throw Error(`objstore: version-rollback rejected \u2014 fetched v${r} for an incarnation we've already seen at v${i.version}`)}async function ae(e,n){if(f)throw Error(`objstore: client closed`);if(!n||typeof n.workspaceId!=`string`)throw Error(`objstore: openWorkspace requires a WorkspaceSubscription (triageSync.ensureSubscription) — the client must not open a session for a tag with no backing sync subscribe`);let r=e.workspaceTag;if(n.workspaceTag!=null&&n.workspaceTag!==r)throw Error(`objstore: openWorkspace — WorkspaceSubscription is for a different workspace than these keys`);if(p.has(r))throw Error(`objstore: workspace ${r.slice(0,8)}\u2026 is already open on this client`);let i={workspaceTag:r,signingKey:e.signingKey,contentKey:new Uint8Array(e.contentKey),tagKey:new Uint8Array(e.tagKey),putHandlers:new Set,deletedHandlers:new Set,seenVersions:new Map,inventory:new Map,inventorySeeded:!1,connected:!1,closed:!1};v(i),y(i),p.set(r,i);let a=i;(async()=>{let e;try{e=await n.resources}catch{return}!a.closed&&!a.inventorySeeded&&b(a,x(e))})();let o=d.acquire();m.set(r,o),d.getNonce()&&(a.connected=!0,a.resolveConnected());let s=null;try{await new Promise((e,n)=>{s=setTimeout(()=>{n(Error(`objstore: connect timeout after ${t}ms`))},t),a.connectedPromise.then(()=>e(),e=>n(e))})}catch(e){s&&clearTimeout(s),p.delete(r),m.delete(r),a.closed=!0;try{a.contentKey.fill(0)}catch{}try{a.tagKey.fill(0)}catch{}throw o.release(),e}s&&clearTimeout(s);async function c(e,t,n){let r=await F(a,{resourceTag:e,bytes:t,prev:n});return r.ok?(n??a.seenVersions.delete(e),_(a,e,r.meta.incarnation,r.meta.version),a.inventory.set(e,{version:r.meta.version,incarnation:r.meta.incarnation,contentLength:r.meta.contentLength}),{ok:!0,meta:{version:r.meta.version,incarnation:r.meta.incarnation,contentLength:r.meta.contentLength}}):r.reason===`workspace-full`?{ok:!1,reason:`workspace-full`}:r.reason===`unauthorized`?{ok:!1,reason:`unauthorized`}:(r.current&&_(a,e,r.current.incarnation,r.current.version),{ok:!1,reason:`conflict`,current:r.current})}async function l(e){let t=await U(a.tagKey,e.fileName);return await c(t,ct(a.contentKey,e.fileName,e.content,r,t),e.prev)}async function u(e){let t=await U(a.tagKey,e),n=await z(a,t);if(!n)return null;ie(a,t,n.meta.incarnation,n.meta.version);let{fileName:i,content:o}=ft(a.contentKey,n.bytes,r,t);if(i!==e)throw Error(`objstore: fileName-binding mismatch \u2014 requested '${e}', payload encoded '${i}'`);return _(a,t,n.meta.incarnation,n.meta.version),{content:o,version:n.meta.version,incarnation:n.meta.incarnation}}async function h(e){let t=await z(a,e);if(!t)return null;ie(a,e,t.meta.incarnation,t.meta.version);let{fileName:n,content:i}=ft(a.contentKey,t.bytes,r,e);if(await U(a.tagKey,n)===e)return _(a,e,t.meta.incarnation,t.meta.version),{kind:`report`,fileName:n,content:i,version:t.meta.version,incarnation:t.meta.incarnation};if(await st(a.tagKey,n)===e){let{name:r,content:o}=dt(i);return _(a,e,t.meta.incarnation,t.meta.version),{kind:`bundle`,integrity:n,name:r,content:o,version:t.meta.version,incarnation:t.meta.incarnation}}throw Error(`objstore: fetchByTag — decrypted name does not derive back to the requested resourceTag under either the report or bundle tag scheme (relay or workspace member produced a non-round-trippable tag-name pair)`)}async function g(e,t){let n=await B(a,e,t);return n.ok?(a.seenVersions.delete(e),a.inventory.delete(e),n):n.reason===`not-found`?{ok:!1,reason:`not-found`}:(n.current&&_(a,e,n.current.incarnation,n.current.version),{ok:!1,reason:`conflict`,current:n.current})}async function C(e,t){return await g(await U(a.tagKey,e),t)}async function w(){if(await S(a),a.closed)throw Error(`objstore: session closed`);return[...a.inventory.entries()].map(([e,t])=>({resourceTag:e,version:t.version,incarnation:t.incarnation,contentLength:t.contentLength}))}async function T(e){let t=await st(a.tagKey,e.integrity),n=ut(e.name,e.content);return await c(t,ct(a.contentKey,e.integrity,n,r,t),e.prev)}async function E(e){let t=await st(a.tagKey,e),n=await z(a,t);if(!n)return null;ie(a,t,n.meta.incarnation,n.meta.version);let{fileName:i,content:o}=ft(a.contentKey,n.bytes,r,t);if(i!==e)throw Error(`objstore: bundle-integrity binding mismatch \u2014 requested '${e}', payload encoded '${i}'`);let{name:s,content:c}=dt(o);return _(a,t,n.meta.incarnation,n.meta.version),{name:s,content:c,version:n.meta.version,incarnation:n.meta.incarnation}}async function D(e,t){return await g(await st(a.tagKey,e),t)}return{put:l,fetch:u,fetchByTag:h,delete:C,list:w,putBundle:T,fetchBundle:E,deleteBundle:D,onPut(e){return a.putHandlers.add(e),()=>{a.putHandlers.delete(e)}},onDeleted(e){return a.deletedHandlers.add(e),()=>{a.deletedHandlers.delete(e)}},close(){if(a.closed)return;a.closed=!0,p.delete(r);try{a.contentKey.fill(0)}catch{}try{a.tagKey.fill(0)}catch{}try{a.rejectConnected(Error(`objstore: session closed`))}catch{}try{a.rejectListed(Error(`objstore: session closed`))}catch{}let e=m.get(r);m.delete(r),e&&e.release()}}}function oe(){if(!f){f=!0;for(let e of p.values()){e.closed=!0;try{e.contentKey.fill(0)}catch{}try{e.tagKey.fill(0)}catch{}try{e.rejectConnected(Error(`objstore: client closed`))}catch{}try{e.rejectListed(Error(`objstore: client closed`))}catch{}}p.clear();for(let e of m.values())e.release();m.clear(),k.remove(),u&&d.close()}}return{openWorkspace:ae,close:oe}}async function Ut(e){try{let t=await e.json();if(Wt(t.currentVersion)&&typeof t.currentIncarnation==`string`)return{version:t.currentVersion,incarnation:t.currentIncarnation}}catch{}return null}function Wt(e){return typeof e==`number`&&Number.isSafeInteger(e)&&e>=0}function Gt(e){return!e||typeof e!=`object`?!1:typeof e.resourceTag==`string`&&Wt(e.version)&&typeof e.incarnation==`string`&&typeof e.contentHash==`string`&&Wt(e.contentLength)&&typeof e.signature==`string`}function Kt(e){return{resourceTag:e.resourceTag,version:e.version,incarnation:e.incarnation,contentHash:e.contentHash,contentLength:e.contentLength,signature:e.signature}}var qt=null;function Jt(e){qt=typeof e==`function`?e:null}var Yt=Ft({serverUrl:``,authResolver:e=>qt==null?Promise.resolve(null):qt(e)});function Xt(){return Yt}var Zt=new Set([`busy`]);function Qt(e){return typeof e?.color==`string`?e.color:``}function $t(e){return u(e??void 0)??``}function en(e){return typeof e?.comment==`string`?e.comment:``}function tn(e){return typeof e?.fix==`string`?e.fix:``}function nn(e){return e?.flagged===!0?`flagged`:e?.flagged===!1?`not flagged`:``}function rn(e,t,n,r){let i=[];for(let a of Object.keys(e)){let o=e[a],s=t[a],c=n[a],l=o??null,u=[{name:`color`,norm:Qt},{name:`triage`,norm:$t},{name:`comment`,norm:en},{name:`fix`,norm:tn},{name:`flagged`,norm:nn}];for(let{name:e,norm:t}of u){let n=t(s),o=t(l),u=t(c);(o!==n||r?.has(a))&&u!==n&&o!==u&&i.push({id:a,property:e,local:o,imported:u})}}return i}function an(e,t){let n=Array.isArray(e)?e:[],r=Array.isArray(t)?t:[];if(n.length!==r.length)return!1;if(n.length===0)return!0;let i=new Set(n);for(let e of r)if(!i.has(e))return!1;return!0}function on(e,t){let n=e.triage??(e.deleted?`deleted`:``),r=t.triage??(t.deleted?`deleted`:``);return e.color===t.color&&n===r&&(e.comment??``)===(t.comment??``)&&(e.fix??``)===(t.fix??``)&&e.flagged===t.flagged&&an(e.ignoredReports,t.ignoredReports)&&an(e.scopedIgnoredReports,t.scopedIgnoredReports)}function sn(e,t){let n=new Set([...Object.keys(e),...Object.keys(t)]);for(let r of n)if(!on(e[r]??{},t[r]??{}))return!1;return!0}function cn(e=[],t=[],n=[]){let r=new Set(e),i=new Set(t),a=new Set(n);for(let e of r)i.has(e)||a.delete(e);for(let e of i)r.has(e)||a.add(e);return[...a]}function ln(e,t,n,r){let i=Object.assign(Object.create(null),n);for(let a of new Set([...Object.keys(e),...Object.keys(t),...r??[]])){let o=r?.has(a),s=p(e[a])??{},c=p(t[a])??{},l={...p(n[a])};for(let e of[`color`,`comment`,`fix`,`flagged`])(s[e]!==c[e]||o)&&Object.assign(l,{[e]:c[e]});if(o||s.triage!==c.triage||!an(s.ignoredReports,c.ignoredReports)){let e=!o&&d(c)&&d(l),t=e?cn(s.ignoredReports,c.ignoredReports,l.ignoredReports):c.ignoredReports??[];(!e||s.triage!==c.triage)&&(c.triage===void 0?delete l.triage:l.triage=c.triage),t.length===0?delete l.ignoredReports:l.ignoredReports=t}l.scopedIgnoredReports=[...new Set([...c.scopedIgnoredReports??[],...l.scopedIgnoredReports??[]])];let u=p(l);u?i[a]=u:delete i[a]}return i}function un(e,t){let n=Object.assign(Object.create(null),e);for(let[e,r]of Object.entries(t))r===null?delete n[e]:r!==void 0&&(n[e]=r);return n}function dn(e,t){let n=Object.create(null),r=new Set([...Object.keys(e),...Object.keys(t)]);for(let i of r)on(e[i]??{},t[i]??{})||(n[i]=t[i]??null);return n}function fn(e){for(let t in e)return!1;return!0}function pn(e,t){let n=Object.assign(Object.create(null),e),r=gt().state,i=t instanceof Set?t:new Set(t);for(let e of i){let t=p(r.triage.get(e));t?n[e]=t:delete n[e]}return n}function mn(e,t){let n=gt().state,r=[];for(let i of t){let t=e[i];if(!t||typeof t!=`object`)continue;let a=n.triage.get(i);if(t.color){let e=a?.color;e===void 0?m(n.triage,i,{color:t.color}):e!==t.color&&r.push({id:i,property:`color`,local:e,imported:t.color})}let o=u(t);if(o){let e=u(a);e===void 0?m(n.triage,i,{triage:o}):e!==o&&r.push({id:i,property:`triage`,local:e,imported:o})}if(t.comment){let e=a?.comment;e===void 0?m(n.triage,i,{comment:t.comment}):e!==t.comment&&r.push({id:i,property:`comment`,local:e,imported:t.comment})}if(t.fix){let e=a?.fix;e===void 0?m(n.triage,i,{fix:t.fix}):e!==t.fix&&r.push({id:i,property:`fix`,local:e,imported:t.fix})}if(typeof t.flagged==`boolean`){let e=a?.flagged;e===void 0?m(n.triage,i,{flagged:t.flagged}):e!==t.flagged&&r.push({id:i,property:`flagged`,local:e?`flagged`:`not flagged`,imported:t.flagged?`flagged`:`not flagged`})}if(d(t)&&d(a)&&Array.isArray(t.ignoredReports))for(let e of t.ignoredReports)typeof e==`string`&&((a?.ignoredReports?.length??0)>0&&!a?.ignoredReports?.includes(e)||g(n.triage,i,e,!0,f(t,e)))}return r}function hn(e,t){let n=gt().state;for(let r of e)t[`${r.id}:${r.property}`]===`imported`&&gn(r.id,r.property)===r.local&&(r.property===`color`?m(n.triage,r.id,{color:r.imported}):r.property===`comment`?m(n.triage,r.id,{comment:r.imported}):r.property===`fix`?m(n.triage,r.id,{fix:r.imported}):r.property===`triage`?r.imported===`inprogress`||r.imported===`fixed`||r.imported===`invalid`||r.imported===`deleted`||r.imported===`ignored`?m(n.triage,r.id,{triage:r.imported,...r.imported===`ignored`?{}:{ignoredReports:void 0}}):m(n.triage,r.id,{triage:void 0}):r.property===`flagged`&&m(n.triage,r.id,{flagged:r.imported===`flagged`||r.imported!==`not flagged`&&void 0}))}function gn(e,t){let n=gt().state.triage.get(e);return t===`color`?n?.color??``:t===`triage`?u(n)??``:t===`comment`?n?.comment??``:t===`fix`?n?.fix??``:t===`flagged`?n?.flagged===!0?`flagged`:n?.flagged===!1?`not flagged`:``:``}function _n(e,t){let n=gt().state,r=t instanceof Set?t:new Set(t);for(let t of r){let r=e[t],i=d(r)?r?.ignoredReports:void 0;h(n.triage,t,{...r,ignoredReports:i})}}var vn=`deepview.sync.sessions`,yn=vn,bn=1,xn=!1,Sn=new Set;function Cn(){return xn}function wn(e){if(xn!==e){xn=e,console.warn(e?`triage-sync: can't persist the sessions blob — either it's an unrecognised future version (writes skipped to avoid clobbering a newer build's data) or the write itself failed (storage full / vault locked). Your in-memory triage state still works this session but will not persist across reload. Free up storage and/or clear localStorage[deepview.sync.sessions]; the badge clears on the next successful save.`:`triage-sync: persistence recovered; persisted-sessions blob is now writable.`);for(let t of Sn)try{t(e)}catch(e){console.warn(`persistenceDegraded listener:`,e)}}}function Tn(e){let t=t=>e(t);return Sn.add(t),queueMicrotask(()=>{if(Sn.has(t))try{t(xn)}catch(e){console.warn(`persistenceDegraded listener:`,e)}}),()=>Sn.delete(t)}function En(){try{let e=gt().getSecureItem(vn);if(!e)return{kind:`empty`};let t=JSON.parse(e);if(!t||typeof t!=`object`)return{kind:`empty`};let n=t;return n.version===bn&&n.sessions&&typeof n.sessions==`object`&&!Array.isArray(n.sessions)?{kind:`v1`,map:n.sessions}:n.version===bn?{kind:`empty`}:`version`in n?{kind:`unknown-version`}:{kind:`legacy`,map:n}}catch{return{kind:`empty`}}}function Dn(){let e=En();return e.kind===`v1`||e.kind===`legacy`?e.map:{}}async function On(e){try{return await gt().setSecureItem(vn,JSON.stringify({version:bn,sessions:e})),!0}catch(e){return console.warn(`Triage sync: could not persist session state:`,e),!1}}function kn(e,t){if(!t)return null;let n=Dn()[e];return!n||n.serverUrl!==t?null:{baseRevision:typeof n.baseRevision==`string`?n.baseRevision:null,...n.hasBase===!0?{hasBase:!0}:{},baseState:n.baseState&&typeof n.baseState==`object`?Object.assign(Object.create(null),n.baseState):Object.create(null),savesSinceKeyframe:typeof n.savesSinceKeyframe==`number`?n.savesSinceKeyframe:0}}async function An(e){await navigator.locks.request(yn,async()=>{let t=En();if(t.kind===`unknown-version`){wn(!0);return}let n=t.kind===`v1`||t.kind===`legacy`?t.map:{};await e(n)!==!1&&wn(!await On(n))})}function jn(e=null){An(t=>{let n=Object.keys(t);if(n.length===0)return!1;let r=new Set(gt().listWorkspaces().map(e=>e.id)),i=!1;for(let a of n){let n=t[a];(!r.has(a)||e!=null&&n?.serverUrl!==e)&&(delete t[a],i=!0)}return i?void 0:!1}).catch(e=>{console.warn(`Triage sync: prunePersistedSessions lock failed:`,e)})}function Mn(e){return An(t=>{if(!(e in t))return!1;delete t[e]})}var Nn=!1,Pn=new Set;function Fn(){return Nn}function In(e){if(Nn!==e){Nn=e,e&&console.warn(`triage-sync: the sync relay appears to sit behind an authentication proxy (e.g. Cloudflare Access) and this session is no longer authorised — reconnects are being redirected to the proxy login. Reload the page to sign in again.`);for(let t of Pn)try{t(e)}catch(e){console.warn(`proxyAuthRequired listener:`,e)}}}function Ln(e){let t=t=>e(t);return Pn.add(t),queueMicrotask(()=>{if(Pn.has(t))try{t(Nn)}catch(e){console.warn(`proxyAuthRequired listener:`,e)}}),()=>Pn.delete(t)}async function Rn(e){if(typeof fetch>`u`||!e)return!1;let t;try{t=wt(e)}catch{return!1}let n;try{n=await fetch(t,{method:`GET`,redirect:`manual`,credentials:`same-origin`,cache:`no-store`})}catch{return!1}return n.type===`opaqueredirect`}var zn,Bn,Vn,Hn,Un,Wn=`deepview.triageSyncUrl`,Gn=`deepview.sync.userEnabled`,Kn=/^\d+$/u,qn=()=>{},Jn=null,W=``,Yn=!0,Xn=!1,G=Xt(),Zn=null,Qn=100,$n=5,er=2e3;function tr(){return Yn&&!Xn&&!!W&&nr()}function nr(){try{return Bn().length>0}catch{return!1}}var rr=new Set,ir=new Set,ar=null;function or(t){let n=e(t);if(n!=null){ar=n;for(let e of ir)try{e(n)}catch(e){console.warn(`Triage sync: onServerInfo listener failed:`,e)}}}function sr(){if(!tr())return`off`;for(let e of q.values())if(e.error)return`error`;let e=G.getSocket();if(!e||e.readyState!==WebSocket.OPEN)return`offline`;for(let e of q.values())if(!e.subscribeAcked)return`connecting`;return`online`}var cr=`off`;function K(){let e=sr();if(e!==cr){cr=e,vr(e);for(let t of rr)try{t(e)}catch(e){console.warn(`Triage sync status listener:`,e)}}}var lr=6e3,ur=3e4,dr=null,fr=!1,pr=0;function mr(e){return e===`offline`||e===`connecting`}function hr(){pr+=1,dr!=null&&(clearTimeout(dr),dr=null)}function gr(e){hr(),dr=setTimeout(()=>{dr=null,_r()},e),dr.unref?.()}async function _r(){if(fr||!tr()||!mr(sr()))return;let e=pr;fr=!0;let t=!1;try{t=await Rn(W)}catch{t=!1}finally{fr=!1}if(pr===e){if(!tr()||!mr(sr())){In(!1);return}if(t){In(!0);return}gr(ur)}}function vr(e){mr(e)?dr==null&&!fr&&!Fn()&&gr(lr):(hr(),In(!1))}var yr=0,q=new Map;function br(e){for(let t of q.values())if(t.workspaceTag===e)return t;return null}function J(e){return q.get(e.workspaceId)===e}function xr(e){e.busyRetryTimer??(e.busyRetryTimer=setTimeout(()=>{e.busyRetryTimer=null,J(e)&&(e.error||e.pending||!e.pendingSave||(e.pendingSave=!1,Y(e)))},er),e.busyRetryTimer.unref?.())}function Sr(e){e.busyRetryTimer!=null&&(clearTimeout(e.busyRetryTimer),e.busyRetryTimer=null)}function Cr(e){if(e.appliedRevisions.clear(),Sr(e),e.key){try{e.key.fill(0)}catch{}e.key=null}if(e.signingKey=null,e.verifyingKey=null,e.objstoreResourceWaiters.length>0){let t=e.objstoreResourceWaiters.splice(0);for(let e of t)try{e([])}catch{}}}function wr(e){let t=new Set,n=Bn().find(t=>t.id===e);if(!n)return t;let r=new Set(n.reports??[]);for(let e of zn.reports)if(r.has(e.fileName))for(let n of e.groups)for(let e of n){let n=e.id??String(e._id);Kn.test(n)||t.add(n)}return t}function Tr(e){let t=wr(e.workspaceId),n=[];for(let r of t)e.ids.has(r)||n.push(r);let r=[];return n.length>0&&(r=mn(e.baseState,n)),e.ids=t,{conflicts:r,hydrated:n.length>0}}function Er(){let e=En();e.kind===`unknown-version`?wn(!0):(e.kind===`v1`||e.kind===`legacy`)&&wn(!1),xt(),G.resetCachedReplayGuard()}function Dr(e){if(!e||!W)return;let t=W,n=e.generation,r={serverUrl:t,baseRevision:e.baseRevision,savesSinceKeyframe:e.savesSinceKeyframe??0,baseState:e.baseState,...e.baseRevision===null&&e.hasBase?{hasBase:!0}:{}};An(i=>{if(!J(e)||e.generation!==n||W!==t)return!1;i[e.workspaceId]=r}).catch(e=>{console.warn(`Triage sync: persistSession lock failed:`,e)})}function Or(e){let t=Bn().find(t=>t.id===e.workspaceId);if(!t){e.error=`workspace no longer exists`,K();return}let n=(e.keyDerivationGen??0)+1;e.keyDerivationGen=n,(async()=>{try{let[r,i]=await Promise.all([Ne(t.privateKey),Pe(t.privateKey,e.workspaceId)]);if(q.get(e.workspaceId)!==e||e.keyDerivationGen!==n)return;if(e.key=r,e.signingKey=i.privateKey,e.verifyingKey=i.publicKey,e.workspaceTag=i.publicKeyB64,G.getSocket()?.readyState!==WebSocket.OPEN){qr();return}Mr(e),Y(e),K()}catch(t){console.warn(`Triage sync: key derivation failed:`,t),q.get(e.workspaceId)===e&&e.keyDerivationGen===n&&(e.error=`key derivation failed: ${t instanceof Error?t.message:String(t)}`,K())}})()}function kr(e){return G.send(e)}function Ar(e,t){if(!G.isSse()){kr(t);return}let n=e.generation,r=e.pending,i=()=>J(e)&&e.generation===n&&e.pending===r;jr(t,i).then(e=>(e&&i()&&kr(t),null)).catch(()=>{i()&&kr(t)})}async function jr(e,t){if(!W)return!0;let n;try{n=Tt(W)}catch{return!0}let r;try{r=await globalThis.fetch(n,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),signal:AbortSignal.timeout(3e4)})}catch{return!0}if(!t())return!1;let i=e.workspaceTag,a=e.base??null;if(r.status===401)return!0;if(r.ok){let e=null;try{e=await r.json()}catch{return!0}return t()?!e||typeof e.id!=`string`||(Wr({type:`workspace-save-ack`,workspaceTag:i,base:a,id:e.id},t),!1):!1}if(r.status===409){let e=null;try{e=await r.json()}catch{return!0}return t()?(Wr({type:`workspace-state`,workspaceTag:i,revisions:e&&Array.isArray(e.revisions)?e.revisions:[]},t),Wr({type:`workspace-save-error`,workspaceTag:i,base:a,reason:`stale-base`},t),!1):!1}return r.status!==413||(Wr({type:`workspace-save-error`,workspaceTag:i,base:a,reason:`too-large`},t),!1)}function Mr(e,t=!1){if(!J(e)||!tr())return;let n=G.getSocket();if(!n||n.readyState!==WebSocket.OPEN||!t&&e.subscribed||!e.signingKey||!e.workspaceTag)return;let r=G.getNonce();if(r==null)return;let i=e.baseRevision,a=n,o=e.signingKey,s=e.workspaceTag,c=e.generation;(async()=>{try{let t=await Be(o,s,i,r);if(q.get(e.workspaceId)!==e||e.generation!==c||e.workspaceTag!==s||G.getSocket()!==a||G.getNonce()!==r)return;e.subscribed=!0,kr({type:`workspace-subscribe`,workspaceTag:s,from:i,signature:t})}catch(e){console.warn(`Triage sync: subscribe sign failed:`,e)}})()}function Y(e){if(!J(e)||!tr()||e.error)return;if(e.pending||e.encrypting||e.receiving){e.pendingSave=!0;return}if(!e.key||!e.signingKey||!e.workspaceTag){e.pendingSave=!0;return}Tr(e),e.localState=pn(e.baseState,e.ids);let t=G.getSocket();if(!t||t.readyState!==WebSocket.OPEN)return;let n=(e.savesSinceKeyframe??0)>=Qn,r=dn(n?Object.create(null):e.baseState,e.localState);if(fn(r)&&!n)return;let i=e.baseRevision,a=e.key,o=e.signingKey,s=e.workspaceTag,c=e.generation;e.encrypting=!0,(async()=>{try{let t=Ue(s,i),{nonce:l,ciphertext:u}=await Ze(a,r,t),d={publicKeyB64:s,base:i,keyframe:n,nonceB64:l,ciphertextB64:u},f=await Le(o,d),p=await Re(d);if(q.get(e.workspaceId)!==e||e.generation!==c||e.workspaceTag!==s)return;if(e.baseRevision!==i||e.receiving){e.pendingSave=!0;return}e.pending={base:i,id:p,changeset:r,keyframe:n},e.pendingSave=!1;let m={type:`workspace-save`,workspaceTag:s,base:i,nonce:l,ciphertext:u,signature:f};n&&(m.keyframe=!0),Ar(e,m),e.consecutiveFailures=0,e.error&&(e.error=null,K())}catch(t){console.warn(`Triage sync: encrypt/sign failed:`,t),J(e)&&e.generation===c&&(e.consecutiveFailures=(e.consecutiveFailures??0)+1,e.consecutiveFailures>=$n&&(e.error=`encrypt/sign failed: ${t instanceof Error?t.message:String(t)}`,K()))}finally{J(e)&&e.generation===c&&(e.encrypting=!1,!e.error&&e.pendingSave&&!e.pending&&!e.receiving&&(e.pendingSave=!1,Y(e)))}})()}async function Nr(e,t,n,r){for(let i of t){if(!i||typeof i!=`object`||typeof i.id==`string`&&(i.id===e.baseRevision||e.appliedRevisions.has(i.id)||r.has(i.id)))continue;let t=e.baseRevision,a=i.keyframe===!0;if(!(t==null?i.base==null||a:i.base===t))return console.warn(`Triage sync: chain base mismatch (expected ${t}, got ${i.base})`),!1;if(typeof i.signature!=`string`||typeof i.nonce!=`string`||typeof i.ciphertext!=`string`||typeof i.id!=`string`)return console.warn(`Triage sync: revision missing signature/nonce/ciphertext/id; resyncing`),e.savesSinceKeyframe=Qn,!1;if(!e.workspaceTag||!e.verifyingKey||!e.key)return!1;let o=typeof i.base==`string`?i.base:null,s={publicKeyB64:e.workspaceTag,base:o,keyframe:a,nonceB64:i.nonce,ciphertextB64:i.ciphertext},c=await Ve(e.verifyingKey,s,i.signature);if(!n())return!1;if(!c)return console.warn(`Triage sync: revision signature did not verify; resyncing`),e.savesSinceKeyframe=Qn,!1;let l=await Re(s);if(!n())return!1;if(i.id!==l)return console.warn(`Triage sync: revision id does not match content hash; resyncing`),e.savesSinceKeyframe=Qn,!1;let u;try{let t=Ue(e.workspaceTag,o);u=await Qe(e.key,i.nonce,i.ciphertext,t)}catch(t){return console.warn(`Triage sync: decrypt failed; resyncing`,t),e.savesSinceKeyframe=Qn,!1}if(!n())return!1;e.baseState=un(a?Object.create(null):e.baseState,u??{}),e.baseRevision=i.id,e.appliedRevisions.add(i.id),e.pending?.id===i.id&&(e.pending=null),e.savesSinceKeyframe=a?0:Math.min((e.savesSinceKeyframe??0)+1,Qn)}return!0}async function Pr(e,t,n=[],r=null){if(!J(e))return;let i=e.generation;e.localState=un(e.baseState,t),yr++;try{_n(e.localState,e.ids),r&&n.length>0&&(hn(n.filter(({id:t})=>e.ids.has(t)),r),e.localState=pn(e.baseState,e.ids)),Dr(e),await Vn()}finally{yr--}if(J(e)&&e.generation===i){e.localState=pn(e.baseState,e.ids),qn();for(let t of q.values())t!==e&&Y(t)}}function Fr(e){return Tr(e),e.localState=pn(e.baseState,e.ids),dn(e.baseState,e.localState)}async function Ir(e,t){let n=e.generation;if(e.pending&&t.base===e.pending.base&&typeof t.id==`string`&&t.id===e.pending.id){Fr(e);let r=e.localState;if(e.baseState=un(e.pending.keyframe?Object.create(null):e.baseState,e.pending.changeset),e.baseRevision=t.id,e.hasBase=!0,e.appliedRevisions.add(t.id),e.savesSinceKeyframe=e.pending.keyframe?0:Math.min((e.savesSinceKeyframe??0)+1,Qn),e.pending=null,e.staleResetAttempted=!1,await Pr(e,dn(e.baseState,r)),!J(e)||e.generation!==n)return;(e.pendingSave||!sn(e.localState,e.baseState))&&(e.pendingSave=!1,Y(e));return}if(e.pending){let n=typeof t.id==`string`?t.id.slice(0,8):String(t.id);console.warn(`Triage sync: ack mismatch (pending ${e.pending.base}/${e.pending.id.slice(0,8)}, ack ${t.base}/${n})`);return}if(t.id!==e.baseRevision){let n=typeof t.id==`string`?t.id.slice(0,8):String(t.id);console.warn(`Triage sync: late ack for base=${t.base} id=${n}\u2026; pending was already cleared`),e.pendingSave=!0,Y(e)}}async function Lr(e,t){if(!Array.isArray(t)||!e.key)return;if(t.length===0){e.resyncAttempted&&(e.resyncAttempted=!1,e.pending||(e.pendingSave=!1,Y(e)));return}let n=e.generation,r=e.workspaceTag,i=()=>J(e)&&e.generation===n&&e.workspaceTag===r;e.receiving=!0;try{Fr(e);let n=e.baseState,r=e.pending,a=e.baseRevision,o={...e,appliedRevisions:new Set},s=await Nr(o,t,i,e.appliedRevisions);if(!i())return;if(o.baseRevision!==a){let t=r&&o.pending===null?un(r.keyframe?Object.create(null):n,r.changeset):n;Fr(e);let s=dn(t,e.localState),c=a===null&&!(r&&o.pending===null)?new Set([...Object.keys(t),...e.hasBase?e.ids:[]]):void 0;if(c)for(let t of c)s[t]=e.localState[t]??null;let l=rn(s,t,o.baseState,c).filter(({id:t})=>e.ids.has(t)),u=null;if(l.length>0&&Jn){try{u=await Jn(l,o.baseState,`chain`)??null}catch(e){console.warn(`Triage sync: chain-conflict resolver failed:`,e)}if(!i())return}Fr(e);let d=ln(t,e.localState,o.baseState,c);e.baseRevision=o.baseRevision,e.hasBase=!0;for(let t of o.appliedRevisions)e.appliedRevisions.add(t);if(e.baseState=o.baseState,e.savesSinceKeyframe=o.savesSinceKeyframe,e.pending&&(e.pendingSave=!0),e.pending=null,await Pr(e,dn(e.baseState,d),l,u),!i())return}else e.savesSinceKeyframe=o.savesSinceKeyframe;if(!s){if(e.pendingSave=!1,!e.resyncAttempted){e.resyncAttempted=!0,Mr(e,!0);return}console.warn(`Triage sync: catch-up also broke continuity; full state push`),e.baseRevision=null,e.appliedRevisions.clear(),e.savesSinceKeyframe=Qn,e.pending=null,e.resyncAttempted=!1,e.pendingSave=!0,Dr(e),qn();return}e.resyncAttempted=!1,e.staleResetAttempted=!1,sn(e.localState,e.baseState)||(e.pendingSave=!0)}finally{i()&&(e.receiving=!1,e.pendingSave&&!e.pending&&!e.error&&(e.pendingSave=!1,Y(e)))}}async function Rr(e){if(e.type===`server-info`){or(e);return}if(e.type===`authenticated`){for(let e of q.values())Mr(e),Y(e);return}if(e.type===`unauthorized`){if(e.kind===`gated`){if(typeof e.workspaceTag==`string`){let t=br(e.workspaceTag);t&&typeof e.resourceTag!=`string`&&zr(t,e)}G.runAuthFlow().catch(e=>{console.warn(`Triage sync: auth flow failed:`,e)})}return}if(typeof e.workspaceTag!=`string`)return;let t=br(e.workspaceTag);if(t){if(e.type===`workspace-save-ack`)await Ir(t,e);else if(e.type===`workspace-state`)await Lr(t,e.revisions);else if(e.type===`workspace-save-error`)Vr(t,e);else if(e.type===`workspace-subscribed`){if(t.subscribeAcked=!0,Array.isArray(e.resources)){let n=e.resources,r=t.objstoreResourceWaiters.splice(0);for(let e of r)try{e(n)}catch{}}K()}}}function zr(e,t){e.pending&&(typeof t.base!=`string`&&t.base!==null||t.base===e.pending.base&&(e.pending=null,e.pendingSave=!0))}var Br=/^[\w-]+$/u;function Vr(e,t){if(!e.pending||typeof t.base!=`string`&&t.base!==null||t.base!==e.pending.base)return;let n=t.reason,r=typeof n==`string`&&n.length>0&&n.length<=64&&Br.test(n)?n:`rejected`;if(e.pending=null,Zt.has(r)){e.pendingSave=!0,xr(e);return}if(r===`stale-base`&&!e.staleResetAttempted){e.staleResetAttempted=!0,console.warn(`Triage sync: stale-base catch-up did not apply (server chain gone or rebuilt past our base); full state push`),e.baseRevision=null,e.appliedRevisions.clear(),e.savesSinceKeyframe=Qn,e.pendingSave=!1,e.resyncAttempted=!1,Dr(e),qn(),Y(e);return}e.consecutiveFailures=(e.consecutiveFailures??0)+1,e.error=`server rejected save: ${r}`,K()}var Hr=Promise.resolve(),Ur=0;function Wr(e,t=()=>!0){let n=Ur,r=typeof e.workspaceTag==`string`?br(e.workspaceTag):null;if(typeof e.workspaceTag==`string`&&!r)return;let i=r?.generation;Hr=Hr.then(()=>{if(t()&&Ur===n&&(!r||J(r)&&r.generation===i))return Rr(e)}).catch(e=>{console.warn(`Triage sync handler error:`,e)})}function Gr(e){for(let e of q.values())e.pending=null,e.pendingSave=!1,Mr(e),Y(e);K()}function Kr(e){Ur++,Hr=Promise.resolve();for(let e of q.values())e.generation++,e.encrypting=!1,e.receiving=!1,e.pending=null,e.subscribed=!1,e.subscribeAcked=!1,e.resyncAttempted=!1,e.staleResetAttempted=!1,e.pendingSave=!0,Sr(e);K()}G.addConsumer({onMessage:Wr,onConnected:Gr,onDisconnected:Kr});function qr(){tr()?Zn||=G.acquire():Zn&&=(Zn.release(),null)}function Jr(e){qn=typeof e==`function`?e:()=>{}}function Yr(e){Jn=typeof e==`function`?e:null}function Xr(e){Jt(e)}function Zr(e){let t=e.error!=null;e.error=null,e.consecutiveFailures=0,t&&(!e.key||!e.signingKey)&&Or(e)}function Qr(e){e.generation++,e.receiving=!1,e.pending=null,e.pendingSave=!1,e.encrypting=!1,e.subscribed=!1,e.subscribeAcked=!1,e.resyncAttempted=!1,e.staleResetAttempted=!1,Sr(e)}var $r={setServerUrl(e){let t=(e??``).trim();if(t===W)return;let n=W;Ur++,Hr=Promise.resolve(),W=t,hr(),In(!1),t&&jn(t),n&&t&&n!==t&&St(null).catch(e=>{console.warn(`Triage sync: failed to drop cached auth password on server change:`,e)}),G.setServerUrl(t);for(let e of q.values()){Qr(e);let n=t?kn(e.workspaceId,t):null;e.baseRevision=n?.baseRevision??null,e.appliedRevisions.clear(),e.baseState=n?.baseState??Object.create(null),e.hasBase=n?.hasBase===!0||e.baseRevision!==null||Object.keys(e.baseState).length>0,e.savesSinceKeyframe=n?.savesSinceKeyframe??0,e.localState=pn(e.baseState,e.ids),Zr(e)}qr(),K()},setEnabled(e){let t=!!e;if(t!==Yn){if(Yn=t,Un(Gn,t?`1`:`0`).catch(e=>{console.warn(`Triage sync: could not persist user-enabled:`,e)}),tr())for(let e of q.values())Zr(e);else{Ur++,Hr=Promise.resolve();for(let e of q.values())Qr(e)}qr(),K()}},isEnabled(){return Yn},setForcedOff(e){let t=!!e;if(t!==Xn){if(Xn=t,tr())for(let e of q.values())Zr(e);else{Ur++,Hr=Promise.resolve();for(let e of q.values())Qr(e)}qr(),K()}},getServerUrl(){return W},get connected(){return G.getSocket()?.readyState===WebSocket.OPEN},get status(){return sr()},onStatusChange(e){return rr.add(e),()=>rr.delete(e)},onServerInfo(e){if(ir.add(e),ar!=null)try{e(ar)}catch{}return()=>ir.delete(e)},setProtocolLocked(e){G.setProtocolLocked(e)},notify(){if(!(yr>0))for(let e of q.values())Y(e)},ensureSubscription(e){let t=q.has(e);$r.openSession(e);let n=q.get(e);if(!n)return null;let r=new Promise(e=>{n.objstoreResourceWaiters.push(e)});return t&&Mr(n,!0),{workspaceId:e,workspaceTag:n.workspaceTag,resources:r}},openSession(e){if(!e||q.has(e)||!Bn().find(t=>t.id===e))return;let t=wr(e),n=kn(e,W),r=n?.baseState??Object.create(null);mn(r,t);let i={workspaceId:e,workspaceTag:null,signingKey:null,verifyingKey:null,ids:t,baseRevision:n?.baseRevision??null,appliedRevisions:new Set,baseState:r,hasBase:n?.hasBase===!0||n?.baseRevision!=null||Object.keys(r).length>0,savesSinceKeyframe:n?.savesSinceKeyframe??0,localState:pn(r,t),pending:null,pendingSave:!1,key:null,encrypting:!1,receiving:!1,generation:0,subscribed:!1,subscribeAcked:!1,resyncAttempted:!1,staleResetAttempted:!1,consecutiveFailures:0,error:null,busyRetryTimer:null,objstoreResourceWaiters:[]};q.set(e,i),Or(i),qr(),K()},closeSession(e){if(e==null){for(let e of q.values())Cr(e);q.clear()}else{let t=q.get(e);t&&Cr(t),q.delete(e)}K()},refreshSession(e){let t=q.get(e);if(!t){console.debug(`triage-sync: refreshSession bail — no session for`,e,`(caller must openSession first)`);return}ei(t)},sessionInfo(e){let t=q.get(e);return t?{workspaceId:t.workspaceId,workspaceTag:t.workspaceTag,baseRevision:t.baseRevision,pending:t.pending&&{base:t.pending.base,keyframe:t.pending.keyframe},pendingSave:t.pendingSave,keyReady:t.key!==null,encrypting:t.encrypting,tracked:t.ids.size,savesSinceKeyframe:t.savesSinceKeyframe??0,error:t.error??null}:null},get openSessions(){return[...q.keys()].map(e=>this.sessionInfo(e)).filter(e=>e!==null)},dismissError(e){let t=e==null?[...q.keys()]:[e],n=!1;for(let e of t){let t=q.get(e);!t||!t.error||(t.error=null,t.consecutiveFailures=0,n=!0,!t.key||!t.signingKey?Or(t):G.getSocket()?.readyState===WebSocket.OPEN&&(Mr(t),Y(t)))}n&&K()},get persistenceDegraded(){return Cn()},onPersistenceDegraded(e){return Tn(e)},get proxyAuthRequired(){return Fn()},onProxyAuthRequired(e){return Ln(e)}};_t(e=>{zn=e.state,Bn=e.listWorkspaces,Vn=e.saveTriage,Hn=e.getSecureItem,Un=e.setSecureItem,e.onSecureStorageHydrated(Er);try{localStorage.removeItem(Wn),Hn(Gn)===`0`&&(Yn=!1),qr()}catch{}e.onWorkspaceDeleted(e=>{let t=q.get(e);t&&Sr(t);let n=q.delete(e);Mn(e).catch(e=>{console.warn(`Triage sync: dropPersistedSession lock failed:`,e)}),qr(),n&&K()}),e.onWorkspacePrivateKeyChanged(e=>{let t=q.get(e);if(!t){Mn(e).catch(e=>{console.warn(`Triage sync: dropPersistedSession lock failed:`,e)});return}t.signingKey=null,t.key=null,t.verifyingKey=null,t.workspaceTag=null,Qr(t),t.keyDerivationGen=(t.keyDerivationGen??0)+1,(async()=>{await Mn(e),q.delete(e),$r.openSession(e),K()})().catch(t=>{console.warn(`Triage sync: privateKey rotation IIFE failed:`,t),q.delete(e),K()})}),e.onReportMembershipChanged(e=>{$r.openSession(e);let t=q.get(e);t&&ei(t)}),jn()});function ei(e){let t=e.generation,{conflicts:n,hydrated:r}=Tr(e);(async()=>{if(n.length===0){r?await Vn():Y(e);return}let i=null;if(Jn)try{i=await Jn(n,e.baseState,`attach`)}catch(e){console.warn(`Triage sync: hydration conflict resolver failed:`,e)}!J(e)||e.generation!==t||(i&&hn(n.filter(({id:t})=>e.ids.has(t)),i),await Vn())})().catch(e=>{console.warn(`Triage sync: refreshAndPropagate failed:`,e)})}var ti,ni,ri,ii,ai,oi,si,ci,li,ui,di,fi,X=new Map,pi=2e3,mi={setTimeout:(e,t)=>setTimeout(e,t)},hi=new Map,gi=new Set;function Z(e,n){try{let r={names:Object.fromEntries(n.remoteNameByTag),bundles:Object.fromEntries(n.remoteBundleByTag),bundleNames:Object.fromEntries(n.remoteBundleNameByIntegrity),baselines:Object.fromEntries(n.baselines),localVersions:Object.fromEntries([...n.baselines].filter(([,e])=>e.synced).map(([e,t])=>[e,t.version]))};localStorage.setItem(t(e),JSON.stringify(r))}catch(t){console.warn(`objstore-presence: cache persist failed for ${e}:`,t)}}function _i(e){try{localStorage.removeItem(t(e))}catch{}}var vi=null;function yi(e){return vi||=Ht({serverUrl:``,httpOrigin:e,transport:Xt()}),vi}var bi=new Set,xi=new Set;function Q(){for(let e of gi)try{e()}catch{}}function Si(e){if(e==null)return``;if(e instanceof Error&&e.message)return`: ${e.message}`;if(typeof e==`string`&&e)return`: ${e}`;if(typeof e==`object`&&typeof e.message==`string`&&e.message)return`: ${e.message}`;try{return`: ${String(e)}`}catch{return``}}var Ci=256;function wi(e){return typeof e==`string`?e.length<=Ci?e:e.slice(0,Ci):``}function Ti(e){try{let t=new URL(e);return t.protocol=t.protocol===`wss:`?`https:`:`http:`,t.pathname=`/`,t.search=``,t.hash=``,t.origin}catch{return null}}function Ei(e){if(X.has(e))return;let t=ti().find(t=>t.id===e);if(!t)return;let r=$r.ensureSubscription(e);if(!r)return;let i={workspaceId:e,session:null,keys:null,remoteTags:new Set,fileTags:new Map,bundleTags:new Map,remoteNameByTag:new Map,remoteBundleByTag:new Map,remoteBundleNameByIntegrity:new Map,remoteMeta:new Map,baselines:new Map,localChanged:new Set,selfWrites:new Map,selfWriteNotices:new Map,tagLocks:new Map,inFlight:new Map,err:null,disposed:!1,ready:null};X.set(e,i),i.ready=(async()=>{if(i.keys=await at(t.privateKey,t.id),i.disposed)return;let o=new Map;for(let e of t.reports??[]){let t=await U(i.keys.tagKey,e);i.fileTags.set(e,t),o.set(t,e)}if(i.disposed)return;let s=new Map;for(let e of t.bundles??[]){let t=await st(i.keys.tagKey,e);i.bundleTags.set(e,t),s.set(t,e)}if(i.disposed)return;try{let e=await si();if(i.disposed)return;for(let t of e)i.bundleTags.has(t.integrity)&&i.remoteBundleNameByIntegrity.set(t.integrity,t.name)}catch(t){console.warn(`objstore-presence: listBundles failed during ${e} open:`,t)}Q();let c=$r.getServerUrl();if(!c)return;let l=Ti(c);if(l)try{let t=await yi(l).openWorkspace(i.keys,r);if(i.disposed){try{t.close()}catch{}return}i.session=t,a();let c=await t.list();if(i.disposed)return;for(let e of c)i.remoteTags.add(e.resourceTag),Hi(i,e.resourceTag,e.version,e.incarnation);let u=n(e),d=!1;if(u)for(let[e,t]of Object.entries(u.baselines))(i.remoteTags.has(e)||o.has(e))&&i.baselines.set(e,t);for(let e of i.remoteTags){let t=o.get(e);t!==void 0&&!i.remoteNameByTag.has(e)&&(i.remoteNameByTag.set(e,t),d=!0);let n=s.get(e);if(n!==void 0&&!i.remoteBundleByTag.has(e)&&(i.remoteBundleByTag.set(e,n),d=!0),u){let t=u.names[e];typeof t==`string`&&!i.remoteNameByTag.has(e)&&!i.remoteBundleByTag.has(e)&&(i.remoteNameByTag.set(e,t),i.fileTags.set(t,e),d=!0);let n=u.bundles[e];if(typeof n==`string`&&!i.remoteBundleByTag.has(e)&&!i.remoteNameByTag.has(e)){i.remoteBundleByTag.set(e,n),i.bundleTags.set(n,e);let t=u.bundleNames[n];typeof t==`string`&&!i.remoteBundleNameByIntegrity.has(n)&&i.remoteBundleNameByIntegrity.set(n,t),d=!0}}}(d||u)&&Z(e,i),Q(),ia(i);for(let e of i.remoteTags)Ui(i.baselines.get(e),i.remoteMeta.get(e))&&ca(i,e).catch(()=>{});Qi(i).catch(()=>{})}catch(e){i.err=e}})();function a(){let t=i.session;t.onPut(({resourceTag:e,version:t,incarnation:n})=>{let r=i.remoteMeta.get(e),a=i.remoteTags.has(e)&&r!==void 0&&(r.incarnation!==n||t>r.version);if(i.remoteTags.add(e),Hi(i,e,t,n),Q(),a){ca(i,e).catch(()=>{});return}ia(i)}),t.onDeleted(({resourceTag:t})=>{i.remoteTags.delete(t),i.remoteMeta.delete(t);let n=i.remoteNameByTag.get(t);i.remoteNameByTag.delete(t);let r=ti().find(t=>t.id===e),a=r?.reports??[],o=r?.bundles??[];n&&!a.includes(n)&&i.fileTags.delete(n);let s=i.remoteBundleByTag.get(t);i.remoteBundleByTag.delete(t),s&&(i.remoteBundleNameByIntegrity.delete(s),o.includes(s)||i.bundleTags.delete(s)),Z(e,i),Q()})}i.ready.catch(()=>{})}function Di(e){let t=X.get(e);if(t){t.disposed=!0;try{t.session?.close()}catch{}if(t.keys){try{t.keys.contentKey.fill(0)}catch{}try{t.keys.tagKey.fill(0)}catch{}t.keys=null}X.delete(e),Q()}}_t(e=>{ti=e.listWorkspaces,ni=e.addReportToWorkspace,ri=e.addBundleToWorkspace,ii=e.analyzeContent,ai=e.setCount,oi=e.gunzipBytes,si=e.listBundles,ci=e.listFiles,li=e.readBundle,ui=e.readFileBytes,di=e.saveBundle,fi=e.saveFileBytes,e.onFileMutated?.((e,t)=>{for(let n of X.values()){let r=n.fileTags.get(e);if(r!==void 0){if(t===`delete`){n.localChanged.delete(r)&&Q();continue}if(n.selfWrites.has(e)){n.selfWriteNotices.set(e,(n.selfWriteNotices.get(e)??0)+1);continue}hi.has(e)||Xi(n,r,e)}}}),e.onReportMembershipChanged(e=>{X.has(e)||Ei(e);let t=X.get(e);if(!t)return;let n=ti().find(t=>t.id===e);if(n)for(let r of n.reports??[])t.fileTags.has(r)||Ai(e,r).catch(()=>{})}),e.onBundleMembershipChanged(e=>{X.has(e)||Ei(e);let t=X.get(e);if(!t)return;let n=ti().find(t=>t.id===e);if(n)for(let r of n.bundles??[])t.bundleTags.has(r)||Mi(e,r).catch(()=>{})}),e.onWorkspaceDeleted(e=>{Di(e),_i(e)}),e.onWorkspacePrivateKeyChanged(e=>{X.has(e)&&(Di(e),_i(e),Ei(e))})});function Oi(){return Array.from(X.keys())}function ki(e,t){let n=X.get(e);if(!n)return!1;let r=n.fileTags.get(t);return r?n.remoteTags.has(r):!1}async function Ai(e,t){let n=X.get(e);!n||n.fileTags.has(t)||(n.ready&&!n.keys&&await n.ready,n.keys&&(n.fileTags.set(t,await U(n.keys.tagKey,t)),n.disposed||Q()))}function ji(e,t){let n=X.get(e);if(!n)return!1;let r=n.bundleTags.get(t);return r?n.remoteTags.has(r):!1}async function Mi(e,t){let n=X.get(e);!n||n.bundleTags.has(t)||(n.ready&&!n.keys&&await n.ready,n.keys&&(n.bundleTags.set(t,await st(n.keys.tagKey,t)),n.disposed||Q()))}function Ni(e){return gi.add(e),()=>gi.delete(e)}function Pi(e){return bi.add(e),()=>bi.delete(e)}function Fi(e){return xi.add(e),()=>xi.delete(e)}function Ii(e){hi.set(e,(hi.get(e)??0)+1);let t=!1;return()=>{if(t)return;t=!0;let n=hi.get(e)-1;if(n>0){hi.set(e,n);return}hi.delete(e);for(let t of X.values()){let n=t.fileTags.get(e);n!==void 0&&Zi(t,n,e).catch(()=>{})}}}function Li(e){let t=X.get(e);return t?(ti().find(t=>t.id===e)?.reports??[]).filter(e=>{let n=t.fileTags.get(e);return n!==void 0&&Ji(t,n)}):[]}function Ri(e){let t=X.get(e);return t?t.remoteTags.size:0}async function zi(e){let t=X.get(e);return t?(t.ready&&!t.session&&await t.ready,t.session?(await ia(t),Array.from(t.remoteNameByTag.values())):[]):[]}async function Bi(e){let t=X.get(e);return t?(t.ready&&!t.session&&await t.ready,t.session?(await ia(t),Array.from(t.remoteBundleByTag.values())):[]):[]}function Vi(e,t){let n=X.get(e);if(n)return n.remoteBundleNameByIntegrity.get(t)}function Hi(e,t,n,r){let i=e.remoteMeta.get(t);i&&i.incarnation===r&&i.version>=n||e.remoteMeta.set(t,{version:n,incarnation:r})}function Ui(e,t){return!e||!t?!1:e.incarnation===null?t.version!==e.version:e.incarnation!==t.incarnation||t.version>e.version}function Wi(e,t){let n=e.baselines.get(t);return!!n&&n.incarnation!==null}function Gi(e,t){return!!e&&e.synced&&e.incarnation===t.incarnation&&e.version===t.version}function $(e,t,n,r,i=null){let a=Ji(e,t);e.baselines.set(t,{version:n.version,incarnation:n.incarnation,synced:r,hash:r?i:null}),e.localChanged.delete(t),!e.disposed&&Ji(e,t)!==a&&Q()}function Ki(e,t){return!!e&&e.synced&&!!e.hash&&!!t&&e.hash!==t}function qi(e,t){return!!e&&!e.synced||Ki(e,t)}function Ji(e,t){if(!e.remoteTags.has(t))return!1;if(e.localChanged.has(t))return!0;let n=e.baselines.get(t);return!!n&&!n.synced}async function Yi(e,t,n){e.selfWrites.set(t,(e.selfWrites.get(t)??0)+1);try{await fi(t,n),e.selfWriteNotices.set(t,(e.selfWriteNotices.get(t)??0)-1)}finally{let n=e.selfWrites.get(t)-1;if(n>0)e.selfWrites.set(t,n);else{e.selfWrites.delete(t);let n=e.selfWriteNotices.get(t)??0;e.selfWriteNotices.delete(t);let r=e.fileTags.get(t);n>0&&r!==void 0&&!e.disposed&&Xi(e,r,t)}}}function Xi(e,t,n){mi.setTimeout(()=>Zi(e,t,n).catch(()=>{}),pi)}function Zi(e,t,n){return $i(e,t,async()=>{if(hi.has(n))return;let r=e.baselines.get(t);if(e.disposed||!r?.synced||!r.hash)return;let i;try{i=await ui(n)}catch{return}let a=await l(i);if(e.disposed||e.baselines.get(t)!==r)return;let o=r.hash!==a;o!==e.localChanged.has(t)&&(o?e.localChanged.add(t):e.localChanged.delete(t),Q())})}async function Qi(e){let t=ti().find(t=>t.id===e.workspaceId);for(let n of t?.reports??[]){if(e.disposed)return;let t=e.fileTags.get(n);if(t!==void 0&&e.baselines.get(t)?.hash)try{await Zi(e,t,n)}catch{}}}function $i(e,t,n){let r=(e.tagLocks.get(t)??Promise.resolve()).then(()=>n()),i=r.catch(()=>{}).finally(()=>{e.tagLocks.get(t)===i&&e.tagLocks.delete(t)});return e.tagLocks.set(t,i),r}function ea(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}async function ta(e,t){let n;try{n=await ui(e)}catch{return{same:null,hash:null}}let r=await l(n);if(ea(n,t))return{same:!0,hash:r};try{let[e,i]=await Promise.all([oi(n),oi(t)]);return{same:ea(e,i),hash:r}}catch{return{same:!1,hash:r}}}async function na(e,t,n,r){let i;try{i=x(await oi(n.content))}catch(e){throw Error(`gunzip/decode of "${n.fileName}" failed (likely forged peer payload)`,{cause:e})}if(!r())return!1;let a=ii(i);if(!a.recognized)throw Error(`cloud copy of "${n.fileName}" did not analyze as a recognized report \u2014 refusing to overwrite local copy`);if(await Yi(e,n.fileName,n.content),e.disposed)return!1;ai(n.fileName,a.count,a.source),$(e,t,n,!0,await l(n.content)),Z(e.workspaceId,e);for(let t of bi)try{t(e.workspaceId,n.fileName)}catch{}return!0}async function ra(e,t,n,r,{keepLocalChanges:i=!0}={}){let{same:a,hash:o}=await ta(n.fileName,n.content);return r()?a?($(e,t,n,!0,o),Z(e.workspaceId,e),!1):i&&a===!1&&qi(e.baselines.get(t),o)?($(e,t,n,!1),Z(e.workspaceId,e),!1):await na(e,t,n,r):!1}async function ia(e){if(!e.session||e.disposed)return;let t=ti().find(t=>t.id===e.workspaceId),n=new Set(t?.reports??[]),r=new Set(t?.bundles??[]),i=new Set;try{i=new Set(await ci())}catch(t){console.warn(`objstore-presence: listFiles failed during discovery for "${e.workspaceId}":`,t)}if(e.disposed||!e.session)return;let a=[];for(let t of e.remoteTags){let o=e.remoteNameByTag.get(t);if(o!==void 0&&n.has(o)&&i.has(o)&&Wi(e,t))continue;if(e.remoteBundleByTag.has(t)){let n=e.remoteBundleByTag.get(t);if(e.remoteBundleNameByIntegrity.has(n)&&r.has(n))continue}let s=e.inFlight.get(t);if(!s){let n=e.remoteMeta.get(t),r=()=>e.disposed||!e.remoteTags.has(t)||e.remoteMeta.get(t)===n?null:ia(e).then(()=>null,()=>null);s=e.session.fetchByTag(t).then(async n=>(e.inFlight.delete(t),e.disposed?null:n?e.remoteTags.has(t)?n.kind===`bundle`?(e.remoteBundleByTag.set(t,n.integrity),e.bundleTags.set(n.integrity,t),n.name&&e.remoteBundleNameByIntegrity.set(n.integrity,n.name),await la(e,t,n.integrity,n.name,n.content),null):(e.remoteNameByTag.set(t,n.fileName),e.fileTags.set(n.fileName,t),await aa(e,t,n),null):null:r()),()=>(e.inFlight.delete(t),r())),e.inFlight.set(t,s)}a.push(s)}a.length!==0&&(await Promise.all(a),!e.disposed&&(Z(e.workspaceId,e),Q()))}async function aa(e,t,n){e.disposed||!e.remoteTags.has(t)||await $i(e,t,async()=>{await oa(e,t,n),!e.disposed&&e.remoteTags.has(t)&&Ui(e.baselines.get(t),e.remoteMeta.get(t))&&ca(e,t).catch(()=>{})})}async function oa(e,t,n){let r=n.fileName,i=n.content;if(e.disposed||!e.remoteTags.has(t))return;let a=ti().find(t=>t.id===e.workspaceId),o=!!(a&&Array.isArray(a.reports)&&a.reports.includes(r)),s;try{let n=await ci();if(e.disposed||!e.remoteTags.has(t))return;s=n.includes(r)}catch(e){console.warn(`auto-download: listFiles failed before saving "${r}":`,e);return}if(s){if(o){await sa(e,t,n);return}if(e.disposed||!e.remoteTags.has(t))return;try{await ni(r,e.workspaceId)}catch(t){console.warn(`auto-download: attaching local "${r}" to workspace "${e.workspaceId}" failed:`,t);return}if(e.disposed)return;if(!e.baselines.has(t)){let{same:a,hash:o}=await ta(r,i);if(e.disposed)return;a!==null&&($(e,t,n,a,o),Z(e.workspaceId,e))}for(let t of bi)try{t(e.workspaceId,r)}catch{}return}let c;try{c=x(await oi(i))}catch(e){console.warn(`auto-download: gunzip/decode of "${r}" failed (likely forged peer payload):`,e);return}if(e.disposed||!e.remoteTags.has(t))return;let u=ii(c);if(u.recognized){try{if(await Yi(e,r,i),e.disposed||!e.remoteTags.has(t)||(ai(r,u.count,u.source),$(e,t,n,!0,await l(i)),!e.remoteTags.has(t)))return;await ni(r,e.workspaceId),Z(e.workspaceId,e)}catch(t){console.warn(`auto-download: persisting "${r}" to workspace "${e.workspaceId}" failed:`,t);return}if(!e.disposed)for(let t of bi)try{t(e.workspaceId,r)}catch{}}}async function sa(e,t,n){let r=()=>!e.disposed&&e.remoteTags.has(t),{same:i,hash:a}=await ta(n.fileName,n.content);if(!r()||i===null)return;let o=e.baselines.get(t);if(i){(!Gi(o,n)||o.hash!==a)&&($(e,t,n,!0,a),Z(e.workspaceId,e));return}if(Ui(o,n)&&!qi(o,a)){try{await na(e,t,n,r)}catch(e){console.warn(`auto-download: ${e.message}`,e)}return}if(!o||o.incarnation===null||Ui(o,n)){$(e,t,n,!1),Z(e.workspaceId,e);return}Ki(o,a)&&!e.localChanged.has(t)&&(e.localChanged.add(t),Q())}async function ca(e,t,n=0){e.disposed||!e.remoteTags.has(t)||await $i(e,t,async()=>{let r=()=>!e.disposed&&e.remoteTags.has(t);if(!r())return;let i=e.baselines.get(t);if(i?.synced&&!Ui(i,e.remoteMeta.get(t)))return;let a;try{a=await e.session.fetchByTag(t)}catch(t){console.warn(`replace-refetch: fetchByTag failed for tag in workspace "${e.workspaceId}":`,t);return}if(a&&r()&&a.kind!==`bundle`){e.remoteNameByTag.set(t,a.fileName),e.fileTags.set(a.fileName,t);try{await ra(e,t,a,r)}catch(e){console.warn(`replace-refetch: ${e.message}`,e);return}n<2&&r()&&Ui(e.baselines.get(t),e.remoteMeta.get(t))&&ca(e,t,n+1).catch(()=>{})}})}async function la(e,t,n,r,i){if(e.disposed||!e.remoteTags.has(t))return;let a;try{a=await si()}catch(e){console.warn(`auto-download: listBundles failed before saving bundle "${n}":`,e);return}if(e.disposed||!e.remoteTags.has(t))return;if(a.some(e=>e.integrity===n)){try{await ri(n,e.workspaceId)}catch(e){console.warn(`auto-download: attach pre-existing bundle failed:`,e);return}if(e.disposed)return;let t=a.find(e=>e.integrity===n)?.name??``;for(let r of xi)try{r(e.workspaceId,n,t)}catch{}return}let o=await _(i);if(e.disposed||!e.remoteTags.has(t))return;if(o!==n){console.warn(`auto-download: bundle integrity mismatch (claimed ${n}, got ${o}) \u2014 refusing to save`);return}let s=wi(r&&r.length>0?r:`bundle-${n.slice(7,15)}`);try{if(await di(s,i),e.disposed||!e.remoteTags.has(t))return;await ri(n,e.workspaceId)}catch(t){console.warn(`auto-download: persisting bundle "${n}" to workspace "${e.workspaceId}" failed:`,t);return}if(!e.disposed)for(let t of xi)try{t(e.workspaceId,n,s)}catch{}}async function ua(e){if(e.ready&&!e.session&&await e.ready,!e.session)throw Error(`Objstore session is not connected${Si(e.err)}`)}async function da(e){let t=await e(null);return!t.ok&&t.reason===`conflict`&&t.current&&(t=await e(t.current)),t}async function fa(e,t){let n=X.get(e);if(!n)throw Error(`Workspace ${e} is not open`);return await ua(n),n.session.fetch(t)}async function pa(e,t){let n=X.get(e);if(!n)throw Error(`Workspace ${e} is not open`);if(await ua(n),!n.keys)throw Error(`Objstore session keys missing — derivation failed during open`);let r=n.fileTags.get(t)??await U(n.keys.tagKey,t),i=await $i(n,r,async()=>{let i=await n.session.fetch(t);if(!i)return{ok:!1,reason:`not found in remote`};let a;try{a=x(await oi(i.content))}catch{return{ok:!1,reason:`remote payload is not gzipped UTF-8`}}let o=ii(a);return o.recognized?(await Yi(n,t,i.content),ai(t,o.count,o.source),n.disposed||(n.fileTags.set(t,r),$(n,r,i,!0,await l(i.content)),Z(e,n)),{ok:!0}):{ok:!1,reason:`remote payload is not a recognized report format`}});return i.ok&&await ni(t,e),i}async function ma(e,t,n){let r=X.get(e);if(!r)throw Error(`Workspace ${e} is not open`);if(await ua(r),!r.keys)throw Error(`Objstore session keys missing — derivation failed during open`);let i=r.fileTags.get(t)??await U(r.keys.tagKey,t);return await $i(r,i,async()=>{let e=await da(e=>r.session.put({fileName:t,content:n,prev:e}));if(e.ok)try{await ha(r,t,i,e.meta,n)}catch{}return e})}async function ha(e,t,n,r,i){let a=await l(i);e.disposed||(e.fileTags.set(t,n),$(e,n,r,!0,a),Z(e.workspaceId,e),Ui(e.baselines.get(n),e.remoteMeta.get(n))&&ca(e,n).catch(()=>{}))}async function ga(e,t){let n=!1;X.has(e)||(Ei(e),n=!0);try{let n=X.get(e);if(!n)throw Error(`Workspace ${e} could not be opened \u2014 not in listWorkspaces()?`);if(await ua(n),!n.keys)throw Error(`Objstore session keys missing — derivation failed during open`);n.fileTags.has(t)||n.fileTags.set(t,await U(n.keys.tagKey,t));let r=n.fileTags.get(t);return await $i(n,r,async()=>{let e=await da(e=>n.session.delete(t,e));return e.ok&&(n.remoteTags.delete(r),n.remoteNameByTag.delete(r),n.remoteMeta.delete(r),n.baselines.delete(r),Q()),e})}finally{n&&Di(e)}}async function _a(e,t){let n=X.get(e);if(!n)throw Error(`Workspace ${e} is not open`);await ua(n);let r=await li(t),i=(await si()).find(e=>e.integrity===t)?.name??`bundle-${t.slice(7,15)}`;return await da(e=>n.session.putBundle({integrity:t,name:i,content:r,prev:e}))}async function va(e,t){let n=X.get(e);if(!n)throw Error(`Workspace ${e} is not open`);await ua(n);let r=await n.session.fetchBundle(t);if(!r)return{ok:!1,reason:`not-found`};if(await _(r.content)!==t)return{ok:!1,reason:`integrity-mismatch`};let i=wi(r.name&&r.name.length>0?r.name:`bundle-${t.slice(7,15)}`);await di(i,r.content);for(let n of xi)try{n(e,t,i)}catch{}return{ok:!0,integrity:t,name:i}}async function ya(e,t){let n=!1;X.has(e)||(Ei(e),n=!0);try{let n=X.get(e);if(!n)throw Error(`Workspace ${e} could not be opened \u2014 not in listWorkspaces()?`);if(await ua(n),!n.keys)throw Error(`Objstore session keys missing — derivation failed during open`);n.bundleTags.has(t)||n.bundleTags.set(t,await st(n.keys.tagKey,t));let r=n.bundleTags.get(t),i=await da(e=>n.session.deleteBundle(t,e));return i.ok&&(n.remoteTags.delete(r),n.remoteBundleByTag.delete(r),Q()),i}finally{n&&Di(e)}}async function ba(e,{onList:t,onItem:n}={}){let r=X.get(e);if(!r)throw Error(`Workspace ${e} is not open`);if(await ua(r),!r.keys)throw Error(`Objstore session keys missing — derivation failed during open`);let i=r.keys.tagKey,a=new Set,o=r.session.onDeleted(e=>{a.add(e.resourceTag)});try{let o=await xa(r,e),s=await Pa(),c=await Fa(),l=new Map;for(let e of s)l.set(await U(i,e),e);let u=new Map;for(let e of c)u.set(await st(i,e.integrity),e.integrity);let d=o.map(e=>{let t=l.get(e.resourceTag),n=u.get(e.resourceTag);return{resourceTag:e.resourceTag,kind:Aa(r,e.resourceTag,t,n),label:ja(r,e.resourceTag,t,n),contentLength:e.contentLength,reportName:t,bundleIntegrity:n,identifier:t??n,status:`checking`}});if(typeof t==`function`)try{t(d.map(Ma))}catch{}let f={good:0,updated:0,uploaded:0,differs:0,reuploaded:0,failed:0,"check-failed":0,missing:0};for(let t of d)if(t.status=await Ca(r,e,t,a),f[t.status]+=1,typeof n==`function`)try{n(Ma(t))}catch{}return{items:d.map(Ma),counts:f}}finally{o()}}async function xa(e,t){try{let e=$r.ensureSubscription(t);if(e){let t=await Na(e.resources,1e4);if(Array.isArray(t))return Sa(t)}}catch(e){console.warn(`objstore-recovery: fresh DB listing for ${t} failed; using cached inventory:`,e)}try{return(await e.session.list()).map(e=>({resourceTag:e.resourceTag,contentLength:e.contentLength}))}catch{return[]}}function Sa(e){let t=[];for(let n of e)!n||typeof n!=`object`||typeof n.resourceTag==`string`&&t.push({resourceTag:n.resourceTag,contentLength:Number.isSafeInteger(n.contentLength)?n.contentLength:null});return t}async function Ca(e,t,n,r){let i;try{i=await e.session.fetchByTag(n.resourceTag)}catch(e){return n.detail=`verification fetch failed: ${e?.message??String(e)}`,`check-failed`}return i?i.kind===`report`?(n.kind=`report`,n.label=i.fileName,n.identifier=i.fileName,await wa(e,t,n,i,r)):(n.kind=`bundle`,n.label=i.name??n.label,n.bundleIntegrity=i.integrity,n.identifier=i.integrity,`good`):r.has(n.resourceTag)?`missing`:n.reportName===void 0?n.bundleIntegrity===void 0?`missing`:await ka(t,n,r):await Oa(t,n,r)}async function wa(e,t,n,r,i){let a=ti().find(e=>e.id===t);if(!a||!Array.isArray(a.reports)||!a.reports.includes(r.fileName))return`good`;let o=n.resourceTag,s=()=>!e.disposed&&!i.has(o);return await $i(e,o,async()=>{let i=r;if(Ta(e,o,i)){let t;try{t=await e.session.fetchByTag(o)}catch(e){return n.detail=`verification fetch failed: ${e?.message??String(e)}`,`check-failed`}if(!t||!s())return`missing`;if(t.kind!==`report`)return`good`;i=t}let{same:a,hash:c}=await ta(i.fileName,i.content);if(!s())return`missing`;let l=e.baselines.get(o);if(a)return(!Gi(l,i)||l.hash!==c)&&($(e,o,i,!0,c),Z(t,e)),`good`;if(a===!1&&Gi(l,i)){let t=await Ea(e,o,i.fileName,i,s);return n.detail=t.detail,t.status}if(a===null||Ui(l,i)&&!qi(l,c))try{return await na(e,o,i,s)?`updated`:`missing`}catch(e){return n.detail=`updating your copy failed: ${e?.message??String(e)}`,console.warn(`objstore-recovery: updating the local copy of "${i.fileName}" failed:`,e),`failed`}return $(e,o,i,!1),Z(t,e),n.compared={version:i.version,incarnation:i.incarnation},`differs`})}function Ta(e,t,n){return[e.baselines.get(t),e.remoteMeta.get(t)].some(e=>e&&e.incarnation===n.incarnation&&e.version>n.version)}async function Ea(e,t,n,r,i){try{let a=await ui(n);if(!i())return{status:`missing`};let o=await e.session.put({fileName:n,content:a,prev:{version:r.version,incarnation:r.incarnation}});return o.ok?($(e,t,o.meta,!0,await l(a)),Z(e.workspaceId,e),{status:`uploaded`}):{status:`failed`,detail:o.reason===`conflict`?`the cloud copy changed since it was compared — re-check again`:`upload rejected: ${o.reason??`unknown`}`}}catch(e){return console.warn(`objstore-recovery: uploading the local copy of "${n}" failed:`,e),{status:`failed`,detail:`upload error: ${e?.message??String(e)}`}}}async function Da(e,t,n,r){if(n!==`cloud`&&n!==`local`)throw TypeError(`resolveReportDifference: keep must be 'cloud' or 'local', got ${String(n)}`);if(n===`local`&&(!r||!Number.isSafeInteger(r.version)||typeof r.incarnation!=`string`))throw TypeError(`resolveReportDifference: keeping the local copy needs the compared cloud state ({ version, incarnation })`);let i=X.get(e);if(!i)throw Error(`Workspace ${e} is not open`);if(await ua(i),!i.keys)throw Error(`Objstore session keys missing — derivation failed during open`);let a=i.fileTags.get(t)??await U(i.keys.tagKey,t),o=()=>!i.disposed;return await $i(i,a,async()=>{if(n===`local`)return await Ea(i,a,t,r,o);try{let e=await i.session.fetch(t);if(!e)return{status:`missing`,detail:`the report is no longer in the cloud`};let n={fileName:t,content:e.content,version:e.version,incarnation:e.incarnation};return{status:await ra(i,a,n,o,{keepLocalChanges:!1})?`updated`:`good`}}catch(e){return console.warn(`objstore-recovery: replacing the local copy of "${t}" with the cloud copy failed:`,e),{status:`failed`,detail:`updating your copy failed: ${e?.message??String(e)}`}}})}async function Oa(e,t,n){let r;try{r=await ui(t.reportName)}catch{return`missing`}if(t.contentLength==null||lt(t.reportName,r.length)!==t.contentLength||n.has(t.resourceTag))return`missing`;try{let n=await ma(e,t.reportName,r);return n&&n.ok?`reuploaded`:(t.detail=`re-upload rejected: ${n?.reason??`unknown`}`,`failed`)}catch(e){return t.detail=`re-upload error: ${e?.message??String(e)}`,console.warn(`objstore-recovery: re-upload of "${t.reportName}" failed:`,e),`failed`}}async function ka(e,t,n){try{await li(t.bundleIntegrity)}catch{return`missing`}if(n.has(t.resourceTag))return`missing`;try{let n=await _a(e,t.bundleIntegrity);return n&&n.ok?`reuploaded`:(t.detail=`re-upload rejected: ${n?.reason??`unknown`}`,`failed`)}catch(e){return t.detail=`re-upload error: ${e?.message??String(e)}`,console.warn(`objstore-recovery: bundle re-upload of "${t.bundleIntegrity}" failed:`,e),`failed`}}function Aa(e,t,n,r){return n===void 0?r!==void 0||e.remoteBundleByTag.has(t)?`bundle`:e.remoteNameByTag.has(t)?`report`:`unknown`:`report`}function ja(e,t,n,r){if(n!==void 0)return n;if(r!==void 0)return e.remoteBundleNameByIntegrity.get(r)??r;let i=e.remoteNameByTag.get(t);if(i!==void 0)return i;let a=e.remoteBundleByTag.get(t);return a===void 0?`${t.slice(0,10)}\u2026`:e.remoteBundleNameByIntegrity.get(a)??a}function Ma(e){let t={resourceTag:e.resourceTag,kind:e.kind,label:e.label,status:e.status,identifier:e.identifier,detail:e.detail};return e.compared&&(t.compared=e.compared),t}function Na(e,t){let n,r=Promise.resolve(e);r.catch(()=>{});let i=new Promise((e,r)=>{n=setTimeout(()=>r(Error(`objstore-recovery: timed out after ${t}ms`)),t)});return Promise.race([r,i]).finally(()=>clearTimeout(n))}async function Pa(){try{return await ci()}catch(e){return console.warn(`objstore-recovery: listFiles failed; treating as no local reports:`,e),[]}}async function Fa(){try{return await si()}catch(e){return console.warn(`objstore-recovery: listBundles failed; treating as no local bundles:`,e),[]}}export{Di as closeWorkspace,ya as deleteBundleFromRemote,ga as deleteFromRemote,Li as differingReports,Bi as discoverRemoteBundleIntegrities,zi as discoverRemoteFileNames,pa as downloadFileFromRemote,va as fetchBundleFromRemote,fa as fetchFile,Ii as holdLocalChangeChecks,ht as installSyncHost,ji as isBundleInRemote,ki as isInRemote,Pi as onAutoDownloaded,Fi as onBundleAutoDownloaded,Ni as onChange,Ei as openWorkspace,Oi as openWorkspaceIds,_a as putBundleToRemote,ma as putFile,ba as recheckRemoteStorage,Vi as remoteBundleName,Ri as remoteCount,Da as resolveReportDifference,Xr as setAuthenticationResolver,Yr as setHydrationConflictResolver,Jr as setRedraw,$r as triageSync};
18
12
  /*! Bundled license information:
19
13
 
20
14
  @noble/ciphers/utils.js:
21
- (*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) *)
15
+ (*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) *)
22
16
  */