agentdebugx 0.5.0__tar.gz → 0.5.2__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.
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/PKG-INFO +1 -1
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/pyproject.toml +1 -1
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/__init__.py +1 -1
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/core/__init__.py +2 -3
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/evidence.py +166 -76
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/rules/packs/core/rules.py +3 -3
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/rules/registry.py +2 -2
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/taxonomy_induction.py +0 -1
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/recover/recovery.py +1 -1
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/hub/backends.py +1 -1
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/ingest/adapters/langgraph.py +1 -1
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/ingest/adapters/openai_agents.py +1 -1
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/inspect/ui/llm_convert.py +1 -1
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/inspect/ui/server.py +0 -24
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/rerun/executors/process_live.py +1 -1
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/taxonomy_manifest.py +12 -3
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/LICENSE +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/README.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/ARCHITECTURE.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/GUI_RCA_COMMANDS.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/TRACE_SCHEMA.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/assets/UI.png +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/assets/logo-dark.svg +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/assets/logo.png +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/assets/logo.svg +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/assets/overview.pdf +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/assets/overview.png +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/assets/stylesheets/extra.css +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/concepts/workflow.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/getting-started/installation.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/getting-started/quickstart.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/guides/diagnose.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/guides/gui-rca.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/guides/ingest.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/guides/local-ui.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/guides/rerun.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/help/build-docs.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/help/troubleshooting.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/index.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/reference/cli.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/reference/diagnostic-report.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/reference/python-api.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/docs/taxonomy_manifest.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/batch/README.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/batch/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/batch/workflow.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/capture/README.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/capture/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/capture/config.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/capture/context.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/capture/contracts.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/capture/filtering.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/capture/hosts/CODEX_SUPPORT.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/capture/hosts/README.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/capture/hosts/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/capture/hosts/base.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/capture/hosts/claude_code.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/capture/hosts/codex.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/capture/hosts/registry.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/capture/identity.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/capture/repository.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/capture/service.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/capture/snapshot.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/cli/README.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/cli/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/cli/__main__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/cli/commands/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/cli/commands/batch.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/cli/commands/capture.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/cli/commands/config.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/cli/commands/diagnose.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/cli/commands/doctor.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/cli/commands/hub.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/cli/commands/ingest.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/cli/commands/integrations.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/cli/commands/rerun.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/cli/commands/run.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/cli/commands/runner.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/cli/commands/serve.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/cli/commands/store.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/cli/commands/ui.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/cli/legacy.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/cli/main.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/core/events.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/core/gui_taxonomy.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/core/llm.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/core/llm_channel.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/core/models.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/core/plugins/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/core/plugins/registry.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/core/plugins/types.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/core/storage.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/core/taxonomy.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/README.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/actions/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/actions/attribution.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/actions/hub/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/actions/hub/backend_base.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/actions/hub/backends.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/actions/hub/bundle.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/actions/hub/scrub.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/actions/integrations/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/actions/integrations/_templates.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/actions/integrations/claude_skill.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/actions/integrations/debug_skill.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/actions/integrations/openhands.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/actions/moe.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/actions/recovery.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/analyzers.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/attribute/README.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/attribute/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/attribute/async_api.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/attribute/attribution.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/attribute/deep_memory.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/attribute/deepdebug.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/attribute/moe.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/attribute/reference.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/attribute/trajdebug.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/attribute/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/attribute/all_at_once.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/attribute/binary_search.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/attribute/counterfactual.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/attribute/deepdebug.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/attribute/heuristic.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/attribute/step_by_step.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/attribute/trajdebug.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/detect/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/detect/heuristic.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/detect/llm_judge.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/detect/perstep.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/detect/stage_a.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/detect/trajdebug.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/recover/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/recover/auto_manual.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/recover/critic.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/recover/deepdebug.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/recover/reflexion.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/recover/saga_rollback.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/component_manifests/recover/self_refine.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/context.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/deep.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/deep_memory.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/README.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/analyzers.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/compression.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/detectors.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/judge.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/perstep.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/rules/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/rules/agenterrorbench.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/rules/base.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/rules/core.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/rules/gui.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/rules/packs/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/rules/packs/agenterrorbench/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/rules/packs/agenterrorbench/manifest.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/rules/packs/agenterrorbench/rules.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/rules/packs/core/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/rules/packs/core/manifest.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/rules/packs/gui/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/rules/packs/gui/manifest.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/rules/packs/gui/rules.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/rules.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/selection.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/trajdebug.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detectors.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/deterministic.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/gui_rca.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/judge.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/judges.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/pipeline.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/profiles/README.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/profiles/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/profiles/deepdebug.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/recover/README.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/recover/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/registry.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/rules/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/rules/agenterrorbench.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/rules/base.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/rules/core.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/rules/gui.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/rules/registry.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/taxonomy_induction.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/__main__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/agent.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/config/debugger.example.json +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/config.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/discuss.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/dispatch.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/eval/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/eval/accuracy.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/evolving/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/evolving/alignment.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/evolving/case_loader.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/evolving/prompts.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/evolving/protocol.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/evolving/runner.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/evolving/state.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/evolving/tools.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/ingester.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/memory/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/memory/annotation_loader.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/memory/distill.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/memory/episode_memory.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/memory/intention.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/memory/lesson_injector.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/memory/lesson_memory.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/memory/semantic_merge.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/openai_adapter.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/output.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/perplexity_adapter.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/pipeline/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/pipeline/classify.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/pipeline/client_factory.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/pipeline/orchestrator.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/pipeline/results.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/pipeline/runtime.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/pipeline/worker.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/prompts.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/prompts_discuss.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/rca.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/scripts/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/scripts/download_input_trajectory.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/tagger.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/taxonomy.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/together_adapter.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/tools/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/tools/lesson_explorer.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/trajectory.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/trajectory_normalizer.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/utils/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/utils/lock.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/utils/logger.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/vis/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/vis/debugger_app.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/gui/vis/generate_assignments.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/hub/README.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/hub/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/hub/backend_base.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/hub/bundle.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/hub/scrub.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/ingest/README.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/ingest/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/ingest/adapters/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/ingest/adapters/base.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/ingest/adapters/crewai.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/ingest/adapters/gaia_odr.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/ingest/adapters/importers.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/ingest/adapters/osworld.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/ingest/adapters/otel.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/ingest/adapters/raw.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/ingest/adapters/trajdebug.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/ingest/core/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/ingest/importers.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/ingest/instrumentation.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/ingest/native_protocol.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/ingest/recorder.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/inspect/README.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/inspect/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/inspect/discussion.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/inspect/traceback.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/inspect/ui/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/inspect/ui/app.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/inspect/ui/assets/robot-avatar.svg +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/inspect/ui/branch_store.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/inspect/ui/discussion_store.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/inspect/ui/manager.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/inspect/ui/mcp_rerun.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/inspect/ui/routes.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/inspect/ui/services.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/inspect/ui/upload.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/inspect/ui/views.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/integrations/README.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/integrations/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/integrations/_templates.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/integrations/agentdebug_skill/SKILL.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/integrations/agentdebug_skill/references/analysis.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/integrations/agentdebug_skill/references/cli_reference.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/integrations/agentdebug_skill/references/formats.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/integrations/agentdebug_skill/references/recovery.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/integrations/agentdebug_skill/references/safety.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/integrations/agentdebug_skill/references/setup.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/integrations/capture_management.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/integrations/claude_skill.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/integrations/codex_skill.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/integrations/debug_skill.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/integrations/management.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/integrations/openhands.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/provenance.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/py.typed +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/rerun/ACTOR_TASK_SPEC.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/rerun/README.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/rerun/RUNNER_SPEC.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/rerun/SIMULATION_SPEC.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/rerun/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/rerun/actor_task.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/rerun/branch.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/rerun/evaluators.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/rerun/executors/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/rerun/executors/base.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/rerun/executors/http_live.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/rerun/executors/llm_continuation.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/rerun/http_service.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/rerun/live_validation.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/rerun/request.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/rerun/workflow.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/runtime/README.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/runtime/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/runtime/events.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/runtime/gui_taxonomy.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/runtime/llm.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/runtime/llm_channel.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/runtime/plugins/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/runtime/plugins/registry.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/runtime/plugins/types.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/runtime/storage.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/schema/README.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/schema/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/schema/models.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/schema/taxonomy.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/workbench/README.md +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/workbench/__init__.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/workbench/models.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/workbench/profiles.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/workbench/registry.py +0 -0
- {agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/workbench/service.py +0 -0
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
"""Core AgentDebugX primitives
|
|
2
|
-
|
|
3
|
-
"""Backward-compatible aggregate import path for schema/runtime APIs."""
|
|
1
|
+
"""Core AgentDebugX primitives: the backward-compatible aggregate import path for the
|
|
2
|
+
schema and runtime APIs."""
|
|
4
3
|
|
|
5
4
|
from agentdebug.runtime.events import DEFAULT_BUS, BusEvent, EventBus, EventSubscription
|
|
6
5
|
from agentdebug.runtime.llm import (
|
|
@@ -39,7 +39,17 @@ from __future__ import annotations
|
|
|
39
39
|
|
|
40
40
|
import re
|
|
41
41
|
from dataclasses import dataclass
|
|
42
|
-
from typing import
|
|
42
|
+
from typing import (
|
|
43
|
+
Any,
|
|
44
|
+
Callable,
|
|
45
|
+
Dict,
|
|
46
|
+
Iterable,
|
|
47
|
+
List,
|
|
48
|
+
Mapping,
|
|
49
|
+
Optional,
|
|
50
|
+
Sequence,
|
|
51
|
+
Tuple,
|
|
52
|
+
)
|
|
43
53
|
|
|
44
54
|
from agentdebug.schema import (
|
|
45
55
|
AgentEvent,
|
|
@@ -341,7 +351,7 @@ def annotate_quote_verification(
|
|
|
341
351
|
return annotated
|
|
342
352
|
|
|
343
353
|
|
|
344
|
-
def quote_verification_summary(findings: Iterable[FailureFinding]) ->
|
|
354
|
+
def quote_verification_summary(findings: Iterable[FailureFinding]) -> Dict[str, int]:
|
|
345
355
|
"""Counts by verification state, for reporting a detector's grounding rate.
|
|
346
356
|
|
|
347
357
|
The ratio of ``verified`` to ``verified + unsupported`` is a measurable
|
|
@@ -384,8 +394,17 @@ def quote_verification_summary(findings: Iterable[FailureFinding]) -> dict:
|
|
|
384
394
|
# of a real event are different defects with different fixes.
|
|
385
395
|
#
|
|
386
396
|
# Nothing below changes what :func:`verify_finding_quotes` accepts. The
|
|
387
|
-
# ``normalized`` rung applies the same normalisation, so a quote that
|
|
388
|
-
# also locates; the extra information is *where*.
|
|
397
|
+
# ``normalized`` rung applies the same normalisation first, so a quote that
|
|
398
|
+
# verifies also locates; the extra information is *where*. It then goes one
|
|
399
|
+
# step wider than verification -- quotation marks are dropped on both sides
|
|
400
|
+
# (see :func:`_canon`) -- so a quote may locate without verifying. Measured on
|
|
401
|
+
# 1,500 evidence quotes from a consumer's debug corpus (AgentErrorData,
|
|
402
|
+
# ``scripts/evidence_region_vs_upstream.py``), 402 quotes the consumer's own
|
|
403
|
+
# rung ladder anchored were not grounded here; 337 of them differed from the
|
|
404
|
+
# stored field in nothing but a renderer's role label (``Observation: ...``,
|
|
405
|
+
# ``step 8 action: ...``) and 11 more in nothing but the kind of quotation
|
|
406
|
+
# mark, which is why both are treated as framing rather than content. After
|
|
407
|
+
# this change 54 remain, and those are real edits or two-field composites.
|
|
389
408
|
# ---------------------------------------------------------------------------
|
|
390
409
|
|
|
391
410
|
#: Rungs, strictest first. A quote is credited to the first rung that locates it.
|
|
@@ -393,7 +412,10 @@ def quote_verification_summary(findings: Iterable[FailureFinding]) -> dict:
|
|
|
393
412
|
#: ``normalized`` -- substring after the normalisation ``verify_finding_quotes``
|
|
394
413
|
#: applies (JSON escapes, whitespace, a trailing truncation marker) and after
|
|
395
414
|
#: removing the framing a renderer puts around an event -- ``[step 3]``,
|
|
396
|
-
#: ``event_id=evt_...``, ``output
|
|
415
|
+
#: ``event_id=evt_...``, ``output=``, ``Observation:`` -- which a model copying
|
|
416
|
+
#: a line copies too; failing that, with quotation marks dropped on both
|
|
417
|
+
#: sides, since a stored ``repr`` and a model's JSON re-quoting of it differ
|
|
418
|
+
#: in nothing else.
|
|
397
419
|
#: ``anchored`` -- the text was found nowhere, but the quote (or the caller)
|
|
398
420
|
#: named an event id that exists. A pointer, not a transcription.
|
|
399
421
|
#: ``unresolvable`` -- neither the text nor an anchor places it.
|
|
@@ -427,20 +449,38 @@ ANCHOR_ELSEWHERE = 'elsewhere'
|
|
|
427
449
|
|
|
428
450
|
_EVENT_FIELDS = ('input', 'output', 'error')
|
|
429
451
|
|
|
452
|
+
#: The label a renderer prints in front of an event's text (``Thought:``,
|
|
453
|
+
#: ``Action:``, ``Observation:``, ``Feedback:``), and the ones models add
|
|
454
|
+
#: themselves when reproducing a line (``env:``, ``error:``, ``solver:``,
|
|
455
|
+
#: ``verifier signal:``). A renderer that folds the error field into the
|
|
456
|
+
#: label -- ``Observation (tool error: unknown_carrier): Rejected.`` -- is
|
|
457
|
+
#: covered by the optional parenthetical. The label is framing; the text
|
|
458
|
+
#: after the colon must still match a stored field.
|
|
459
|
+
_ROLE_LABEL = (
|
|
460
|
+
r'(?:thought|action|observation|feedback|env|error|solver|signal|user|executor'
|
|
461
|
+
r'|verifier[ _]signal|verification|verifier)(?:\s*\([^)]*\))?\s*:'
|
|
462
|
+
)
|
|
463
|
+
#: The event-id forms the built-in renderers print (``event_id=evt_x``) and
|
|
464
|
+
#: the ones models write when asked to cite (``evt_x: ...``, ``(evt_x) ...``,
|
|
465
|
+
#: ``[evt_x][agent][kind] ...``).
|
|
466
|
+
_EVENT_REF = (
|
|
467
|
+
r'\[(?P<bracket>evt_\w+)\](?:\[[^\]]*\]){0,2}'
|
|
468
|
+
r'|\((?P<paren>evt_\w+)\)'
|
|
469
|
+
r'|event_id\s*=\s*(?P<kw>[^\s,;:]+)'
|
|
470
|
+
r'|(?P<colon>evt_\w+)\s*[:\-]'
|
|
471
|
+
)
|
|
430
472
|
#: Framing a renderer puts around an event, or a model adds when reproducing a
|
|
431
473
|
#: line. Anchored on the start of the quote, so only a leading frame is
|
|
432
|
-
#: removed and the quoted content itself must still match.
|
|
433
|
-
#:
|
|
434
|
-
#:
|
|
435
|
-
#: ``[evt_x][agent][kind] ...``).
|
|
474
|
+
#: removed and the quoted content itself must still match. A bare ``step 3``
|
|
475
|
+
#: (no colon) counts as framing only when an event reference or a role label
|
|
476
|
+
#: follows it, so ``step 3 of the plan`` keeps its first two words.
|
|
436
477
|
_FRAME = re.compile(
|
|
437
478
|
r'^\s*'
|
|
438
|
-
r'(?:\[step\s+\d+\]|step\s+\d+\s*[:\-]
|
|
439
|
-
r'(
|
|
440
|
-
r'
|
|
441
|
-
r'|event_id=(?P<kw>[^\s,;:]+)'
|
|
442
|
-
r'|(?P<colon>evt_\w+)\s*[:\-])?\s*'
|
|
479
|
+
r'(?:\[step\s+\d+\]|step\s+\d+\s*[:\-]'
|
|
480
|
+
r'|step\s+\d+(?=\s+(?:[\[(]?evt_|event_id\s*=|' + _ROLE_LABEL + r')))?\s*'
|
|
481
|
+
r'(?:' + _EVENT_REF + r')?\s*'
|
|
443
482
|
r'(?:(?:type|agent)=\S+\s*)*'
|
|
483
|
+
r'(?:' + _ROLE_LABEL + r')?\s*'
|
|
444
484
|
r'(?:(?:input|output|error|metadata)\s*[:=])?\s*',
|
|
445
485
|
re.IGNORECASE,
|
|
446
486
|
)
|
|
@@ -497,6 +537,13 @@ def _norm_with_map(text: str) -> Tuple[str, List[Tuple[int, int]]]:
|
|
|
497
537
|
spans = [(i, i + 1) for i in range(len(text))]
|
|
498
538
|
for seq, char in _ESCAPES:
|
|
499
539
|
chars, spans = _replace_with_map(chars, spans, seq, char)
|
|
540
|
+
return _collapse_ws_with_map(chars, spans)
|
|
541
|
+
|
|
542
|
+
|
|
543
|
+
def _collapse_ws_with_map(
|
|
544
|
+
chars: Sequence[str], spans: Sequence[Tuple[int, int]]
|
|
545
|
+
) -> Tuple[str, List[Tuple[int, int]]]:
|
|
546
|
+
"""``_WS.sub(' ', text).strip()`` over a character list, spans carried along."""
|
|
500
547
|
out_chars: List[str] = []
|
|
501
548
|
out_spans: List[Tuple[int, int]] = []
|
|
502
549
|
i = 0
|
|
@@ -521,6 +568,42 @@ def _norm_with_map(text: str) -> Tuple[str, List[Tuple[int, int]]]:
|
|
|
521
568
|
return ''.join(out_chars), out_spans
|
|
522
569
|
|
|
523
570
|
|
|
571
|
+
#: Quotation marks, straight and typographic. A stored tool call is a Python
|
|
572
|
+
#: ``repr`` with single quotes; a model re-quotes it as JSON with double
|
|
573
|
+
#: quotes, or a chat surface curls them. Measured on the consumer corpus
|
|
574
|
+
#: above, 11 quotes located only once these were dropped. Case, wording and
|
|
575
|
+
#: punctuation are still not normalised.
|
|
576
|
+
_QUOTE_MARKS = '"\'`\u2018\u2019\u201c\u201d'
|
|
577
|
+
_QUOTE_CHARS = re.compile('[' + re.escape(_QUOTE_MARKS) + ']')
|
|
578
|
+
|
|
579
|
+
|
|
580
|
+
def _canon(text: str) -> str:
|
|
581
|
+
""":func:`_norm`, then quotation marks dropped and whitespace re-collapsed.
|
|
582
|
+
|
|
583
|
+
Dropping a mark can leave two spaces adjacent (``a ' b``) or one at an
|
|
584
|
+
end (``'x'``), so the collapse runs again; both sides go through the same
|
|
585
|
+
function, so what matters is only that it is deterministic.
|
|
586
|
+
"""
|
|
587
|
+
return _WS.sub(' ', _QUOTE_CHARS.sub('', _norm(text))).strip()
|
|
588
|
+
|
|
589
|
+
|
|
590
|
+
def _canon_quote(text: str) -> str:
|
|
591
|
+
""":func:`_canon` of a model-supplied quote, truncation marker removed first."""
|
|
592
|
+
return _canon(_norm_quote(text))
|
|
593
|
+
|
|
594
|
+
|
|
595
|
+
def _canon_with_map(text: str) -> Tuple[str, List[Tuple[int, int]]]:
|
|
596
|
+
""":func:`_canon`, plus the offset map :func:`_norm_with_map` provides.
|
|
597
|
+
|
|
598
|
+
Built on the ``_norm`` map, so the two stay equivalent by construction:
|
|
599
|
+
the mapped characters are filtered and re-collapsed exactly as ``_canon``
|
|
600
|
+
filters and re-collapses the string.
|
|
601
|
+
"""
|
|
602
|
+
mapped, spans = _norm_with_map(text)
|
|
603
|
+
kept = [(c, span) for c, span in zip(mapped, spans) if c not in _QUOTE_MARKS]
|
|
604
|
+
return _collapse_ws_with_map([c for c, _ in kept], [span for _, span in kept])
|
|
605
|
+
|
|
606
|
+
|
|
524
607
|
def _replace_with_map(
|
|
525
608
|
chars: List[str], spans: List[Tuple[int, int]], seq: str, char: str
|
|
526
609
|
) -> Tuple[List[str], List[Tuple[int, int]]]:
|
|
@@ -675,50 +758,28 @@ def locate_quote(
|
|
|
675
758
|
if anchor_event is not None:
|
|
676
759
|
order.sort(key=lambda i: events[i] is not anchor_event)
|
|
677
760
|
|
|
678
|
-
# Rung 1: the quote as given, verbatim.
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
if
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
))
|
|
701
|
-
|
|
702
|
-
# Rung 2: after the normalisation `verify_finding_quotes` applies, with the
|
|
703
|
-
# quote's own framing removed. The unframed form is tried first so that a
|
|
704
|
-
# quote copied from a rendering that includes the frame still resolves
|
|
705
|
-
# against `shown`.
|
|
706
|
-
needles: List[str] = []
|
|
707
|
-
for candidate in (_norm_quote(quote), _norm_quote(inner)):
|
|
708
|
-
if candidate and candidate not in needles:
|
|
709
|
-
needles.append(candidate)
|
|
710
|
-
for needle in needles:
|
|
711
|
-
for i in order:
|
|
712
|
-
found = _find_in_event(events[i], i, needle, shown, normalized=True)
|
|
713
|
-
if found is not None:
|
|
714
|
-
return finish(found)
|
|
715
|
-
if trajectory.goal:
|
|
716
|
-
span = _find_normalized(needle, trajectory.goal)
|
|
717
|
-
if span is not None:
|
|
718
|
-
return finish(QuoteLocation(
|
|
719
|
-
rung=RUNG_NORMALIZED, region=REGION_GOAL, span=span,
|
|
720
|
-
text=trajectory.goal[span[0]:span[1]],
|
|
721
|
-
))
|
|
761
|
+
# Rung 1: the quote as given, verbatim, then with its own framing removed.
|
|
762
|
+
# Rung 2: after the normalisation `verify_finding_quotes` applies, then --
|
|
763
|
+
# wider than verification -- with quotation marks dropped. At every step
|
|
764
|
+
# the framed form is tried before the unframed one, so that a quote copied
|
|
765
|
+
# from a rendering that includes the frame still resolves against `shown`.
|
|
766
|
+
for rung, prepare, finder in _LADDER:
|
|
767
|
+
needles: List[str] = []
|
|
768
|
+
for candidate in (prepare(quote), prepare(inner)):
|
|
769
|
+
if candidate and candidate not in needles:
|
|
770
|
+
needles.append(candidate)
|
|
771
|
+
for needle in needles:
|
|
772
|
+
for i in order:
|
|
773
|
+
found = _find_in_event(events[i], i, needle, shown, rung, finder)
|
|
774
|
+
if found is not None:
|
|
775
|
+
return finish(found)
|
|
776
|
+
if trajectory.goal:
|
|
777
|
+
span = finder(needle, trajectory.goal)
|
|
778
|
+
if span is not None:
|
|
779
|
+
return finish(QuoteLocation(
|
|
780
|
+
rung=rung, region=REGION_GOAL, span=span,
|
|
781
|
+
text=trajectory.goal[span[0]:span[1]],
|
|
782
|
+
))
|
|
722
783
|
|
|
723
784
|
# Rung 3: no text located; a real anchor still places the claim at an event.
|
|
724
785
|
if anchor_event is not None:
|
|
@@ -732,35 +793,71 @@ def locate_quote(
|
|
|
732
793
|
return finish(QuoteLocation(rung=RUNG_UNRESOLVABLE, region=REGION_NONE))
|
|
733
794
|
|
|
734
795
|
|
|
735
|
-
|
|
736
|
-
|
|
796
|
+
_Finder = Callable[[str, str], Optional[Tuple[int, int]]]
|
|
797
|
+
_Mapper = Callable[[str], Tuple[str, List[Tuple[int, int]]]]
|
|
798
|
+
|
|
737
799
|
|
|
738
|
-
|
|
739
|
-
|
|
800
|
+
def _find_mapped(
|
|
801
|
+
needle: str, haystack: str, canonical: Callable[[str], str], with_map: _Mapper
|
|
802
|
+
) -> Optional[Tuple[int, int]]:
|
|
803
|
+
"""Span of an already-canonical ``needle`` in ``haystack``, in raw offsets.
|
|
804
|
+
|
|
805
|
+
The regex-based ``canonical`` is the fast pre-check; the offset map is
|
|
806
|
+
built only for a haystack that contains the needle.
|
|
740
807
|
"""
|
|
741
|
-
if not needle or needle not in
|
|
808
|
+
if not needle or needle not in canonical(haystack):
|
|
742
809
|
return None
|
|
743
|
-
mapped, spans =
|
|
810
|
+
mapped, spans = with_map(haystack)
|
|
744
811
|
start = mapped.find(needle)
|
|
745
|
-
if start < 0: # pragma: no cover - the map is equivalent
|
|
812
|
+
if start < 0: # pragma: no cover - the map is equivalent by construction
|
|
746
813
|
return None
|
|
747
814
|
end = start + len(needle)
|
|
748
815
|
return spans[start][0], spans[end - 1][1]
|
|
749
816
|
|
|
750
817
|
|
|
818
|
+
def _find_normalized(needle: str, haystack: str) -> Optional[Tuple[int, int]]:
|
|
819
|
+
"""Span of ``needle`` in ``haystack`` after ``_norm``, mapped back to raw offsets."""
|
|
820
|
+
return _find_mapped(needle, haystack, _norm, _norm_with_map)
|
|
821
|
+
|
|
822
|
+
|
|
823
|
+
def _find_canon(needle: str, haystack: str) -> Optional[Tuple[int, int]]:
|
|
824
|
+
"""Span of ``needle`` in ``haystack`` after ``_canon``, mapped back to raw offsets."""
|
|
825
|
+
return _find_mapped(needle, haystack, _canon, _canon_with_map)
|
|
826
|
+
|
|
827
|
+
|
|
828
|
+
def _find_exact(needle: str, haystack: str) -> Optional[Tuple[int, int]]:
|
|
829
|
+
start = haystack.find(needle)
|
|
830
|
+
if start < 0:
|
|
831
|
+
return None
|
|
832
|
+
return start, start + len(needle)
|
|
833
|
+
|
|
834
|
+
|
|
835
|
+
def _verbatim(text: str) -> str:
|
|
836
|
+
return text
|
|
837
|
+
|
|
838
|
+
|
|
839
|
+
#: The rungs :func:`locate_quote` climbs, strictest first: how the quote is
|
|
840
|
+
#: prepared, and how a haystack is searched for it.
|
|
841
|
+
_LADDER: Tuple[Tuple[str, Callable[[str], str], _Finder], ...] = (
|
|
842
|
+
(RUNG_EXACT, _verbatim, _find_exact),
|
|
843
|
+
(RUNG_NORMALIZED, _norm_quote, _find_normalized),
|
|
844
|
+
(RUNG_NORMALIZED, _canon_quote, _find_canon),
|
|
845
|
+
)
|
|
846
|
+
|
|
847
|
+
|
|
751
848
|
def _find_in_event(
|
|
752
849
|
event: AgentEvent,
|
|
753
850
|
index: int,
|
|
754
851
|
needle: str,
|
|
755
852
|
shown: Optional[Mapping[str, str]],
|
|
756
|
-
|
|
853
|
+
rung: str,
|
|
854
|
+
finder: _Finder,
|
|
757
855
|
) -> Optional[QuoteLocation]:
|
|
758
|
-
rung = RUNG_NORMALIZED if normalized else RUNG_EXACT
|
|
759
856
|
for field in _EVENT_FIELDS:
|
|
760
857
|
text = _field_text(event, field)
|
|
761
858
|
if not text:
|
|
762
859
|
continue
|
|
763
|
-
span =
|
|
860
|
+
span = finder(needle, text)
|
|
764
861
|
if span is not None:
|
|
765
862
|
return QuoteLocation(
|
|
766
863
|
rung=rung, region=REGION_EVENT, event_id=event.event_id,
|
|
@@ -770,7 +867,7 @@ def _find_in_event(
|
|
|
770
867
|
)
|
|
771
868
|
rendered = (shown or {}).get(event.event_id)
|
|
772
869
|
if rendered:
|
|
773
|
-
span =
|
|
870
|
+
span = finder(needle, rendered)
|
|
774
871
|
if span is not None:
|
|
775
872
|
return QuoteLocation(
|
|
776
873
|
rung=rung, region=REGION_SHOWN, event_id=event.event_id,
|
|
@@ -781,13 +878,6 @@ def _find_in_event(
|
|
|
781
878
|
return None
|
|
782
879
|
|
|
783
880
|
|
|
784
|
-
def _find_exact(needle: str, haystack: str) -> Optional[Tuple[int, int]]:
|
|
785
|
-
start = haystack.find(needle)
|
|
786
|
-
if start < 0:
|
|
787
|
-
return None
|
|
788
|
-
return start, start + len(needle)
|
|
789
|
-
|
|
790
|
-
|
|
791
881
|
@dataclass(frozen=True)
|
|
792
882
|
class QuoteGrounding:
|
|
793
883
|
"""One quote of a finding, located and placed relative to the blamed event.
|
{agentdebugx-0.5.0 → agentdebugx-0.5.2}/src/agentdebug/diagnose/detect/rules/packs/core/rules.py
RENAMED
|
@@ -518,8 +518,8 @@ def _finding(
|
|
|
518
518
|
enriched = dict(metadata)
|
|
519
519
|
enriched.update(
|
|
520
520
|
{
|
|
521
|
-
'rule_pack':
|
|
522
|
-
'rule_id':
|
|
521
|
+
'rule_pack': rule.rule_pack,
|
|
522
|
+
'rule_id': rule.rule_id,
|
|
523
523
|
'confidence_basis': confidence_basis,
|
|
524
524
|
'analysis_layer': 'cross_event_rule',
|
|
525
525
|
'finding_source_label': 'Cross-event rule',
|
|
@@ -527,7 +527,7 @@ def _finding(
|
|
|
527
527
|
'trigger_reason': confidence_basis,
|
|
528
528
|
'why_reported': (
|
|
529
529
|
f'This finding was emitted by deterministic rule '
|
|
530
|
-
f'{
|
|
530
|
+
f'{rule.rule_id} after analyzing multiple events together.'
|
|
531
531
|
),
|
|
532
532
|
}
|
|
533
533
|
)
|
|
@@ -80,7 +80,7 @@ def load_event_rules(rule_packs: Iterable[str]) -> List[EventRule]:
|
|
|
80
80
|
rules: List[EventRule] = []
|
|
81
81
|
for pack in rule_packs:
|
|
82
82
|
module = _load_rule_pack_module(pack)
|
|
83
|
-
build_event_rules =
|
|
83
|
+
build_event_rules = module.build_event_rules
|
|
84
84
|
rules.extend(cast(List[EventRule], build_event_rules()))
|
|
85
85
|
return sorted(rules, key=lambda rule: rule.priority)
|
|
86
86
|
|
|
@@ -89,7 +89,7 @@ def load_trajectory_rules(rule_packs: Iterable[str]) -> List[TrajectoryRule]:
|
|
|
89
89
|
rules: List[TrajectoryRule] = []
|
|
90
90
|
for pack in rule_packs:
|
|
91
91
|
module = _load_rule_pack_module(pack)
|
|
92
|
-
build_trajectory_rules =
|
|
92
|
+
build_trajectory_rules = module.build_trajectory_rules
|
|
93
93
|
rules.extend(cast(List[TrajectoryRule], build_trajectory_rules()))
|
|
94
94
|
return sorted(rules, key=lambda rule: rule.priority)
|
|
95
95
|
|
|
@@ -14,7 +14,7 @@ from __future__ import annotations
|
|
|
14
14
|
|
|
15
15
|
from collections.abc import Callable
|
|
16
16
|
from dataclasses import dataclass, field
|
|
17
|
-
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Protocol
|
|
17
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Protocol
|
|
18
18
|
|
|
19
19
|
from agentdebug.runtime import extract_json_block
|
|
20
20
|
from agentdebug.schema import (
|
|
@@ -15,7 +15,7 @@ from pathlib import Path
|
|
|
15
15
|
from typing import List, Optional, Union
|
|
16
16
|
|
|
17
17
|
from agentdebug.hub.backend_base import HubBackend, HubSpec, parse_spec
|
|
18
|
-
from agentdebug.hub.bundle import Bundle, pack_bundle
|
|
18
|
+
from agentdebug.hub.bundle import Bundle, pack_bundle
|
|
19
19
|
|
|
20
20
|
LOG = logging.getLogger('agentdebug.hub')
|
|
21
21
|
|
|
@@ -32,7 +32,7 @@ from __future__ import annotations
|
|
|
32
32
|
|
|
33
33
|
import logging
|
|
34
34
|
from types import TracebackType
|
|
35
|
-
from typing import Any,
|
|
35
|
+
from typing import Any, Literal, Optional, Type
|
|
36
36
|
|
|
37
37
|
from agentdebug.ingest.adapters.base import AdapterStatus, FrameworkAdapter
|
|
38
38
|
from agentdebug.schema import AgentTrajectory, EventType
|
|
@@ -270,7 +270,7 @@ def convert_with_llm(
|
|
|
270
270
|
# times before giving up so a transient blank doesn't fail the upload.
|
|
271
271
|
parsed = None
|
|
272
272
|
last_reason = 'LLM converter returned no usable JSON'
|
|
273
|
-
for
|
|
273
|
+
for _attempt in range(3):
|
|
274
274
|
try:
|
|
275
275
|
result = client.complete(
|
|
276
276
|
messages=[
|
|
@@ -11,32 +11,8 @@ from agentdebug.inspect.ui.app import build_app, serve, store_from_path
|
|
|
11
11
|
from agentdebug.inspect.ui.branch_store import (
|
|
12
12
|
CASE_DB_FILENAME,
|
|
13
13
|
DEBUG_BRANCH_DB_FILENAME,
|
|
14
|
-
_append_case_record,
|
|
15
|
-
_append_debug_branch_record,
|
|
16
|
-
_case_db_path,
|
|
17
|
-
_debug_branch_db_path,
|
|
18
|
-
_delete_case_record,
|
|
19
|
-
_read_case_records,
|
|
20
|
-
_read_debug_branch_records,
|
|
21
|
-
_write_debug_branch_records,
|
|
22
14
|
)
|
|
23
15
|
from agentdebug.inspect.ui.services import (
|
|
24
|
-
_build_debug_continuation_context,
|
|
25
|
-
_build_rerun_evaluation,
|
|
26
|
-
_compact_event_payload,
|
|
27
|
-
_decorate_debug_branch_record,
|
|
28
|
-
_event_has_problem,
|
|
29
|
-
_event_problem_text,
|
|
30
|
-
_event_summary_for_prompt,
|
|
31
|
-
_event_title,
|
|
32
|
-
_extract_chat_content,
|
|
33
|
-
_extract_generated_events,
|
|
34
|
-
_extract_json_payload,
|
|
35
|
-
_extract_partial_continuation_payload,
|
|
36
|
-
_normalize_chat_endpoint,
|
|
37
|
-
_normalize_generated_events,
|
|
38
|
-
_request_debug_completion,
|
|
39
|
-
_to_dict,
|
|
40
16
|
build_overview,
|
|
41
17
|
)
|
|
42
18
|
from agentdebug.inspect.ui.views import render_page, render_space_page
|
|
@@ -10,7 +10,7 @@ import tempfile
|
|
|
10
10
|
from collections.abc import Sequence
|
|
11
11
|
from dataclasses import asdict
|
|
12
12
|
from pathlib import Path
|
|
13
|
-
from typing import
|
|
13
|
+
from typing import Optional, Union
|
|
14
14
|
|
|
15
15
|
from agentdebug.rerun.executors.base import LIVE_EXECUTION, RerunResult
|
|
16
16
|
from agentdebug.rerun.live_validation import parse_live_result
|
|
@@ -47,6 +47,15 @@ ABSTAIN_REASONS = (
|
|
|
47
47
|
)
|
|
48
48
|
|
|
49
49
|
|
|
50
|
+
def _model_dict(model: Any) -> Dict[str, Any]:
|
|
51
|
+
"""`model_dump()` on pydantic v2, `dict()` on v1, a plain dict copied as is."""
|
|
52
|
+
if hasattr(model, 'model_dump'):
|
|
53
|
+
return dict(model.model_dump())
|
|
54
|
+
if hasattr(model, 'dict'):
|
|
55
|
+
return dict(model.dict())
|
|
56
|
+
return dict(model)
|
|
57
|
+
|
|
58
|
+
|
|
50
59
|
class ManifestMode(BaseModel):
|
|
51
60
|
"""One leaf mode as the labeller sees it."""
|
|
52
61
|
|
|
@@ -78,7 +87,7 @@ class TaxonomyManifest(BaseModel):
|
|
|
78
87
|
return None
|
|
79
88
|
|
|
80
89
|
def to_dict(self) -> Dict[str, Any]:
|
|
81
|
-
return
|
|
90
|
+
return _model_dict(self)
|
|
82
91
|
|
|
83
92
|
|
|
84
93
|
def _canonical_json(value: Any) -> str:
|
|
@@ -86,7 +95,7 @@ def _canonical_json(value: Any) -> str:
|
|
|
86
95
|
|
|
87
96
|
|
|
88
97
|
def _fingerprint(modes: Sequence[ManifestMode]) -> str:
|
|
89
|
-
payload = [mode
|
|
98
|
+
payload = [_model_dict(mode) for mode in sorted(modes, key=lambda m: m.mode_id)]
|
|
90
99
|
return hashlib.sha256(_canonical_json(payload).encode('utf-8')).hexdigest()
|
|
91
100
|
|
|
92
101
|
|
|
@@ -109,7 +118,7 @@ def taxonomy_manifest(
|
|
|
109
118
|
listed: List[ManifestMode] = []
|
|
110
119
|
seen: Set[str] = set()
|
|
111
120
|
for key, mode in raw.items():
|
|
112
|
-
data =
|
|
121
|
+
data = _model_dict(mode)
|
|
113
122
|
mode_id = data.get('mode_id') or key
|
|
114
123
|
if mode_id in seen:
|
|
115
124
|
raise ValueError(f'duplicate mode id in taxonomy: {mode_id!r}')
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|