shieldcortex 4.30.2 → 4.31.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. package/README.md +16 -10
  2. package/dashboard/.next/standalone/dashboard/.next/BUILD_ID +1 -1
  3. package/dashboard/.next/standalone/dashboard/.next/build-manifest.json +2 -2
  4. package/dashboard/.next/standalone/dashboard/.next/prerender-manifest.json +3 -3
  5. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/admin/page/next-font-manifest.json +1 -1
  6. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/admin/page_client-reference-manifest.js +1 -1
  7. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/cloud/page/next-font-manifest.json +1 -1
  8. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/cloud/page_client-reference-manifest.js +1 -1
  9. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/capture/page/next-font-manifest.json +1 -1
  10. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/capture/page_client-reference-manifest.js +1 -1
  11. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/graph/page/next-font-manifest.json +1 -1
  12. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/graph/page_client-reference-manifest.js +1 -1
  13. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/page/next-font-manifest.json +1 -1
  14. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/page_client-reference-manifest.js +1 -1
  15. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/recall/page/next-font-manifest.json +1 -1
  16. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/recall/page_client-reference-manifest.js +1 -1
  17. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/replay/page/next-font-manifest.json +1 -1
  18. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/replay/page_client-reference-manifest.js +1 -1
  19. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/review/page/next-font-manifest.json +1 -1
  20. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/review/page_client-reference-manifest.js +1 -1
  21. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/timeline/page/next-font-manifest.json +1 -1
  22. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/timeline/page_client-reference-manifest.js +1 -1
  23. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/overview/page/next-font-manifest.json +1 -1
  24. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/overview/page_client-reference-manifest.js +1 -1
  25. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/audit/page/next-font-manifest.json +1 -1
  26. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/audit/page_client-reference-manifest.js +1 -1
  27. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/intercepts/page/next-font-manifest.json +1 -1
  28. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/intercepts/page_client-reference-manifest.js +1 -1
  29. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/iron-dome/page/next-font-manifest.json +1 -1
  30. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/iron-dome/page_client-reference-manifest.js +1 -1
  31. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/page/next-font-manifest.json +1 -1
  32. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/page_client-reference-manifest.js +1 -1
  33. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/policies/page/next-font-manifest.json +1 -1
  34. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/policies/page_client-reference-manifest.js +1 -1
  35. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/quarantine/page/next-font-manifest.json +1 -1
  36. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/quarantine/page_client-reference-manifest.js +1 -1
  37. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/settings/page/next-font-manifest.json +1 -1
  38. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  39. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/page/next-font-manifest.json +1 -1
  40. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/page_client-reference-manifest.js +1 -1
  41. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/xray/page/next-font-manifest.json +1 -1
  42. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/xray/page_client-reference-manifest.js +1 -1
  43. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/xray/page/next-font-manifest.json +1 -1
  44. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/xray/page_client-reference-manifest.js +1 -1
  45. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.html +2 -2
  46. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.rsc +1 -1
  47. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  48. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  49. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  50. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  51. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  52. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found/page/next-font-manifest.json +1 -1
  53. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  54. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.html +2 -2
  55. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.rsc +2 -2
  56. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  57. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  58. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  59. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  60. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  61. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  62. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.html +1 -1
  63. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.rsc +3 -3
  64. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk/admin/__PAGE__.segment.rsc +1 -1
  65. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk/admin.segment.rsc +1 -1
  66. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  67. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_full.segment.rsc +3 -3
  68. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  69. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_index.segment.rsc +2 -2
  70. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_tree.segment.rsc +3 -3
  71. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.html +1 -1
  72. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.rsc +3 -3
  73. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk/cloud/__PAGE__.segment.rsc +1 -1
  74. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk/cloud.segment.rsc +1 -1
  75. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  76. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_full.segment.rsc +3 -3
  77. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_head.segment.rsc +1 -1
  78. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_index.segment.rsc +2 -2
  79. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_tree.segment.rsc +3 -3
  80. package/dashboard/.next/standalone/dashboard/.next/server/app/index.html +1 -1
  81. package/dashboard/.next/standalone/dashboard/.next/server/app/index.rsc +3 -3
  82. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  83. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_full.segment.rsc +3 -3
  84. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_head.segment.rsc +1 -1
  85. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_index.segment.rsc +2 -2
  86. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_tree.segment.rsc +3 -3
  87. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.html +1 -1
  88. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.rsc +3 -3
  89. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory/capture/__PAGE__.segment.rsc +1 -1
  90. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory/capture.segment.rsc +1 -1
  91. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  92. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  93. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_full.segment.rsc +3 -3
  94. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_head.segment.rsc +1 -1
  95. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_index.segment.rsc +2 -2
  96. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_tree.segment.rsc +3 -3
  97. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.html +1 -1
  98. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.rsc +3 -3
  99. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory/graph/__PAGE__.segment.rsc +1 -1
  100. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory/graph.segment.rsc +1 -1
  101. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  102. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  103. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_full.segment.rsc +3 -3
  104. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_head.segment.rsc +1 -1
  105. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_index.segment.rsc +2 -2
  106. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_tree.segment.rsc +3 -3
  107. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.html +1 -1
  108. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.rsc +3 -3
  109. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory/recall/__PAGE__.segment.rsc +1 -1
  110. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory/recall.segment.rsc +1 -1
  111. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  112. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  113. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_full.segment.rsc +3 -3
  114. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_head.segment.rsc +1 -1
  115. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_index.segment.rsc +2 -2
  116. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_tree.segment.rsc +3 -3
  117. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.html +2 -2
  118. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.rsc +3 -3
  119. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk/memory/replay/__PAGE__.segment.rsc +1 -1
  120. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk/memory/replay.segment.rsc +1 -1
  121. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  122. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  123. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_full.segment.rsc +3 -3
  124. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_head.segment.rsc +1 -1
  125. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_index.segment.rsc +2 -2
  126. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_tree.segment.rsc +3 -3
  127. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.html +1 -1
  128. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.rsc +3 -3
  129. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory/review/__PAGE__.segment.rsc +1 -1
  130. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory/review.segment.rsc +1 -1
  131. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  132. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  133. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_full.segment.rsc +3 -3
  134. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_head.segment.rsc +1 -1
  135. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_index.segment.rsc +2 -2
  136. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_tree.segment.rsc +3 -3
  137. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.html +1 -1
  138. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.rsc +3 -3
  139. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory/timeline/__PAGE__.segment.rsc +1 -1
  140. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory/timeline.segment.rsc +1 -1
  141. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  142. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  143. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_full.segment.rsc +3 -3
  144. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_head.segment.rsc +1 -1
  145. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_index.segment.rsc +2 -2
  146. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_tree.segment.rsc +3 -3
  147. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.html +2 -2
  148. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.rsc +3 -3
  149. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk/memory/__PAGE__.segment.rsc +1 -1
  150. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  151. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  152. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_full.segment.rsc +3 -3
  153. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_head.segment.rsc +1 -1
  154. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_index.segment.rsc +2 -2
  155. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_tree.segment.rsc +3 -3
  156. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.html +2 -2
  157. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.rsc +3 -3
  158. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk/overview/__PAGE__.segment.rsc +1 -1
  159. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk/overview.segment.rsc +1 -1
  160. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  161. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_full.segment.rsc +3 -3
  162. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_head.segment.rsc +1 -1
  163. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_index.segment.rsc +2 -2
  164. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_tree.segment.rsc +3 -3
  165. package/dashboard/.next/standalone/dashboard/.next/server/app/page/next-font-manifest.json +1 -1
  166. package/dashboard/.next/standalone/dashboard/.next/server/app/page_client-reference-manifest.js +1 -1
  167. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.html +1 -1
  168. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.rsc +3 -3
  169. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection/audit/__PAGE__.segment.rsc +1 -1
  170. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection/audit.segment.rsc +1 -1
  171. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  172. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  173. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_full.segment.rsc +3 -3
  174. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_head.segment.rsc +1 -1
  175. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_index.segment.rsc +2 -2
  176. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_tree.segment.rsc +3 -3
  177. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.html +1 -1
  178. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.rsc +3 -3
  179. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection/intercepts/__PAGE__.segment.rsc +1 -1
  180. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection/intercepts.segment.rsc +1 -1
  181. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  182. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  183. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_full.segment.rsc +3 -3
  184. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_head.segment.rsc +1 -1
  185. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_index.segment.rsc +2 -2
  186. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_tree.segment.rsc +3 -3
  187. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.html +1 -1
  188. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.rsc +3 -3
  189. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection/iron-dome/__PAGE__.segment.rsc +1 -1
  190. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection/iron-dome.segment.rsc +1 -1
  191. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  192. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  193. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_full.segment.rsc +3 -3
  194. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_head.segment.rsc +1 -1
  195. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_index.segment.rsc +2 -2
  196. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_tree.segment.rsc +3 -3
  197. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.html +1 -1
  198. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.rsc +3 -3
  199. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection/policies/__PAGE__.segment.rsc +1 -1
  200. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection/policies.segment.rsc +1 -1
  201. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  202. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  203. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_full.segment.rsc +3 -3
  204. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_head.segment.rsc +1 -1
  205. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_index.segment.rsc +2 -2
  206. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_tree.segment.rsc +3 -3
  207. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.html +1 -1
  208. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.rsc +3 -3
  209. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection/quarantine/__PAGE__.segment.rsc +1 -1
  210. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection/quarantine.segment.rsc +1 -1
  211. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  212. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  213. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_full.segment.rsc +3 -3
  214. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_head.segment.rsc +1 -1
  215. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_index.segment.rsc +2 -2
  216. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_tree.segment.rsc +3 -3
  217. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.html +2 -2
  218. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.rsc +3 -3
  219. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk/protection/__PAGE__.segment.rsc +1 -1
  220. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  221. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  222. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_full.segment.rsc +3 -3
  223. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_head.segment.rsc +1 -1
  224. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_index.segment.rsc +2 -2
  225. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_tree.segment.rsc +3 -3
  226. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.html +2 -2
  227. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.rsc +3 -3
  228. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings/__PAGE__.segment.rsc +1 -1
  229. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings.segment.rsc +1 -1
  230. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  231. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  232. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  233. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  234. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_tree.segment.rsc +3 -3
  235. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.html +1 -1
  236. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.rsc +3 -3
  237. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain/xray/__PAGE__.segment.rsc +1 -1
  238. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain/xray.segment.rsc +1 -1
  239. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain.segment.rsc +1 -1
  240. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  241. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_full.segment.rsc +3 -3
  242. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_head.segment.rsc +1 -1
  243. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_index.segment.rsc +2 -2
  244. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_tree.segment.rsc +3 -3
  245. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.html +1 -1
  246. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.rsc +3 -3
  247. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk/supply-chain/__PAGE__.segment.rsc +1 -1
  248. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk/supply-chain.segment.rsc +1 -1
  249. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  250. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_full.segment.rsc +3 -3
  251. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_head.segment.rsc +1 -1
  252. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_index.segment.rsc +2 -2
  253. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_tree.segment.rsc +3 -3
  254. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.html +2 -2
  255. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.rsc +3 -3
  256. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk/xray/__PAGE__.segment.rsc +1 -1
  257. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk/xray.segment.rsc +1 -1
  258. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  259. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_full.segment.rsc +3 -3
  260. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_head.segment.rsc +1 -1
  261. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_index.segment.rsc +2 -2
  262. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_tree.segment.rsc +3 -3
  263. package/dashboard/.next/standalone/dashboard/.next/server/next-font-manifest.js +1 -1
  264. package/dashboard/.next/standalone/dashboard/.next/server/next-font-manifest.json +22 -22
  265. package/dashboard/.next/standalone/dashboard/.next/server/pages/404.html +2 -2
  266. package/dashboard/.next/standalone/dashboard/.next/server/pages/500.html +2 -2
  267. package/dashboard/.next/standalone/dashboard/.next/server/server-reference-manifest.js +1 -1
  268. package/dashboard/.next/standalone/dashboard/.next/server/server-reference-manifest.json +1 -1
  269. package/dashboard/.next/standalone/dashboard/.next/static/chunks/{a7d5d0791c8c6223.css → 34d933785a17edf3.css} +1 -1
  270. package/dashboard/.next/standalone/dashboard/.next/static/media/4fa387ec64143e14-s.3b336396.woff2 +0 -0
  271. package/dashboard/.next/standalone/dashboard/.next/static/media/5ce348bf30bf5439-s.56c1f21e.woff2 +0 -0
  272. package/dashboard/.next/standalone/dashboard/.next/static/media/6306c77e7c8268e4-s.e3369375.woff2 +0 -0
  273. package/dashboard/.next/standalone/dashboard/.next/static/media/797e433ab948586e-s.p.29207c2f.woff2 +0 -0
  274. package/dashboard/.next/standalone/dashboard/.next/static/media/7d817b4c03b0c5f1-s.a40b9a8b.woff2 +0 -0
  275. package/dashboard/.next/standalone/dashboard/.next/static/media/bbc41e54d2fcbd21-s.fe42ddf4.woff2 +0 -0
  276. package/dist/cli/doctor.d.ts +7 -3
  277. package/dist/cli/doctor.js +13 -15
  278. package/dist/cli/update.js +20 -8
  279. package/dist/integrations/openclaw-plugin-state.d.ts +12 -0
  280. package/dist/integrations/openclaw-plugin-state.js +91 -0
  281. package/dist/memory/consolidate.js +8 -0
  282. package/package.json +1 -1
  283. package/scripts/lib/extract-memorable-segments.mjs +57 -11
  284. package/scripts/lib/openclaw-extract.mjs +4 -1
  285. package/scripts/lib/truncate.mjs +19 -7
  286. package/dashboard/.next/standalone/dashboard/.next/static/media/4fa387ec64143e14-s.c36e1862.woff2 +0 -0
  287. package/dashboard/.next/standalone/dashboard/.next/static/media/5ce348bf30bf5439-s.ebceb24d.woff2 +0 -0
  288. package/dashboard/.next/standalone/dashboard/.next/static/media/6306c77e7c8268e4-s.ff4a2084.woff2 +0 -0
  289. package/dashboard/.next/standalone/dashboard/.next/static/media/797e433ab948586e-s.p.479bea2b.woff2 +0 -0
  290. package/dashboard/.next/standalone/dashboard/.next/static/media/7d817b4c03b0c5f1-s.f377b9c4.woff2 +0 -0
  291. package/dashboard/.next/standalone/dashboard/.next/static/media/bbc41e54d2fcbd21-s.d1207556.woff2 +0 -0
  292. /package/dashboard/.next/standalone/dashboard/.next/static/{MdaHBj41tyYd_mFYwHmZ7 → T0hqc-Le01c8QVY0VrHnu}/_buildManifest.js +0 -0
  293. /package/dashboard/.next/standalone/dashboard/.next/static/{MdaHBj41tyYd_mFYwHmZ7 → T0hqc-Le01c8QVY0VrHnu}/_clientMiddlewareManifest.json +0 -0
  294. /package/dashboard/.next/standalone/dashboard/.next/static/{MdaHBj41tyYd_mFYwHmZ7 → T0hqc-Le01c8QVY0VrHnu}/_ssgManifest.js +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shieldcortex",
3
- "version": "4.30.2",
3
+ "version": "4.31.1",
4
4
  "description": "Trustworthy memory and security for AI agents. Recall debugging, review queue, OpenClaw session capture, and memory poisoning defence for Claude Code, Codex, OpenClaw, LangChain, and MCP agents.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -188,6 +188,35 @@ export function calculateSalience(text, opts = {}) {
188
188
  return Math.min(ceiling, score);
189
189
  }
190
190
 
191
+ // Function words a genuine mid-clause fragment trails off on (conjunctions,
192
+ // prepositions, articles, copulas). A capture ending here was cut while the
193
+ // thought was still going. A capture ending on a CONTENT word is treated as
194
+ // complete even without terminal punctuation — the extractor regex caps at
195
+ // ~200 chars with an OPTIONAL terminator, so complete long facts routinely
196
+ // arrive unpunctuated and must NOT be mistaken for fragments (review 2026-06-08).
197
+ const DANGLING_TAIL =
198
+ /\b(?:and|or|but|nor|the|a|an|to|of|in|on|at|by|for|with|without|from|as|is|are|was|were|be|been|that|which|who|whose|because|so|if|when|while|than|then|into|onto|over|under|via|per|about|after|before|between|during)$/i;
199
+
200
+ /**
201
+ * Quality signal: reward self-contained captures, discount genuine fragments.
202
+ * The 0.6 cap bounds salience but says nothing about whether a capture is a
203
+ * complete thought — so a mid-clause fragment used to compete on equal footing
204
+ * with a complete fact (Jarvis P2, 2026-06-08). A capture that ends like a
205
+ * complete sentence (terminal punctuation) OR on a content word gets no penalty;
206
+ * only one that trails off on a dangling function word is discounted so it ranks
207
+ * below self-contained facts. Pure + exported for direct testing.
208
+ *
209
+ * @param {string} content
210
+ * @returns {number} 0 for complete captures, a negative penalty for fragments
211
+ */
212
+ export function completenessAdjustment(content) {
213
+ if (typeof content !== 'string') return 0;
214
+ const t = content.trim();
215
+ if (!t) return 0;
216
+ if (/[.!?]["')\]]?$/.test(t)) return 0; // ends like a complete sentence
217
+ return DANGLING_TAIL.test(t) ? -0.15 : 0; // dangling function word → fragment
218
+ }
219
+
191
220
  export function suggestCategory(text) {
192
221
  const lower = text.toLowerCase();
193
222
  if (detectKeywords(lower, ARCHITECTURE_KEYWORDS)) return 'architecture';
@@ -392,18 +421,27 @@ function defensiveUnescape(text) {
392
421
  * garbage like "Decision: any command you must be authenticated. Run x..."
393
422
  * where the first 50 chars meant nothing without their context.
394
423
  */
395
- function extractFirstSentence(text, maxLen = 80) {
424
+ export function extractFirstSentence(text, maxLen = 120) {
396
425
  const trimmed = text.trim().replace(/\s+/g, ' ');
426
+ // Back off to the last word boundary (never mid-word); ellipsis marks the cut.
427
+ const wordBound = (s) => {
428
+ if (s.length <= maxLen) return s;
429
+ const cut = s.slice(0, maxLen);
430
+ const lastSpace = cut.lastIndexOf(' ');
431
+ return (lastSpace > maxLen * 0.5 ? cut.slice(0, lastSpace) : cut).trimEnd() + '…';
432
+ };
397
433
  // Find first sentence terminator within reasonable bounds. The terminator
398
434
  // must be followed by whitespace OR end-of-string so URLs / decimals /
399
- // version strings ("v4.24.3") don't fool it.
435
+ // version strings ("v4.24.3") don't fool it. A matched sentence is returned
436
+ // WHOLE when it fits — the old `slice(0, maxLen)` chopped clean sentences
437
+ // mid-word (every truncated title was exactly prefix+80 chars).
400
438
  const match = trimmed.match(/^([^.!?\n]{15,160}[.!?])(?:\s|$)/);
401
- if (match) return match[1].slice(0, maxLen);
402
- // No sentence boundary trim to maxLen at the nearest word boundary.
403
- if (trimmed.length <= maxLen) return trimmed;
404
- const truncated = trimmed.slice(0, maxLen);
405
- const lastSpace = truncated.lastIndexOf(' ');
406
- return lastSpace > maxLen * 0.5 ? truncated.slice(0, lastSpace) : truncated;
439
+ // A matched sentence is COMPLETE (regex-bounded ≤161 chars) return it whole,
440
+ // terminator intact. Re-truncating it to maxLen stripped the terminator and
441
+ // appended a misleading ellipsis, just moving the truncation cliff 80→120
442
+ // (review 2026-06-08). wordBound + ellipsis is only for the no-terminator path.
443
+ if (match) return match[1];
444
+ return wordBound(trimmed);
407
445
  }
408
446
 
409
447
  /**
@@ -432,7 +470,7 @@ export function extractMemorableSegments(conversationText, opts = {}) {
432
470
  // v4.24.3: headline = first sentence (sentence-bounded), not
433
471
  // the first 50 chars. Eliminates mid-clause garbage in the
434
472
  // MEMORY.md index.
435
- const headline = extractFirstSentence(content, 80);
473
+ const headline = extractFirstSentence(content, 120);
436
474
  const title = extractor.titlePrefix + headline;
437
475
  segments.push({
438
476
  title,
@@ -666,7 +704,15 @@ export function processSegments(segments, dynamicThreshold = BASE_THRESHOLD, opt
666
704
 
667
705
  for (const seg of unique) {
668
706
  const frequencyBoost = applyFrequencyBoost ? calculateFrequencyBoost(seg, unique) : 0;
669
- seg.salience = Math.min(AUTO_EXTRACT_SALIENCE_CAP, seg.baseSalience + frequencyBoost);
707
+ // The fragment penalty is applied AFTER the cap so a high-keyword fragment
708
+ // can't tie a complete fact at the ceiling — a self-contained fact always
709
+ // out-ranks an otherwise-equivalent fragment (Jarvis P2). The STORED salience
710
+ // carries the penalty (so it ranks lower at recall too), but the SURVIVAL
711
+ // gate below uses the UN-penalised value so the penalty can only re-rank,
712
+ // never silently drop a memory that would otherwise be kept (review 2026-06-08).
713
+ const capped = Math.min(AUTO_EXTRACT_SALIENCE_CAP, seg.baseSalience + frequencyBoost);
714
+ seg.gateSalience = capped;
715
+ seg.salience = Math.max(0, capped + completenessAdjustment(seg.content));
670
716
  seg.frequencyBoost = frequencyBoost;
671
717
  }
672
718
 
@@ -674,7 +720,7 @@ export function processSegments(segments, dynamicThreshold = BASE_THRESHOLD, opt
674
720
 
675
721
  const filtered = unique.filter((seg) => {
676
722
  const threshold = getExtractionThreshold(seg.category, dynamicThreshold, categoryThresholds);
677
- return seg.salience >= threshold;
723
+ return seg.gateSalience >= threshold;
678
724
  });
679
725
 
680
726
  return filtered.slice(0, maxMemories);
@@ -17,6 +17,7 @@ import {
17
17
  extractMemorableSegments,
18
18
  processSegments,
19
19
  shouldRejectCandidate,
20
+ extractFirstSentence,
20
21
  EXTRACTOR_TO_CATEGORY,
21
22
  EXTRACTOR_TO_PURPOSE,
22
23
  } from './extract-memorable-segments.mjs';
@@ -116,7 +117,9 @@ export function extractKeywordMemory(content, extractorType) {
116
117
  const category = EXTRACTOR_TO_CATEGORY[resolvedType] ?? 'note';
117
118
  const memoryPurpose = EXTRACTOR_TO_PURPOSE[resolvedType] ?? 'project';
118
119
 
119
- const title = trimmed.slice(0, 80).replace(/["\n]/g, ' ').trim();
120
+ // Sentence/word-bounded via the shared chunker helper — never a mid-word
121
+ // slice (was a raw trimmed.slice(0, 80), the one path that bypassed it).
122
+ const title = extractFirstSentence(trimmed.replace(/["\n]/g, ' '), 120);
120
123
 
121
124
  return [
122
125
  {
@@ -25,17 +25,29 @@ export function truncatePreservingWords(text, maxChars, lookback = 20) {
25
25
  if (typeof text !== 'string') return text;
26
26
  if (text.length <= maxChars) return text;
27
27
  const slice = text.slice(0, maxChars);
28
- const minIdx = Math.max(0, maxChars - lookback);
29
- const lastBoundary = Math.max(
30
- slice.lastIndexOf(' '),
28
+ // Prefer a SENTENCE boundary, searched in a generous window, so a complete
29
+ // earlier sentence beats a nearer mid-sentence word break (jarvis 2026-06-08:
30
+ // "prefer a complete sentence over a fixed character window"). The previous
31
+ // single Math.max over all boundaries let the rightmost word-space win,
32
+ // producing word-complete but sentence-incomplete snippets.
33
+ const sentenceMin = Math.max(0, maxChars - lookback * 3);
34
+ const sentenceEnd = Math.max(
31
35
  slice.lastIndexOf('. '),
36
+ slice.lastIndexOf('! '),
37
+ slice.lastIndexOf('? '),
38
+ slice.lastIndexOf('\n'),
39
+ );
40
+ if (sentenceEnd >= sentenceMin) {
41
+ return slice.slice(0, sentenceEnd + 1).trimEnd() + '…';
42
+ }
43
+ // No sentence boundary nearby — back off to the last word boundary.
44
+ const wordMin = Math.max(0, maxChars - lookback);
45
+ const wordEnd = Math.max(
46
+ slice.lastIndexOf(' '),
32
47
  slice.lastIndexOf(', '),
33
48
  slice.lastIndexOf('; '),
34
49
  slice.lastIndexOf(': '),
35
- slice.lastIndexOf('\n'),
36
- slice.lastIndexOf('? '),
37
- slice.lastIndexOf('! '),
38
50
  );
39
- const cutAt = lastBoundary >= minIdx ? lastBoundary : maxChars;
51
+ const cutAt = wordEnd >= wordMin ? wordEnd : maxChars;
40
52
  return slice.slice(0, cutAt).trimEnd() + '…';
41
53
  }