ltcai 11.5.2 → 11.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +93 -148
- package/bin/ltcai.js +234 -24
- package/docs/CHANGELOG.md +119 -0
- package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
- package/docs/DEVELOPMENT.md +8 -6
- package/docs/ENTERPRISE.md +2 -1
- package/docs/MULTI_AGENT_RUNTIME.md +12 -5
- package/docs/ONBOARDING.md +1 -1
- package/docs/OPERATIONS.md +6 -3
- package/docs/REALTIME_COLLABORATION.md +1 -1
- package/docs/TRUST_MODEL.md +1 -1
- package/docs/WHY_LATTICE.md +1 -1
- package/docs/WORKFLOW_DESIGNER.md +3 -2
- package/docs/kg-schema.md +1 -1
- package/docs/v11.6.0_ONE_DOOR_PLAN.md +170 -0
- package/lattice_brain/__init__.py +42 -79
- package/lattice_brain/graph/__init__.py +9 -24
- package/lattice_brain/graph/_kg_common/__init__.py +13 -24
- package/lattice_brain/ingestion/__init__.py +19 -58
- package/lattice_brain/ingestion/pipeline.py +20 -398
- package/lattice_brain/multimodal/__init__.py +7 -18
- package/lattice_brain/multimodal/images.py +6 -264
- package/lattice_brain/multimodal/video.py +8 -247
- package/lattice_brain/runtime/__init__.py +8 -79
- package/lattice_brain/runtime/hooks.py +22 -584
- package/latticeai/__init__.py +1 -1
- package/latticeai/api/agent_worker_seam.py +7 -80
- package/latticeai/api/health.py +6 -20
- package/latticeai/api/local_files.py +16 -613
- package/latticeai/api/models.py +12 -87
- package/latticeai/api/search.py +17 -255
- package/latticeai/api/tools.py +69 -750
- package/latticeai/api/voice_capture.py +8 -70
- package/latticeai/api/worker_compute.py +842 -0
- package/latticeai/api/worker_seams.py +216 -0
- package/latticeai/app_factory.py +23 -232
- package/latticeai/cli/entrypoint.py +36 -249
- package/latticeai/core/agent_permission.py +16 -91
- package/latticeai/core/messages.py +89 -531
- package/latticeai/runtime/access_runtime.py +0 -14
- package/latticeai/runtime/bootstrap.py +10 -21
- package/latticeai/runtime/brain_runtime.py +35 -43
- package/latticeai/runtime/build_phases/__init__.py +21 -37
- package/latticeai/runtime/build_phases/features.py +99 -389
- package/latticeai/runtime/build_phases/foundation.py +82 -392
- package/latticeai/runtime/build_phases/web.py +91 -408
- package/latticeai/runtime/build_phases/worker_profile.py +244 -0
- package/latticeai/runtime/lifespan_runtime.py +7 -16
- package/latticeai/runtime/platform_services_runtime.py +1 -15
- package/latticeai/runtime/runtime_context.py +13 -130
- package/latticeai/runtime/security_runtime.py +10 -103
- package/latticeai/services/architecture_readiness.py +82 -43
- package/latticeai/services/model_runtime/__init__.py +2 -11
- package/latticeai/services/model_runtime/service.py +4 -28
- package/latticeai/services/p_reinforce.py +10 -261
- package/latticeai/services/product_readiness.py +31 -38
- package/latticeai/services/search_service.py +37 -795
- package/latticeai/services/tool_dispatch.py +30 -386
- package/latticeai/services/voice_capture.py +13 -107
- package/latticeai/tools/__init__.py +22 -49
- package/latticeai/tools/commands.py +0 -163
- package/latticeai/tools/computer.py +0 -39
- package/latticeai/tools/documents.py +1 -134
- package/latticeai/tools/filesystem.py +1 -247
- package/latticeai/tools/knowledge.py +1 -52
- package/latticeai/tools/local_files.py +0 -20
- package/latticeai/worker_app.py +75 -0
- package/package.json +2 -3
- package/requirements.txt +0 -5
- package/scripts/agent_eval.py +16 -28
- package/scripts/brain_quality_eval.py +20 -183
- package/scripts/bump_version.py +5 -5
- package/scripts/check_current_release_docs.mjs +7 -4
- package/scripts/check_openapi_drift.mjs +10 -0
- package/scripts/check_server_i18n.mjs +2 -18
- package/scripts/compose_openapi.py +377 -0
- package/scripts/export_openapi.py +32 -4
- package/scripts/gen_messages_catalog_fixture.py +302 -0
- package/scripts/gen_openapi_fragments.py +365 -0
- package/scripts/gen_redact_fixture.py +196 -0
- package/scripts/gen_worker_allowlist_fixture.py +115 -0
- package/scripts/generate_agent_parity_fixtures.py +33 -14
- package/scripts/openapi_route_families.json +2161 -0
- package/scripts/release_screen_claims.json +54 -0
- package/scripts/run_integration_tests.mjs +134 -29
- package/scripts/run_sidecar_e2e.mjs +104 -11
- package/scripts/wheel_smoke.py +32 -22
- package/src-tauri/Cargo.lock +375 -9
- package/src-tauri/Cargo.toml +1 -1
- package/src-tauri/src/backend.rs +151 -45
- package/src-tauri/src/main.rs +18 -18
- package/src-tauri/src/topology.rs +58 -88
- package/src-tauri/tauri.conf.json +1 -2
- package/static/app/asset-manifest.json +41 -41
- package/static/app/assets/{Act-DcQizkl1.js → Act-BPcVAbOL.js} +1 -1
- package/static/app/assets/AdminConsole-Bw1ATQL0.js +1 -0
- package/static/app/assets/{Brain-3VCSHFcn.js → Brain-CT92Kos0.js} +2 -2
- package/static/app/assets/{BrainHome-Qm8eaztx.js → BrainHome-CFBkt1K_.js} +1 -1
- package/static/app/assets/{BrainSignals-DS9BtKOW.js → BrainSignals-ReLWF2H8.js} +1 -1
- package/static/app/assets/Capture-BsTokYkk.js +1 -0
- package/static/app/assets/{Chronicle-BGvuAchH.js → Chronicle-B6f0T9id.js} +1 -1
- package/static/app/assets/{CommandPalette-Bqhm0Urn.js → CommandPalette-CuvjTv1u.js} +1 -1
- package/static/app/assets/{Library-BV6NnF0a.js → Library-BGJbG9Hd.js} +1 -1
- package/static/app/assets/{LivingBrain-GzenJchP.js → LivingBrain-DGYK_Jsa.js} +1 -1
- package/static/app/assets/{ProductFlow-DEP6-vML.js → ProductFlow-DXBC6brE.js} +1 -1
- package/static/app/assets/{ReviewCard-CNZ7XjWG.js → ReviewCard-HXRle3qq.js} +2 -2
- package/static/app/assets/System-CMHSO9qM.js +1 -0
- package/static/app/assets/arrow-left-BfmkskWx.js +1 -0
- package/static/app/assets/{bot-B_K1Tdmw.js → bot-Cn8bWRuq.js} +1 -1
- package/static/app/assets/{brain-DWyaV1L1.js → brain-CQJberbE.js} +1 -1
- package/static/app/assets/{button-aTn4s84A.js → button-Ct9f2_oT.js} +1 -1
- package/static/app/assets/circle-check-DruOxB-4.js +1 -0
- package/static/app/assets/{circle-pause-xKgeGXkT.js → circle-pause-CmzC_apg.js} +1 -1
- package/static/app/assets/{circle-play-DkT6tYPX.js → circle-play-D8mW2aQ7.js} +1 -1
- package/static/app/assets/{cpu-85xYObUC.js → cpu-DZcdd0PZ.js} +1 -1
- package/static/app/assets/{download-B5Fm7YXo.js → download-bv1KEPGQ.js} +1 -1
- package/static/app/assets/{folder-open-kk2Xa52u.js → folder-open-d-Pip5gr.js} +1 -1
- package/static/app/assets/{hard-drive-DkA3zBW_.js → hard-drive-D20iavUb.js} +1 -1
- package/static/app/assets/index-D9x-kSNy.css +2 -0
- package/static/app/assets/{index-BMPdTmlY.js → index-Do83hDzJ.js} +3 -3
- package/static/app/assets/{input-B0nRf2jO.js → input-BLXVNmj1.js} +1 -1
- package/static/app/assets/{link-2-Dwb4gnTc.js → link-2-BPJOFlAy.js} +1 -1
- package/static/app/assets/{permissionCopy-CQDUBrOZ.js → permissionCopy-ChdJd493.js} +1 -1
- package/static/app/assets/primitives-Cv5tbZBY.js +1 -0
- package/static/app/assets/search-CT9aho2j.js +1 -0
- package/static/app/assets/{share-2-BsrxFglO.js → share-2-YNX_NtMU.js} +1 -1
- package/static/app/assets/{shield-alert-5BStfp2_.js → shield-alert-DuQ3zrVL.js} +1 -1
- package/static/app/assets/{textarea-Cg8IUA-k.js → textarea-DqwLnli4.js} +1 -1
- package/static/app/assets/{useFocusTrap-CYKvE46M.js → useFocusTrap-ZVI98jaW.js} +1 -1
- package/static/app/assets/{useMutation-CSn9t1op.js → useMutation-CVC4qv_D.js} +1 -1
- package/static/app/assets/{useQuery-CY2OI2uy.js → useQuery-C7BeG4HU.js} +1 -1
- package/static/app/assets/{utils-Ddol2RWD.js → utils-CiFtIdZq.js} +1 -1
- package/static/app/assets/{workspace-BqDwOz_p.js → workspace-DQz9vIId.js} +1 -1
- package/static/app/index.html +4 -4
- package/static/sw.js +1 -1
- package/lattice_brain/archive.py +0 -522
- package/lattice_brain/context.py +0 -325
- package/lattice_brain/conversations.py +0 -382
- package/lattice_brain/core.py +0 -82
- package/lattice_brain/graph/_kg_contract.py +0 -249
- package/lattice_brain/graph/curator.py +0 -676
- package/lattice_brain/graph/discovery.py +0 -595
- package/lattice_brain/graph/discovery_index/__init__.py +0 -35
- package/lattice_brain/graph/discovery_index/cleanup.py +0 -182
- package/lattice_brain/graph/discovery_index/extract.py +0 -137
- package/lattice_brain/graph/discovery_index/scan.py +0 -411
- package/lattice_brain/graph/discovery_index/upsert.py +0 -495
- package/lattice_brain/graph/documents.py +0 -380
- package/lattice_brain/graph/fusion.py +0 -395
- package/lattice_brain/graph/identity.py +0 -175
- package/lattice_brain/graph/image_vectors.py +0 -230
- package/lattice_brain/graph/ingest.py +0 -829
- package/lattice_brain/graph/network.py +0 -205
- package/lattice_brain/graph/proactive.py +0 -724
- package/lattice_brain/graph/projection/__init__.py +0 -42
- package/lattice_brain/graph/projection/curation.py +0 -500
- package/lattice_brain/graph/projection/v2_schema.py +0 -518
- package/lattice_brain/graph/provenance.py +0 -524
- package/lattice_brain/graph/rerank.py +0 -163
- package/lattice_brain/graph/retrieval/__init__.py +0 -54
- package/lattice_brain/graph/retrieval/context.py +0 -197
- package/lattice_brain/graph/retrieval/graph_view.py +0 -319
- package/lattice_brain/graph/retrieval/hybrid.py +0 -488
- package/lattice_brain/graph/retrieval/maintenance.py +0 -121
- package/lattice_brain/graph/retrieval/signals.py +0 -95
- package/lattice_brain/graph/retrieval_docgen.py +0 -253
- package/lattice_brain/graph/retrieval_policy.py +0 -180
- package/lattice_brain/graph/retrieval_reads.py +0 -769
- package/lattice_brain/graph/retrieval_vector/__init__.py +0 -42
- package/lattice_brain/graph/retrieval_vector/fingerprint.py +0 -97
- package/lattice_brain/graph/retrieval_vector/indexing.py +0 -347
- package/lattice_brain/graph/retrieval_vector/search.py +0 -560
- package/lattice_brain/graph/retrieval_vector/status.py +0 -374
- package/lattice_brain/graph/schema.py +0 -792
- package/lattice_brain/graph/store.py +0 -268
- package/lattice_brain/graph/vector_index/__init__.py +0 -85
- package/lattice_brain/graph/vector_index/base.py +0 -167
- package/lattice_brain/graph/vector_index/brute_force.py +0 -110
- package/lattice_brain/graph/vector_index/hnsw.py +0 -290
- package/lattice_brain/graph/vector_index/jobs.py +0 -287
- package/lattice_brain/graph/vector_index/quantized.py +0 -148
- package/lattice_brain/graph/vector_index/selector.py +0 -161
- package/lattice_brain/graph/write_master.py +0 -308
- package/lattice_brain/ingestion/_contract.py +0 -90
- package/lattice_brain/ingestion/folder_scan.py +0 -57
- package/lattice_brain/ingestion/folders.py +0 -258
- package/lattice_brain/ingestion/jobs_api.py +0 -107
- package/lattice_brain/ingestion/routing.py +0 -295
- package/lattice_brain/ingestion_jobs.py +0 -380
- package/lattice_brain/memory.py +0 -75
- package/lattice_brain/portability/__init__.py +0 -90
- package/lattice_brain/portability/_contract.py +0 -42
- package/lattice_brain/portability/backups.py +0 -338
- package/lattice_brain/portability/bundles.py +0 -136
- package/lattice_brain/portability/constants.py +0 -93
- package/lattice_brain/portability/fsops.py +0 -138
- package/lattice_brain/portability/service.py +0 -41
- package/lattice_brain/portability/sharing.py +0 -710
- package/lattice_brain/quality.py +0 -543
- package/lattice_brain/retrieval_benchmark_fixtures.py +0 -92
- package/lattice_brain/runtime/agent_runtime.py +0 -859
- package/lattice_brain/runtime/contracts.py +0 -460
- package/lattice_brain/runtime/multi_agent.py +0 -942
- package/lattice_brain/runtime/statuses.py +0 -10
- package/lattice_brain/sealed_box.py +0 -240
- package/lattice_brain/self_model.py +0 -675
- package/lattice_brain/sensitivity.py +0 -94
- package/lattice_brain/storage/__init__.py +0 -22
- package/lattice_brain/storage/base.py +0 -100
- package/lattice_brain/storage/docker.py +0 -105
- package/lattice_brain/storage/factory.py +0 -31
- package/lattice_brain/storage/migration.py +0 -191
- package/lattice_brain/storage/postgres.py +0 -123
- package/lattice_brain/storage/sqlite.py +0 -143
- package/lattice_brain/synthesis.py +0 -824
- package/lattice_brain/workflow.py +0 -497
- package/latticeai/api/admin.py +0 -471
- package/latticeai/api/agent_registry.py +0 -105
- package/latticeai/api/agents.py +0 -228
- package/latticeai/api/auth.py +0 -383
- package/latticeai/api/automation_intelligence.py +0 -401
- package/latticeai/api/brain_intelligence.py +0 -199
- package/latticeai/api/browser.py +0 -493
- package/latticeai/api/change_proposals.py +0 -89
- package/latticeai/api/chat.py +0 -572
- package/latticeai/api/chat_agent_http.py +0 -892
- package/latticeai/api/chat_contracts.py +0 -73
- package/latticeai/api/chat_documents.py +0 -276
- package/latticeai/api/chat_helpers.py +0 -460
- package/latticeai/api/chat_history.py +0 -101
- package/latticeai/api/chat_hybrid.py +0 -113
- package/latticeai/api/chat_intents.py +0 -646
- package/latticeai/api/chat_stream.py +0 -216
- package/latticeai/api/chronicle.py +0 -63
- package/latticeai/api/command_center.py +0 -51
- package/latticeai/api/computer_use.py +0 -474
- package/latticeai/api/evidence_actions.py +0 -48
- package/latticeai/api/features.py +0 -70
- package/latticeai/api/funnel_metrics.py +0 -31
- package/latticeai/api/garden.py +0 -34
- package/latticeai/api/hooks.py +0 -165
- package/latticeai/api/index_jobs.py +0 -145
- package/latticeai/api/invitations.py +0 -100
- package/latticeai/api/knowledge_graph.py +0 -536
- package/latticeai/api/marketplace.py +0 -105
- package/latticeai/api/mcp.py +0 -482
- package/latticeai/api/memory.py +0 -270
- package/latticeai/api/network.py +0 -81
- package/latticeai/api/network_boundary.py +0 -225
- package/latticeai/api/permission_mode.py +0 -61
- package/latticeai/api/permissions.py +0 -436
- package/latticeai/api/plugins.py +0 -126
- package/latticeai/api/portability.py +0 -391
- package/latticeai/api/project_sessions.py +0 -114
- package/latticeai/api/realtime.py +0 -118
- package/latticeai/api/review_queue.py +0 -364
- package/latticeai/api/security_dashboard.py +0 -604
- package/latticeai/api/setup.py +0 -319
- package/latticeai/api/static_routes.py +0 -354
- package/latticeai/api/ui_redirects.py +0 -26
- package/latticeai/api/workflow_designer.py +0 -394
- package/latticeai/api/workspace.py +0 -856
- package/latticeai/api/workspace_scope.py +0 -125
- package/latticeai/core/agent/__init__.py +0 -93
- package/latticeai/core/agent/_contract.py +0 -79
- package/latticeai/core/agent/context.py +0 -57
- package/latticeai/core/agent/deps.py +0 -125
- package/latticeai/core/agent/execution.py +0 -622
- package/latticeai/core/agent/planning.py +0 -145
- package/latticeai/core/agent/recovery.py +0 -157
- package/latticeai/core/agent/runtime.py +0 -210
- package/latticeai/core/agent/verification.py +0 -231
- package/latticeai/core/agent_eval.py +0 -739
- package/latticeai/core/agent_helpers.py +0 -493
- package/latticeai/core/agent_profiles.py +0 -110
- package/latticeai/core/agent_prompts.py +0 -171
- package/latticeai/core/agent_registry.py +0 -232
- package/latticeai/core/agent_state.py +0 -41
- package/latticeai/core/agent_trace.py +0 -104
- package/latticeai/core/artifact_ledger.py +0 -109
- package/latticeai/core/audit.py +0 -260
- package/latticeai/core/builtin_hooks.py +0 -105
- package/latticeai/core/context_builder.py +0 -394
- package/latticeai/core/document_generator.py +0 -103
- package/latticeai/core/enterprise.py +0 -154
- package/latticeai/core/enterprise_admin.py +0 -158
- package/latticeai/core/file_generation/__init__.py +0 -115
- package/latticeai/core/file_generation/bundles.py +0 -76
- package/latticeai/core/file_generation/extraction.py +0 -154
- package/latticeai/core/file_generation/inference.py +0 -235
- package/latticeai/core/file_generation/orchestration.py +0 -152
- package/latticeai/core/file_generation/prompting.py +0 -117
- package/latticeai/core/file_generation/repair.py +0 -114
- package/latticeai/core/file_generation/sanitize.py +0 -61
- package/latticeai/core/file_generation/validation.py +0 -201
- package/latticeai/core/invitations.py +0 -132
- package/latticeai/core/legacy_compatibility.py +0 -243
- package/latticeai/core/logging_safety.py +0 -46
- package/latticeai/core/marketplace.py +0 -293
- package/latticeai/core/mcp_catalog.py +0 -452
- package/latticeai/core/mcp_registry.py +0 -506
- package/latticeai/core/network_boundary.py +0 -168
- package/latticeai/core/oidc.py +0 -208
- package/latticeai/core/plugins.py +0 -432
- package/latticeai/core/product_hardening.py +0 -218
- package/latticeai/core/project_sessions.py +0 -337
- package/latticeai/core/realtime.py +0 -238
- package/latticeai/core/run_explain.py +0 -426
- package/latticeai/core/run_store.py +0 -252
- package/latticeai/core/timezones.py +0 -80
- package/latticeai/core/workspace_computer_memory.py +0 -84
- package/latticeai/core/workspace_graph_trace.py +0 -155
- package/latticeai/core/workspace_indexing.py +0 -102
- package/latticeai/core/workspace_memory.py +0 -77
- package/latticeai/core/workspace_onboarding.py +0 -104
- package/latticeai/core/workspace_os.py +0 -978
- package/latticeai/core/workspace_os_constants.py +0 -126
- package/latticeai/core/workspace_os_state.py +0 -180
- package/latticeai/core/workspace_os_utils.py +0 -103
- package/latticeai/core/workspace_permissions.py +0 -101
- package/latticeai/core/workspace_plugins.py +0 -97
- package/latticeai/core/workspace_relationships.py +0 -99
- package/latticeai/core/workspace_reorganization.py +0 -335
- package/latticeai/core/workspace_review_items.py +0 -112
- package/latticeai/core/workspace_runs.py +0 -726
- package/latticeai/core/workspace_skills.py +0 -109
- package/latticeai/core/workspace_snapshots.py +0 -198
- package/latticeai/core/workspace_timeline.py +0 -110
- package/latticeai/integrations/__init__.py +0 -0
- package/latticeai/integrations/telegram_bot/__init__.py +0 -123
- package/latticeai/integrations/telegram_bot/__main__.py +0 -17
- package/latticeai/integrations/telegram_bot/config.py +0 -86
- package/latticeai/integrations/telegram_bot/dispatch.py +0 -311
- package/latticeai/integrations/telegram_bot/flows.py +0 -478
- package/latticeai/integrations/telegram_bot/helpers.py +0 -322
- package/latticeai/integrations/telegram_bot/screens.py +0 -394
- package/latticeai/runtime/audit_runtime.py +0 -76
- package/latticeai/runtime/automation_runtime.py +0 -81
- package/latticeai/runtime/chat_wiring.py +0 -141
- package/latticeai/runtime/context_runtime.py +0 -66
- package/latticeai/runtime/feature_toggle_wiring.py +0 -157
- package/latticeai/runtime/history_runtime.py +0 -163
- package/latticeai/runtime/history_writer.py +0 -138
- package/latticeai/runtime/hooks_runtime.py +0 -77
- package/latticeai/runtime/model_wiring.py +0 -68
- package/latticeai/runtime/namespace_runtime.py +0 -163
- package/latticeai/runtime/network_boundary_wiring.py +0 -117
- package/latticeai/runtime/network_config_runtime.py +0 -56
- package/latticeai/runtime/permission_mode_wiring.py +0 -112
- package/latticeai/runtime/persistence_runtime.py +0 -159
- package/latticeai/runtime/platform_runtime_wiring.py +0 -89
- package/latticeai/runtime/review_wiring.py +0 -42
- package/latticeai/runtime/router_registration.py +0 -693
- package/latticeai/runtime/service_singletons.py +0 -55
- package/latticeai/runtime/sso_config_runtime.py +0 -128
- package/latticeai/runtime/user_key_runtime.py +0 -106
- package/latticeai/runtime/web_runtime.py +0 -92
- package/latticeai/server_app.py +0 -51
- package/latticeai/services/app_context.py +0 -130
- package/latticeai/services/automation_execution.py +0 -266
- package/latticeai/services/automation_intelligence.py +0 -614
- package/latticeai/services/brain_automation.py +0 -191
- package/latticeai/services/brain_intelligence/__init__.py +0 -58
- package/latticeai/services/brain_intelligence/_contract.py +0 -71
- package/latticeai/services/brain_intelligence/consistency.py +0 -193
- package/latticeai/services/brain_intelligence/constants.py +0 -47
- package/latticeai/services/brain_intelligence/digest.py +0 -258
- package/latticeai/services/brain_intelligence/health.py +0 -331
- package/latticeai/services/brain_intelligence/proposals.py +0 -259
- package/latticeai/services/brain_intelligence/sampling.py +0 -84
- package/latticeai/services/brain_intelligence/service.py +0 -48
- package/latticeai/services/change_proposals.py +0 -471
- package/latticeai/services/chat_service.py +0 -243
- package/latticeai/services/chronicle.py +0 -555
- package/latticeai/services/cloud_egress_audit.py +0 -85
- package/latticeai/services/cloud_extraction.py +0 -129
- package/latticeai/services/cloud_streaming.py +0 -268
- package/latticeai/services/cloud_token_guard.py +0 -84
- package/latticeai/services/command_center.py +0 -548
- package/latticeai/services/evidence_actions.py +0 -258
- package/latticeai/services/feature_toggles.py +0 -502
- package/latticeai/services/folder_watch.py +0 -520
- package/latticeai/services/funnel_metrics.py +0 -307
- package/latticeai/services/hybrid_chat.py +0 -316
- package/latticeai/services/hybrid_context.py +0 -228
- package/latticeai/services/hybrid_policy.py +0 -129
- package/latticeai/services/interop_bridges.py +0 -978
- package/latticeai/services/local_knowledge.py +0 -465
- package/latticeai/services/memory_service/__init__.py +0 -52
- package/latticeai/services/memory_service/_contract.py +0 -100
- package/latticeai/services/memory_service/brief.py +0 -431
- package/latticeai/services/memory_service/constants.py +0 -57
- package/latticeai/services/memory_service/maintenance.py +0 -138
- package/latticeai/services/memory_service/manager.py +0 -186
- package/latticeai/services/memory_service/proof.py +0 -136
- package/latticeai/services/memory_service/recall.py +0 -225
- package/latticeai/services/memory_service/service.py +0 -48
- package/latticeai/services/memory_service/stores.py +0 -110
- package/latticeai/services/mode_store.py +0 -132
- package/latticeai/services/model_recommendation.py +0 -224
- package/latticeai/services/model_runtime/cloud.py +0 -87
- package/latticeai/services/network_boundary_service.py +0 -117
- package/latticeai/services/obsidian_bridge.py +0 -609
- package/latticeai/services/openai_compatible_adapter.py +0 -101
- package/latticeai/services/permission_mode_service.py +0 -122
- package/latticeai/services/platform_runtime.py +0 -366
- package/latticeai/services/review_queue.py +0 -380
- package/latticeai/services/router_context.py +0 -59
- package/latticeai/services/run_executor.py +0 -387
- package/latticeai/services/self_model_service.py +0 -171
- package/latticeai/services/setup_detection.py +0 -147
- package/latticeai/services/triggers.py +0 -378
- package/latticeai/services/upload_service.py +0 -172
- package/latticeai/services/workspace_service.py +0 -165
- package/latticeai/setup/__init__.py +0 -25
- package/latticeai/setup/auto_setup.py +0 -846
- package/latticeai/setup/demo_corpus.py +0 -98
- package/latticeai/setup/wizard/__init__.py +0 -126
- package/latticeai/setup/wizard/catalog.py +0 -175
- package/latticeai/setup/wizard/detect.py +0 -302
- package/latticeai/setup/wizard/install.py +0 -348
- package/latticeai/setup/wizard/paths.py +0 -165
- package/latticeai/setup/wizard/plans.py +0 -74
- package/latticeai/setup/wizard/recommend.py +0 -320
- package/scripts/bench_agent_smoke.py +0 -409
- package/scripts/bench_models.py +0 -540
- package/scripts/bench_vector_index.py +0 -295
- package/scripts/funnel_soft_gate.py +0 -192
- package/scripts/generate_agent_loop_fixtures.py +0 -994
- package/scripts/generate_rust_parity_fixtures.py +0 -908
- package/scripts/migrate_brain_storage.py +0 -57
- package/scripts/parity_fixture_corpus_context.py +0 -162
- package/scripts/parity_fixture_corpus_docgen.py +0 -341
- package/scripts/profile_kg.py +0 -355
- package/server.py +0 -30
- package/static/app/assets/AdminConsole-cf4npybT.js +0 -1
- package/static/app/assets/Capture-DiQ219jW.js +0 -1
- package/static/app/assets/System-CieofHQa.js +0 -1
- package/static/app/assets/arrow-left-kfsrk0mv.js +0 -1
- package/static/app/assets/circle-check-qqLug9nU.js +0 -1
- package/static/app/assets/index-DxmOfNRi.css +0 -2
- package/static/app/assets/primitives-SNp0LRJz.js +0 -1
- package/static/app/assets/search-BcHqkjoy.js +0 -1
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
"""Synthesis never writes: it proposes, and the Review Center decides.
|
|
2
|
-
|
|
3
|
-
Everything the Brain notices on its own arrives as a review proposal — new
|
|
4
|
-
connections, contradictions, consolidation candidates, decayed importance. That
|
|
5
|
-
makes the review queue a hard dependency of every method here: when it is
|
|
6
|
-
absent they report ``available: False`` rather than falling back to a direct
|
|
7
|
-
write.
|
|
8
|
-
|
|
9
|
-
:meth:`proactive_brief` is the read-only counterpart. It counts what is already
|
|
10
|
-
waiting rather than raising anything new, so opening the home screen never
|
|
11
|
-
mutates the Brain.
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
from __future__ import annotations
|
|
15
|
-
|
|
16
|
-
from typing import Any, Dict, List, Optional
|
|
17
|
-
|
|
18
|
-
from latticeai.core.timeutil import now_iso as _now
|
|
19
|
-
|
|
20
|
-
from ._contract import BrainIntelligenceCore as _Core
|
|
21
|
-
from .constants import LOGGER
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class BrainProposalsMixin(_Core):
|
|
25
|
-
"""The proposal path and the proactive brief. Mixed into the service."""
|
|
26
|
-
|
|
27
|
-
# ── proposal path (v11.1.0) ───────────────────────────────────────────
|
|
28
|
-
#
|
|
29
|
-
# Synthesis never writes: it proposes, and the Review Center decides. That
|
|
30
|
-
# makes the review queue a hard dependency of every method below — when it
|
|
31
|
-
# is absent they report ``available: False`` rather than falling back to a
|
|
32
|
-
# direct write.
|
|
33
|
-
|
|
34
|
-
def _review_queue(self) -> Any:
|
|
35
|
-
"""The queue to propose into, or ``None`` when there is none.
|
|
36
|
-
|
|
37
|
-
Prefers an explicitly injected service. Otherwise it builds one over
|
|
38
|
-
the workspace store the memory service already holds — the same
|
|
39
|
-
``WorkspaceOSStore`` every other ``ReviewQueueService`` in the process
|
|
40
|
-
is constructed over, so proposals land in the one inbox the user reads
|
|
41
|
-
even before the composition root injects the service directly.
|
|
42
|
-
"""
|
|
43
|
-
if self._review_queue_service is not None:
|
|
44
|
-
return self._review_queue_service
|
|
45
|
-
store = getattr(self._memory, "_store", None)
|
|
46
|
-
if store is None or not hasattr(store, "create_review_item"):
|
|
47
|
-
return None
|
|
48
|
-
from latticeai.services.review_queue import ReviewQueueService
|
|
49
|
-
|
|
50
|
-
self._review_queue_service = ReviewQueueService(store=store)
|
|
51
|
-
return self._review_queue_service
|
|
52
|
-
|
|
53
|
-
def _synthesis(self) -> Any:
|
|
54
|
-
"""Lazy :class:`BrainSynthesizer` over the graph + review queue."""
|
|
55
|
-
if self._synthesizer is not None:
|
|
56
|
-
return self._synthesizer
|
|
57
|
-
queue = self._review_queue()
|
|
58
|
-
if not self._enable_graph or queue is None:
|
|
59
|
-
return None
|
|
60
|
-
from lattice_brain.synthesis import BrainSynthesizer
|
|
61
|
-
|
|
62
|
-
self._synthesizer = BrainSynthesizer(self._kg, queue)
|
|
63
|
-
return self._synthesizer
|
|
64
|
-
|
|
65
|
-
@staticmethod
|
|
66
|
-
def _no_queue(detail: str) -> Dict[str, Any]:
|
|
67
|
-
return {"available": False, "detail": detail, "generated_at": _now()}
|
|
68
|
-
|
|
69
|
-
def synthesize(
|
|
70
|
-
self, *, user_email: Optional[str] = None, workspace_id: Optional[str] = None
|
|
71
|
-
) -> Dict[str, Any]:
|
|
72
|
-
"""Run one synthesis pass; every finding becomes a review proposal."""
|
|
73
|
-
synthesizer = self._synthesis()
|
|
74
|
-
if synthesizer is None:
|
|
75
|
-
return self._no_queue(
|
|
76
|
-
"synthesis needs both the knowledge graph and the review queue"
|
|
77
|
-
)
|
|
78
|
-
try:
|
|
79
|
-
result = dict(
|
|
80
|
-
synthesizer.run(workspace_id=workspace_id, user_email=user_email)
|
|
81
|
-
)
|
|
82
|
-
except Exception as exc: # noqa: BLE001 — a failed pass is reported, not raised
|
|
83
|
-
LOGGER.exception("brain synthesis failed")
|
|
84
|
-
return {"available": False, "error": str(exc), "generated_at": _now()}
|
|
85
|
-
result["available"] = True
|
|
86
|
-
return result
|
|
87
|
-
|
|
88
|
-
def note_ingest(
|
|
89
|
-
self,
|
|
90
|
-
result: Any,
|
|
91
|
-
*,
|
|
92
|
-
user_email: Optional[str] = None,
|
|
93
|
-
workspace_id: Optional[str] = None,
|
|
94
|
-
) -> Optional[Dict[str, Any]]:
|
|
95
|
-
"""Ingest-driven trigger seam.
|
|
96
|
-
|
|
97
|
-
Hand every ingest result here; synthesis runs only once the configured
|
|
98
|
-
number of genuinely new nodes has accumulated. Returns the run result
|
|
99
|
-
when one fired, ``None`` otherwise — so an ingest path can call this
|
|
100
|
-
unconditionally and cheaply.
|
|
101
|
-
"""
|
|
102
|
-
synthesizer = self._synthesis()
|
|
103
|
-
if synthesizer is None:
|
|
104
|
-
return None
|
|
105
|
-
try:
|
|
106
|
-
return synthesizer.run_if_due(
|
|
107
|
-
result, workspace_id=workspace_id, user_email=user_email
|
|
108
|
-
)
|
|
109
|
-
except Exception: # noqa: BLE001 — synthesis must never break an ingest
|
|
110
|
-
LOGGER.exception("ingest-triggered synthesis failed")
|
|
111
|
-
return None
|
|
112
|
-
|
|
113
|
-
def propose_contradictions(
|
|
114
|
-
self, *, user_email: Optional[str] = None, workspace_id: Optional[str] = None
|
|
115
|
-
) -> Dict[str, Any]:
|
|
116
|
-
"""Raise a review proposal for every contradicting pair of memories."""
|
|
117
|
-
queue = self._review_queue()
|
|
118
|
-
if not self._enable_graph or queue is None:
|
|
119
|
-
return self._no_queue(
|
|
120
|
-
"contradiction proposals need both the knowledge graph and the review queue"
|
|
121
|
-
)
|
|
122
|
-
from lattice_brain.synthesis import propose_contradictions
|
|
123
|
-
|
|
124
|
-
try:
|
|
125
|
-
return propose_contradictions(
|
|
126
|
-
self._kg, queue, workspace_id=workspace_id, user_email=user_email
|
|
127
|
-
)
|
|
128
|
-
except Exception as exc: # noqa: BLE001
|
|
129
|
-
LOGGER.exception("contradiction proposal pass failed")
|
|
130
|
-
return {"available": False, "error": str(exc), "generated_at": _now()}
|
|
131
|
-
|
|
132
|
-
def resolve_contradiction(
|
|
133
|
-
self,
|
|
134
|
-
item_id: str,
|
|
135
|
-
*,
|
|
136
|
-
resolution: str,
|
|
137
|
-
workspace_id: Optional[str] = None,
|
|
138
|
-
) -> Dict[str, Any]:
|
|
139
|
-
"""Approve a contradiction proposal and apply its temporal stamps.
|
|
140
|
-
|
|
141
|
-
Raises ``ContradictionResolutionError`` (a ``ValueError``) for an
|
|
142
|
-
unknown resolution or a review item that is not a contradiction — the
|
|
143
|
-
router turns those into 400s.
|
|
144
|
-
"""
|
|
145
|
-
queue = self._review_queue()
|
|
146
|
-
if not self._enable_graph or queue is None:
|
|
147
|
-
return self._no_queue(
|
|
148
|
-
"resolving a contradiction needs both the knowledge graph and the review queue"
|
|
149
|
-
)
|
|
150
|
-
from lattice_brain.synthesis import resolve_contradiction
|
|
151
|
-
|
|
152
|
-
result = dict(
|
|
153
|
-
resolve_contradiction(
|
|
154
|
-
self._kg,
|
|
155
|
-
queue,
|
|
156
|
-
item_id,
|
|
157
|
-
resolution=resolution,
|
|
158
|
-
workspace_id=workspace_id,
|
|
159
|
-
)
|
|
160
|
-
)
|
|
161
|
-
result["available"] = True
|
|
162
|
-
return result
|
|
163
|
-
|
|
164
|
-
def importance_report(
|
|
165
|
-
self, *, user_email: Optional[str] = None, workspace_id: Optional[str] = None
|
|
166
|
-
) -> Dict[str, Any]:
|
|
167
|
-
"""Which memories are load-bearing, and which have decayed into noise."""
|
|
168
|
-
proactive = self._proactive()
|
|
169
|
-
if proactive is None:
|
|
170
|
-
return {"available": False, "candidates": [], "generated_at": _now()}
|
|
171
|
-
try:
|
|
172
|
-
report = dict(proactive.importance_report(workspace_id=workspace_id))
|
|
173
|
-
except Exception as exc: # noqa: BLE001
|
|
174
|
-
LOGGER.exception("importance report failed")
|
|
175
|
-
return {
|
|
176
|
-
"available": False,
|
|
177
|
-
"error": str(exc),
|
|
178
|
-
"candidates": [],
|
|
179
|
-
"generated_at": _now(),
|
|
180
|
-
}
|
|
181
|
-
report["available"] = True
|
|
182
|
-
return report
|
|
183
|
-
|
|
184
|
-
def proactive_brief(
|
|
185
|
-
self, *, user_email: Optional[str] = None, workspace_id: Optional[str] = None
|
|
186
|
-
) -> Dict[str, Any]:
|
|
187
|
-
"""The Brain Brief's proactive section: what the Brain noticed on its own.
|
|
188
|
-
|
|
189
|
-
Read-only. It counts the proposals already waiting in the Review Center
|
|
190
|
-
rather than raising new ones, so opening the home screen never mutates
|
|
191
|
-
anything — and reports honestly when there is no queue to read.
|
|
192
|
-
"""
|
|
193
|
-
section: Dict[str, Any] = {
|
|
194
|
-
"available": False,
|
|
195
|
-
"pending": {"total": 0, "by_kind": {}},
|
|
196
|
-
"tidying": False,
|
|
197
|
-
"headline": "",
|
|
198
|
-
"lines": [],
|
|
199
|
-
"generated_at": _now(),
|
|
200
|
-
}
|
|
201
|
-
queue = self._review_queue()
|
|
202
|
-
if queue is None:
|
|
203
|
-
section["detail"] = "the review queue is not available on this deployment"
|
|
204
|
-
return section
|
|
205
|
-
pending = self._pending_synthesis_items(queue, workspace_id=workspace_id)
|
|
206
|
-
by_kind: Dict[str, int] = {}
|
|
207
|
-
for item in pending:
|
|
208
|
-
kind = str(item.get("kind") or "suggestion")
|
|
209
|
-
by_kind[kind] = by_kind.get(kind, 0) + 1
|
|
210
|
-
synthesizer = self._synthesis()
|
|
211
|
-
brief: Dict[str, Any] = {}
|
|
212
|
-
if synthesizer is not None:
|
|
213
|
-
try:
|
|
214
|
-
brief = dict(
|
|
215
|
-
synthesizer.brief_section(
|
|
216
|
-
counts=by_kind, workspace_id=workspace_id
|
|
217
|
-
)
|
|
218
|
-
)
|
|
219
|
-
except Exception: # noqa: BLE001 — the section degrades, never raises
|
|
220
|
-
LOGGER.exception("synthesis brief section failed")
|
|
221
|
-
section.update(
|
|
222
|
-
{
|
|
223
|
-
"available": True,
|
|
224
|
-
"pending": {"total": len(pending), "by_kind": by_kind},
|
|
225
|
-
"items": [
|
|
226
|
-
{
|
|
227
|
-
"id": item.get("id"),
|
|
228
|
-
"kind": item.get("kind"),
|
|
229
|
-
"title": item.get("title"),
|
|
230
|
-
"summary": item.get("summary"),
|
|
231
|
-
}
|
|
232
|
-
for item in pending[:5]
|
|
233
|
-
],
|
|
234
|
-
"tidying": by_kind.get("consolidation", 0) > 0,
|
|
235
|
-
"headline": str(brief.get("headline") or ""),
|
|
236
|
-
"lines": list(brief.get("lines") or []),
|
|
237
|
-
"recent_nodes": brief.get("recent_nodes"),
|
|
238
|
-
}
|
|
239
|
-
)
|
|
240
|
-
return section
|
|
241
|
-
|
|
242
|
-
@staticmethod
|
|
243
|
-
def _pending_synthesis_items(
|
|
244
|
-
queue: Any, *, workspace_id: Optional[str]
|
|
245
|
-
) -> List[Dict[str, Any]]:
|
|
246
|
-
from lattice_brain.synthesis import SYNTHESIS_REVIEW_SOURCE
|
|
247
|
-
|
|
248
|
-
try:
|
|
249
|
-
listing = queue.list(
|
|
250
|
-
workspace_id=workspace_id, source=SYNTHESIS_REVIEW_SOURCE
|
|
251
|
-
)
|
|
252
|
-
except Exception: # noqa: BLE001 — an unreadable inbox reads as empty
|
|
253
|
-
LOGGER.exception("review queue listing failed")
|
|
254
|
-
return []
|
|
255
|
-
return [
|
|
256
|
-
item
|
|
257
|
-
for item in listing.get("items") or []
|
|
258
|
-
if str(item.get("effective_status") or item.get("status")) == "pending"
|
|
259
|
-
]
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
"""How the service reaches the graph layer and the memory tier.
|
|
2
|
-
|
|
3
|
-
One workspace-scoped graph slice (:meth:`_graph_sample`) feeds the health
|
|
4
|
-
report, the insights digest, the garden and both consistency scans, so they all
|
|
5
|
-
measure the same knowledge. The slice normalizes the store's ``from``/``to``
|
|
6
|
-
edge keys to the ``source``/``target`` the quality layer expects — once, here,
|
|
7
|
-
instead of at four call sites.
|
|
8
|
-
|
|
9
|
-
Both readers degrade rather than raise: an unreadable graph reports
|
|
10
|
-
``available: False`` and an unreadable memory tier reads as empty, because a
|
|
11
|
-
diagnosis that crashes is worse than one that says it could not measure.
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
from __future__ import annotations
|
|
15
|
-
|
|
16
|
-
from typing import Any, Dict, List, Optional
|
|
17
|
-
|
|
18
|
-
from ._contract import BrainIntelligenceCore as _Core
|
|
19
|
-
from .constants import _GRAPH_SAMPLE_LIMIT, LOGGER
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
class BrainSamplingMixin(_Core):
|
|
23
|
-
"""The shared graph slice and memory read. Mixed into the service."""
|
|
24
|
-
|
|
25
|
-
def _proactive(self) -> Any:
|
|
26
|
-
"""Lazy graph-layer ProactiveBrain over the injected store (or None)."""
|
|
27
|
-
if not self._enable_graph:
|
|
28
|
-
return None
|
|
29
|
-
if self._proactive_brain is None:
|
|
30
|
-
try:
|
|
31
|
-
from lattice_brain.graph.proactive import ProactiveBrain
|
|
32
|
-
|
|
33
|
-
self._proactive_brain = ProactiveBrain(
|
|
34
|
-
self._kg, sample_limit=_GRAPH_SAMPLE_LIMIT
|
|
35
|
-
)
|
|
36
|
-
except Exception:
|
|
37
|
-
LOGGER.exception("proactive brain initialization failed")
|
|
38
|
-
return None
|
|
39
|
-
return self._proactive_brain
|
|
40
|
-
|
|
41
|
-
# ── shared graph sampling ─────────────────────────────────────────────
|
|
42
|
-
|
|
43
|
-
def _graph_sample(self, *, workspace_id: Optional[str]) -> Dict[str, Any]:
|
|
44
|
-
"""Recent graph slice with scoping applied. Empty when graph is off."""
|
|
45
|
-
if not self._enable_graph:
|
|
46
|
-
return {"nodes": [], "edges": [], "available": False}
|
|
47
|
-
try:
|
|
48
|
-
kwargs: Dict[str, Any] = {}
|
|
49
|
-
if workspace_id is not None:
|
|
50
|
-
kwargs["allowed_workspaces"] = {workspace_id}
|
|
51
|
-
data = self._kg.graph(_GRAPH_SAMPLE_LIMIT, **kwargs)
|
|
52
|
-
edges = []
|
|
53
|
-
for edge in data.get("edges") or []:
|
|
54
|
-
# Store emits "from"/"to"; the quality layer expects
|
|
55
|
-
# "source"/"target". Normalize once here.
|
|
56
|
-
normalized = dict(edge)
|
|
57
|
-
normalized.setdefault("source", edge.get("from"))
|
|
58
|
-
normalized.setdefault("target", edge.get("to"))
|
|
59
|
-
edges.append(normalized)
|
|
60
|
-
return {
|
|
61
|
-
"nodes": list(data.get("nodes") or []),
|
|
62
|
-
"edges": edges,
|
|
63
|
-
"available": True,
|
|
64
|
-
}
|
|
65
|
-
except Exception as exc:
|
|
66
|
-
LOGGER.exception("brain intelligence graph sample failed")
|
|
67
|
-
return {"nodes": [], "edges": [], "available": False, "error": str(exc)}
|
|
68
|
-
|
|
69
|
-
def _workspace_memories(
|
|
70
|
-
self, *, user_email: Optional[str], workspace_id: Optional[str]
|
|
71
|
-
) -> List[Dict[str, Any]]:
|
|
72
|
-
if self._memory is None:
|
|
73
|
-
return []
|
|
74
|
-
try:
|
|
75
|
-
inspected = self._memory.inspect(
|
|
76
|
-
"workspace",
|
|
77
|
-
user_email=user_email,
|
|
78
|
-
workspace_id=workspace_id or "personal",
|
|
79
|
-
limit=500,
|
|
80
|
-
)
|
|
81
|
-
return list(inspected.get("items") or [])
|
|
82
|
-
except Exception:
|
|
83
|
-
LOGGER.exception("brain intelligence memory read failed")
|
|
84
|
-
return []
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"""The composed Brain Intelligence service — injected collaborators, five surfaces.
|
|
2
|
-
|
|
3
|
-
``BrainIntelligenceService`` owns the state every mixin reads (the Knowledge
|
|
4
|
-
Graph, the memory service, the two quality managers, and the lazily built
|
|
5
|
-
proactive brain / synthesizer) and inherits its behaviour from the proposal,
|
|
6
|
-
sampling, health, digest and consistency mixins. Same public surface, same
|
|
7
|
-
method resolution, in six readable files instead of one eleven-hundred-line
|
|
8
|
-
one.
|
|
9
|
-
|
|
10
|
-
Pure service: no FastAPI, no globals. Collaborators are injected.
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
from __future__ import annotations
|
|
14
|
-
|
|
15
|
-
from typing import Any
|
|
16
|
-
|
|
17
|
-
from lattice_brain.quality import GraphEdgeQualityManager, MemoryQualityManager
|
|
18
|
-
|
|
19
|
-
from .consistency import BrainConsistencyMixin
|
|
20
|
-
from .digest import BrainDigestMixin
|
|
21
|
-
from .health import BrainHealthMixin
|
|
22
|
-
from .proposals import BrainProposalsMixin
|
|
23
|
-
from .sampling import BrainSamplingMixin
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class BrainIntelligenceService(
|
|
27
|
-
BrainProposalsMixin,
|
|
28
|
-
BrainSamplingMixin,
|
|
29
|
-
BrainHealthMixin,
|
|
30
|
-
BrainDigestMixin,
|
|
31
|
-
BrainConsistencyMixin,
|
|
32
|
-
):
|
|
33
|
-
def __init__(
|
|
34
|
-
self,
|
|
35
|
-
*,
|
|
36
|
-
knowledge_graph: Any = None,
|
|
37
|
-
memory_service: Any = None,
|
|
38
|
-
enable_graph: bool = True,
|
|
39
|
-
review_queue: Any = None,
|
|
40
|
-
) -> None:
|
|
41
|
-
self._kg = knowledge_graph
|
|
42
|
-
self._memory = memory_service
|
|
43
|
-
self._enable_graph = bool(enable_graph and knowledge_graph is not None)
|
|
44
|
-
self._memory_quality = MemoryQualityManager()
|
|
45
|
-
self._edge_quality = GraphEdgeQualityManager()
|
|
46
|
-
self._proactive_brain: Any = None
|
|
47
|
-
self._review_queue_service = review_queue
|
|
48
|
-
self._synthesizer: Any = None
|