@akasecurity/cli 0.9.14 → 0.9.15

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 (207) hide show
  1. package/dist/cli.js +762 -267
  2. package/extension/manifest.json +1 -1
  3. package/native-host/content-retention.js +184 -55
  4. package/native-host/history-sync.js +190 -61
  5. package/native-host/host.js +469 -120
  6. package/native-host/scan-worker.js +241 -34
  7. package/native-host/sync.js +91 -36
  8. package/package.json +9 -9
  9. package/web-ui/package.json +6 -6
  10. package/web-ui/packages/dashboard-ui/package.json +1 -1
  11. package/web-ui/packages/plugin-sdk/package.json +1 -1
  12. package/web-ui/packages/schema/package.json +2 -2
  13. package/web-ui/web-ui/.next/BUILD_ID +1 -1
  14. package/web-ui/web-ui/.next/app-build-manifest.json +254 -254
  15. package/web-ui/web-ui/.next/app-path-routes-manifest.json +7 -7
  16. package/web-ui/web-ui/.next/build-manifest.json +14 -14
  17. package/web-ui/web-ui/.next/prerender-manifest.json +14 -14
  18. package/web-ui/web-ui/.next/required-server-files.json +1 -1
  19. package/web-ui/web-ui/.next/server/app/(app)/activity/page.js +2 -2
  20. package/web-ui/web-ui/.next/server/app/(app)/activity/page.js.nft.json +1 -1
  21. package/web-ui/web-ui/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -1
  22. package/web-ui/web-ui/.next/server/app/(app)/data-shares/page.js +2 -2
  23. package/web-ui/web-ui/.next/server/app/(app)/data-shares/page.js.nft.json +1 -1
  24. package/web-ui/web-ui/.next/server/app/(app)/data-shares/page_client-reference-manifest.js +1 -1
  25. package/web-ui/web-ui/.next/server/app/(app)/detections/page.js +2 -2
  26. package/web-ui/web-ui/.next/server/app/(app)/detections/page.js.nft.json +1 -1
  27. package/web-ui/web-ui/.next/server/app/(app)/detections/page_client-reference-manifest.js +1 -1
  28. package/web-ui/web-ui/.next/server/app/(app)/exceptions/[id]/page.js +2 -2
  29. package/web-ui/web-ui/.next/server/app/(app)/exceptions/[id]/page.js.nft.json +1 -1
  30. package/web-ui/web-ui/.next/server/app/(app)/exceptions/[id]/page_client-reference-manifest.js +1 -1
  31. package/web-ui/web-ui/.next/server/app/(app)/exceptions/new/page.js +2 -2
  32. package/web-ui/web-ui/.next/server/app/(app)/exceptions/new/page.js.nft.json +1 -1
  33. package/web-ui/web-ui/.next/server/app/(app)/exceptions/new/page_client-reference-manifest.js +1 -1
  34. package/web-ui/web-ui/.next/server/app/(app)/exceptions/page.js +2 -2
  35. package/web-ui/web-ui/.next/server/app/(app)/exceptions/page.js.nft.json +1 -1
  36. package/web-ui/web-ui/.next/server/app/(app)/exceptions/page_client-reference-manifest.js +1 -1
  37. package/web-ui/web-ui/.next/server/app/(app)/findings/page.js +2 -2
  38. package/web-ui/web-ui/.next/server/app/(app)/findings/page.js.nft.json +1 -1
  39. package/web-ui/web-ui/.next/server/app/(app)/findings/page_client-reference-manifest.js +1 -1
  40. package/web-ui/web-ui/.next/server/app/(app)/inventory/page.js +2 -2
  41. package/web-ui/web-ui/.next/server/app/(app)/inventory/page.js.nft.json +1 -1
  42. package/web-ui/web-ui/.next/server/app/(app)/inventory/page_client-reference-manifest.js +1 -1
  43. package/web-ui/web-ui/.next/server/app/(app)/policies/page.js +2 -2
  44. package/web-ui/web-ui/.next/server/app/(app)/policies/page.js.nft.json +1 -1
  45. package/web-ui/web-ui/.next/server/app/(app)/policies/page_client-reference-manifest.js +1 -1
  46. package/web-ui/web-ui/.next/server/app/(app)/scan/page.js +3 -3
  47. package/web-ui/web-ui/.next/server/app/(app)/scan/page.js.nft.json +1 -1
  48. package/web-ui/web-ui/.next/server/app/(app)/scan/page_client-reference-manifest.js +1 -1
  49. package/web-ui/web-ui/.next/server/app/(app)/security/page.js +2 -2
  50. package/web-ui/web-ui/.next/server/app/(app)/security/page.js.nft.json +1 -1
  51. package/web-ui/web-ui/.next/server/app/(app)/security/page_client-reference-manifest.js +1 -1
  52. package/web-ui/web-ui/.next/server/app/(app)/settings/page.js +2 -2
  53. package/web-ui/web-ui/.next/server/app/(app)/settings/page.js.nft.json +1 -1
  54. package/web-ui/web-ui/.next/server/app/(app)/settings/page_client-reference-manifest.js +1 -1
  55. package/web-ui/web-ui/.next/server/app/(app)/updates/page.js +2 -2
  56. package/web-ui/web-ui/.next/server/app/(app)/updates/page.js.nft.json +1 -1
  57. package/web-ui/web-ui/.next/server/app/(app)/updates/page_client-reference-manifest.js +1 -1
  58. package/web-ui/web-ui/.next/server/app/(app)/vault/page.js +2 -2
  59. package/web-ui/web-ui/.next/server/app/(app)/vault/page.js.nft.json +1 -1
  60. package/web-ui/web-ui/.next/server/app/(app)/vault/page_client-reference-manifest.js +1 -1
  61. package/web-ui/web-ui/.next/server/app/_not-found/page.js +2 -2
  62. package/web-ui/web-ui/.next/server/app/_not-found/page.js.nft.json +1 -1
  63. package/web-ui/web-ui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  64. package/web-ui/web-ui/.next/server/app/_not-found.html +1 -1
  65. package/web-ui/web-ui/.next/server/app/_not-found.rsc +10 -10
  66. package/web-ui/web-ui/.next/server/app/icon.svg/route.js +1 -1
  67. package/web-ui/web-ui/.next/server/app/icon.svg/route.js.nft.json +1 -1
  68. package/web-ui/web-ui/.next/server/app/index.html +1 -1
  69. package/web-ui/web-ui/.next/server/app/index.rsc +10 -10
  70. package/web-ui/web-ui/.next/server/app/page.js +2 -2
  71. package/web-ui/web-ui/.next/server/app/page.js.nft.json +1 -1
  72. package/web-ui/web-ui/.next/server/app/page_client-reference-manifest.js +1 -1
  73. package/web-ui/web-ui/.next/server/app-paths-manifest.json +7 -7
  74. package/web-ui/web-ui/.next/server/chunks/184.js +1039 -0
  75. package/web-ui/web-ui/.next/server/chunks/245.js +11 -0
  76. package/web-ui/web-ui/.next/server/chunks/{670.js → 250.js} +1 -1
  77. package/web-ui/web-ui/.next/server/chunks/491.js +1 -0
  78. package/web-ui/web-ui/.next/server/chunks/51.js +1 -0
  79. package/web-ui/web-ui/.next/server/chunks/511.js +66 -0
  80. package/web-ui/web-ui/.next/server/chunks/537.js +1 -0
  81. package/web-ui/web-ui/.next/server/chunks/{74.js → 586.js} +55 -38
  82. package/web-ui/web-ui/.next/server/chunks/643.js +6 -0
  83. package/web-ui/web-ui/.next/server/chunks/660.js +109 -0
  84. package/web-ui/web-ui/.next/server/chunks/662.js +1 -0
  85. package/web-ui/web-ui/.next/server/chunks/749.js +22 -0
  86. package/web-ui/web-ui/.next/server/chunks/756.js +6 -0
  87. package/web-ui/web-ui/.next/server/chunks/774.js +12 -0
  88. package/web-ui/web-ui/.next/server/functions-config-manifest.json +5 -5
  89. package/web-ui/web-ui/.next/server/middleware-build-manifest.js +1 -1
  90. package/web-ui/web-ui/.next/server/middleware-manifest.json +5 -5
  91. package/web-ui/web-ui/.next/server/middleware.js +2 -2
  92. package/web-ui/web-ui/.next/server/pages/404.html +1 -1
  93. package/web-ui/web-ui/.next/server/pages/500.html +1 -1
  94. package/web-ui/web-ui/.next/server/pages/_app.js +1 -1
  95. package/web-ui/web-ui/.next/server/pages/_app.js.nft.json +1 -1
  96. package/web-ui/web-ui/.next/server/pages/_document.js +1 -1
  97. package/web-ui/web-ui/.next/server/pages/_document.js.nft.json +1 -1
  98. package/web-ui/web-ui/.next/server/pages/_error.js +3 -3
  99. package/web-ui/web-ui/.next/server/pages/_error.js.nft.json +1 -1
  100. package/web-ui/web-ui/.next/server/server-reference-manifest.js +1 -1
  101. package/web-ui/web-ui/.next/server/server-reference-manifest.json +1 -1
  102. package/web-ui/web-ui/.next/static/chunks/394-310a18b4e4df5baf.js +1 -0
  103. package/web-ui/web-ui/.next/static/chunks/458-51313fc93031a722.js +1 -0
  104. package/web-ui/web-ui/.next/static/chunks/784-4ea191865f1d4d08.js +1 -0
  105. package/web-ui/web-ui/.next/static/chunks/800-5a959d56ff462fa5.js +1 -0
  106. package/web-ui/web-ui/.next/static/chunks/982-d4c17097640bdc58.js +55 -0
  107. package/web-ui/web-ui/.next/static/chunks/app/(app)/activity/loading-1c2f7a583c03a3ac.js +1 -0
  108. package/web-ui/web-ui/.next/static/chunks/app/(app)/activity/page-6a2b4ce7f62aa2ba.js +1 -0
  109. package/web-ui/web-ui/.next/static/chunks/app/(app)/data-shares/loading-1c2f7a583c03a3ac.js +1 -0
  110. package/web-ui/web-ui/.next/static/chunks/app/(app)/data-shares/page-3032d8c5d83ed0ae.js +1 -0
  111. package/web-ui/web-ui/.next/static/chunks/app/(app)/detections/loading-1c2f7a583c03a3ac.js +1 -0
  112. package/web-ui/web-ui/.next/static/chunks/app/(app)/detections/page-541933106e3fbbd5.js +1 -0
  113. package/web-ui/web-ui/.next/static/chunks/app/(app)/error-8db18c71ebeb633c.js +1 -0
  114. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/[id]/loading-1c2f7a583c03a3ac.js +1 -0
  115. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/[id]/page-b2913fd29067c1aa.js +1 -0
  116. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/loading-1c2f7a583c03a3ac.js +1 -0
  117. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/new/loading-1c2f7a583c03a3ac.js +1 -0
  118. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/new/page-d71ddfb1b6a8508a.js +1 -0
  119. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/page-db4102808bb1d7ba.js +1 -0
  120. package/web-ui/web-ui/.next/static/chunks/app/(app)/findings/loading-1c2f7a583c03a3ac.js +1 -0
  121. package/web-ui/web-ui/.next/static/chunks/app/(app)/findings/page-8fc32e776e5c8f17.js +1 -0
  122. package/web-ui/web-ui/.next/static/chunks/app/(app)/inventory/loading-1c2f7a583c03a3ac.js +1 -0
  123. package/web-ui/web-ui/.next/static/chunks/app/(app)/inventory/page-5136fa903953a1f1.js +1 -0
  124. package/web-ui/web-ui/.next/static/chunks/app/(app)/layout-0a38af585fc577fa.js +1 -0
  125. package/web-ui/web-ui/.next/static/chunks/app/(app)/policies/loading-1c2f7a583c03a3ac.js +1 -0
  126. package/web-ui/web-ui/.next/static/chunks/app/(app)/policies/page-7b0a5b76d199ec55.js +1 -0
  127. package/web-ui/web-ui/.next/static/chunks/app/(app)/scan/loading-1c2f7a583c03a3ac.js +1 -0
  128. package/web-ui/web-ui/.next/static/chunks/app/(app)/scan/page-dd238c793fc58e5b.js +1 -0
  129. package/web-ui/web-ui/.next/static/chunks/app/(app)/security/loading-1c2f7a583c03a3ac.js +1 -0
  130. package/web-ui/web-ui/.next/static/chunks/app/(app)/security/page-27448935d7ce4168.js +1 -0
  131. package/web-ui/web-ui/.next/static/chunks/app/(app)/settings/loading-1c2f7a583c03a3ac.js +1 -0
  132. package/web-ui/web-ui/.next/static/chunks/app/(app)/settings/page-e8f75d1d2a05a860.js +1 -0
  133. package/web-ui/web-ui/.next/static/chunks/app/(app)/updates/loading-1c2f7a583c03a3ac.js +1 -0
  134. package/web-ui/web-ui/.next/static/chunks/app/(app)/updates/page-34525856979b2faf.js +1 -0
  135. package/web-ui/web-ui/.next/static/chunks/app/(app)/vault/loading-1c2f7a583c03a3ac.js +1 -0
  136. package/web-ui/web-ui/.next/static/chunks/app/(app)/vault/page-90ff82a26647fc29.js +1 -0
  137. package/web-ui/web-ui/.next/static/chunks/app/_not-found/page-688942265deca357.js +1 -0
  138. package/web-ui/web-ui/.next/static/chunks/app/layout-66e4db4cb3e3b073.js +1 -0
  139. package/web-ui/web-ui/.next/static/chunks/app/page-64c3ee82a8af8ca6.js +1 -0
  140. package/web-ui/web-ui/.next/static/chunks/fc2b9f2a-dbaa334f7301101d.js +1 -0
  141. package/web-ui/web-ui/.next/static/chunks/{framework-4a8a69f5ce633b25.js → framework-f6112ebf12822e8c.js} +1 -1
  142. package/web-ui/web-ui/.next/static/chunks/main-app-9c9fe8121a92e5d6.js +1 -0
  143. package/web-ui/web-ui/.next/static/chunks/main-b1c87d0ac6039542.js +1 -0
  144. package/web-ui/web-ui/.next/static/chunks/pages/_app-3a76cb93bbdd6993.js +1 -0
  145. package/web-ui/web-ui/.next/static/chunks/pages/_error-690c2fcfe129b529.js +1 -0
  146. package/web-ui/web-ui/.next/static/chunks/{webpack-c0fb35a40828243e.js → webpack-27570aabc530cb21.js} +1 -1
  147. package/web-ui/web-ui/.next/static/css/010b6061327092dd.css +2 -0
  148. package/web-ui/web-ui/.next/static/{5Pl1KmhN7uMqXkPkq0ZmS → zCQxcf2ZbK52vQeWXgBgs}/_buildManifest.js +1 -1
  149. package/web-ui/web-ui/dist/scan-worker.js +241 -34
  150. package/web-ui/web-ui/package.json +3 -3
  151. package/web-ui/web-ui/.next/server/chunks/167.js +0 -11
  152. package/web-ui/web-ui/.next/server/chunks/197.js +0 -12
  153. package/web-ui/web-ui/.next/server/chunks/247.js +0 -66
  154. package/web-ui/web-ui/.next/server/chunks/259.js +0 -22
  155. package/web-ui/web-ui/.next/server/chunks/285.js +0 -1
  156. package/web-ui/web-ui/.next/server/chunks/293.js +0 -1022
  157. package/web-ui/web-ui/.next/server/chunks/498.js +0 -1
  158. package/web-ui/web-ui/.next/server/chunks/524.js +0 -109
  159. package/web-ui/web-ui/.next/server/chunks/618.js +0 -1
  160. package/web-ui/web-ui/.next/server/chunks/807.js +0 -6
  161. package/web-ui/web-ui/.next/server/chunks/811.js +0 -6
  162. package/web-ui/web-ui/.next/server/chunks/97.js +0 -1
  163. package/web-ui/web-ui/.next/static/chunks/333-837ec42ac57bd0f5.js +0 -1
  164. package/web-ui/web-ui/.next/static/chunks/423b6282-fc44d01f7ffd176d.js +0 -1
  165. package/web-ui/web-ui/.next/static/chunks/539-ca04468e745ed73a.js +0 -1
  166. package/web-ui/web-ui/.next/static/chunks/614-2c96a5e95ce63862.js +0 -1
  167. package/web-ui/web-ui/.next/static/chunks/639-6f64a434dce13266.js +0 -1
  168. package/web-ui/web-ui/.next/static/chunks/826-e806952dd7b636f8.js +0 -55
  169. package/web-ui/web-ui/.next/static/chunks/app/(app)/activity/loading-dd5849a39c269cf4.js +0 -1
  170. package/web-ui/web-ui/.next/static/chunks/app/(app)/activity/page-5fc18420d8d5bf62.js +0 -1
  171. package/web-ui/web-ui/.next/static/chunks/app/(app)/data-shares/loading-dd5849a39c269cf4.js +0 -1
  172. package/web-ui/web-ui/.next/static/chunks/app/(app)/data-shares/page-fe72214e54d52a14.js +0 -1
  173. package/web-ui/web-ui/.next/static/chunks/app/(app)/detections/loading-dd5849a39c269cf4.js +0 -1
  174. package/web-ui/web-ui/.next/static/chunks/app/(app)/detections/page-47e4dd015f24c04d.js +0 -1
  175. package/web-ui/web-ui/.next/static/chunks/app/(app)/error-be2032a4770a35bf.js +0 -1
  176. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/[id]/loading-dd5849a39c269cf4.js +0 -1
  177. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/[id]/page-f90fbb03406e4383.js +0 -1
  178. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/loading-dd5849a39c269cf4.js +0 -1
  179. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/new/loading-dd5849a39c269cf4.js +0 -1
  180. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/new/page-0a1d6a3557b99750.js +0 -1
  181. package/web-ui/web-ui/.next/static/chunks/app/(app)/exceptions/page-dbf32c5303140e8c.js +0 -1
  182. package/web-ui/web-ui/.next/static/chunks/app/(app)/findings/loading-dd5849a39c269cf4.js +0 -1
  183. package/web-ui/web-ui/.next/static/chunks/app/(app)/findings/page-cb1934547acde891.js +0 -1
  184. package/web-ui/web-ui/.next/static/chunks/app/(app)/inventory/loading-dd5849a39c269cf4.js +0 -1
  185. package/web-ui/web-ui/.next/static/chunks/app/(app)/inventory/page-6688bc58741c7c7d.js +0 -1
  186. package/web-ui/web-ui/.next/static/chunks/app/(app)/layout-d357a1d54c653d14.js +0 -1
  187. package/web-ui/web-ui/.next/static/chunks/app/(app)/policies/loading-dd5849a39c269cf4.js +0 -1
  188. package/web-ui/web-ui/.next/static/chunks/app/(app)/policies/page-bc95c7097cca0dfc.js +0 -1
  189. package/web-ui/web-ui/.next/static/chunks/app/(app)/scan/loading-dd5849a39c269cf4.js +0 -1
  190. package/web-ui/web-ui/.next/static/chunks/app/(app)/scan/page-5bebd818c1bb3a79.js +0 -1
  191. package/web-ui/web-ui/.next/static/chunks/app/(app)/security/loading-dd5849a39c269cf4.js +0 -1
  192. package/web-ui/web-ui/.next/static/chunks/app/(app)/security/page-42845dce0b734eeb.js +0 -1
  193. package/web-ui/web-ui/.next/static/chunks/app/(app)/settings/loading-dd5849a39c269cf4.js +0 -1
  194. package/web-ui/web-ui/.next/static/chunks/app/(app)/settings/page-d3ce8a503e8ce592.js +0 -1
  195. package/web-ui/web-ui/.next/static/chunks/app/(app)/updates/loading-dd5849a39c269cf4.js +0 -1
  196. package/web-ui/web-ui/.next/static/chunks/app/(app)/updates/page-802942c0a06fbe31.js +0 -1
  197. package/web-ui/web-ui/.next/static/chunks/app/(app)/vault/loading-dd5849a39c269cf4.js +0 -1
  198. package/web-ui/web-ui/.next/static/chunks/app/(app)/vault/page-52c8cd3a2a09a067.js +0 -1
  199. package/web-ui/web-ui/.next/static/chunks/app/_not-found/page-260d84f0d7697773.js +0 -1
  200. package/web-ui/web-ui/.next/static/chunks/app/layout-c64d57251ee073d5.js +0 -1
  201. package/web-ui/web-ui/.next/static/chunks/app/page-b7ea78b4203d219b.js +0 -1
  202. package/web-ui/web-ui/.next/static/chunks/main-89a5d50418a9a7e3.js +0 -1
  203. package/web-ui/web-ui/.next/static/chunks/main-app-4a18e3117ef3af1e.js +0 -1
  204. package/web-ui/web-ui/.next/static/chunks/pages/_app-671d04cd06b05cac.js +0 -1
  205. package/web-ui/web-ui/.next/static/chunks/pages/_error-ae172b6a97f64258.js +0 -1
  206. package/web-ui/web-ui/.next/static/css/616a1cc3e0d40480.css +0 -2
  207. /package/web-ui/web-ui/.next/static/{5Pl1KmhN7uMqXkPkq0ZmS → zCQxcf2ZbK52vQeWXgBgs}/_ssgManifest.js +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": 3,
3
3
  "name": "AI Traffic Control",
4
- "version": "0.9.14",
4
+ "version": "0.9.15",
5
5
  "description": "Local secret detection and redaction for ChatGPT and Claude.ai web chat.",
6
6
  "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqnwx5Snbi3oZ7mDBC78NaTHO6dTKYRtCqr29YnOImR47UM21tP1us3KF6FjQMtR6tAsffflRok1PThQpjBNwYdRM+stvPIUr5GqBRQL1Ge///kZaVz7eCptCjKg00ygk2HwelaCNt6nWy6czIcM3/HssrNflw42IKsBORW7qQ+KhhKqlABjkRUDvBcuhwOU34HHMJxeP2XdyI5T5msqVJN1nVA+X9T/18dP7cCSzkp9RwLN1hvQMS6n3A1R0HUCmfra1lb1KqQhy3EBdm2VwxTDGVPfGYbTdNSyRT70wzcZy1IdQkfT6YOy1M//+yT7Vu9p/aajs+dNNn/zUn0qJyQIDAQAB",
7
7
  "icons": {
@@ -32,9 +32,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
32
32
  mod
33
33
  ));
34
34
 
35
- // ../../node_modules/.pnpm/ignore@7.0.9/node_modules/ignore/index.js
35
+ // ../../node_modules/.pnpm/ignore@7.0.10/node_modules/ignore/index.js
36
36
  var require_ignore = __commonJS({
37
- "../../node_modules/.pnpm/ignore@7.0.9/node_modules/ignore/index.js"(exports, module) {
37
+ "../../node_modules/.pnpm/ignore@7.0.10/node_modules/ignore/index.js"(exports, module) {
38
38
  "use strict";
39
39
  function makeArray(subject) {
40
40
  return Array.isArray(subject) ? subject : [subject];
@@ -429,6 +429,13 @@ var require_ignore = __commonJS({
429
429
  }
430
430
  };
431
431
  var WILDCARD = "[^\\/]*";
432
+ var separatorAfter = (run, at) => {
433
+ let separator = EMPTY;
434
+ for (let index = at + 1; index < run.length && !run[index].wildcard; index++) {
435
+ separator += run[index].single;
436
+ }
437
+ return separator;
438
+ };
432
439
  var pinWildcards = (source) => {
433
440
  if (source.indexOf(WILDCARD) < 0) {
434
441
  return source;
@@ -498,7 +505,7 @@ var require_ignore = __commonJS({
498
505
  out += token.single;
499
506
  return;
500
507
  }
501
- out += at === lastWildcard ? WILDCARD : `(?:(?!${run[at + 1].single})[^\\/])*`;
508
+ out += at === lastWildcard ? WILDCARD : `(?:(?!${separatorAfter(run, at)})[^\\/])*`;
502
509
  });
503
510
  run = [];
504
511
  };
@@ -675,13 +682,13 @@ var require_ignore = __commonJS({
675
682
  const rules = this._rules;
676
683
  const { length } = rules;
677
684
  const shortcut = this._basenameCount * 2 >= length;
678
- const basename6 = shortcut ? basenameOf(path) : path;
685
+ const basename7 = shortcut ? basenameOf(path) : path;
679
686
  for (let index = 0; index < length; index++) {
680
687
  const rule = rules[index];
681
688
  const { negative } = rule;
682
689
  const skip = unignored === negative && ignored !== unignored || negative && !ignored && !unignored && !checkUnignored;
683
690
  if (!skip && rule[mode].test(
684
- shortcut && rule._basenameOnly ? basename6 : path
691
+ shortcut && rule._basenameOnly ? basename7 : path
685
692
  )) {
686
693
  ignored = !negative;
687
694
  unignored = negative;
@@ -995,6 +1002,10 @@ var SQLITE_MIGRATIONS = [
995
1002
  {
996
1003
  tag: "0035_share_destination_provider_id",
997
1004
  sql: "ALTER TABLE `share_destination` ADD `provider_id` text;"
1005
+ },
1006
+ {
1007
+ tag: "0036_secret_vault_identity_fingerprint",
1008
+ sql: "ALTER TABLE `secret_vault` ADD `value_identity_fingerprint` text DEFAULT '' NOT NULL;--> statement-breakpoint\nUPDATE `secret_vault` SET `value_identity_fingerprint` = `value_fingerprint`;\n"
998
1009
  }
999
1010
  ];
1000
1011
 
@@ -6030,7 +6041,7 @@ var recursive = /* @__PURE__ */ new WeakMap();
6030
6041
  var NONE = 0;
6031
6042
  var ASSUMED = 1;
6032
6043
  var PROVEN = 2;
6033
- function isRecursive(inst, stack, resolve2) {
6044
+ function isRecursive(inst, stack, resolve3) {
6034
6045
  const cached2 = recursive.get(inst);
6035
6046
  if (cached2 !== void 0)
6036
6047
  return cached2 ? PROVEN : NONE;
@@ -6040,7 +6051,7 @@ function isRecursive(inst, stack, resolve2) {
6040
6051
  let result = NONE;
6041
6052
  const check2 = (child) => {
6042
6053
  if (result !== PROVEN && child?._zod) {
6043
- const answer = isRecursive(child, stack, resolve2);
6054
+ const answer = isRecursive(child, stack, resolve3);
6044
6055
  if (answer > result)
6045
6056
  result = answer;
6046
6057
  }
@@ -6051,7 +6062,7 @@ function isRecursive(inst, stack, resolve2) {
6051
6062
  const desc = Object.getOwnPropertyDescriptor(sh, key);
6052
6063
  if (spread && !desc.enumerable)
6053
6064
  continue;
6054
- const child = desc.get ? ASSUMED : desc.value?._zod ? isRecursive(desc.value, stack, resolve2) : NONE;
6065
+ const child = desc.get ? ASSUMED : desc.value?._zod ? isRecursive(desc.value, stack, resolve3) : NONE;
6055
6066
  if (child > answer)
6056
6067
  answer = child;
6057
6068
  }
@@ -6115,7 +6126,7 @@ function isRecursive(inst, stack, resolve2) {
6115
6126
  break;
6116
6127
  // `$ZodLazy` caches its inner on the def, so a resolved edge is followed exactly
6117
6128
  case "lazy": {
6118
- const inner = def._cachedInner ?? (resolve2 ? inst._zod.innerType : void 0);
6129
+ const inner = def._cachedInner ?? (resolve3 ? inst._zod.innerType : void 0);
6119
6130
  merge2(inner ? isRecursive(inner, stack, false) : ASSUMED);
6120
6131
  break;
6121
6132
  }
@@ -23371,7 +23382,29 @@ var StorePosturePlugin = external_exports.object({
23371
23382
  */
23372
23383
  policyBundleVersion: external_exports.string().max(200).nullable(),
23373
23384
  /** Epoch millis, on the CLIENT clock, of that fetch. */
23374
- policyFetchedAt: external_exports.number().int().min(0).max(MAX_DATE_MS).nullable()
23385
+ policyFetchedAt: external_exports.number().int().min(0).max(MAX_DATE_MS).nullable(),
23386
+ /**
23387
+ * The newest version the host's own install record holds for this plugin —
23388
+ * what is on disk. After an update it leads `version` (the running copy) by
23389
+ * one launch. Null when no usable version can be read: no install record
23390
+ * (a plugin run from a checkout), no entry with a valid version, or every
23391
+ * such entry names an `installPath` that no longer exists; OPTIONAL, not
23392
+ * required, so a build that predates the member keeps getting its 200.
23393
+ * Bounded like `version`.
23394
+ */
23395
+ installedVersion: external_exports.string().max(64).nullable().optional(),
23396
+ /**
23397
+ * The local-store schema version this running build migrates a store to:
23398
+ * the number of store migrations it carries, the count it stamps into
23399
+ * `PRAGMA user_version`. A snapshot whose `schemaVersion` is above it
23400
+ * usually describes a store a newer build migrated. It is a hint, not a
23401
+ * verdict: the stamp is write-only, so a store whose count ran past this
23402
+ * build's while this build knows every migration in its ledger reads above
23403
+ * it too, which is why describeStoreSkew decides skew on ledger tags and
23404
+ * never on the count. OPTIONAL for the same reason as `installedVersion`;
23405
+ * bounded like `schemaVersion`.
23406
+ */
23407
+ buildSchemaVersion: external_exports.number().int().min(0).max(MAX_INT4).optional()
23375
23408
  }).meta({ id: "StorePosturePlugin" });
23376
23409
  var StorePostureSnapshot = external_exports.object({
23377
23410
  deviceId: external_exports.guid(),
@@ -24927,10 +24960,15 @@ var ParsedPointer = external_exports.object({
24927
24960
  });
24928
24961
  var VaultEntry = external_exports.object({
24929
24962
  pointerId: external_exports.string(),
24930
- // The keyed HMAC of the raw value under `exception.key`, and the epoch it was
24931
- // derived under. This is what a reveal-to-model grant matches on, and it rotates
24932
- // independently of the vault encryption key below.
24963
+ // The keyed HMAC of the EXACT raw bytes under `exception.key`, and the epoch it
24964
+ // was derived under. The vault's own dedupe key: a value and its invisibly
24965
+ // padded twin are two rows. It rotates independently of the vault encryption
24966
+ // key below. Never matched against an exception or grant.
24933
24967
  valueFingerprint: external_exports.string().regex(/^[0-9a-f]{64}$/),
24968
+ // The same HMAC over the raw with invisible padding removed: the identity a
24969
+ // reveal-to-model grant and every exception match on. Shared by a value and
24970
+ // its padded twin.
24971
+ valueIdentityFingerprint: external_exports.string().regex(/^[0-9a-f]{64}$/),
24934
24972
  fingerprintKeyVersion: external_exports.number().int().positive(),
24935
24973
  // The vault-key epoch this row's ciphertext was sealed under.
24936
24974
  keyVersion: external_exports.number().int().positive(),
@@ -25506,10 +25544,18 @@ var SeveritySummaryItem = external_exports.object({
25506
25544
  count: external_exports.number().int().nonnegative(),
25507
25545
  // Resolution-aware breakdown (optional, additive). Populated once findings
25508
25546
  // carry lifecycle state: `caught` = handled in-flight (enforced); `openAtRest`
25509
- // = still open with no in-flight enforcement (needs remediation). Absent on the
25510
- // legacy count-only response until the resolution feature lands.
25547
+ // = still open with no in-flight enforcement (needs remediation); `dismissed`
25548
+ // = closed by a human judgement rather than a fix — visible, but not counted as
25549
+ // needing remediation. The three are disjoint. Absent on the legacy count-only
25550
+ // response until the resolution feature lands.
25511
25551
  caught: external_exports.number().int().nonnegative().optional(),
25512
- openAtRest: external_exports.number().int().nonnegative().optional()
25552
+ openAtRest: external_exports.number().int().nonnegative().optional(),
25553
+ dismissed: external_exports.number().int().nonnegative().optional(),
25554
+ // The two halves of `caught`, for a reader that wants them apart: `handled` =
25555
+ // in-flight findings an enforcement action already contained; `resolved` =
25556
+ // at-rest findings closed out by fixing them. `handled + resolved === caught`.
25557
+ handled: external_exports.number().int().nonnegative().optional(),
25558
+ resolved: external_exports.number().int().nonnegative().optional()
25513
25559
  }).meta({ id: "SeveritySummaryItem" });
25514
25560
  var SeveritySummaryResponse = external_exports.object({
25515
25561
  // Sum of bySeverity[].count.
@@ -25517,6 +25563,9 @@ var SeveritySummaryResponse = external_exports.object({
25517
25563
  // Findings still open at rest (sum of bySeverity[].openAtRest). Optional and
25518
25564
  // additive — absent on the legacy response until the resolution feature lands.
25519
25565
  needsRemediation: external_exports.number().int().nonnegative().optional(),
25566
+ // Findings a user dismissed (sum of bySeverity[].dismissed). Excluded from
25567
+ // needsRemediation, and kept visible here so an accepted risk is not erased.
25568
+ dismissed: external_exports.number().int().nonnegative().optional(),
25520
25569
  // All four severity levels are always present (count may be 0).
25521
25570
  bySeverity: external_exports.array(SeveritySummaryItem)
25522
25571
  }).meta({ id: "SeveritySummaryResponse" });
@@ -32115,7 +32164,10 @@ var SqliteResolutionsRepository = class {
32115
32164
  * Insert many dispositions as ONE transaction — all of them or none.
32116
32165
  *
32117
32166
  * A dashboard dismissal closes every open finding of a rule, which is one
32118
- * write per key; run loose, a fault partway leaves half a rule closed with
32167
+ * write per key. It reaches this through
32168
+ * `LocalDatabase.dismissOpenFindingsForRule`, which calls it inside the
32169
+ * transaction that selected the keys, so there it runs as a SAVEPOINT of
32170
+ * that transaction. Run loose, a fault partway leaves half a rule closed with
32119
32171
  * nothing recording that the other half was meant to be. The caller then has
32120
32172
  * no way to tell a partial run from a complete one, because the card it
32121
32173
  * refreshes into just shows a smaller number either way.
@@ -32335,6 +32387,7 @@ function toSighting(row) {
32335
32387
  var SELECT_COLUMNS = `
32336
32388
  pointer_id AS pointerId,
32337
32389
  value_fingerprint AS valueFingerprint,
32390
+ value_identity_fingerprint AS valueIdentityFingerprint,
32338
32391
  fingerprint_key_version AS fingerprintKeyVersion,
32339
32392
  key_version AS keyVersion,
32340
32393
  format_version AS formatVersion,
@@ -32359,13 +32412,13 @@ var SqliteSecretVaultRepository = class {
32359
32412
  this.db = db;
32360
32413
  this.insertStmt = db.prepare(
32361
32414
  `INSERT INTO secret_vault (
32362
- pointer_id, value_fingerprint, fingerprint_key_version, key_version,
32363
- format_version, category, rule_id, masked_match, provider,
32415
+ pointer_id, value_fingerprint, value_identity_fingerprint,
32416
+ fingerprint_key_version, key_version, format_version, category, rule_id, masked_match, provider,
32364
32417
  ciphertext, nonce, auth_tag,
32365
32418
  user_authorized, occurrence_count, first_seen, last_seen
32366
32419
  ) VALUES (
32367
- :pointerId, :valueFingerprint, :fingerprintKeyVersion, :keyVersion,
32368
- :formatVersion, :category, :ruleId, :maskedMatch, :provider,
32420
+ :pointerId, :valueFingerprint, :valueIdentityFingerprint,
32421
+ :fingerprintKeyVersion, :keyVersion, :formatVersion, :category, :ruleId, :maskedMatch, :provider,
32369
32422
  :ciphertext, :nonce, :authTag,
32370
32423
  :userAuthorized, 1, :now, :now
32371
32424
  )`
@@ -32390,7 +32443,13 @@ var SqliteSecretVaultRepository = class {
32390
32443
  );
32391
32444
  this.refreshFingerprintStmt = db.prepare(
32392
32445
  `UPDATE secret_vault
32393
- SET value_fingerprint = :valueFingerprint, fingerprint_key_version = :fingerprintKeyVersion
32446
+ SET value_fingerprint = :valueFingerprint,
32447
+ value_identity_fingerprint = :valueIdentityFingerprint,
32448
+ fingerprint_key_version = :fingerprintKeyVersion
32449
+ WHERE pointer_id = :pointerId`
32450
+ );
32451
+ this.setIdentityStmt = db.prepare(
32452
+ `UPDATE secret_vault SET value_identity_fingerprint = :valueIdentityFingerprint
32394
32453
  WHERE pointer_id = :pointerId`
32395
32454
  );
32396
32455
  this.deleteByPointerStmt = db.prepare(`DELETE FROM secret_vault WHERE pointer_id = :pointerId`);
@@ -32407,6 +32466,7 @@ var SqliteSecretVaultRepository = class {
32407
32466
  listStmt;
32408
32467
  replaceCiphertextStmt;
32409
32468
  refreshFingerprintStmt;
32469
+ setIdentityStmt;
32410
32470
  deleteByPointerStmt;
32411
32471
  derefStmt;
32412
32472
  /**
@@ -32437,6 +32497,7 @@ var SqliteSecretVaultRepository = class {
32437
32497
  bindParams({
32438
32498
  pointerId: input2.pointerId,
32439
32499
  valueFingerprint: input2.valueFingerprint,
32500
+ valueIdentityFingerprint: input2.valueIdentityFingerprint,
32440
32501
  fingerprintKeyVersion: input2.fingerprintKeyVersion,
32441
32502
  keyVersion: input2.keyVersion,
32442
32503
  formatVersion: input2.formatVersion ?? POINTER_FORMAT_VERSION,
@@ -32498,7 +32559,15 @@ var SqliteSecretVaultRepository = class {
32498
32559
  replaceCiphertext(pointerId, next) {
32499
32560
  this.replaceCiphertextStmt.run({ pointerId, ...next });
32500
32561
  }
32501
- /** Re-derive an entry's fingerprint under a new fingerprint-key epoch. */
32562
+ /**
32563
+ * Correct an entry's identity fingerprint in place, leaving its exact
32564
+ * fingerprint and key epoch alone. For a row whose identity column still holds
32565
+ * the exact value copied in by the migration that added it.
32566
+ */
32567
+ setIdentityFingerprint(pointerId, valueIdentityFingerprint) {
32568
+ this.setIdentityStmt.run({ pointerId, valueIdentityFingerprint });
32569
+ }
32570
+ /** Re-derive an entry's fingerprints under a new fingerprint-key epoch. */
32502
32571
  refreshFingerprint(pointerId, next) {
32503
32572
  this.refreshFingerprintStmt.run({ pointerId, ...next });
32504
32573
  }
@@ -32629,7 +32698,7 @@ var SqliteSecretVaultRepository = class {
32629
32698
  `SELECT ${INVENTORY_COLUMNS},
32630
32699
  (SELECT e.id FROM exceptions e
32631
32700
  WHERE e.rule_id = v.rule_id
32632
- AND e.value_fingerprint = v.value_fingerprint
32701
+ AND e.value_fingerprint = v.value_identity_fingerprint
32633
32702
  AND e.key_version = v.fingerprint_key_version
32634
32703
  AND ${ACTIVE_REVEAL_GRANT_PREDICATE}
32635
32704
  LIMIT 1) AS grant_id
@@ -32672,7 +32741,7 @@ var SqliteSecretVaultRepository = class {
32672
32741
  `SELECT ${INVENTORY_COLUMNS},
32673
32742
  (SELECT e.id FROM exceptions e
32674
32743
  WHERE e.rule_id = v.rule_id
32675
- AND e.value_fingerprint = v.value_fingerprint
32744
+ AND e.value_fingerprint = v.value_identity_fingerprint
32676
32745
  AND e.key_version = v.fingerprint_key_version
32677
32746
  AND ${ACTIVE_REVEAL_GRANT_PREDICATE}
32678
32747
  LIMIT 1) AS grant_id
@@ -32776,6 +32845,18 @@ var OPEN_AT_REST_FINDINGS_SQL = `FROM inspection_findings f
32776
32845
  OR latest.status IS NULL
32777
32846
  OR latest.status NOT IN ('resolved', 'dismissed')
32778
32847
  )`;
32848
+ function selectOpenFindingKeysForRule(db, ruleId) {
32849
+ const rows = allRows(
32850
+ db.prepare(
32851
+ `SELECT DISTINCT f.finding_key AS finding_key
32852
+ ${OPEN_AT_REST_FINDINGS_SQL}
32853
+ AND d.rule_id = :ruleId
32854
+ AND f.finding_key IS NOT NULL`
32855
+ ),
32856
+ { ruleId }
32857
+ );
32858
+ return rows.map((r) => r.finding_key);
32859
+ }
32779
32860
  var SEVERITIES = ["critical", "high", "medium", "low"];
32780
32861
  var ACTION_TO_KIND = {
32781
32862
  block: "blocked",
@@ -32832,16 +32913,16 @@ var SqliteSecurityRepository = class {
32832
32913
  // findings are caught only once their latest disposition is resolved,
32833
32914
  // otherwise they are open-at-rest.
32834
32915
  //
32835
- // NOTE for future manual-resolution writers: only latest status
32836
- // 'resolved' counts as caught above. When acknowledged/dismissed/
32837
- // false-positive manual dispositions land, this must keep filtering by
32838
- // status/method — 'acknowledged' is accepted risk, not a fix, and must NOT
32839
- // be bucketed as caught alongside 'resolved'.
32916
+ // Only latest status 'resolved' counts as caught above. 'dismissed' is its
32917
+ // own bucket: a judgement rather than a fix, so it is neither caught nor
32918
+ // needing remediation, and stays countable. A further manual disposition
32919
+ // (acknowledged, false-positive) must be placed deliberately — 'acknowledged'
32920
+ // is accepted risk, not a fix, and must NOT be bucketed as caught.
32840
32921
  //
32841
32922
  // Legacy at-rest findings from pre-branch scans carry finding_key = NULL —
32842
32923
  // the resolution lifecycle is keyed by finding_key, so it can never attach a
32843
32924
  // disposition to (or clear) one of these on re-scan. They are excluded from
32844
- // both caught and openAtRest (untracked, not "needs remediation forever"),
32925
+ // all three buckets (untracked, not "needs remediation forever"),
32845
32926
  // but still counted in total/count below — this keeps this predicate
32846
32927
  // consistent with SqliteResolutionsRepository.openAtRestKeysForPath, which
32847
32928
  // already filters `finding_key IS NOT NULL`.
@@ -32864,12 +32945,25 @@ var SqliteSecurityRepository = class {
32864
32945
  WHEN latest.status = 'resolved' THEN 1
32865
32946
  ELSE 0
32866
32947
  END) AS caught,
32948
+ SUM(CASE WHEN e.event_type != 'code_change' THEN 1 ELSE 0 END) AS handled,
32867
32949
  SUM(CASE
32868
32950
  WHEN e.event_type = 'code_change'
32869
32951
  AND f.finding_key IS NOT NULL
32870
- AND (latest.status IS NULL OR latest.status != 'resolved') THEN 1
32952
+ AND latest.status = 'resolved' THEN 1
32953
+ ELSE 0
32954
+ END) AS resolved,
32955
+ SUM(CASE
32956
+ WHEN e.event_type = 'code_change'
32957
+ AND f.finding_key IS NOT NULL
32958
+ AND (latest.status IS NULL
32959
+ OR latest.status NOT IN ('resolved', 'dismissed')) THEN 1
32960
+ ELSE 0
32961
+ END) AS open_at_rest,
32962
+ SUM(CASE
32963
+ WHEN e.event_type = 'code_change'
32964
+ AND latest.status = 'dismissed' THEN 1
32871
32965
  ELSE 0
32872
- END) AS open_at_rest
32966
+ END) AS dismissed
32873
32967
  FROM inspection_findings f
32874
32968
  JOIN audit_events e INDEXED BY idx_audit_capture_rollup ON e.id = f.audit_event_id
32875
32969
  JOIN inspection_definitions d ON d.id = f.inspection_definition_id
@@ -32884,11 +32978,15 @@ var SqliteSecurityRepository = class {
32884
32978
  severity,
32885
32979
  count: byRow.get(severity)?.count ?? 0,
32886
32980
  caught: byRow.get(severity)?.caught ?? 0,
32887
- openAtRest: byRow.get(severity)?.open_at_rest ?? 0
32981
+ handled: byRow.get(severity)?.handled ?? 0,
32982
+ resolved: byRow.get(severity)?.resolved ?? 0,
32983
+ openAtRest: byRow.get(severity)?.open_at_rest ?? 0,
32984
+ dismissed: byRow.get(severity)?.dismissed ?? 0
32888
32985
  }));
32889
32986
  const total = bySeverity.reduce((sum, s) => sum + s.count, 0);
32890
32987
  const needsRemediation = bySeverity.reduce((sum, s) => sum + s.openAtRest, 0);
32891
- return Promise.resolve({ total, needsRemediation, bySeverity });
32988
+ const dismissed = bySeverity.reduce((sum, s) => sum + s.dismissed, 0);
32989
+ return Promise.resolve({ total, needsRemediation, dismissed, bySeverity });
32892
32990
  }
32893
32991
  // Range is echoed but does not change the result today — coverage is a constant
32894
32992
  // business fact (see SCAN_COVERAGE), not a measured per-window metric. Order
@@ -33205,10 +33303,10 @@ var SqliteSecurityRepository = class {
33205
33303
  * machine, and the second reported "no recommendations" over live exposure.
33206
33304
  *
33207
33305
  * `open` mirrors `deriveFindingStatus` — at-rest, minus resolved and dismissed —
33208
- * so a row's count is exactly what `?status=open&type=<rule>` returns. Note that
33209
- * is NOT `severitySummary`'s `openAtRest`, which keeps dismissed findings (a
33210
- * dismissal is a judgement, not a remediation) and drops untracked legacy rows.
33211
- * The two answer different questions and only this one has to match a link.
33306
+ * so a row's count is exactly what `?status=open&type=<rule>` returns. It
33307
+ * differs from `severitySummary`'s `openAtRest` only in including untracked
33308
+ * legacy rows, which that bucket leaves out; dismissed is excluded from both.
33309
+ * Only this one has to match a link.
33212
33310
  *
33213
33311
  * Aggregated in SQL: the result is O(distinct rule × category × severity), so a
33214
33312
  * whole-store scope costs a grouped scan rather than a row per finding.
@@ -33236,6 +33334,8 @@ var SqliteSecurityRepository = class {
33236
33334
  /**
33237
33335
  * The distinct `finding_key`s behind ONE rule's {@link recommendationInputs}
33238
33336
  * tally — what a dashboard dismissal of that row writes a disposition for.
33337
+ * The dismissal itself does not call this: it reads the same set through
33338
+ * {@link selectOpenFindingKeysForRule}, inside its own write transaction.
33239
33339
  *
33240
33340
  * It shares {@link OPEN_AT_REST_FINDINGS_SQL} with the count rather than
33241
33341
  * restating the predicate, because a dismissal has to act on exactly the set
@@ -33252,16 +33352,7 @@ var SqliteSecurityRepository = class {
33252
33352
  * this set SMALLER than the tally, never larger.
33253
33353
  */
33254
33354
  openFindingKeysForRule(ruleId) {
33255
- const rows = allRows(
33256
- this.db.prepare(
33257
- `SELECT DISTINCT f.finding_key AS finding_key
33258
- ${OPEN_AT_REST_FINDINGS_SQL}
33259
- AND d.rule_id = :ruleId
33260
- AND f.finding_key IS NOT NULL`
33261
- ),
33262
- { ruleId }
33263
- );
33264
- return Promise.resolve(rows.map((r) => r.finding_key));
33355
+ return Promise.resolve(selectOpenFindingKeysForRule(this.db, ruleId));
33265
33356
  }
33266
33357
  // Findings whose parent event occurred in [fromMs, toMs), with the parent's
33267
33358
  // epoch-millis timestamp. started_at is an INTEGER column, so the bounds stay
@@ -34307,6 +34398,31 @@ function openLocalDatabase(dir, options = {}) {
34307
34398
  );
34308
34399
  });
34309
34400
  }
34401
+ function dismissOpenFindingsForRule(ruleId, disposition) {
34402
+ let dismissed = 0;
34403
+ withTransaction(
34404
+ db,
34405
+ () => {
34406
+ const keys = selectOpenFindingKeysForRule(db, ruleId);
34407
+ resolutions.insertResolutions(
34408
+ keys.map((findingKey) => ({
34409
+ findingKey,
34410
+ status: "dismissed",
34411
+ method: disposition.method,
34412
+ resolvedAt: disposition.resolvedAt,
34413
+ evidence: disposition.evidence
34414
+ }))
34415
+ );
34416
+ dismissed = keys.length;
34417
+ },
34418
+ // IMMEDIATE takes the write lock at BEGIN, before the select, which is
34419
+ // what keeps a concurrent resolve out of the gap. It also makes waiting
34420
+ // on a busy writer an ordinary busy_timeout wait rather than a
34421
+ // read-to-write upgrade SQLite refuses to retry.
34422
+ "IMMEDIATE"
34423
+ );
34424
+ return dismissed;
34425
+ }
34310
34426
  function recordCapture(event, detected) {
34311
34427
  failOpenTransaction(db, () => {
34312
34428
  const sessionId = event.metadata?.sessionId;
@@ -34490,6 +34606,7 @@ function openLocalDatabase(dir, options = {}) {
34490
34606
  inspectionDefinitions,
34491
34607
  inspectionFindings,
34492
34608
  recordCapture,
34609
+ dismissOpenFindingsForRule,
34493
34610
  markCaptureDelivered,
34494
34611
  markCaptureOwed,
34495
34612
  markAuditEventsDelivered,
@@ -34575,6 +34692,9 @@ var MAX_RESPONSE_BYTES = 8 * 1024 * 1024;
34575
34692
  // ../../packages/remote/src/client.ts
34576
34693
  var SLASH2 = "/".charCodeAt(0);
34577
34694
 
34695
+ // ../../packages/plugin-runtime/src/attached/with-timeout.ts
34696
+ var REQUEST_TIMEOUT_MS = 2e3;
34697
+
34578
34698
  // ../../packages/plugin-runtime/src/attached/forward-drops.ts
34579
34699
  import { readFileSync as readFileSync10 } from "fs";
34580
34700
  import { join as join16 } from "path";
@@ -35207,6 +35327,10 @@ function escapeRegExp2(value) {
35207
35327
  return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
35208
35328
  }
35209
35329
 
35330
+ // ../../packages/detections/src/format-chars.ts
35331
+ var HAS_FORMAT_CHAR = new RegExp("\\p{Cf}", "u");
35332
+ var FORMAT_CHAR_GLOBAL = new RegExp("\\p{Cf}", "gu");
35333
+
35210
35334
  // ../../packages/detections/src/regex-cache.ts
35211
35335
  var singles = /* @__PURE__ */ new WeakMap();
35212
35336
  var keywordLists = /* @__PURE__ */ new WeakMap();
@@ -35575,13 +35699,18 @@ import { spawn } from "child_process";
35575
35699
  import { fileURLToPath as fileURLToPath2 } from "url";
35576
35700
  var HISTORY_SYNC_THROTTLE_MS = 5 * 60 * 1e3;
35577
35701
 
35702
+ // ../../packages/plugin-runtime/src/attached/install-record.ts
35703
+ import { readFile as readFile2, stat } from "fs/promises";
35704
+ import { basename as basename6, dirname as dirname6, join as join28, resolve as resolve2 } from "path";
35705
+
35578
35706
  // ../../packages/plugin-runtime/src/attached/plugin-block.ts
35579
35707
  import { readFileSync as readFileSync18 } from "fs";
35708
+ var INSTALL_RECORD_READ_TIMEOUT_MS = REQUEST_TIMEOUT_MS / 2;
35580
35709
 
35581
35710
  // ../../packages/plugin-runtime/src/attached/policy-store.ts
35582
35711
  import { randomUUID as randomUUID16 } from "crypto";
35583
- import { readFile as readFile2, rm, writeFile as writeFile2 } from "fs/promises";
35584
- import { join as join28 } from "path";
35712
+ import { readFile as readFile3, rm, writeFile as writeFile2 } from "fs/promises";
35713
+ import { join as join29 } from "path";
35585
35714
 
35586
35715
  // ../../packages/plugin-runtime/src/attached/atomic-publish.ts
35587
35716
  import { rename as rename2 } from "fs/promises";
@@ -35591,7 +35720,7 @@ var ATTEMPTS = 1 + IMMEDIATE_RETRIES + TIMED_RETRIES;
35591
35720
 
35592
35721
  // ../../packages/plugin-runtime/src/attached/posture-report-state.ts
35593
35722
  import { readFileSync as readFileSync19 } from "fs";
35594
- import { join as join29 } from "path";
35723
+ import { join as join30 } from "path";
35595
35724
  var OUTCOME_KEYS = {
35596
35725
  ok: true,
35597
35726
  unauthorized: true,
@@ -35613,12 +35742,12 @@ import { DatabaseSync as DatabaseSync4 } from "node:sqlite";
35613
35742
 
35614
35743
  // ../../packages/plugin-runtime/src/attached/posture-store.ts
35615
35744
  import { randomUUID as randomUUID17 } from "crypto";
35616
- import { readFile as readFile3, rm as rm2, writeFile as writeFile3 } from "fs/promises";
35617
- import { join as join30 } from "path";
35745
+ import { readFile as readFile4, rm as rm2, writeFile as writeFile3 } from "fs/promises";
35746
+ import { join as join31 } from "path";
35618
35747
 
35619
35748
  // ../../packages/plugin-runtime/src/attached/sync-state.ts
35620
35749
  import { readFileSync as readFileSync20 } from "fs";
35621
- import { join as join31 } from "path";
35750
+ import { join as join32 } from "path";
35622
35751
 
35623
35752
  // ../../packages/plugin-runtime/src/attached/status.ts
35624
35753
  var REFUSAL_LINES = {