tutanus 0.12.2 → 0.12.4
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.
- package/README.md +7 -7
- package/dist/analysts/converters/converter-base.js.map +1 -1
- package/dist/analysts/converters/engines/converter-gha-to-gitlab.js.map +1 -1
- package/dist/analysts/converters/index.js.map +1 -1
- package/dist/analysts/corrections/map-reversion.js +2 -2
- package/dist/analysts/corrections/map-reversion.js.map +1 -1
- package/dist/analysts/corrections/pruning.js +3 -3
- package/dist/analysts/corrections/pruning.js.map +1 -1
- package/dist/analysts/detectors/detector-recommendation-architecture.js +2 -2
- package/dist/analysts/detectors/detector-recommendation-architecture.js.map +1 -1
- package/dist/analysts/github-actions/detectors/org-verified.js.map +1 -1
- package/dist/analysts/github-actions/reports/generator-report-github-actions.js +4 -4
- package/dist/analysts/github-actions/reports/generator-report-github-actions.js.map +1 -1
- package/dist/analysts/js-ts/detectors/detector-context-smart.js +10 -10
- package/dist/analysts/js-ts/detectors/detector-context-smart.js.map +1 -1
- package/dist/analysts/js-ts/detectors/detector-types-unsafe.js +3 -3
- package/dist/analysts/js-ts/detectors/detector-types-unsafe.js.map +1 -1
- package/dist/analysts/plugins/detector-documentation.js.map +1 -1
- package/dist/analysts/plugins/index.js.map +1 -1
- package/dist/analysts/scorers/scorer.js +67 -67
- package/dist/analysts/scorers/scorer.js.map +1 -1
- package/dist/app/github/app/repo-downloader.d.ts +2 -0
- package/dist/app/github/app/repo-downloader.d.ts.map +1 -1
- package/dist/app/github/app/repo-downloader.js +2 -2
- package/dist/app/github/app/repo-downloader.js.map +1 -1
- package/dist/app/github/jobs/auto-fix-job.d.ts.map +1 -1
- package/dist/app/github/jobs/auto-fix-job.js +19 -3
- package/dist/app/github/jobs/auto-fix-job.js.map +1 -1
- package/dist/app/github/push-analysis/push-analysis-service.d.ts.map +1 -1
- package/dist/app/github/push-analysis/push-analysis-service.js +19 -7
- package/dist/app/github/push-analysis/push-analysis-service.js.map +1 -1
- package/dist/app/github/push-analysis/push-report.js +2 -2
- package/dist/app/github/push-analysis/push-report.js.map +1 -1
- package/dist/bin/index.d.ts.map +1 -1
- package/dist/bin/index.js +5 -0
- package/dist/bin/index.js.map +1 -1
- package/dist/cli/commands/command-azure.js +1 -1
- package/dist/cli/commands/command-azure.js.map +1 -1
- package/dist/cli/commands/command-circleci.js +1 -1
- package/dist/cli/commands/command-circleci.js.map +1 -1
- package/dist/cli/commands/command-convert.js.map +1 -1
- package/dist/cli/commands/command-github-actions.js +1 -1
- package/dist/cli/commands/command-github-actions.js.map +1 -1
- package/dist/cli/commands/command-gitlab-ci.js +1 -1
- package/dist/cli/commands/command-gitlab-ci.js.map +1 -1
- package/dist/cli/commands/command-jenkins.js +1 -1
- package/dist/cli/commands/command-jenkins.js.map +1 -1
- package/dist/cli/diagnostic/exporters/compliance-exporter.js +2 -2
- package/dist/cli/diagnostic/exporters/compliance-exporter.js.map +1 -1
- package/dist/cli/diagnostic/exporters/markdown-exporter.js +7 -7
- package/dist/cli/diagnostic/exporters/markdown-exporter.js.map +1 -1
- package/dist/cli/diagnostic/handlers/archetype-handler.js.map +1 -1
- package/dist/cli/diagnostic/handlers/guardian-handler.js.map +1 -1
- package/dist/cli/diagnostic/processing-diagnostic.d.ts.map +1 -1
- package/dist/cli/diagnostic/processing-diagnostic.js +2 -3
- package/dist/cli/diagnostic/processing-diagnostic.js.map +1 -1
- package/dist/core/config/auto/fix-config.js.map +1 -1
- package/dist/core/execution/executor.js +4 -4
- package/dist/core/execution/executor.js.map +1 -1
- package/dist/core/execution/inquisitor.js +6 -6
- package/dist/core/execution/inquisitor.js.map +1 -1
- package/dist/core/execution/scanner.js.map +1 -1
- package/dist/core/messages/en/analysts/archetypes-extra-messages.d.ts +2 -2
- package/dist/core/messages/en/analysts/archetypes-extra-messages.js +2 -2
- package/dist/core/messages/en/analysts/archetypes-extra-messages.js.map +1 -1
- package/dist/core/messages/en/analysts/detector-clean-arch-messages.d.ts +4 -4
- package/dist/core/messages/en/analysts/detector-clean-arch-messages.js +4 -4
- package/dist/core/messages/en/analysts/detector-clean-arch-messages.js.map +1 -1
- package/dist/core/messages/en/analysts/detector-js-ts-messages.d.ts +2 -2
- package/dist/core/messages/en/analysts/detector-js-ts-messages.js +2 -2
- package/dist/core/messages/en/analysts/detector-js-ts-messages.js.map +1 -1
- package/dist/core/messages/en/analysts/map-reversion-extra-messages.d.ts +6 -6
- package/dist/core/messages/en/analysts/map-reversion-extra-messages.js +6 -6
- package/dist/core/messages/en/analysts/map-reversion-extra-messages.js.map +1 -1
- package/dist/core/messages/en/analysts/report-github-actions-messages.d.ts +2 -2
- package/dist/core/messages/en/analysts/report-github-actions-messages.js +2 -2
- package/dist/core/messages/en/analysts/report-github-actions-messages.js.map +1 -1
- package/dist/core/messages/en/analysts/scorer-messages.d.ts +45 -45
- package/dist/core/messages/en/analysts/scorer-messages.js +49 -49
- package/dist/core/messages/en/analysts/scorer-messages.js.map +1 -1
- package/dist/core/messages/en/cli/cli-command-convert-messages.d.ts +1 -1
- package/dist/core/messages/en/cli/cli-command-convert-messages.js +1 -1
- package/dist/core/messages/en/cli/cli-command-convert-messages.js.map +1 -1
- package/dist/core/messages/en/cli/cli-command-format-messages.d.ts +1 -1
- package/dist/core/messages/en/cli/cli-command-format-messages.js +1 -1
- package/dist/core/messages/en/cli/cli-command-format-messages.js.map +1 -1
- package/dist/core/messages/en/cli/cli-command-github-actions-messages.d.ts +1 -1
- package/dist/core/messages/en/cli/cli-command-github-actions-messages.js +4 -4
- package/dist/core/messages/en/cli/cli-command-github-actions-messages.js.map +1 -1
- package/dist/core/messages/en/cli/cli-command-update-messages.d.ts +2 -2
- package/dist/core/messages/en/cli/cli-command-update-messages.js +2 -2
- package/dist/core/messages/en/cli/cli-command-update-messages.js.map +1 -1
- package/dist/core/messages/en/cli/cli-flags-validator-messages.d.ts +3 -3
- package/dist/core/messages/en/cli/cli-flags-validator-messages.js +3 -3
- package/dist/core/messages/en/cli/cli-flags-validator-messages.js.map +1 -1
- package/dist/core/messages/en/core/correcoes-messages.js +2 -2
- package/dist/core/messages/en/core/correcoes-messages.js.map +1 -1
- package/dist/core/messages/en/core/inquisitor-extra-messages.d.ts +2 -2
- package/dist/core/messages/en/core/inquisitor-extra-messages.js +2 -2
- package/dist/core/messages/en/core/inquisitor-extra-messages.js.map +1 -1
- package/dist/core/messages/en/core/parser-extra-messages.d.ts +3 -3
- package/dist/core/messages/en/core/parser-extra-messages.js +3 -3
- package/dist/core/messages/en/core/parser-extra-messages.js.map +1 -1
- package/dist/core/messages/en/guardian/guardian-messages.d.ts +2 -2
- package/dist/core/messages/en/guardian/guardian-messages.js +2 -2
- package/dist/core/messages/en/guardian/guardian-messages.js.map +1 -1
- package/dist/core/messages/en/guardian/watcher-hidden-messages.d.ts +2 -2
- package/dist/core/messages/en/guardian/watcher-hidden-messages.js +2 -2
- package/dist/core/messages/en/guardian/watcher-hidden-messages.js.map +1 -1
- package/dist/core/messages/en/log/log-helper.js.map +1 -1
- package/dist/core/messages/en/reports/report-async-patterns-messages.d.ts +3 -3
- package/dist/core/messages/en/reports/report-async-patterns-messages.js +3 -3
- package/dist/core/messages/en/reports/report-async-patterns-messages.js.map +1 -1
- package/dist/core/messages/en/shared/plugin-core-messages.d.ts +2 -2
- package/dist/core/messages/en/shared/plugin-core-messages.js +2 -2
- package/dist/core/messages/en/shared/plugin-core-messages.js.map +1 -1
- package/dist/core/messages/en/shared/plugin-registry-messages.d.ts +4 -4
- package/dist/core/messages/en/shared/plugin-registry-messages.js +4 -4
- package/dist/core/messages/en/shared/plugin-registry-messages.js.map +1 -1
- package/dist/core/messages/ja/analysts/archetypes-extra-messages.d.ts +2 -2
- package/dist/core/messages/ja/analysts/archetypes-extra-messages.js +2 -2
- package/dist/core/messages/ja/analysts/archetypes-extra-messages.js.map +1 -1
- package/dist/core/messages/ja/analysts/detector-clean-arch-messages.d.ts +4 -4
- package/dist/core/messages/ja/analysts/detector-clean-arch-messages.js +4 -4
- package/dist/core/messages/ja/analysts/detector-clean-arch-messages.js.map +1 -1
- package/dist/core/messages/ja/analysts/detector-js-ts-messages.d.ts +2 -2
- package/dist/core/messages/ja/analysts/detector-js-ts-messages.js +2 -2
- package/dist/core/messages/ja/analysts/detector-js-ts-messages.js.map +1 -1
- package/dist/core/messages/ja/analysts/map-reversion-extra-messages.d.ts +6 -6
- package/dist/core/messages/ja/analysts/map-reversion-extra-messages.js +6 -6
- package/dist/core/messages/ja/analysts/map-reversion-extra-messages.js.map +1 -1
- package/dist/core/messages/ja/analysts/report-github-actions-messages.d.ts +2 -2
- package/dist/core/messages/ja/analysts/report-github-actions-messages.js +2 -2
- package/dist/core/messages/ja/analysts/report-github-actions-messages.js.map +1 -1
- package/dist/core/messages/ja/analysts/scorer-messages.d.ts +45 -45
- package/dist/core/messages/ja/analysts/scorer-messages.js +49 -49
- package/dist/core/messages/ja/analysts/scorer-messages.js.map +1 -1
- package/dist/core/messages/ja/cli/cli-command-analysts-messages.d.ts +2 -2
- package/dist/core/messages/ja/cli/cli-command-analysts-messages.js +2 -2
- package/dist/core/messages/ja/cli/cli-command-analysts-messages.js.map +1 -1
- package/dist/core/messages/ja/cli/cli-command-convert-messages.d.ts +1 -1
- package/dist/core/messages/ja/cli/cli-command-convert-messages.js +1 -1
- package/dist/core/messages/ja/cli/cli-command-convert-messages.js.map +1 -1
- package/dist/core/messages/ja/cli/cli-command-format-messages.d.ts +1 -1
- package/dist/core/messages/ja/cli/cli-command-format-messages.js +1 -1
- package/dist/core/messages/ja/cli/cli-command-format-messages.js.map +1 -1
- package/dist/core/messages/ja/cli/cli-command-github-actions-messages.d.ts +1 -1
- package/dist/core/messages/ja/cli/cli-command-github-actions-messages.js +4 -4
- package/dist/core/messages/ja/cli/cli-command-github-actions-messages.js.map +1 -1
- package/dist/core/messages/ja/cli/cli-command-update-messages.d.ts +2 -2
- package/dist/core/messages/ja/cli/cli-command-update-messages.js +2 -2
- package/dist/core/messages/ja/cli/cli-command-update-messages.js.map +1 -1
- package/dist/core/messages/ja/cli/cli-flags-validator-messages.d.ts +3 -3
- package/dist/core/messages/ja/cli/cli-flags-validator-messages.js +3 -3
- package/dist/core/messages/ja/cli/cli-flags-validator-messages.js.map +1 -1
- package/dist/core/messages/ja/core/correcoes-messages.js +2 -2
- package/dist/core/messages/ja/core/correcoes-messages.js.map +1 -1
- package/dist/core/messages/ja/core/inquisitor-extra-messages.d.ts +2 -2
- package/dist/core/messages/ja/core/inquisitor-extra-messages.js +2 -2
- package/dist/core/messages/ja/core/inquisitor-extra-messages.js.map +1 -1
- package/dist/core/messages/ja/core/parser-extra-messages.d.ts +3 -3
- package/dist/core/messages/ja/core/parser-extra-messages.js +3 -3
- package/dist/core/messages/ja/core/parser-extra-messages.js.map +1 -1
- package/dist/core/messages/ja/guardian/guardian-messages.d.ts +2 -2
- package/dist/core/messages/ja/guardian/guardian-messages.js +2 -2
- package/dist/core/messages/ja/guardian/guardian-messages.js.map +1 -1
- package/dist/core/messages/ja/guardian/watcher-hidden-messages.d.ts +2 -2
- package/dist/core/messages/ja/guardian/watcher-hidden-messages.js +2 -2
- package/dist/core/messages/ja/guardian/watcher-hidden-messages.js.map +1 -1
- package/dist/core/messages/ja/log/log-helper.js.map +1 -1
- package/dist/core/messages/ja/reports/report-async-patterns-messages.d.ts +3 -3
- package/dist/core/messages/ja/reports/report-async-patterns-messages.js +3 -3
- package/dist/core/messages/ja/reports/report-async-patterns-messages.js.map +1 -1
- package/dist/core/messages/ja/shared/plugin-core-messages.d.ts +2 -2
- package/dist/core/messages/ja/shared/plugin-core-messages.js +2 -2
- package/dist/core/messages/ja/shared/plugin-core-messages.js.map +1 -1
- package/dist/core/messages/ja/shared/plugin-registry-messages.d.ts +4 -4
- package/dist/core/messages/ja/shared/plugin-registry-messages.js +4 -4
- package/dist/core/messages/ja/shared/plugin-registry-messages.js.map +1 -1
- package/dist/core/messages/pt/analysts/archetypes-extra-messages.d.ts +2 -2
- package/dist/core/messages/pt/analysts/archetypes-extra-messages.js +2 -2
- package/dist/core/messages/pt/analysts/archetypes-extra-messages.js.map +1 -1
- package/dist/core/messages/pt/analysts/detector-clean-arch-messages.d.ts +4 -4
- package/dist/core/messages/pt/analysts/detector-clean-arch-messages.js +4 -4
- package/dist/core/messages/pt/analysts/detector-clean-arch-messages.js.map +1 -1
- package/dist/core/messages/pt/analysts/detector-js-ts-messages.d.ts +2 -2
- package/dist/core/messages/pt/analysts/detector-js-ts-messages.js +2 -2
- package/dist/core/messages/pt/analysts/detector-js-ts-messages.js.map +1 -1
- package/dist/core/messages/pt/analysts/map-reversion-extra-messages.d.ts +6 -6
- package/dist/core/messages/pt/analysts/map-reversion-extra-messages.js +6 -6
- package/dist/core/messages/pt/analysts/map-reversion-extra-messages.js.map +1 -1
- package/dist/core/messages/pt/analysts/report-github-actions-messages.d.ts +2 -2
- package/dist/core/messages/pt/analysts/report-github-actions-messages.js +2 -2
- package/dist/core/messages/pt/analysts/report-github-actions-messages.js.map +1 -1
- package/dist/core/messages/pt/analysts/scorer-messages.d.ts +45 -45
- package/dist/core/messages/pt/analysts/scorer-messages.js +49 -49
- package/dist/core/messages/pt/analysts/scorer-messages.js.map +1 -1
- package/dist/core/messages/pt/cli/cli-command-convert-messages.d.ts +1 -1
- package/dist/core/messages/pt/cli/cli-command-convert-messages.js +1 -1
- package/dist/core/messages/pt/cli/cli-command-convert-messages.js.map +1 -1
- package/dist/core/messages/pt/cli/cli-command-format-messages.d.ts +1 -1
- package/dist/core/messages/pt/cli/cli-command-format-messages.js +1 -1
- package/dist/core/messages/pt/cli/cli-command-format-messages.js.map +1 -1
- package/dist/core/messages/pt/cli/cli-command-github-actions-messages.d.ts +1 -1
- package/dist/core/messages/pt/cli/cli-command-github-actions-messages.js +4 -4
- package/dist/core/messages/pt/cli/cli-command-github-actions-messages.js.map +1 -1
- package/dist/core/messages/pt/cli/cli-command-update-messages.d.ts +2 -2
- package/dist/core/messages/pt/cli/cli-command-update-messages.js +2 -2
- package/dist/core/messages/pt/cli/cli-command-update-messages.js.map +1 -1
- package/dist/core/messages/pt/cli/cli-flags-validator-messages.d.ts +3 -3
- package/dist/core/messages/pt/cli/cli-flags-validator-messages.js +3 -3
- package/dist/core/messages/pt/cli/cli-flags-validator-messages.js.map +1 -1
- package/dist/core/messages/pt/core/correcoes-messages.js +2 -2
- package/dist/core/messages/pt/core/correcoes-messages.js.map +1 -1
- package/dist/core/messages/pt/core/inquisitor-extra-messages.d.ts +2 -2
- package/dist/core/messages/pt/core/inquisitor-extra-messages.js +2 -2
- package/dist/core/messages/pt/core/inquisitor-extra-messages.js.map +1 -1
- package/dist/core/messages/pt/core/parser-extra-messages.d.ts +3 -3
- package/dist/core/messages/pt/core/parser-extra-messages.js +3 -3
- package/dist/core/messages/pt/core/parser-extra-messages.js.map +1 -1
- package/dist/core/messages/pt/guardian/guardian-messages.d.ts +2 -2
- package/dist/core/messages/pt/guardian/guardian-messages.js +2 -2
- package/dist/core/messages/pt/guardian/guardian-messages.js.map +1 -1
- package/dist/core/messages/pt/guardian/watcher-hidden-messages.d.ts +2 -2
- package/dist/core/messages/pt/guardian/watcher-hidden-messages.js +2 -2
- package/dist/core/messages/pt/guardian/watcher-hidden-messages.js.map +1 -1
- package/dist/core/messages/pt/log/log-helper.js.map +1 -1
- package/dist/core/messages/pt/reports/report-async-patterns-messages.d.ts +3 -3
- package/dist/core/messages/pt/reports/report-async-patterns-messages.js +3 -3
- package/dist/core/messages/pt/reports/report-async-patterns-messages.js.map +1 -1
- package/dist/core/messages/pt/shared/plugin-core-messages.d.ts +2 -2
- package/dist/core/messages/pt/shared/plugin-core-messages.js +2 -2
- package/dist/core/messages/pt/shared/plugin-core-messages.js.map +1 -1
- package/dist/core/messages/pt/shared/plugin-registry-messages.d.ts +4 -4
- package/dist/core/messages/pt/shared/plugin-registry-messages.js +4 -4
- package/dist/core/messages/pt/shared/plugin-registry-messages.js.map +1 -1
- package/dist/core/messages/zh/analysts/archetypes-extra-messages.d.ts +2 -2
- package/dist/core/messages/zh/analysts/archetypes-extra-messages.js +2 -2
- package/dist/core/messages/zh/analysts/archetypes-extra-messages.js.map +1 -1
- package/dist/core/messages/zh/analysts/detector-clean-arch-messages.d.ts +4 -4
- package/dist/core/messages/zh/analysts/detector-clean-arch-messages.js +4 -4
- package/dist/core/messages/zh/analysts/detector-clean-arch-messages.js.map +1 -1
- package/dist/core/messages/zh/analysts/detector-js-ts-messages.d.ts +2 -2
- package/dist/core/messages/zh/analysts/detector-js-ts-messages.js +2 -2
- package/dist/core/messages/zh/analysts/detector-js-ts-messages.js.map +1 -1
- package/dist/core/messages/zh/analysts/map-reversion-extra-messages.d.ts +6 -6
- package/dist/core/messages/zh/analysts/map-reversion-extra-messages.js +6 -6
- package/dist/core/messages/zh/analysts/map-reversion-extra-messages.js.map +1 -1
- package/dist/core/messages/zh/analysts/report-github-actions-messages.d.ts +2 -2
- package/dist/core/messages/zh/analysts/report-github-actions-messages.js +2 -2
- package/dist/core/messages/zh/analysts/report-github-actions-messages.js.map +1 -1
- package/dist/core/messages/zh/analysts/scorer-messages.d.ts +45 -45
- package/dist/core/messages/zh/analysts/scorer-messages.js +49 -49
- package/dist/core/messages/zh/analysts/scorer-messages.js.map +1 -1
- package/dist/core/messages/zh/cli/cli-command-analysts-messages.d.ts +2 -2
- package/dist/core/messages/zh/cli/cli-command-analysts-messages.js +2 -2
- package/dist/core/messages/zh/cli/cli-command-analysts-messages.js.map +1 -1
- package/dist/core/messages/zh/cli/cli-command-convert-messages.d.ts +1 -1
- package/dist/core/messages/zh/cli/cli-command-convert-messages.js +1 -1
- package/dist/core/messages/zh/cli/cli-command-convert-messages.js.map +1 -1
- package/dist/core/messages/zh/cli/cli-command-format-messages.d.ts +1 -1
- package/dist/core/messages/zh/cli/cli-command-format-messages.js +1 -1
- package/dist/core/messages/zh/cli/cli-command-format-messages.js.map +1 -1
- package/dist/core/messages/zh/cli/cli-command-github-actions-messages.d.ts +1 -1
- package/dist/core/messages/zh/cli/cli-command-github-actions-messages.js +4 -4
- package/dist/core/messages/zh/cli/cli-command-github-actions-messages.js.map +1 -1
- package/dist/core/messages/zh/cli/cli-command-update-messages.d.ts +2 -2
- package/dist/core/messages/zh/cli/cli-command-update-messages.js +2 -2
- package/dist/core/messages/zh/cli/cli-command-update-messages.js.map +1 -1
- package/dist/core/messages/zh/cli/cli-flags-validator-messages.d.ts +3 -3
- package/dist/core/messages/zh/cli/cli-flags-validator-messages.js +3 -3
- package/dist/core/messages/zh/cli/cli-flags-validator-messages.js.map +1 -1
- package/dist/core/messages/zh/core/correcoes-messages.js +2 -2
- package/dist/core/messages/zh/core/correcoes-messages.js.map +1 -1
- package/dist/core/messages/zh/core/inquisitor-extra-messages.d.ts +2 -2
- package/dist/core/messages/zh/core/inquisitor-extra-messages.js +2 -2
- package/dist/core/messages/zh/core/inquisitor-extra-messages.js.map +1 -1
- package/dist/core/messages/zh/core/parser-extra-messages.d.ts +3 -3
- package/dist/core/messages/zh/core/parser-extra-messages.js +3 -3
- package/dist/core/messages/zh/core/parser-extra-messages.js.map +1 -1
- package/dist/core/messages/zh/guardian/guardian-messages.d.ts +2 -2
- package/dist/core/messages/zh/guardian/guardian-messages.js +2 -2
- package/dist/core/messages/zh/guardian/guardian-messages.js.map +1 -1
- package/dist/core/messages/zh/guardian/watcher-hidden-messages.d.ts +2 -2
- package/dist/core/messages/zh/guardian/watcher-hidden-messages.js +2 -2
- package/dist/core/messages/zh/guardian/watcher-hidden-messages.js.map +1 -1
- package/dist/core/messages/zh/log/log-helper.js.map +1 -1
- package/dist/core/messages/zh/reports/report-async-patterns-messages.d.ts +3 -3
- package/dist/core/messages/zh/reports/report-async-patterns-messages.js +3 -3
- package/dist/core/messages/zh/reports/report-async-patterns-messages.js.map +1 -1
- package/dist/core/messages/zh/shared/plugin-core-messages.d.ts +2 -2
- package/dist/core/messages/zh/shared/plugin-core-messages.js +2 -2
- package/dist/core/messages/zh/shared/plugin-core-messages.js.map +1 -1
- package/dist/core/messages/zh/shared/plugin-registry-messages.d.ts +4 -4
- package/dist/core/messages/zh/shared/plugin-registry-messages.js +4 -4
- package/dist/core/messages/zh/shared/plugin-registry-messages.js.map +1 -1
- package/dist/core/parsing/utils.d.ts +3 -3
- package/dist/core/workers/worker-pool.js +1 -1
- package/dist/core/workers/worker-pool.js.map +1 -1
- package/dist/guardian/baseline.js.map +1 -1
- package/dist/guardian/constants.js.map +1 -1
- package/dist/guardian/diff.js.map +1 -1
- package/dist/reports/analise-async-patterns.js +1 -1
- package/dist/reports/analise-async-patterns.js.map +1 -1
- package/dist/reports/filter-smart.js.map +1 -1
- package/dist/reports/report-caretaker-health.js +1 -1
- package/dist/reports/report-caretaker-health.js.map +1 -1
- package/dist/shared/plugins/init.js.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fix-config.js","sourceRoot":"","sources":["../../../../src/core/config/auto/fix-config.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport { otimizarSvgLikeSvgo, shouldSugerirOtimizacaoSvg } from '@shared/formatters';\n\nimport type { AutoFixConfig, PatternBasedQuickFix } from '@';\n\nimport { hasMinimumConfidence, isCategoryAllowed, shouldExcludeFile } from './auto-fix-config.js';\n// Re-exporta os tipos para compatibilidade\nexport type { PatternBasedQuickFix };\n// Small textual helpers used by some heuristics\nfunction _isInComment(match: RegExpMatchArray, fullCode: string): boolean {\n const lines = fullCode.split('\\n');\n const matchInicio = typeof match.index === 'number' ? match.index : fullCode.indexOf(match[0]);\n let pos = 0;\n for (let indice = 0; indice < lines.length; indice++) {\n const line = lines[indice];\n const lineInicio = pos;\n const lineFim = pos + line.length;\n if (matchInicio >= lineInicio && matchInicio <= lineFim) {\n const before = line.substring(0, Math.max(0, matchInicio - lineInicio));\n if (/\\/\\//.test(before)) return true;\n const blockInicio = fullCode.lastIndexOf('/*', matchInicio);\n const blockFim = fullCode.indexOf('*/', matchInicio);\n if (blockInicio !== -1 && (blockFim === -1 || blockFim > matchInicio)) return true;\n }\n pos = lineFim + 1;\n }\n return false;\n}\nfunction _isInTodoComment(match: RegExpMatchArray, fullCode: string): boolean {\n const lines = fullCode.split('\\n');\n const matchInicio = typeof match.index === 'number' ? match.index : fullCode.indexOf(match[0]);\n let pos = 0;\n for (let indice = 0; indice < lines.length; indice++) {\n const line = lines[indice];\n const lineInicio = pos;\n const lineFim = pos + line.length;\n if (matchInicio >= lineInicio && matchInicio <= lineFim) {\n if (/TODO|FIXME|XXX|HACK/i.test(line)) return true;\n }\n pos = lineFim + 1;\n }\n return false;\n}\nfunction _isCriticalSystemFile(fullCode: string): boolean {\n const criticalIndicators = ['SPDX-License-Identifier', '@core/configuracao', 'operario-estrutura', 'corretor-estrutura', 'config.js', 'executor.js', 'quick-fix-registry', 'mapa-reversao', 'persistence/persistencia'];\n return criticalIndicators.some(indice => fullCode.includes(indice));\n}\n// 🚨 REGISTRY SEGURO - APENAS QUICK FIXES QUE NÃO QUEBRAM CÓDIGO\nexport const quickCorrecaoRegistro: PatternBasedQuickFix[] = [\n// [OK] Quick fixes reintroduzidos de forma conservadora:\n// Começamos por SVGs, pois a transformação é determinística e segura.\n{\n id: 'svg-optimize-svgo-like',\n title: 'Otimizar SVG (Tutanus)',\n description: 'Remove prolog/doctype/comentários/metadata e colapsa whitespace entre tags para reduzir tamanho do SVG.',\n // Match único do arquivo inteiro\n pattern: /^[\\s\\S]+$/,\n category: 'performance',\n confidence: 95,\n shouldApply: (_match: RegExpMatchArray, fullCode: string, _lineContext: string, fileCaminho?: string): boolean => {\n // Aceita apenas SVGs (por path ou, como fallback, por conteúdo)\n const pareceSvg = /<svg\\b/i.test(fullCode);\n const isSvgCaminho = typeof fileCaminho === 'string' ? /\\.svg$/i.test(fileCaminho) : false;\n if (!isSvgCaminho && !pareceSvg) return false;\n const opt = otimizarSvgLikeSvgo({\n svg: fullCode\n });\n if (!opt.changed) return false;\n if (!shouldSugerirOtimizacaoSvg(opt.originalBytes, opt.optimizedBytes)) return false;\n return true;\n },\n fix: (_match: RegExpMatchArray, fullCode: string): string => {\n const opt = otimizarSvgLikeSvgo({\n svg: fullCode\n });\n return opt.data;\n }\n}, {\n id: 'svg-add-viewbox-safe',\n title: 'Adicionar viewBox (quando seguro)',\n description: 'Quando o SVG tem width/height numéricos e não tem viewBox, adiciona viewBox=\"0 0 width height\".',\n pattern: /^[\\s\\S]+$/,\n category: 'performance',\n confidence: 92,\n shouldApply: (_match: RegExpMatchArray, fullCode: string, _lineContext: string, fileCaminho?: string): boolean => {\n const pareceSvg = /<svg\\b/i.test(fullCode);\n const isSvgCaminho = typeof fileCaminho === 'string' ? /\\.svg$/i.test(fileCaminho) : false;\n if (!isSvgCaminho && !pareceSvg) return false;\n if (/\\bviewBox\\s*=\\s*['\"][^'\"]+['\"]/i.test(fullCode)) return false;\n // Só aplica quando width/height são numéricos (ou px), evitando %/em/etc.\n const width = fullCode.match(/\\bwidth\\s*=\\s*['\"]([^'\"]+)['\"]/i)?.[1] ?? '';\n const height = fullCode.match(/\\bheight\\s*=\\s*['\"]([^'\"]+)['\"]/i)?.[1] ?? '';\n const parse = (valor: string): number | null => {\n const metrica = /^\\s*(\\d+(?:\\.\\d+)?)(?:px)?\\s*$/i.exec(valor);\n return metrica ? Number(metrica[1]) : null;\n };\n const dimensaoLargura = parse(width);\n const hash = parse(height);\n return dimensaoLargura !== null && hash !== null && dimensaoLargura > 0 && hash > 0;\n },\n fix: (_match: RegExpMatchArray, fullCode: string): string => {\n // Insere viewBox no start tag do SVG\n const tagMatch = /<svg\\b[^>]*>/i.exec(fullCode);\n if (!tagMatch) return fullCode;\n const tag = tagMatch[0];\n if (/\\bviewBox\\s*=\\s*['\"][^'\"]+['\"]/i.test(tag)) return fullCode;\n const width = fullCode.match(/\\bwidth\\s*=\\s*['\"]([^'\"]+)['\"]/i)?.[1] ?? '';\n const height = fullCode.match(/\\bheight\\s*=\\s*['\"]([^'\"]+)['\"]/i)?.[1] ?? '';\n const parse = (valor: string): string | null => {\n const metrica = /^\\s*(\\d+(?:\\.\\d+)?)(?:px)?\\s*$/i.exec(valor);\n return metrica ? metrica[1] : null;\n };\n const dimensaoLargura = parse(width);\n const hash = parse(height);\n if (!dimensaoLargura || !hash) return fullCode;\n const viewBoxAttr = ` viewBox=\"0 0 ${dimensaoLargura} ${hash}\"`;\n const updatedTag = tag.replace(/<svg\\b/i, `<svg${viewBoxAttr}`);\n return fullCode.replace(tag, updatedTag);\n }\n}];\nexport function findQuickFixes(code: string, problemTipo?: string, config?: AutoFixConfig, fileCaminho?: string): Array<PatternBasedQuickFix & {\n matches: RegExpMatchArray[];\n}> {\n const results: Array<PatternBasedQuickFix & {\n matches: RegExpMatchArray[];\n }> = [];\n if (config && fileCaminho && shouldExcludeFile(fileCaminho, config)) return results;\n for (const fix of quickCorrecaoRegistro) {\n if (config && !isCategoryAllowed(fix.category, config)) continue;\n if (config && !hasMinimumConfidence(fix.confidence, config)) continue;\n if (problemTipo && !fix.id.includes(problemTipo)) continue;\n const matches: RegExpMatchArray[] = [];\n fix.pattern.lastIndex = 0;\n let match: RegExpMatchArray | null;\n while ((match = fix.pattern.exec(code)) !== null) {\n if (fix.shouldApply) {\n const lines = code.split('\\n');\n const matchPos = match.index ?? 0;\n const linesBefore = code.substring(0, matchPos).split('\\n');\n const lineContext = lines[linesBefore.length - 1] || '';\n const ok = fix.shouldApply(match, code, lineContext, fileCaminho);\n if (!ok) {\n if (!fix.pattern.global) break;\n continue;\n }\n }\n matches.push(match);\n if (config && typeof config.maxFixesPerArquivo === 'number' && matches.length >= config.maxFixesPerArquivo) break;\n if (!fix.pattern.global) break;\n }\n if (matches.length > 0) results.push({\n ...fix,\n matches\n });\n }\n return results;\n}\nexport function applyQuickFix(code: string, fix: PatternBasedQuickFix, match: RegExpMatchArray): string {\n return fix.fix(match, code);\n}"]}
|
|
1
|
+
{"version":3,"file":"fix-config.js","sourceRoot":"","sources":["../../../../src/core/config/auto/fix-config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAIrF,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAIlG,SAAS,YAAY,CAAC,KAAuB,EAAE,QAAgB;IAC7D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/F,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,UAAU,GAAG,GAAG,CAAC;QACvB,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;QAClC,IAAI,WAAW,IAAI,UAAU,IAAI,WAAW,IAAI,OAAO,EAAE,CAAC;YACxD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC;YACxE,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;gBAAE,OAAO,IAAI,CAAC;YACrC,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC5D,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACrD,IAAI,WAAW,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC,IAAI,QAAQ,GAAG,WAAW,CAAC;gBAAE,OAAO,IAAI,CAAC;QACrF,CAAC;QACD,GAAG,GAAG,OAAO,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AACD,SAAS,gBAAgB,CAAC,KAAuB,EAAE,QAAgB;IACjE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/F,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,UAAU,GAAG,GAAG,CAAC;QACvB,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;QAClC,IAAI,WAAW,IAAI,UAAU,IAAI,WAAW,IAAI,OAAO,EAAE,CAAC;YACxD,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;QACrD,CAAC;QACD,GAAG,GAAG,OAAO,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AACD,SAAS,qBAAqB,CAAC,QAAgB;IAC7C,MAAM,kBAAkB,GAAG,CAAC,yBAAyB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,WAAW,EAAE,aAAa,EAAE,oBAAoB,EAAE,eAAe,EAAE,0BAA0B,CAAC,CAAC;IACxN,OAAO,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAA2B;IAG7D;QACE,EAAE,EAAE,wBAAwB;QAC5B,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,yGAAyG;QAEtH,OAAO,EAAE,WAAW;QACpB,QAAQ,EAAE,aAAa;QACvB,UAAU,EAAE,EAAE;QACd,WAAW,EAAE,CAAC,MAAwB,EAAE,QAAgB,EAAE,YAAoB,EAAE,WAAoB,EAAW,EAAE;YAE/G,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3C,MAAM,YAAY,GAAG,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAC3F,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS;gBAAE,OAAO,KAAK,CAAC;YAC9C,MAAM,GAAG,GAAG,mBAAmB,CAAC;gBAC9B,GAAG,EAAE,QAAQ;aACd,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,OAAO;gBAAE,OAAO,KAAK,CAAC;YAC/B,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,cAAc,CAAC;gBAAE,OAAO,KAAK,CAAC;YACrF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,GAAG,EAAE,CAAC,MAAwB,EAAE,QAAgB,EAAU,EAAE;YAC1D,MAAM,GAAG,GAAG,mBAAmB,CAAC;gBAC9B,GAAG,EAAE,QAAQ;aACd,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,IAAI,CAAC;QAClB,CAAC;KACF,EAAE;QACD,EAAE,EAAE,sBAAsB;QAC1B,KAAK,EAAE,mCAAmC;QAC1C,WAAW,EAAE,iGAAiG;QAC9G,OAAO,EAAE,WAAW;QACpB,QAAQ,EAAE,aAAa;QACvB,UAAU,EAAE,EAAE;QACd,WAAW,EAAE,CAAC,MAAwB,EAAE,QAAgB,EAAE,YAAoB,EAAE,WAAoB,EAAW,EAAE;YAC/G,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3C,MAAM,YAAY,GAAG,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAC3F,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS;gBAAE,OAAO,KAAK,CAAC;YAC9C,IAAI,iCAAiC,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAAE,OAAO,KAAK,CAAC;YAEnE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,iCAAiC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3E,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,kCAAkC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7E,MAAM,KAAK,GAAG,CAAC,KAAa,EAAiB,EAAE;gBAC7C,MAAM,OAAO,GAAG,iCAAiC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC9D,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7C,CAAC,CAAC;YACF,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3B,OAAO,eAAe,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,eAAe,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;QACtF,CAAC;QACD,GAAG,EAAE,CAAC,MAAwB,EAAE,QAAgB,EAAU,EAAE;YAE1D,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChD,IAAI,CAAC,QAAQ;gBAAE,OAAO,QAAQ,CAAC;YAC/B,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,iCAAiC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,OAAO,QAAQ,CAAC;YACjE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,iCAAiC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3E,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,kCAAkC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7E,MAAM,KAAK,GAAG,CAAC,KAAa,EAAiB,EAAE;gBAC7C,MAAM,OAAO,GAAG,iCAAiC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC9D,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACrC,CAAC,CAAC;YACF,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3B,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI;gBAAE,OAAO,QAAQ,CAAC;YAC/C,MAAM,WAAW,GAAG,iBAAiB,eAAe,IAAI,IAAI,GAAG,CAAC;YAChE,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,WAAW,EAAE,CAAC,CAAC;YAChE,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC3C,CAAC;KACF;CAAC,CAAC;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,WAAoB,EAAE,MAAsB,EAAE,WAAoB;IAG7G,MAAM,OAAO,GAER,EAAE,CAAC;IACR,IAAI,MAAM,IAAI,WAAW,IAAI,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC;QAAE,OAAO,OAAO,CAAC;IACpF,KAAK,MAAM,GAAG,IAAI,qBAAqB,EAAE,CAAC;QACxC,IAAI,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;YAAE,SAAS;QACjE,IAAI,MAAM,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC;YAAE,SAAS;QACtE,IAAI,WAAW,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;YAAE,SAAS;QAC3D,MAAM,OAAO,GAAuB,EAAE,CAAC;QACvC,GAAG,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QAC1B,IAAI,KAA8B,CAAC;QACnC,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACjD,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;gBACpB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;gBAClC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC5D,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBACxD,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;gBAClE,IAAI,CAAC,EAAE,EAAE,CAAC;oBACR,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM;wBAAE,MAAM;oBAC/B,SAAS;gBACX,CAAC;YACH,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,kBAAkB,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,kBAAkB;gBAAE,MAAM;YAClH,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM;gBAAE,MAAM;QACjC,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC;gBACnC,GAAG,GAAG;gBACN,OAAO;aACR,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AACD,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,GAAyB,EAAE,KAAuB;IAC5F,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC9B,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\nimport { otimizarSvgLikeSvgo, shouldSugerirOtimizacaoSvg } from '@shared/formatters';\n\nimport type { AutoFixConfig, PatternBasedQuickFix } from '@';\n\nimport { hasMinimumConfidence, isCategoryAllowed, shouldExcludeFile } from './auto-fix-config.js';\n// Re-exporta os tipos para compatibilidade\nexport type { PatternBasedQuickFix };\n// Small textual helpers used by some heuristics\nfunction _isInComment(match: RegExpMatchArray, fullCode: string): boolean {\n const lines = fullCode.split('\\n');\n const matchInicio = typeof match.index === 'number' ? match.index : fullCode.indexOf(match[0]);\n let pos = 0;\n for (let indice = 0; indice < lines.length; indice++) {\n const line = lines[indice];\n const lineInicio = pos;\n const lineFim = pos + line.length;\n if (matchInicio >= lineInicio && matchInicio <= lineFim) {\n const before = line.substring(0, Math.max(0, matchInicio - lineInicio));\n if (/\\/\\//.test(before)) return true;\n const blockInicio = fullCode.lastIndexOf('/*', matchInicio);\n const blockFim = fullCode.indexOf('*/', matchInicio);\n if (blockInicio !== -1 && (blockFim === -1 || blockFim > matchInicio)) return true;\n }\n pos = lineFim + 1;\n }\n return false;\n}\nfunction _isInTodoComment(match: RegExpMatchArray, fullCode: string): boolean {\n const lines = fullCode.split('\\n');\n const matchInicio = typeof match.index === 'number' ? match.index : fullCode.indexOf(match[0]);\n let pos = 0;\n for (let indice = 0; indice < lines.length; indice++) {\n const line = lines[indice];\n const lineInicio = pos;\n const lineFim = pos + line.length;\n if (matchInicio >= lineInicio && matchInicio <= lineFim) {\n if (/TODO|FIXME|XXX|HACK/i.test(line)) return true;\n }\n pos = lineFim + 1;\n }\n return false;\n}\nfunction _isCriticalSystemFile(fullCode: string): boolean {\n const criticalIndicators = ['SPDX-License-Identifier', '@core/configuracao', 'operario-estrutura', 'corretor-estrutura', 'config.js', 'executor.js', 'quick-fix-registry', 'mapa-reversao', 'persistence/persistencia'];\n return criticalIndicators.some(indice => fullCode.includes(indice));\n}\n// [ALERT] REGISTRY SEGURO - APENAS QUICK FIXES QUE NÃO QUEBRAM CÓDIGO\nexport const quickCorrecaoRegistro: PatternBasedQuickFix[] = [\n// [OK] Quick fixes reintroduzidos de forma conservadora:\n// Começamos por SVGs, pois a transformação é determinística e segura.\n{\n id: 'svg-optimize-svgo-like',\n title: 'Otimizar SVG (Tutanus)',\n description: 'Remove prolog/doctype/comentários/metadata e colapsa whitespace entre tags para reduzir tamanho do SVG.',\n // Match único do arquivo inteiro\n pattern: /^[\\s\\S]+$/,\n category: 'performance',\n confidence: 95,\n shouldApply: (_match: RegExpMatchArray, fullCode: string, _lineContext: string, fileCaminho?: string): boolean => {\n // Aceita apenas SVGs (por path ou, como fallback, por conteúdo)\n const pareceSvg = /<svg\\b/i.test(fullCode);\n const isSvgCaminho = typeof fileCaminho === 'string' ? /\\.svg$/i.test(fileCaminho) : false;\n if (!isSvgCaminho && !pareceSvg) return false;\n const opt = otimizarSvgLikeSvgo({\n svg: fullCode\n });\n if (!opt.changed) return false;\n if (!shouldSugerirOtimizacaoSvg(opt.originalBytes, opt.optimizedBytes)) return false;\n return true;\n },\n fix: (_match: RegExpMatchArray, fullCode: string): string => {\n const opt = otimizarSvgLikeSvgo({\n svg: fullCode\n });\n return opt.data;\n }\n}, {\n id: 'svg-add-viewbox-safe',\n title: 'Adicionar viewBox (quando seguro)',\n description: 'Quando o SVG tem width/height numéricos e não tem viewBox, adiciona viewBox=\"0 0 width height\".',\n pattern: /^[\\s\\S]+$/,\n category: 'performance',\n confidence: 92,\n shouldApply: (_match: RegExpMatchArray, fullCode: string, _lineContext: string, fileCaminho?: string): boolean => {\n const pareceSvg = /<svg\\b/i.test(fullCode);\n const isSvgCaminho = typeof fileCaminho === 'string' ? /\\.svg$/i.test(fileCaminho) : false;\n if (!isSvgCaminho && !pareceSvg) return false;\n if (/\\bviewBox\\s*=\\s*['\"][^'\"]+['\"]/i.test(fullCode)) return false;\n // Só aplica quando width/height são numéricos (ou px), evitando %/em/etc.\n const width = fullCode.match(/\\bwidth\\s*=\\s*['\"]([^'\"]+)['\"]/i)?.[1] ?? '';\n const height = fullCode.match(/\\bheight\\s*=\\s*['\"]([^'\"]+)['\"]/i)?.[1] ?? '';\n const parse = (valor: string): number | null => {\n const metrica = /^\\s*(\\d+(?:\\.\\d+)?)(?:px)?\\s*$/i.exec(valor);\n return metrica ? Number(metrica[1]) : null;\n };\n const dimensaoLargura = parse(width);\n const hash = parse(height);\n return dimensaoLargura !== null && hash !== null && dimensaoLargura > 0 && hash > 0;\n },\n fix: (_match: RegExpMatchArray, fullCode: string): string => {\n // Insere viewBox no start tag do SVG\n const tagMatch = /<svg\\b[^>]*>/i.exec(fullCode);\n if (!tagMatch) return fullCode;\n const tag = tagMatch[0];\n if (/\\bviewBox\\s*=\\s*['\"][^'\"]+['\"]/i.test(tag)) return fullCode;\n const width = fullCode.match(/\\bwidth\\s*=\\s*['\"]([^'\"]+)['\"]/i)?.[1] ?? '';\n const height = fullCode.match(/\\bheight\\s*=\\s*['\"]([^'\"]+)['\"]/i)?.[1] ?? '';\n const parse = (valor: string): string | null => {\n const metrica = /^\\s*(\\d+(?:\\.\\d+)?)(?:px)?\\s*$/i.exec(valor);\n return metrica ? metrica[1] : null;\n };\n const dimensaoLargura = parse(width);\n const hash = parse(height);\n if (!dimensaoLargura || !hash) return fullCode;\n const viewBoxAttr = ` viewBox=\"0 0 ${dimensaoLargura} ${hash}\"`;\n const updatedTag = tag.replace(/<svg\\b/i, `<svg${viewBoxAttr}`);\n return fullCode.replace(tag, updatedTag);\n }\n}];\nexport function findQuickFixes(code: string, problemTipo?: string, config?: AutoFixConfig, fileCaminho?: string): Array<PatternBasedQuickFix & {\n matches: RegExpMatchArray[];\n}> {\n const results: Array<PatternBasedQuickFix & {\n matches: RegExpMatchArray[];\n }> = [];\n if (config && fileCaminho && shouldExcludeFile(fileCaminho, config)) return results;\n for (const fix of quickCorrecaoRegistro) {\n if (config && !isCategoryAllowed(fix.category, config)) continue;\n if (config && !hasMinimumConfidence(fix.confidence, config)) continue;\n if (problemTipo && !fix.id.includes(problemTipo)) continue;\n const matches: RegExpMatchArray[] = [];\n fix.pattern.lastIndex = 0;\n let match: RegExpMatchArray | null;\n while ((match = fix.pattern.exec(code)) !== null) {\n if (fix.shouldApply) {\n const lines = code.split('\\n');\n const matchPos = match.index ?? 0;\n const linesBefore = code.substring(0, matchPos).split('\\n');\n const lineContext = lines[linesBefore.length - 1] || '';\n const ok = fix.shouldApply(match, code, lineContext, fileCaminho);\n if (!ok) {\n if (!fix.pattern.global) break;\n continue;\n }\n }\n matches.push(match);\n if (config && typeof config.maxFixesPerArquivo === 'number' && matches.length >= config.maxFixesPerArquivo) break;\n if (!fix.pattern.global) break;\n }\n if (matches.length > 0) results.push({\n ...fix,\n matches\n });\n }\n return results;\n}\nexport function applyQuickFix(code: string, fix: PatternBasedQuickFix, match: RegExpMatchArray): string {\n return fix.fix(match, code);\n}"]}
|
|
@@ -145,7 +145,7 @@ export async function executarInquisicao(fileEntriesComAst, tecnicas, baseDir, g
|
|
|
145
145
|
const err = error instanceof Error ? error : new Error(String(error));
|
|
146
146
|
const isTempoLimite = err.message.includes('Timeout: analista global');
|
|
147
147
|
const nivelLog = isTempoLimite ? 'aviso' : 'erro';
|
|
148
|
-
const prefixo = isTempoLimite ? '
|
|
148
|
+
const prefixo = isTempoLimite ? '[CLOCK]' : '[ERRO]';
|
|
149
149
|
if (nivelLog === 'aviso') {
|
|
150
150
|
log.aviso(`${prefixo} ${err.message}`);
|
|
151
151
|
}
|
|
@@ -373,7 +373,7 @@ export async function executarInquisicao(fileEntriesComAst, tecnicas, baseDir, g
|
|
|
373
373
|
});
|
|
374
374
|
}
|
|
375
375
|
catch (err) {
|
|
376
|
-
log.aviso(
|
|
376
|
+
log.aviso(`[CLOCK] Falha na travessia otimizada para ${entry.relPath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
377
377
|
}
|
|
378
378
|
}
|
|
379
379
|
for (const tecnica of tecnicas) {
|
|
@@ -415,7 +415,7 @@ export async function executarInquisicao(fileEntriesComAst, tecnicas, baseDir, g
|
|
|
415
415
|
const ocorrenciasContagem = Array.isArray(resultado) ? resultado.length : resultado ? 1 : 0;
|
|
416
416
|
logAnalistas.concluido(tecnica.nome || 'analista-desconhecido', entry.relPath, ocorrenciasContagem, duracaoMs);
|
|
417
417
|
if (detalharPorArquivo) {
|
|
418
|
-
log.info(
|
|
418
|
+
log.info(`[FILE] '${tecnica.nome}' analisou ${entry.relPath} em ${formatMs(duracaoMs)}`);
|
|
419
419
|
}
|
|
420
420
|
if (config.LOG_ESTRUTURADO) {
|
|
421
421
|
log.info(JSON.stringify({
|
|
@@ -431,7 +431,7 @@ export async function executarInquisicao(fileEntriesComAst, tecnicas, baseDir, g
|
|
|
431
431
|
const err = error instanceof Error ? error : new Error(String(error));
|
|
432
432
|
const isTempoLimite = err.message.includes('Timeout: analista');
|
|
433
433
|
const nivelLog = isTempoLimite ? 'aviso' : 'erro';
|
|
434
|
-
const prefixo = isTempoLimite ? '
|
|
434
|
+
const prefixo = isTempoLimite ? '[CLOCK]' : '[ERRO]';
|
|
435
435
|
if (isTempoLimite) {
|
|
436
436
|
const duracaoEstimada = config.ANALISE_TIMEOUT_POR_ANALISTA_MS || 30000;
|
|
437
437
|
logAnalistas.timeout(tecnica.nome || 'analista-desconhecido', duracaoEstimada);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/core/execution/executor.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,GAAG,MAAM,UAAU,CAAC;AAG3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,GAAG,CAAC;AAG3C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,EACJ,GAAG,EACH,OAAO,EACP,sBAAsB,EACtB,YAAY,EACb,GAAG,QAAQ,CAAC;AAGb,KAAK,UAAU,WAAW,CAAI,KAAqB,EAAE,SAAiB,EAAE,YAAoB;IAC1F,IAAI,KAAK,GAAyC,IAAI,CAAC;IACvD,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;YACtB,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC/B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACvE,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAOD,SAAS,aAAa;IACpB,OAAO,UAAyC,CAAC;AACnD,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,QAAyB;IAC3D,MAAM,gBAAgB,GAAG,MAAM,CAAC,+BAA+B,CAAC;IAChE,IAAI,CAAC,gBAAgB;QAAE,OAAO;IAE9B,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAU,gBAAgB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAe,CAAC,CAAC;IACzF,MAAM,KAAK,GAAwB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAA+B,CAAC,CAAC,CAAC,EAAE,CAAC;IAClG,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,8BAA8B,IAAI,GAAG,CAAC;IACzD,MAAM,YAAY,CAAC,gBAAgB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,SAAS,GAAG,GAAwE,CAAC;IAC3F,IAAI,OAAO,SAAS,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;QACjD,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AACD,SAAS,gBAAgB,CAAC,QAAmB;IAC3C,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAuD,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;IAC/G,MAAM,gBAAgB,GAA4B,EAAE,CAAC;IACrD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,gBAAgB,CAAC;IACrD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,SAAS;QAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3B,gBAAgB,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;gBACnC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAa,EAAE,KAAc,EAAE,EAAE;oBACxD,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;wBAC/B,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBACpB,CAAC;yBAAM,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;wBACnG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBAC1B,CAAC;oBACD,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;wBAC9B,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBACnB,CAAC;yBAAM,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;wBAC/F,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,iBAAqC,EAAE,QAAmB,EAAE,OAAe,EAAE,iBAAiC,EAAE,IAWxJ;IACC,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,MAAM,iBAAiB,GAAsB,EAAE,CAAC;IAChD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,IAAI,EAAE,MAAM,CAAC;IAC7B,MAAM,YAAY,GAAG,IAAI,EAAE,YAAY,CAAC;IACxC,MAAM,cAAc,GAAG,CAAC,GAAG,KAAmB,EAAE,EAAE;QAChD,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QAC3B,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,YAAY,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,MAAM,kBAAkB,GAAqB;QAC3C,OAAO;QACP,QAAQ,EAAE,iBAAiB;QAC3B,QAAQ,EAAE;YACR,kBAAkB;YAClB,QAAQ,EAAE,iBAAiB;SAC5B;KACF,CAAC;IACF,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;IACzC,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAIzC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;IAE1C,SAAS,WAAW,CAAC,CAAU;QAC7B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACtD,MAAM,KAAK,GAAG,CAAuB,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAChE,OAAO,MAAM,IAAK,KAAK,CAAC,IAAgC,CAAC;IAC3D,CAAC;IAED,KAAK,UAAU,uBAAuB,CACpC,QAAmB,EACnB,GAAqB,EACrB,MAAwC,EACxC,WAA8B,EAC9B,IAA4B;QAE5B,MAAM,SAAS,GAAG,MAAM,CAAC,+BAA+B,CAAC;QACzD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,SAAS;YAC9B,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBACzC,MAAM,MAAM,GAAG,SAAS,GAAG,CAAC;oBAC1B,CAAC,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,SAAS,EACxE,sBAAsB,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,cAAc,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;oBACnI,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;gBACxD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;oBAAE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;gBAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;gBACrD,IAAI,MAAM,CAAC,wBAAwB,EAAE,CAAC;oBACpC,WAAW,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,cAAc;wBACpC,SAAS;wBACT,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACnE,MAAM,EAAE,IAAI;qBACb,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,IAAI,EAAE,OAAO;oBAAE,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,cAAc,CAAC,CAAC,CAAC;gBACvH,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;gBAChJ,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtE,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;gBACvE,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;gBAClD,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAC/C,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACzB,GAAG,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,IAAI,sBAAsB,CAAC,iBAAiB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,cAAc,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAClL,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACpD,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;wBAC5C,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACtB,CAAC;gBACH,CAAC;gBACD,MAAM,CAAC,sBAAsB,CAAC;oBAC5B,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,8BAA8B,OAAO,CAAC,IAAI,MAAM,SAAS,aAAa,CAAC,CAAC,CAAC,4BAA4B,OAAO,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE;oBAC9J,OAAO,EAAE,mBAAmB;oBAC5B,MAAM,EAAE,OAAO,CAAC,IAAI;oBACpB,KAAK,EAAE,CAAC,aAAa,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;iBAC3D,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC;IACH,CAAC;IAGD,IAAI,iBAAiB,GAA6B,IAAI,CAAC;IACvD,IAAI,MAAM,CAAC,2BAA2B,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,SAAS,CAAoB,MAAM,CAAC,8BAA8B,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACzG,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,2BAA2B;YAAE,iBAAiB,GAAG,IAAI,CAAC;IAC3F,CAAC;IACD,MAAM,UAAU,GAAsB;QACpC,MAAM,EAAE,MAAM,CAAC,2BAA2B;QAC1C,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE;YACZ,sBAAsB,EAAE,CAAC;YACzB,wBAAwB,EAAE,CAAC;YAC3B,eAAe,EAAE,CAAC;SACnB;KACF,CAAC;IACF,SAAS,YAAY,CAAC,IAAY;QAChC,IAAI,CAAC;YAEH,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YAIP,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,MAAM,uBAAuB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;IAErG,KAAK,UAAU,mBAAmB;QAChC,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC;YACxB,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,MAAM,CAAC,uBAAuB,IAAI,SAAS;YACvD,SAAS,EAAE,EAAE;YACb,SAAS,EAAE,MAAM,CAAC,+BAA+B;SAClD,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,YAAY,CACrC,iBAAiB,EACjB,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAC/B,kBAAkB,CACnB,CAAC;QACF,cAAc,CAAC,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;QACzC,iBAAiB,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;QACnD,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,sBAAsB,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAE3J,IAAI,MAAM,CAAC,2BAA2B,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;oBACtC,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;oBAC/C,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,CAAC;gBACxF,CAAC;gBACD,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;oBAC5B,UAAU,CAAC,YAAY,CAAC,wBAAwB,GAAG,iBAAiB,CAAC,MAAM,CAAC;oBAC5E,UAAU,CAAC,YAAY,CAAC,eAAe,GAAG,OAAO,CAAC;gBACpD,CAAC;gBACD,MAAM,YAAY,CAAC,MAAM,CAAC,8BAA8B,EAAE,UAAU,CAAC,CAAC;YACxE,CAAC;YAAC,MAAM,CAAC,CAAmC,CAAC;QAC/C,CAAC;QAED,MAAM,gBAAgB,GAAoB;YACxC,aAAa,EAAE,iBAAiB,CAAC,MAAM;YACvC,UAAU,EAAE,OAAO;YACnB,sBAAsB,EAAE,WAAW,CAAC,MAAM;YAC1C,SAAS,EAAE,iBAAiB;YAC5B,UAAU,EAAE,EAAE,aAAa,EAAE,SAAS,CAAC,cAAc,EAAE,cAAc,EAAE,SAAS,CAAC,QAAQ,EAAE;SAC5F,CAAC;QACF,MAAM,aAAa,GAAwB;YACzC,aAAa,EAAE,iBAAiB,CAAC,MAAM;YACvC,kBAAkB,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACzD,WAAW;YACX,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS,EAAE,OAAO;YAClB,QAAQ,EAAE,gBAAgB;SAC3B,CAAC;QACF,IAAI,OAAO;YAAE,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC;QAC9D,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE;QAC3B,IAAI,IAAI,EAAE,UAAU;YAAE,OAAO,KAAK,CAAC;QACnC,IAAI,IAAI,EAAE,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;QAC/C,OAAO,MAAM,CAAC,mBAAmB,IAAI,iBAAiB,CAAC,MAAM,GAAG,MAAM,CAAC,0BAA0B,CAAC;IACpG,CAAC,CAAC,EAAE,CAAC;IAEL,IAAI,cAAc,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,OAAO,mBAAmB,EAAE,CAAC;IAC/B,CAAC;IAGD,MAAM,cAAc,GAAqB;QACvC,GAAG,kBAAkB;QACrB,MAAM,EAAE,KAAK,CAAC,EAAE;YACd,IAAI,CAAC;gBACH,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,IAAI,EAAE,CAAC;gBAEd,cAAc,CAAC,sBAAsB,CAAC;oBACpC,QAAQ,EAAE,sBAAsB,IAAI,YAAY,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;oBACrF,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,UAAU;oBACrC,MAAM,EAAE,UAAU;iBACnB,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC;KACF,CAAC;IAEF,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACpD,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,MAAM,aAAa,GAAG,iBAAiB,CAAC,MAAM,CAAC;IAE/C,MAAM,oBAAoB,GAAG,GAAG,CAAC;IACjC,MAAM,2BAA2B,GAAG,GAAG,CAAC;IAGxC,SAAS,UAAU,CAAC,KAAa;QAE/B,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,CAAC,CAAC;QAC3B,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC;IACb,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;IACjD,MAAM,WAAW,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAC9C,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC,IAAI,aAAa,IAAI,oBAAoB,CAAC;IAC7F,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC,IAAI,aAAa,IAAI,2BAA2B,CAAC;IAGnG,YAAY,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;IAGzC,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE1D,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;QACtC,YAAY,EAAE,CAAC;QACf,oBAAoB,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;YAClB,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;gBACnC,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YAChG,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;YAEzB,IAAI,iBAAiB,EAAE,CAAC;gBACtB,IAAI,YAAY,KAAK,CAAC,IAAI,YAAY,GAAG,WAAW,KAAK,CAAC,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;oBAC7F,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;oBAClD,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC/L,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,YAAY,KAAK,CAAC,IAAI,YAAY,GAAG,WAAW,KAAK,CAAC,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;oBAC7F,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBAChI,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,YAAY,GAAG,EAAE,KAAK,CAAC,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;YAErE,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;gBACnC,YAAY,CAAC,sBAAsB,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YACpI,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,KAA8B,EAAE,GAAG,CAAC,CAAC;QACvF,MAAM,UAAU,GAAG,UAAU,IAAI,KAAK,CAAC,GAAG,CAAC;QAE3C,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,aAAa,GAAG,iBAAiB,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,MAAM,CAAC,2BAA2B,IAAI,aAAa,EAAE,CAAC;YACxD,IAAI,aAAa,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBAEhC,YAAY,GAAG,IAAI,CAAC;YACtB,CAAC;iBAAM,IAAI,aAAa,CAAC,cAAc,EAAE,CAAC;gBAExC,MAAM,cAAc,GAAG,sBAAsB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBACpE,IAAI,cAAc,IAAI,cAAc,KAAK,aAAa,CAAC,cAAc,EAAE,CAAC;oBACtE,YAAY,GAAG,IAAI,CAAC;oBACpB,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;wBAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBACjF,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,YAAY,EAAE,CAAC;gBACjB,cAAc,CAAC,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;gBAC7C,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,CAAC,cAAc,EAAE,CAAC;gBAC9G,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,kBAAkB,GAAG,CAAC,aAAa,CAAC,kBAAkB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACpG,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;oBAC5B,UAAU,CAAC,YAAY,CAAC,sBAAsB,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,sBAAsB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC7G,CAAC;gBACD,IAAI,kBAAkB;oBAAE,OAAO,CAAC,wBAAwB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACxE,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;wBACtB,IAAI,EAAE,mBAAmB;wBACzB,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,WAAW,EAAE,aAAa,CAAC,WAAW,CAAC,MAAM;qBAC9C,CAAC,CAAC,CAAC;gBACN,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,YAAY;YAAE,SAAS;QAG3B,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAC3E,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,cAAc,CAAC,GAAG,MAAM,CAAC,CAAC;gBAC1B,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG;oBACnC,IAAI;oBACJ,WAAW,EAAE,MAAM;oBACnB,kBAAkB,EAAE,CAAC;iBACtB,CAAC;gBACF,IAAI,kBAAkB;oBAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;gBAC9F,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACxG,CAAC;gBACD,SAAS;YACX,CAAC;QACH,CAAC;QAGD,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;gBACxE,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE;oBAC9C,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,QAAQ,EAAE,cAAc;oBACxB,UAAU,EAAE,oBAAoB;iBACjC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,KAAK,CAAC,uCAAuC,KAAK,CAAC,OAAO,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzH,CAAC;QACH,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,MAAM;gBAAE,SAAS;YAC7B,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;gBAAE,SAAS;YAE3D,MAAM,SAAS,GAAG,MAAM,CAAC,+BAA+B,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBAGzC,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnF,YAAY,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,IAAI,uBAAuB,EAAE,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;gBAEvG,IAAI,SAAkE,CAAC;gBACvE,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBACjE,MAAM,UAAU,GAAG,SAAS,IAAI,OAAO,CAAC;gBACxC,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC;oBAC5B,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;iBACoB,CAAC,CAAC,CAAC,IAAI,CAAC;gBACvF,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;gBACrH,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;oBAClB,SAAS,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,SAAS,EAClD,sBAAsB,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,cAAc,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC1K,CAAC;qBAAM,CAAC;oBACN,SAAS,GAAG,MAAM,WAAW,CAAC;gBAChC,CAAC;gBACD,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7B,cAAc,CAAC,GAAG,SAAS,CAAC,CAAC;gBAC/B,CAAC;gBACD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;gBACrD,IAAI,MAAM,CAAC,wBAAwB,EAAE,CAAC;oBACpC,iBAAiB,CAAC,IAAI,CAAC;wBACrB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,cAAc;wBACpC,SAAS;wBACT,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC5E,MAAM,EAAE,KAAK;qBACd,CAAC,CAAC;gBACL,CAAC;gBAGD,MAAM,mBAAmB,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5F,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,IAAI,uBAAuB,EAAE,KAAK,CAAC,OAAO,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAC;gBAC/G,IAAI,kBAAkB,EAAE,CAAC;oBACvB,GAAG,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,IAAI,cAAc,KAAK,CAAC,OAAO,OAAO,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBACvF,CAAC;gBACD,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;wBACtB,IAAI,EAAE,UAAU;wBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,SAAS;wBACT,WAAW,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW;qBACnD,CAAC,CAAC,CAAC;gBACN,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtE,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;gBAChE,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;gBAClD,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAG/C,IAAI,aAAa,EAAE,CAAC;oBAClB,MAAM,eAAe,GAAG,MAAM,CAAC,+BAA+B,IAAI,KAAK,CAAC;oBACxE,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,uBAAuB,EAAE,eAAe,CAAC,CAAC;gBACjF,CAAC;qBAAM,CAAC;oBACN,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,uBAAuB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC1E,CAAC;gBAGD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACzB,GAAG,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,aAAa,OAAO,CAAC,IAAI,UAAU,KAAK,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBAEvF,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;wBACd,IAAI,IAAI,EAAE,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;4BACrC,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;4BAC5C,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBACtB,CAAC;oBACH,CAAC;gBACH,CAAC;gBAGD,cAAc,CAAC,sBAAsB,CAAC;oBACpC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,uBAAuB,OAAO,CAAC,IAAI,UAAU,KAAK,CAAC,OAAO,KAAK,SAAS,aAAa,CAAC,CAAC,CAAC,qBAAqB,OAAO,CAAC,IAAI,UAAU,KAAK,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE;oBAC5L,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,MAAM,EAAE,OAAO,CAAC,IAAI;oBACpB,KAAK,EAAE,CAAC,aAAa,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;iBAC3D,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;YACjC,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC;YAC/E,MAAM,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,iBAAiB,CAAC,CAAC;QACjF,CAAC;QAGD,IAAI,MAAM,CAAC,2BAA2B,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC;YAExF,MAAM,gBAAgB,GAGjB,EAAE,CAAC;YACR,KAAK,MAAM,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3E,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG;oBAC/B,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,SAAS,EAAE,OAAO,CAAC,SAAS;iBAC7B,CAAC;YACJ,CAAC;YACD,MAAM,cAAc,GAAG,sBAAsB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACpE,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG;gBACnC,IAAI;gBACJ,cAAc,EAAE,cAAc,IAAI,SAAS;gBAC3C,WAAW,EAAE,QAAQ;gBACrB,SAAS,EAAE,gBAAgB;gBAC3B,gBAAgB,EAAE,IAAI,CAAC,GAAG,EAAE;gBAC5B,kBAAkB,EAAE,CAAC;aACtB,CAAC;YACF,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;gBAC5B,UAAU,CAAC,YAAY,CAAC,wBAAwB,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,wBAAwB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACjH,CAAC;QACH,CAAC;QAGD,YAAY,CAAC,iBAAiB,EAAE,CAAC;QACjC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5F,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBAC7B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,WAAW,EAAE,YAAY,CAAC,MAAM;aACjC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,cAAc,CAAC,CAAC;IAE3D,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAE3D,IAAI,gBAAgB,GAA2B,IAAI,CAAC;IACpD,IAAI,MAAM,CAAC,wBAAwB,EAAE,CAAC;QACpC,MAAM,eAAe,GAAG,aAAa,EAAE,CAAC,oBAAoB,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QACjH,MAAM,eAAe,GAAG,aAAa,CAAC,UAAU,EAAE,CAAC;QACnD,gBAAgB,GAAG;YACjB,aAAa,EAAE,iBAAiB,CAAC,MAAM;YACvC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,aAAa,CAAC;YACzD,cAAc,EAAE,SAAS;YACzB,YAAY,EAAE,eAAe,CAAC,SAAS;YACvC,YAAY,EAAE,eAAe,CAAC,SAAS;YACvC,SAAS,EAAE,iBAAiB;YAC5B,QAAQ,EAAE;gBACR,IAAI,EAAE,eAAe,CAAC,IAAI;gBAC1B,MAAM,EAAE,eAAe,CAAC,MAAM;gBAC9B,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC;gBACpD,WAAW,EAAE,eAAe,CAAC,WAAW;aACzC;SACF,CAAC;QACF,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,gBAAgB,EAAE,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,CAAC;YACH,MAAM,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,IAAI,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,6CAA6C,IAAI,YAAY,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/G,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;QACjC,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,MAAM,CAAC,2BAA2B,EAAE,CAAC;QACvC,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;YAC5B,UAAU,CAAC,YAAY,CAAC,eAAe,GAAG,SAAS,CAAC;QACtD,CAAC;QACD,MAAM,YAAY,CAAC,MAAM,CAAC,8BAA8B,EAAE,UAAU,CAAC,CAAC;QACtE,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;gBACtB,IAAI,EAAE,mBAAmB;gBACzB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM;gBACjD,sBAAsB,EAAE,UAAU,CAAC,YAAY,EAAE,sBAAsB;gBACvE,WAAW,EAAE,UAAU,CAAC,YAAY,EAAE,wBAAwB;aAC/D,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAwB;QACrC,aAAa,EAAE,iBAAiB,CAAC,MAAM;QACvC,kBAAkB,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACzD,WAAW;QACX,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,SAAS;QACT,QAAQ,EAAE,gBAAgB,IAAI,SAAS;KACxC,CAAC;IACF,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,QAAqC;IAC5E,IAAI,CAAC;QACH,aAAa,EAAE,CAAC,4BAA4B,GAAG,QAAQ,IAAI,IAAI,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;IAET,CAAC;AACH,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\nimport crypto from 'node:crypto';\nimport path from 'node:path';\n\nimport { config, formatMs, traverse } from '@core/config';\nimport { messages } from '@core/messages';\nimport { createDefaultReporter } from '@core/reporting';\nimport { WorkerPool } from '@core/workers';\nimport { calcularHashEstrutural } from '@shared/helpers';\nimport { lerEstado, salvarEstado } from '@shared/persistence';\nimport XXH from 'xxhashjs';\n\nimport type { ContextoExecucao, EstadoIncremental, FileEntryWithAst, GuardianResult, MetricaAnalista, MetricaExecucao, MetricasGlobais, Ocorrencia, ResultadoInquisicao, Tecnica } from '@';\nimport { ocorrenciaErroAnalista } from '@';\n\nimport type { ExecutorEventEmitter } from '../../types/core/config/config.js';\nimport { analysisCache } from './analysis-cache.js';\nimport { ScopeAstCache } from './ast-cache.js';\n\nconst {\n log,\n logCore,\n ExecutorExtraMensagens,\n logAnalistas\n} = messages;\nexport type { ExecutorEventEmitter };\n\nasync function withTimeout<T>(value: T | Promise<T>, timeoutMs: number, errorMessage: string): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | null = null;\n try {\n return await Promise.race([\n Promise.resolve(value),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(errorMessage)), timeoutMs);\n })\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\ninterface TutanusExecStore {\n __TUTANUS_METRICAS__?: MetricasGlobais;\n __ULTIMAS_METRICAS_TUTANUS__?: MetricaExecucao | null;\n}\n\nfunction getGlobalExec(): TutanusExecStore {\n return globalThis as unknown as TutanusExecStore;\n}\n\nasync function persistMetricHistory(metricas: MetricaExecucao): Promise<void> {\n const historicoCaminho = config.ANALISE_METRICAS_HISTORICO_PATH;\n if (!historicoCaminho) return;\n type RegistroHistorico = MetricaExecucao & { timestamp: number };\n const anterior = await lerEstado<unknown>(historicoCaminho).catch(() => [] as unknown[]);\n const lista: RegistroHistorico[] = Array.isArray(anterior) ? anterior as RegistroHistorico[] : [];\n lista.push({ ...metricas, timestamp: Date.now() });\n const max = config.ANALISE_METRICAS_HISTORICO_MAX || 200;\n await salvarEstado(historicoCaminho, lista.slice(-max));\n}\n\nfunction infoDestaque(msg: string): void {\n const logCasted = log as { infoDestaque?: (m: string) => void; info: (m: string) => void };\n if (typeof logCasted.infoDestaque === 'function') {\n logCasted.infoDestaque(msg);\n } else {\n logCasted.info(msg);\n }\n}\nfunction combinarVisitors(tecnicas: Tecnica[]): Record<string, unknown> {\n const visitantes = tecnicas.filter((t): t is Tecnica & { visitor: Record<string, unknown> } => 'visitor' in t);\n const visitorCombinado: Record<string, unknown> = {};\n if (visitantes.length === 0) return visitorCombinado;\n for (const item of visitantes) {\n if (!item.visitor) continue;\n for (const [key, val] of Object.entries(item.visitor)) {\n if (!visitorCombinado[key]) {\n visitorCombinado[key] = val;\n } else {\n const prev = visitorCombinado[key];\n visitorCombinado[key] = (path: unknown, state: unknown) => {\n if (typeof prev === 'function') {\n prev(path, state);\n } else if (prev && typeof prev === 'object' && 'enter' in prev && typeof prev.enter === 'function') {\n prev.enter(path, state);\n }\n if (typeof val === 'function') {\n val(path, state);\n } else if (val && typeof val === 'object' && 'enter' in val && typeof val.enter === 'function') {\n val.enter(path, state);\n }\n };\n }\n }\n }\n return visitorCombinado;\n}\n\nexport async function executarInquisicao(fileEntriesComAst: FileEntryWithAst[], tecnicas: Tecnica[], baseDir: string, guardianResultado: GuardianResult, opts?: {\n verbose?: boolean;\n compact?: boolean;\n /** true: força worker pool, false: força sequencial, undefined: auto */\n fast?: boolean;\n /** true: força sequencial (sobrepõe fast/auto) */\n sequential?: boolean;\n /** Opcional: emissor de eventos para file:processed e analysis:complete */\n events?: ExecutorEventEmitter;\n /** Opcional: callback chamado para cada ocorrência encontrada (streaming) */\n onOcorrencia?: (ocorrencia: Ocorrencia) => void;\n}): Promise<ResultadoInquisicao> {\n const ocorrencias: Ocorrencia[] = [];\n const metricasAnalistas: MetricaAnalista[] = [];\n const arquivosValidosSet = new Set(fileEntriesComAst.map(arquivo => arquivo.relPath));\n const emitter = opts?.events;\n const onOcorrencia = opts?.onOcorrencia;\n const pushOcorrencia = (...items: Ocorrencia[]) => {\n ocorrencias.push(...items);\n if (onOcorrencia) {\n for (const item of items) {\n onOcorrencia(item);\n }\n }\n };\n const contextoGlobalBase: ContextoExecucao = {\n baseDir,\n arquivos: fileEntriesComAst,\n ambiente: {\n arquivosValidosSet,\n guardian: guardianResultado\n }\n };\n const reporter = createDefaultReporter();\n const inicioExecucao = performance.now();\n\n // Cache de AST compartilhado entre analistas no mesmo escopo\n // Parsing lazy: ASTs são parseados sob demanda via getOrParse\n const scopeAstCache = new ScopeAstCache();\n\n function hasNodeType(x: unknown): x is { node: { type: string } } {\n if (typeof x !== 'object' || x === null) return false;\n const maybe = x as { node?: unknown };\n if (!maybe.node || typeof maybe.node !== 'object') return false;\n return 'type' in (maybe.node as Record<string, unknown>);\n }\n\n async function processGlobalTechniques(\n tecnicas: Tecnica[],\n ctx: ContextoExecucao,\n pushFn: (...items: Ocorrencia[]) => void,\n metricaList: MetricaAnalista[],\n opts?: { verbose?: boolean }\n ): Promise<void> {\n const timeoutMs = config.ANALISE_TIMEOUT_POR_ANALISTA_MS;\n for (const tecnica of tecnicas) {\n if (!tecnica.global) continue;\n try {\n const inicioAnalista = performance.now();\n const result = timeoutMs > 0\n ? await withTimeout(tecnica.aplicar('', '', null, undefined, ctx), timeoutMs,\n ExecutorExtraMensagens.timeoutGlobal.replace('{nome}', tecnica.nome || 'desconhecido').replace('{timeout}', String(timeoutMs)))\n : await tecnica.aplicar('', '', null, undefined, ctx);\n if (Array.isArray(result)) pushFn(...result);\n const duracaoMs = performance.now() - inicioAnalista;\n if (config.ANALISE_METRICAS_ENABLED) {\n metricaList.push({\n nome: tecnica.nome || 'desconhecido',\n duracaoMs,\n ocorrencias: Array.isArray(result) ? result.length : result ? 1 : 0,\n global: true\n });\n }\n if (opts?.verbose) log.sucesso(ExecutorExtraMensagens.tecnicaGlobal.replace('{nome}', tecnica.nome || 'desconhecido'));\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({ tipo: 'analista', escopo: 'global', nome: tecnica.nome, duracaoMs, ocorrencias: metricaList.at(-1)?.ocorrencias }));\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n const isTempoLimite = err.message.includes('Timeout: analista global');\n const nivelLog = isTempoLimite ? 'aviso' : 'erro';\n const prefixo = isTempoLimite ? '⏰' : '[ERRO]';\n if (nivelLog === 'aviso') {\n log.aviso(`${prefixo} ${err.message}`);\n } else {\n log.erro(`${prefixo} ${ExecutorExtraMensagens.erroTecnicaGlobal.replace('{prefixo}', prefixo).replace('{nome}', tecnica.nome || 'desconhecido').replace('{erro}', err.message)}`);\n if (err.stack && (opts?.verbose || config.DEV_MODE)) {\n log.info(ExecutorExtraMensagens.stackTrace);\n log.info(err.stack);\n }\n }\n pushFn(ocorrenciaErroAnalista({\n mensagem: isTempoLimite ? `Timeout na técnica global '${tecnica.nome}': ${timeoutMs}ms excedido` : `Falha na técnica global '${tecnica.nome}': ${err.message}`,\n relPath: '[execução global]',\n origem: tecnica.nome,\n stack: !isTempoLimite && err.stack ? err.stack : undefined\n }));\n }\n }\n }\n\n // Incremental: carregar estado anterior (tipo importado de @types)\n let estadoIncremental: EstadoIncremental | null = null;\n if (config.ANALISE_INCREMENTAL_ENABLED) {\n const lido = await lerEstado<EstadoIncremental>(config.ANALISE_INCREMENTAL_STATE_PATH).catch(() => null);\n if (lido && lido.versao === config.ANALISE_INCREMENTAL_VERSION) estadoIncremental = lido;\n }\n const novoEstado: EstadoIncremental = {\n versao: config.ANALISE_INCREMENTAL_VERSION,\n arquivos: {},\n estatisticas: {\n totalReaproveitamentos: 0,\n totalArquivosProcessados: 0,\n ultimaDuracaoMs: 0\n }\n };\n function hashConteudo(elem: string) {\n try {\n // Usa xxhash64 (seed arbitrária) para performance\n return XXH.h64(elem, 0xabcd).toString(16);\n } catch {\n // Fallback para SHA1 se algo der errado\n // SHA1 usado apenas para cache de AST (fingerprinting de conteúdo)\n // Não é usado para segurança/criptografia - contexto: deduplicação de parsing\n return crypto.createHash('sha1').update(elem).digest('hex');\n }\n }\n\n await processGlobalTechniques(tecnicas, contextoGlobalBase, pushOcorrencia, metricasAnalistas, opts);\n\n async function processarWorkerPool(): Promise<ResultadoInquisicao> {\n log.info(ExecutorExtraMensagens.modoRapido);\n const wp = new WorkerPool({\n enabled: true,\n maxWorkers: config.WORKER_POOL_MAX_WORKERS || undefined,\n batchSize: 10,\n timeoutMs: config.ANALISE_TIMEOUT_POR_ANALISTA_MS\n });\n const resultado = await wp.processFiles(\n fileEntriesComAst,\n tecnicas.filter(t => !t.global),\n contextoGlobalBase\n );\n pushOcorrencia(...resultado.occurrences);\n metricasAnalistas.push(...resultado.metrics);\n const duracao = performance.now() - inicioExecucao;\n log.sucesso(ExecutorExtraMensagens.analiseRapidaConcluida.replace('{arquivos}', String(fileEntriesComAst.length)).replace('{duracao}', formatMs(duracao)));\n\n if (config.ANALISE_INCREMENTAL_ENABLED) {\n try {\n for (const entry of fileEntriesComAst) {\n const hash = hashConteudo(entry.content ?? '');\n novoEstado.arquivos[entry.relPath] = { hash, ocorrencias: [], reaproveitadoCount: 0 };\n }\n if (novoEstado.estatisticas) {\n novoEstado.estatisticas.totalArquivosProcessados = fileEntriesComAst.length;\n novoEstado.estatisticas.ultimaDuracaoMs = duracao;\n }\n await salvarEstado(config.ANALISE_INCREMENTAL_STATE_PATH, novoEstado);\n } catch { /* Ignora erro ao salvar cache */ }\n }\n\n const metricasExecucao: MetricaExecucao = {\n totalArquivos: fileEntriesComAst.length,\n tempoTotal: duracao,\n ocorrenciasEncontradas: ocorrencias.length,\n analistas: metricasAnalistas,\n workerPool: { workersAtivos: resultado.totalProcessed, duracaoTotalMs: resultado.duration }\n };\n const resultadoFast: ResultadoInquisicao = {\n totalArquivos: fileEntriesComAst.length,\n arquivosAnalisados: fileEntriesComAst.map(e => e.relPath),\n ocorrencias,\n timestamp: Date.now(),\n duracaoMs: duracao,\n metricas: metricasExecucao\n };\n if (emitter) emitter.emit('analysis:complete', resultadoFast);\n return resultadoFast;\n }\n\n const usarWorkerPool = (() => {\n if (opts?.sequential) return false;\n if (opts?.fast !== undefined) return opts.fast;\n return config.WORKER_POOL_ENABLED && fileEntriesComAst.length > config.WORKER_POOL_AUTO_THRESHOLD;\n })();\n\n if (usarWorkerPool && fileEntriesComAst.length > 0) {\n return processarWorkerPool();\n }\n\n // Técnicas por arquivo (modo sequencial padrão)\n const contextoGlobal: ContextoExecucao = {\n ...contextoGlobalBase,\n report: event => {\n try {\n pushOcorrencia(reporter(event));\n } catch (erro) {\n // Reporter nunca deve quebrar a análise; se falhar, emite ocorrência genérica.\n pushOcorrencia(ocorrenciaErroAnalista({\n mensagem: `Falha no reporter: ${erro instanceof Error ? erro.message : String(erro)}`,\n relPath: event?.relPath || '[report]',\n origem: 'reporter'\n }));\n }\n }\n };\n\n const visitorCombinado = combinarVisitors(tecnicas);\n let arquivoAtual = 0;\n const totalArquivos = fileEntriesComAst.length;\n // Limiar para logs detalhados por arquivo\n const LIMIAR_DETALHE_TOTAL = 100; // até aqui permite detalhar por arquivo\n const LIMIAR_DETALHE_LIMITADO_MAX = 250; // até aqui permite \"Arquivo X/Y\" com throttle\n // Define passo de logging quando em modo verbose para evitar spam massivo\n\n function passoDeLog(total: number): number {\n // Assumimos faixas: até 100 => cada arquivo; 101-250 => a cada 10; 251-500 => a cada 25; >500 => a cada 100\n if (total <= 100) return 1;\n if (total <= 250) return 10;\n if (total <= 500) return 25;\n return 100;\n }\n const frames = ['->', '=>', '>>', '=>'] as const;\n const stepVerbose = passoDeLog(totalArquivos);\n const detalharPorArquivo = (opts?.verbose ?? false) && totalArquivos <= LIMIAR_DETALHE_TOTAL;\n const permitirArquivoXY = (opts?.verbose ?? false) && totalArquivos <= LIMIAR_DETALHE_LIMITADO_MAX;\n\n // Inicializa sistema de logs inteligente\n logAnalistas.iniciarBatch(totalArquivos);\n\n // Pool de objetos reutilizáveis entre arquivos (reduz GC pressure)\n const resultadosOtimizados = new Map<string, unknown[]>();\n\n for (const entry of fileEntriesComAst) {\n arquivoAtual++;\n resultadosOtimizados.clear();\n if (opts?.compact) {\n if (arquivoAtual === totalArquivos) {\n log.info(ExecutorExtraMensagens.arquivosAnalisados.replace('{total}', String(totalArquivos)));\n }\n } else if (opts?.verbose) {\n // Em verbose: detalha por arquivo somente até o limiar; entre 101-250 mostra \"Arquivo X/Y\" com throttle; acima disso, só resumo de progresso.\n if (permitirArquivoXY) {\n if (arquivoAtual === 1 || arquivoAtual % stepVerbose === 0 || arquivoAtual === totalArquivos) {\n const seta = frames[arquivoAtual % frames.length];\n log.info(ExecutorExtraMensagens.arquivoAtual.replace('{seta}', seta).replace('{atual}', String(arquivoAtual)).replace('{total}', String(totalArquivos)).replace('{arquivo}', entry.relPath));\n }\n } else {\n if (arquivoAtual === 1 || arquivoAtual % stepVerbose === 0 || arquivoAtual === totalArquivos) {\n log.info(ExecutorExtraMensagens.progresso.replace('{atual}', String(arquivoAtual)).replace('{total}', String(totalArquivos)));\n }\n }\n } else if (arquivoAtual % 50 === 0 || arquivoAtual === totalArquivos) {\n // Modo padrão: log apenas a cada 50 arquivos para reduzir ruído\n if (arquivoAtual === totalArquivos) {\n infoDestaque(ExecutorExtraMensagens.progresso.replace('{atual}', String(arquivoAtual)).replace('{total}', String(totalArquivos)));\n }\n }\n // Resolve AST via cache compartilhado do escopo\n const ext = path.extname(entry.relPath);\n const astDoCache = await scopeAstCache.getOrParse(entry as import('@').FileEntry, ext);\n const astParaUso = astDoCache ?? entry.ast;\n // Verifica incremento com fallback para diff estrutural\n const conteudo = entry.content ?? '';\n const hash = hashConteudo(conteudo);\n const cacheAnterior = estadoIncremental?.arquivos[entry.relPath];\n let reaproveitou = false;\n if (config.ANALISE_INCREMENTAL_ENABLED && cacheAnterior) {\n if (cacheAnterior.hash === hash) {\n // Conteúdo exato igual → reuso total\n reaproveitou = true;\n } else if (cacheAnterior.hashEstrutural) {\n // Conteúdo mudou, verifica se apenas formatação/comentários mudaram\n const hashEstrutural = calcularHashEstrutural(astParaUso, conteudo);\n if (hashEstrutural && hashEstrutural === cacheAnterior.hashEstrutural) {\n reaproveitou = true;\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({ tipo: 'structural-reuse', arquivo: entry.relPath }));\n }\n }\n }\n if (reaproveitou) {\n pushOcorrencia(...cacheAnterior.ocorrencias);\n novoEstado.arquivos[entry.relPath] = { ...cacheAnterior, hash, hashEstrutural: cacheAnterior.hashEstrutural };\n novoEstado.arquivos[entry.relPath].reaproveitadoCount = (cacheAnterior.reaproveitadoCount || 0) + 1;\n if (novoEstado.estatisticas) {\n novoEstado.estatisticas.totalReaproveitamentos = (novoEstado.estatisticas.totalReaproveitamentos || 0) + 1;\n }\n if (detalharPorArquivo) logCore.reaproveitadoIncremental(entry.relPath);\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({\n tipo: 'incremental-reuse',\n arquivo: entry.relPath,\n ocorrencias: cacheAnterior.ocorrencias.length\n }));\n }\n }\n }\n if (reaproveitou) continue; // pula analistas\n\n // Cache de análise entre execuções\n if (config.ANALISE_CACHE_ENABLED) {\n const cached = await analysisCache.get(entry.relPath, entry.content ?? '');\n if (cached !== null) {\n pushOcorrencia(...cached);\n novoEstado.arquivos[entry.relPath] = {\n hash,\n ocorrencias: cached,\n reaproveitadoCount: 1\n };\n if (detalharPorArquivo) logCore.reaproveitadoIncremental(`${entry.relPath} (analysis cache)`);\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({ tipo: 'cache-reuse', arquivo: entry.relPath, ocorrencias: cached.length }));\n }\n continue;\n }\n }\n\n // Otimização: Travessia única para analistas com visitor\n if (Object.keys(visitorCombinado).length > 0 && astParaUso) {\n try {\n const astParam = hasNodeType(astParaUso) ? astParaUso.node : astParaUso;\n traverse(astParam, visitorCombinado, undefined, {\n relPath: entry.relPath,\n contexto: contextoGlobal,\n resultados: resultadosOtimizados // Mapa de analista -> achados\n });\n } catch (err) {\n log.aviso(`⏰ Falha na travessia otimizada para ${entry.relPath}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n for (const tecnica of tecnicas) {\n if (tecnica.global) continue;\n if (tecnica.test && !tecnica.test(entry.relPath)) continue;\n // início medido apenas por analista específico (inicioAnalista)\n const timeoutMs = config.ANALISE_TIMEOUT_POR_ANALISTA_MS;\n try {\n const inicioAnalista = performance.now();\n\n // Log adaptativo: início da análise\n const tamanhoArquivo = entry.content ? Math.round(entry.content.length / 1024) : 0;\n logAnalistas.iniciandoAnalista(tecnica.nome || 'analista-desconhecido', entry.relPath, tamanhoArquivo);\n\n let resultado: Awaited<ReturnType<typeof tecnica.aplicar>> | undefined;\n const astNode = hasNodeType(astParaUso) ? astParaUso.node : null;\n const temVisitor = 'visitor' in tecnica;\n const astParam = temVisitor ? {\n node: astNode,\n preColetado: resultadosOtimizados.get(tecnica.nome || '')\n } as unknown as import('@babel/traverse').NodePath<import('@babel/types').Node> : null;\n const execPromise = tecnica.aplicar(entry.content ?? '', entry.relPath, astParam, entry.fullCaminho, contextoGlobal);\n if (timeoutMs > 0) {\n resultado = await withTimeout(execPromise, timeoutMs,\n ExecutorExtraMensagens.timeoutAnalista.replace('{nome}', tecnica.nome || 'desconhecido').replace('{timeout}', String(timeoutMs)).replace('{arquivo}', entry.relPath));\n } else {\n resultado = await execPromise;\n }\n if (Array.isArray(resultado)) {\n pushOcorrencia(...resultado);\n }\n const duracaoMs = performance.now() - inicioAnalista;\n if (config.ANALISE_METRICAS_ENABLED) {\n metricasAnalistas.push({\n nome: tecnica.nome || 'desconhecido',\n duracaoMs,\n ocorrencias: Array.isArray(resultado) ? resultado.length : resultado ? 1 : 0,\n global: false\n });\n }\n\n // Log adaptativo: conclusão da análise\n const ocorrenciasContagem = Array.isArray(resultado) ? resultado.length : resultado ? 1 : 0;\n logAnalistas.concluido(tecnica.nome || 'analista-desconhecido', entry.relPath, ocorrenciasContagem, duracaoMs);\n if (detalharPorArquivo) {\n log.info(`📄 '${tecnica.nome}' analisou ${entry.relPath} em ${formatMs(duracaoMs)}`);\n }\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({\n tipo: 'analista',\n arquivo: entry.relPath,\n nome: tecnica.nome,\n duracaoMs,\n ocorrencias: metricasAnalistas.at(-1)?.ocorrencias\n }));\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n const isTempoLimite = err.message.includes('Timeout: analista');\n const nivelLog = isTempoLimite ? 'aviso' : 'erro';\n const prefixo = isTempoLimite ? '⏰' : '[ERRO]';\n\n // Log adaptativo para erros e timeouts\n if (isTempoLimite) {\n const duracaoEstimada = config.ANALISE_TIMEOUT_POR_ANALISTA_MS || 30000;\n logAnalistas.timeout(tecnica.nome || 'analista-desconhecido', duracaoEstimada);\n } else {\n logAnalistas.erro(tecnica.nome || 'analista-desconhecido', err.message);\n }\n\n // Log apropriado baseado no tipo de erro\n if (nivelLog === 'aviso') {\n log.aviso(`${prefixo} ${err.message}`);\n } else {\n log.erro(`${prefixo} Erro em '${tecnica.nome}' para ${entry.relPath}: ${err.message}`);\n // Exibe stack trace em modo verbose ou debug\n if (err.stack) {\n if (opts?.verbose || config.DEV_MODE) {\n log.info(ExecutorExtraMensagens.stackTrace);\n log.info(err.stack);\n }\n }\n }\n\n // Registra ocorrência de erro/timeout com stack trace\n pushOcorrencia(ocorrenciaErroAnalista({\n mensagem: isTempoLimite ? `Timeout na técnica '${tecnica.nome}' para ${entry.relPath}: ${timeoutMs}ms excedido` : `Falha na técnica '${tecnica.nome}' para ${entry.relPath}: ${err.message}`,\n relPath: entry.relPath,\n origem: tecnica.nome,\n stack: !isTempoLimite && err.stack ? err.stack : undefined\n }));\n }\n }\n // Salva no cache de análise entre execuções\n if (config.ANALISE_CACHE_ENABLED) {\n const ocorrArquivoCache = ocorrencias.filter(o => o.relPath === entry.relPath);\n await analysisCache.set(entry.relPath, entry.content ?? '', ocorrArquivoCache);\n }\n\n // Salva estado incremental do arquivo processado\n if (config.ANALISE_INCREMENTAL_ENABLED) {\n const ocorrArq = ocorrencias.filter(ocorrencia => ocorrencia.relPath === entry.relPath);\n // Extrai métricas por analista específicas do arquivo\n const analistasArquivo: Record<string, {\n ocorrencias: number;\n duracaoMs: number;\n }> = {};\n for (const metrica of metricasAnalistas.filter(metrica => !metrica.global)) {\n analistasArquivo[metrica.nome] = {\n ocorrencias: metrica.ocorrencias,\n duracaoMs: metrica.duracaoMs\n };\n }\n const hashEstrutural = calcularHashEstrutural(astParaUso, conteudo);\n novoEstado.arquivos[entry.relPath] = {\n hash,\n hashEstrutural: hashEstrutural || undefined,\n ocorrencias: ocorrArq,\n analistas: analistasArquivo,\n ultimaExecucaoMs: Date.now(),\n reaproveitadoCount: 0\n };\n if (novoEstado.estatisticas) {\n novoEstado.estatisticas.totalArquivosProcessados = (novoEstado.estatisticas.totalArquivosProcessados || 0) + 1;\n }\n }\n\n // NOVO: Atualiza progresso por arquivo (não por analista)\n logAnalistas.arquivoProcessado();\n if (emitter) {\n const ocorrArquivo = ocorrencias.filter(ocorrencia => ocorrencia.relPath === entry.relPath);\n emitter.emit('file:processed', {\n relPath: entry.relPath,\n ocorrencias: ocorrArquivo.length\n });\n }\n }\n const fimExecucao = performance.now();\n const duracaoMs = Math.round(fimExecucao - inicioExecucao);\n\n logAnalistas.finalizarBatch(ocorrencias.length, duracaoMs);\n\n let metricasExecucao: MetricaExecucao | null = null;\n if (config.ANALISE_METRICAS_ENABLED) {\n const metricasGlobais = getGlobalExec().__TUTANUS_METRICAS__ || { parsingTimeMs: 0, cacheHits: 0, cacheMiss: 0 };\n const astCacheMetrics = scopeAstCache.getMetrics();\n metricasExecucao = {\n totalArquivos: fileEntriesComAst.length,\n tempoParsingMs: Math.round(metricasGlobais.parsingTimeMs),\n tempoAnaliseMs: duracaoMs,\n cacheAstHits: metricasGlobais.cacheHits,\n cacheAstMiss: metricasGlobais.cacheMiss,\n analistas: metricasAnalistas,\n astCache: {\n hits: astCacheMetrics.hits,\n misses: astCacheMetrics.misses,\n parseTimeMs: Math.round(astCacheMetrics.parseTimeMs),\n cachedFiles: astCacheMetrics.cachedFiles,\n },\n };\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({ tipo: 'metricas', ...metricasExecucao }));\n }\n try {\n await persistMetricHistory(metricasExecucao);\n } catch (erro) {\n log.erro(`Falha ao persistir histórico de métricas: ${erro instanceof Error ? erro.message : String(erro)}`);\n }\n }\n\n if (config.ANALISE_CACHE_ENABLED) {\n await analysisCache.persistir().catch(() => {});\n }\n\n if (config.ANALISE_INCREMENTAL_ENABLED) {\n if (novoEstado.estatisticas) {\n novoEstado.estatisticas.ultimaDuracaoMs = duracaoMs;\n }\n await salvarEstado(config.ANALISE_INCREMENTAL_STATE_PATH, novoEstado);\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({\n tipo: 'incremental-salvo',\n arquivos: Object.keys(novoEstado.arquivos).length,\n totalReaproveitamentos: novoEstado.estatisticas?.totalReaproveitamentos,\n processados: novoEstado.estatisticas?.totalArquivosProcessados\n }));\n }\n }\n const resultado: ResultadoInquisicao = {\n totalArquivos: fileEntriesComAst.length,\n arquivosAnalisados: fileEntriesComAst.map(e => e.relPath),\n ocorrencias,\n timestamp: Date.now(),\n duracaoMs,\n metricas: metricasExecucao || undefined\n };\n if (emitter) {\n emitter.emit('analysis:complete', resultado);\n }\n return resultado;\n}\n\nexport function registrarUltimasMetricas(metricas: MetricaExecucao | undefined): void {\n try {\n getGlobalExec().__ULTIMAS_METRICAS_TUTANUS__ = metricas || null;\n } catch {\n /* ignore */\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/core/execution/executor.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport crypto from 'node:crypto';\nimport path from 'node:path';\n\nimport { config, formatMs, traverse } from '@core/config';\nimport { messages } from '@core/messages';\nimport { createDefaultReporter } from '@core/reporting';\nimport { WorkerPool } from '@core/workers';\nimport { calcularHashEstrutural } from '@shared/helpers';\nimport { lerEstado, salvarEstado } from '@shared/persistence';\nimport XXH from 'xxhashjs';\n\nimport type { ContextoExecucao, EstadoIncremental, FileEntryWithAst, GuardianResult, MetricaAnalista, MetricaExecucao, MetricasGlobais, Ocorrencia, ResultadoInquisicao, Tecnica } from '@';\nimport { ocorrenciaErroAnalista } from '@';\n\nimport type { ExecutorEventEmitter } from '../../types/core/config/config.js';\nimport { analysisCache } from './analysis-cache.js';\nimport { ScopeAstCache } from './ast-cache.js';\n\nconst {\n log,\n logCore,\n ExecutorExtraMensagens,\n logAnalistas\n} = messages;\nexport type { ExecutorEventEmitter };\n\nasync function withTimeout<T>(value: T | Promise<T>, timeoutMs: number, errorMessage: string): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | null = null;\n try {\n return await Promise.race([\n Promise.resolve(value),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(errorMessage)), timeoutMs);\n })\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\ninterface TutanusExecStore {\n __TUTANUS_METRICAS__?: MetricasGlobais;\n __ULTIMAS_METRICAS_TUTANUS__?: MetricaExecucao | null;\n}\n\nfunction getGlobalExec(): TutanusExecStore {\n return globalThis as unknown as TutanusExecStore;\n}\n\nasync function persistMetricHistory(metricas: MetricaExecucao): Promise<void> {\n const historicoCaminho = config.ANALISE_METRICAS_HISTORICO_PATH;\n if (!historicoCaminho) return;\n type RegistroHistorico = MetricaExecucao & { timestamp: number };\n const anterior = await lerEstado<unknown>(historicoCaminho).catch(() => [] as unknown[]);\n const lista: RegistroHistorico[] = Array.isArray(anterior) ? anterior as RegistroHistorico[] : [];\n lista.push({ ...metricas, timestamp: Date.now() });\n const max = config.ANALISE_METRICAS_HISTORICO_MAX || 200;\n await salvarEstado(historicoCaminho, lista.slice(-max));\n}\n\nfunction infoDestaque(msg: string): void {\n const logCasted = log as { infoDestaque?: (m: string) => void; info: (m: string) => void };\n if (typeof logCasted.infoDestaque === 'function') {\n logCasted.infoDestaque(msg);\n } else {\n logCasted.info(msg);\n }\n}\nfunction combinarVisitors(tecnicas: Tecnica[]): Record<string, unknown> {\n const visitantes = tecnicas.filter((t): t is Tecnica & { visitor: Record<string, unknown> } => 'visitor' in t);\n const visitorCombinado: Record<string, unknown> = {};\n if (visitantes.length === 0) return visitorCombinado;\n for (const item of visitantes) {\n if (!item.visitor) continue;\n for (const [key, val] of Object.entries(item.visitor)) {\n if (!visitorCombinado[key]) {\n visitorCombinado[key] = val;\n } else {\n const prev = visitorCombinado[key];\n visitorCombinado[key] = (path: unknown, state: unknown) => {\n if (typeof prev === 'function') {\n prev(path, state);\n } else if (prev && typeof prev === 'object' && 'enter' in prev && typeof prev.enter === 'function') {\n prev.enter(path, state);\n }\n if (typeof val === 'function') {\n val(path, state);\n } else if (val && typeof val === 'object' && 'enter' in val && typeof val.enter === 'function') {\n val.enter(path, state);\n }\n };\n }\n }\n }\n return visitorCombinado;\n}\n\nexport async function executarInquisicao(fileEntriesComAst: FileEntryWithAst[], tecnicas: Tecnica[], baseDir: string, guardianResultado: GuardianResult, opts?: {\n verbose?: boolean;\n compact?: boolean;\n /** true: força worker pool, false: força sequencial, undefined: auto */\n fast?: boolean;\n /** true: força sequencial (sobrepõe fast/auto) */\n sequential?: boolean;\n /** Opcional: emissor de eventos para file:processed e analysis:complete */\n events?: ExecutorEventEmitter;\n /** Opcional: callback chamado para cada ocorrência encontrada (streaming) */\n onOcorrencia?: (ocorrencia: Ocorrencia) => void;\n}): Promise<ResultadoInquisicao> {\n const ocorrencias: Ocorrencia[] = [];\n const metricasAnalistas: MetricaAnalista[] = [];\n const arquivosValidosSet = new Set(fileEntriesComAst.map(arquivo => arquivo.relPath));\n const emitter = opts?.events;\n const onOcorrencia = opts?.onOcorrencia;\n const pushOcorrencia = (...items: Ocorrencia[]) => {\n ocorrencias.push(...items);\n if (onOcorrencia) {\n for (const item of items) {\n onOcorrencia(item);\n }\n }\n };\n const contextoGlobalBase: ContextoExecucao = {\n baseDir,\n arquivos: fileEntriesComAst,\n ambiente: {\n arquivosValidosSet,\n guardian: guardianResultado\n }\n };\n const reporter = createDefaultReporter();\n const inicioExecucao = performance.now();\n\n // Cache de AST compartilhado entre analistas no mesmo escopo\n // Parsing lazy: ASTs são parseados sob demanda via getOrParse\n const scopeAstCache = new ScopeAstCache();\n\n function hasNodeType(x: unknown): x is { node: { type: string } } {\n if (typeof x !== 'object' || x === null) return false;\n const maybe = x as { node?: unknown };\n if (!maybe.node || typeof maybe.node !== 'object') return false;\n return 'type' in (maybe.node as Record<string, unknown>);\n }\n\n async function processGlobalTechniques(\n tecnicas: Tecnica[],\n ctx: ContextoExecucao,\n pushFn: (...items: Ocorrencia[]) => void,\n metricaList: MetricaAnalista[],\n opts?: { verbose?: boolean }\n ): Promise<void> {\n const timeoutMs = config.ANALISE_TIMEOUT_POR_ANALISTA_MS;\n for (const tecnica of tecnicas) {\n if (!tecnica.global) continue;\n try {\n const inicioAnalista = performance.now();\n const result = timeoutMs > 0\n ? await withTimeout(tecnica.aplicar('', '', null, undefined, ctx), timeoutMs,\n ExecutorExtraMensagens.timeoutGlobal.replace('{nome}', tecnica.nome || 'desconhecido').replace('{timeout}', String(timeoutMs)))\n : await tecnica.aplicar('', '', null, undefined, ctx);\n if (Array.isArray(result)) pushFn(...result);\n const duracaoMs = performance.now() - inicioAnalista;\n if (config.ANALISE_METRICAS_ENABLED) {\n metricaList.push({\n nome: tecnica.nome || 'desconhecido',\n duracaoMs,\n ocorrencias: Array.isArray(result) ? result.length : result ? 1 : 0,\n global: true\n });\n }\n if (opts?.verbose) log.sucesso(ExecutorExtraMensagens.tecnicaGlobal.replace('{nome}', tecnica.nome || 'desconhecido'));\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({ tipo: 'analista', escopo: 'global', nome: tecnica.nome, duracaoMs, ocorrencias: metricaList.at(-1)?.ocorrencias }));\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n const isTempoLimite = err.message.includes('Timeout: analista global');\n const nivelLog = isTempoLimite ? 'aviso' : 'erro';\n const prefixo = isTempoLimite ? '[CLOCK]' : '[ERRO]';\n if (nivelLog === 'aviso') {\n log.aviso(`${prefixo} ${err.message}`);\n } else {\n log.erro(`${prefixo} ${ExecutorExtraMensagens.erroTecnicaGlobal.replace('{prefixo}', prefixo).replace('{nome}', tecnica.nome || 'desconhecido').replace('{erro}', err.message)}`);\n if (err.stack && (opts?.verbose || config.DEV_MODE)) {\n log.info(ExecutorExtraMensagens.stackTrace);\n log.info(err.stack);\n }\n }\n pushFn(ocorrenciaErroAnalista({\n mensagem: isTempoLimite ? `Timeout na técnica global '${tecnica.nome}': ${timeoutMs}ms excedido` : `Falha na técnica global '${tecnica.nome}': ${err.message}`,\n relPath: '[execução global]',\n origem: tecnica.nome,\n stack: !isTempoLimite && err.stack ? err.stack : undefined\n }));\n }\n }\n }\n\n // Incremental: carregar estado anterior (tipo importado de @types)\n let estadoIncremental: EstadoIncremental | null = null;\n if (config.ANALISE_INCREMENTAL_ENABLED) {\n const lido = await lerEstado<EstadoIncremental>(config.ANALISE_INCREMENTAL_STATE_PATH).catch(() => null);\n if (lido && lido.versao === config.ANALISE_INCREMENTAL_VERSION) estadoIncremental = lido;\n }\n const novoEstado: EstadoIncremental = {\n versao: config.ANALISE_INCREMENTAL_VERSION,\n arquivos: {},\n estatisticas: {\n totalReaproveitamentos: 0,\n totalArquivosProcessados: 0,\n ultimaDuracaoMs: 0\n }\n };\n function hashConteudo(elem: string) {\n try {\n // Usa xxhash64 (seed arbitrária) para performance\n return XXH.h64(elem, 0xabcd).toString(16);\n } catch {\n // Fallback para SHA1 se algo der errado\n // SHA1 usado apenas para cache de AST (fingerprinting de conteúdo)\n // Não é usado para segurança/criptografia - contexto: deduplicação de parsing\n return crypto.createHash('sha1').update(elem).digest('hex');\n }\n }\n\n await processGlobalTechniques(tecnicas, contextoGlobalBase, pushOcorrencia, metricasAnalistas, opts);\n\n async function processarWorkerPool(): Promise<ResultadoInquisicao> {\n log.info(ExecutorExtraMensagens.modoRapido);\n const wp = new WorkerPool({\n enabled: true,\n maxWorkers: config.WORKER_POOL_MAX_WORKERS || undefined,\n batchSize: 10,\n timeoutMs: config.ANALISE_TIMEOUT_POR_ANALISTA_MS\n });\n const resultado = await wp.processFiles(\n fileEntriesComAst,\n tecnicas.filter(t => !t.global),\n contextoGlobalBase\n );\n pushOcorrencia(...resultado.occurrences);\n metricasAnalistas.push(...resultado.metrics);\n const duracao = performance.now() - inicioExecucao;\n log.sucesso(ExecutorExtraMensagens.analiseRapidaConcluida.replace('{arquivos}', String(fileEntriesComAst.length)).replace('{duracao}', formatMs(duracao)));\n\n if (config.ANALISE_INCREMENTAL_ENABLED) {\n try {\n for (const entry of fileEntriesComAst) {\n const hash = hashConteudo(entry.content ?? '');\n novoEstado.arquivos[entry.relPath] = { hash, ocorrencias: [], reaproveitadoCount: 0 };\n }\n if (novoEstado.estatisticas) {\n novoEstado.estatisticas.totalArquivosProcessados = fileEntriesComAst.length;\n novoEstado.estatisticas.ultimaDuracaoMs = duracao;\n }\n await salvarEstado(config.ANALISE_INCREMENTAL_STATE_PATH, novoEstado);\n } catch { /* Ignora erro ao salvar cache */ }\n }\n\n const metricasExecucao: MetricaExecucao = {\n totalArquivos: fileEntriesComAst.length,\n tempoTotal: duracao,\n ocorrenciasEncontradas: ocorrencias.length,\n analistas: metricasAnalistas,\n workerPool: { workersAtivos: resultado.totalProcessed, duracaoTotalMs: resultado.duration }\n };\n const resultadoFast: ResultadoInquisicao = {\n totalArquivos: fileEntriesComAst.length,\n arquivosAnalisados: fileEntriesComAst.map(e => e.relPath),\n ocorrencias,\n timestamp: Date.now(),\n duracaoMs: duracao,\n metricas: metricasExecucao\n };\n if (emitter) emitter.emit('analysis:complete', resultadoFast);\n return resultadoFast;\n }\n\n const usarWorkerPool = (() => {\n if (opts?.sequential) return false;\n if (opts?.fast !== undefined) return opts.fast;\n return config.WORKER_POOL_ENABLED && fileEntriesComAst.length > config.WORKER_POOL_AUTO_THRESHOLD;\n })();\n\n if (usarWorkerPool && fileEntriesComAst.length > 0) {\n return processarWorkerPool();\n }\n\n // Técnicas por arquivo (modo sequencial padrão)\n const contextoGlobal: ContextoExecucao = {\n ...contextoGlobalBase,\n report: event => {\n try {\n pushOcorrencia(reporter(event));\n } catch (erro) {\n // Reporter nunca deve quebrar a análise; se falhar, emite ocorrência genérica.\n pushOcorrencia(ocorrenciaErroAnalista({\n mensagem: `Falha no reporter: ${erro instanceof Error ? erro.message : String(erro)}`,\n relPath: event?.relPath || '[report]',\n origem: 'reporter'\n }));\n }\n }\n };\n\n const visitorCombinado = combinarVisitors(tecnicas);\n let arquivoAtual = 0;\n const totalArquivos = fileEntriesComAst.length;\n // Limiar para logs detalhados por arquivo\n const LIMIAR_DETALHE_TOTAL = 100; // até aqui permite detalhar por arquivo\n const LIMIAR_DETALHE_LIMITADO_MAX = 250; // até aqui permite \"Arquivo X/Y\" com throttle\n // Define passo de logging quando em modo verbose para evitar spam massivo\n\n function passoDeLog(total: number): number {\n // Assumimos faixas: até 100 => cada arquivo; 101-250 => a cada 10; 251-500 => a cada 25; >500 => a cada 100\n if (total <= 100) return 1;\n if (total <= 250) return 10;\n if (total <= 500) return 25;\n return 100;\n }\n const frames = ['->', '=>', '>>', '=>'] as const;\n const stepVerbose = passoDeLog(totalArquivos);\n const detalharPorArquivo = (opts?.verbose ?? false) && totalArquivos <= LIMIAR_DETALHE_TOTAL;\n const permitirArquivoXY = (opts?.verbose ?? false) && totalArquivos <= LIMIAR_DETALHE_LIMITADO_MAX;\n\n // Inicializa sistema de logs inteligente\n logAnalistas.iniciarBatch(totalArquivos);\n\n // Pool de objetos reutilizáveis entre arquivos (reduz GC pressure)\n const resultadosOtimizados = new Map<string, unknown[]>();\n\n for (const entry of fileEntriesComAst) {\n arquivoAtual++;\n resultadosOtimizados.clear();\n if (opts?.compact) {\n if (arquivoAtual === totalArquivos) {\n log.info(ExecutorExtraMensagens.arquivosAnalisados.replace('{total}', String(totalArquivos)));\n }\n } else if (opts?.verbose) {\n // Em verbose: detalha por arquivo somente até o limiar; entre 101-250 mostra \"Arquivo X/Y\" com throttle; acima disso, só resumo de progresso.\n if (permitirArquivoXY) {\n if (arquivoAtual === 1 || arquivoAtual % stepVerbose === 0 || arquivoAtual === totalArquivos) {\n const seta = frames[arquivoAtual % frames.length];\n log.info(ExecutorExtraMensagens.arquivoAtual.replace('{seta}', seta).replace('{atual}', String(arquivoAtual)).replace('{total}', String(totalArquivos)).replace('{arquivo}', entry.relPath));\n }\n } else {\n if (arquivoAtual === 1 || arquivoAtual % stepVerbose === 0 || arquivoAtual === totalArquivos) {\n log.info(ExecutorExtraMensagens.progresso.replace('{atual}', String(arquivoAtual)).replace('{total}', String(totalArquivos)));\n }\n }\n } else if (arquivoAtual % 50 === 0 || arquivoAtual === totalArquivos) {\n // Modo padrão: log apenas a cada 50 arquivos para reduzir ruído\n if (arquivoAtual === totalArquivos) {\n infoDestaque(ExecutorExtraMensagens.progresso.replace('{atual}', String(arquivoAtual)).replace('{total}', String(totalArquivos)));\n }\n }\n // Resolve AST via cache compartilhado do escopo\n const ext = path.extname(entry.relPath);\n const astDoCache = await scopeAstCache.getOrParse(entry as import('@').FileEntry, ext);\n const astParaUso = astDoCache ?? entry.ast;\n // Verifica incremento com fallback para diff estrutural\n const conteudo = entry.content ?? '';\n const hash = hashConteudo(conteudo);\n const cacheAnterior = estadoIncremental?.arquivos[entry.relPath];\n let reaproveitou = false;\n if (config.ANALISE_INCREMENTAL_ENABLED && cacheAnterior) {\n if (cacheAnterior.hash === hash) {\n // Conteúdo exato igual → reuso total\n reaproveitou = true;\n } else if (cacheAnterior.hashEstrutural) {\n // Conteúdo mudou, verifica se apenas formatação/comentários mudaram\n const hashEstrutural = calcularHashEstrutural(astParaUso, conteudo);\n if (hashEstrutural && hashEstrutural === cacheAnterior.hashEstrutural) {\n reaproveitou = true;\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({ tipo: 'structural-reuse', arquivo: entry.relPath }));\n }\n }\n }\n if (reaproveitou) {\n pushOcorrencia(...cacheAnterior.ocorrencias);\n novoEstado.arquivos[entry.relPath] = { ...cacheAnterior, hash, hashEstrutural: cacheAnterior.hashEstrutural };\n novoEstado.arquivos[entry.relPath].reaproveitadoCount = (cacheAnterior.reaproveitadoCount || 0) + 1;\n if (novoEstado.estatisticas) {\n novoEstado.estatisticas.totalReaproveitamentos = (novoEstado.estatisticas.totalReaproveitamentos || 0) + 1;\n }\n if (detalharPorArquivo) logCore.reaproveitadoIncremental(entry.relPath);\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({\n tipo: 'incremental-reuse',\n arquivo: entry.relPath,\n ocorrencias: cacheAnterior.ocorrencias.length\n }));\n }\n }\n }\n if (reaproveitou) continue; // pula analistas\n\n // Cache de análise entre execuções\n if (config.ANALISE_CACHE_ENABLED) {\n const cached = await analysisCache.get(entry.relPath, entry.content ?? '');\n if (cached !== null) {\n pushOcorrencia(...cached);\n novoEstado.arquivos[entry.relPath] = {\n hash,\n ocorrencias: cached,\n reaproveitadoCount: 1\n };\n if (detalharPorArquivo) logCore.reaproveitadoIncremental(`${entry.relPath} (analysis cache)`);\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({ tipo: 'cache-reuse', arquivo: entry.relPath, ocorrencias: cached.length }));\n }\n continue;\n }\n }\n\n // Otimização: Travessia única para analistas com visitor\n if (Object.keys(visitorCombinado).length > 0 && astParaUso) {\n try {\n const astParam = hasNodeType(astParaUso) ? astParaUso.node : astParaUso;\n traverse(astParam, visitorCombinado, undefined, {\n relPath: entry.relPath,\n contexto: contextoGlobal,\n resultados: resultadosOtimizados // Mapa de analista -> achados\n });\n } catch (err) {\n log.aviso(`[CLOCK] Falha na travessia otimizada para ${entry.relPath}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n for (const tecnica of tecnicas) {\n if (tecnica.global) continue;\n if (tecnica.test && !tecnica.test(entry.relPath)) continue;\n // início medido apenas por analista específico (inicioAnalista)\n const timeoutMs = config.ANALISE_TIMEOUT_POR_ANALISTA_MS;\n try {\n const inicioAnalista = performance.now();\n\n // Log adaptativo: início da análise\n const tamanhoArquivo = entry.content ? Math.round(entry.content.length / 1024) : 0;\n logAnalistas.iniciandoAnalista(tecnica.nome || 'analista-desconhecido', entry.relPath, tamanhoArquivo);\n\n let resultado: Awaited<ReturnType<typeof tecnica.aplicar>> | undefined;\n const astNode = hasNodeType(astParaUso) ? astParaUso.node : null;\n const temVisitor = 'visitor' in tecnica;\n const astParam = temVisitor ? {\n node: astNode,\n preColetado: resultadosOtimizados.get(tecnica.nome || '')\n } as unknown as import('@babel/traverse').NodePath<import('@babel/types').Node> : null;\n const execPromise = tecnica.aplicar(entry.content ?? '', entry.relPath, astParam, entry.fullCaminho, contextoGlobal);\n if (timeoutMs > 0) {\n resultado = await withTimeout(execPromise, timeoutMs,\n ExecutorExtraMensagens.timeoutAnalista.replace('{nome}', tecnica.nome || 'desconhecido').replace('{timeout}', String(timeoutMs)).replace('{arquivo}', entry.relPath));\n } else {\n resultado = await execPromise;\n }\n if (Array.isArray(resultado)) {\n pushOcorrencia(...resultado);\n }\n const duracaoMs = performance.now() - inicioAnalista;\n if (config.ANALISE_METRICAS_ENABLED) {\n metricasAnalistas.push({\n nome: tecnica.nome || 'desconhecido',\n duracaoMs,\n ocorrencias: Array.isArray(resultado) ? resultado.length : resultado ? 1 : 0,\n global: false\n });\n }\n\n // Log adaptativo: conclusão da análise\n const ocorrenciasContagem = Array.isArray(resultado) ? resultado.length : resultado ? 1 : 0;\n logAnalistas.concluido(tecnica.nome || 'analista-desconhecido', entry.relPath, ocorrenciasContagem, duracaoMs);\n if (detalharPorArquivo) {\n log.info(`[FILE] '${tecnica.nome}' analisou ${entry.relPath} em ${formatMs(duracaoMs)}`);\n }\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({\n tipo: 'analista',\n arquivo: entry.relPath,\n nome: tecnica.nome,\n duracaoMs,\n ocorrencias: metricasAnalistas.at(-1)?.ocorrencias\n }));\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n const isTempoLimite = err.message.includes('Timeout: analista');\n const nivelLog = isTempoLimite ? 'aviso' : 'erro';\n const prefixo = isTempoLimite ? '[CLOCK]' : '[ERRO]';\n\n // Log adaptativo para erros e timeouts\n if (isTempoLimite) {\n const duracaoEstimada = config.ANALISE_TIMEOUT_POR_ANALISTA_MS || 30000;\n logAnalistas.timeout(tecnica.nome || 'analista-desconhecido', duracaoEstimada);\n } else {\n logAnalistas.erro(tecnica.nome || 'analista-desconhecido', err.message);\n }\n\n // Log apropriado baseado no tipo de erro\n if (nivelLog === 'aviso') {\n log.aviso(`${prefixo} ${err.message}`);\n } else {\n log.erro(`${prefixo} Erro em '${tecnica.nome}' para ${entry.relPath}: ${err.message}`);\n // Exibe stack trace em modo verbose ou debug\n if (err.stack) {\n if (opts?.verbose || config.DEV_MODE) {\n log.info(ExecutorExtraMensagens.stackTrace);\n log.info(err.stack);\n }\n }\n }\n\n // Registra ocorrência de erro/timeout com stack trace\n pushOcorrencia(ocorrenciaErroAnalista({\n mensagem: isTempoLimite ? `Timeout na técnica '${tecnica.nome}' para ${entry.relPath}: ${timeoutMs}ms excedido` : `Falha na técnica '${tecnica.nome}' para ${entry.relPath}: ${err.message}`,\n relPath: entry.relPath,\n origem: tecnica.nome,\n stack: !isTempoLimite && err.stack ? err.stack : undefined\n }));\n }\n }\n // Salva no cache de análise entre execuções\n if (config.ANALISE_CACHE_ENABLED) {\n const ocorrArquivoCache = ocorrencias.filter(o => o.relPath === entry.relPath);\n await analysisCache.set(entry.relPath, entry.content ?? '', ocorrArquivoCache);\n }\n\n // Salva estado incremental do arquivo processado\n if (config.ANALISE_INCREMENTAL_ENABLED) {\n const ocorrArq = ocorrencias.filter(ocorrencia => ocorrencia.relPath === entry.relPath);\n // Extrai métricas por analista específicas do arquivo\n const analistasArquivo: Record<string, {\n ocorrencias: number;\n duracaoMs: number;\n }> = {};\n for (const metrica of metricasAnalistas.filter(metrica => !metrica.global)) {\n analistasArquivo[metrica.nome] = {\n ocorrencias: metrica.ocorrencias,\n duracaoMs: metrica.duracaoMs\n };\n }\n const hashEstrutural = calcularHashEstrutural(astParaUso, conteudo);\n novoEstado.arquivos[entry.relPath] = {\n hash,\n hashEstrutural: hashEstrutural || undefined,\n ocorrencias: ocorrArq,\n analistas: analistasArquivo,\n ultimaExecucaoMs: Date.now(),\n reaproveitadoCount: 0\n };\n if (novoEstado.estatisticas) {\n novoEstado.estatisticas.totalArquivosProcessados = (novoEstado.estatisticas.totalArquivosProcessados || 0) + 1;\n }\n }\n\n // NOVO: Atualiza progresso por arquivo (não por analista)\n logAnalistas.arquivoProcessado();\n if (emitter) {\n const ocorrArquivo = ocorrencias.filter(ocorrencia => ocorrencia.relPath === entry.relPath);\n emitter.emit('file:processed', {\n relPath: entry.relPath,\n ocorrencias: ocorrArquivo.length\n });\n }\n }\n const fimExecucao = performance.now();\n const duracaoMs = Math.round(fimExecucao - inicioExecucao);\n\n logAnalistas.finalizarBatch(ocorrencias.length, duracaoMs);\n\n let metricasExecucao: MetricaExecucao | null = null;\n if (config.ANALISE_METRICAS_ENABLED) {\n const metricasGlobais = getGlobalExec().__TUTANUS_METRICAS__ || { parsingTimeMs: 0, cacheHits: 0, cacheMiss: 0 };\n const astCacheMetrics = scopeAstCache.getMetrics();\n metricasExecucao = {\n totalArquivos: fileEntriesComAst.length,\n tempoParsingMs: Math.round(metricasGlobais.parsingTimeMs),\n tempoAnaliseMs: duracaoMs,\n cacheAstHits: metricasGlobais.cacheHits,\n cacheAstMiss: metricasGlobais.cacheMiss,\n analistas: metricasAnalistas,\n astCache: {\n hits: astCacheMetrics.hits,\n misses: astCacheMetrics.misses,\n parseTimeMs: Math.round(astCacheMetrics.parseTimeMs),\n cachedFiles: astCacheMetrics.cachedFiles,\n },\n };\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({ tipo: 'metricas', ...metricasExecucao }));\n }\n try {\n await persistMetricHistory(metricasExecucao);\n } catch (erro) {\n log.erro(`Falha ao persistir histórico de métricas: ${erro instanceof Error ? erro.message : String(erro)}`);\n }\n }\n\n if (config.ANALISE_CACHE_ENABLED) {\n await analysisCache.persistir().catch(() => {});\n }\n\n if (config.ANALISE_INCREMENTAL_ENABLED) {\n if (novoEstado.estatisticas) {\n novoEstado.estatisticas.ultimaDuracaoMs = duracaoMs;\n }\n await salvarEstado(config.ANALISE_INCREMENTAL_STATE_PATH, novoEstado);\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({\n tipo: 'incremental-salvo',\n arquivos: Object.keys(novoEstado.arquivos).length,\n totalReaproveitamentos: novoEstado.estatisticas?.totalReaproveitamentos,\n processados: novoEstado.estatisticas?.totalArquivosProcessados\n }));\n }\n }\n const resultado: ResultadoInquisicao = {\n totalArquivos: fileEntriesComAst.length,\n arquivosAnalisados: fileEntriesComAst.map(e => e.relPath),\n ocorrencias,\n timestamp: Date.now(),\n duracaoMs,\n metricas: metricasExecucao || undefined\n };\n if (emitter) {\n emitter.emit('analysis:complete', resultado);\n }\n return resultado;\n}\n\nexport function registrarUltimasMetricas(metricas: MetricaExecucao | undefined): void {\n try {\n getGlobalExec().__ULTIMAS_METRICAS_TUTANUS__ = metricas || null;\n } catch {\n /* ignore */\n }\n}"]}
|
|
@@ -34,16 +34,16 @@ function getSimbolosLog() {
|
|
|
34
34
|
if (s && typeof s === 'object')
|
|
35
35
|
return s;
|
|
36
36
|
return {
|
|
37
|
-
info: '
|
|
37
|
+
info: '[INFO]',
|
|
38
38
|
sucesso: '[OK]',
|
|
39
39
|
erro: '[ERRO]',
|
|
40
40
|
aviso: '[AVISO]',
|
|
41
|
-
debug: '
|
|
42
|
-
fase: '
|
|
43
|
-
passo: '
|
|
41
|
+
debug: '[BUG]',
|
|
42
|
+
fase: '[ORANGE]',
|
|
43
|
+
passo: '[.]',
|
|
44
44
|
scan: '[BUSCA]',
|
|
45
|
-
guardian: '
|
|
46
|
-
pasta: '
|
|
45
|
+
guardian: '[SHIELD]',
|
|
46
|
+
pasta: '[FOLDER]'
|
|
47
47
|
};
|
|
48
48
|
}
|
|
49
49
|
const simbolosLogExec = getSimbolosLog();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inquisitor.js","sourceRoot":"","sources":["../../../src/core/execution/inquisitor.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n\nimport { config, isMetaPath } from '@core/config';\nimport { messages } from '@core/messages';\nimport { lerEstado } from '@shared/persistence';\nimport pLimit from 'p-limit';\nimport * as path from 'path';\n\nimport type { CacheValor, EstadoIncArquivo, FileEntry, FileEntryWithAst, InquisicaoOptions, MetricasGlobais, OcorrenciaParseErro, ResultadoInquisicaoCompleto, SimbolosLog, Tecnica } from '@';\nimport { ocorrenciaParseErro } from '@';\n\nimport { executarInquisicao as executarExecucao, registrarUltimasMetricas } from './executor.js';\nimport { scanRepository } from './scanner.js';\n\n// @tutanus-disable interface-inline-exportada\n// Justificativa: interface acoplada ao escopo global do Node, move-la para types/ causaria\n// conflitos de resolucao com OcorrenciaParseErro e CacheValor que sao importados de modulos diferentes\ninterface TutanusGlobalStore {\n __TUTANUS_AST_CACHE__?: Map<string, CacheValor>;\n __TUTANUS_METRICAS__?: MetricasGlobais;\n __TUTANUS_PARSE_ERROS__?: OcorrenciaParseErro[];\n __TUTANUS_PARSE_ERROS_ORIGINAIS__?: number;\n __TUTANUS_DIR_COUNT__?: number;\n __TUTANUS_DIR_SAMPLES__?: string[];\n}\n\nfunction getGlobal(): TutanusGlobalStore {\n return globalThis as unknown as TutanusGlobalStore;\n}\n\nconst {\n log,\n InquisidorExtraMensagens\n} = messages;\n\nfunction getObjectKeysLen(value: object | null): number {\n if (typeof value === 'object' && value !== null) {\n return Object.keys(value).length;\n }\n return 0;\n}\n\nfunction detalheErro(erro: unknown): { mensagem: string; linha?: number; coluna?: number; detalhe?: string } {\n if (!erro || typeof erro !== 'object') {\n return { mensagem: String(erro) };\n }\n const errObj = erro as { message?: string; loc?: { line?: number; column?: number } };\n return {\n mensagem: errObj.message ?? '',\n linha: errObj.loc?.line,\n coluna: errObj.loc?.column,\n detalhe: errObj.message\n };\n}\n\nfunction getSimbolosLog(): SimbolosLog {\n const logAny = log as unknown as { simbolos?: SimbolosLog };\n const s = logAny.simbolos;\n if (s && typeof s === 'object') return s;\n return {\n info: 'i️',\n sucesso: '[OK]',\n erro: '[ERRO]',\n aviso: '[AVISO]',\n debug: '🐞',\n fase: '🔶',\n passo: '▫️',\n scan: '[BUSCA]',\n guardian: '🛡️',\n pasta: '📂'\n };\n}\nconst simbolosLogExec = getSimbolosLog();\n\nfunction infoDestaque(mensagem: string): void {\n const logInfo = log as unknown as { infoDestaque?: (m: string) => void; info: (m: string) => void };\n if (typeof logInfo.infoDestaque === 'function') {\n logInfo.infoDestaque(mensagem);\n } else {\n logInfo.info(mensagem);\n }\n}\n\nasync function handleParseError(entry: FileEntry): Promise<void> {\n const g = getGlobal();\n const lista: OcorrenciaParseErro[] = g.__TUTANUS_PARSE_ERROS__ || [];\n try {\n const babel = await import('@babel/parser');\n try {\n babel.parse(entry.content || '', {\n sourceType: 'unambiguous',\n plugins: ['typescript', 'jsx', 'decorators-legacy', 'classProperties']\n } as import('@babel/parser').ParserOptions);\n lista.push(ocorrenciaParseErro({\n mensagem: messages.InquisidorMensagens.parseAstNaoGerada,\n relPath: entry.relPath,\n origem: 'parser'\n }));\n } catch (erro) {\n const { mensagem, linha, coluna, detalhe } = detalheErro(erro);\n lista.push(ocorrenciaParseErro({\n mensagem: messages.InquisidorMensagens.parseErro(mensagem || messages.InquisidorMensagens.parseAstNaoGerada),\n relPath: entry.relPath,\n origem: 'parser',\n linha,\n coluna,\n detalhe\n }));\n }\n } catch {\n lista.push(ocorrenciaParseErro({\n mensagem: messages.InquisidorMensagens.parseAstNaoGerada,\n relPath: entry.relPath,\n origem: 'parser'\n }));\n }\n g.__TUTANUS_PARSE_ERROS__ = lista;\n}\n\nasync function aplicarPriorizacao(entries: FileEntry[], metaSet: Set<string>): Promise<FileEntry[]> {\n if (!config.ANALISE_PRIORIZACAO_ENABLED || !config.ANALISE_INCREMENTAL_STATE_PATH) return entries;\n try {\n type EstadoIncremental = { arquivos: Record<string, EstadoIncArquivo> };\n const inc = await lerEstado<EstadoIncremental>(config.ANALISE_INCREMENTAL_STATE_PATH).catch(() => null);\n if (!inc?.arquivos) return entries;\n const pesos = {\n duracaoMs: config.ANALISE_PRIORIZACAO_PESOS?.duracaoMs ?? 1,\n ocorrencias: config.ANALISE_PRIORIZACAO_PESOS?.ocorrencias ?? 2,\n penalidadeReuso: config.ANALISE_PRIORIZACAO_PESOS?.penalidadeReuso ?? 0.5\n };\n const scored = entries.map(entry => {\n const hist = inc.arquivos[entry.relPath];\n let score = 0;\n if (hist) {\n let dur = 0;\n let occ = 0;\n if (hist.analistas) {\n for (const a of Object.values(hist.analistas)) {\n dur += a.duracaoMs;\n occ += a.ocorrencias;\n }\n } else {\n occ = hist.ocorrencias?.length || 0;\n }\n score = dur * pesos.duracaoMs + occ * pesos.ocorrencias - (hist.reaproveitadoCount || 0) * pesos.penalidadeReuso;\n }\n return { entry, score };\n });\n scored.sort((a, b) => b.score - a.score);\n const prioritarios = scored.filter(s => !metaSet.has(s.entry.relPath)).map(s => s.entry);\n const metas = scored.filter(s => metaSet.has(s.entry.relPath)).map(s => s.entry);\n const result = [...prioritarios, ...metas];\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({\n tipo: 'priorizacao',\n estrategia: 'historico-incremental',\n top: prioritarios.slice(0, 10).map(e => ({ arq: e.relPath, score: scored.find(s => s.entry.relPath === e.relPath)?.score })),\n metaEmpurrados: metas.length\n }));\n } else {\n const exibidos = prioritarios.slice(0, 5).map(e => e.relPath).join(', ') || '-';\n log.info(InquisidorExtraMensagens.priorizacaoAplicada.replace('{exibidos}', exibidos));\n if (metas.length) {\n log.info(InquisidorExtraMensagens.arquivosMetaMovidos.replace('{icone}', simbolosLogExec.info).replace('{total}', String(metas.length)));\n }\n }\n return result;\n } catch (erro) {\n if (config.DEV_MODE) log.erro(`Falha priorização: ${erro instanceof Error ? erro.message : String(erro)}`);\n return entries;\n }\n}\n\nconst EXTENSOES_COM_AST = new Set(Array.isArray(config.SCANNER_EXTENSOES_COM_AST) ? config.SCANNER_EXTENSOES_COM_AST : ['.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs']);\nexport async function prepararComAst(entries: FileEntry[], baseDir: string): Promise<FileEntryWithAst[]> {\n const g = getGlobal();\n const cache: Map<string, CacheValor> = g.__TUTANUS_AST_CACHE__ || new Map();\n if (!g.__TUTANUS_AST_CACHE__) g.__TUTANUS_AST_CACHE__ = cache;\n const metricas: MetricasGlobais = g.__TUTANUS_METRICAS__ || { parsingTimeMs: 0, cacheHits: 0, cacheMiss: 0 };\n metricas.parsingTimeMs = 0;\n metricas.cacheHits = 0;\n metricas.cacheMiss = 0;\n g.__TUTANUS_METRICAS__ = metricas;\n const CONCURRENCY = Number(config.AUTOANALISE_CONCURRENCY ?? 50);\n const limit = pLimit(CONCURRENCY);\n return Promise.all(entries.map(entry => limit(async (): Promise<FileEntryWithAst> => {\n let ast: import('@babel/traverse').NodePath<import('@babel/types').Node> | undefined;\n const ext = path.extname(entry.relPath);\n const mtimeMs = entry.ultimaModificacao ?? 0;\n const cacheValido = mtimeMs > 0;\n const nomeLower = entry.relPath.toLowerCase();\n const extEfetiva = nomeLower.endsWith('.d.ts') ? '.d.ts' : nomeLower.endsWith('.map') ? '.map' : ext;\n if (entry.content && EXTENSOES_COM_AST.has(extEfetiva)) {\n if (config.ANALISE_AST_CACHE_ENABLED && cacheValido) {\n const anterior = cache.get(entry.relPath);\n if (anterior && anterior.mtimeMs === mtimeMs) {\n ast = anterior.ast;\n metricas.cacheHits++;\n }\n }\n try {\n if (!ast) {\n const inicioParse = performance.now();\n const parsed = await import('@core/parsing').then(mod => mod.decifrarSintaxe(entry.content || '', extEfetiva, { relPath: entry.relPath }));\n if (parsed && typeof parsed === 'object' && getObjectKeysLen(parsed) > 0) {\n ast = undefined;\n } else if (parsed == null) {\n if (/(^|\\/)node_modules(\\/|\\\\)/.test(entry.relPath)) {\n ast = undefined;\n } else {\n await handleParseError(entry);\n }\n }\n metricas.parsingTimeMs += performance.now() - inicioParse;\n metricas.cacheMiss++;\n if (config.ANALISE_AST_CACHE_ENABLED && cacheValido) {\n cache.set(entry.relPath, { mtimeMs, size: 0, ast });\n }\n }\n } catch (erro) {\n const err = erro instanceof Error ? erro : new Error(String(erro));\n log.erro(messages.InquisidorMensagens.falhaGerarAst(entry.relPath, err.message));\n const lista: OcorrenciaParseErro[] = g.__TUTANUS_PARSE_ERROS__ || [];\n lista.push(ocorrenciaParseErro({\n mensagem: messages.InquisidorMensagens.parseErro(err.message),\n relPath: entry.relPath,\n origem: 'parser'\n }));\n g.__TUTANUS_PARSE_ERROS__ = lista;\n }\n }\n return {\n ...entry,\n ast,\n content: entry.content ?? null,\n fullCaminho: typeof entry.fullCaminho === 'string' ? entry.fullCaminho : path.resolve(baseDir, entry.relPath)\n } as FileEntryWithAst;\n })));\n}\nexport async function iniciarInquisicao(baseDir: string = process.cwd(), options: InquisicaoOptions = {}, tecnicas?: Tecnica[]): Promise<ResultadoInquisicaoCompleto> {\n const {\n includeContent = true,\n incluirMetadados: _incluirMetadados = true,\n skipExec = false\n } = options;\n log.info(InquisidorExtraMensagens.iniciandoInquisicao.replace('{icone}', simbolosLogExec.scan).replace('{diretorio}', baseDir));\n\n function onScanProgress(msg: string): void {\n try {\n const progressData = JSON.parse(msg);\n if (progressData.tipo === 'diretorio') {\n const g = getGlobal();\n g.__TUTANUS_DIR_COUNT__ = (g.__TUTANUS_DIR_COUNT__ || 0) + 1;\n if (!g.__TUTANUS_DIR_SAMPLES__) g.__TUTANUS_DIR_SAMPLES__ = [];\n if (g.__TUTANUS_DIR_SAMPLES__.length < 5) {\n g.__TUTANUS_DIR_SAMPLES__.push(progressData.caminho);\n }\n } else if (progressData.tipo === 'erro') {\n log.erro(`Erro ao ${progressData.acao} ${progressData.caminho}: ${progressData.mensagem}`);\n }\n } catch {\n if (msg && msg.includes('[AVISO]')) log.aviso(msg);\n }\n }\n\n const fileMap = await scanRepository(baseDir, {\n includeContent,\n onProgress: onScanProgress\n });\n let entriesBase = Object.values(fileMap);\n // Filtra arquivos meta com helper central: tudo fora de src/ é meta por padrão\n const metaSet = new Set(entriesBase.filter(erro => isMetaPath(erro.relPath)).map(erro => erro.relPath));\n entriesBase = await aplicarPriorizacao(entriesBase, metaSet);\n\n const fileEntries = entriesBase.map(entry => ({\n ...entry,\n ast: undefined,\n fullCaminho: typeof entry.fullCaminho === 'string' ? entry.fullCaminho : path.resolve(baseDir, entry.relPath)\n }));\n\n try {\n const g = getGlobal();\n const totalDirs = g.__TUTANUS_DIR_COUNT__ || 0;\n const amostra = Array.isArray(g.__TUTANUS_DIR_SAMPLES__) ? g.__TUTANUS_DIR_SAMPLES__ : [];\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({\n tipo: 'varredura_preliminar',\n totalDiretorios: totalDirs,\n amostraDiretorios: amostra\n }));\n }\n } catch {\n /* ignore */\n }\n\n // Agora fileEntries é FileEntryWithAst[]\n let totalArquivos = fileEntries.length;\n let ocorrencias: Array<OcorrenciaParseErro | import('@').Ocorrencia> = [];\n if (!skipExec) {\n // Inversão de Controle: tecnicas devem ser fornecidas pelo chamador sempre que skipExec=false.\n // Para compatibilidade retroativa, se não vierem definidas carregamos dinamicamente o registro.\n let tecnicasEfetivas = tecnicas;\n if (!tecnicasEfetivas) {\n const mod = await import('../../analysts/registry/registry.js');\n tecnicasEfetivas = mod.registroAnalistas;\n }\n const execRes = await executarExecucao(fileEntries, tecnicasEfetivas, baseDir, undefined);\n totalArquivos = execRes.totalArquivos;\n ocorrencias = execRes.ocorrencias;\n }\n\n const parseErros: OcorrenciaParseErro[] = getGlobal().__TUTANUS_PARSE_ERROS__ || [];\n if (parseErros.length) {\n getGlobal().__TUTANUS_PARSE_ERROS_ORIGINAIS__ = parseErros.length;\n if (config.PARSE_ERRO_AGRUPAR) {\n const porArquivo: Record<string, OcorrenciaParseErro[]> = {};\n for (const pe of parseErros) {\n const chave = pe.relPath || '__desconhecido__';\n (porArquivo[chave] = porArquivo[chave] || []).push(pe);\n }\n for (const [arq, lista] of Object.entries(porArquivo)) {\n if (lista.length <= (config.PARSE_ERRO_MAX_POR_ARQUIVO || 1)) {\n ocorrencias.push(...lista);\n } else {\n ocorrencias.push(ocorrenciaParseErro({\n mensagem: messages.InquisidorMensagens.parseErrosAgregados(lista.length),\n relPath: arq || '',\n origem: 'parser'\n }));\n }\n }\n } else {\n ocorrencias.push(...parseErros);\n }\n }\n if (!skipExec) {\n log.sucesso(InquisidorExtraMensagens.inquisicaoConcluida.replace('{total}', String(ocorrencias.length)));\n } else if (!config.COMPACT_MODE) {\n infoDestaque(`Varredura concluída: total de arquivos: ${fileEntries.length}`);\n }\n return {\n totalArquivos,\n ocorrencias,\n arquivosAnalisados: fileEntries.map(arquivo => arquivo.relPath),\n timestamp: Date.now(),\n duracaoMs: 0,\n fileEntries,\n guardian: undefined\n };\n}\nexport { executarExecucao as executarInquisicao, registrarUltimasMetricas };"]}
|
|
1
|
+
{"version":3,"file":"inquisitor.js","sourceRoot":"","sources":["../../../src/core/execution/inquisitor.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n\nimport { config, isMetaPath } from '@core/config';\nimport { messages } from '@core/messages';\nimport { lerEstado } from '@shared/persistence';\nimport pLimit from 'p-limit';\nimport * as path from 'path';\n\nimport type { CacheValor, EstadoIncArquivo, FileEntry, FileEntryWithAst, InquisicaoOptions, MetricasGlobais, OcorrenciaParseErro, ResultadoInquisicaoCompleto, SimbolosLog, Tecnica } from '@';\nimport { ocorrenciaParseErro } from '@';\n\nimport { executarInquisicao as executarExecucao, registrarUltimasMetricas } from './executor.js';\nimport { scanRepository } from './scanner.js';\n\n// @tutanus-disable interface-inline-exportada\n// Justificativa: interface acoplada ao escopo global do Node, move-la para types/ causaria\n// conflitos de resolucao com OcorrenciaParseErro e CacheValor que sao importados de modulos diferentes\ninterface TutanusGlobalStore {\n __TUTANUS_AST_CACHE__?: Map<string, CacheValor>;\n __TUTANUS_METRICAS__?: MetricasGlobais;\n __TUTANUS_PARSE_ERROS__?: OcorrenciaParseErro[];\n __TUTANUS_PARSE_ERROS_ORIGINAIS__?: number;\n __TUTANUS_DIR_COUNT__?: number;\n __TUTANUS_DIR_SAMPLES__?: string[];\n}\n\nfunction getGlobal(): TutanusGlobalStore {\n return globalThis as unknown as TutanusGlobalStore;\n}\n\nconst {\n log,\n InquisidorExtraMensagens\n} = messages;\n\nfunction getObjectKeysLen(value: object | null): number {\n if (typeof value === 'object' && value !== null) {\n return Object.keys(value).length;\n }\n return 0;\n}\n\nfunction detalheErro(erro: unknown): { mensagem: string; linha?: number; coluna?: number; detalhe?: string } {\n if (!erro || typeof erro !== 'object') {\n return { mensagem: String(erro) };\n }\n const errObj = erro as { message?: string; loc?: { line?: number; column?: number } };\n return {\n mensagem: errObj.message ?? '',\n linha: errObj.loc?.line,\n coluna: errObj.loc?.column,\n detalhe: errObj.message\n };\n}\n\nfunction getSimbolosLog(): SimbolosLog {\n const logAny = log as unknown as { simbolos?: SimbolosLog };\n const s = logAny.simbolos;\n if (s && typeof s === 'object') return s;\n return {\n info: '[INFO]',\n sucesso: '[OK]',\n erro: '[ERRO]',\n aviso: '[AVISO]',\n debug: '[BUG]',\n fase: '[ORANGE]',\n passo: '[.]',\n scan: '[BUSCA]',\n guardian: '[SHIELD]',\n pasta: '[FOLDER]'\n };\n}\nconst simbolosLogExec = getSimbolosLog();\n\nfunction infoDestaque(mensagem: string): void {\n const logInfo = log as unknown as { infoDestaque?: (m: string) => void; info: (m: string) => void };\n if (typeof logInfo.infoDestaque === 'function') {\n logInfo.infoDestaque(mensagem);\n } else {\n logInfo.info(mensagem);\n }\n}\n\nasync function handleParseError(entry: FileEntry): Promise<void> {\n const g = getGlobal();\n const lista: OcorrenciaParseErro[] = g.__TUTANUS_PARSE_ERROS__ || [];\n try {\n const babel = await import('@babel/parser');\n try {\n babel.parse(entry.content || '', {\n sourceType: 'unambiguous',\n plugins: ['typescript', 'jsx', 'decorators-legacy', 'classProperties']\n } as import('@babel/parser').ParserOptions);\n lista.push(ocorrenciaParseErro({\n mensagem: messages.InquisidorMensagens.parseAstNaoGerada,\n relPath: entry.relPath,\n origem: 'parser'\n }));\n } catch (erro) {\n const { mensagem, linha, coluna, detalhe } = detalheErro(erro);\n lista.push(ocorrenciaParseErro({\n mensagem: messages.InquisidorMensagens.parseErro(mensagem || messages.InquisidorMensagens.parseAstNaoGerada),\n relPath: entry.relPath,\n origem: 'parser',\n linha,\n coluna,\n detalhe\n }));\n }\n } catch {\n lista.push(ocorrenciaParseErro({\n mensagem: messages.InquisidorMensagens.parseAstNaoGerada,\n relPath: entry.relPath,\n origem: 'parser'\n }));\n }\n g.__TUTANUS_PARSE_ERROS__ = lista;\n}\n\nasync function aplicarPriorizacao(entries: FileEntry[], metaSet: Set<string>): Promise<FileEntry[]> {\n if (!config.ANALISE_PRIORIZACAO_ENABLED || !config.ANALISE_INCREMENTAL_STATE_PATH) return entries;\n try {\n type EstadoIncremental = { arquivos: Record<string, EstadoIncArquivo> };\n const inc = await lerEstado<EstadoIncremental>(config.ANALISE_INCREMENTAL_STATE_PATH).catch(() => null);\n if (!inc?.arquivos) return entries;\n const pesos = {\n duracaoMs: config.ANALISE_PRIORIZACAO_PESOS?.duracaoMs ?? 1,\n ocorrencias: config.ANALISE_PRIORIZACAO_PESOS?.ocorrencias ?? 2,\n penalidadeReuso: config.ANALISE_PRIORIZACAO_PESOS?.penalidadeReuso ?? 0.5\n };\n const scored = entries.map(entry => {\n const hist = inc.arquivos[entry.relPath];\n let score = 0;\n if (hist) {\n let dur = 0;\n let occ = 0;\n if (hist.analistas) {\n for (const a of Object.values(hist.analistas)) {\n dur += a.duracaoMs;\n occ += a.ocorrencias;\n }\n } else {\n occ = hist.ocorrencias?.length || 0;\n }\n score = dur * pesos.duracaoMs + occ * pesos.ocorrencias - (hist.reaproveitadoCount || 0) * pesos.penalidadeReuso;\n }\n return { entry, score };\n });\n scored.sort((a, b) => b.score - a.score);\n const prioritarios = scored.filter(s => !metaSet.has(s.entry.relPath)).map(s => s.entry);\n const metas = scored.filter(s => metaSet.has(s.entry.relPath)).map(s => s.entry);\n const result = [...prioritarios, ...metas];\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({\n tipo: 'priorizacao',\n estrategia: 'historico-incremental',\n top: prioritarios.slice(0, 10).map(e => ({ arq: e.relPath, score: scored.find(s => s.entry.relPath === e.relPath)?.score })),\n metaEmpurrados: metas.length\n }));\n } else {\n const exibidos = prioritarios.slice(0, 5).map(e => e.relPath).join(', ') || '-';\n log.info(InquisidorExtraMensagens.priorizacaoAplicada.replace('{exibidos}', exibidos));\n if (metas.length) {\n log.info(InquisidorExtraMensagens.arquivosMetaMovidos.replace('{icone}', simbolosLogExec.info).replace('{total}', String(metas.length)));\n }\n }\n return result;\n } catch (erro) {\n if (config.DEV_MODE) log.erro(`Falha priorização: ${erro instanceof Error ? erro.message : String(erro)}`);\n return entries;\n }\n}\n\nconst EXTENSOES_COM_AST = new Set(Array.isArray(config.SCANNER_EXTENSOES_COM_AST) ? config.SCANNER_EXTENSOES_COM_AST : ['.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs']);\nexport async function prepararComAst(entries: FileEntry[], baseDir: string): Promise<FileEntryWithAst[]> {\n const g = getGlobal();\n const cache: Map<string, CacheValor> = g.__TUTANUS_AST_CACHE__ || new Map();\n if (!g.__TUTANUS_AST_CACHE__) g.__TUTANUS_AST_CACHE__ = cache;\n const metricas: MetricasGlobais = g.__TUTANUS_METRICAS__ || { parsingTimeMs: 0, cacheHits: 0, cacheMiss: 0 };\n metricas.parsingTimeMs = 0;\n metricas.cacheHits = 0;\n metricas.cacheMiss = 0;\n g.__TUTANUS_METRICAS__ = metricas;\n const CONCURRENCY = Number(config.AUTOANALISE_CONCURRENCY ?? 50);\n const limit = pLimit(CONCURRENCY);\n return Promise.all(entries.map(entry => limit(async (): Promise<FileEntryWithAst> => {\n let ast: import('@babel/traverse').NodePath<import('@babel/types').Node> | undefined;\n const ext = path.extname(entry.relPath);\n const mtimeMs = entry.ultimaModificacao ?? 0;\n const cacheValido = mtimeMs > 0;\n const nomeLower = entry.relPath.toLowerCase();\n const extEfetiva = nomeLower.endsWith('.d.ts') ? '.d.ts' : nomeLower.endsWith('.map') ? '.map' : ext;\n if (entry.content && EXTENSOES_COM_AST.has(extEfetiva)) {\n if (config.ANALISE_AST_CACHE_ENABLED && cacheValido) {\n const anterior = cache.get(entry.relPath);\n if (anterior && anterior.mtimeMs === mtimeMs) {\n ast = anterior.ast;\n metricas.cacheHits++;\n }\n }\n try {\n if (!ast) {\n const inicioParse = performance.now();\n const parsed = await import('@core/parsing').then(mod => mod.decifrarSintaxe(entry.content || '', extEfetiva, { relPath: entry.relPath }));\n if (parsed && typeof parsed === 'object' && getObjectKeysLen(parsed) > 0) {\n ast = undefined;\n } else if (parsed == null) {\n if (/(^|\\/)node_modules(\\/|\\\\)/.test(entry.relPath)) {\n ast = undefined;\n } else {\n await handleParseError(entry);\n }\n }\n metricas.parsingTimeMs += performance.now() - inicioParse;\n metricas.cacheMiss++;\n if (config.ANALISE_AST_CACHE_ENABLED && cacheValido) {\n cache.set(entry.relPath, { mtimeMs, size: 0, ast });\n }\n }\n } catch (erro) {\n const err = erro instanceof Error ? erro : new Error(String(erro));\n log.erro(messages.InquisidorMensagens.falhaGerarAst(entry.relPath, err.message));\n const lista: OcorrenciaParseErro[] = g.__TUTANUS_PARSE_ERROS__ || [];\n lista.push(ocorrenciaParseErro({\n mensagem: messages.InquisidorMensagens.parseErro(err.message),\n relPath: entry.relPath,\n origem: 'parser'\n }));\n g.__TUTANUS_PARSE_ERROS__ = lista;\n }\n }\n return {\n ...entry,\n ast,\n content: entry.content ?? null,\n fullCaminho: typeof entry.fullCaminho === 'string' ? entry.fullCaminho : path.resolve(baseDir, entry.relPath)\n } as FileEntryWithAst;\n })));\n}\nexport async function iniciarInquisicao(baseDir: string = process.cwd(), options: InquisicaoOptions = {}, tecnicas?: Tecnica[]): Promise<ResultadoInquisicaoCompleto> {\n const {\n includeContent = true,\n incluirMetadados: _incluirMetadados = true,\n skipExec = false\n } = options;\n log.info(InquisidorExtraMensagens.iniciandoInquisicao.replace('{icone}', simbolosLogExec.scan).replace('{diretorio}', baseDir));\n\n function onScanProgress(msg: string): void {\n try {\n const progressData = JSON.parse(msg);\n if (progressData.tipo === 'diretorio') {\n const g = getGlobal();\n g.__TUTANUS_DIR_COUNT__ = (g.__TUTANUS_DIR_COUNT__ || 0) + 1;\n if (!g.__TUTANUS_DIR_SAMPLES__) g.__TUTANUS_DIR_SAMPLES__ = [];\n if (g.__TUTANUS_DIR_SAMPLES__.length < 5) {\n g.__TUTANUS_DIR_SAMPLES__.push(progressData.caminho);\n }\n } else if (progressData.tipo === 'erro') {\n log.erro(`Erro ao ${progressData.acao} ${progressData.caminho}: ${progressData.mensagem}`);\n }\n } catch {\n if (msg && msg.includes('[AVISO]')) log.aviso(msg);\n }\n }\n\n const fileMap = await scanRepository(baseDir, {\n includeContent,\n onProgress: onScanProgress\n });\n let entriesBase = Object.values(fileMap);\n // Filtra arquivos meta com helper central: tudo fora de src/ é meta por padrão\n const metaSet = new Set(entriesBase.filter(erro => isMetaPath(erro.relPath)).map(erro => erro.relPath));\n entriesBase = await aplicarPriorizacao(entriesBase, metaSet);\n\n const fileEntries = entriesBase.map(entry => ({\n ...entry,\n ast: undefined,\n fullCaminho: typeof entry.fullCaminho === 'string' ? entry.fullCaminho : path.resolve(baseDir, entry.relPath)\n }));\n\n try {\n const g = getGlobal();\n const totalDirs = g.__TUTANUS_DIR_COUNT__ || 0;\n const amostra = Array.isArray(g.__TUTANUS_DIR_SAMPLES__) ? g.__TUTANUS_DIR_SAMPLES__ : [];\n if (config.LOG_ESTRUTURADO) {\n log.info(JSON.stringify({\n tipo: 'varredura_preliminar',\n totalDiretorios: totalDirs,\n amostraDiretorios: amostra\n }));\n }\n } catch {\n /* ignore */\n }\n\n // Agora fileEntries é FileEntryWithAst[]\n let totalArquivos = fileEntries.length;\n let ocorrencias: Array<OcorrenciaParseErro | import('@').Ocorrencia> = [];\n if (!skipExec) {\n // Inversão de Controle: tecnicas devem ser fornecidas pelo chamador sempre que skipExec=false.\n // Para compatibilidade retroativa, se não vierem definidas carregamos dinamicamente o registro.\n let tecnicasEfetivas = tecnicas;\n if (!tecnicasEfetivas) {\n const mod = await import('../../analysts/registry/registry.js');\n tecnicasEfetivas = mod.registroAnalistas;\n }\n const execRes = await executarExecucao(fileEntries, tecnicasEfetivas, baseDir, undefined);\n totalArquivos = execRes.totalArquivos;\n ocorrencias = execRes.ocorrencias;\n }\n\n const parseErros: OcorrenciaParseErro[] = getGlobal().__TUTANUS_PARSE_ERROS__ || [];\n if (parseErros.length) {\n getGlobal().__TUTANUS_PARSE_ERROS_ORIGINAIS__ = parseErros.length;\n if (config.PARSE_ERRO_AGRUPAR) {\n const porArquivo: Record<string, OcorrenciaParseErro[]> = {};\n for (const pe of parseErros) {\n const chave = pe.relPath || '__desconhecido__';\n (porArquivo[chave] = porArquivo[chave] || []).push(pe);\n }\n for (const [arq, lista] of Object.entries(porArquivo)) {\n if (lista.length <= (config.PARSE_ERRO_MAX_POR_ARQUIVO || 1)) {\n ocorrencias.push(...lista);\n } else {\n ocorrencias.push(ocorrenciaParseErro({\n mensagem: messages.InquisidorMensagens.parseErrosAgregados(lista.length),\n relPath: arq || '',\n origem: 'parser'\n }));\n }\n }\n } else {\n ocorrencias.push(...parseErros);\n }\n }\n if (!skipExec) {\n log.sucesso(InquisidorExtraMensagens.inquisicaoConcluida.replace('{total}', String(ocorrencias.length)));\n } else if (!config.COMPACT_MODE) {\n infoDestaque(`Varredura concluída: total de arquivos: ${fileEntries.length}`);\n }\n return {\n totalArquivos,\n ocorrencias,\n arquivosAnalisados: fileEntries.map(arquivo => arquivo.relPath),\n timestamp: Date.now(),\n duracaoMs: 0,\n fileEntries,\n guardian: undefined\n };\n}\nexport { executarExecucao as executarInquisicao, registrarUltimasMetricas };"]}
|