plugin-scanner 2.0.373__tar.gz → 2.0.374__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 (670) hide show
  1. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/PKG-INFO +1 -1
  2. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/pyproject.toml +1 -1
  3. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/pyproject.toml.bak +1 -1
  4. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/codex_app_server.py +19 -112
  5. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/codex_resume.py +5 -18
  6. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/assets/guard-dashboard.js +0 -7
  7. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/version.py +1 -1
  8. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_codex_resume_commands.py +17 -67
  9. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_codex_resume_endpoints.py +24 -109
  10. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/.clusterfuzzlite/Dockerfile +0 -0
  11. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/.clusterfuzzlite/build.sh +0 -0
  12. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/.clusterfuzzlite/project.yaml +0 -0
  13. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/.clusterfuzzlite/requirements-atheris.txt +0 -0
  14. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/.dockerignore +0 -0
  15. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/.github/CODEOWNERS +0 -0
  16. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  17. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  18. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
  19. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/.github/dependabot.yml +0 -0
  20. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/.github/workflows/ci.yml +0 -0
  21. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/.github/workflows/codeql.yml +0 -0
  22. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/.github/workflows/dependabot-uv-lock.yml +0 -0
  23. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/.github/workflows/fuzz.yml +0 -0
  24. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/.github/workflows/harness-smoke.yml +0 -0
  25. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/.github/workflows/publish.yml +0 -0
  26. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/.github/workflows/scorecard.yml +0 -0
  27. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/.gitignore +0 -0
  28. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/.pre-commit-hooks.yaml +0 -0
  29. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/CONTRIBUTING.md +0 -0
  30. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/Dockerfile +0 -0
  31. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/LICENSE +0 -0
  32. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/PRODUCT.md +0 -0
  33. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/README.md +0 -0
  34. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/SECURITY.md +0 -0
  35. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/e2e/fixture-states.ts +0 -0
  36. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/e2e/proof-dir.ts +0 -0
  37. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/e2e/scrg172-states.spec.ts +0 -0
  38. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/e2e/static-server.mjs +0 -0
  39. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/index.html +0 -0
  40. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/package.json +0 -0
  41. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/playwright.config.ts +0 -0
  42. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/pnpm-lock.yaml +0 -0
  43. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/public/apple-touch-icon.png +0 -0
  44. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/public/brand/Logo_Icon_Dark.png +0 -0
  45. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/public/brand/Logo_Whole.png +0 -0
  46. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/public/favicon-16x16.png +0 -0
  47. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/public/favicon-32x32.png +0 -0
  48. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/public/favicon.ico +0 -0
  49. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/app-detail-phase11.test.ts +0 -0
  50. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/app-detail-workspace.test.ts +0 -0
  51. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/app-routing.test.ts +0 -0
  52. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/app.tsx +0 -0
  53. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/approval-center-layout.test.ts +0 -0
  54. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/approval-center-layout.tsx +0 -0
  55. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/approval-center-mobile.test.ts +0 -0
  56. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/approval-center-primitives.tsx +0 -0
  57. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/approval-center-review-cards.tsx +0 -0
  58. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/approval-center-utils.ts +0 -0
  59. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/approval-gate-utils.ts +0 -0
  60. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/approval-gate.test.ts +0 -0
  61. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/approval-scopes.test.ts +0 -0
  62. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/approval-scopes.ts +0 -0
  63. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/apps/app-catalog.ts +0 -0
  64. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/apps/app-detail-workspace.tsx +0 -0
  65. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/audit-workspace.tsx +0 -0
  66. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/clear-policy-payload.test.ts +0 -0
  67. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/clear-policy-payload.ts +0 -0
  68. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/compare-time-periods.tsx +0 -0
  69. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/data-flow-evidence-card.tsx +0 -0
  70. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/error-boundary.tsx +0 -0
  71. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/app-tab.tsx +0 -0
  72. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/categories.tsx +0 -0
  73. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/category-tab.tsx +0 -0
  74. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-action-detail.tsx +0 -0
  75. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-action-list.tsx +0 -0
  76. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-analytics-panel.tsx +0 -0
  77. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-clear-modal.tsx +0 -0
  78. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-copy.test.ts +0 -0
  79. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-detail.test.ts +0 -0
  80. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-export-drawer.tsx +0 -0
  81. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-export.test.ts +0 -0
  82. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-export.ts +0 -0
  83. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-filter-bar.tsx +0 -0
  84. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-filters.test.ts +0 -0
  85. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-filters.ts +0 -0
  86. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-insight-strip.tsx +0 -0
  87. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-metrics.test.ts +0 -0
  88. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-metrics.ts +0 -0
  89. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-pagination.test.ts +0 -0
  90. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-pagination.ts +0 -0
  91. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-perf.test.ts +0 -0
  92. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-period.ts +0 -0
  93. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-sort.test.ts +0 -0
  94. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-sort.ts +0 -0
  95. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-story.test.ts +0 -0
  96. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-types.ts +0 -0
  97. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-url-state.test.ts +0 -0
  98. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-url-state.ts +0 -0
  99. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/evidence-view-shell.tsx +0 -0
  100. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/explore-tab.tsx +0 -0
  101. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/index.ts +0 -0
  102. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/plain-english.ts +0 -0
  103. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/evidence/story-tab.tsx +0 -0
  104. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/feed-health-workspace.tsx +0 -0
  105. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/fleet-workspace-phase11.test.ts +0 -0
  106. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/fleet-workspace.test.ts +0 -0
  107. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/fleet-workspace.tsx +0 -0
  108. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/guard-api.test.ts +0 -0
  109. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/guard-api.ts +0 -0
  110. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/guard-demo.ts +0 -0
  111. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/guard-types.ts +0 -0
  112. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/help-modal.tsx +0 -0
  113. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/history-analytics.tsx +0 -0
  114. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/history-charts.tsx +0 -0
  115. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/history-export.ts +0 -0
  116. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/home-dashboard.test.ts +0 -0
  117. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/home-dashboard.tsx +0 -0
  118. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/home-protection-module.tsx +0 -0
  119. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/main.tsx +0 -0
  120. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/phase09-review.test.ts +0 -0
  121. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/policy-workspace.tsx +0 -0
  122. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/queue-chip-filter.tsx +0 -0
  123. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/queue-state.test.ts +0 -0
  124. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/queue-state.ts +0 -0
  125. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/receipts-workspace.test.ts +0 -0
  126. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/receipts-workspace.tsx +0 -0
  127. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/review-workspace.tsx +0 -0
  128. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/risk-signal-cards.test.ts +0 -0
  129. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/risk-signal-cards.tsx +0 -0
  130. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/runtime-overview.test.ts +0 -0
  131. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/runtime-overview.tsx +0 -0
  132. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/scanner-evidence-badge.tsx +0 -0
  133. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/scrg159-170.test.ts +0 -0
  134. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/scrg171-172.test.ts +0 -0
  135. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/security-fixes.test.ts +0 -0
  136. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/settings-workspace-phase11.test.ts +0 -0
  137. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/settings-workspace.test.ts +0 -0
  138. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/settings-workspace.tsx +0 -0
  139. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/styles.css +0 -0
  140. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/supply-chain-firewall-panel.tsx +0 -0
  141. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/supply-chain-firewall-views.tsx +0 -0
  142. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/supply-chain-manager-card.tsx +0 -0
  143. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/supply-chain-workspace.tsx +0 -0
  144. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/totp-enrollment-qr-panel.tsx +0 -0
  145. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/use-debounce.ts +0 -0
  146. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/use-focus-trap.ts +0 -0
  147. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/use-keyboard-shortcut.ts +0 -0
  148. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/use-reduced-motion.ts +0 -0
  149. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/use-route-focus.ts +0 -0
  150. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/vite-env.d.ts +0 -0
  151. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/src/watched-app-card.tsx +0 -0
  152. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/tsconfig.json +0 -0
  153. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/dashboard/vite.config.ts +0 -0
  154. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/docker-requirements.txt +0 -0
  155. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/docs/guard/SKILL.md +0 -0
  156. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/docs/guard/architecture.md +0 -0
  157. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/docs/guard/get-started.md +0 -0
  158. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/docs/guard/harness-support.md +0 -0
  159. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/docs/guard/incident-response.md +0 -0
  160. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/docs/guard/local-vs-cloud.md +0 -0
  161. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/docs/guard/release-checklist.md +0 -0
  162. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/docs/guard/remediation.md +0 -0
  163. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/docs/guard/smoke-tests.md +0 -0
  164. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/docs/guard/testing-matrix.md +0 -0
  165. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/docs/trust/mcp-trust-draft.md +0 -0
  166. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/docs/trust/plugin-trust-draft.md +0 -0
  167. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/docs/trust/skill-trust-local.md +0 -0
  168. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/fuzzers/manifest_fuzzer.py +0 -0
  169. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/requirements.txt +0 -0
  170. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/schemas/plugin-quality.v1.json +0 -0
  171. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/schemas/scan-result.v1.json +0 -0
  172. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/schemas/verify-result.v1.json +0 -0
  173. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/scripts/codex-auto-resume-smoke.py +0 -0
  174. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/__init__.py +0 -0
  175. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/action_runner.py +0 -0
  176. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/argparse_utils.py +0 -0
  177. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/checks/__init__.py +0 -0
  178. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/checks/best_practices.py +0 -0
  179. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/checks/claude.py +0 -0
  180. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/checks/code_quality.py +0 -0
  181. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/checks/ecosystem_common.py +0 -0
  182. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/checks/gemini.py +0 -0
  183. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/checks/manifest.py +0 -0
  184. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/checks/manifest_support.py +0 -0
  185. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/checks/marketplace.py +0 -0
  186. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/checks/mcp_security.py +0 -0
  187. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/checks/opencode.py +0 -0
  188. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/checks/operational_security.py +0 -0
  189. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/checks/security.py +0 -0
  190. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/checks/skill_security.py +0 -0
  191. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/cli.py +0 -0
  192. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/cli_ui.py +0 -0
  193. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/config.py +0 -0
  194. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/ecosystems/__init__.py +0 -0
  195. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/ecosystems/base.py +0 -0
  196. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/ecosystems/claude.py +0 -0
  197. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/ecosystems/codex.py +0 -0
  198. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/ecosystems/detect.py +0 -0
  199. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/ecosystems/gemini.py +0 -0
  200. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/ecosystems/opencode.py +0 -0
  201. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/ecosystems/registry.py +0 -0
  202. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/ecosystems/types.py +0 -0
  203. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/github_reporting.py +0 -0
  204. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/__init__.py +0 -0
  205. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/access_graph_events.py +0 -0
  206. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/adapters/__init__.py +0 -0
  207. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/adapters/antigravity.py +0 -0
  208. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/adapters/base.py +0 -0
  209. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/adapters/claude_code.py +0 -0
  210. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/adapters/cloud_identity.py +0 -0
  211. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/adapters/codex.py +0 -0
  212. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/adapters/contracts.py +0 -0
  213. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/adapters/copilot.py +0 -0
  214. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/adapters/cursor.py +0 -0
  215. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/adapters/gemini.py +0 -0
  216. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/adapters/hermes.py +0 -0
  217. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/adapters/mcp_servers.py +0 -0
  218. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/adapters/openclaw.py +0 -0
  219. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/adapters/openclaw_config.py +0 -0
  220. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/adapters/openclaw_support.py +0 -0
  221. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/adapters/opencode.py +0 -0
  222. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/adapters/opencode_artifacts.py +0 -0
  223. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/advisory_model.py +0 -0
  224. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/approval_gate.py +0 -0
  225. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/approval_gate_state.py +0 -0
  226. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/approvals.py +0 -0
  227. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/bridge/__init__.py +0 -0
  228. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/capabilities.py +0 -0
  229. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/cli/__init__.py +0 -0
  230. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/cli/approval_commands.py +0 -0
  231. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/cli/approval_gate_prompt.py +0 -0
  232. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/cli/bootstrap.py +0 -0
  233. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/cli/commands.py +0 -0
  234. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/cli/connect_flow.py +0 -0
  235. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/cli/docs.py +0 -0
  236. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/cli/install_commands.py +0 -0
  237. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/cli/product.py +0 -0
  238. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/cli/prompt.py +0 -0
  239. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/cli/render.py +0 -0
  240. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/cli/update_commands.py +0 -0
  241. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/codex_config.py +0 -0
  242. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/config.py +0 -0
  243. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/consumer/__init__.py +0 -0
  244. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/consumer/service.py +0 -0
  245. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/__init__.py +0 -0
  246. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/client.py +0 -0
  247. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/manager.py +0 -0
  248. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/server.py +0 -0
  249. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/apple-touch-icon.png +0 -0
  250. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/app-catalog.js +0 -0
  251. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/app-detail-workspace.js +0 -0
  252. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/audit-workspace.js +0 -0
  253. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/feed-health-workspace.js +0 -0
  254. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/fleet-workspace.js +0 -0
  255. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/help-modal.js +0 -0
  256. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/home-dashboard.js +0 -0
  257. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/policy-workspace.js +0 -0
  258. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/runtime-overview.js +0 -0
  259. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/settings-workspace.js +0 -0
  260. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/supply-chain-workspace.js +0 -0
  261. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/use-focus-trap.js +0 -0
  262. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/assets/index.css +0 -0
  263. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Icon_Dark.png +0 -0
  264. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Whole.png +0 -0
  265. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/favicon-16x16.png +0 -0
  266. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/favicon-32x32.png +0 -0
  267. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/favicon.ico +0 -0
  268. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/daemon/static/index.html +0 -0
  269. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/desktop_notifications.py +0 -0
  270. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/edge_events.py +0 -0
  271. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/harness_usage.py +0 -0
  272. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/incident.py +0 -0
  273. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/insights.py +0 -0
  274. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/inventory_cisco.py +0 -0
  275. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/inventory_contract.py +0 -0
  276. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/launcher.py +0 -0
  277. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/local_supply_chain.py +0 -0
  278. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/mcp_tool_calls.py +0 -0
  279. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/models.py +0 -0
  280. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/policy/__init__.py +0 -0
  281. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/policy/engine.py +0 -0
  282. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/product_model.py +0 -0
  283. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/protect.py +0 -0
  284. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/provenance.py +0 -0
  285. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/proxy/__init__.py +0 -0
  286. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/proxy/remote.py +0 -0
  287. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/proxy/runtime_mcp.py +0 -0
  288. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/proxy/stdio.py +0 -0
  289. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/receipts/__init__.py +0 -0
  290. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/receipts/manager.py +0 -0
  291. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/redaction.py +0 -0
  292. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/risk.py +0 -0
  293. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/__init__.py +0 -0
  294. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/action_identity.py +0 -0
  295. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/actions.py +0 -0
  296. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/advisory_escalation.py +0 -0
  297. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/advisory_matchers.py +0 -0
  298. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/cisco_evidence.py +0 -0
  299. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/cisco_preflight.py +0 -0
  300. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/composition_rules.py +0 -0
  301. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/data_flow.py +0 -0
  302. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/data_flow_rules.py +0 -0
  303. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/data_flow_variables.py +0 -0
  304. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/decisions.py +0 -0
  305. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/detectors.py +0 -0
  306. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/false_positive_rules.py +0 -0
  307. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/js_semver.py +0 -0
  308. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/mcp_protection.py +0 -0
  309. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/package_intent.py +0 -0
  310. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/package_intent_common.py +0 -0
  311. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/package_intent_parser.py +0 -0
  312. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/package_manifest_diff.py +0 -0
  313. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/persistence_rules.py +0 -0
  314. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/prompt_injection.py +0 -0
  315. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/runner.py +0 -0
  316. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/safe_decode.py +0 -0
  317. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/sandbox.py +0 -0
  318. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/scanner_cache.py +0 -0
  319. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/secret_file_requests.py +0 -0
  320. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/secret_sensitivity.py +0 -0
  321. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/secret_sources.py +0 -0
  322. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/sed_scripts.py +0 -0
  323. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/shell_commands.py +0 -0
  324. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/signals.py +0 -0
  325. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/skill_protection.py +0 -0
  326. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/supply_chain.py +0 -0
  327. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/supply_chain_bundle.py +0 -0
  328. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/supply_chain_bundle_base.py +0 -0
  329. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/supply_chain_bundle_models.py +0 -0
  330. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/supply_chain_bundle_runtime.py +0 -0
  331. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/supply_chain_package_eval.py +0 -0
  332. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/supply_chain_support.py +0 -0
  333. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/surface_server.py +0 -0
  334. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/temp_files.py +0 -0
  335. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/runtime/threat_intel.py +0 -0
  336. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/schemas/__init__.py +0 -0
  337. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/schemas/consumer_mode.py +0 -0
  338. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/schemas/guard_event_v1.py +0 -0
  339. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/schemas/guard_product_model_v1.json +0 -0
  340. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/schemas/surface_server.py +0 -0
  341. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/shims.py +0 -0
  342. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/store.py +0 -0
  343. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/store_approvals.py +0 -0
  344. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/store_connect.py +0 -0
  345. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/store_evidence.py +0 -0
  346. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/store_resume.py +0 -0
  347. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/store_supply_chain.py +0 -0
  348. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/store_threat_intel.py +0 -0
  349. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/totp.py +0 -0
  350. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/guard/types.py +0 -0
  351. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/integrations/__init__.py +0 -0
  352. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/integrations/cisco_mcp_scanner.py +0 -0
  353. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/integrations/cisco_skill_scanner.py +0 -0
  354. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/lint_fixes.py +0 -0
  355. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/marketplace_support.py +0 -0
  356. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/models.py +0 -0
  357. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/path_support.py +0 -0
  358. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/policy.py +0 -0
  359. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/quality_artifact.py +0 -0
  360. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/repo_detect.py +0 -0
  361. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/reporting.py +0 -0
  362. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/rules/__init__.py +0 -0
  363. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/rules/registry.py +0 -0
  364. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/rules/specs.py +0 -0
  365. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/scanner.py +0 -0
  366. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/submission.py +0 -0
  367. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/suppressions.py +0 -0
  368. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/trust_domain_scoring.py +0 -0
  369. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/trust_helpers.py +0 -0
  370. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/trust_mcp_scoring.py +0 -0
  371. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/trust_models.py +0 -0
  372. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/trust_plugin_scoring.py +0 -0
  373. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/trust_scoring.py +0 -0
  374. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/trust_skill_scoring.py +0 -0
  375. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/trust_specs.py +0 -0
  376. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/src/codex_plugin_scanner/verification.py +0 -0
  377. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/__init__.py +0 -0
  378. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/conftest.py +0 -0
  379. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/__init__.py +0 -0
  380. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/bad-plugin/.codex-plugin/plugin.json +0 -0
  381. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/bad-plugin/.mcp.json +0 -0
  382. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/bad-plugin/secrets.js +0 -0
  383. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/claude-plugin-good/.claude-plugin/plugin.json +0 -0
  384. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/claude-plugin-good/LICENSE +0 -0
  385. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/claude-plugin-good/README.md +0 -0
  386. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/claude-plugin-good/SECURITY.md +0 -0
  387. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/claude-plugin-good/hooks/hooks.json +0 -0
  388. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/claude-plugin-good/skills/example/SKILL.md +0 -0
  389. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/code-quality-bad/evil.js +0 -0
  390. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/code-quality-bad/inject.js +0 -0
  391. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/gemini-extension-good/GEMINI.md +0 -0
  392. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/gemini-extension-good/LICENSE +0 -0
  393. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/gemini-extension-good/README.md +0 -0
  394. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/gemini-extension-good/SECURITY.md +0 -0
  395. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/gemini-extension-good/commands/hello.toml +0 -0
  396. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/gemini-extension-good/gemini-extension.json +0 -0
  397. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/good-plugin/.codex-plugin/plugin.json +0 -0
  398. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/good-plugin/.codexignore +0 -0
  399. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/good-plugin/LICENSE +0 -0
  400. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/good-plugin/README.md +0 -0
  401. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/good-plugin/SECURITY.md +0 -0
  402. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/good-plugin/assets/icon.svg +0 -0
  403. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/good-plugin/assets/logo.svg +0 -0
  404. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/good-plugin/assets/screenshot.svg +0 -0
  405. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/good-plugin/skills/example/SKILL.md +0 -0
  406. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-codex-malicious-mcp/.codex/config.toml +0 -0
  407. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-red-team/README.md +0 -0
  408. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-red-team/benign-docs-fake-token.py +0 -0
  409. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-red-team/benign-health-endpoint.py +0 -0
  410. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-red-team/benign-nvmrc-fake-creds.py +0 -0
  411. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-red-team/benign-source-search.py +0 -0
  412. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-red-team/canary-exfil-encoded.py +0 -0
  413. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-red-team/canary-exfil.py +0 -0
  414. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-red-team/expected-decisions.json +0 -0
  415. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-red-team/malicious-dockerfile.txt +0 -0
  416. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-red-team/malicious-encoded-shell-exfil.py +0 -0
  417. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-red-team/malicious-github-action.yml +0 -0
  418. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-red-team/malicious-mcp-delete.md +0 -0
  419. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-red-team/malicious-mcp-secret-read.md +0 -0
  420. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-red-team/malicious-mcp-skill-exfil.md +0 -0
  421. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-red-team/malicious-npm-postinstall.js +0 -0
  422. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-red-team/malicious-prompt-env-read.md +0 -0
  423. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-red-team/malicious-prompt-guard-bypass.md +0 -0
  424. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-red-team/malicious-prompt-npmrc-read.md +0 -0
  425. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-red-team/malicious-python-setup.py +0 -0
  426. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/guard-red-team/smoke-evidence-template.json +0 -0
  427. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/hermes-plugin-evil/config.yaml +0 -0
  428. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/hermes-plugin-evil/mcp_servers.json +0 -0
  429. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/hermes-plugin-evil/skills/security/malicious/SKILL.md +0 -0
  430. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/SKILL.md +0 -0
  431. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/references/api-setup.md +0 -0
  432. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/scripts/deploy.sh +0 -0
  433. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/hermes-plugin-evil/skills/utils/benign/SKILL.md +0 -0
  434. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/malformed-json/.codex-plugin/plugin.json +0 -0
  435. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/malicious-skill-plugin/.codex-plugin/plugin.json +0 -0
  436. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/malicious-skill-plugin/.codexignore +0 -0
  437. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/malicious-skill-plugin/LICENSE +0 -0
  438. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/malicious-skill-plugin/README.md +0 -0
  439. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/malicious-skill-plugin/SECURITY.md +0 -0
  440. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/malicious-skill-plugin/skills/leaky-skill/SKILL.md +0 -0
  441. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/mcp-canary-server.py +0 -0
  442. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/minimal-plugin/.codex-plugin/plugin.json +0 -0
  443. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/missing-fields/.codex-plugin/plugin.json +0 -0
  444. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/mit-license/LICENSE +0 -0
  445. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/multi-ecosystem-repo/codex-plugin/.codex-plugin/plugin.json +0 -0
  446. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/multi-ecosystem-repo/codex-plugin/LICENSE +0 -0
  447. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/multi-ecosystem-repo/codex-plugin/README.md +0 -0
  448. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/multi-ecosystem-repo/codex-plugin/SECURITY.md +0 -0
  449. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/multi-ecosystem-repo/gemini-ext/README.md +0 -0
  450. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/multi-ecosystem-repo/gemini-ext/gemini-extension.json +0 -0
  451. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/multi-plugin-repo/.agents/plugins/marketplace.json +0 -0
  452. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codex-plugin/plugin.json +0 -0
  453. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codexignore +0 -0
  454. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/LICENSE +0 -0
  455. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/README.md +0 -0
  456. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/SECURITY.md +0 -0
  457. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/skills/example/SKILL.md +0 -0
  458. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/.codex-plugin/plugin.json +0 -0
  459. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/skills/example/SKILL.md +0 -0
  460. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/no-version/.codex-plugin/plugin.json +0 -0
  461. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/opencode-good/.opencode/commands/hello.md +0 -0
  462. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/opencode-good/.opencode/plugins/example.ts +0 -0
  463. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/opencode-good/LICENSE +0 -0
  464. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/opencode-good/README.md +0 -0
  465. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/opencode-good/SECURITY.md +0 -0
  466. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/opencode-good/opencode.jsonc +0 -0
  467. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/skills-missing-dir/.codex-plugin/plugin.json +0 -0
  468. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/skills-no-frontmatter/.codex-plugin/plugin.json +0 -0
  469. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/skills-no-frontmatter/skills/bad-skill/SKILL.md +0 -0
  470. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/supply-chain/benign-npm-controls-package.json +0 -0
  471. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/supply-chain/benign-npm-package.json +0 -0
  472. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/supply-chain/benign-pnpm-package.json +0 -0
  473. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/supply-chain/benign-pyproject.toml +0 -0
  474. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/supply-chain/critical-base-image-Dockerfile +0 -0
  475. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/supply-chain/malicious-Dockerfile +0 -0
  476. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/supply-chain/malicious-action.yml +0 -0
  477. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/supply-chain/malicious-npm-env-fs-network-package.json +0 -0
  478. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/supply-chain/malicious-npm-obfuscated-package.json +0 -0
  479. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/supply-chain/malicious-npm-package.json +0 -0
  480. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/supply-chain/malicious-setup.py +0 -0
  481. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/tier2/cargo-safe/Cargo.lock +0 -0
  482. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/tier2/cargo-safe/Cargo.toml +0 -0
  483. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/tier2/cargo-vulnerable/Cargo.lock +0 -0
  484. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/tier2/cargo-vulnerable/Cargo.toml +0 -0
  485. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/tier2/composer-safe/composer.json +0 -0
  486. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/tier2/composer-safe/composer.lock +0 -0
  487. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/tier2/composer-vulnerable/composer.json +0 -0
  488. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/tier2/composer-vulnerable/composer.lock +0 -0
  489. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/tier2/go-safe/go.mod +0 -0
  490. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/tier2/go-vulnerable/go.mod +0 -0
  491. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/tier2/gradle-safe/build.gradle +0 -0
  492. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/tier2/gradle-safe/gradle.lockfile +0 -0
  493. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/tier2/gradle-vulnerable/build.gradle +0 -0
  494. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/tier2/gradle-vulnerable/gradle.lockfile +0 -0
  495. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/tier2/maven-safe/pom.xml +0 -0
  496. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/tier2/maven-vulnerable/pom.xml +0 -0
  497. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/tier2/rubygems-safe/Gemfile +0 -0
  498. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/tier2/rubygems-safe/Gemfile.lock +0 -0
  499. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/tier2/rubygems-vulnerable/Gemfile +0 -0
  500. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/tier2/rubygems-vulnerable/Gemfile.lock +0 -0
  501. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/with-marketplace/.codex-plugin/plugin.json +0 -0
  502. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/with-marketplace/marketplace-broken.json +0 -0
  503. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/fixtures/with-marketplace/marketplace.json +0 -0
  504. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/guard_python_phase12_support.py +0 -0
  505. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/guard_tier2_phase13_support.py +0 -0
  506. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test-trust-scoring.py +0 -0
  507. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test-trust-specs.py +0 -0
  508. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_action_runner.py +0 -0
  509. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_best_practices.py +0 -0
  510. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_cisco_install_surfaces.py +0 -0
  511. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_cli.py +0 -0
  512. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_code_quality.py +0 -0
  513. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_config.py +0 -0
  514. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_coverage_remaining.py +0 -0
  515. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_cursor_adapter.py +0 -0
  516. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_ecosystems.py +0 -0
  517. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_edge_cases.py +0 -0
  518. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_final_coverage.py +0 -0
  519. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_gemini_adapter.py +0 -0
  520. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_access_graph.py +0 -0
  521. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_action_identity.py +0 -0
  522. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_advisory_escalation.py +0 -0
  523. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_approval_continuity.py +0 -0
  524. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_approval_copy_commands.py +0 -0
  525. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_approval_decisions.py +0 -0
  526. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_approval_gate.py +0 -0
  527. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_approval_store_dedup.py +0 -0
  528. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_approval_store_phase14.py +0 -0
  529. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_approval_store_scale.py +0 -0
  530. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_approvals.py +0 -0
  531. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_bootstrap.py +0 -0
  532. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_bypass_detector.py +0 -0
  533. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_canary_fixtures.py +0 -0
  534. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_capabilities.py +0 -0
  535. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_cisco_evidence.py +0 -0
  536. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_cisco_runtime_cli.py +0 -0
  537. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_claude_adapter.py +0 -0
  538. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_cli.py +0 -0
  539. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_cloud_local_sync.py +0 -0
  540. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_codex_auto_resume_smoke.py +0 -0
  541. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_codex_e2e.py +0 -0
  542. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_codex_install.py +0 -0
  543. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_codex_proxy.py +0 -0
  544. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_config_paths.py +0 -0
  545. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_connect_flow.py +0 -0
  546. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_consumer_mode.py +0 -0
  547. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_copilot_adapter.py +0 -0
  548. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_copilot_proxy.py +0 -0
  549. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_daemon_cli.py +0 -0
  550. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_daemon_manager.py +0 -0
  551. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_daemon_perf.py +0 -0
  552. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_daemon_registry.py +0 -0
  553. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_daemon_repair_perf.py +0 -0
  554. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_daemon_wake.py +0 -0
  555. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_data_flow.py +0 -0
  556. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_decision_propagation.py +0 -0
  557. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_desktop_notifications.py +0 -0
  558. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_detector_fp.py +0 -0
  559. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_docs.py +0 -0
  560. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_event_schema_v1.py +0 -0
  561. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_events.py +0 -0
  562. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_evidence_api_contract.py +0 -0
  563. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_evidence_store.py +0 -0
  564. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_harness_contracts.py +0 -0
  565. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_harness_setup.py +0 -0
  566. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_harness_smoke.py +0 -0
  567. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_hashnet_mcp_canaries.py +0 -0
  568. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_headless_daemon_api.py +0 -0
  569. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_insights.py +0 -0
  570. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_inventory_cisco.py +0 -0
  571. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_inventory_contract.py +0 -0
  572. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_js_lab_phase11.py +0 -0
  573. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_js_lockfile_resolution_phase11.py +0 -0
  574. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_js_package_hook_phase11.py +0 -0
  575. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_js_package_intent_phase11.py +0 -0
  576. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_js_semver_phase11.py +0 -0
  577. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_js_supply_chain_phase11.py +0 -0
  578. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_launch_env.py +0 -0
  579. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_local_supply_chain_audit_phase16.py +0 -0
  580. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_local_supply_chain_phase15.py +0 -0
  581. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_mcp_detectors.py +0 -0
  582. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_mcp_package_proxy_phase14.py +0 -0
  583. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_mcp_protection.py +0 -0
  584. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_opencode_proxy.py +0 -0
  585. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_package_hook.py +0 -0
  586. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_package_hook_phase14.py +0 -0
  587. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_package_intent.py +0 -0
  588. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_package_resume_phase14.py +0 -0
  589. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_package_shims.py +0 -0
  590. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_phase03_local_install.py +0 -0
  591. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_phase03_remainder.py +0 -0
  592. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_phase04_failure_modes.py +0 -0
  593. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_phase04_harness_contracts.py +0 -0
  594. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_phase04_harness_ux.py +0 -0
  595. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_phase05_approval_memory.py +0 -0
  596. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_phase07_harness_coverage_matrix.py +0 -0
  597. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_policy_dedup.py +0 -0
  598. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_product_flow.py +0 -0
  599. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_product_model_contracts.py +0 -0
  600. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_prompt_injection.py +0 -0
  601. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_protect.py +0 -0
  602. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_provenance.py +0 -0
  603. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_python_lab_phase12.py +0 -0
  604. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_python_package_hook_phase12.py +0 -0
  605. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_python_package_intent_phase12.py +0 -0
  606. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_python_supply_chain_heuristics_phase12.py +0 -0
  607. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_python_supply_chain_phase12.py +0 -0
  608. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_queue_api_contract.py +0 -0
  609. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_queue_contract.py +0 -0
  610. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_receipt_p5_fields.py +0 -0
  611. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_receipt_persistence.py +0 -0
  612. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_red_team.py +0 -0
  613. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_red_team_e2e.py +0 -0
  614. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_redaction.py +0 -0
  615. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_registry_broker_skills_canaries.py +0 -0
  616. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_render.py +0 -0
  617. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_resolution_copy.py +0 -0
  618. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_risk.py +0 -0
  619. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_runtime.py +0 -0
  620. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_runtime_action_harnesses.py +0 -0
  621. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_runtime_actions.py +0 -0
  622. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_runtime_actions_phase14.py +0 -0
  623. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_runtime_decisions.py +0 -0
  624. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_runtime_detectors.py +0 -0
  625. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_runtime_signals.py +0 -0
  626. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_safe_decode.py +0 -0
  627. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_sandbox.py +0 -0
  628. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_settings_api.py +0 -0
  629. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_settings_presets.py +0 -0
  630. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_shim_truth.py +0 -0
  631. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_skill_protection.py +0 -0
  632. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_skill_protection_phase14.py +0 -0
  633. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_store_migrations.py +0 -0
  634. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_supply_chain.py +0 -0
  635. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_supply_chain_bundle.py +0 -0
  636. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_supply_chain_daemon.py +0 -0
  637. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_supply_chain_evaluator.py +0 -0
  638. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_supply_chain_sync.py +0 -0
  639. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_surface_server.py +0 -0
  640. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_threat_intel.py +0 -0
  641. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_tier2_labs_phase13.py +0 -0
  642. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_tier2_package_intent_phase13.py +0 -0
  643. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_tier2_supply_chain_phase13.py +0 -0
  644. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_verdicts.py +0 -0
  645. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_web_recovery.py +0 -0
  646. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_guard_wrapper_flows.py +0 -0
  647. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_hermes_adapter.py +0 -0
  648. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_integration.py +0 -0
  649. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_lint_fixes.py +0 -0
  650. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_live_cisco_smoke.py +0 -0
  651. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_manifest.py +0 -0
  652. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_marketplace.py +0 -0
  653. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_mcp_security.py +0 -0
  654. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_openclaw_adapter.py +0 -0
  655. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_opencode_adapter.py +0 -0
  656. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_operational_security.py +0 -0
  657. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_policy.py +0 -0
  658. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_quality_artifact.py +0 -0
  659. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_rule_registry.py +0 -0
  660. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_scanner.py +0 -0
  661. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_schema_contracts.py +0 -0
  662. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_security.py +0 -0
  663. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_security_ops.py +0 -0
  664. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_skill_security.py +0 -0
  665. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_submission.py +0 -0
  666. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_trust_scoring.py +0 -0
  667. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_trust_specs.py +0 -0
  668. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_verification.py +0 -0
  669. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/tests/test_versioning.py +0 -0
  670. {plugin_scanner-2.0.373 → plugin_scanner-2.0.374}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plugin-scanner
3
- Version: 2.0.373
3
+ Version: 2.0.374
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/hol-guard
6
6
  Project-URL: Repository, https://github.com/hashgraph-online/hol-guard
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "plugin-scanner"
7
- version = "2.0.373"
7
+ version = "2.0.374"
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.373"
7
+ version = "2.0.374"
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"
@@ -6,10 +6,8 @@ import base64
6
6
  import hashlib
7
7
  import json
8
8
  import os
9
- import shutil
10
9
  import socket
11
10
  import struct
12
- import subprocess
13
11
  import tempfile
14
12
  import threading
15
13
  import time
@@ -132,6 +130,14 @@ def resume_codex_thread_for_request(
132
130
  thread_id = _first_string(metadata, ("codex_thread_id", "thread_id", "threadId", "session_id", "sessionId"))
133
131
  if thread_id is None:
134
132
  return None
133
+ if not _is_safe_codex_thread_id(thread_id):
134
+ return {
135
+ "status": "skipped",
136
+ "reason": "unsafe_thread_id",
137
+ "thread_id": thread_id,
138
+ "strategy": "codex-app-server-thread",
139
+ "supported": False,
140
+ }
135
141
  codex_home = _first_string(metadata, _CODEX_HOME_KEYS)
136
142
  socket_path = _first_string(metadata, _SOCKET_KEYS) or str(
137
143
  default_codex_app_server_socket_path(environ={"CODEX_HOME": codex_home or ""})
@@ -145,11 +151,17 @@ def resume_codex_thread_for_request(
145
151
  command_text = _first_string(metadata, _COMMAND_TEXT_KEYS)
146
152
  prompt = build_codex_continuation_prompt(action, request_id=request_id, command_text=command_text)
147
153
  if not Path(socket_path).expanduser().exists():
148
- return _resume_codex_thread_with_cli(
149
- metadata=metadata,
150
- thread_id=thread_id,
151
- prompt=prompt,
152
- )
154
+ return {
155
+ "status": "failed",
156
+ "reason": "socket_not_available",
157
+ "thread_id": thread_id,
158
+ "strategy": "codex-app-server-thread",
159
+ "supported": True,
160
+ "message": (
161
+ "Codex App remote-control socket is unavailable. HOL Guard will not start `codex exec resume` "
162
+ "because that creates a separate background run instead of continuing the visible Codex chat."
163
+ ),
164
+ }
153
165
  request_payloads = [
154
166
  {
155
167
  "jsonrpc": "2.0",
@@ -284,102 +296,6 @@ def _send_codex_resume_worker(
284
296
  ready.set()
285
297
 
286
298
 
287
- def _resume_codex_thread_with_cli(
288
- *,
289
- metadata: Mapping[str, object],
290
- thread_id: str,
291
- prompt: str,
292
- ) -> dict[str, object]:
293
- """Resume a saved Codex exec thread when the live app-server socket is gone."""
294
-
295
- if not _is_safe_codex_thread_id(thread_id):
296
- return {
297
- "status": "skipped",
298
- "reason": "unsafe_thread_id",
299
- "thread_id": thread_id,
300
- "strategy": "codex-headless-exec",
301
- "supported": False,
302
- }
303
- workspace = _first_string(metadata, _WORKSPACE_KEYS)
304
- if workspace is None:
305
- return {
306
- "status": "skipped",
307
- "reason": "workspace_not_available",
308
- "thread_id": thread_id,
309
- "strategy": "codex-headless-exec",
310
- "supported": False,
311
- }
312
- workspace_path = Path(workspace).expanduser()
313
- if not workspace_path.is_dir():
314
- return {
315
- "status": "skipped",
316
- "reason": "workspace_not_available",
317
- "thread_id": thread_id,
318
- "strategy": "codex-headless-exec",
319
- "supported": False,
320
- }
321
- codex_home = _first_string(metadata, _CODEX_HOME_KEYS)
322
- if codex_home is not None and not Path(codex_home).expanduser().is_dir():
323
- return {
324
- "status": "skipped",
325
- "reason": "codex_home_not_available",
326
- "thread_id": thread_id,
327
- "strategy": "codex-headless-exec",
328
- "supported": False,
329
- }
330
- codex_binary = shutil.which("codex")
331
- if codex_binary is None:
332
- return {
333
- "status": "skipped",
334
- "reason": "codex_binary_not_found",
335
- "thread_id": thread_id,
336
- "strategy": "codex-headless-exec",
337
- "supported": False,
338
- }
339
- command = [
340
- codex_binary,
341
- "exec",
342
- "resume",
343
- "--json",
344
- "--skip-git-repo-check",
345
- ]
346
- model = _first_string(metadata, _MODEL_KEYS)
347
- if model is not None and _is_safe_codex_model(model):
348
- command.extend(["--model", model])
349
- command.append("--")
350
- command.extend([thread_id, prompt])
351
- env = os.environ.copy()
352
- if codex_home is not None:
353
- env["CODEX_HOME"] = str(Path(codex_home).expanduser())
354
- try:
355
- process = subprocess.Popen(
356
- command,
357
- cwd=workspace_path,
358
- env=env,
359
- stdin=subprocess.DEVNULL,
360
- stdout=subprocess.DEVNULL,
361
- stderr=subprocess.DEVNULL,
362
- start_new_session=True,
363
- )
364
- except OSError as error:
365
- return {
366
- "status": "failed",
367
- "reason": "headless_resume_launch_failed",
368
- "last_error": str(error),
369
- "thread_id": thread_id,
370
- "strategy": "codex-headless-exec",
371
- "supported": True,
372
- }
373
- return {
374
- "status": "sent",
375
- "reason": "headless_resume_started",
376
- "thread_id": thread_id,
377
- "strategy": "codex-headless-exec",
378
- "supported": True,
379
- "pid": process.pid,
380
- }
381
-
382
-
383
299
  def _find_codex_operation_for_request(store: _OperationStore, request_id: str) -> dict[str, object] | None:
384
300
  operation = store.get_guard_operation_for_approval_request(request_id)
385
301
  if operation is not None and str(operation.get("harness")) == "codex":
@@ -632,15 +548,6 @@ def _is_safe_codex_thread_id(thread_id: str) -> bool:
632
548
  )
633
549
 
634
550
 
635
- def _is_safe_codex_model(model: str) -> bool:
636
- return (
637
- 0 < len(model) <= 128
638
- and not model.startswith("-")
639
- and bool(model.strip())
640
- and all(char.isalnum() or char in "-_.:" for char in model)
641
- )
642
-
643
-
644
551
  def _first_string(payload: Mapping[str, object], keys: tuple[str, ...]) -> str | None:
645
552
  for key in keys:
646
553
  value = payload.get(key)
@@ -2,7 +2,6 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- import shutil
6
5
  from collections.abc import Mapping
7
6
  from datetime import datetime, timezone
8
7
 
@@ -163,24 +162,20 @@ def defer_request_resume_to_live_hook(
163
162
 
164
163
 
165
164
  def inspect_codex_resume_capabilities(store: GuardStore) -> dict[str, object]:
166
- binary_path = shutil.which("codex")
167
165
  socket_available = default_codex_app_server_socket_available()
168
166
  latest_attempt = store.get_latest_request_resume(harness="codex")
169
167
  return {
170
- "codex_binary_found": binary_path is not None,
168
+ "codex_binary_found": False,
171
169
  "app_server_support": socket_available,
172
170
  "app_server_support_reason": (
173
171
  "Same-chat continuation requires the Codex app-server remote-control socket. "
174
172
  "When the socket is missing, HOL Guard cannot visibly continue the open Codex App chat."
175
173
  ),
176
174
  "app_server_socket_available": socket_available,
177
- "headless_resume_support": binary_path is not None,
175
+ "headless_resume_support": False,
178
176
  "headless_resume_support_reason": (
179
- "When the live app-server socket is gone, HOL Guard resumes saved Codex exec threads with "
180
- "`codex exec resume` from the original workspace. This is a background retry, not a visible "
181
- "message in the open Codex App chat."
182
- if binary_path is not None
183
- else "`codex` was not found on PATH, so HOL Guard can only save the approval for manual retry."
177
+ "Disabled by design. `codex exec resume` starts a separate background run and does not continue "
178
+ "the visible Codex App chat. HOL Guard only auto-continues Codex through the app-server socket."
184
179
  ),
185
180
  "latest_attempt": latest_attempt,
186
181
  }
@@ -352,15 +347,7 @@ def _normalize_dispatch_result(
352
347
  raw_supported = raw_result.get("supported")
353
348
  supported = raw_supported if isinstance(raw_supported, bool) else raw_status != "skipped"
354
349
  if raw_status == "sent":
355
- message = (
356
- "HOL Guard sent Codex a continuation message in the original chat."
357
- if effective_strategy != "codex-headless-exec"
358
- else (
359
- "HOL Guard started a background `codex exec resume` retry for this saved thread. "
360
- "The command can complete in Codex history, but this open Codex App chat will not visibly "
361
- "continue unless the Codex app-server remote-control socket is enabled."
362
- )
363
- )
350
+ message = "HOL Guard sent Codex a continuation message in the original chat."
364
351
  return {
365
352
  "status": "sent",
366
353
  "reason": raw_reason,
@@ -14681,13 +14681,6 @@ function buildCodexResumeUx(resume) {
14681
14681
  };
14682
14682
  }
14683
14683
  if (resume.status === "sent" || resume.status === "already_sent") {
14684
- if (resume.strategy === "codex-headless-exec" || resume.reason === "headless_resume_started") {
14685
- return {
14686
- headline: "Codex resumed in background.",
14687
- body: resume.message ?? "HOL Guard started a background Codex resume. This open Codex App chat may not visibly continue until Codex remote control is enabled.",
14688
- showRetry: false
14689
- };
14690
- }
14691
14684
  return {
14692
14685
  headline: "Codex chat notified.",
14693
14686
  body: resume.message ?? "HOL Guard sent Codex a continuation message in the original chat.",
@@ -1,3 +1,3 @@
1
1
  """Single source of truth for tool version."""
2
2
 
3
- __version__ = "2.0.373"
3
+ __version__ = "2.0.374"
@@ -9,17 +9,10 @@ import pytest
9
9
 
10
10
  from codex_plugin_scanner.cli import main
11
11
  from codex_plugin_scanner.guard import codex_app_server as codex_app_server_module
12
- from codex_plugin_scanner.guard import codex_resume as codex_resume_module
13
12
  from codex_plugin_scanner.guard.models import GuardApprovalRequest
14
13
  from codex_plugin_scanner.guard.store import GuardStore
15
14
 
16
15
 
17
- def _stub_codex_binary(monkeypatch: pytest.MonkeyPatch) -> None:
18
- monkeypatch.setattr(
19
- codex_resume_module.shutil, "which", lambda command: "/usr/bin/codex" if command == "codex" else None
20
- )
21
-
22
-
23
16
  def _request(request_id: str) -> GuardApprovalRequest:
24
17
  return GuardApprovalRequest(
25
18
  request_id=request_id,
@@ -231,37 +224,33 @@ def test_guard_doctor_codex_reports_resume_diagnostics(
231
224
  output = json.loads(capsys.readouterr().out)
232
225
 
233
226
  assert rc == 0
234
- assert output["codex_resume"]["codex_binary_found"] in {True, False}
227
+ assert output["codex_resume"]["codex_binary_found"] is False
235
228
  assert output["codex_resume"]["app_server_support"] in {True, False}
236
229
  assert "remote-control socket" in output["codex_resume"]["app_server_support_reason"]
237
230
  assert output["codex_resume"]["app_server_socket_available"] in {True, False}
238
- assert output["codex_resume"]["headless_resume_support"] in {True, False}
239
- assert "codex exec resume" in output["codex_resume"]["headless_resume_support_reason"] or (
240
- "codex` was not found" in output["codex_resume"]["headless_resume_support_reason"]
241
- )
231
+ assert output["codex_resume"]["headless_resume_support"] is False
232
+ assert "Disabled by design" in output["codex_resume"]["headless_resume_support_reason"]
242
233
  assert output["codex_resume"]["latest_attempt"] is None
243
234
 
244
235
 
245
- def test_guard_doctor_codex_reports_app_server_support_from_codex_binary(
236
+ def test_guard_doctor_codex_reports_headless_resume_disabled(
246
237
  tmp_path: Path,
247
238
  capsys: pytest.CaptureFixture[str],
248
- monkeypatch: pytest.MonkeyPatch,
249
239
  ) -> None:
250
240
  home_dir = tmp_path / "home"
251
241
  guard_home = tmp_path / "guard-home"
252
242
  GuardStore(guard_home)
253
- _stub_codex_binary(monkeypatch)
254
243
 
255
244
  rc = main(["guard", "doctor", "codex", "--home", str(home_dir), "--guard-home", str(guard_home), "--json"])
256
245
  output = json.loads(capsys.readouterr().out)
257
246
 
258
247
  assert rc == 0
259
- assert output["codex_resume"]["codex_binary_found"] is True
248
+ assert output["codex_resume"]["codex_binary_found"] is False
260
249
  assert output["codex_resume"]["app_server_support"] in {True, False}
261
250
  assert "remote-control socket" in output["codex_resume"]["app_server_support_reason"]
262
251
  assert output["codex_resume"]["app_server_socket_available"] in {True, False}
263
- assert output["codex_resume"]["headless_resume_support"] is True
264
- assert "codex exec resume" in output["codex_resume"]["headless_resume_support_reason"]
252
+ assert output["codex_resume"]["headless_resume_support"] is False
253
+ assert "does not continue the visible Codex App chat" in output["codex_resume"]["headless_resume_support_reason"]
265
254
  assert "remote_control_support" not in output["codex_resume"]
266
255
 
267
256
 
@@ -296,31 +285,14 @@ def test_guard_approvals_resume_rejects_unsafe_headless_thread_id(
296
285
  assert rc == 0
297
286
  assert output["status"] == "skipped"
298
287
  assert output["reason"] == "unsafe_thread_id"
299
- assert output["strategy"] == "codex-headless-exec"
288
+ assert output["strategy"] == "codex-app-server-thread"
300
289
  assert "retry the same request" in output["message"]
301
290
 
302
291
 
303
- def test_guard_approvals_resume_starts_headless_codex_when_app_server_unavailable(
292
+ def test_guard_approvals_resume_requires_app_server_when_socket_unavailable(
304
293
  tmp_path: Path,
305
294
  capsys: pytest.CaptureFixture[str],
306
- monkeypatch: pytest.MonkeyPatch,
307
295
  ) -> None:
308
- launched: list[dict[str, object]] = []
309
-
310
- class _FakeProcess:
311
- pid = 4455
312
-
313
- def _fake_popen(command, **kwargs):
314
- launched.append({"command": command, **kwargs})
315
- return _FakeProcess()
316
-
317
- monkeypatch.setattr(
318
- codex_app_server_module.shutil,
319
- "which",
320
- lambda command: "/usr/local/bin/codex" if command == "codex" else None,
321
- )
322
- monkeypatch.setattr(codex_app_server_module.subprocess, "Popen", _fake_popen)
323
-
324
296
  home_dir = tmp_path / "guard-home"
325
297
  workspace = tmp_path / "workspace"
326
298
  codex_home = tmp_path / "codex-home"
@@ -347,35 +319,16 @@ def test_guard_approvals_resume_starts_headless_codex_when_app_server_unavailabl
347
319
  output = json.loads(capsys.readouterr().out)
348
320
 
349
321
  assert rc == 0
350
- assert output["status"] == "sent"
351
- assert output["reason"] == "headless_resume_started"
352
- assert output["strategy"] == "codex-headless-exec"
353
- assert "background" in output["message"]
354
- assert "open Codex App chat" in output["message"]
355
- assert len(launched) == 1
356
- assert launched[0]["cwd"] == workspace
357
- assert launched[0]["command"][:5] == ["/usr/local/bin/codex", "exec", "resume", "--json", "--skip-git-repo-check"]
358
- assert "--" in launched[0]["command"]
359
- assert "thread-1" in launched[0]["command"]
360
- assert launched[0]["env"]["CODEX_HOME"] == str(codex_home)
322
+ assert output["status"] == "failed"
323
+ assert output["reason"] == "socket_not_available"
324
+ assert output["strategy"] == "codex-app-server-thread"
325
+ assert "original chat" in output["message"]
361
326
 
362
327
 
363
328
  def test_guard_approvals_resume_does_not_start_headless_codex_for_blocked_request(
364
329
  tmp_path: Path,
365
330
  capsys: pytest.CaptureFixture[str],
366
- monkeypatch: pytest.MonkeyPatch,
367
331
  ) -> None:
368
- monkeypatch.setattr(
369
- codex_app_server_module.shutil,
370
- "which",
371
- lambda command: "/usr/local/bin/codex" if command == "codex" else None,
372
- )
373
- monkeypatch.setattr(
374
- codex_app_server_module.subprocess,
375
- "Popen",
376
- lambda *_args, **_kwargs: pytest.fail("blocked requests must not start codex exec resume"),
377
- )
378
-
379
332
  home_dir = tmp_path / "guard-home"
380
333
  workspace = tmp_path / "workspace"
381
334
  codex_home = tmp_path / "codex-home"
@@ -408,13 +361,10 @@ def test_guard_approvals_resume_does_not_start_headless_codex_for_blocked_reques
408
361
  assert "blocked this Codex request" in output["message"]
409
362
 
410
363
 
411
- def test_guard_approvals_resume_reports_missing_codex_home_without_spawning(
364
+ def test_guard_approvals_resume_reports_missing_app_server_without_spawning(
412
365
  tmp_path: Path,
413
366
  capsys: pytest.CaptureFixture[str],
414
- monkeypatch: pytest.MonkeyPatch,
415
367
  ) -> None:
416
- monkeypatch.setattr(codex_app_server_module.subprocess, "Popen", lambda *_args, **_kwargs: pytest.fail("no spawn"))
417
-
418
368
  home_dir = tmp_path / "guard-home"
419
369
  workspace = tmp_path / "workspace"
420
370
  workspace.mkdir()
@@ -439,6 +389,6 @@ def test_guard_approvals_resume_reports_missing_codex_home_without_spawning(
439
389
  output = json.loads(capsys.readouterr().out)
440
390
 
441
391
  assert rc == 0
442
- assert output["status"] == "skipped"
443
- assert output["reason"] == "codex_home_not_available"
444
- assert output["strategy"] == "codex-headless-exec"
392
+ assert output["status"] == "failed"
393
+ assert output["reason"] == "socket_not_available"
394
+ assert output["strategy"] == "codex-app-server-thread"
@@ -209,19 +209,7 @@ def test_codex_block_does_not_resume_codex_thread(
209
209
 
210
210
  def test_codex_block_with_missing_socket_does_not_start_headless_resume(
211
211
  tmp_path: Path,
212
- monkeypatch: pytest.MonkeyPatch,
213
212
  ) -> None:
214
- monkeypatch.setattr(
215
- codex_app_server_module.shutil,
216
- "which",
217
- lambda command: "/usr/bin/codex" if command == "codex" else None,
218
- )
219
- monkeypatch.setattr(
220
- codex_app_server_module.subprocess,
221
- "Popen",
222
- lambda *_args, **_kwargs: pytest.fail("blocked requests must not start codex exec resume"),
223
- )
224
-
225
213
  workspace = tmp_path / "workspace"
226
214
  codex_home = tmp_path / "codex-home"
227
215
  workspace.mkdir()
@@ -298,26 +286,9 @@ def test_codex_approve_defers_headless_resume_while_live_hook_waits(
298
286
  assert "original Codex action continue" in payload["codex_resume"]["message"]
299
287
 
300
288
 
301
- def test_codex_approve_stale_live_hook_wait_starts_headless_resume(
289
+ def test_codex_approve_stale_live_hook_wait_requires_app_server_socket(
302
290
  tmp_path: Path,
303
- monkeypatch: pytest.MonkeyPatch,
304
291
  ) -> None:
305
- launched: list[list[str]] = []
306
-
307
- class _FakeProcess:
308
- pid = 1031
309
-
310
- def _fake_popen(command, **_kwargs):
311
- launched.append(command)
312
- return _FakeProcess()
313
-
314
- monkeypatch.setattr(
315
- codex_app_server_module.shutil,
316
- "which",
317
- lambda command: "/usr/bin/codex" if command == "codex" else None,
318
- )
319
- monkeypatch.setattr(codex_app_server_module.subprocess, "Popen", _fake_popen)
320
-
321
292
  workspace = tmp_path / "workspace"
322
293
  codex_home = tmp_path / "codex-home"
323
294
  workspace.mkdir()
@@ -351,11 +322,10 @@ def test_codex_approve_stale_live_hook_wait_starts_headless_resume(
351
322
  daemon.stop()
352
323
 
353
324
  assert payload["resolved"] is True
354
- assert payload["codex_resume"]["status"] == "sent"
355
- assert payload["codex_resume"]["reason"] == "headless_resume_started"
356
- assert payload["codex_resume"]["strategy"] == "codex-headless-exec"
357
- assert launched[0][:5] == ["/usr/bin/codex", "exec", "resume", "--json", "--skip-git-repo-check"]
358
- assert "stale-live-session-1" in launched[0]
325
+ assert payload["codex_resume"]["status"] == "failed"
326
+ assert payload["codex_resume"]["reason"] == "socket_not_available"
327
+ assert payload["codex_resume"]["strategy"] == "codex-app-server-thread"
328
+ assert "original chat" in payload["codex_resume"]["message"]
359
329
 
360
330
 
361
331
  def test_codex_block_does_not_defer_to_live_hook_waiting_on_browser_decision(
@@ -393,26 +363,9 @@ def test_codex_block_does_not_defer_to_live_hook_waiting_on_browser_decision(
393
363
  assert payload["codex_resume"]["supported"] is False
394
364
 
395
365
 
396
- def test_codex_approve_pretooluse_no_wait_starts_headless_resume(
366
+ def test_codex_approve_pretooluse_no_wait_requires_app_server_socket(
397
367
  tmp_path: Path,
398
- monkeypatch: pytest.MonkeyPatch,
399
368
  ) -> None:
400
- launched: list[dict[str, object]] = []
401
-
402
- class _FakeProcess:
403
- pid = 1007
404
-
405
- def _fake_popen(command, **kwargs):
406
- launched.append({"command": command, **kwargs})
407
- return _FakeProcess()
408
-
409
- monkeypatch.setattr(
410
- codex_app_server_module.shutil,
411
- "which",
412
- lambda command: "/usr/bin/codex" if command == "codex" else None,
413
- )
414
- monkeypatch.setattr(codex_app_server_module.subprocess, "Popen", _fake_popen)
415
-
416
369
  workspace = tmp_path / "workspace"
417
370
  codex_home = tmp_path / "codex-home"
418
371
  workspace.mkdir()
@@ -445,21 +398,14 @@ def test_codex_approve_pretooluse_no_wait_starts_headless_resume(
445
398
  daemon.stop()
446
399
 
447
400
  assert payload["resolved"] is True
448
- assert payload["codex_resume"]["status"] == "sent"
449
- assert payload["codex_resume"]["reason"] == "headless_resume_started"
450
- assert payload["codex_resume"]["strategy"] == "codex-headless-exec"
451
- assert len(launched) == 1
452
- assert launched[0]["cwd"] == workspace
453
- assert launched[0]["command"][:5] == ["/usr/bin/codex", "exec", "resume", "--json", "--skip-git-repo-check"]
454
- assert "pretool-session-1" in launched[0]["command"]
401
+ assert payload["codex_resume"]["status"] == "failed"
402
+ assert payload["codex_resume"]["reason"] == "socket_not_available"
403
+ assert payload["codex_resume"]["strategy"] == "codex-app-server-thread"
455
404
 
456
405
 
457
406
  def test_codex_deferred_live_hook_resume_retry_reports_missing_chat_channel(
458
407
  tmp_path: Path,
459
- monkeypatch: pytest.MonkeyPatch,
460
408
  ) -> None:
461
- monkeypatch.setattr(codex_app_server_module.shutil, "which", lambda _command: None)
462
-
463
409
  store = GuardStore(tmp_path / "guard-home")
464
410
  store.add_approval_request(_request("req-live-retry"), "2026-05-19T10:00:00+00:00")
465
411
  missing_socket = tmp_path / "missing-codex.sock"
@@ -493,10 +439,10 @@ def test_codex_deferred_live_hook_resume_retry_reports_missing_chat_channel(
493
439
  daemon.stop()
494
440
 
495
441
  assert approved["codex_resume"]["status"] == "pending"
496
- assert retried["status"] == "skipped"
497
- assert retried["reason"] == "workspace_not_available"
498
- assert retried["strategy"] == "codex-headless-exec"
499
- assert "Codex chat" in retried["message"]
442
+ assert retried["status"] == "failed"
443
+ assert retried["reason"] == "socket_not_available"
444
+ assert retried["strategy"] == "codex-app-server-thread"
445
+ assert "original chat" in retried["message"]
500
446
 
501
447
 
502
448
  def test_request_resume_status_endpoint_returns_persisted_result(tmp_path: Path) -> None:
@@ -629,7 +575,7 @@ def test_request_resume_retry_endpoint_keeps_same_thread_failure_after_socket_mi
629
575
  "/v1/requests/req-retry/approve",
630
576
  {"scope": "artifact", "reason": "reviewed"},
631
577
  )
632
- assert initial["codex_resume"]["reason"] == "codex_home_not_available"
578
+ assert initial["codex_resume"]["reason"] == "socket_not_available"
633
579
 
634
580
  retried = _post_json(
635
581
  daemon.port,
@@ -645,11 +591,11 @@ def test_request_resume_retry_endpoint_keeps_same_thread_failure_after_socket_mi
645
591
  finally:
646
592
  daemon.stop()
647
593
 
648
- assert retried["status"] == "skipped"
649
- assert retried["strategy"] == "codex-headless-exec"
594
+ assert retried["status"] == "failed"
595
+ assert retried["strategy"] == "codex-app-server-thread"
650
596
  assert retried["attempt_count"] == 2
651
597
  assert status_code == 200
652
- assert current["status"] == "skipped"
598
+ assert current["status"] == "failed"
653
599
 
654
600
 
655
601
  def test_request_resume_retry_is_idempotent_after_success(
@@ -698,26 +644,9 @@ def test_request_resume_retry_is_idempotent_after_success(
698
644
  assert send_calls == 1
699
645
 
700
646
 
701
- def test_codex_approve_falls_back_to_exec_resume_when_socket_binding_is_missing(
647
+ def test_codex_approve_fails_without_app_server_socket_and_never_starts_exec_resume(
702
648
  tmp_path: Path,
703
- monkeypatch: pytest.MonkeyPatch,
704
649
  ) -> None:
705
- launched: list[list[str]] = []
706
-
707
- class _FakeProcess:
708
- pid = 6789
709
-
710
- def _fake_popen(command, **_kwargs):
711
- launched.append(command)
712
- return _FakeProcess()
713
-
714
- monkeypatch.setattr(
715
- codex_app_server_module.shutil,
716
- "which",
717
- lambda command: "/usr/local/bin/codex" if command == "codex" else None,
718
- )
719
- monkeypatch.setattr(codex_app_server_module.subprocess, "Popen", _fake_popen)
720
-
721
650
  store = GuardStore(tmp_path / "guard-home")
722
651
  store.add_approval_request(_request("req-exec"), "2026-05-19T10:00:00+00:00")
723
652
  missing_socket = tmp_path / "missing-codex.sock"
@@ -747,13 +676,10 @@ def test_codex_approve_falls_back_to_exec_resume_when_socket_binding_is_missing(
747
676
  finally:
748
677
  daemon.stop()
749
678
 
750
- assert payload["codex_resume"]["status"] == "sent"
751
- assert payload["codex_resume"]["reason"] == "headless_resume_started"
752
- assert payload["codex_resume"]["strategy"] == "codex-headless-exec"
753
- assert "background" in payload["codex_resume"]["message"]
754
- assert "open Codex App chat" in payload["codex_resume"]["message"]
755
- assert launched[0][:5] == ["/usr/local/bin/codex", "exec", "resume", "--json", "--skip-git-repo-check"]
756
- assert "--" in launched[0]
679
+ assert payload["codex_resume"]["status"] == "failed"
680
+ assert payload["codex_resume"]["reason"] == "socket_not_available"
681
+ assert payload["codex_resume"]["strategy"] == "codex-app-server-thread"
682
+ assert "original chat" in payload["codex_resume"]["message"]
757
683
 
758
684
 
759
685
  def test_codex_approve_uses_default_app_server_when_hook_omits_socket(
@@ -807,18 +733,7 @@ def test_codex_approve_uses_default_app_server_when_hook_omits_socket(
807
733
 
808
734
  def test_codex_approve_returns_failed_resume_when_app_server_socket_missing(
809
735
  tmp_path: Path,
810
- monkeypatch: pytest.MonkeyPatch,
811
736
  ) -> None:
812
- def _fake_popen(*_args, **_kwargs):
813
- raise OSError("spawn failed")
814
-
815
- monkeypatch.setattr(
816
- codex_app_server_module.shutil,
817
- "which",
818
- lambda command: "/usr/local/bin/codex" if command == "codex" else None,
819
- )
820
- monkeypatch.setattr(codex_app_server_module.subprocess, "Popen", _fake_popen)
821
-
822
737
  store = GuardStore(tmp_path / "guard-home")
823
738
  store.add_approval_request(_request("req-oserror"), "2026-05-19T10:00:00+00:00")
824
739
  missing_socket = tmp_path / "missing-codex.sock"
@@ -847,8 +762,8 @@ def test_codex_approve_returns_failed_resume_when_app_server_socket_missing(
847
762
 
848
763
  assert payload["resolved"] is True
849
764
  assert payload["codex_resume"]["status"] == "failed"
850
- assert payload["codex_resume"]["reason"] == "headless_resume_launch_failed"
851
- assert "spawn failed" in payload["codex_resume"]["last_error"]
765
+ assert payload["codex_resume"]["reason"] == "socket_not_available"
766
+ assert payload["codex_resume"]["strategy"] == "codex-app-server-thread"
852
767
 
853
768
 
854
769
  def test_codex_approve_returns_app_server_failure_after_transport_error_reason(