plugin-scanner 2.0.176__tar.gz → 2.0.178__tar.gz

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 (473) hide show
  1. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/PKG-INFO +1 -1
  2. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/approval-center-primitives.tsx +152 -14
  3. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/home-dashboard.tsx +18 -15
  4. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/review-workspace.tsx +10 -10
  5. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/pyproject.toml +1 -1
  6. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/pyproject.toml.bak +1 -1
  7. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/daemon/static/assets/guard-dashboard.js +31 -36
  8. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/daemon/static/assets/index.css +47 -29
  9. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/version.py +1 -1
  10. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/.clusterfuzzlite/Dockerfile +0 -0
  11. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/.clusterfuzzlite/build.sh +0 -0
  12. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/.clusterfuzzlite/project.yaml +0 -0
  13. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/.clusterfuzzlite/requirements-atheris.txt +0 -0
  14. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/.dockerignore +0 -0
  15. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/.github/CODEOWNERS +0 -0
  16. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  17. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  18. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
  19. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/.github/dependabot.yml +0 -0
  20. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/.github/workflows/ci.yml +0 -0
  21. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/.github/workflows/codeql.yml +0 -0
  22. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/.github/workflows/dependabot-uv-lock.yml +0 -0
  23. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/.github/workflows/fuzz.yml +0 -0
  24. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/.github/workflows/harness-smoke.yml +0 -0
  25. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/.github/workflows/publish.yml +0 -0
  26. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/.github/workflows/scorecard.yml +0 -0
  27. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/.gitignore +0 -0
  28. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/.pre-commit-hooks.yaml +0 -0
  29. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/CONTRIBUTING.md +0 -0
  30. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/Dockerfile +0 -0
  31. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/LICENSE +0 -0
  32. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/README.md +0 -0
  33. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/SECURITY.md +0 -0
  34. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/index.html +0 -0
  35. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/package.json +0 -0
  36. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/pnpm-lock.yaml +0 -0
  37. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/public/apple-touch-icon.png +0 -0
  38. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/public/brand/Logo_Icon_Dark.png +0 -0
  39. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/public/brand/Logo_Whole.png +0 -0
  40. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/public/favicon-16x16.png +0 -0
  41. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/public/favicon-32x32.png +0 -0
  42. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/public/favicon.ico +0 -0
  43. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/app.tsx +0 -0
  44. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/approval-center-layout.test.ts +0 -0
  45. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/approval-center-layout.tsx +0 -0
  46. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/approval-center-mobile.test.ts +0 -0
  47. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/approval-center-review-cards.tsx +0 -0
  48. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/approval-center-utils.ts +0 -0
  49. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/apps/app-detail-workspace.tsx +0 -0
  50. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/data-flow-evidence-card.tsx +0 -0
  51. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/error-boundary.tsx +0 -0
  52. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/fleet-workspace.tsx +0 -0
  53. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/guard-api.test.ts +0 -0
  54. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/guard-api.ts +0 -0
  55. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/guard-demo.ts +0 -0
  56. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/guard-types.ts +0 -0
  57. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/help-modal.tsx +0 -0
  58. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/home-dashboard.test.ts +0 -0
  59. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/main.tsx +0 -0
  60. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/queue-chip-filter.tsx +0 -0
  61. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/queue-state.test.ts +0 -0
  62. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/queue-state.ts +0 -0
  63. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/receipts-workspace.test.ts +0 -0
  64. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/receipts-workspace.tsx +0 -0
  65. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/risk-signal-cards.test.ts +0 -0
  66. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/risk-signal-cards.tsx +0 -0
  67. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/runtime-overview.test.ts +0 -0
  68. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/runtime-overview.tsx +0 -0
  69. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/scanner-evidence-badge.tsx +0 -0
  70. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/settings-workspace.test.ts +0 -0
  71. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/settings-workspace.tsx +0 -0
  72. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/styles.css +0 -0
  73. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/use-focus-trap.ts +0 -0
  74. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/vite-env.d.ts +0 -0
  75. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/src/watched-app-card.tsx +0 -0
  76. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/tsconfig.json +0 -0
  77. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/dashboard/vite.config.ts +0 -0
  78. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/docker-requirements.txt +0 -0
  79. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/docs/guard/approval-audit.md +0 -0
  80. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/docs/guard/architecture.md +0 -0
  81. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/docs/guard/get-started.md +0 -0
  82. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/docs/guard/harness-support.md +0 -0
  83. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/docs/guard/local-vs-cloud.md +0 -0
  84. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/docs/guard/release-checklist.md +0 -0
  85. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/docs/guard/release-notes.md +0 -0
  86. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/docs/guard/smoke-tests.md +0 -0
  87. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/docs/guard/testing-matrix.md +0 -0
  88. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/docs/trust/mcp-trust-draft.md +0 -0
  89. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/docs/trust/plugin-trust-draft.md +0 -0
  90. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/docs/trust/skill-trust-local.md +0 -0
  91. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/fuzzers/manifest_fuzzer.py +0 -0
  92. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/requirements.txt +0 -0
  93. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/schemas/plugin-quality.v1.json +0 -0
  94. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/schemas/scan-result.v1.json +0 -0
  95. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/schemas/verify-result.v1.json +0 -0
  96. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/__init__.py +0 -0
  97. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/action_runner.py +0 -0
  98. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/argparse_utils.py +0 -0
  99. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/checks/__init__.py +0 -0
  100. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/checks/best_practices.py +0 -0
  101. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/checks/claude.py +0 -0
  102. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/checks/code_quality.py +0 -0
  103. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/checks/ecosystem_common.py +0 -0
  104. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/checks/gemini.py +0 -0
  105. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/checks/manifest.py +0 -0
  106. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/checks/manifest_support.py +0 -0
  107. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/checks/marketplace.py +0 -0
  108. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/checks/mcp_security.py +0 -0
  109. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/checks/opencode.py +0 -0
  110. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/checks/operational_security.py +0 -0
  111. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/checks/security.py +0 -0
  112. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/checks/skill_security.py +0 -0
  113. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/cli.py +0 -0
  114. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/cli_ui.py +0 -0
  115. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/config.py +0 -0
  116. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/ecosystems/__init__.py +0 -0
  117. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/ecosystems/base.py +0 -0
  118. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/ecosystems/claude.py +0 -0
  119. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/ecosystems/codex.py +0 -0
  120. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/ecosystems/detect.py +0 -0
  121. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/ecosystems/gemini.py +0 -0
  122. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/ecosystems/opencode.py +0 -0
  123. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/ecosystems/registry.py +0 -0
  124. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/ecosystems/types.py +0 -0
  125. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/github_reporting.py +0 -0
  126. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/__init__.py +0 -0
  127. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/access_graph_events.py +0 -0
  128. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/adapters/__init__.py +0 -0
  129. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/adapters/antigravity.py +0 -0
  130. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/adapters/base.py +0 -0
  131. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/adapters/claude_code.py +0 -0
  132. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/adapters/cloud_identity.py +0 -0
  133. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/adapters/codex.py +0 -0
  134. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/adapters/contracts.py +0 -0
  135. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/adapters/copilot.py +0 -0
  136. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/adapters/cursor.py +0 -0
  137. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/adapters/gemini.py +0 -0
  138. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/adapters/hermes.py +0 -0
  139. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/adapters/mcp_servers.py +0 -0
  140. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/adapters/openclaw.py +0 -0
  141. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/adapters/openclaw_config.py +0 -0
  142. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/adapters/openclaw_support.py +0 -0
  143. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/adapters/opencode.py +0 -0
  144. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/adapters/opencode_artifacts.py +0 -0
  145. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/advisory_model.py +0 -0
  146. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/approvals.py +0 -0
  147. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/bridge/__init__.py +0 -0
  148. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/capabilities.py +0 -0
  149. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/cli/__init__.py +0 -0
  150. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/cli/approval_commands.py +0 -0
  151. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/cli/bootstrap.py +0 -0
  152. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/cli/commands.py +0 -0
  153. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/cli/connect_flow.py +0 -0
  154. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/cli/install_commands.py +0 -0
  155. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/cli/product.py +0 -0
  156. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/cli/prompt.py +0 -0
  157. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/cli/render.py +0 -0
  158. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/cli/update_commands.py +0 -0
  159. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/codex_config.py +0 -0
  160. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/config.py +0 -0
  161. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/consumer/__init__.py +0 -0
  162. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/consumer/service.py +0 -0
  163. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/daemon/__init__.py +0 -0
  164. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/daemon/client.py +0 -0
  165. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/daemon/manager.py +0 -0
  166. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/daemon/server.py +0 -0
  167. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/daemon/static/apple-touch-icon.png +0 -0
  168. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Icon_Dark.png +0 -0
  169. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Whole.png +0 -0
  170. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/daemon/static/favicon-16x16.png +0 -0
  171. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/daemon/static/favicon-32x32.png +0 -0
  172. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/daemon/static/favicon.ico +0 -0
  173. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/daemon/static/index.html +0 -0
  174. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/edge_events.py +0 -0
  175. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/incident.py +0 -0
  176. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/insights.py +0 -0
  177. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/inventory_cisco.py +0 -0
  178. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/inventory_contract.py +0 -0
  179. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/launcher.py +0 -0
  180. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/mcp_tool_calls.py +0 -0
  181. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/models.py +0 -0
  182. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/policy/__init__.py +0 -0
  183. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/policy/engine.py +0 -0
  184. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/protect.py +0 -0
  185. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/proxy/__init__.py +0 -0
  186. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/proxy/remote.py +0 -0
  187. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/proxy/runtime_mcp.py +0 -0
  188. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/proxy/stdio.py +0 -0
  189. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/receipts/__init__.py +0 -0
  190. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/receipts/manager.py +0 -0
  191. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/redaction.py +0 -0
  192. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/risk.py +0 -0
  193. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/__init__.py +0 -0
  194. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/action_identity.py +0 -0
  195. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/actions.py +0 -0
  196. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/advisory_escalation.py +0 -0
  197. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/advisory_matchers.py +0 -0
  198. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/cisco_evidence.py +0 -0
  199. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/cisco_preflight.py +0 -0
  200. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/composition_rules.py +0 -0
  201. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/data_flow.py +0 -0
  202. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/data_flow_rules.py +0 -0
  203. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/data_flow_variables.py +0 -0
  204. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/decisions.py +0 -0
  205. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/detectors.py +0 -0
  206. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/false_positive_rules.py +0 -0
  207. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/mcp_protection.py +0 -0
  208. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/persistence_rules.py +0 -0
  209. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/prompt_injection.py +0 -0
  210. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/runner.py +0 -0
  211. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/safe_decode.py +0 -0
  212. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/sandbox.py +0 -0
  213. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/scanner_cache.py +0 -0
  214. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/secret_file_requests.py +0 -0
  215. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/secret_sensitivity.py +0 -0
  216. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/secret_sources.py +0 -0
  217. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/shell_commands.py +0 -0
  218. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/signals.py +0 -0
  219. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/skill_protection.py +0 -0
  220. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/supply_chain.py +0 -0
  221. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/surface_server.py +0 -0
  222. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/temp_files.py +0 -0
  223. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/runtime/threat_intel.py +0 -0
  224. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/schemas/__init__.py +0 -0
  225. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/schemas/consumer_mode.py +0 -0
  226. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/schemas/guard_event_v1.py +0 -0
  227. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/schemas/surface_server.py +0 -0
  228. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/shims.py +0 -0
  229. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/store.py +0 -0
  230. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/store_approvals.py +0 -0
  231. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/store_connect.py +0 -0
  232. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/store_evidence.py +0 -0
  233. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/store_threat_intel.py +0 -0
  234. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/guard/types.py +0 -0
  235. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/integrations/__init__.py +0 -0
  236. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/integrations/cisco_mcp_scanner.py +0 -0
  237. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/integrations/cisco_skill_scanner.py +0 -0
  238. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/lint_fixes.py +0 -0
  239. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/marketplace_support.py +0 -0
  240. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/models.py +0 -0
  241. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/path_support.py +0 -0
  242. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/policy.py +0 -0
  243. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/quality_artifact.py +0 -0
  244. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/repo_detect.py +0 -0
  245. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/reporting.py +0 -0
  246. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/rules/__init__.py +0 -0
  247. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/rules/registry.py +0 -0
  248. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/rules/specs.py +0 -0
  249. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/scanner.py +0 -0
  250. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/submission.py +0 -0
  251. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/suppressions.py +0 -0
  252. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/trust_domain_scoring.py +0 -0
  253. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/trust_helpers.py +0 -0
  254. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/trust_mcp_scoring.py +0 -0
  255. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/trust_models.py +0 -0
  256. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/trust_plugin_scoring.py +0 -0
  257. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/trust_scoring.py +0 -0
  258. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/trust_skill_scoring.py +0 -0
  259. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/trust_specs.py +0 -0
  260. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/src/codex_plugin_scanner/verification.py +0 -0
  261. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/__init__.py +0 -0
  262. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/conftest.py +0 -0
  263. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/__init__.py +0 -0
  264. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/bad-plugin/.codex-plugin/plugin.json +0 -0
  265. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/bad-plugin/.mcp.json +0 -0
  266. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/bad-plugin/secrets.js +0 -0
  267. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/claude-plugin-good/.claude-plugin/plugin.json +0 -0
  268. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/claude-plugin-good/LICENSE +0 -0
  269. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/claude-plugin-good/README.md +0 -0
  270. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/claude-plugin-good/SECURITY.md +0 -0
  271. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/claude-plugin-good/hooks/hooks.json +0 -0
  272. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/claude-plugin-good/skills/example/SKILL.md +0 -0
  273. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/code-quality-bad/evil.js +0 -0
  274. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/code-quality-bad/inject.js +0 -0
  275. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/gemini-extension-good/GEMINI.md +0 -0
  276. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/gemini-extension-good/LICENSE +0 -0
  277. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/gemini-extension-good/README.md +0 -0
  278. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/gemini-extension-good/SECURITY.md +0 -0
  279. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/gemini-extension-good/commands/hello.toml +0 -0
  280. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/gemini-extension-good/gemini-extension.json +0 -0
  281. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/good-plugin/.codex-plugin/plugin.json +0 -0
  282. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/good-plugin/.codexignore +0 -0
  283. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/good-plugin/LICENSE +0 -0
  284. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/good-plugin/README.md +0 -0
  285. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/good-plugin/SECURITY.md +0 -0
  286. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/good-plugin/assets/icon.svg +0 -0
  287. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/good-plugin/assets/logo.svg +0 -0
  288. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/good-plugin/assets/screenshot.svg +0 -0
  289. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/good-plugin/skills/example/SKILL.md +0 -0
  290. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-codex-malicious-mcp/.codex/config.toml +0 -0
  291. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-red-team/README.md +0 -0
  292. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-red-team/benign-docs-fake-token.py +0 -0
  293. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-red-team/benign-health-endpoint.py +0 -0
  294. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-red-team/benign-nvmrc-fake-creds.py +0 -0
  295. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-red-team/benign-source-search.py +0 -0
  296. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-red-team/canary-exfil-encoded.py +0 -0
  297. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-red-team/canary-exfil.py +0 -0
  298. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-red-team/expected-decisions.json +0 -0
  299. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-red-team/malicious-dockerfile.txt +0 -0
  300. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-red-team/malicious-encoded-shell-exfil.py +0 -0
  301. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-red-team/malicious-github-action.yml +0 -0
  302. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-red-team/malicious-mcp-delete.md +0 -0
  303. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-red-team/malicious-mcp-secret-read.md +0 -0
  304. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-red-team/malicious-mcp-skill-exfil.md +0 -0
  305. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-red-team/malicious-npm-postinstall.js +0 -0
  306. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-red-team/malicious-prompt-env-read.md +0 -0
  307. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-red-team/malicious-prompt-guard-bypass.md +0 -0
  308. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-red-team/malicious-prompt-npmrc-read.md +0 -0
  309. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-red-team/malicious-python-setup.py +0 -0
  310. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/guard-red-team/smoke-evidence-template.json +0 -0
  311. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/hermes-plugin-evil/config.yaml +0 -0
  312. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/hermes-plugin-evil/mcp_servers.json +0 -0
  313. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/hermes-plugin-evil/skills/security/malicious/SKILL.md +0 -0
  314. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/SKILL.md +0 -0
  315. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/references/api-setup.md +0 -0
  316. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/scripts/deploy.sh +0 -0
  317. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/hermes-plugin-evil/skills/utils/benign/SKILL.md +0 -0
  318. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/malformed-json/.codex-plugin/plugin.json +0 -0
  319. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/malicious-skill-plugin/.codex-plugin/plugin.json +0 -0
  320. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/malicious-skill-plugin/.codexignore +0 -0
  321. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/malicious-skill-plugin/LICENSE +0 -0
  322. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/malicious-skill-plugin/README.md +0 -0
  323. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/malicious-skill-plugin/SECURITY.md +0 -0
  324. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/malicious-skill-plugin/skills/leaky-skill/SKILL.md +0 -0
  325. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/mcp-canary-server.py +0 -0
  326. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/minimal-plugin/.codex-plugin/plugin.json +0 -0
  327. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/missing-fields/.codex-plugin/plugin.json +0 -0
  328. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/mit-license/LICENSE +0 -0
  329. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/multi-ecosystem-repo/codex-plugin/.codex-plugin/plugin.json +0 -0
  330. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/multi-ecosystem-repo/codex-plugin/LICENSE +0 -0
  331. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/multi-ecosystem-repo/codex-plugin/README.md +0 -0
  332. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/multi-ecosystem-repo/codex-plugin/SECURITY.md +0 -0
  333. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/multi-ecosystem-repo/gemini-ext/README.md +0 -0
  334. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/multi-ecosystem-repo/gemini-ext/gemini-extension.json +0 -0
  335. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/multi-plugin-repo/.agents/plugins/marketplace.json +0 -0
  336. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codex-plugin/plugin.json +0 -0
  337. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codexignore +0 -0
  338. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/LICENSE +0 -0
  339. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/README.md +0 -0
  340. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/SECURITY.md +0 -0
  341. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/skills/example/SKILL.md +0 -0
  342. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/.codex-plugin/plugin.json +0 -0
  343. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/skills/example/SKILL.md +0 -0
  344. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/no-version/.codex-plugin/plugin.json +0 -0
  345. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/opencode-good/.opencode/commands/hello.md +0 -0
  346. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/opencode-good/.opencode/plugins/example.ts +0 -0
  347. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/opencode-good/LICENSE +0 -0
  348. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/opencode-good/README.md +0 -0
  349. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/opencode-good/SECURITY.md +0 -0
  350. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/opencode-good/opencode.jsonc +0 -0
  351. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/skills-missing-dir/.codex-plugin/plugin.json +0 -0
  352. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/skills-no-frontmatter/.codex-plugin/plugin.json +0 -0
  353. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/skills-no-frontmatter/skills/bad-skill/SKILL.md +0 -0
  354. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/supply-chain/benign-npm-package.json +0 -0
  355. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/supply-chain/benign-pnpm-package.json +0 -0
  356. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/supply-chain/benign-pyproject.toml +0 -0
  357. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/supply-chain/malicious-Dockerfile +0 -0
  358. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/supply-chain/malicious-action.yml +0 -0
  359. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/supply-chain/malicious-npm-package.json +0 -0
  360. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/supply-chain/malicious-setup.py +0 -0
  361. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/with-marketplace/.codex-plugin/plugin.json +0 -0
  362. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/with-marketplace/marketplace-broken.json +0 -0
  363. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/fixtures/with-marketplace/marketplace.json +0 -0
  364. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test-trust-scoring.py +0 -0
  365. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test-trust-specs.py +0 -0
  366. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_action_runner.py +0 -0
  367. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_best_practices.py +0 -0
  368. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_cisco_install_surfaces.py +0 -0
  369. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_cli.py +0 -0
  370. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_code_quality.py +0 -0
  371. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_config.py +0 -0
  372. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_coverage_remaining.py +0 -0
  373. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_ecosystems.py +0 -0
  374. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_edge_cases.py +0 -0
  375. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_final_coverage.py +0 -0
  376. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_access_graph.py +0 -0
  377. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_action_identity.py +0 -0
  378. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_advisory_escalation.py +0 -0
  379. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_approval_continuity.py +0 -0
  380. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_approval_copy_commands.py +0 -0
  381. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_approval_store_dedup.py +0 -0
  382. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_approval_store_scale.py +0 -0
  383. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_approvals.py +0 -0
  384. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_bootstrap.py +0 -0
  385. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_bypass_detector.py +0 -0
  386. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_canary_fixtures.py +0 -0
  387. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_capabilities.py +0 -0
  388. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_cisco_evidence.py +0 -0
  389. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_cisco_runtime_cli.py +0 -0
  390. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_claude_adapter.py +0 -0
  391. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_cli.py +0 -0
  392. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_cloud_local_sync.py +0 -0
  393. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_codex_e2e.py +0 -0
  394. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_codex_install.py +0 -0
  395. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_codex_proxy.py +0 -0
  396. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_config_paths.py +0 -0
  397. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_connect_flow.py +0 -0
  398. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_consumer_mode.py +0 -0
  399. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_copilot_adapter.py +0 -0
  400. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_copilot_proxy.py +0 -0
  401. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_daemon_cli.py +0 -0
  402. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_daemon_manager.py +0 -0
  403. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_daemon_perf.py +0 -0
  404. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_daemon_registry.py +0 -0
  405. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_daemon_repair_perf.py +0 -0
  406. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_daemon_wake.py +0 -0
  407. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_data_flow.py +0 -0
  408. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_decision_propagation.py +0 -0
  409. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_detector_fp.py +0 -0
  410. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_event_schema_v1.py +0 -0
  411. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_events.py +0 -0
  412. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_evidence_store.py +0 -0
  413. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_harness_contracts.py +0 -0
  414. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_harness_setup.py +0 -0
  415. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_harness_smoke.py +0 -0
  416. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_insights.py +0 -0
  417. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_inventory_cisco.py +0 -0
  418. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_inventory_contract.py +0 -0
  419. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_launch_env.py +0 -0
  420. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_mcp_detectors.py +0 -0
  421. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_mcp_protection.py +0 -0
  422. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_opencode_proxy.py +0 -0
  423. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_policy_dedup.py +0 -0
  424. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_product_flow.py +0 -0
  425. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_prompt_injection.py +0 -0
  426. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_protect.py +0 -0
  427. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_queue_api_contract.py +0 -0
  428. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_queue_contract.py +0 -0
  429. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_red_team.py +0 -0
  430. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_red_team_e2e.py +0 -0
  431. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_redaction.py +0 -0
  432. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_render.py +0 -0
  433. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_resolution_copy.py +0 -0
  434. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_risk.py +0 -0
  435. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_runtime.py +0 -0
  436. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_runtime_action_harnesses.py +0 -0
  437. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_runtime_actions.py +0 -0
  438. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_runtime_decisions.py +0 -0
  439. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_runtime_detectors.py +0 -0
  440. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_runtime_signals.py +0 -0
  441. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_safe_decode.py +0 -0
  442. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_sandbox.py +0 -0
  443. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_settings_presets.py +0 -0
  444. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_skill_protection.py +0 -0
  445. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_store_migrations.py +0 -0
  446. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_supply_chain.py +0 -0
  447. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_surface_server.py +0 -0
  448. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_threat_intel.py +0 -0
  449. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_verdicts.py +0 -0
  450. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_guard_web_recovery.py +0 -0
  451. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_hermes_adapter.py +0 -0
  452. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_integration.py +0 -0
  453. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_lint_fixes.py +0 -0
  454. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_live_cisco_smoke.py +0 -0
  455. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_manifest.py +0 -0
  456. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_marketplace.py +0 -0
  457. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_mcp_security.py +0 -0
  458. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_openclaw_adapter.py +0 -0
  459. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_operational_security.py +0 -0
  460. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_policy.py +0 -0
  461. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_quality_artifact.py +0 -0
  462. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_rule_registry.py +0 -0
  463. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_scanner.py +0 -0
  464. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_schema_contracts.py +0 -0
  465. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_security.py +0 -0
  466. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_security_ops.py +0 -0
  467. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_skill_security.py +0 -0
  468. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_submission.py +0 -0
  469. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_trust_scoring.py +0 -0
  470. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_trust_specs.py +0 -0
  471. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_verification.py +0 -0
  472. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/tests/test_versioning.py +0 -0
  473. {plugin_scanner-2.0.176 → plugin_scanner-2.0.178}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plugin-scanner
3
- Version: 2.0.176
3
+ Version: 2.0.178
4
4
  Summary: Lint, verify, and gate plugin ecosystems for maintainers, CI, and publish workflows.
5
5
  Project-URL: Homepage, https://github.com/hashgraph-online/ai-plugin-scanner
6
6
  Project-URL: Repository, https://github.com/hashgraph-online/ai-plugin-scanner
@@ -16,6 +16,8 @@ import {
16
16
  HiMiniCheckCircle,
17
17
  HiMiniArrowRight,
18
18
  HiMiniExclamationTriangle,
19
+ HiMiniChevronDown,
20
+ HiMiniChevronUp,
19
21
  } from "react-icons/hi2";
20
22
 
21
23
  import { guardAwareHref } from "./guard-api";
@@ -695,23 +697,19 @@ export function GuardHero(props: {
695
697
  }
696
698
 
697
699
  export function ProofStrip(props: {
698
- items: Array<{ label: string; value: string | number; tone?: "blue" | "green" | "purple" | "slate"; icon?: ReactNode; pulse?: boolean; hint?: string }>;
700
+ items: Array<{ label: string; value: string | number; tone?: "blue" | "green" | "purple" | "slate"; icon?: ReactNode; hint?: string }>;
699
701
  }) {
700
702
  return (
701
- <div className="grid gap-4 sm:grid-cols-3">
702
- {props.items.map((item) => (
703
- <div
704
- key={item.label}
705
- className={`flex items-baseline gap-2 ${item.pulse ? "guard-pulse" : ""}`}
706
- title={item.hint}
707
- >
708
- <p className="text-2xl font-semibold tracking-tight text-brand-dark">{item.value}</p>
709
- <div className="flex items-center gap-1">
710
- <p className="text-xs text-muted-foreground">{item.label}</p>
711
- {item.icon}
703
+ <div className="grid gap-x-8 gap-y-4 sm:grid-cols-2 lg:grid-cols-4">
704
+ {props.items.map((item) => {
705
+ const toneColor = item.tone === "blue" ? "text-brand-blue" : item.tone === "green" ? "text-emerald-600" : item.tone === "purple" ? "text-brand-purple" : "text-brand-dark";
706
+ return (
707
+ <div key={item.label} className="flex flex-col" title={item.hint}>
708
+ <p className="text-[11px] font-semibold uppercase tracking-wider text-slate-400">{item.label}</p>
709
+ <p className={`text-2xl font-semibold tracking-tight ${toneColor}`}>{item.value}</p>
712
710
  </div>
713
- </div>
714
- ))}
711
+ );
712
+ })}
715
713
  </div>
716
714
  );
717
715
  }
@@ -743,3 +741,143 @@ export function NextActionCard(props: {
743
741
  </div>
744
742
  );
745
743
  }
744
+
745
+ export function SegmentedControl<T extends string>(props: {
746
+ options: Array<{ value: T; label: string }>;
747
+ value: T;
748
+ onChange: (value: T) => void;
749
+ }) {
750
+ return (
751
+ <div className="inline-flex rounded-lg border border-slate-200 bg-slate-50 p-0.5">
752
+ {props.options.map((opt) => (
753
+ <button
754
+ key={opt.value}
755
+ type="button"
756
+ onClick={() => props.onChange(opt.value)}
757
+ className={`rounded-md px-2.5 py-1 text-xs font-medium transition-colors ${
758
+ props.value === opt.value
759
+ ? "bg-white text-brand-dark shadow-sm"
760
+ : "text-slate-500 hover:text-brand-dark"
761
+ }`}
762
+ >
763
+ {opt.label}
764
+ </button>
765
+ ))}
766
+ </div>
767
+ );
768
+ }
769
+
770
+ export function ListRow(props: {
771
+ children: ReactNode;
772
+ accent?: "green" | "attention" | "blue" | "none";
773
+ onClick?: () => void;
774
+ href?: string;
775
+ }) {
776
+ const accentClass =
777
+ props.accent === "green"
778
+ ? "border-l-2 border-emerald-500 pl-3"
779
+ : props.accent === "attention"
780
+ ? "border-l-2 border-brand-attention pl-3"
781
+ : props.accent === "blue"
782
+ ? "border-l-2 border-brand-blue pl-3"
783
+ : "pl-3.5";
784
+ const clickable = props.onClick !== undefined || props.href !== undefined;
785
+ const content = (
786
+ <div
787
+ className={`flex items-center gap-3 border-b border-slate-100 py-2.5 transition-colors hover:bg-slate-50/60 ${accentClass} ${
788
+ clickable ? "cursor-pointer" : ""
789
+ }`}
790
+ onClick={props.onClick}
791
+ role={clickable ? "button" : undefined}
792
+ tabIndex={clickable ? 0 : undefined}
793
+ onKeyDown={
794
+ clickable
795
+ ? (e) => {
796
+ if (e.key === "Enter" || e.key === " ") {
797
+ e.preventDefault();
798
+ props.onClick?.();
799
+ }
800
+ }
801
+ : undefined
802
+ }
803
+ >
804
+ {props.children}
805
+ </div>
806
+ );
807
+ if (props.href) {
808
+ return (
809
+ <a href={guardAwareHref(props.href)} className="block no-underline">
810
+ {content}
811
+ </a>
812
+ );
813
+ }
814
+ return content;
815
+ }
816
+
817
+ export function TabBar<T extends string>(props: {
818
+ tabs: Array<{ value: T; label: string }>;
819
+ active: T;
820
+ onChange: (value: T) => void;
821
+ }) {
822
+ return (
823
+ <div className="flex gap-1 rounded-lg border border-slate-200 bg-slate-50 p-0.5">
824
+ {props.tabs.map((tab) => (
825
+ <button
826
+ key={tab.value}
827
+ type="button"
828
+ onClick={() => props.onChange(tab.value)}
829
+ className={`rounded-md px-3 py-1.5 text-sm font-medium transition-colors ${
830
+ props.active === tab.value
831
+ ? "bg-white text-brand-dark shadow-sm"
832
+ : "text-slate-500 hover:text-brand-dark"
833
+ }`}
834
+ >
835
+ {tab.label}
836
+ </button>
837
+ ))}
838
+ </div>
839
+ );
840
+ }
841
+
842
+ export function AccordionSection(props: {
843
+ title: string;
844
+ subtitle?: string;
845
+ expanded: boolean;
846
+ onToggle: () => void;
847
+ children: ReactNode;
848
+ }) {
849
+ return (
850
+ <div className="rounded-xl border border-slate-100 overflow-hidden">
851
+ <button
852
+ onClick={props.onToggle}
853
+ className="flex w-full items-center justify-between gap-3 px-4 py-3 text-left transition-colors hover:bg-slate-50/60"
854
+ aria-expanded={props.expanded}
855
+ >
856
+ <div>
857
+ <p className="text-sm font-semibold text-brand-dark">{props.title}</p>
858
+ {props.subtitle ? <p className="text-xs text-slate-400">{props.subtitle}</p> : null}
859
+ </div>
860
+ {props.expanded ? (
861
+ <HiMiniChevronUp className="h-4 w-4 text-slate-400" aria-hidden="true" />
862
+ ) : (
863
+ <HiMiniChevronDown className="h-4 w-4 text-slate-400" aria-hidden="true" />
864
+ )}
865
+ </button>
866
+ {props.expanded && (
867
+ <div className="border-t border-slate-100 px-4 py-4">
868
+ {props.children}
869
+ </div>
870
+ )}
871
+ </div>
872
+ );
873
+ }
874
+
875
+ export function StickyActionBar(props: {
876
+ children: ReactNode;
877
+ }) {
878
+ return (
879
+ <div className="sticky bottom-4 z-30 rounded-xl border border-slate-200 bg-white/95 p-4 shadow-lg backdrop-blur">
880
+ {props.children}
881
+ </div>
882
+ );
883
+ }
@@ -163,9 +163,10 @@ export function HomeWorkspace(props: {
163
163
 
164
164
  <ProofStrip
165
165
  items={[
166
- { label: "Needs your choice", value: queuedCount, tone: queuedCount > 0 ? "blue" : "slate", pulse: queuedCount > 0 },
167
- { label: "Apps watched", value: watchedAppsCount, tone: watchedAppsCount > 0 ? "green" : "slate" },
168
- { label: "Day streak", value: streak, tone: streak > 1 ? "purple" : "slate", icon: streak > 1 ? <HiMiniFire className="h-3.5 w-3.5 text-brand-purple" aria-hidden="true" /> : null, hint: streak > 0 ? "Consecutive days with Guard activity. Resets after 48h of inactivity." : "Guard activity streak" },
166
+ { label: "Pending", value: queuedCount, tone: queuedCount > 0 ? "blue" : "slate" },
167
+ { label: "Apps", value: watchedAppsCount, tone: watchedAppsCount > 0 ? "green" : "slate" },
168
+ { label: "Streak", value: streak, tone: streak > 1 ? "purple" : "slate", icon: streak > 1 ? <HiMiniFire className="h-3.5 w-3.5 text-brand-purple" aria-hidden="true" /> : null, hint: streak > 0 ? "Consecutive days with Guard activity. Resets after 48h of inactivity." : "Guard activity streak" },
169
+ { label: "History", value: snapshot?.receipt_count ?? 0, tone: "purple" },
169
170
  ]}
170
171
  />
171
172
 
@@ -233,12 +234,12 @@ export function HomeWorkspace(props: {
233
234
  )}
234
235
 
235
236
  {policyItems.length > 0 && (
236
- <div className="rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm sm:p-6">
237
+ <div className="rounded-xl border border-slate-100 p-4">
237
238
  <SectionLabel>Reset remembered decisions</SectionLabel>
238
- <p className="mt-2 text-sm text-muted-foreground">
239
+ <p className="mt-1 text-sm text-slate-500">
239
240
  Clear remembered decisions when you want Guard to ask again next time. This does not remove your history.
240
241
  </p>
241
- <div className="mt-4 flex flex-wrap gap-2">
242
+ <div className="mt-3 flex flex-wrap gap-2">
242
243
  {clearHarnesses.slice(0, 4).map((harness: string) => (
243
244
  <ClearHarnessButton
244
245
  key={harness}
@@ -526,12 +527,14 @@ function AppsAtAGlance(props: {
526
527
  }
527
528
 
528
529
  return (
529
- <div className="rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm sm:p-6">
530
- <SectionLabel>Apps at a glance</SectionLabel>
531
- <p className="mt-2 text-sm text-muted-foreground">
532
- Guard is watching these apps on this machine.
533
- </p>
534
- <div ref={listRef} className="mt-4 space-y-2" role="list" aria-label="Apps at a glance">
530
+ <div>
531
+ <div className="mb-3">
532
+ <SectionLabel>Apps at a glance</SectionLabel>
533
+ <p className="mt-1 text-sm text-slate-500">
534
+ Guard is watching these apps on this machine.
535
+ </p>
536
+ </div>
537
+ <div ref={listRef} className="divide-y divide-slate-100 border-t border-slate-100" role="list" aria-label="Apps at a glance">
535
538
  {sortedHarnesses.map((harness, index) => {
536
539
  const install = props.managedInstalls.find((i) => i.harness === harness);
537
540
  const isObserved = props.observedHarnesses.includes(harness);
@@ -544,10 +547,10 @@ function AppsAtAGlance(props: {
544
547
  onKeyDown={(e) => handleKeyDown(e, index)}
545
548
  onFocus={() => setFocusedIndex(index)}
546
549
  onBlur={() => setFocusedIndex(-1)}
547
- className={`flex w-full items-center justify-between gap-3 rounded-xl border px-4 py-3 text-left transition-all duration-150 hover:bg-slate-50 hover:shadow-sm active:scale-[0.99] ${
550
+ className={`flex w-full items-center justify-between gap-3 py-2.5 text-left transition-colors hover:bg-slate-50/60 ${
548
551
  focusedIndex === index
549
- ? "border-brand-blue/50 bg-brand-blue/[0.04] ring-1 ring-brand-blue/20"
550
- : "border-slate-200/70"
552
+ ? "bg-brand-blue/[0.04]"
553
+ : ""
551
554
  }`}
552
555
  role="listitem"
553
556
  >
@@ -187,7 +187,7 @@ const ReviewQueueList = forwardRef<HTMLDivElement, {
187
187
  <div
188
188
  role="listbox"
189
189
  aria-label="Review queue"
190
- className="max-h-[70vh] space-y-2 overflow-y-auto rounded-[1.25rem] border border-slate-200/70 bg-white/60 p-2"
190
+ className="max-h-[70vh] space-y-2 overflow-y-auto rounded-lg border border-slate-100 bg-white p-1.5"
191
191
  >
192
192
  {requests.map((item, index) => (
193
193
  <QueueItemRow
@@ -220,7 +220,7 @@ function QueueItemRow({ item, active, index, onClick }: {
220
220
  aria-posinset={index + 1}
221
221
  aria-setsize={/* parent will provide */ undefined}
222
222
  tabIndex={active ? 0 : -1}
223
- className={`w-full rounded-xl border px-3 py-2.5 text-left transition-all ${
223
+ className={`w-full rounded-lg py-2.5 text-left transition-all ${
224
224
  active
225
225
  ? "border-brand-blue bg-brand-blue/[0.06]"
226
226
  : "border-transparent bg-white hover:bg-slate-50"
@@ -381,7 +381,7 @@ function ReviewDecisionCard(props: {
381
381
  {/* Success banner */}
382
382
  {resolved && (
383
383
  <div
384
- className={`guard-fade-in flex items-center gap-3 rounded-2xl border px-4 py-3 transition-all ${
384
+ className={`guard-fade-in flex items-center gap-3 rounded-xl border px-4 py-3 transition-all ${
385
385
  resolved === "allow"
386
386
  ? "border-brand-green/25 bg-brand-green-bg/30"
387
387
  : "border-brand-attention/25 bg-brand-attention/[0.04]"
@@ -401,7 +401,7 @@ function ReviewDecisionCard(props: {
401
401
 
402
402
  {/* Confirm modal for broad scopes */}
403
403
  {confirmScope !== null && pendingAction !== null && (
404
- <div className="guard-fade-in rounded-[1.75rem] border border-brand-attention/25 bg-brand-attention/[0.04] p-5 shadow-sm" role="alertdialog" aria-modal="true">
404
+ <div className="guard-fade-in rounded-xl border border-brand-attention/15 bg-brand-attention/[0.03] p-4" role="alertdialog" aria-modal="true">
405
405
  <div className="flex items-start gap-3">
406
406
  <HiMiniExclamationTriangle className="mt-0.5 h-5 w-5 shrink-0 text-brand-attention" aria-hidden="true" />
407
407
  <div>
@@ -425,7 +425,7 @@ function ReviewDecisionCard(props: {
425
425
  )}
426
426
 
427
427
  {/* Main decision card */}
428
- <div className="rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm sm:p-6">
428
+ <div className="rounded-xl border border-slate-100 p-4 sm:p-5">
429
429
  <div className="flex items-start justify-between gap-3">
430
430
  <div>
431
431
  <SectionLabel>Paused action</SectionLabel>
@@ -574,7 +574,7 @@ function ReviewDecisionCard(props: {
574
574
 
575
575
  {/* Evidence section */}
576
576
  {hasEvidence && (
577
- <div className="rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm sm:p-6">
577
+ <div className="rounded-xl border border-slate-100 p-4 sm:p-5">
578
578
  <button
579
579
  onClick={() => setShowEvidence(!showEvidence)}
580
580
  className="flex w-full items-center justify-between text-left focus:outline-none focus:ring-2 focus:ring-brand-blue/20 rounded-lg px-2 py-1 -ml-2"
@@ -606,7 +606,7 @@ function ReviewDecisionCard(props: {
606
606
 
607
607
  {/* Last time */}
608
608
  {detail.receipt && (
609
- <div className="rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm sm:p-6">
609
+ <div className="rounded-xl border border-slate-100 p-4 sm:p-5">
610
610
  <SectionLabel>Last time</SectionLabel>
611
611
  <p className="mt-2 text-sm text-muted-foreground">
612
612
  You previously {detail.receipt.policy_decision}d a similar action{" "}
@@ -657,7 +657,7 @@ function ReviewEmptyState({ runtime, resolutionMessage }: { runtime: GuardRuntim
657
657
  )}
658
658
 
659
659
  <div className="grid gap-6 lg:grid-cols-2">
660
- <div className="rounded-[1.75rem] border border-brand-green/15 bg-brand-green/[0.04] p-5 shadow-sm sm:p-6">
660
+ <div className="rounded-xl border border-emerald-200/60 bg-emerald-50/30 p-4 sm:p-5">
661
661
  <div className="flex items-start gap-3">
662
662
  <span className="inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-brand-green/10">
663
663
  <HiMiniShieldCheck className="h-5 w-5 text-brand-green" aria-hidden="true" />
@@ -671,7 +671,7 @@ function ReviewEmptyState({ runtime, resolutionMessage }: { runtime: GuardRuntim
671
671
  </div>
672
672
  </div>
673
673
 
674
- <div className="rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm sm:p-6">
674
+ <div className="rounded-xl border border-slate-100 p-4 sm:p-5">
675
675
  <SectionLabel>What Guard does</SectionLabel>
676
676
  <ul className="mt-3 space-y-2">
677
677
  {[
@@ -748,7 +748,7 @@ function ActionContentCard({ item }: { item: GuardApprovalRequest }) {
748
748
  )}
749
749
 
750
750
  {/* Terminal display of actual content */}
751
- <div className="overflow-hidden rounded-[1.25rem] bg-[#0f172a] shadow-lg">
751
+ <div className="overflow-hidden rounded-xl bg-[#0f172a]">
752
752
  <div className="flex items-center gap-1.5 border-b border-white/10 px-3 py-2">
753
753
  <span className="h-2.5 w-2.5 rounded-full bg-brand-purple" />
754
754
  <span className="h-2.5 w-2.5 rounded-full bg-brand-blue" />
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "plugin-scanner"
7
- version = "2.0.176"
7
+ version = "2.0.178"
8
8
  description = "Lint, verify, and gate plugin ecosystems for maintainers, CI, and publish workflows."
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "hol-guard"
7
- version = "2.0.176"
7
+ version = "2.0.178"
8
8
  description = "Protect local AI harnesses with HOL Guard and run scanner checks for Codex, Claude, Cursor, Gemini, and OpenCode."
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -14095,21 +14095,13 @@ function GuardHero(props) {
14095
14095
  );
14096
14096
  }
14097
14097
  function ProofStrip(props) {
14098
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid gap-4 sm:grid-cols-3", children: props.items.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
14099
- "div",
14100
- {
14101
- className: `flex items-baseline gap-2 ${item.pulse ? "guard-pulse" : ""}`,
14102
- title: item.hint,
14103
- children: [
14104
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-2xl font-semibold tracking-tight text-brand-dark", children: item.value }),
14105
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1", children: [
14106
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: item.label }),
14107
- item.icon
14108
- ] })
14109
- ]
14110
- },
14111
- item.label
14112
- )) });
14098
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid gap-x-8 gap-y-4 sm:grid-cols-2 lg:grid-cols-4", children: props.items.map((item) => {
14099
+ const toneColor = item.tone === "blue" ? "text-brand-blue" : item.tone === "green" ? "text-emerald-600" : item.tone === "purple" ? "text-brand-purple" : "text-brand-dark";
14100
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col", title: item.hint, children: [
14101
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-[11px] font-semibold uppercase tracking-wider text-slate-400", children: item.label }),
14102
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: `text-2xl font-semibold tracking-tight ${toneColor}`, children: item.value })
14103
+ ] }, item.label);
14104
+ }) });
14113
14105
  }
14114
14106
  function DataFlowEvidenceCard(props) {
14115
14107
  const evidence = deriveDataFlowEvidence(props.item);
@@ -14727,7 +14719,7 @@ const ReviewQueueList = reactExports.forwardRef(({ requests, activeRequestId, on
14727
14719
  {
14728
14720
  role: "listbox",
14729
14721
  "aria-label": "Review queue",
14730
- className: "max-h-[70vh] space-y-2 overflow-y-auto rounded-[1.25rem] border border-slate-200/70 bg-white/60 p-2",
14722
+ className: "max-h-[70vh] space-y-2 overflow-y-auto rounded-lg border border-slate-100 bg-white p-1.5",
14731
14723
  children: requests.map((item, index) => /* @__PURE__ */ jsxRuntimeExports.jsx(
14732
14724
  QueueItemRow,
14733
14725
  {
@@ -14758,7 +14750,7 @@ function QueueItemRow({ item, active, index, onClick }) {
14758
14750
  void 0
14759
14751
  ),
14760
14752
  tabIndex: active ? 0 : -1,
14761
- className: `w-full rounded-xl border px-3 py-2.5 text-left transition-all ${active ? "border-brand-blue bg-brand-blue/[0.06]" : "border-transparent bg-white hover:bg-slate-50"}`,
14753
+ className: `w-full rounded-lg py-2.5 text-left transition-all ${active ? "border-brand-blue bg-brand-blue/[0.06]" : "border-transparent bg-white hover:bg-slate-50"}`,
14762
14754
  children: [
14763
14755
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between gap-2", children: [
14764
14756
  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "truncate text-sm font-medium text-brand-dark", children: title }),
@@ -14893,7 +14885,7 @@ function ReviewDecisionCard(props) {
14893
14885
  resolved && /* @__PURE__ */ jsxRuntimeExports.jsxs(
14894
14886
  "div",
14895
14887
  {
14896
- className: `guard-fade-in flex items-center gap-3 rounded-2xl border px-4 py-3 transition-all ${resolved === "allow" ? "border-brand-green/25 bg-brand-green-bg/30" : "border-brand-attention/25 bg-brand-attention/[0.04]"}`,
14888
+ className: `guard-fade-in flex items-center gap-3 rounded-xl border px-4 py-3 transition-all ${resolved === "allow" ? "border-brand-green/25 bg-brand-green-bg/30" : "border-brand-attention/25 bg-brand-attention/[0.04]"}`,
14897
14889
  role: "status",
14898
14890
  "aria-live": "polite",
14899
14891
  children: [
@@ -14908,7 +14900,7 @@ function ReviewDecisionCard(props) {
14908
14900
  ]
14909
14901
  }
14910
14902
  ),
14911
- confirmScope !== null && pendingAction !== null && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "guard-fade-in rounded-[1.75rem] border border-brand-attention/25 bg-brand-attention/[0.04] p-5 shadow-sm", role: "alertdialog", "aria-modal": "true", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start gap-3", children: [
14903
+ confirmScope !== null && pendingAction !== null && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "guard-fade-in rounded-xl border border-brand-attention/15 bg-brand-attention/[0.03] p-4", role: "alertdialog", "aria-modal": "true", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start gap-3", children: [
14912
14904
  /* @__PURE__ */ jsxRuntimeExports.jsx(HiMiniExclamationTriangle, { className: "mt-0.5 h-5 w-5 shrink-0 text-brand-attention", "aria-hidden": "true" }),
14913
14905
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
14914
14906
  /* @__PURE__ */ jsxRuntimeExports.jsxs("h3", { className: "text-sm font-semibold text-brand-dark", children: [
@@ -14931,7 +14923,7 @@ function ReviewDecisionCard(props) {
14931
14923
  ] })
14932
14924
  ] })
14933
14925
  ] }) }),
14934
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm sm:p-6", children: [
14926
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-xl border border-slate-100 p-4 sm:p-5", children: [
14935
14927
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start justify-between gap-3", children: [
14936
14928
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
14937
14929
  /* @__PURE__ */ jsxRuntimeExports.jsx(SectionLabel, { children: "Paused action" }),
@@ -15056,7 +15048,7 @@ function ReviewDecisionCard(props) {
15056
15048
  ] })
15057
15049
  ] })
15058
15050
  ] }),
15059
- hasEvidence && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm sm:p-6", children: [
15051
+ hasEvidence && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-xl border border-slate-100 p-4 sm:p-5", children: [
15060
15052
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
15061
15053
  "button",
15062
15054
  {
@@ -15078,7 +15070,7 @@ function ReviewDecisionCard(props) {
15078
15070
  /* @__PURE__ */ jsxRuntimeExports.jsx(DecodedLayerCard, { item })
15079
15071
  ] })
15080
15072
  ] }),
15081
- detail.receipt && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm sm:p-6", children: [
15073
+ detail.receipt && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-xl border border-slate-100 p-4 sm:p-5", children: [
15082
15074
  /* @__PURE__ */ jsxRuntimeExports.jsx(SectionLabel, { children: "Last time" }),
15083
15075
  /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "mt-2 text-sm text-muted-foreground", children: [
15084
15076
  "You previously ",
@@ -15123,14 +15115,14 @@ function ReviewEmptyState({ runtime, resolutionMessage }) {
15123
15115
  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-medium text-brand-green-text", children: resolutionMessage })
15124
15116
  ] }),
15125
15117
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid gap-6 lg:grid-cols-2", children: [
15126
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "rounded-[1.75rem] border border-brand-green/15 bg-brand-green/[0.04] p-5 shadow-sm sm:p-6", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start gap-3", children: [
15118
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "rounded-xl border border-emerald-200/60 bg-emerald-50/30 p-4 sm:p-5", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start gap-3", children: [
15127
15119
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-brand-green/10", children: /* @__PURE__ */ jsxRuntimeExports.jsx(HiMiniShieldCheck, { className: "h-5 w-5 text-brand-green", "aria-hidden": "true" }) }),
15128
15120
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
15129
15121
  /* @__PURE__ */ jsxRuntimeExports.jsx(SectionLabel, { children: "Protection active" }),
15130
15122
  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: "Guard is running and will pause any risky actions from your AI apps. When something needs review, it will appear here." })
15131
15123
  ] })
15132
15124
  ] }) }),
15133
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm sm:p-6", children: [
15125
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-xl border border-slate-100 p-4 sm:p-5", children: [
15134
15126
  /* @__PURE__ */ jsxRuntimeExports.jsx(SectionLabel, { children: "What Guard does" }),
15135
15127
  /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: "mt-3 space-y-2", children: [
15136
15128
  "Pauses risky file reads and writes",
@@ -15179,7 +15171,7 @@ function ActionContentCard({ item }) {
15179
15171
  ] }),
15180
15172
  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm leading-relaxed text-brand-dark/80", children: pauseReason }),
15181
15173
  detailText && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm leading-relaxed text-brand-dark/80", children: detailText }),
15182
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "overflow-hidden rounded-[1.25rem] bg-[#0f172a] shadow-lg", children: [
15174
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "overflow-hidden rounded-xl bg-[#0f172a]", children: [
15183
15175
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1.5 border-b border-white/10 px-3 py-2", children: [
15184
15176
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "h-2.5 w-2.5 rounded-full bg-brand-purple" }),
15185
15177
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "h-2.5 w-2.5 rounded-full bg-brand-blue" }),
@@ -17464,9 +17456,10 @@ function HomeWorkspace(props) {
17464
17456
  ProofStrip,
17465
17457
  {
17466
17458
  items: [
17467
- { label: "Needs your choice", value: queuedCount, tone: queuedCount > 0 ? "blue" : "slate", pulse: queuedCount > 0 },
17468
- { label: "Apps watched", value: watchedAppsCount, tone: watchedAppsCount > 0 ? "green" : "slate" },
17469
- { label: "Day streak", value: streak, tone: streak > 1 ? "purple" : "slate", icon: streak > 1 ? /* @__PURE__ */ jsxRuntimeExports.jsx(HiMiniFire, { className: "h-3.5 w-3.5 text-brand-purple", "aria-hidden": "true" }) : null, hint: streak > 0 ? "Consecutive days with Guard activity. Resets after 48h of inactivity." : "Guard activity streak" }
17459
+ { label: "Pending", value: queuedCount, tone: queuedCount > 0 ? "blue" : "slate" },
17460
+ { label: "Apps", value: watchedAppsCount, tone: watchedAppsCount > 0 ? "green" : "slate" },
17461
+ { label: "Streak", value: streak, tone: streak > 1 ? "purple" : "slate", icon: streak > 1 ? /* @__PURE__ */ jsxRuntimeExports.jsx(HiMiniFire, { className: "h-3.5 w-3.5 text-brand-purple", "aria-hidden": "true" }) : null, hint: streak > 0 ? "Consecutive days with Guard activity. Resets after 48h of inactivity." : "Guard activity streak" },
17462
+ { label: "History", value: snapshot?.receipt_count ?? 0, tone: "purple" }
17470
17463
  ]
17471
17464
  }
17472
17465
  ),
@@ -17533,10 +17526,10 @@ function HomeWorkspace(props) {
17533
17526
  ] }),
17534
17527
  /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "space-y-6", children: [
17535
17528
  snapshot.latest_receipts.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(RecentProtectionSection, { receipts: snapshot.latest_receipts }),
17536
- policyItems.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm sm:p-6", children: [
17529
+ policyItems.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-xl border border-slate-100 p-4", children: [
17537
17530
  /* @__PURE__ */ jsxRuntimeExports.jsx(SectionLabel, { children: "Reset remembered decisions" }),
17538
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: "Clear remembered decisions when you want Guard to ask again next time. This does not remove your history." }),
17539
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-4 flex flex-wrap gap-2", children: clearHarnesses.slice(0, 4).map((harness) => /* @__PURE__ */ jsxRuntimeExports.jsx(
17531
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-1 text-sm text-slate-500", children: "Clear remembered decisions when you want Guard to ask again next time. This does not remove your history." }),
17532
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-3 flex flex-wrap gap-2", children: clearHarnesses.slice(0, 4).map((harness) => /* @__PURE__ */ jsxRuntimeExports.jsx(
17540
17533
  ClearHarnessButton,
17541
17534
  {
17542
17535
  harness,
@@ -17773,10 +17766,12 @@ function AppsAtAGlance(props) {
17773
17766
  }
17774
17767
  );
17775
17768
  }
17776
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm sm:p-6", children: [
17777
- /* @__PURE__ */ jsxRuntimeExports.jsx(SectionLabel, { children: "Apps at a glance" }),
17778
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: "Guard is watching these apps on this machine." }),
17779
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: listRef, className: "mt-4 space-y-2", role: "list", "aria-label": "Apps at a glance", children: sortedHarnesses.map((harness, index) => {
17769
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
17770
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-3", children: [
17771
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SectionLabel, { children: "Apps at a glance" }),
17772
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-1 text-sm text-slate-500", children: "Guard is watching these apps on this machine." })
17773
+ ] }),
17774
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: listRef, className: "divide-y divide-slate-100 border-t border-slate-100", role: "list", "aria-label": "Apps at a glance", children: sortedHarnesses.map((harness, index) => {
17780
17775
  const install = props.managedInstalls.find((i) => i.harness === harness);
17781
17776
  const isObserved = props.observedHarnesses.includes(harness);
17782
17777
  const pending = pendingByHarness.get(harness) ?? 0;
@@ -17788,7 +17783,7 @@ function AppsAtAGlance(props) {
17788
17783
  onKeyDown: (e) => handleKeyDown(e, index),
17789
17784
  onFocus: () => setFocusedIndex(index),
17790
17785
  onBlur: () => setFocusedIndex(-1),
17791
- className: `flex w-full items-center justify-between gap-3 rounded-xl border px-4 py-3 text-left transition-all duration-150 hover:bg-slate-50 hover:shadow-sm active:scale-[0.99] ${focusedIndex === index ? "border-brand-blue/50 bg-brand-blue/[0.04] ring-1 ring-brand-blue/20" : "border-slate-200/70"}`,
17786
+ className: `flex w-full items-center justify-between gap-3 py-2.5 text-left transition-colors hover:bg-slate-50/60 ${focusedIndex === index ? "bg-brand-blue/[0.04]" : ""}`,
17792
17787
  role: "listitem",
17793
17788
  children: [
17794
17789
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 items-center gap-2.5", children: [