Compare commits

..

156 Commits

Author SHA1 Message Date
4fec2e02ad test: remediate and stabilize auxiliary backend and frontend tests
- Standardized task log, LLM provider, and report profile tests.
- Relocated auxiliary tests into __tests__ directories for consistency.
- Updated git_service and defensive guards with minor stability fixes discovered during testing.
- Added UX integration tests for the reports list component.
2026-03-04 13:54:06 +03:00
c5a0823b00 feat(clean-release): complete and verify backend test suite (33 passing tests)
- Relocated and standardized tests for clean_release subsystem into __tests__ sub-packages.
- Implemented missing unit tests for preparation_service, audit_service, and stages.
- Enhanced API contract tests for candidate preparation and compliance reporting.
- Updated 023-clean-repo-enterprise coverage matrix with final verification results.
- Fixed relative import issues and model validation mismatches during test migration.
2026-03-04 13:53:43 +03:00
de1f04406f feat: Introduce and enforce test contract annotations for critical modules and update coverage tracking. 2026-03-04 12:58:42 +03:00
c473a09402 fix repo place 2026-03-04 10:04:40 +03:00
a15a2aed25 move test 2026-03-04 09:18:42 +03:00
a8f1a376ab [
{
        "file": "frontend/src/components/__tests__/task_log_viewer.test.js",
        "verdict": "APPROVED",
        "rejection_reason": "NONE",
        "audit_details": {
            "target_invoked": true,
            "pre_conditions_tested": true,
            "post_conditions_tested": true,
            "test_fixture_used": true,
            "edges_covered": true,
            "invariants_verified": true,
            "ux_states_tested": true,
            "semantic_anchors_present": true
        },
        "coverage_summary": {
            "total_edges": 2,
            "edges_tested": 2,
            "total_invariants": 1,
            "invariants_tested": 1,
            "total_ux_states": 3,
            "ux_states_tested": 3
        },
        "tier_compliance": {
            "source_tier": "CRITICAL",
            "meets_tier_requirements": true
        },
        "feedback": "Remediation successful: test tier matches CRITICAL, missing missing @TEST_EDGE no_task_id coverage added, test for @UX_FEEDBACK (autoScroll) added properly, missing inline=false (show=true) tested properly. Semantic RELATION tag fixed to VERIFIES."
    },
    {
        "file": "frontend/src/lib/components/reports/__tests__/report_card.ux.test.js",
        "verdict": "APPROVED",
        "rejection_reason": "NONE",
        "audit_details": {
            "target_invoked": true,
            "pre_conditions_tested": true,
            "post_conditions_tested": true,
            "test_fixture_used": true,
            "edges_covered": true,
            "invariants_verified": true,
            "ux_states_tested": true,
            "semantic_anchors_present": true
        },
        "coverage_summary": {
            "total_edges": 2,
            "edges_tested": 2,
            "total_invariants": 1,
            "invariants_tested": 1,
            "total_ux_states": 2,
            "ux_states_tested": 2
        },
        "tier_compliance": {
            "source_tier": "CRITICAL",
            "meets_tier_requirements": true
        },
        "feedback": "Remediation successful: @TEST_EDGE random_status and @TEST_EDGE empty_report_object tests explicitly assert on outcomes, @TEST_FIXTURE tested completely, Test tier switched to CRITICAL."
    },
    {
        "file": "backend/tests/test_logger.py",
        "verdict": "APPROVED",
        "rejection_reason": "NONE",
        "audit_details": {
            "target_invoked": true,
            "pre_conditions_tested": true,
            "post_conditions_tested": true,
            "test_fixture_used": true,
            "edges_covered": true,
            "invariants_verified": true,
            "ux_states_tested": false,
            "semantic_anchors_present": true
        },
        "coverage_summary": {
            "total_edges": 0,
            "edges_tested": 0,
            "total_invariants": 0,
            "invariants_tested": 0,
            "total_ux_states": 0,
            "ux_states_tested": 0
        },
        "tier_compliance": {
            "source_tier": "STANDARD",
            "meets_tier_requirements": true
        },
        "feedback": "Remediation successful: Test module semantic anchors added [DEF] and [/DEF] explicitly. Added missing @TIER tag and @RELATION: VERIFIES -> src/core/logger.py at the top of the file."
    }
]
2026-03-03 21:05:29 +03:00
1eb4b26254 test: remediate audit findings for task log viewer, report card and logger tests 2026-03-03 21:01:24 +03:00
a9c0d55ec8 chore: commit remaining workspace changes 2026-03-03 19:51:17 +03:00
8406628360 chore(specs): move clean-repo-enterprise spec from 020 to 023 2026-03-03 19:50:53 +03:00
b7960344e0 dev-preprod-prod logic 2026-03-01 14:39:25 +03:00
165f91b399 slug first logic 2026-03-01 13:17:05 +03:00
4769fbd258 git list refactor 2026-03-01 12:13:19 +03:00
e15eb115c2 fix(dashboards): lazy-load git status for visible rows 2026-02-28 11:21:37 +03:00
81a2e5fd61 причесываем лог 2026-02-28 10:47:19 +03:00
757300d27c fix(dashboards): stabilize grid layout and remove owners N+1 fallback 2026-02-28 10:46:47 +03:00
4f6c7ad9f3 feat(dashboards): show owners and improve grid actions UI 2026-02-28 10:04:56 +03:00
4c8de2aaf6 workflows update 2026-02-28 00:04:55 +03:00
fb577d07ae dry run migration 2026-02-27 20:48:18 +03:00
3e196783c1 semantic protocol update 2026-02-27 20:48:06 +03:00
2bc96af23f [
{
    "file": "backend/src/api/routes/__tests__/test_dashboards.py",
    "verdict": "APPROVED",
    "rejection_reason": "NONE",
    "audit_details": {
      "target_invoked": true,
      "pre_conditions_tested": true,
      "post_conditions_tested": true,
      "test_data_used": true
    },
    "feedback": "All 9 previous findings remediated. @TEST_FIXTURE data aligned, all @TEST_EDGE scenarios covered, all @PRE negative tests present, all @SIDE_EFFECT assertions added. Full contract compliance."
  },
  {
    "file": "backend/src/api/routes/__tests__/test_datasets.py",
    "verdict": "APPROVED",
    "rejection_reason": "NONE",
    "audit_details": {
      "target_invoked": true,
      "pre_conditions_tested": true,
      "post_conditions_tested": true,
      "test_data_used": true
    },
    "feedback": "All 6 previous findings remediated. Full @PRE boundary coverage including page_size>100, empty IDs, missing env. @SIDE_EFFECT assertions added. 503 error path tested."
  },
  {
    "file": "backend/src/core/auth/__tests__/test_auth.py",
    "verdict": "APPROVED",
    "rejection_reason": "NONE",
    "audit_details": {
      "target_invoked": true,
      "pre_conditions_tested": true,
      "post_conditions_tested": true,
      "test_data_used": true
    },
    "feedback": "All 4 previous findings remediated. @SIDE_EFFECT last_login verified. Inactive user @PRE negative test added. Empty hash edge case covered. provision_adfs_user tested for both new and existing user paths."
  },
  {
    "file": "backend/src/services/__tests__/test_resource_service.py",
    "verdict": "APPROVED",
    "rejection_reason": "NONE",
    "audit_details": {
      "target_invoked": true,
      "pre_conditions_tested": true,
      "post_conditions_tested": true,
      "test_data_used": true
    },
    "feedback": "Both prior recommendations implemented. Full edge case coverage for _get_last_task_for_resource. No anti-patterns detected."
  },
  {
    "file": "backend/tests/test_resource_hubs.py",
    "verdict": "APPROVED",
    "rejection_reason": "NONE",
    "audit_details": {
      "target_invoked": true,
      "pre_conditions_tested": true,
      "post_conditions_tested": true,
      "test_data_used": true
    },
    "feedback": "Pagination boundary tests added. All @TEST_EDGE scenarios now covered. No anti-patterns detected."
  },
  {
    "file": "frontend/src/lib/components/assistant/__tests__/assistant_chat.integration.test.js",
    "verdict": "APPROVED",
    "rejection_reason": "NONE",
    "audit_details": {
      "target_invoked": true,
      "pre_conditions_tested": true,
      "post_conditions_tested": true,
      "test_data_used": true
    },
    "feedback": "No changes since previous audit. Contract scanning remains sound."
  },
  {
    "file": "frontend/src/lib/components/assistant/__tests__/assistant_confirmation.integration.test.js",
    "verdict": "APPROVED",
    "rejection_reason": "NONE",
    "audit_details": {
      "target_invoked": true,
      "pre_conditions_tested": true,
      "post_conditions_tested": true,
      "test_data_used": true
    },
    "feedback": "No changes since previous audit. Confirmation flow testing remains sound."
  }
]
2026-02-27 09:59:57 +03:00
2b8e20981e test contracts 2026-02-26 19:40:00 +03:00
626449604f new test contracts 2026-02-26 19:29:07 +03:00
539d0f0aba test now STANDARD tier 2026-02-26 18:38:26 +03:00
74f889a566 update test data 2026-02-26 18:38:02 +03:00
a96baca28e test semantic harden 2026-02-26 18:26:11 +03:00
bbd62b610d +ai update 2026-02-26 17:54:23 +03:00
e97778448d Improve dashboard LLM validation UX and report flow 2026-02-26 17:53:41 +03:00
a8ccf6cb79 codex specify 2026-02-25 21:19:48 +03:00
8731343e52 feat(search): add grouped global results for tasks and reports 2026-02-25 21:09:42 +03:00
06fcf641b6 feat(search): implement global navbar search for dashboards and datasets 2026-02-25 21:07:51 +03:00
ca30ab4ef4 fix(ui): use global environment context on datasets page 2026-02-25 20:59:24 +03:00
bc6d75f0a6 fix(auth): defer environment context fetch until token is available 2026-02-25 20:58:14 +03:00
f3fa0c4cbb fix(logging): suppress per-request belief scope spam in API client 2026-02-25 20:52:12 +03:00
b5b87b6b63 feat(env): add global production context and safety indicators 2026-02-25 20:46:00 +03:00
804e9c7e47 + git config 2026-02-25 20:27:29 +03:00
82d2cb9fe3 feat: Implement recursive storage listing and directory browsing for backups, and add a migration option to fix cross-filters. 2026-02-25 20:01:33 +03:00
1d8eadf796 i18 cleanup 2026-02-25 18:31:50 +03:00
3f66a58b12 { "verdict": "APPROVED", "rejection_reason": "NONE", "audit_details": { "target_invoked": true, "pre_conditions_tested": true, "post_conditions_tested": true, "test_data_used": true }, "feedback": "The test suite robustly verifies the
MigrationEngine
 contracts. It avoids Tautologies by cleanly substituting IdMappingService without mocking the engine itself. Cross-filter parsing asserts against hard-coded, predefined validation dictionaries (no Logic Mirroring). It successfully addresses @PRE negative cases (e.g. invalid zip paths, missing YAMLs) and rigorously validates @POST file transformations (e.g. in-place UUID substitutions and archive reconstruction)." }
2026-02-25 17:47:55 +03:00
82331d3454 sync worked 2026-02-25 15:20:26 +03:00
6d068b7cea feat: Enhance ID mapping service robustness, add defensive guards, and expand migration engine and API testing. 2026-02-25 14:44:21 +03:00
23416e51d3 ready for test 2026-02-25 13:35:09 +03:00
0d4a61698c workflow agy update 2026-02-25 13:29:14 +03:00
2739d4c68b tasks ready 2026-02-25 13:28:24 +03:00
e3e05ab5f2 +md 2026-02-25 10:34:30 +03:00
f60eacc858 speckit update 2026-02-25 10:31:48 +03:00
6e9f4642db { "verdict": "APPROVED", "rejection_reason": "NONE", "audit_details": { "target_invoked": true, "pre_conditions_tested": true, "post_conditions_tested": true, "test_data_used": true }, "feedback": "Both test files have successfully passed the audit. The 'task_log_viewer.test.js' suite now correctly imports and mounts the real Svelte component using Test Library, fully eliminating the logic mirror/tautology issue. The 'test_logger.py' suite now properly implements negative tests for the @PRE constraint in 'belief_scope' and fully verifies all @POST effects triggered by 'configure_logger'." } 2026-02-24 21:55:13 +03:00
64b7ab8703 semantic update 2026-02-24 21:08:12 +03:00
0100ed88dd chore(gitignore): unignore frontend dashboards routes and track pages 2026-02-24 16:16:41 +03:00
0f9df3715f fix(validation): respect settings-bound provider and correct multimodal heuristic 2026-02-24 16:04:14 +03:00
c8ef49f067 fix(llm-validation): accept stepfun multimodal models and return 422 on capability mismatch 2026-02-24 16:00:23 +03:00
24cb95ebe2 fix(llm): skip unsupported json_object mode for openrouter stepfun models 2026-02-24 14:22:08 +03:00
473c81d9ba feat(assistant-chat): add animated thinking loader while waiting for response 2026-02-24 14:15:35 +03:00
ce3bc1e671 fix(task-drawer): keep drawer above assistant dim overlay 2026-02-24 14:12:34 +03:00
c3299f8bdf fix(task-drawer): render as side column without modal overlay when opened from assistant 2026-02-24 14:09:34 +03:00
bd52e25ff3 fix(assistant): resolve dashboard refs via LLM entities and remove deterministic parser fallback 2026-02-24 13:32:25 +03:00
2ef946f141 fix(assistant-chat): prevent stale history response from resetting selected conversation 2026-02-24 13:27:09 +03:00
2b16851026 generate semantic clean up 2026-02-24 12:51:57 +03:00
33179ce4c2 feat(assistant): add multi-dialog UX, task-aware llm settings, and i18n cleanup 2026-02-23 23:45:01 +03:00
4106542da2 feat(assistant): add conversations list, infinite history scroll, and archived tab 2026-02-23 20:27:51 +03:00
f0831d5d28 chat worked 2026-02-23 20:20:25 +03:00
e432915ec3 feat(assistant): implement spec 021 chat assistant flow with semantic contracts 2026-02-23 19:37:56 +03:00
7e09ecde25 Merge branch '001-unify-frontend-style' into master 2026-02-23 16:06:12 +03:00
787445398f Add Apache Superset OpenAPI documentation reference to ROOT.md 2026-02-23 16:04:42 +03:00
47cffcc35f Новый экранчик для обзора дашей 2026-02-23 15:54:20 +03:00
c30272fe8b Merge branch '020-task-reports-design' into master 2026-02-23 13:28:31 +03:00
11e8c8e132 Finalize task-020 reports navigation and stability fixes 2026-02-23 13:28:30 +03:00
40c2e2414d semantic update 2026-02-23 13:15:48 +03:00
066ef5eab5 таски готовы 2026-02-23 10:18:56 +03:00
2946ee9b42 Fix task API stability and Playwright runtime in Docker 2026-02-21 23:43:46 +03:00
5f70a239a7 feat: restore legacy data and add typed task result views 2026-02-21 23:17:56 +03:00
d67d24e7e6 db + docker 2026-02-20 20:47:39 +03:00
01efc9dae1 semantic update 2026-02-20 10:41:15 +03:00
43814511ee few shots update 2026-02-20 10:26:01 +03:00
db47e4ce55 css refactor 2026-02-19 18:24:36 +03:00
d5a5c3b902 +Svelte specific 2026-02-19 17:47:24 +03:00
066c37087d ai base 2026-02-19 17:43:45 +03:00
b40649b9ed fix tax log 2026-02-19 16:05:59 +03:00
197647d97a tests ready 2026-02-19 13:33:20 +03:00
e9e529e322 Coder + fix workflow 2026-02-19 13:33:10 +03:00
bc3ff29d2f Test logic update 2026-02-19 12:44:31 +03:00
eb8ed5da59 task panel 2026-02-19 09:43:01 +03:00
b6ae41d576 docs: amend constitution to v2.3.0 (tailwind css first principle) 2026-02-18 18:29:52 +03:00
cf42de3060 refactor 2026-02-18 17:29:46 +03:00
6062712a92 fix 2026-02-15 11:11:30 +03:00
7790a2dc51 измененные спеки таски 2026-02-10 15:53:38 +03:00
a58bef5c73 updated tasks 2026-02-10 15:04:43 +03:00
232dd947d8 linter + новые таски 2026-02-10 12:53:01 +03:00
33966548d7 Таски готовы 2026-02-09 12:35:27 +03:00
cad6e97464 semantic update 2026-02-08 22:53:54 +03:00
47a3213fb9 таски готовы 2026-02-07 12:42:32 +03:00
303d7272f8 Похоже работает 2026-02-07 11:26:06 +03:00
0711ded532 feat(llm-plugin): switch to environment API for log retrieval
- Replace local backend.log reading with Superset API /log/ fetch
- Update DashboardValidationPlugin to use SupersetClient
- Filter logs by dashboard_id and last 24 hours
- Update spec FR-006 to reflect API usage
2026-02-06 17:57:25 +03:00
495857bbee Semantic protocol update - add UX 2026-01-30 18:53:52 +03:00
df7582a8db tasks ux-reference 2026-01-30 13:35:03 +03:00
3802b0af8c feat(speckit): integrate ux reference into workflows
Introduce a UX reference stage to ensure technical plans align with
user experience goals. Adds a new template, a generation step in the
specification workflow, and mandatory validation checks during
planning to prevent technical compromises from degrading the defined
user experience.
2026-01-30 12:31:19 +03:00
1702f3a5e9 Вроде работает 2026-01-30 11:10:16 +03:00
83c24d4b85 tasks and workflow updated 2026-01-29 10:06:28 +03:00
dd596698e5 docs: amend constitution to v2.0.0 (delegate semantics to protocol + add async/testability principles) 2026-01-28 18:48:43 +03:00
0fee26a846 tasks ready 2026-01-28 18:30:23 +03:00
35096b5e23 semantic update 2026-01-28 16:57:19 +03:00
0299728d72 semantic protocol condense + script update 2026-01-28 15:49:39 +03:00
de6ff0d41b tested 2026-01-27 23:49:19 +03:00
260a90aac5 Передаем на тест 2026-01-27 16:32:08 +03:00
56a1508b38 tasks ready 2026-01-27 13:26:06 +03:00
7c0a601499 Обновил gitignore - убрал логи 2026-01-26 22:15:17 +03:00
a5b1bba226 Закончили редизайн, обновили интерфейс бэкапа 2026-01-26 22:12:35 +03:00
8f13ed3031 Выполнено, передано на тестирование 2026-01-26 21:17:05 +03:00
305b07bf8b tasks ready 2026-01-26 20:58:38 +03:00
4e1992f489 semantic update 2026-01-26 11:57:36 +03:00
ac7a6cfadc Файловое хранилище готово 2026-01-26 11:08:18 +03:00
29daebd628 Передаем на тест 2026-01-25 18:33:00 +03:00
71873b7bb3 tasks ready 2026-01-24 16:21:43 +03:00
68b25c90a8 Update .gitignore 2026-01-24 11:26:19 +03:00
e9b8794f1a Update backup scheduler task status 2026-01-24 11:26:05 +03:00
6d94d26e40 semantic cleanup 2026-01-23 21:58:32 +03:00
598dd50d1d Мультиязночность + причесывание css 2026-01-23 17:53:46 +03:00
eacb88a0e3 tasks ready 2026-01-23 14:56:05 +03:00
10676b7029 Работает создание коммитов и перенос в новый enviroment 2026-01-23 13:57:44 +03:00
2023f6c211 tasks ready 2026-01-22 23:59:16 +03:00
2111c12d0a +gitignore 2026-01-22 23:25:29 +03:00
b46133e4c1 fix error 2026-01-22 23:18:48 +03:00
6cc2fb4c9b refactor complete 2026-01-22 17:37:17 +03:00
c406f71988 ашч 2026-01-21 14:00:48 +03:00
55bdd981b1 fix(backend): standardize superset client init and auth
- Update plugins (debug, mapper, search) to explicitly map environment config to SupersetConfig
- Add authenticate method to SupersetClient for explicit session management
- Add get_environment method to ConfigManager
- Fix navbar dropdown hover stability in frontend with invisible bridge
2026-01-20 19:31:17 +03:00
15843a4607 TaskLog fix 2026-01-19 17:10:43 +03:00
8b81bb9f1f bug fixs 2026-01-19 00:07:06 +03:00
7f244a8252 bug fixes 2026-01-18 23:21:00 +03:00
c0505b4d4f semantic markup update 2026-01-18 21:29:54 +03:00
1b863bea1b semantic checker script update 2026-01-13 17:33:57 +03:00
7c6c959774 constitution update 2026-01-13 15:29:42 +03:00
554e1128b8 semantics update 2026-01-13 09:11:27 +03:00
55ca476972 tasks.md status 2026-01-12 12:35:45 +03:00
4b4d23e671 1st iter 2026-01-12 12:33:51 +03:00
e80369c8b5 tasks ready 2026-01-07 18:59:49 +03:00
ffe942c9dd docs: amend constitution to v1.6.0 (add 'Everything is a Plugin' principle) and refactor 010 plan 2026-01-07 18:36:38 +03:00
19744796e4 Product Manager role 2026-01-07 11:39:44 +03:00
a6bebe295c project map script | semantic parcer 2026-01-01 16:58:21 +03:00
e2ce346b7b backup worked 2025-12-30 22:02:51 +03:00
789e5a90e3 docs ready 2025-12-30 21:30:37 +03:00
163d03e6f5 +api rework 2025-12-30 20:08:48 +03:00
169237b31b cleaned 2025-12-30 18:20:40 +03:00
45bb8c5429 Password promt 2025-12-30 17:21:12 +03:00
17c28433bd TaskManager refactor 2025-12-29 10:13:37 +03:00
077daa0245 mappings+migrate 2025-12-27 10:16:41 +03:00
d38cda09dd tech_lead / coder 2roles 2025-12-27 08:02:59 +03:00
1a893c0bc0 semantic add 2025-12-27 07:14:08 +03:00
40ed375aa4 new loggers logic in constitution 2025-12-27 06:51:28 +03:00
5fdc92fcdf tasks ready 2025-12-27 06:37:03 +03:00
e83328b4ff Merge branch '001-migration-ui-redesign' into master 2025-12-27 05:58:35 +03:00
687f4ce565 superset_tool logger rework 2025-12-27 05:53:30 +03:00
dc9e9e0588 feat(logging): implement configurable belief state logging
- Add LoggingConfig model and logging field to GlobalSettings
- Implement belief_scope context manager for structured logging
- Add configure_logger for dynamic level and file rotation settings
- Add logging configuration UI to Settings page
- Update ConfigManager to apply logging settings on initialization and updates
2025-12-27 05:39:33 +03:00
2de3e53ab2 006 plan ready 2025-12-26 19:36:49 +03:00
40ea0580d9 001-migration-ui-redesign (#3)
Reviewed-on: #3
2025-12-26 18:17:58 +03:00
8da906738b Merge branch 'migration' into 001-migration-ui-redesign 2025-12-26 18:16:24 +03:00
d5a1c0e091 spec rules 2025-12-25 22:28:42 +03:00
ef7a0fcf92 feat(migration): implement interactive mapping resolution workflow
- Add SQLite database integration for environments and mappings
- Update TaskManager to support pausing tasks (AWAITING_MAPPING)
- Modify MigrationPlugin to detect missing mappings and wait for resolution
- Add frontend UI for handling missing mappings interactively
- Create dedicated migration routes and API endpoints
- Update .gitignore and project documentation
2025-12-25 22:27:29 +03:00
8 changed files with 2 additions and 150 deletions

Binary file not shown.

View File

@@ -27,7 +27,7 @@ class TestEncryptionManager:
# Re-implement the same logic as EncryptionManager to avoid import issues
# with the llm_provider module's relative imports
import os
key = os.getenv("ENCRYPTION_KEY", "ZcytYzi0iHIl4Ttr-GdAEk117aGRogkGvN3wiTxrPpE=").encode()
key = os.getenv("ENCRYPTION_KEY", "REMOVED_HISTORICAL_SECRET_DO_NOT_USE").encode()
fernet = Fernet(key)
class EncryptionManager:

View File

@@ -36,7 +36,7 @@ class EncryptionManager:
# @PRE: ENCRYPTION_KEY env var must be set or use default dev key.
# @POST: Fernet instance ready for encryption/decryption.
def __init__(self):
self.key = os.getenv("ENCRYPTION_KEY", "ZcytYzi0iHIl4Ttr-GdAEk117aGRogkGvN3wiTxrPpE=").encode()
self.key = os.getenv("ENCRYPTION_KEY", "REMOVED_HISTORICAL_SECRET_DO_NOT_USE").encode()
self.fernet = Fernet(self.key)
# [/DEF:EncryptionManager.__init__:Function]

Binary file not shown.

View File

@@ -1,76 +0,0 @@
#!/usr/bin/env python3
"""Debug script to test Superset API authentication"""
from pprint import pprint
from src.core.superset_client import SupersetClient
from src.core.config_manager import ConfigManager
def main():
print("Debugging Superset API authentication...")
config = ConfigManager()
# Select first available environment
environments = config.get_environments()
if not environments:
print("No environments configured")
return
env = environments[0]
print(f"\nTesting environment: {env.name}")
print(f"URL: {env.url}")
try:
# Test API client authentication
print("\n--- Testing API Authentication ---")
client = SupersetClient(env)
tokens = client.authenticate()
print("\nAPI Auth Success!")
print(f"Access Token: {tokens.get('access_token', 'N/A')}")
print(f"CSRF Token: {tokens.get('csrf_token', 'N/A')}")
# Debug cookies from session
print("\n--- Session Cookies ---")
for cookie in client.network.session.cookies:
print(f"{cookie.name}={cookie.value}")
# Test accessing UI via requests
print("\n--- Testing UI Access ---")
ui_url = env.url.rstrip('/').replace('/api/v1', '')
print(f"UI URL: {ui_url}")
# Try to access UI home page
ui_response = client.network.session.get(ui_url, timeout=30, allow_redirects=True)
print(f"Status Code: {ui_response.status_code}")
print(f"URL: {ui_response.url}")
# Check response headers
print("\n--- Response Headers ---")
pprint(dict(ui_response.headers))
print("\n--- Response Content Preview (200 chars) ---")
print(repr(ui_response.text[:200]))
if ui_response.status_code == 200:
print("\nUI Access: Success")
# Try to access a dashboard
# For testing, just use the home page
print("\n--- Checking if login is required ---")
if "login" in ui_response.url.lower() or "login" in ui_response.text.lower():
print("❌ Not logged in to UI")
else:
print("✅ Logged in to UI")
except Exception as e:
print(f"\n❌ Error: {type(e).__name__}: {e}")
import traceback
print("\nStack Trace:")
print(traceback.format_exc())
if __name__ == "__main__":
main()

View File

@@ -1,44 +0,0 @@
#!/usr/bin/env python3
"""Test script to debug API key decryption issue."""
from src.core.database import SessionLocal
from src.models.llm import LLMProvider
from cryptography.fernet import Fernet
import os
# Get the encryption key
key = os.getenv("ENCRYPTION_KEY", "ZcytYzi0iHIl4Ttr-GdAEk117aGRogkGvN3wiTxrPpE=").encode()
print(f"Encryption key (first 20 chars): {key[:20]}")
print(f"Encryption key length: {len(key)}")
# Create Fernet instance
fernet = Fernet(key)
# Get provider from database
db = SessionLocal()
provider = db.query(LLMProvider).filter(LLMProvider.id == '6c899741-4108-4196-aea4-f38ad2f0150e').first()
if provider:
print("\nProvider found:")
print(f" ID: {provider.id}")
print(f" Name: {provider.name}")
print(f" Encrypted API Key (first 50 chars): {provider.api_key[:50]}")
print(f" Encrypted API Key Length: {len(provider.api_key)}")
# Test decryption
print("\nAttempting decryption...")
try:
decrypted = fernet.decrypt(provider.api_key.encode()).decode()
print("Decryption successful!")
print(f" Decrypted key length: {len(decrypted)}")
print(f" Decrypted key (first 8 chars): {decrypted[:8]}")
print(f" Decrypted key is empty: {len(decrypted) == 0}")
except Exception as e:
print(f"Decryption failed with error: {e}")
print(f"Error type: {type(e).__name__}")
import traceback
traceback.print_exc()
else:
print("Provider not found")
db.close()

View File

@@ -1 +0,0 @@
[{"key[": 20, ")\n\n# Create Fernet instance\nfernet = Fernet(key)\n\n# Test encrypting an empty string\nempty_encrypted = fernet.encrypt(b\"": ".", "print(f": "nEncrypted empty string: {empty_encrypted"}, {"test-api-key-12345\"\ntest_encrypted = fernet.encrypt(test_key.encode()).decode()\nprint(f": "nEncrypted test key: {test_encrypted"}, {"gAAAAABphhwSZie0OwXjJ78Fk-c4Uo6doNJXipX49AX7Bypzp4ohiRX3hXPXKb45R1vhNUOqbm6Ke3-eRwu_KdWMZ9chFBKmqw==\"\nprint(f": "nStored encrypted key: {stored_key"}, {"len(stored_key)}": "Check if stored key matches empty string encryption\nif stored_key == empty_encrypted:\n print(", "string!": "else:\n print(", "print(f": "mpty string encryption: {empty_encrypted"}, {"stored_key}": "Try to decrypt the stored key\ntry:\n decrypted = fernet.decrypt(stored_key.encode()).decode()\n print(f", "print(f": "ecrypted key length: {len(decrypted)"}, {")\nexcept Exception as e:\n print(f": "nDecryption failed with error: {e"}]

View File

@@ -1,27 +0,0 @@
import os
def check_file(filepath):
try:
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
if '@TIER: CRITICAL' in content:
if '@TEST_DATA' not in content:
return filepath
except Exception as e:
print(f"Error reading {filepath}: {e}")
return None
missing_files = []
for root_dir in ['backend/src', 'frontend/src']:
for dirpath, _, filenames in os.walk(root_dir):
for name in filenames:
ext = os.path.splitext(name)[1]
if ext in ['.py', '.js', '.ts', '.svelte']:
full_path = os.path.join(dirpath, name)
res = check_file(full_path)
if res:
missing_files.append(res)
print("Files missing @TEST_DATA:")
for f in missing_files:
print(f)