plugin-scanner 2.0.141__tar.gz → 2.0.143__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.
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/PKG-INFO +1 -1
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/guard-types.ts +1 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/settings-workspace.tsx +60 -2
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/docs/guard/release-notes.md +19 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/pyproject.toml +1 -1
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/pyproject.toml.bak +1 -1
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/approvals.py +2 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/daemon/static/assets/guard-dashboard.js +37 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/daemon/static/assets/index.css +5 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/store.py +13 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/version.py +1 -1
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_daemon_perf.py +116 -0
- plugin_scanner-2.0.143/tests/test_guard_harness_smoke.py +351 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/.clusterfuzzlite/Dockerfile +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/.clusterfuzzlite/build.sh +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/.clusterfuzzlite/project.yaml +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/.clusterfuzzlite/requirements-atheris.txt +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/.dockerignore +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/.github/CODEOWNERS +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/.github/dependabot.yml +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/.github/workflows/ci.yml +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/.github/workflows/codeql.yml +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/.github/workflows/dependabot-uv-lock.yml +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/.github/workflows/fuzz.yml +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/.github/workflows/harness-smoke.yml +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/.github/workflows/publish.yml +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/.github/workflows/scorecard.yml +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/.gitignore +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/.pre-commit-hooks.yaml +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/CONTRIBUTING.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/Dockerfile +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/LICENSE +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/README.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/SECURITY.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/index.html +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/package.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/pnpm-lock.yaml +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/public/apple-touch-icon.png +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/public/brand/Logo_Icon_Dark.png +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/public/brand/Logo_Whole.png +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/public/favicon-16x16.png +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/public/favicon-32x32.png +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/public/favicon.ico +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/app.tsx +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/approval-center-layout.test.ts +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/approval-center-layout.tsx +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/approval-center-primitives.tsx +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/approval-center-review-cards.tsx +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/approval-center-utils.ts +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/data-flow-evidence-card.tsx +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/fleet-workspace.tsx +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/guard-api.test.ts +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/guard-api.ts +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/guard-demo.ts +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/main.tsx +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/receipts-workspace.test.ts +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/receipts-workspace.tsx +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/risk-signal-cards.test.ts +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/risk-signal-cards.tsx +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/runtime-overview.test.ts +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/runtime-overview.tsx +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/settings-workspace.test.ts +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/styles.css +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/src/vite-env.d.ts +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/tsconfig.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/dashboard/vite.config.ts +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/docker-requirements.txt +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/docs/guard/approval-audit.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/docs/guard/architecture.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/docs/guard/get-started.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/docs/guard/harness-support.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/docs/guard/local-vs-cloud.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/docs/guard/release-checklist.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/docs/guard/smoke-tests.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/docs/guard/testing-matrix.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/docs/trust/mcp-trust-draft.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/docs/trust/plugin-trust-draft.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/docs/trust/skill-trust-local.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/fuzzers/manifest_fuzzer.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/requirements.txt +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/schemas/plugin-quality.v1.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/schemas/scan-result.v1.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/schemas/verify-result.v1.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/__init__.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/action_runner.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/argparse_utils.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/checks/__init__.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/checks/best_practices.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/checks/claude.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/checks/code_quality.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/checks/ecosystem_common.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/checks/gemini.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/checks/manifest.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/checks/manifest_support.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/checks/marketplace.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/checks/mcp_security.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/checks/opencode.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/checks/operational_security.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/checks/security.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/checks/skill_security.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/cli.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/cli_ui.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/config.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/ecosystems/__init__.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/ecosystems/base.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/ecosystems/claude.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/ecosystems/codex.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/ecosystems/detect.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/ecosystems/gemini.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/ecosystems/opencode.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/ecosystems/registry.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/ecosystems/types.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/github_reporting.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/__init__.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/access_graph_events.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/adapters/__init__.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/adapters/antigravity.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/adapters/base.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/adapters/claude_code.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/adapters/cloud_identity.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/adapters/codex.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/adapters/contracts.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/adapters/copilot.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/adapters/cursor.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/adapters/gemini.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/adapters/hermes.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/adapters/mcp_servers.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/adapters/openclaw.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/adapters/openclaw_config.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/adapters/openclaw_support.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/adapters/opencode.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/adapters/opencode_artifacts.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/advisory_model.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/bridge/__init__.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/capabilities.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/cli/__init__.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/cli/approval_commands.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/cli/bootstrap.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/cli/commands.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/cli/connect_flow.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/cli/install_commands.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/cli/product.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/cli/prompt.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/cli/render.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/cli/update_commands.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/codex_config.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/config.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/consumer/__init__.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/consumer/service.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/daemon/__init__.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/daemon/client.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/daemon/manager.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/daemon/server.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/daemon/static/apple-touch-icon.png +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Icon_Dark.png +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Whole.png +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/daemon/static/favicon-16x16.png +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/daemon/static/favicon-32x32.png +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/daemon/static/favicon.ico +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/daemon/static/index.html +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/edge_events.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/incident.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/launcher.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/mcp_tool_calls.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/models.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/policy/__init__.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/policy/engine.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/protect.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/proxy/__init__.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/proxy/remote.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/proxy/runtime_mcp.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/proxy/stdio.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/receipts/__init__.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/receipts/manager.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/redaction.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/risk.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/__init__.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/action_identity.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/actions.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/advisory_escalation.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/advisory_matchers.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/data_flow.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/data_flow_rules.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/data_flow_variables.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/decisions.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/detectors.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/mcp_protection.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/prompt_injection.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/runner.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/safe_decode.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/sandbox.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/secret_file_requests.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/secret_sensitivity.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/secret_sources.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/shell_commands.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/signals.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/skill_protection.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/supply_chain.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/surface_server.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/temp_files.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/runtime/threat_intel.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/schemas/__init__.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/schemas/consumer_mode.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/schemas/guard_event_v1.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/schemas/surface_server.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/shims.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/store_approvals.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/store_connect.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/store_evidence.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/store_threat_intel.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/types.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/integrations/__init__.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/integrations/cisco_mcp_scanner.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/integrations/cisco_skill_scanner.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/lint_fixes.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/marketplace_support.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/models.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/path_support.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/policy.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/quality_artifact.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/repo_detect.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/reporting.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/rules/__init__.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/rules/registry.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/rules/specs.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/scanner.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/submission.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/suppressions.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/trust_domain_scoring.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/trust_helpers.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/trust_mcp_scoring.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/trust_models.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/trust_plugin_scoring.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/trust_scoring.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/trust_skill_scoring.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/trust_specs.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/verification.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/__init__.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/conftest.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/__init__.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/bad-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/bad-plugin/.mcp.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/bad-plugin/secrets.js +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/claude-plugin-good/.claude-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/claude-plugin-good/LICENSE +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/claude-plugin-good/README.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/claude-plugin-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/claude-plugin-good/hooks/hooks.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/claude-plugin-good/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/code-quality-bad/evil.js +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/code-quality-bad/inject.js +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/gemini-extension-good/GEMINI.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/gemini-extension-good/LICENSE +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/gemini-extension-good/README.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/gemini-extension-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/gemini-extension-good/commands/hello.toml +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/gemini-extension-good/gemini-extension.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/good-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/good-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/good-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/good-plugin/README.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/good-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/good-plugin/assets/icon.svg +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/good-plugin/assets/logo.svg +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/good-plugin/assets/screenshot.svg +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/good-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-codex-malicious-mcp/.codex/config.toml +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-red-team/README.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-red-team/benign-docs-fake-token.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-red-team/benign-health-endpoint.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-red-team/benign-nvmrc-fake-creds.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-red-team/benign-source-search.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-red-team/canary-exfil-encoded.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-red-team/canary-exfil.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-red-team/expected-decisions.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-red-team/malicious-dockerfile.txt +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-red-team/malicious-encoded-shell-exfil.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-red-team/malicious-github-action.yml +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-red-team/malicious-mcp-delete.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-red-team/malicious-mcp-secret-read.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-red-team/malicious-mcp-skill-exfil.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-red-team/malicious-npm-postinstall.js +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-red-team/malicious-prompt-env-read.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-red-team/malicious-prompt-guard-bypass.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-red-team/malicious-prompt-npmrc-read.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-red-team/malicious-python-setup.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/guard-red-team/smoke-evidence-template.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/hermes-plugin-evil/config.yaml +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/hermes-plugin-evil/mcp_servers.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/hermes-plugin-evil/skills/security/malicious/SKILL.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/SKILL.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/references/api-setup.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/scripts/deploy.sh +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/hermes-plugin-evil/skills/utils/benign/SKILL.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/malformed-json/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/malicious-skill-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/malicious-skill-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/malicious-skill-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/malicious-skill-plugin/README.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/malicious-skill-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/malicious-skill-plugin/skills/leaky-skill/SKILL.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/mcp-canary-server.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/minimal-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/missing-fields/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/mit-license/LICENSE +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/multi-ecosystem-repo/codex-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/multi-ecosystem-repo/codex-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/multi-ecosystem-repo/codex-plugin/README.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/multi-ecosystem-repo/codex-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/multi-ecosystem-repo/gemini-ext/README.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/multi-ecosystem-repo/gemini-ext/gemini-extension.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/multi-plugin-repo/.agents/plugins/marketplace.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/README.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/no-version/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/opencode-good/.opencode/commands/hello.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/opencode-good/.opencode/plugins/example.ts +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/opencode-good/LICENSE +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/opencode-good/README.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/opencode-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/opencode-good/opencode.jsonc +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/skills-missing-dir/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/skills-no-frontmatter/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/skills-no-frontmatter/skills/bad-skill/SKILL.md +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/supply-chain/benign-npm-package.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/supply-chain/benign-pnpm-package.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/supply-chain/benign-pyproject.toml +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/supply-chain/malicious-Dockerfile +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/supply-chain/malicious-action.yml +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/supply-chain/malicious-npm-package.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/supply-chain/malicious-setup.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/with-marketplace/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/with-marketplace/marketplace-broken.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/fixtures/with-marketplace/marketplace.json +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test-trust-scoring.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test-trust-specs.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_action_runner.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_best_practices.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_cisco_install_surfaces.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_cli.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_code_quality.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_config.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_coverage_remaining.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_ecosystems.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_edge_cases.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_final_coverage.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_access_graph.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_action_identity.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_advisory_escalation.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_approval_continuity.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_approval_copy_commands.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_approval_store_dedup.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_approval_store_scale.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_approvals.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_bootstrap.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_canary_fixtures.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_capabilities.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_claude_adapter.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_cli.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_cloud_local_sync.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_codex_e2e.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_codex_install.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_codex_proxy.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_config_paths.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_connect_flow.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_consumer_mode.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_copilot_adapter.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_copilot_proxy.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_daemon_manager.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_daemon_repair_perf.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_data_flow.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_decision_propagation.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_event_schema_v1.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_events.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_evidence_store.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_harness_contracts.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_launch_env.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_mcp_protection.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_opencode_proxy.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_policy_dedup.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_product_flow.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_prompt_injection.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_protect.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_red_team.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_render.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_resolution_copy.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_risk.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_runtime.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_runtime_action_harnesses.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_runtime_actions.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_runtime_decisions.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_runtime_detectors.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_runtime_signals.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_safe_decode.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_sandbox.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_skill_protection.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_store_migrations.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_supply_chain.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_surface_server.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_threat_intel.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_verdicts.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_guard_web_recovery.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_hermes_adapter.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_integration.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_lint_fixes.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_live_cisco_smoke.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_manifest.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_marketplace.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_mcp_security.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_openclaw_adapter.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_operational_security.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_policy.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_quality_artifact.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_rule_registry.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_scanner.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_schema_contracts.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_security.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_security_ops.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_skill_security.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_submission.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_trust_scoring.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_trust_specs.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_verification.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/tests/test_versioning.py +0 -0
- {plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: plugin-scanner
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.143
|
|
4
4
|
Summary: Lint, verify, and gate plugin ecosystems for maintainers, CI, and publish workflows.
|
|
5
5
|
Project-URL: Homepage, https://github.com/hashgraph-online/ai-plugin-scanner
|
|
6
6
|
Project-URL: Repository, https://github.com/hashgraph-online/ai-plugin-scanner
|
|
@@ -171,6 +171,7 @@ export type GuardRuntimeSnapshot = {
|
|
|
171
171
|
headline_state: GuardHeadlineState;
|
|
172
172
|
headline_label: string;
|
|
173
173
|
headline_detail: string;
|
|
174
|
+
thread_count?: number;
|
|
174
175
|
sync_configured: boolean;
|
|
175
176
|
cloud_state: "local_only" | "paired_waiting" | "paired_active";
|
|
176
177
|
cloud_state_label: string;
|
|
@@ -13,9 +13,9 @@ import {
|
|
|
13
13
|
SectionLabel,
|
|
14
14
|
Tag
|
|
15
15
|
} from "./approval-center-primitives";
|
|
16
|
-
import { clearEvidence, exportDiagnostics, fetchSettings, updateSettings, clearPolicy, repairApprovalCenter } from "./guard-api";
|
|
16
|
+
import { clearEvidence, exportDiagnostics, fetchRuntimeSnapshot, fetchSettings, updateSettings, clearPolicy, repairApprovalCenter } from "./guard-api";
|
|
17
17
|
import { resolveProtectionLevelCopy } from "./runtime-overview";
|
|
18
|
-
import type { GuardSettings, GuardSettingsPayload } from "./guard-types";
|
|
18
|
+
import type { GuardRuntimeSnapshot, GuardSettings, GuardSettingsPayload } from "./guard-types";
|
|
19
19
|
|
|
20
20
|
type SettingsState =
|
|
21
21
|
| { kind: "loading" }
|
|
@@ -165,6 +165,7 @@ export function SettingsWorkspace() {
|
|
|
165
165
|
const [exporting, setExporting] = useState(false);
|
|
166
166
|
const [repairing, setRepairing] = useState(false);
|
|
167
167
|
const [actionMessage, setActionMessage] = useState<string | null>(null);
|
|
168
|
+
const [perfSnapshot, setPerfSnapshot] = useState<GuardRuntimeSnapshot | null>(null);
|
|
168
169
|
const saveSuccessTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
169
170
|
|
|
170
171
|
useEffect(() => {
|
|
@@ -190,6 +191,20 @@ export function SettingsWorkspace() {
|
|
|
190
191
|
};
|
|
191
192
|
}, []);
|
|
192
193
|
|
|
194
|
+
useEffect(() => {
|
|
195
|
+
let cancelled = false;
|
|
196
|
+
fetchRuntimeSnapshot()
|
|
197
|
+
.then((snapshot) => {
|
|
198
|
+
if (!cancelled) setPerfSnapshot(snapshot);
|
|
199
|
+
})
|
|
200
|
+
.catch((error: unknown) => {
|
|
201
|
+
console.error("Failed to fetch runtime snapshot:", error);
|
|
202
|
+
});
|
|
203
|
+
return () => {
|
|
204
|
+
cancelled = true;
|
|
205
|
+
};
|
|
206
|
+
}, []);
|
|
207
|
+
|
|
193
208
|
useEffect(() => {
|
|
194
209
|
return () => {
|
|
195
210
|
if (saveSuccessTimerRef.current !== null) {
|
|
@@ -610,6 +625,14 @@ export function SettingsWorkspace() {
|
|
|
610
625
|
<SettingToggle label="Billing features" checked={draft.billing} onChange={handleBooleanChange("billing")} />
|
|
611
626
|
</div>
|
|
612
627
|
</div>
|
|
628
|
+
{perfSnapshot !== null ? (
|
|
629
|
+
<div className="rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm">
|
|
630
|
+
<SectionLabel>Runtime diagnostics</SectionLabel>
|
|
631
|
+
<div className="mt-4">
|
|
632
|
+
<DiagnosticsPerfCard snapshot={perfSnapshot} />
|
|
633
|
+
</div>
|
|
634
|
+
</div>
|
|
635
|
+
) : null}
|
|
613
636
|
<div className="rounded-[1.75rem] border border-red-100 bg-red-50/50 p-5 shadow-sm">
|
|
614
637
|
<SectionLabel>Data management</SectionLabel>
|
|
615
638
|
<div className="mt-4 space-y-3">
|
|
@@ -682,6 +705,41 @@ export function SettingsWorkspace() {
|
|
|
682
705
|
);
|
|
683
706
|
}
|
|
684
707
|
|
|
708
|
+
function DiagnosticsPerfCard(props: { snapshot: GuardRuntimeSnapshot }) {
|
|
709
|
+
const { snapshot } = props;
|
|
710
|
+
const threadCount = snapshot.thread_count;
|
|
711
|
+
const daemonPort = snapshot.runtime_state?.daemon_port ?? null;
|
|
712
|
+
const startedAt = snapshot.runtime_state?.started_at ?? null;
|
|
713
|
+
return (
|
|
714
|
+
<div>
|
|
715
|
+
<h3 className="text-sm font-semibold text-brand-dark">Runtime performance</h3>
|
|
716
|
+
<p className="mt-1 text-xs leading-relaxed text-muted-foreground">
|
|
717
|
+
Live process metrics for this Guard daemon session.
|
|
718
|
+
</p>
|
|
719
|
+
<dl className="mt-3 grid grid-cols-2 gap-2">
|
|
720
|
+
{threadCount !== undefined ? (
|
|
721
|
+
<PerfMetric label="Total interpreter threads" value={String(threadCount)} />
|
|
722
|
+
) : null}
|
|
723
|
+
{daemonPort !== null ? (
|
|
724
|
+
<PerfMetric label="Daemon port" value={String(daemonPort)} />
|
|
725
|
+
) : null}
|
|
726
|
+
{startedAt !== null ? (
|
|
727
|
+
<PerfMetric label="Started" value={new Date(startedAt).toLocaleTimeString()} />
|
|
728
|
+
) : null}
|
|
729
|
+
</dl>
|
|
730
|
+
</div>
|
|
731
|
+
);
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
function PerfMetric(props: { label: string; value: string }) {
|
|
735
|
+
return (
|
|
736
|
+
<div className="rounded-xl bg-surface-1 px-3 py-2">
|
|
737
|
+
<dt className="text-[10px] font-semibold uppercase tracking-[0.14em] text-muted-foreground">{props.label}</dt>
|
|
738
|
+
<dd className="mt-0.5 font-mono text-sm font-semibold text-brand-dark">{props.value}</dd>
|
|
739
|
+
</div>
|
|
740
|
+
);
|
|
741
|
+
}
|
|
742
|
+
|
|
685
743
|
function SettingSelect(props: {
|
|
686
744
|
label: string;
|
|
687
745
|
value: string;
|
|
@@ -35,3 +35,22 @@ profile. Custom overrides survive a preset switch unless explicitly cleared.
|
|
|
35
35
|
|
|
36
36
|
The approval center and evidence log now paginate at 50 items per page. Large workspaces
|
|
37
37
|
with thousands of receipts will no longer cause the dashboard to stall on load.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Release checklist (T608)
|
|
42
|
+
|
|
43
|
+
Before tagging a release, complete the following items for every harness integration
|
|
44
|
+
path that was touched in this release cycle.
|
|
45
|
+
|
|
46
|
+
1. Run `pytest -m "not slow" -q` — all non-`slow` tests must pass.
|
|
47
|
+
2. Run `ruff check src/ tests/` — zero violations.
|
|
48
|
+
3. Run `cd dashboard && pnpm test && pnpm build` — dashboard bundle updated.
|
|
49
|
+
4. Build wheel: `uv build` — wheel must build without errors.
|
|
50
|
+
5. Install in temp venv: `pip install dist/*.whl && hol-guard doctor` — doctor shows no fatal errors.
|
|
51
|
+
6. Fill in `tests/fixtures/guard-red-team/smoke-evidence-template.json` for each harness
|
|
52
|
+
integration touched. Mark each test entry `pass`, `fail`, or `skip` with notes.
|
|
53
|
+
7. Confirm no `.env` file was read during the release build.
|
|
54
|
+
8. Confirm no real secrets appear in committed fixtures or tests.
|
|
55
|
+
9. Confirm no full local paths appear in any committed file.
|
|
56
|
+
10. Merge only after all PR review threads are resolved.
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "plugin-scanner"
|
|
7
|
-
version = "2.0.
|
|
7
|
+
version = "2.0.143"
|
|
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.
|
|
7
|
+
version = "2.0.143"
|
|
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"
|
{plugin_scanner-2.0.141 → plugin_scanner-2.0.143}/src/codex_plugin_scanner/guard/approvals.py
RENAMED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import threading
|
|
5
6
|
import time
|
|
6
7
|
import uuid
|
|
7
8
|
from collections.abc import Mapping
|
|
@@ -215,6 +216,7 @@ def build_runtime_snapshot(
|
|
|
215
216
|
"headline_state": headline_state,
|
|
216
217
|
"headline_label": _runtime_headline_label(headline_state),
|
|
217
218
|
"headline_detail": _runtime_headline_detail(headline_state),
|
|
219
|
+
"thread_count": threading.active_count(),
|
|
218
220
|
"items": pending_requests,
|
|
219
221
|
"latest_receipts": latest_receipts,
|
|
220
222
|
"managed_installs": store.list_managed_installs(),
|
|
@@ -15562,6 +15562,7 @@ function SettingsWorkspace() {
|
|
|
15562
15562
|
const [exporting, setExporting] = reactExports.useState(false);
|
|
15563
15563
|
const [repairing, setRepairing] = reactExports.useState(false);
|
|
15564
15564
|
const [actionMessage, setActionMessage] = reactExports.useState(null);
|
|
15565
|
+
const [perfSnapshot, setPerfSnapshot] = reactExports.useState(null);
|
|
15565
15566
|
const saveSuccessTimerRef = reactExports.useRef(null);
|
|
15566
15567
|
reactExports.useEffect(() => {
|
|
15567
15568
|
let cancelled = false;
|
|
@@ -15583,6 +15584,17 @@ function SettingsWorkspace() {
|
|
|
15583
15584
|
cancelled = true;
|
|
15584
15585
|
};
|
|
15585
15586
|
}, []);
|
|
15587
|
+
reactExports.useEffect(() => {
|
|
15588
|
+
let cancelled = false;
|
|
15589
|
+
fetchRuntimeSnapshot().then((snapshot) => {
|
|
15590
|
+
if (!cancelled) setPerfSnapshot(snapshot);
|
|
15591
|
+
}).catch((error) => {
|
|
15592
|
+
console.error("Failed to fetch runtime snapshot:", error);
|
|
15593
|
+
});
|
|
15594
|
+
return () => {
|
|
15595
|
+
cancelled = true;
|
|
15596
|
+
};
|
|
15597
|
+
}, []);
|
|
15586
15598
|
reactExports.useEffect(() => {
|
|
15587
15599
|
return () => {
|
|
15588
15600
|
if (saveSuccessTimerRef.current !== null) {
|
|
@@ -15942,6 +15954,10 @@ function SettingsWorkspace() {
|
|
|
15942
15954
|
/* @__PURE__ */ jsxRuntimeExports.jsx(SettingToggle, { label: "Billing features", checked: draft.billing, onChange: handleBooleanChange("billing") })
|
|
15943
15955
|
] })
|
|
15944
15956
|
] }),
|
|
15957
|
+
perfSnapshot !== null ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm", children: [
|
|
15958
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SectionLabel, { children: "Runtime diagnostics" }),
|
|
15959
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx(DiagnosticsPerfCard, { snapshot: perfSnapshot }) })
|
|
15960
|
+
] }) : null,
|
|
15945
15961
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-[1.75rem] border border-red-100 bg-red-50/50 p-5 shadow-sm", children: [
|
|
15946
15962
|
/* @__PURE__ */ jsxRuntimeExports.jsx(SectionLabel, { children: "Data management" }),
|
|
15947
15963
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-4 space-y-3", children: [
|
|
@@ -15976,6 +15992,27 @@ function SettingsWorkspace() {
|
|
|
15976
15992
|
] })
|
|
15977
15993
|
] });
|
|
15978
15994
|
}
|
|
15995
|
+
function DiagnosticsPerfCard(props) {
|
|
15996
|
+
const { snapshot } = props;
|
|
15997
|
+
const threadCount = snapshot.thread_count;
|
|
15998
|
+
const daemonPort = snapshot.runtime_state?.daemon_port ?? null;
|
|
15999
|
+
const startedAt = snapshot.runtime_state?.started_at ?? null;
|
|
16000
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
|
|
16001
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-semibold text-brand-dark", children: "Runtime performance" }),
|
|
16002
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-1 text-xs leading-relaxed text-muted-foreground", children: "Live process metrics for this Guard daemon session." }),
|
|
16003
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("dl", { className: "mt-3 grid grid-cols-2 gap-2", children: [
|
|
16004
|
+
threadCount !== void 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx(PerfMetric, { label: "Total interpreter threads", value: String(threadCount) }) : null,
|
|
16005
|
+
daemonPort !== null ? /* @__PURE__ */ jsxRuntimeExports.jsx(PerfMetric, { label: "Daemon port", value: String(daemonPort) }) : null,
|
|
16006
|
+
startedAt !== null ? /* @__PURE__ */ jsxRuntimeExports.jsx(PerfMetric, { label: "Started", value: new Date(startedAt).toLocaleTimeString() }) : null
|
|
16007
|
+
] })
|
|
16008
|
+
] });
|
|
16009
|
+
}
|
|
16010
|
+
function PerfMetric(props) {
|
|
16011
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-xl bg-surface-1 px-3 py-2", children: [
|
|
16012
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("dt", { className: "text-[10px] font-semibold uppercase tracking-[0.14em] text-muted-foreground", children: props.label }),
|
|
16013
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("dd", { className: "mt-0.5 font-mono text-sm font-semibold text-brand-dark", children: props.value })
|
|
16014
|
+
] });
|
|
16015
|
+
}
|
|
15979
16016
|
function SettingSelect(props) {
|
|
15980
16017
|
return /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "block", children: [
|
|
15981
16018
|
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-[11px] font-semibold uppercase tracking-[0.18em] text-muted-foreground", children: props.label }),
|
|
@@ -4,9 +4,11 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import base64
|
|
6
6
|
import json
|
|
7
|
+
import logging
|
|
7
8
|
import os
|
|
8
9
|
import sqlite3
|
|
9
10
|
import subprocess
|
|
11
|
+
import time
|
|
10
12
|
from collections.abc import Iterator
|
|
11
13
|
from contextlib import contextmanager
|
|
12
14
|
from datetime import datetime, timedelta, timezone
|
|
@@ -353,6 +355,10 @@ def _build_secret_store(guard_home: Path) -> SecretStore:
|
|
|
353
355
|
return fallback_store
|
|
354
356
|
|
|
355
357
|
|
|
358
|
+
_SLOW_QUERY_THRESHOLD_MS: int = 200
|
|
359
|
+
_store_logger = logging.getLogger(__name__)
|
|
360
|
+
|
|
361
|
+
|
|
356
362
|
class GuardStore:
|
|
357
363
|
"""Local SQLite store for Guard state."""
|
|
358
364
|
|
|
@@ -403,11 +409,18 @@ class GuardStore:
|
|
|
403
409
|
def _connect(self) -> Iterator[sqlite3.Connection]:
|
|
404
410
|
connection = sqlite3.connect(self.path)
|
|
405
411
|
connection.row_factory = sqlite3.Row
|
|
412
|
+
start = time.monotonic()
|
|
406
413
|
try:
|
|
407
414
|
yield connection
|
|
408
415
|
connection.commit()
|
|
409
416
|
finally:
|
|
410
417
|
connection.close()
|
|
418
|
+
elapsed_ms = (time.monotonic() - start) * 1000
|
|
419
|
+
if elapsed_ms >= _SLOW_QUERY_THRESHOLD_MS:
|
|
420
|
+
_store_logger.warning(
|
|
421
|
+
"Guard store slow transaction (%.0fms); consider indexing hot query paths.",
|
|
422
|
+
elapsed_ms,
|
|
423
|
+
)
|
|
411
424
|
|
|
412
425
|
def _initialize(self) -> None:
|
|
413
426
|
statements = (
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import threading
|
|
6
|
+
import time
|
|
5
7
|
from pathlib import Path
|
|
6
8
|
|
|
7
9
|
import pytest
|
|
@@ -176,3 +178,117 @@ class TestDoctorPerfPayload:
|
|
|
176
178
|
for item in perf:
|
|
177
179
|
expected_slow = int(item["elapsed_ms"]) >= _SLOW_DETECTOR_THRESHOLD_MS
|
|
178
180
|
assert item["slow"] == expected_slow
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
class TestProcessCountBound:
|
|
184
|
+
"""T620 — 100 safe hook evaluations must not spawn persistent threads."""
|
|
185
|
+
|
|
186
|
+
@pytest.mark.slow
|
|
187
|
+
def test_100_harness_start_evaluations_do_not_spawn_threads(self, tmp_path: Path) -> None:
|
|
188
|
+
action = _make_harness_start_action()
|
|
189
|
+
context = _make_detector_context(tmp_path)
|
|
190
|
+
registry = _get_default_detector_registry()
|
|
191
|
+
baseline_threads = threading.active_count()
|
|
192
|
+
for _ in range(100):
|
|
193
|
+
registry.run(action, context, timeout_ms=500)
|
|
194
|
+
after_threads = threading.active_count()
|
|
195
|
+
assert after_threads - baseline_threads <= 5, (
|
|
196
|
+
f"Thread count grew by {after_threads - baseline_threads} after 100 evaluations; "
|
|
197
|
+
"detectors must not leak persistent threads."
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
def test_100_harness_start_evaluations_complete_without_error(self, tmp_path: Path) -> None:
|
|
201
|
+
action = _make_harness_start_action()
|
|
202
|
+
context = _make_detector_context(tmp_path)
|
|
203
|
+
registry = _get_default_detector_registry()
|
|
204
|
+
results = [registry.run(action, context, timeout_ms=500) for _ in range(100)]
|
|
205
|
+
assert all(isinstance(r, DetectorRunResult) for r in results)
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
@pytest.mark.slow
|
|
209
|
+
class TestCPUBenchmark:
|
|
210
|
+
"""T622 — 100 safe hook evaluations must complete in under 10 seconds."""
|
|
211
|
+
|
|
212
|
+
def test_100_safe_hook_calls_complete_within_budget(self, tmp_path: Path) -> None:
|
|
213
|
+
action = _make_harness_start_action()
|
|
214
|
+
context = _make_detector_context(tmp_path)
|
|
215
|
+
registry = _get_default_detector_registry()
|
|
216
|
+
start = time.monotonic()
|
|
217
|
+
for _ in range(100):
|
|
218
|
+
registry.run(action, context, timeout_ms=500)
|
|
219
|
+
elapsed_s = time.monotonic() - start
|
|
220
|
+
assert elapsed_s < 10.0, f"100 safe hook evaluations took {elapsed_s:.2f}s; budget is 10s."
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
class TestMemoryBenchmark:
|
|
224
|
+
"""T621 — Guard module import stays under 50 MB RSS budget."""
|
|
225
|
+
|
|
226
|
+
def test_guard_config_import_does_not_import_heavy_deps(self) -> None:
|
|
227
|
+
import subprocess
|
|
228
|
+
import sys
|
|
229
|
+
|
|
230
|
+
result = subprocess.run(
|
|
231
|
+
[
|
|
232
|
+
sys.executable,
|
|
233
|
+
"-c",
|
|
234
|
+
(
|
|
235
|
+
"import codex_plugin_scanner.guard.config as _c;"
|
|
236
|
+
" import sys;"
|
|
237
|
+
" heavy = {'matplotlib', 'numpy', 'pandas', 'scipy', 'torch', 'tensorflow'};"
|
|
238
|
+
" leaked = heavy & set(sys.modules);"
|
|
239
|
+
" print(repr(leaked))"
|
|
240
|
+
),
|
|
241
|
+
],
|
|
242
|
+
capture_output=True,
|
|
243
|
+
text=True,
|
|
244
|
+
timeout=30,
|
|
245
|
+
)
|
|
246
|
+
assert result.returncode == 0, f"Subprocess failed: {result.stderr}"
|
|
247
|
+
import ast
|
|
248
|
+
leaked = ast.literal_eval(result.stdout.strip())
|
|
249
|
+
assert not leaked, f"Guard import leaked heavy dependencies: {leaked}"
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
class TestSlowSQLiteTelemetry:
|
|
253
|
+
"""T624 — Slow store transactions emit a warning via the logging module."""
|
|
254
|
+
|
|
255
|
+
def test_slow_query_threshold_is_200ms(self) -> None:
|
|
256
|
+
from codex_plugin_scanner.guard.store import _SLOW_QUERY_THRESHOLD_MS
|
|
257
|
+
|
|
258
|
+
assert _SLOW_QUERY_THRESHOLD_MS == 200
|
|
259
|
+
|
|
260
|
+
def test_fast_transaction_does_not_warn(
|
|
261
|
+
self, tmp_path: Path, caplog: pytest.LogCaptureFixture, monkeypatch: pytest.MonkeyPatch
|
|
262
|
+
) -> None:
|
|
263
|
+
import logging
|
|
264
|
+
|
|
265
|
+
import codex_plugin_scanner.guard.store as store_module
|
|
266
|
+
from codex_plugin_scanner.guard.store import GuardStore
|
|
267
|
+
|
|
268
|
+
monkeypatch.setattr(store_module, "_SLOW_QUERY_THRESHOLD_MS", 10_000)
|
|
269
|
+
store = GuardStore(guard_home=tmp_path / "guard-home")
|
|
270
|
+
with caplog.at_level(logging.WARNING, logger="codex_plugin_scanner.guard.store"):
|
|
271
|
+
_ = store.list_approval_requests()
|
|
272
|
+
slow_warnings = [r for r in caplog.records if "slow transaction" in r.getMessage().lower()]
|
|
273
|
+
assert len(slow_warnings) == 0, "Fast transaction must not emit slow transaction warning"
|
|
274
|
+
|
|
275
|
+
def test_slow_transaction_emits_warning(
|
|
276
|
+
self, tmp_path: Path, caplog: pytest.LogCaptureFixture, monkeypatch: pytest.MonkeyPatch
|
|
277
|
+
) -> None:
|
|
278
|
+
import logging
|
|
279
|
+
|
|
280
|
+
import codex_plugin_scanner.guard.store as store_module
|
|
281
|
+
from codex_plugin_scanner.guard.store import GuardStore
|
|
282
|
+
|
|
283
|
+
monkeypatch.setattr(store_module, "_SLOW_QUERY_THRESHOLD_MS", 0)
|
|
284
|
+
store = GuardStore(guard_home=tmp_path / "guard-home")
|
|
285
|
+
with caplog.at_level(logging.WARNING, logger="codex_plugin_scanner.guard.store"):
|
|
286
|
+
_ = store.list_approval_requests()
|
|
287
|
+
slow_warnings = [r for r in caplog.records if "slow transaction" in r.getMessage().lower()]
|
|
288
|
+
assert len(slow_warnings) > 0, "Slow transaction (threshold=0ms) must emit a slow transaction warning"
|
|
289
|
+
|
|
290
|
+
def test_store_has_slow_query_threshold_constant(self) -> None:
|
|
291
|
+
from codex_plugin_scanner.guard.store import _SLOW_QUERY_THRESHOLD_MS
|
|
292
|
+
|
|
293
|
+
assert isinstance(_SLOW_QUERY_THRESHOLD_MS, int)
|
|
294
|
+
assert _SLOW_QUERY_THRESHOLD_MS > 0
|