marvisx-cli 0.1.0__py3-none-any.whl
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.
- core/api/__init__.py +0 -0
- core/api/agents/__init__.py +0 -0
- core/api/agents/session_health.py +59 -0
- core/api/agents/session_manager.py +206 -0
- core/api/bin/marvisx-state-hook.py +182 -0
- core/api/config.py +533 -0
- core/api/db.py +1516 -0
- core/api/dependencies/__init__.py +0 -0
- core/api/dependencies/tenant.py +34 -0
- core/api/main.py +1641 -0
- core/api/mcp/__init__.py +8 -0
- core/api/mcp/_adapter.py +184 -0
- core/api/mcp/server.py +58 -0
- core/api/mcp/tools/__init__.py +59 -0
- core/api/mcp/tools/brain.py +599 -0
- core/api/mcp/tools/graph.py +380 -0
- core/api/mcp/tools/handoffs.py +112 -0
- core/api/mcp/tools/ingest.py +326 -0
- core/api/mcp/tools/learnings.py +144 -0
- core/api/mcp/tools/projects.py +99 -0
- core/api/mcp/tools/pull_requests.py +173 -0
- core/api/mcp/tools/safety.py +111 -0
- core/api/mcp/tools/search.py +79 -0
- core/api/mcp/tools/tasks.py +258 -0
- core/api/middleware/__init__.py +0 -0
- core/api/middleware/tool_call_audit.py +111 -0
- core/api/models/__init__.py +346 -0
- core/api/models/auth.py +48 -0
- core/api/models/brain.py +1006 -0
- core/api/models/common.py +76 -0
- core/api/models/costs.py +91 -0
- core/api/models/graph.py +66 -0
- core/api/models/graph_cosmo.py +125 -0
- core/api/models/graph_pr_impact.py +257 -0
- core/api/models/graph_ux.py +141 -0
- core/api/models/inbox.py +230 -0
- core/api/models/ingest_keys.py +108 -0
- core/api/models/kg.py +41 -0
- core/api/models/llm_config.py +56 -0
- core/api/models/monitoring.py +234 -0
- core/api/models/projects.py +161 -0
- core/api/models/search.py +42 -0
- core/api/models/sessions.py +322 -0
- core/api/models/tasks.py +184 -0
- core/api/models/teams.py +63 -0
- core/api/models/users.py +184 -0
- core/api/observability/__init__.py +0 -0
- core/api/observability/tracing.py +92 -0
- core/api/paths.py +26 -0
- core/api/rate_limit.py +24 -0
- core/api/rbac.py +112 -0
- core/api/routers/__init__.py +0 -0
- core/api/routers/_adapter.py +24 -0
- core/api/routers/admin_pr_impact.py +230 -0
- core/api/routers/admin_settings.py +147 -0
- core/api/routers/agent.py +1079 -0
- core/api/routers/agent_tokens.py +276 -0
- core/api/routers/app_settings.py +112 -0
- core/api/routers/audit.py +89 -0
- core/api/routers/auth.py +586 -0
- core/api/routers/bench.py +161 -0
- core/api/routers/brain.py +881 -0
- core/api/routers/brain_directions.py +527 -0
- core/api/routers/ci_checks.py +140 -0
- core/api/routers/comments.py +273 -0
- core/api/routers/costs.py +148 -0
- core/api/routers/docs_coverage.py +217 -0
- core/api/routers/docs_governance.py +63 -0
- core/api/routers/documents.py +318 -0
- core/api/routers/files.py +163 -0
- core/api/routers/finder.py +987 -0
- core/api/routers/graph.py +836 -0
- core/api/routers/handoffs.py +156 -0
- core/api/routers/inbox.py +496 -0
- core/api/routers/ingest_api_keys.py +205 -0
- core/api/routers/ingest_triage.py +1227 -0
- core/api/routers/judge.py +306 -0
- core/api/routers/kg.py +336 -0
- core/api/routers/learnings.py +253 -0
- core/api/routers/llm_config.py +130 -0
- core/api/routers/monitoring.py +347 -0
- core/api/routers/notifications.py +125 -0
- core/api/routers/pr_impact.py +315 -0
- core/api/routers/projects.py +1061 -0
- core/api/routers/pull_requests.py +312 -0
- core/api/routers/push.py +67 -0
- core/api/routers/raci.py +228 -0
- core/api/routers/search.py +125 -0
- core/api/routers/sessions.py +3100 -0
- core/api/routers/settings.py +90 -0
- core/api/routers/share_repo.py +68 -0
- core/api/routers/status_updates.py +96 -0
- core/api/routers/tags.py +45 -0
- core/api/routers/tasks.py +526 -0
- core/api/routers/teams.py +425 -0
- core/api/routers/terminal.py +105 -0
- core/api/routers/users.py +331 -0
- core/api/routers/webhooks.py +330 -0
- core/api/runtime_settings.py +84 -0
- core/api/security.py +652 -0
- core/api/services/__init__.py +0 -0
- core/api/services/audit.py +58 -0
- core/api/services/auto_approval.py +82 -0
- core/api/services/brain/__init__.py +52 -0
- core/api/services/brain/baseline.py +230 -0
- core/api/services/brain/capabilities.py +75 -0
- core/api/services/brain/cascade_rollup.py +388 -0
- core/api/services/brain/compound_bridge.py +215 -0
- core/api/services/brain/cycle.py +1242 -0
- core/api/services/brain/cycle_snapshot.py +371 -0
- core/api/services/brain/digest_collector.py +147 -0
- core/api/services/brain/direction.py +421 -0
- core/api/services/brain/drift.py +356 -0
- core/api/services/brain/drift_router.py +409 -0
- core/api/services/brain/edge_metrics.py +79 -0
- core/api/services/brain/events_reader.py +222 -0
- core/api/services/brain/findings.py +1379 -0
- core/api/services/brain/findings_reader.py +1006 -0
- core/api/services/brain/jobs.py +733 -0
- core/api/services/brain/journal.py +206 -0
- core/api/services/brain/knowledge_forms.py +92 -0
- core/api/services/brain/llm/__init__.py +37 -0
- core/api/services/brain/llm/_runner.py +62 -0
- core/api/services/brain/llm/base.py +70 -0
- core/api/services/brain/llm/cache.py +99 -0
- core/api/services/brain/llm/constants.py +46 -0
- core/api/services/brain/llm/direction_alignment.py +289 -0
- core/api/services/brain/llm/factory.py +132 -0
- core/api/services/brain/llm/finding_reasoning.py +98 -0
- core/api/services/brain/llm/finding_summary.py +92 -0
- core/api/services/brain/llm/grounding.py +46 -0
- core/api/services/brain/llm/journal_polish.py +96 -0
- core/api/services/brain/llm/local_gateway.py +426 -0
- core/api/services/brain/llm/parsers.py +71 -0
- core/api/services/brain/llm/router_glue.py +422 -0
- core/api/services/brain/memory_ops.py +1677 -0
- core/api/services/brain/models.py +140 -0
- core/api/services/brain/owner_hint.py +211 -0
- core/api/services/brain/recap.py +307 -0
- core/api/services/brain/rules/__init__.py +65 -0
- core/api/services/brain/rules/_signals.py +205 -0
- core/api/services/brain/rules/dr1_activity_without_status.py +108 -0
- core/api/services/brain/rules/dr2_decision_without_adr.py +110 -0
- core/api/services/brain/rules/dr3_stale_open_loop.py +127 -0
- core/api/services/brain/rules/dr4_docs_governance_drift.py +79 -0
- core/api/services/brain/rules/dr5_playbook_changed.py +99 -0
- core/api/services/brain/rules/dr6_external_update_unpropagated.py +100 -0
- core/api/services/brain/rules/dr7_claimed_decision_gap.py +123 -0
- core/api/services/brain/rules/dr8_direction_misalignment.py +230 -0
- core/api/services/brain/runs_reader.py +485 -0
- core/api/services/brain/scope.py +79 -0
- core/api/services/brain/sources/__init__.py +46 -0
- core/api/services/brain/sources/base.py +86 -0
- core/api/services/brain/sources/git_kg.py +393 -0
- core/api/services/brain/sources/handoffs.py +157 -0
- core/api/services/brain/sources/ingestor.py +130 -0
- core/api/services/brain/sources/learnings.py +121 -0
- core/api/services/brain/sources/pir_tasks.py +245 -0
- core/api/services/brain/watermarks.py +147 -0
- core/api/services/brain/ws_emitter.py +170 -0
- core/api/services/cc_tasks_reader.py +76 -0
- core/api/services/ci_service.py +263 -0
- core/api/services/claude_metrics.py +796 -0
- core/api/services/codex_metrics.py +364 -0
- core/api/services/conversation_reader.py +102 -0
- core/api/services/cost_service.py +243 -0
- core/api/services/crypto.py +147 -0
- core/api/services/docs_governance/__init__.py +1 -0
- core/api/services/docs_governance/confidence.py +230 -0
- core/api/services/docs_governance/config.py +87 -0
- core/api/services/docs_governance/enrichment.py +65 -0
- core/api/services/docs_governance/frontmatter_validator.py +83 -0
- core/api/services/docs_governance/hard_gates.py +221 -0
- core/api/services/docs_governance/triage_orchestrator.py +98 -0
- core/api/services/embedding_internal.py +395 -0
- core/api/services/embedding_service.py +832 -0
- core/api/services/event_dispatcher.py +167 -0
- core/api/services/events.py +70 -0
- core/api/services/git_ops.py +621 -0
- core/api/services/graph_cosmo_service.py +440 -0
- core/api/services/graph_ranker.py +306 -0
- core/api/services/graph_service.py +1589 -0
- core/api/services/inbox.py +800 -0
- core/api/services/inbox_digest.py +221 -0
- core/api/services/inbox_digest_deep_research.py +80 -0
- core/api/services/inbox_digest_jobs.py +595 -0
- core/api/services/inbox_gmail_sync.py +167 -0
- core/api/services/inbox_llm_classifier.py +906 -0
- core/api/services/inbox_source_identity.py +116 -0
- core/api/services/inbox_sources.py +456 -0
- core/api/services/inbox_taxonomy.py +195 -0
- core/api/services/inbox_tldr.py +1079 -0
- core/api/services/inbox_triage.py +899 -0
- core/api/services/ingest/__init__.py +13 -0
- core/api/services/ingest/api_key_auth.py +136 -0
- core/api/services/ingest/auto_approve.py +120 -0
- core/api/services/ingest/classifier.py +138 -0
- core/api/services/ingest/confidence.py +173 -0
- core/api/services/ingest/dispatch.py +88 -0
- core/api/services/ingest/embedding_router.py +272 -0
- core/api/services/ingest/events.py +33 -0
- core/api/services/ingest/ignore_patterns.py +79 -0
- core/api/services/ingest/image_probe.py +218 -0
- core/api/services/ingest/ingress.py +263 -0
- core/api/services/ingest/insert_saga.py +793 -0
- core/api/services/ingest/llm/__init__.py +13 -0
- core/api/services/ingest/llm/anthropic_haiku.py +23 -0
- core/api/services/ingest/llm/base.py +59 -0
- core/api/services/ingest/llm/byok_provider.py +130 -0
- core/api/services/ingest/llm/classification_context.py +301 -0
- core/api/services/ingest/llm/config_store.py +246 -0
- core/api/services/ingest/llm/factory.py +24 -0
- core/api/services/ingest/llm/kg_enricher.py +306 -0
- core/api/services/ingest/llm/local_gateway.py +821 -0
- core/api/services/ingest/llm/local_vllm.py +23 -0
- core/api/services/ingest/llm/openai_nano.py +349 -0
- core/api/services/ingest/lock_advisory.py +57 -0
- core/api/services/ingest/parser_router.py +1756 -0
- core/api/services/ingest/parsers/__init__.py +1 -0
- core/api/services/ingest/parsers/docling_parser.py +142 -0
- core/api/services/ingest/parsers/docparse_gateway.py +178 -0
- core/api/services/ingest/parsers/docx_parser.py +127 -0
- core/api/services/ingest/parsers/folder_unpacker.py +85 -0
- core/api/services/ingest/parsers/gateway_aux.py +147 -0
- core/api/services/ingest/parsers/image_parser.py +251 -0
- core/api/services/ingest/parsers/internal_markdown.py +89 -0
- core/api/services/ingest/parsers/ocr_gateway.py +117 -0
- core/api/services/ingest/parsers/ocr_pdf_parser.py +112 -0
- core/api/services/ingest/parsers/pdf_types.py +13 -0
- core/api/services/ingest/parsers/transcript_parser.py +445 -0
- core/api/services/ingest/parsers/vision_gateway.py +186 -0
- core/api/services/ingest/parsers/xlsx_parser.py +91 -0
- core/api/services/ingest/parsers/zip_unpacker.py +126 -0
- core/api/services/ingest/preflight.py +393 -0
- core/api/services/ingest/retry_voyage.py +88 -0
- core/api/services/ingest/routing_policy.py +307 -0
- core/api/services/ingest/serializers/__init__.py +1 -0
- core/api/services/ingest/serializers/xlsx_to_markdown.py +80 -0
- core/api/services/ingest/skip_log.py +74 -0
- core/api/services/ingest/watcher.py +637 -0
- core/api/services/kg/__init__.py +0 -0
- core/api/services/kg/audit.py +49 -0
- core/api/services/kg/hybrid_search.py +691 -0
- core/api/services/kg/lens.py +339 -0
- core/api/services/kg/pr_impact.py +770 -0
- core/api/services/kg/queries.py +152 -0
- core/api/services/kg/ranking.py +89 -0
- core/api/services/kg/rrf.py +143 -0
- core/api/services/kg_watcher_control.py +161 -0
- core/api/services/local_llm/__init__.py +19 -0
- core/api/services/local_llm/async_client.py +385 -0
- core/api/services/local_llm/client.py +173 -0
- core/api/services/local_llm/url_validator.py +44 -0
- core/api/services/metrics_collector.py +646 -0
- core/api/services/metrics_providers.py +65 -0
- core/api/services/model_registry.py +266 -0
- core/api/services/model_router.py +137 -0
- core/api/services/n8n_client.py +77 -0
- core/api/services/newsletter_llm_gateway.py +66 -0
- core/api/services/notification_service.py +134 -0
- core/api/services/openai_responses.py +55 -0
- core/api/services/opencode_metrics.py +375 -0
- core/api/services/opencode_sessions.py +173 -0
- core/api/services/pii_redactor.py +138 -0
- core/api/services/pr_impact_pipeline/__init__.py +21 -0
- core/api/services/pr_impact_pipeline/differ.py +421 -0
- core/api/services/pr_impact_pipeline/dispatcher.py +415 -0
- core/api/services/pr_impact_pipeline/gc.py +93 -0
- core/api/services/pr_impact_pipeline/languages.py +192 -0
- core/api/services/pr_impact_pipeline/parser.py +178 -0
- core/api/services/pr_impact_pipeline/writer.py +394 -0
- core/api/services/pr_service.py +1393 -0
- core/api/services/project_paths.py +70 -0
- core/api/services/project_status_updates.py +265 -0
- core/api/services/providers.py +276 -0
- core/api/services/push_service.py +170 -0
- core/api/services/reminder_service.py +89 -0
- core/api/services/runas.py +41 -0
- core/api/services/salience_service.py +69 -0
- core/api/services/security_collector.py +281 -0
- core/api/services/session_catalog.py +385 -0
- core/api/services/session_metrics_service.py +301 -0
- core/api/services/session_ops.py +272 -0
- core/api/services/session_state.py +173 -0
- core/api/services/share_links.py +222 -0
- core/api/services/task_transitions.py +146 -0
- core/api/services/terminal_metrics.py +462 -0
- core/api/services/terminal_metrics_dump.py +203 -0
- core/api/services/tmux.py +1205 -0
- core/api/services/webhook_service.py +422 -0
- core/api/services/workspace_sync.py +164 -0
- core/api/templates/__init__.py +1 -0
- core/api/templates/markdown_share.py +164 -0
- core/api/terminal.py +1031 -0
- core/api/tests/__init__.py +0 -0
- core/api/tests/test_agent_facing_auth_dependencies.py +132 -0
- core/api/tests/test_audit_permissions.py +133 -0
- core/api/tests/test_backfill_session_conversations.py +90 -0
- core/api/tests/test_backfill_working_seconds_msg.py +129 -0
- core/api/tests/test_claude_metrics.py +326 -0
- core/api/tests/test_codex_metrics.py +189 -0
- core/api/tests/test_finder_paths.py +74 -0
- core/api/tests/test_git_ops_merge.py +155 -0
- core/api/tests/test_learnings_check_search.py +81 -0
- core/api/tests/test_metrics_providers.py +133 -0
- core/api/tests/test_migration_087.py +164 -0
- core/api/tests/test_migration_088.py +94 -0
- core/api/tests/test_migration_089.py +116 -0
- core/api/tests/test_openai_responses.py +24 -0
- core/api/tests/test_opencode_metrics.py +740 -0
- core/api/tests/test_opencode_sessions.py +321 -0
- core/api/tests/test_pr_workflow_e2e.py +457 -0
- core/api/tests/test_projects_handoffs.py +31 -0
- core/api/tests/test_providers.py +138 -0
- core/api/tests/test_safety_bridge.py +347 -0
- core/api/tests/test_session_catalog.py +142 -0
- core/api/tests/test_session_conversations.py +512 -0
- core/api/tests/test_session_metrics_service.py +270 -0
- core/api/tests/test_session_resume_paths.py +548 -0
- core/api/tests/test_session_theme_mode_migration.py +56 -0
- core/api/tests/test_sessions_rbac.py +131 -0
- core/api/tests/test_share_edit.py +398 -0
- core/api/tests/test_share_repo.py +200 -0
- core/api/tests/test_terminal_session_manager.py +98 -0
- core/api/tests/test_terminal_upload.py +34 -0
- core/api/tests/test_tmux.py +272 -0
- core/api/tests/test_workspace_sync.py +186 -0
- core/api/tests/test_ws_ticket_in_memory.py +73 -0
- core/api/use_cases/__init__.py +11 -0
- core/api/use_cases/_context.py +89 -0
- core/api/use_cases/_errors.py +62 -0
- core/api/use_cases/_roles.py +16 -0
- core/api/use_cases/audit.py +171 -0
- core/api/use_cases/brain.py +1232 -0
- core/api/use_cases/costs.py +249 -0
- core/api/use_cases/graph.py +1153 -0
- core/api/use_cases/handoffs.py +506 -0
- core/api/use_cases/ingest_triage.py +1229 -0
- core/api/use_cases/learnings.py +538 -0
- core/api/use_cases/projects.py +705 -0
- core/api/use_cases/pull_requests.py +415 -0
- core/api/use_cases/search.py +926 -0
- core/api/use_cases/tasks.py +1495 -0
- core/api/visibility.py +141 -0
- core/cli/__init__.py +5 -0
- core/cli/_index_source.py +632 -0
- core/cli/_runtime_ctx.py +160 -0
- core/cli/_transmute.py +241 -0
- core/cli/marvis_doctor.py +704 -0
- core/cli/marvis_feedback.py +396 -0
- core/cli/marvis_governance.py +315 -0
- core/cli/marvis_hooks.py +515 -0
- core/cli/marvis_init.py +757 -0
- core/cli/marvis_mcp.py +401 -0
- core/cli/marvis_runtime.py +855 -0
- core/cli/marvis_telemetry.py +228 -0
- core/scripts/_drift_check.py +716 -0
- core/scripts/_frontmatter.py +66 -0
- core/scripts/_graph_writer.py +189 -0
- core/scripts/ast_parser.py +1553 -0
- core/scripts/install_hooks/__init__.py +1 -0
- core/scripts/install_hooks/_config.sh +109 -0
- core/scripts/install_hooks/block-dangerous-bash.sh +23 -0
- core/scripts/install_hooks/block-db-direct-write.sh +23 -0
- core/scripts/install_hooks/block-push-no-task.sh +23 -0
- core/scripts/install_hooks/block-staging-to-prod.sh +23 -0
- core/scripts/install_hooks/block-subtree-push.sh +23 -0
- core/scripts/install_hooks/config.json +53 -0
- core/scripts/install_hooks/enforce-no-merge-main.sh +23 -0
- core/scripts/install_hooks/enforce-worktree.sh +23 -0
- core/scripts/install_hooks/quality-gate.sh +170 -0
- core/scripts/install_hooks/safety_bridge.py +968 -0
- core/scripts/install_hooks/secret-scan.sh +23 -0
- core/scripts/migrate_spike_node_ids.py +122 -0
- core/scripts/populate_artifacts.py +2198 -0
- core/scripts/populate_cross_project.py +2457 -0
- core/scripts/populate_inbox_nodes.py +357 -0
- core/scripts/populate_pr_impact.py +267 -0
- core/scripts/populate_project_nodes.py +603 -0
- core/scripts/populate_touch_counter.py +337 -0
- core/scripts/reparse_failed.py +57 -0
- core/scripts/safety_bridge.py +968 -0
- core/telemetry/__init__.py +9 -0
- core/telemetry/client.py +405 -0
- core/telemetry/schema.py +122 -0
- core/wizard/__init__.py +65 -0
- core/wizard/byok_vault.py +147 -0
- core/wizard/defaults.py +58 -0
- core/wizard/state.py +117 -0
- core/wizard/steps.py +70 -0
- core/wizard/validation.py +136 -0
- marvisx_cli-0.1.0.dist-info/METADATA +201 -0
- marvisx_cli-0.1.0.dist-info/RECORD +587 -0
- marvisx_cli-0.1.0.dist-info/WHEEL +5 -0
- marvisx_cli-0.1.0.dist-info/entry_points.txt +3 -0
- marvisx_cli-0.1.0.dist-info/licenses/LICENSE +98 -0
- marvisx_cli-0.1.0.dist-info/top_level.txt +3 -0
- migrations/001_initial.sql +33 -0
- migrations/002_tasks.sql +30 -0
- migrations/003_session_management.sql +7 -0
- migrations/004_projects_comments.sql +65 -0
- migrations/005_session_intelligence.sql +15 -0
- migrations/006_settings.sql +12 -0
- migrations/007_task_scoring.sql +12 -0
- migrations/008_cost_tracking.sql +31 -0
- migrations/009_session_card_metrics.sql +3 -0
- migrations/010_monitoring.sql +55 -0
- migrations/012_agent_api.sql +21 -0
- migrations/013_session_complete.sql +8 -0
- migrations/015_pull_requests.sql +43 -0
- migrations/015_pull_requests_down.sql +5 -0
- migrations/016_users_raci.sql +116 -0
- migrations/017_task_cost_entries.sql +87 -0
- migrations/018_agents.sql +73 -0
- migrations/018_agents_down.sql +13 -0
- migrations/019_review_feedback.sql +18 -0
- migrations/020_pr_commit_sha.sql +4 -0
- migrations/021_webhook_events.sql +18 -0
- migrations/022_devx_agent_managed.sql +11 -0
- migrations/022_devx_agent_managed_down.sql +6 -0
- migrations/023_devx_p1_gate.sql +7 -0
- migrations/023_devx_p1_gate_down.sql +3 -0
- migrations/024_chat_messages.sql +16 -0
- migrations/024_pr_conversation_id.sql +8 -0
- migrations/024_task_indexes.sql +21 -0
- migrations/024_task_indexes_down.sql +7 -0
- migrations/025_audit_log.sql +17 -0
- migrations/026_agent_tokens.sql +20 -0
- migrations/027_teams_auth_phase_b.sql +35 -0
- migrations/028_learnings.sql +23 -0
- migrations/029_team_roles.sql +14 -0
- migrations/030_finder_pins.sql +10 -0
- migrations/031_pr_deploy_status.sql +9 -0
- migrations/032_task_reminders.sql +7 -0
- migrations/033_events_retry_count.sql +6 -0
- migrations/033_session_owner.sql +9 -0
- migrations/034_notifications.sql +38 -0
- migrations/035_shared_links.sql +15 -0
- migrations/036_session_index_upgrade.sql +29 -0
- migrations/037_pr_approval.sql +15 -0
- migrations/038_pr_submitted_by.sql +6 -0
- migrations/039_push_subscriptions.sql +17 -0
- migrations/040_semantic_search.sql +16 -0
- migrations/041_workspaces.sql +63 -0
- migrations/042_oidc_providers.sql +24 -0
- migrations/043_ci_checks.sql +31 -0
- migrations/044_agent_metrics.sql +30 -0
- migrations/045_documents_doc_type.sql +5 -0
- migrations/046_salience.sql +13 -0
- migrations/047_seed_missing_agents.sql +6 -0
- migrations/048_fix_agent_paths_roles.sql +5 -0
- migrations/049_agent_role_and_learnings_schema.sql +3 -0
- migrations/050_session_provider.sql +2 -0
- migrations/051_session_launch_profile.sql +4 -0
- migrations/052_session_theme_mode.sql +2 -0
- migrations/052_task_kind.sql +4 -0
- migrations/053_inbox_items.sql +31 -0
- migrations/054_inbox_triage_contract.sql +30 -0
- migrations/055_inbox_topic_treatment.sql +12 -0
- migrations/056_inbox_treatment_read_save.sql +57 -0
- migrations/057_session_theme_mode_backfill.sql +4 -0
- migrations/058_inbox_item_status_lifecycle.sql +13 -0
- migrations/059_inbox_tldr_and_source_scores.sql +18 -0
- migrations/060_newsletter.sql +16 -0
- migrations/061_inbox_redesign.sql +69 -0
- migrations/062_fix_inbox_sources_backfill.sql +37 -0
- migrations/063_task_completion_mode.sql +23 -0
- migrations/064_judge_mode_setting.sql +4 -0
- migrations/065_knowledge_graph_spike.sql +40 -0
- migrations/066_digest_ranking_inputs.sql +10 -0
- migrations/066_kg_artifact_nodes.sql +129 -0
- migrations/067_inbox_digest_selections.sql +28 -0
- migrations/067_kg_temporal.sql +53 -0
- migrations/068_inbox_digest_app_settings.sql +9 -0
- migrations/068_kg_touch_counter.sql +52 -0
- migrations/069_kg_doc_types.sql +117 -0
- migrations/070_digest_ranking_inputs_recovery.sql +3 -0
- migrations/071_inbox_digest_selections_recovery.sql +3 -0
- migrations/072_inbox_digest_app_settings_recovery.sql +3 -0
- migrations/073_kg_cross_project.sql +216 -0
- migrations/073_kg_cross_project_down.sql +77 -0
- migrations/074_kg_infra_types.sql +208 -0
- migrations/074_kg_infra_types_down.sql +80 -0
- migrations/075_kg_file_state_recovery.sql +35 -0
- migrations/075_kg_file_state_recovery_down.sql +5 -0
- migrations/076_kg_watcher_state.sql +33 -0
- migrations/076_kg_watcher_state_down.sql +3 -0
- migrations/077_kg_doc_types_extend.sql +226 -0
- migrations/077_kg_doc_types_extend_down.sql +80 -0
- migrations/078_kg_fts5.sql +102 -0
- migrations/078_kg_fts5_down.sql +14 -0
- migrations/079_kg_missing_indexes.sql +31 -0
- migrations/079_kg_missing_indexes_down.sql +10 -0
- migrations/080_kg_fts5_extended.sql +232 -0
- migrations/080_kg_fts5_extended_down.sql +25 -0
- migrations/081_kg_lens_indexes.sql +9 -0
- migrations/081_kg_lens_indexes_down.sql +3 -0
- migrations/082_kg_pins.sql +26 -0
- migrations/082_kg_pins_down.sql +14 -0
- migrations/083_kg_graph_nodes_degree.sql +20 -0
- migrations/083_kg_graph_nodes_degree_down.sql +15 -0
- migrations/084_drop_legacy_scheduler_tables.sql +58 -0
- migrations/084_drop_legacy_scheduler_tables_down.sql +112 -0
- migrations/085_kg_edge_resolves_to.sql +142 -0
- migrations/085_kg_edge_resolves_to_down.sql +66 -0
- migrations/086_project_status_updates_feed.sql +20 -0
- migrations/086_project_status_updates_feed_down.sql +36 -0
- migrations/087_session_metrics_dual.sql +50 -0
- migrations/087_session_metrics_dual_down.sql +21 -0
- migrations/088_rename_context_pct_legacy.sql +23 -0
- migrations/088_rename_context_pct_legacy_down.sql +8 -0
- migrations/089_session_metrics_equivalent_cost.sql +26 -0
- migrations/089_session_metrics_equivalent_cost_down.sql +11 -0
- migrations/090_kg_inbox_node_type.sql +26 -0
- migrations/090_kg_inbox_node_type_down.sql +20 -0
- migrations/091_kg_inbox_node_type_check.sql +265 -0
- migrations/091_kg_inbox_node_type_check_down.sql +129 -0
- migrations/092_sessions_activity_state_ts.sql +29 -0
- migrations/092_sessions_activity_state_ts_down.sql +14 -0
- migrations/093_sessions_activity_state_column.sql +29 -0
- migrations/093_sessions_activity_state_column_down.sql +10 -0
- migrations/094_ingest_pending.sql +55 -0
- migrations/094_ingest_pending_down.sql +15 -0
- migrations/095_kg_intent_first.sql +77 -0
- migrations/095_kg_intent_first_down.sql +25 -0
- migrations/096_kg_xlsx_artifact_prefix.sql +17 -0
- migrations/096_kg_xlsx_artifact_prefix_down.sql +11 -0
- migrations/097_ingest_change_history.sql +37 -0
- migrations/097_ingest_change_history_down.sql +13 -0
- migrations/098_kg_node_type_business.sql +254 -0
- migrations/098_kg_node_type_business_down.sql +195 -0
- migrations/099_kg_edges_restore_weight.sql +58 -0
- migrations/099_kg_edges_restore_weight_down.sql +12 -0
- migrations/100_kg_enriched_at.sql +25 -0
- migrations/100_kg_enriched_at_down.sql +12 -0
- migrations/101_local_llm_shadow_comparisons.sql +66 -0
- migrations/101_local_llm_shadow_comparisons_down.sql +15 -0
- migrations/102_promote_llm_costs.sql +69 -0
- migrations/102_promote_llm_costs_down.sql +19 -0
- migrations/103_ingest_skipped_log.sql +46 -0
- migrations/103_ingest_skipped_log_down.sql +15 -0
- migrations/120_docs_governance.sql +50 -0
- migrations/120_docs_governance_down.sql +11 -0
- migrations/121_notification_event_fk_cleanup.sql +21 -0
- migrations/121_notification_event_fk_cleanup_down.sql +10 -0
- migrations/122_docs_drift_history.sql +34 -0
- migrations/122_docs_drift_history_down.sql +15 -0
- migrations/123_ingest_parser_waiting_status.sql +69 -0
- migrations/123_ingest_parser_waiting_status_down.sql +69 -0
- migrations/124_heypocket_recordings.sql +63 -0
- migrations/124_heypocket_recordings_down.sql +13 -0
- migrations/125_kg_node_type_record.sql +219 -0
- migrations/125_kg_node_type_record_down.sql +205 -0
- migrations/126_ingest_terminal_upload_source_kind.sql +69 -0
- migrations/126_ingest_terminal_upload_source_kind_down.sql +69 -0
- migrations/127_brain_v1_substrate.sql +200 -0
- migrations/127_brain_v1_substrate_down.sql +32 -0
- migrations/128_brain_drift_signals.sql +157 -0
- migrations/128_brain_drift_signals_down.sql +23 -0
- migrations/129_brain_memory_operations.sql +232 -0
- migrations/129_brain_memory_operations_down.sql +27 -0
- migrations/130_brain_findings.sql +258 -0
- migrations/130_brain_findings_down.sql +29 -0
- migrations/132_kg_pr_modifies.sql +242 -0
- migrations/132_kg_pr_modifies_down.sql +99 -0
- migrations/133_brain_v1_2_direction_schema.sql +476 -0
- migrations/133_brain_v1_2_direction_schema_down.sql +273 -0
- migrations/134_brain_journal_narrative_polished.sql +8 -0
- migrations/134_brain_journal_narrative_polished_down.sql +6 -0
- migrations/135_kg_edges_provider.sql +21 -0
- migrations/136_documents_fts.sql +56 -0
- migrations/137_promote_llm_costs.sql +59 -0
- migrations/137_promote_llm_costs_down.sql +19 -0
- migrations/138_ingest_api_keys.sql +39 -0
- migrations/138_ingest_api_keys_down.sql +8 -0
- migrations/139_ingest_pending_ingress.sql +91 -0
- migrations/139_ingest_pending_ingress_down.sql +73 -0
- migrations/140_ingest_idempotency_quota.sql +45 -0
- migrations/140_ingest_idempotency_quota_down.sql +9 -0
- migrations/141_ingest_pending_metadata.sql +16 -0
- migrations/141_ingest_pending_metadata_down.sql +7 -0
- migrations/142_llm_function_config.sql +36 -0
- migrations/142_llm_function_config_down.sql +8 -0
- migrations/143_kg_code_embeddings.sql +25 -0
- migrations/143_kg_code_embeddings_down.sql +5 -0
- migrations/__init__.py +4 -0
- projects/_template/project.yaml +46 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
-- Agents registry
|
|
2
|
+
CREATE TABLE IF NOT EXISTS agents (
|
|
3
|
+
id TEXT PRIMARY KEY,
|
|
4
|
+
user_id TEXT NOT NULL UNIQUE REFERENCES users(id) ON DELETE RESTRICT,
|
|
5
|
+
scheduler_agent_id TEXT UNIQUE,
|
|
6
|
+
agent_type TEXT NOT NULL DEFAULT 'system' CHECK(agent_type IN ('project', 'system', 'digital_copy')),
|
|
7
|
+
project_slug TEXT,
|
|
8
|
+
model TEXT NOT NULL DEFAULT 'haiku' CHECK(model IN ('haiku', 'sonnet', 'opus')),
|
|
9
|
+
status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'inactive', 'error')),
|
|
10
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
11
|
+
soul_path TEXT,
|
|
12
|
+
tools_path TEXT,
|
|
13
|
+
identity_path TEXT,
|
|
14
|
+
description TEXT,
|
|
15
|
+
deleted_at TEXT,
|
|
16
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now', 'utc')),
|
|
17
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now', 'utc'))
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
CREATE TABLE IF NOT EXISTS agent_schedules (
|
|
21
|
+
id TEXT PRIMARY KEY,
|
|
22
|
+
agent_id TEXT NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
|
|
23
|
+
name TEXT NOT NULL,
|
|
24
|
+
cron_expr TEXT NOT NULL,
|
|
25
|
+
cron_tz TEXT NOT NULL DEFAULT 'Europe/Rome',
|
|
26
|
+
prompt TEXT,
|
|
27
|
+
timeout_seconds INTEGER NOT NULL DEFAULT 120,
|
|
28
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
29
|
+
scheduler_job_id TEXT UNIQUE,
|
|
30
|
+
last_run_at TEXT,
|
|
31
|
+
last_run_status TEXT,
|
|
32
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now', 'utc')),
|
|
33
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now', 'utc'))
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
CREATE TABLE IF NOT EXISTS agent_runs (
|
|
37
|
+
id TEXT PRIMARY KEY,
|
|
38
|
+
agent_id TEXT NOT NULL REFERENCES agents(id) ON DELETE RESTRICT,
|
|
39
|
+
schedule_id TEXT REFERENCES agent_schedules(id) ON DELETE SET NULL,
|
|
40
|
+
trigger TEXT NOT NULL DEFAULT 'manual' CHECK(trigger IN ('cron', 'manual', 'api')),
|
|
41
|
+
session_uuid TEXT,
|
|
42
|
+
started_at TEXT NOT NULL DEFAULT (datetime('now', 'utc')),
|
|
43
|
+
finished_at TEXT,
|
|
44
|
+
status TEXT NOT NULL DEFAULT 'running' CHECK(status IN ('running', 'success', 'error', 'timeout', 'killed')),
|
|
45
|
+
summary TEXT,
|
|
46
|
+
cost_usd REAL,
|
|
47
|
+
input_tokens INTEGER,
|
|
48
|
+
output_tokens INTEGER,
|
|
49
|
+
model TEXT,
|
|
50
|
+
log_tail TEXT,
|
|
51
|
+
log_size_bytes INTEGER,
|
|
52
|
+
error_message TEXT
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
CREATE TABLE IF NOT EXISTS agent_sync_state (
|
|
56
|
+
agent_id TEXT NOT NULL,
|
|
57
|
+
run_source TEXT NOT NULL,
|
|
58
|
+
last_offset INTEGER NOT NULL DEFAULT 0,
|
|
59
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now', 'utc')),
|
|
60
|
+
PRIMARY KEY (agent_id, run_source)
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
-- Indexes
|
|
64
|
+
CREATE INDEX IF NOT EXISTS idx_agents_user_id ON agents(user_id);
|
|
65
|
+
CREATE INDEX IF NOT EXISTS idx_agents_project_slug ON agents(project_slug);
|
|
66
|
+
CREATE INDEX IF NOT EXISTS idx_agents_active ON agents(deleted_at) WHERE deleted_at IS NULL;
|
|
67
|
+
CREATE INDEX IF NOT EXISTS idx_agent_runs_agent_id ON agent_runs(agent_id);
|
|
68
|
+
CREATE INDEX IF NOT EXISTS idx_agent_runs_agent_started ON agent_runs(agent_id, started_at DESC);
|
|
69
|
+
CREATE INDEX IF NOT EXISTS idx_agent_runs_status ON agent_runs(agent_id, status, started_at DESC);
|
|
70
|
+
CREATE INDEX IF NOT EXISTS idx_agent_schedules_agent_id ON agent_schedules(agent_id);
|
|
71
|
+
CREATE INDEX IF NOT EXISTS idx_cost_runs_agent ON agent_runs(agent_id, cost_usd);
|
|
72
|
+
|
|
73
|
+
INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (18, datetime('now', 'utc'));
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
DROP INDEX IF EXISTS idx_cost_runs_agent;
|
|
2
|
+
DROP INDEX IF EXISTS idx_agent_schedules_agent_id;
|
|
3
|
+
DROP INDEX IF EXISTS idx_agent_runs_status;
|
|
4
|
+
DROP INDEX IF EXISTS idx_agent_runs_agent_started;
|
|
5
|
+
DROP INDEX IF EXISTS idx_agent_runs_agent_id;
|
|
6
|
+
DROP INDEX IF EXISTS idx_agents_active;
|
|
7
|
+
DROP INDEX IF EXISTS idx_agents_project_slug;
|
|
8
|
+
DROP INDEX IF EXISTS idx_agents_user_id;
|
|
9
|
+
DROP TABLE IF EXISTS agent_sync_state;
|
|
10
|
+
DROP TABLE IF EXISTS agent_runs;
|
|
11
|
+
DROP TABLE IF EXISTS agent_schedules;
|
|
12
|
+
DROP TABLE IF EXISTS agents;
|
|
13
|
+
DELETE FROM schema_versions WHERE version = 18;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
-- v1 - 2026-02-28 - Add review_feedback to tasks + DB trigger enforce_review_requires_pr
|
|
2
|
+
-- NOTE: DO NOT modify schema_versions here — db.py runner handles INSERT OR IGNORE automatically
|
|
3
|
+
|
|
4
|
+
ALTER TABLE tasks ADD COLUMN review_feedback TEXT DEFAULT NULL;
|
|
5
|
+
|
|
6
|
+
-- DB-level trigger: enforce that status=review requires an active PR
|
|
7
|
+
CREATE TRIGGER IF NOT EXISTS enforce_review_requires_pr
|
|
8
|
+
BEFORE UPDATE OF status ON tasks
|
|
9
|
+
FOR EACH ROW
|
|
10
|
+
WHEN NEW.status = 'review'
|
|
11
|
+
BEGIN
|
|
12
|
+
SELECT RAISE(ABORT, 'Cannot set status=review: no active PR for this task')
|
|
13
|
+
WHERE NOT EXISTS (
|
|
14
|
+
SELECT 1 FROM pull_requests
|
|
15
|
+
WHERE task_id = NEW.id
|
|
16
|
+
AND status IN ('draft', 'open', 'merging')
|
|
17
|
+
);
|
|
18
|
+
END;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
-- v1.0.0 - 2026-03-01 - Webhook events audit log
|
|
2
|
+
CREATE TABLE IF NOT EXISTS webhook_events (
|
|
3
|
+
id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),
|
|
4
|
+
delivery_id TEXT NOT NULL UNIQUE,
|
|
5
|
+
event_type TEXT NOT NULL,
|
|
6
|
+
action TEXT,
|
|
7
|
+
repo TEXT,
|
|
8
|
+
pr_number INTEGER,
|
|
9
|
+
branch TEXT,
|
|
10
|
+
task_id TEXT,
|
|
11
|
+
pr_id TEXT,
|
|
12
|
+
payload TEXT,
|
|
13
|
+
processed INTEGER NOT NULL DEFAULT 0,
|
|
14
|
+
error TEXT,
|
|
15
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
|
|
16
|
+
);
|
|
17
|
+
CREATE INDEX IF NOT EXISTS idx_webhook_events_task_id ON webhook_events(task_id);
|
|
18
|
+
CREATE INDEX IF NOT EXISTS idx_webhook_events_created_at ON webhook_events(created_at);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
-- 022_devx_agent_managed.sql
|
|
2
|
+
-- Adds agent_managed toggle to sessions_meta for DevX orchestration
|
|
3
|
+
ALTER TABLE sessions_meta ADD COLUMN agent_managed INTEGER NOT NULL DEFAULT 0
|
|
4
|
+
CHECK (agent_managed IN (0, 1));
|
|
5
|
+
|
|
6
|
+
-- Partial index: solo sessioni agent_managed=1 sono interrogate dal Session Manager
|
|
7
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_agent_managed
|
|
8
|
+
ON sessions_meta(agent_managed)
|
|
9
|
+
WHERE agent_managed = 1;
|
|
10
|
+
|
|
11
|
+
INSERT OR IGNORE INTO schema_versions (version) VALUES (22);
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
-- 022_devx_agent_managed_down.sql
|
|
2
|
+
-- Rollback: SQLite < 3.35 non supporta DROP COLUMN
|
|
3
|
+
-- Per rollback completo: ricrea tabella senza la colonna
|
|
4
|
+
DROP INDEX IF EXISTS idx_sessions_agent_managed;
|
|
5
|
+
-- Note: ALTER TABLE ... DROP COLUMN richiede SQLite >= 3.35
|
|
6
|
+
-- SELECT sqlite_version() per verificare
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
-- 023_devx_p1_gate.sql
|
|
2
|
+
-- P1 gate state machine: sostituisce asyncio.sleep(300) in task orchestration
|
|
3
|
+
-- Sprint 3 DevX Layer - 2026-03-02
|
|
4
|
+
ALTER TABLE tasks ADD COLUMN p1_gate_notified_at TEXT;
|
|
5
|
+
ALTER TABLE tasks ADD COLUMN p1_gate_blocked_by TEXT;
|
|
6
|
+
|
|
7
|
+
INSERT OR IGNORE INTO schema_versions (version) VALUES (23);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
-- 024_chat_messages.sql
|
|
2
|
+
-- Chat messages for agent conversations
|
|
3
|
+
-- 2026-03-03
|
|
4
|
+
|
|
5
|
+
CREATE TABLE IF NOT EXISTS chat_messages (
|
|
6
|
+
id TEXT PRIMARY KEY,
|
|
7
|
+
agent_id TEXT NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
|
|
8
|
+
role TEXT NOT NULL CHECK(role IN ('user', 'assistant')),
|
|
9
|
+
content TEXT NOT NULL,
|
|
10
|
+
metadata_json TEXT,
|
|
11
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now', 'utc'))
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
CREATE INDEX IF NOT EXISTS idx_chat_messages_agent_id ON chat_messages(agent_id, created_at DESC);
|
|
15
|
+
|
|
16
|
+
INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (24, datetime('now', 'utc'));
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
-- v1.0.0 - 2026-03-02 - Add conversation_id to pull_requests for worktree agent cost tracking
|
|
2
|
+
PRAGMA foreign_keys=ON;
|
|
3
|
+
|
|
4
|
+
ALTER TABLE pull_requests
|
|
5
|
+
ADD COLUMN conversation_id TEXT
|
|
6
|
+
REFERENCES session_costs(conversation_id) ON DELETE SET NULL;
|
|
7
|
+
|
|
8
|
+
INSERT OR IGNORE INTO schema_versions (version) VALUES (24);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
-- 024_task_indexes.sql: Add indexes for common query patterns
|
|
2
|
+
-- owner_id: used in task list filtering and RACI lookups
|
|
3
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_owner_id ON tasks(owner_id) WHERE deleted_at IS NULL;
|
|
4
|
+
|
|
5
|
+
-- project + status: the most common query pattern (list tasks by project and status)
|
|
6
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_project_status ON tasks(project, status) WHERE deleted_at IS NULL;
|
|
7
|
+
|
|
8
|
+
-- ice_score: used for priority sorting in task lists
|
|
9
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_ice_score ON tasks(ice_score DESC) WHERE deleted_at IS NULL;
|
|
10
|
+
|
|
11
|
+
-- delegation: used for filtering by delegation type
|
|
12
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_delegation ON tasks(delegation) WHERE deleted_at IS NULL AND delegation IS NOT NULL;
|
|
13
|
+
|
|
14
|
+
-- Pull requests: task_id lookup (used in every PR operation)
|
|
15
|
+
CREATE INDEX IF NOT EXISTS idx_pull_requests_task_id ON pull_requests(task_id);
|
|
16
|
+
|
|
17
|
+
-- Session costs: project_slug + date range (used in cost summary)
|
|
18
|
+
CREATE INDEX IF NOT EXISTS idx_session_costs_project_date ON session_costs(project_slug, updated_at);
|
|
19
|
+
|
|
20
|
+
-- Task cost entries: task_id (used in cost summary per task)
|
|
21
|
+
CREATE INDEX IF NOT EXISTS idx_task_cost_entries_task_id ON task_cost_entries(task_id);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
DROP INDEX IF EXISTS idx_tasks_owner_id;
|
|
2
|
+
DROP INDEX IF EXISTS idx_tasks_project_status;
|
|
3
|
+
DROP INDEX IF EXISTS idx_tasks_ice_score;
|
|
4
|
+
DROP INDEX IF EXISTS idx_tasks_delegation;
|
|
5
|
+
DROP INDEX IF EXISTS idx_pull_requests_task_id;
|
|
6
|
+
DROP INDEX IF EXISTS idx_session_costs_project_date;
|
|
7
|
+
DROP INDEX IF EXISTS idx_task_cost_entries_task_id;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
-- 024_audit_log.sql
|
|
2
|
+
-- Audit trail for human privileged operations (merge PR, approve/complete tasks, delete resources)
|
|
3
|
+
-- 2026-03-03
|
|
4
|
+
CREATE TABLE IF NOT EXISTS audit_log (
|
|
5
|
+
id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),
|
|
6
|
+
timestamp TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
7
|
+
action TEXT NOT NULL,
|
|
8
|
+
user TEXT NOT NULL,
|
|
9
|
+
resource_type TEXT NOT NULL,
|
|
10
|
+
resource_id TEXT NOT NULL,
|
|
11
|
+
details_json TEXT
|
|
12
|
+
);
|
|
13
|
+
CREATE INDEX IF NOT EXISTS idx_audit_log_timestamp ON audit_log(timestamp);
|
|
14
|
+
CREATE INDEX IF NOT EXISTS idx_audit_log_user ON audit_log(user);
|
|
15
|
+
CREATE INDEX IF NOT EXISTS idx_audit_log_resource_type ON audit_log(resource_type, resource_id);
|
|
16
|
+
|
|
17
|
+
INSERT OR IGNORE INTO schema_versions (version) VALUES (25);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
-- 024_agent_tokens.sql
|
|
2
|
+
-- Per-agent Bearer tokens with scoped permissions
|
|
3
|
+
-- Replaces single shared TASKS_API_TOKEN with per-agent tokens stored in DB
|
|
4
|
+
-- 2026-03-03
|
|
5
|
+
|
|
6
|
+
CREATE TABLE IF NOT EXISTS agent_tokens (
|
|
7
|
+
id TEXT PRIMARY KEY,
|
|
8
|
+
agent_name TEXT NOT NULL,
|
|
9
|
+
token_hash TEXT NOT NULL UNIQUE, -- SHA-256 hex digest of the raw token
|
|
10
|
+
scopes TEXT NOT NULL DEFAULT '[]', -- JSON array of scope strings
|
|
11
|
+
is_active INTEGER NOT NULL DEFAULT 1,
|
|
12
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now', 'utc')),
|
|
13
|
+
last_used_at TEXT
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
CREATE INDEX IF NOT EXISTS idx_agent_tokens_agent_name ON agent_tokens(agent_name);
|
|
17
|
+
CREATE INDEX IF NOT EXISTS idx_agent_tokens_active ON agent_tokens(is_active) WHERE is_active = 1;
|
|
18
|
+
CREATE INDEX IF NOT EXISTS idx_agent_tokens_hash ON agent_tokens(token_hash);
|
|
19
|
+
|
|
20
|
+
INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (26, datetime('now', 'utc'));
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
-- 027_teams_auth_phase_b.sql
|
|
2
|
+
-- SOLO additive -- nessun DROP/ALTER su tabelle esistenti
|
|
3
|
+
|
|
4
|
+
CREATE TABLE IF NOT EXISTS teams (
|
|
5
|
+
id TEXT PRIMARY KEY,
|
|
6
|
+
slug TEXT UNIQUE NOT NULL,
|
|
7
|
+
display_name TEXT NOT NULL,
|
|
8
|
+
description TEXT,
|
|
9
|
+
parent_team_id TEXT REFERENCES teams(id),
|
|
10
|
+
created_by TEXT REFERENCES users(id),
|
|
11
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
|
|
12
|
+
deleted_at TEXT
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
CREATE TABLE IF NOT EXISTS team_members (
|
|
16
|
+
team_id TEXT NOT NULL REFERENCES teams(id) ON DELETE CASCADE,
|
|
17
|
+
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
18
|
+
is_admin INTEGER NOT NULL DEFAULT 0,
|
|
19
|
+
joined_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
|
|
20
|
+
PRIMARY KEY (team_id, user_id)
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
CREATE TABLE IF NOT EXISTS project_teams (
|
|
24
|
+
project TEXT NOT NULL,
|
|
25
|
+
team_id TEXT NOT NULL REFERENCES teams(id) ON DELETE CASCADE,
|
|
26
|
+
is_public INTEGER NOT NULL DEFAULT 0,
|
|
27
|
+
assigned_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
|
|
28
|
+
PRIMARY KEY (project, team_id)
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
CREATE INDEX IF NOT EXISTS idx_team_members_user ON team_members(user_id);
|
|
32
|
+
CREATE INDEX IF NOT EXISTS idx_project_teams_team ON project_teams(team_id);
|
|
33
|
+
CREATE INDEX IF NOT EXISTS idx_project_teams_project ON project_teams(project);
|
|
34
|
+
|
|
35
|
+
INSERT OR IGNORE INTO schema_versions (version) VALUES (27);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
-- Learnings DB: consultable knowledge base to prevent recurring errors
|
|
2
|
+
-- deploy gap 3x, migration collision 3x, subtree push 3x → never again
|
|
3
|
+
|
|
4
|
+
CREATE TABLE IF NOT EXISTS learnings (
|
|
5
|
+
id TEXT PRIMARY KEY,
|
|
6
|
+
title TEXT NOT NULL,
|
|
7
|
+
category TEXT NOT NULL, -- 'deploy', 'migration', 'auth', 'testing', 'architecture', 'security', 'performance'
|
|
8
|
+
description TEXT NOT NULL, -- what happened + how it was resolved
|
|
9
|
+
tags TEXT DEFAULT '[]', -- JSON array of tags
|
|
10
|
+
module TEXT, -- module involved (e.g. 'api/security.py', 'console', 'scripts')
|
|
11
|
+
severity TEXT DEFAULT 'medium', -- 'low', 'medium', 'high', 'critical'
|
|
12
|
+
frequency INTEGER DEFAULT 1, -- how many times it occurred
|
|
13
|
+
last_occurrence TEXT, -- ISO datetime of last occurrence
|
|
14
|
+
prevention TEXT, -- what to do to prevent it
|
|
15
|
+
session INTEGER, -- session number where documented
|
|
16
|
+
project TEXT, -- project slug
|
|
17
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now','utc')),
|
|
18
|
+
updated_at TEXT
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
CREATE INDEX idx_learnings_category ON learnings(category);
|
|
22
|
+
CREATE INDEX idx_learnings_project ON learnings(project);
|
|
23
|
+
CREATE INDEX idx_learnings_tags ON learnings(tags);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
-- 029_team_roles.sql
|
|
2
|
+
-- Flat teams: add role column to team_members, add avatar_color to teams
|
|
3
|
+
-- Migrate is_admin boolean to role text enum ('member'|'admin')
|
|
4
|
+
|
|
5
|
+
-- Add role column with default 'member'
|
|
6
|
+
ALTER TABLE team_members ADD COLUMN role TEXT NOT NULL DEFAULT 'member';
|
|
7
|
+
|
|
8
|
+
-- Migrate existing is_admin=1 rows to role='admin'
|
|
9
|
+
UPDATE team_members SET role = 'admin' WHERE is_admin = 1;
|
|
10
|
+
|
|
11
|
+
-- Add avatar_color to teams for UI display
|
|
12
|
+
ALTER TABLE teams ADD COLUMN avatar_color TEXT;
|
|
13
|
+
|
|
14
|
+
INSERT OR IGNORE INTO schema_versions (version) VALUES (29);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS finder_pins (
|
|
2
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
3
|
+
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
4
|
+
path TEXT NOT NULL,
|
|
5
|
+
label TEXT,
|
|
6
|
+
position INTEGER NOT NULL DEFAULT 0,
|
|
7
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
8
|
+
UNIQUE(user_id, path)
|
|
9
|
+
);
|
|
10
|
+
CREATE INDEX IF NOT EXISTS idx_finder_pins_user ON finder_pins(user_id, position);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
-- 031_pr_deploy_status.sql
|
|
2
|
+
-- v1.0.0 - 2026-03-10 - Add deploy tracking to pull_requests
|
|
3
|
+
-- Tracks deploy result after PR merge: status, output, timestamp
|
|
4
|
+
|
|
5
|
+
ALTER TABLE pull_requests ADD COLUMN deploy_status TEXT; -- 'success', 'failed', 'skipped'
|
|
6
|
+
ALTER TABLE pull_requests ADD COLUMN deploy_output TEXT; -- last 2000 chars of stdout+stderr
|
|
7
|
+
ALTER TABLE pull_requests ADD COLUMN deploy_at TEXT; -- ISO timestamp of deploy completion
|
|
8
|
+
|
|
9
|
+
INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (31, datetime('now', 'utc'));
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
-- 032_task_reminders.sql
|
|
2
|
+
-- v1.0.0 - 2026-03-10 - Add due_date and reminder tracking to tasks
|
|
3
|
+
|
|
4
|
+
ALTER TABLE tasks ADD COLUMN due_date TEXT DEFAULT NULL; -- ISO 8601 date (YYYY-MM-DD)
|
|
5
|
+
ALTER TABLE tasks ADD COLUMN reminder_sent_at TEXT DEFAULT NULL; -- ISO 8601 datetime, null = not sent
|
|
6
|
+
|
|
7
|
+
INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (32, datetime('now', 'utc'));
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
-- Migration 033: Add retry_count to events table for n8n dispatcher
|
|
2
|
+
-- Tracks dispatch attempts per event. Dead letter after n8n_max_retry_count failures.
|
|
3
|
+
|
|
4
|
+
ALTER TABLE events ADD COLUMN retry_count INTEGER DEFAULT 0;
|
|
5
|
+
|
|
6
|
+
INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (33, datetime('now', 'utc'));
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
-- Migration 033: Add owner tracking to sessions
|
|
2
|
+
-- Track which user owns a tmux session for MCP client attribution
|
|
3
|
+
|
|
4
|
+
ALTER TABLE sessions_meta ADD COLUMN owner_id TEXT DEFAULT NULL;
|
|
5
|
+
|
|
6
|
+
-- Index for lookups by owner
|
|
7
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_owner ON sessions_meta(owner_id);
|
|
8
|
+
|
|
9
|
+
INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (33, datetime('now', 'utc'));
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
-- Migration 034: Notifications table for in-app notification center
|
|
2
|
+
-- Stores persistent notifications with read/unread state per user.
|
|
3
|
+
|
|
4
|
+
CREATE TABLE IF NOT EXISTS notifications (
|
|
5
|
+
id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),
|
|
6
|
+
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
7
|
+
event_id TEXT REFERENCES events(id) ON DELETE SET NULL,
|
|
8
|
+
type TEXT NOT NULL,
|
|
9
|
+
title TEXT NOT NULL,
|
|
10
|
+
body TEXT,
|
|
11
|
+
target_type TEXT CHECK(target_type IN ('task', 'pr')),
|
|
12
|
+
target_id TEXT,
|
|
13
|
+
project TEXT,
|
|
14
|
+
read_at TEXT DEFAULT NULL,
|
|
15
|
+
acted_at TEXT DEFAULT NULL,
|
|
16
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now', 'utc'))
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
-- Partial index for unread notifications (most common query)
|
|
20
|
+
CREATE INDEX IF NOT EXISTS idx_notifications_user_unread
|
|
21
|
+
ON notifications (user_id, created_at DESC)
|
|
22
|
+
WHERE read_at IS NULL;
|
|
23
|
+
|
|
24
|
+
-- General index for all notifications by user
|
|
25
|
+
CREATE INDEX IF NOT EXISTS idx_notifications_user_recent
|
|
26
|
+
ON notifications (user_id, created_at DESC);
|
|
27
|
+
|
|
28
|
+
-- Target lookup for marking acted_at after approve/reject
|
|
29
|
+
CREATE INDEX IF NOT EXISTS idx_notifications_target
|
|
30
|
+
ON notifications (target_type, target_id);
|
|
31
|
+
|
|
32
|
+
-- Prevent duplicate notifications for same event+user
|
|
33
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_notifications_event_user
|
|
34
|
+
ON notifications (event_id, user_id)
|
|
35
|
+
WHERE event_id IS NOT NULL;
|
|
36
|
+
|
|
37
|
+
INSERT OR IGNORE INTO schema_versions (version, applied_at)
|
|
38
|
+
VALUES (34, datetime('now', 'utc'));
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
-- Shareable file links with expiring tokens
|
|
2
|
+
INSERT INTO schema_versions (version) VALUES (35);
|
|
3
|
+
|
|
4
|
+
CREATE TABLE IF NOT EXISTS shared_links (
|
|
5
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
6
|
+
token TEXT NOT NULL UNIQUE,
|
|
7
|
+
path TEXT NOT NULL,
|
|
8
|
+
created_by TEXT NOT NULL,
|
|
9
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
10
|
+
expires_at DATETIME NOT NULL,
|
|
11
|
+
access_count INTEGER DEFAULT 0,
|
|
12
|
+
last_accessed_at DATETIME
|
|
13
|
+
);
|
|
14
|
+
CREATE INDEX IF NOT EXISTS idx_shared_links_token ON shared_links(token);
|
|
15
|
+
CREATE INDEX IF NOT EXISTS idx_shared_links_expires ON shared_links(expires_at);
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
-- v036: Performance indexes for session scoping and visibility queries
|
|
2
|
+
-- Migration 033 created idx_sessions_owner on sessions_meta(owner_id).
|
|
3
|
+
-- This upgrades to a composite covering index and adds visibility query indexes.
|
|
4
|
+
|
|
5
|
+
-- Upgrade sessions index: composite (owner_id, created_at DESC) for covering scan
|
|
6
|
+
DROP INDEX IF EXISTS idx_sessions_owner;
|
|
7
|
+
|
|
8
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_meta_owner_created
|
|
9
|
+
ON sessions_meta(owner_id, created_at DESC);
|
|
10
|
+
-- WHERE owner_id = ? ORDER BY created_at DESC → pure index scan, no filesort
|
|
11
|
+
|
|
12
|
+
-- Visibility query join columns — full table scan on every request without these
|
|
13
|
+
|
|
14
|
+
CREATE INDEX IF NOT EXISTS idx_team_members_user_team
|
|
15
|
+
ON team_members(user_id, team_id);
|
|
16
|
+
|
|
17
|
+
CREATE INDEX IF NOT EXISTS idx_team_members_team_id
|
|
18
|
+
ON team_members(team_id);
|
|
19
|
+
|
|
20
|
+
CREATE INDEX IF NOT EXISTS idx_teams_active
|
|
21
|
+
ON teams(id) WHERE deleted_at IS NULL;
|
|
22
|
+
|
|
23
|
+
CREATE INDEX IF NOT EXISTS idx_project_teams_team_project
|
|
24
|
+
ON project_teams(team_id, project);
|
|
25
|
+
|
|
26
|
+
CREATE INDEX IF NOT EXISTS idx_project_teams_public
|
|
27
|
+
ON project_teams(project) WHERE is_public = 1;
|
|
28
|
+
|
|
29
|
+
INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (36, datetime('now', 'utc'));
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
-- v037: Phase 2 — PR approval workflow (four-eyes gate)
|
|
2
|
+
|
|
3
|
+
ALTER TABLE pull_requests ADD COLUMN approved_by TEXT REFERENCES users(id) ON DELETE SET NULL;
|
|
4
|
+
ALTER TABLE pull_requests ADD COLUMN approved_at DATETIME;
|
|
5
|
+
|
|
6
|
+
-- Colonne provisioning utenti (Fase 3 prep, aggiunte ora per atomicita migration)
|
|
7
|
+
ALTER TABLE users ADD COLUMN linux_username TEXT;
|
|
8
|
+
ALTER TABLE users ADD COLUMN provisioned_at DATETIME;
|
|
9
|
+
ALTER TABLE users ADD COLUMN onboarding_completed INTEGER NOT NULL DEFAULT 0;
|
|
10
|
+
|
|
11
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_linux_username
|
|
12
|
+
ON users(linux_username) WHERE linux_username IS NOT NULL;
|
|
13
|
+
|
|
14
|
+
INSERT OR IGNORE INTO schema_versions (version, applied_at)
|
|
15
|
+
VALUES (37, datetime('now'));
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
-- v038: Add submitted_by to pull_requests (tracks who submitted the PR for four-eyes on approve)
|
|
2
|
+
|
|
3
|
+
ALTER TABLE pull_requests ADD COLUMN submitted_by TEXT REFERENCES users(id) ON DELETE SET NULL;
|
|
4
|
+
|
|
5
|
+
INSERT OR IGNORE INTO schema_versions (version, applied_at)
|
|
6
|
+
VALUES (38, datetime('now'));
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
-- Migration 039: Web Push notification subscriptions + outbox tracking
|
|
2
|
+
-- Feature: Push notifications (task d2f85bf2)
|
|
3
|
+
|
|
4
|
+
CREATE TABLE IF NOT EXISTS push_subscriptions (
|
|
5
|
+
endpoint TEXT PRIMARY KEY,
|
|
6
|
+
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
7
|
+
p256dh TEXT NOT NULL,
|
|
8
|
+
auth TEXT NOT NULL,
|
|
9
|
+
created_at TEXT DEFAULT (datetime('now', 'utc'))
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
CREATE INDEX IF NOT EXISTS idx_push_subs_user ON push_subscriptions(user_id);
|
|
13
|
+
|
|
14
|
+
-- Track which notifications have been pushed (outbox pattern)
|
|
15
|
+
ALTER TABLE notifications ADD COLUMN pushed_at TEXT;
|
|
16
|
+
|
|
17
|
+
INSERT OR IGNORE INTO schema_versions (version) VALUES (39);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
-- Migration 040: Semantic search documents table
|
|
2
|
+
-- Feature: Handoff embedding search (task dc729190)
|
|
3
|
+
-- Note: vec0 virtual table created at RUNTIME (migration runner can't load extensions)
|
|
4
|
+
-- Schema: vec_documents(doc_id INTEGER PK, embedding float[512])
|
|
5
|
+
|
|
6
|
+
CREATE TABLE IF NOT EXISTS documents (
|
|
7
|
+
id INTEGER PRIMARY KEY,
|
|
8
|
+
file_path TEXT NOT NULL UNIQUE,
|
|
9
|
+
project TEXT NOT NULL,
|
|
10
|
+
content_hash TEXT,
|
|
11
|
+
created_at TEXT DEFAULT (datetime('now', 'utc'))
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
CREATE INDEX IF NOT EXISTS idx_documents_project ON documents(project);
|
|
15
|
+
|
|
16
|
+
INSERT OR IGNORE INTO schema_versions (version) VALUES (40);
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
-- Migration 041: Multi-tenancy foundation — workspaces table + workspace_id on core tables
|
|
2
|
+
-- Pattern: ALTER ADD COLUMN (no REFERENCES/DEFAULT — crashes with PRAGMA foreign_keys=ON in SQLite 3.45)
|
|
3
|
+
-- Then: UPDATE backfill → CREATE INDEX
|
|
4
|
+
-- Idempotency: _column_exists() in db.py handles partial failure recovery
|
|
5
|
+
|
|
6
|
+
CREATE TABLE IF NOT EXISTS workspaces (
|
|
7
|
+
id TEXT PRIMARY KEY,
|
|
8
|
+
slug TEXT NOT NULL UNIQUE,
|
|
9
|
+
display_name TEXT NOT NULL,
|
|
10
|
+
created_at DATETIME DEFAULT (datetime('now','utc'))
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
-- Default workspace for existing single-user installation
|
|
14
|
+
INSERT OR IGNORE INTO workspaces (id, slug, display_name)
|
|
15
|
+
VALUES ('ws_default', 'default', 'Default Workspace');
|
|
16
|
+
|
|
17
|
+
-- Add workspace_id to all core tables (10 tables)
|
|
18
|
+
-- Each follows: ADD COLUMN → UPDATE backfill → INDEX
|
|
19
|
+
|
|
20
|
+
ALTER TABLE teams ADD COLUMN workspace_id TEXT;
|
|
21
|
+
UPDATE teams SET workspace_id = 'ws_default' WHERE workspace_id IS NULL;
|
|
22
|
+
|
|
23
|
+
ALTER TABLE users ADD COLUMN workspace_id TEXT;
|
|
24
|
+
UPDATE users SET workspace_id = 'ws_default' WHERE workspace_id IS NULL;
|
|
25
|
+
|
|
26
|
+
ALTER TABLE agent_tokens ADD COLUMN workspace_id TEXT;
|
|
27
|
+
UPDATE agent_tokens SET workspace_id = 'ws_default' WHERE workspace_id IS NULL;
|
|
28
|
+
|
|
29
|
+
ALTER TABLE tasks ADD COLUMN workspace_id TEXT;
|
|
30
|
+
UPDATE tasks SET workspace_id = 'ws_default' WHERE workspace_id IS NULL;
|
|
31
|
+
|
|
32
|
+
ALTER TABLE pull_requests ADD COLUMN workspace_id TEXT;
|
|
33
|
+
UPDATE pull_requests SET workspace_id = 'ws_default' WHERE workspace_id IS NULL;
|
|
34
|
+
|
|
35
|
+
ALTER TABLE sessions_meta ADD COLUMN workspace_id TEXT;
|
|
36
|
+
UPDATE sessions_meta SET workspace_id = 'ws_default' WHERE workspace_id IS NULL;
|
|
37
|
+
|
|
38
|
+
ALTER TABLE notifications ADD COLUMN workspace_id TEXT;
|
|
39
|
+
UPDATE notifications SET workspace_id = 'ws_default' WHERE workspace_id IS NULL;
|
|
40
|
+
|
|
41
|
+
ALTER TABLE documents ADD COLUMN workspace_id TEXT;
|
|
42
|
+
UPDATE documents SET workspace_id = 'ws_default' WHERE workspace_id IS NULL;
|
|
43
|
+
|
|
44
|
+
ALTER TABLE events ADD COLUMN workspace_id TEXT;
|
|
45
|
+
UPDATE events SET workspace_id = 'ws_default' WHERE workspace_id IS NULL;
|
|
46
|
+
|
|
47
|
+
ALTER TABLE learnings ADD COLUMN workspace_id TEXT;
|
|
48
|
+
UPDATE learnings SET workspace_id = 'ws_default' WHERE workspace_id IS NULL;
|
|
49
|
+
|
|
50
|
+
-- Composite indexes for query patterns: WHERE workspace_id = ? AND ...
|
|
51
|
+
CREATE INDEX IF NOT EXISTS idx_teams_workspace ON teams(workspace_id);
|
|
52
|
+
CREATE INDEX IF NOT EXISTS idx_users_workspace ON users(workspace_id);
|
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_agent_tokens_workspace ON agent_tokens(workspace_id);
|
|
54
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_ws_status ON tasks(workspace_id, status);
|
|
55
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_ws_project ON tasks(workspace_id, project);
|
|
56
|
+
CREATE INDEX IF NOT EXISTS idx_prs_ws ON pull_requests(workspace_id);
|
|
57
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_ws ON sessions_meta(workspace_id);
|
|
58
|
+
CREATE INDEX IF NOT EXISTS idx_notifications_ws ON notifications(workspace_id);
|
|
59
|
+
CREATE INDEX IF NOT EXISTS idx_events_ws ON events(workspace_id);
|
|
60
|
+
CREATE INDEX IF NOT EXISTS idx_documents_ws ON documents(workspace_id);
|
|
61
|
+
CREATE INDEX IF NOT EXISTS idx_learnings_ws ON learnings(workspace_id);
|
|
62
|
+
|
|
63
|
+
INSERT OR IGNORE INTO schema_versions (version) VALUES (41);
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
-- Migration 042: SSO/OIDC provider configuration
|
|
2
|
+
-- Supports WorkOS AuthKit + future custom OIDC/SAML providers
|
|
3
|
+
|
|
4
|
+
CREATE TABLE IF NOT EXISTS oidc_providers (
|
|
5
|
+
id TEXT PRIMARY KEY,
|
|
6
|
+
workspace_id TEXT NOT NULL,
|
|
7
|
+
slug TEXT NOT NULL,
|
|
8
|
+
provider_type TEXT NOT NULL CHECK(provider_type IN ('workos','custom_oidc','saml')),
|
|
9
|
+
issuer_url TEXT,
|
|
10
|
+
client_id TEXT NOT NULL,
|
|
11
|
+
client_secret_encrypted TEXT NOT NULL,
|
|
12
|
+
allowed_email_domains TEXT DEFAULT '[]', -- JSON array of allowed domains
|
|
13
|
+
claims_mapping TEXT DEFAULT '{}', -- JSON: OIDC claim -> MarvisX field
|
|
14
|
+
enabled INTEGER DEFAULT 1,
|
|
15
|
+
created_at DATETIME DEFAULT (datetime('now','utc')),
|
|
16
|
+
UNIQUE(workspace_id, slug)
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
-- Link users to external identity providers
|
|
20
|
+
ALTER TABLE users ADD COLUMN external_id TEXT; -- OIDC sub claim
|
|
21
|
+
ALTER TABLE users ADD COLUMN auth_provider TEXT DEFAULT 'local'; -- local|workos|oidc
|
|
22
|
+
CREATE INDEX IF NOT EXISTS idx_users_external ON users(auth_provider, external_id);
|
|
23
|
+
|
|
24
|
+
INSERT OR IGNORE INTO schema_versions (version) VALUES (42);
|