codedna 0.5.2__tar.gz → 0.6.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {codedna-0.5.2 → codedna-0.6.0}/CHANGELOG.md +27 -0
- {codedna-0.5.2 → codedna-0.6.0}/PKG-INFO +1 -1
- {codedna-0.5.2 → codedna-0.6.0}/codedna/__init__.py +1 -1
- {codedna-0.5.2 → codedna-0.6.0}/codedna/cli.py +108 -0
- codedna-0.6.0/codedna/mail.py +335 -0
- {codedna-0.5.2 → codedna-0.6.0}/pyproject.toml +1 -1
- {codedna-0.5.2 → codedna-0.6.0}/.env.example +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/.github/CODEOWNERS +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/.github/dependabot.yml +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/.github/workflows/codedna.yml +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/.github/workflows/codeql.yml +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/.github/workflows/test.yml +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/.gitignore +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/.python-version +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/CONTRIBUTING.md +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/LICENSE +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/README.md +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/SECURITY.md +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/ai.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/ai_box.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/ai_fingerprint.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/analyzer.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/api.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/auth.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/bus_factor.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/db.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/demo.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/git_hook.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/integrations/__init__.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/integrations/github_bot.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/integrations/jira.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/integrations/lemonsqueezy.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/interview.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/onboarding.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/plan.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/protection.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/rate_limit.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/scorer.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/sprint_health.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/survey.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/codedna/tech_debt.py +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/.env.local.example +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/.gitignore +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/README.md +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/ai-compare/page.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/api/auth/login/route.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/api/auth/logout/route.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/api/auth/me/route.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/api/auth/register/route.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/api/billing/checkout/route.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/billing/page.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/bus-factor/page.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/commits/page.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/debt/page.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/favicon.ico +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/files/page.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/fonts/GeistMonoVF.woff +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/fonts/GeistVF.woff +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/globals.css +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/interview/page.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/layout.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/login/page.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/onboarding/page.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/page.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/pricing/page.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/protected/page.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/register/page.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/settings/integrations/page.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/app/sprints/page.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/components/AuthProvider.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/components/ClientProviders.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/components/CommitTable.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/components/CostInfoTooltip.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/components/ErrorBanner.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/components/FeatureGate.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/components/FileHeatmap.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/components/LanguageSwitcher.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/components/NavClient.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/components/OverviewTitles.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/components/QuickInsights.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/components/RiskBadge.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/components/SummaryCards.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/components/UnderstandingChart.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/components/UpgradeBanner.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/lib/api.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/lib/auth.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/lib/i18n/en.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/lib/i18n/index.tsx +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/lib/i18n/tr.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/lib/plan.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/next-env.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/next.config.mjs +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/package-lock.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/package.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/postcss.config.mjs +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/tailwind.config.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/dashboard/tsconfig.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/hooks/post-commit +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/uv.lock +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/.vscodeignore +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/MARKETPLACE_README.md +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/PUBLISH.md +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/images/icon.png +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/.bin/tsc +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/.bin/tsserver +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/.package-lock.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/LICENSE +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/README.md +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/assert/strict.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/assert.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/async_hooks.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/buffer.buffer.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/buffer.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/child_process.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/cluster.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/compatibility/disposable.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/compatibility/index.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/compatibility/indexable.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/compatibility/iterators.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/console.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/constants.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/crypto.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/dgram.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/diagnostics_channel.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/dns/promises.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/dns.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/domain.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/events.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/fs/promises.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/fs.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/globals.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/globals.typedarray.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/http.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/http2.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/https.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/index.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/inspector.generated.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/module.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/net.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/os.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/package.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/path.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/perf_hooks.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/process.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/punycode.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/querystring.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/readline/promises.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/readline.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/repl.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/sea.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/stream/consumers.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/stream/promises.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/stream/web.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/stream.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/string_decoder.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/test.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/timers/promises.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/timers.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/tls.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/trace_events.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/ts5.6/index.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/tty.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/url.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/util.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/v8.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/vm.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/wasi.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/web-globals/abortcontroller.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/web-globals/domexception.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/web-globals/events.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/web-globals/fetch.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/worker_threads.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/node/zlib.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/vscode/LICENSE +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/vscode/README.md +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/vscode/index.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/@types/vscode/package.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/LICENSE.txt +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/README.md +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/SECURITY.md +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/ThirdPartyNoticeText.txt +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/bin/tsc +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/bin/tsserver +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/_tsc.js +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/_tsserver.js +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/_typingsInstaller.js +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/cs/diagnosticMessages.generated.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/de/diagnosticMessages.generated.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/es/diagnosticMessages.generated.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/fr/diagnosticMessages.generated.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/it/diagnosticMessages.generated.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/ja/diagnosticMessages.generated.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/ko/diagnosticMessages.generated.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.decorators.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.decorators.legacy.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.dom.asynciterable.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.dom.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.dom.iterable.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.collection.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.core.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.generator.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.iterable.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.promise.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.proxy.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.reflect.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.symbol.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2016.array.include.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2016.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2016.full.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2016.intl.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.date.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.full.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.intl.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.object.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.string.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.full.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.intl.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.promise.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.regexp.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.array.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.full.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.intl.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.object.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.string.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.symbol.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.bigint.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.date.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.full.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.intl.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.number.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.promise.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.string.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2021.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2021.full.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2021.intl.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2021.promise.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2021.string.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2021.weakref.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.array.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.error.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.full.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.intl.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.object.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.regexp.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.string.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2023.array.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2023.collection.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2023.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2023.full.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2023.intl.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.collection.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.full.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.object.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.promise.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.regexp.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.string.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es5.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.es6.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.array.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.collection.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.decorators.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.disposable.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.error.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.float16.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.full.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.intl.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.iterator.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.promise.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.scripthost.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.webworker.asynciterable.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.webworker.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.webworker.importscripts.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/lib.webworker.iterable.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/pl/diagnosticMessages.generated.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/pt-br/diagnosticMessages.generated.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/ru/diagnosticMessages.generated.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/tr/diagnosticMessages.generated.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/tsc.js +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/tsserver.js +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/tsserverlibrary.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/tsserverlibrary.js +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/typesMap.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/typescript.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/typescript.js +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/typingsInstaller.js +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/watchGuard.js +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/zh-cn/diagnosticMessages.generated.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/lib/zh-tw/diagnosticMessages.generated.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/typescript/package.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/LICENSE +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/README.md +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/agent.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/api.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/balanced-pool.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/cache.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/client.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/connector.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/content-type.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/cookies.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/diagnostics-channel.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/dispatcher.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/env-http-proxy-agent.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/errors.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/eventsource.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/fetch.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/file.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/filereader.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/formdata.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/global-dispatcher.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/global-origin.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/handlers.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/header.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/index.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/interceptors.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/mock-agent.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/mock-client.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/mock-errors.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/mock-interceptor.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/mock-pool.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/package.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/patch.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/pool-stats.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/pool.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/proxy-agent.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/readable.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/retry-agent.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/retry-handler.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/util.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/webidl.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/node_modules/undici-types/websocket.d.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/out/apiClient.js.map +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/out/decorations.js.map +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/out/extension.js.map +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/out/statusBar.js.map +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/package-lock.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/package.json +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/src/apiClient.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/src/decorations.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/src/extension.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/src/statusBar.ts +0 -0
- {codedna-0.5.2 → codedna-0.6.0}/vscode-extension/tsconfig.json +0 -0
|
@@ -1,5 +1,32 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.6.0] - 2026-06-24 - "MAIL MONITOR" (MINOR)
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- **`codedna mail` command** - Gmail monitor with importance scoring
|
|
7
|
+
- Reads `timurhanhz3@gmail.com` via IMAP + App Password
|
|
8
|
+
- App Password stored at `~/.codedna/gmail_app_password` (chmod 600)
|
|
9
|
+
- State persisted at `~/.codedna/mail_state.json` (last UID, incremental check)
|
|
10
|
+
- 6 importance categories with scoring:
|
|
11
|
+
- `security` (10): token found, breach, 2FA, compromised
|
|
12
|
+
- `security` (9): password reset, suspicious login, locked account
|
|
13
|
+
- `infra` (8): deploy fail, build fail, crash, outage, domain expire
|
|
14
|
+
- `billing` (8): invoice, payment failed, subscription, card declined
|
|
15
|
+
- `business` (6): meeting, call, proposal, contract
|
|
16
|
+
- `project` (4): published, release, deploy success
|
|
17
|
+
- Noise detection auto-skips: `Re:`, newsletter, marketing, noreply
|
|
18
|
+
- Options:
|
|
19
|
+
- `--since N` (default 7): look back N days
|
|
20
|
+
- `--threshold N` (default 5): min importance score
|
|
21
|
+
- `--new-only`: only show messages newer than last check (uses UID tracking)
|
|
22
|
+
- `--show-noise`: also display noise/promo messages
|
|
23
|
+
- `--reset`: reset state and re-check all messages
|
|
24
|
+
- Output: legacy CLI aesthetic (bold cyan header, category-colored boxes, summary panel)
|
|
25
|
+
- Use case: cron `codedna mail --new-only` for daily digest
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
- Minor version bump 0.5.2 -> 0.6.0 (new user-facing command)
|
|
29
|
+
|
|
3
30
|
## [0.5.2] - 2026-06-24 - "SECURITY CHECK"
|
|
4
31
|
|
|
5
32
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codedna
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.6.0
|
|
4
4
|
Summary: AI Code Transparency Tool - detect AI-written code and measure developer understanding
|
|
5
5
|
Project-URL: Homepage, https://codedna.dev
|
|
6
6
|
Project-URL: Repository, https://github.com/natureco-official/codedna
|
|
@@ -2146,6 +2146,114 @@ def demo(
|
|
|
2146
2146
|
console.print()
|
|
2147
2147
|
|
|
2148
2148
|
|
|
2149
|
+
# ---------------------------------------------------------------------------
|
|
2150
|
+
# codedna mail (Gmail monitor with importance scoring)
|
|
2151
|
+
# ---------------------------------------------------------------------------
|
|
2152
|
+
@app.command()
|
|
2153
|
+
def mail(
|
|
2154
|
+
since: int = typer.Option(7, "--since", "-s", help="Look back N days (default: 7)"),
|
|
2155
|
+
threshold: int = typer.Option(5, "--threshold", "-t", help="Min importance score (default: 5)"),
|
|
2156
|
+
new_only: bool = typer.Option(False, "--new-only", help="Only show messages newer than last check"),
|
|
2157
|
+
show_noise: bool = typer.Option(False, "--show-noise", help="Also show noise/promo messages"),
|
|
2158
|
+
reset_state: bool = typer.Option(False, "--reset", help="Reset state and re-check all messages"),
|
|
2159
|
+
) -> None:
|
|
2160
|
+
"""Check Gmail for new important messages (security, billing, infra).
|
|
2161
|
+
|
|
2162
|
+
Reads from timurhanhz3@gmail.com via IMAP + App Password.
|
|
2163
|
+
Scores each message by category and prints only those above threshold.
|
|
2164
|
+
|
|
2165
|
+
State is persisted at ~/.codedna/mail_state.json so subsequent runs only
|
|
2166
|
+
show new messages.
|
|
2167
|
+
"""
|
|
2168
|
+
from codedna.mail import (
|
|
2169
|
+
check_mail, format_report, get_new_since_last_check,
|
|
2170
|
+
_load_state, _save_state, MailMessage,
|
|
2171
|
+
)
|
|
2172
|
+
|
|
2173
|
+
console.print()
|
|
2174
|
+
console.print("[bold cyan]🧬 CodeDNA[/bold cyan] — Mail monitor: [dim]timurhanhz3@gmail.com[/dim]\n")
|
|
2175
|
+
|
|
2176
|
+
if reset_state:
|
|
2177
|
+
from codedna.mail import _load_state
|
|
2178
|
+
state = _load_state()
|
|
2179
|
+
state["last_uid"] = "0"
|
|
2180
|
+
_save_state(state)
|
|
2181
|
+
console.print(" [green]✓[/green] Mail state reset")
|
|
2182
|
+
console.print()
|
|
2183
|
+
return
|
|
2184
|
+
|
|
2185
|
+
if new_only:
|
|
2186
|
+
# Use UID-based check (only new since last run)
|
|
2187
|
+
result = get_new_since_last_check()
|
|
2188
|
+
else:
|
|
2189
|
+
# Full check (look back N days)
|
|
2190
|
+
result = check_mail(since_days=since, threshold=threshold)
|
|
2191
|
+
|
|
2192
|
+
# ── Render: legacy CLI aesthetic ──────────────────────────────────
|
|
2193
|
+
console.print(f"[bold]─── Summary ───[/bold]")
|
|
2194
|
+
console.print(f" Total new: [cyan]{result.total_new}[/cyan] message(s)")
|
|
2195
|
+
console.print(f" Important: [bold {'red' if result.important else 'green'}]{len(result.important)}[/bold {'red' if result.important else 'green'}] (threshold ≥ {threshold})")
|
|
2196
|
+
console.print(f" Noise: [dim]{len(result.noise)}[/dim] skipped")
|
|
2197
|
+
console.print()
|
|
2198
|
+
|
|
2199
|
+
if result.errors:
|
|
2200
|
+
console.print("[bold red]─── Errors ───[/bold]")
|
|
2201
|
+
for err in result.errors:
|
|
2202
|
+
console.print(f" [red]✗[/red] {err}")
|
|
2203
|
+
console.print()
|
|
2204
|
+
|
|
2205
|
+
if result.important:
|
|
2206
|
+
console.print("[bold]─── Important Messages ───[/bold]")
|
|
2207
|
+
for m in result.important:
|
|
2208
|
+
cat_color = {
|
|
2209
|
+
"security": "red",
|
|
2210
|
+
"billing": "yellow",
|
|
2211
|
+
"infra": "yellow",
|
|
2212
|
+
"project": "cyan",
|
|
2213
|
+
"business": "magenta",
|
|
2214
|
+
}.get(m.importance_category, "white")
|
|
2215
|
+
console.print(f" [{cat_color}]■[/{cat_color}] [bold {cat_color}][{m.importance_category}][/bold {cat_color}] score={m.importance_score}")
|
|
2216
|
+
console.print(f" From: {m.from_addr}")
|
|
2217
|
+
console.print(f" Subject: [bold]{m.subject}[/bold]")
|
|
2218
|
+
console.print(f" Date: [dim]{m.date}[/dim]")
|
|
2219
|
+
if m.body_preview:
|
|
2220
|
+
preview = m.body_preview[:200].replace("\n", " ").strip()
|
|
2221
|
+
console.print(f" Preview: [dim]{preview}…[/dim]")
|
|
2222
|
+
console.print()
|
|
2223
|
+
|
|
2224
|
+
if show_noise and result.noise:
|
|
2225
|
+
console.print("[bold dim]─── Noise (skipped) ───[/bold dim]")
|
|
2226
|
+
for m in result.noise[:10]: # limit to first 10
|
|
2227
|
+
console.print(f" [dim]— {m.subject[:80]} ({m.from_addr})[/dim]")
|
|
2228
|
+
if len(result.noise) > 10:
|
|
2229
|
+
console.print(f" [dim]… and {len(result.noise) - 10} more[/dim]")
|
|
2230
|
+
console.print()
|
|
2231
|
+
|
|
2232
|
+
# ── Summary panel ────────────────────────────────────────────────
|
|
2233
|
+
if result.important:
|
|
2234
|
+
border = "red"
|
|
2235
|
+
title = f"[bold red]🔥 {len(result.important)} Important Message(s) Found[/bold red]"
|
|
2236
|
+
body = (
|
|
2237
|
+
f"[red]Action needed: review the messages above.[/red]\n\n"
|
|
2238
|
+
f"[dim]Next: run[/dim] [cyan]codedna mail --new-only[/cyan] [dim]for incremental updates.[/dim]"
|
|
2239
|
+
)
|
|
2240
|
+
elif result.total_new > 0:
|
|
2241
|
+
border = "green"
|
|
2242
|
+
title = "[bold green]✓ No important messages[/bold green]"
|
|
2243
|
+
body = (
|
|
2244
|
+
f"[green]{result.total_new} new message(s) checked, all noise/promo.[/green]\n\n"
|
|
2245
|
+
f"[dim]Run[/dim] [cyan]codedna mail --show-noise[/cyan] [dim]to see all.[/dim]"
|
|
2246
|
+
)
|
|
2247
|
+
else:
|
|
2248
|
+
border = "cyan"
|
|
2249
|
+
title = "[bold cyan]✓ No new messages[/bold cyan]"
|
|
2250
|
+
body = "[dim]Mailbox is up to date.[/dim]"
|
|
2251
|
+
|
|
2252
|
+
console.print()
|
|
2253
|
+
console.print(Panel(body, title=title, border_style=border, padding=(1, 2)))
|
|
2254
|
+
console.print()
|
|
2255
|
+
|
|
2256
|
+
|
|
2149
2257
|
# ---------------------------------------------------------------------------
|
|
2150
2258
|
# codedna security-check (pre-release secret & personal path scanner)
|
|
2151
2259
|
# ---------------------------------------------------------------------------
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Mail monitor — checks Gmail for new important messages.
|
|
3
|
+
|
|
4
|
+
Uses Gmail IMAP + App Password (stored at ~/.codedna/gmail_app_password, chmod 600).
|
|
5
|
+
State persisted at ~/.codedna/mail_state.json (last checked UID + notified count).
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import email
|
|
10
|
+
import imaplib
|
|
11
|
+
import json
|
|
12
|
+
import os
|
|
13
|
+
import re
|
|
14
|
+
import subprocess
|
|
15
|
+
from dataclasses import dataclass, field
|
|
16
|
+
from datetime import datetime, timedelta
|
|
17
|
+
from email import policy
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
from typing import Optional
|
|
20
|
+
|
|
21
|
+
GMAIL_IMAP_HOST = "imap.gmail.com"
|
|
22
|
+
GMAIL_IMAP_PORT = 993
|
|
23
|
+
APP_PASSWORD_PATH = Path.home() / ".codedna" / "gmail_app_password"
|
|
24
|
+
STATE_PATH = Path.home() / ".codedna" / "mail_state.json"
|
|
25
|
+
DEFAULT_USER = "timurhanhz3@gmail.com"
|
|
26
|
+
|
|
27
|
+
# Keywords that mark a message as important (case-insensitive).
|
|
28
|
+
# Each entry: (category, regex pattern, score 1-10)
|
|
29
|
+
IMPORTANCE_RULES = [
|
|
30
|
+
# SECURITY (highest priority)
|
|
31
|
+
("security", r"security alert|token found|token leaked|compromised|breach|vulnerability", 10),
|
|
32
|
+
("security", r"password.*reset|2fa|two[- ]factor|authentication.*fail", 9),
|
|
33
|
+
("security", r"suspicious|unauthorized|locked.*account", 9),
|
|
34
|
+
|
|
35
|
+
# BILLING / PAYMENTS
|
|
36
|
+
("billing", r"invoice|payment.*failed|payment.*due|subscription.*renew|billing", 8),
|
|
37
|
+
("billing", r"expired.*card|card.*declined|refund", 8),
|
|
38
|
+
|
|
39
|
+
# INFRASTRUCTURE / DEPLOYMENT
|
|
40
|
+
("infra", r"deploy.*fail|build.*fail|crash|error.*production|outage|downtime", 8),
|
|
41
|
+
("infra", r"ci.*fail|github actions.*fail|vercel.*deploy|cloudflare.*error", 7),
|
|
42
|
+
("infra", r"domain.*expire|ssl.*expir|renew.*domain", 7),
|
|
43
|
+
|
|
44
|
+
# PROJECT NOTIFICATIONS (npm, PyPI, GitHub)
|
|
45
|
+
("project", r"npm security alert|npm token found", 10), # explicit override
|
|
46
|
+
("project", r"published|release|deployment|build success", 4),
|
|
47
|
+
("project", r"github|npm|pypi|docker|vercel", 3),
|
|
48
|
+
|
|
49
|
+
# BUSINESS / CLIENT
|
|
50
|
+
("business", r"meeting|call|interview|proposal|contract|client", 6),
|
|
51
|
+
("business", r"invoice.*sent|quote|estimate", 5),
|
|
52
|
+
|
|
53
|
+
# SOCIAL (low priority)
|
|
54
|
+
("social", r"@.*|commented|liked|shared|invited", 1),
|
|
55
|
+
]
|
|
56
|
+
|
|
57
|
+
# Noise keywords (auto-skip)
|
|
58
|
+
NOISE_PATTERNS = [
|
|
59
|
+
r"^Re: ",
|
|
60
|
+
r"newsletter|digest|weekly update",
|
|
61
|
+
r"marketing|promotion|sale \d+%",
|
|
62
|
+
r"noreply|no-reply@",
|
|
63
|
+
r"verify your email|confirm your email", # Often auto-generated
|
|
64
|
+
]
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@dataclass
|
|
68
|
+
class MailMessage:
|
|
69
|
+
"""A parsed Gmail message."""
|
|
70
|
+
uid: str
|
|
71
|
+
from_addr: str
|
|
72
|
+
subject: str
|
|
73
|
+
date: str
|
|
74
|
+
body_preview: str
|
|
75
|
+
importance_score: int = 0
|
|
76
|
+
importance_category: str = ""
|
|
77
|
+
is_noise: bool = False
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@dataclass
|
|
81
|
+
class MailCheckResult:
|
|
82
|
+
"""Result of mail check operation."""
|
|
83
|
+
total_new: int = 0
|
|
84
|
+
important: list[MailMessage] = field(default_factory=list)
|
|
85
|
+
noise: list[MailMessage] = field(default_factory=list)
|
|
86
|
+
errors: list[str] = field(default_factory=list)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _load_state() -> dict:
|
|
90
|
+
"""Load mail check state (last UID, etc.)."""
|
|
91
|
+
if not STATE_PATH.exists():
|
|
92
|
+
return {"last_uid": "0", "last_check": None, "history": []}
|
|
93
|
+
try:
|
|
94
|
+
return json.loads(STATE_PATH.read_text())
|
|
95
|
+
except Exception:
|
|
96
|
+
return {"last_uid": "0", "last_check": None, "history": []}
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _save_state(state: dict) -> None:
|
|
100
|
+
"""Persist mail check state."""
|
|
101
|
+
STATE_PATH.parent.mkdir(parents=True, exist_ok=True)
|
|
102
|
+
STATE_PATH.write_text(json.dumps(state, ensure_ascii=False, indent=2))
|
|
103
|
+
try:
|
|
104
|
+
os.chmod(STATE_PATH, 0o600)
|
|
105
|
+
except OSError:
|
|
106
|
+
pass
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def _score_message(msg: MailMessage) -> None:
|
|
110
|
+
"""Score a message for importance based on subject + body."""
|
|
111
|
+
text = f"{msg.subject} {msg.body_preview}".lower()
|
|
112
|
+
|
|
113
|
+
# Noise detection
|
|
114
|
+
for pat in NOISE_PATTERNS:
|
|
115
|
+
if re.search(pat, text, re.IGNORECASE):
|
|
116
|
+
msg.is_noise = True
|
|
117
|
+
return
|
|
118
|
+
|
|
119
|
+
# Importance scoring (take max)
|
|
120
|
+
max_score = 0
|
|
121
|
+
best_cat = ""
|
|
122
|
+
for cat, pat, score in IMPORTANCE_RULES:
|
|
123
|
+
if re.search(pat, text, re.IGNORECASE):
|
|
124
|
+
if score > max_score:
|
|
125
|
+
max_score = score
|
|
126
|
+
best_cat = cat
|
|
127
|
+
msg.importance_score = max_score
|
|
128
|
+
msg.importance_category = best_cat
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def _connect(user: str = DEFAULT_USER) -> imaplib.IMAP4_SSL:
|
|
132
|
+
"""Connect to Gmail IMAP using App Password."""
|
|
133
|
+
if not APP_PASSWORD_PATH.exists():
|
|
134
|
+
raise FileNotFoundError(
|
|
135
|
+
f"Gmail App Password not found at {APP_PASSWORD_PATH}. "
|
|
136
|
+
f"Save the 16-char app password there with chmod 600."
|
|
137
|
+
)
|
|
138
|
+
password = APP_PASSWORD_PATH.read_text().strip()
|
|
139
|
+
imap = imaplib.IMAP4_SSL(GMAIL_IMAP_HOST, GMAIL_IMAP_PORT)
|
|
140
|
+
imap.login(user, password)
|
|
141
|
+
return imap
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def _fetch_new_messages(imap: imaplib.IMAP4_SSL, since_days: int = 1) -> list[MailMessage]:
|
|
145
|
+
"""Fetch new messages from the last N days."""
|
|
146
|
+
imap.select("INBOX")
|
|
147
|
+
since_date = (datetime.now() - timedelta(days=since_days)).strftime("%d-%b-%Y")
|
|
148
|
+
status, msg_ids = imap.search(None, f"SINCE {since_date}")
|
|
149
|
+
if not msg_ids[0]:
|
|
150
|
+
return []
|
|
151
|
+
|
|
152
|
+
messages = []
|
|
153
|
+
for mid_bytes in msg_ids[0].split():
|
|
154
|
+
mid = mid_bytes.decode()
|
|
155
|
+
status, msg_data = imap.fetch(mid_bytes, "(RFC822)")
|
|
156
|
+
if not msg_data or not msg_data[0]:
|
|
157
|
+
continue
|
|
158
|
+
raw = msg_data[0][1]
|
|
159
|
+
try:
|
|
160
|
+
parsed = email.message_from_bytes(raw, policy=policy.default)
|
|
161
|
+
except Exception:
|
|
162
|
+
continue
|
|
163
|
+
|
|
164
|
+
# Body preview (first 500 chars of text/plain)
|
|
165
|
+
body_preview = ""
|
|
166
|
+
if parsed.is_multipart():
|
|
167
|
+
for part in parsed.walk():
|
|
168
|
+
if part.get_content_type() == "text/plain":
|
|
169
|
+
try:
|
|
170
|
+
body_preview = (part.get_content() or "")[:500]
|
|
171
|
+
break
|
|
172
|
+
except Exception:
|
|
173
|
+
pass
|
|
174
|
+
else:
|
|
175
|
+
try:
|
|
176
|
+
body_preview = (parsed.get_content() or "")[:500]
|
|
177
|
+
except Exception:
|
|
178
|
+
pass
|
|
179
|
+
|
|
180
|
+
msg = MailMessage(
|
|
181
|
+
uid=mid,
|
|
182
|
+
from_addr=parsed.get("From", "?"),
|
|
183
|
+
subject=parsed.get("Subject", "(no subject)"),
|
|
184
|
+
date=parsed.get("Date", "?"),
|
|
185
|
+
body_preview=body_preview,
|
|
186
|
+
)
|
|
187
|
+
_score_message(msg)
|
|
188
|
+
messages.append(msg)
|
|
189
|
+
return messages
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def check_mail(since_days: int = 1, threshold: int = 5) -> MailCheckResult:
|
|
193
|
+
"""Check Gmail for new important messages.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
since_days: Look back N days (default: 1)
|
|
197
|
+
threshold: Min importance score to be "important" (default: 5)
|
|
198
|
+
|
|
199
|
+
Returns:
|
|
200
|
+
MailCheckResult with total count, important, and noise messages.
|
|
201
|
+
"""
|
|
202
|
+
result = MailCheckResult()
|
|
203
|
+
try:
|
|
204
|
+
imap = _connect()
|
|
205
|
+
except Exception as e:
|
|
206
|
+
result.errors.append(f"connect failed: {e}")
|
|
207
|
+
return result
|
|
208
|
+
|
|
209
|
+
try:
|
|
210
|
+
all_msgs = _fetch_new_messages(imap, since_days=since_days)
|
|
211
|
+
except Exception as e:
|
|
212
|
+
result.errors.append(f"fetch failed: {e}")
|
|
213
|
+
imap.logout()
|
|
214
|
+
return result
|
|
215
|
+
|
|
216
|
+
imap.logout()
|
|
217
|
+
|
|
218
|
+
# Filter: noise skipped, important >= threshold
|
|
219
|
+
for m in all_msgs:
|
|
220
|
+
if m.is_noise:
|
|
221
|
+
result.noise.append(m)
|
|
222
|
+
elif m.importance_score >= threshold:
|
|
223
|
+
result.important.append(m)
|
|
224
|
+
else:
|
|
225
|
+
result.noise.append(m)
|
|
226
|
+
|
|
227
|
+
result.total_new = len(all_msgs)
|
|
228
|
+
return result
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def format_report(result: MailCheckResult, threshold: int = 5) -> str:
|
|
232
|
+
"""Format mail check result as a readable report."""
|
|
233
|
+
lines = []
|
|
234
|
+
lines.append(f"📬 Mail Check — {result.total_new} new message(s)")
|
|
235
|
+
if result.errors:
|
|
236
|
+
lines.append(f"⚠ Errors: {len(result.errors)}")
|
|
237
|
+
for e in result.errors:
|
|
238
|
+
lines.append(f" - {e}")
|
|
239
|
+
if result.important:
|
|
240
|
+
lines.append(f"\n🔥 Important ({len(result.important)}):")
|
|
241
|
+
for m in result.important:
|
|
242
|
+
lines.append(f" [{m.importance_category}] score={m.importance_score}")
|
|
243
|
+
lines.append(f" From: {m.from_addr}")
|
|
244
|
+
lines.append(f" Subject: {m.subject}")
|
|
245
|
+
lines.append(f" Date: {m.date}")
|
|
246
|
+
if m.body_preview:
|
|
247
|
+
preview = m.body_preview[:200].replace("\n", " ")
|
|
248
|
+
lines.append(f" Preview: {preview}...")
|
|
249
|
+
if result.noise:
|
|
250
|
+
lines.append(f"\n📭 Noise ({len(result.noise)}): skipped")
|
|
251
|
+
return "\n".join(lines)
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def get_new_since_last_check() -> MailCheckResult:
|
|
255
|
+
"""Check Gmail for messages newer than the last seen UID."""
|
|
256
|
+
state = _load_state()
|
|
257
|
+
last_uid = state.get("last_uid", "0")
|
|
258
|
+
|
|
259
|
+
result = MailCheckResult()
|
|
260
|
+
try:
|
|
261
|
+
imap = _connect()
|
|
262
|
+
imap.select("INBOX")
|
|
263
|
+
# Get all UIDs
|
|
264
|
+
status, all_uids = imap.uid("SEARCH", None, "ALL")
|
|
265
|
+
if not all_uids[0]:
|
|
266
|
+
imap.logout()
|
|
267
|
+
return result
|
|
268
|
+
|
|
269
|
+
uids = all_uids[0].split()
|
|
270
|
+
if last_uid in uids:
|
|
271
|
+
# Find new ones after last_uid
|
|
272
|
+
last_idx = uids.index(last_uid)
|
|
273
|
+
new_uids = uids[last_idx + 1:]
|
|
274
|
+
else:
|
|
275
|
+
new_uids = uids
|
|
276
|
+
|
|
277
|
+
if not new_uids:
|
|
278
|
+
imap.logout()
|
|
279
|
+
return result
|
|
280
|
+
|
|
281
|
+
# Fetch new ones
|
|
282
|
+
for uid_bytes in new_uids:
|
|
283
|
+
uid_str = uid_bytes.decode()
|
|
284
|
+
status, msg_data = imap.uid("FETCH", uid_bytes, "(RFC822)")
|
|
285
|
+
if not msg_data or not msg_data[0]:
|
|
286
|
+
continue
|
|
287
|
+
raw = msg_data[0][1]
|
|
288
|
+
try:
|
|
289
|
+
parsed = email.message_from_bytes(raw, policy=policy.default)
|
|
290
|
+
except Exception:
|
|
291
|
+
continue
|
|
292
|
+
|
|
293
|
+
body_preview = ""
|
|
294
|
+
if parsed.is_multipart():
|
|
295
|
+
for part in parsed.walk():
|
|
296
|
+
if part.get_content_type() == "text/plain":
|
|
297
|
+
try:
|
|
298
|
+
body_preview = (part.get_content() or "")[:500]
|
|
299
|
+
break
|
|
300
|
+
except Exception:
|
|
301
|
+
pass
|
|
302
|
+
else:
|
|
303
|
+
try:
|
|
304
|
+
body_preview = (parsed.get_content() or "")[:500]
|
|
305
|
+
except Exception:
|
|
306
|
+
pass
|
|
307
|
+
|
|
308
|
+
msg = MailMessage(
|
|
309
|
+
uid=uid_str,
|
|
310
|
+
from_addr=parsed.get("From", "?"),
|
|
311
|
+
subject=parsed.get("Subject", "(no subject)"),
|
|
312
|
+
date=parsed.get("Date", "?"),
|
|
313
|
+
body_preview=body_preview,
|
|
314
|
+
)
|
|
315
|
+
_score_message(msg)
|
|
316
|
+
|
|
317
|
+
if msg.is_noise:
|
|
318
|
+
result.noise.append(msg)
|
|
319
|
+
elif msg.importance_score >= 5:
|
|
320
|
+
result.important.append(msg)
|
|
321
|
+
else:
|
|
322
|
+
result.noise.append(msg)
|
|
323
|
+
|
|
324
|
+
# Update state to highest UID
|
|
325
|
+
new_max = max(int(u) for u in uids)
|
|
326
|
+
state["last_uid"] = str(new_max)
|
|
327
|
+
state["last_check"] = datetime.now().isoformat()
|
|
328
|
+
_save_state(state)
|
|
329
|
+
|
|
330
|
+
imap.logout()
|
|
331
|
+
except Exception as e:
|
|
332
|
+
result.errors.append(f"check failed: {e}")
|
|
333
|
+
|
|
334
|
+
result.total_new = len(result.important) + len(result.noise)
|
|
335
|
+
return result
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|