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,364 +0,0 @@
|
|
|
1
|
-
"""Brain Review Queue API router (5.6.0).
|
|
2
|
-
|
|
3
|
-
The suggestion inbox the /app Review view drives. Follows the existing
|
|
4
|
-
auth/workspace dependency pattern (``require_user`` + ``gate_read``/``gate_write``)
|
|
5
|
-
and exposes explicit response models so the OpenAPI types are usable from the
|
|
6
|
-
frontend without massaging.
|
|
7
|
-
|
|
8
|
-
Action semantics live in :class:`~latticeai.services.review_queue.ReviewQueueService`:
|
|
9
|
-
|
|
10
|
-
* ``approve`` / ``dismiss`` / ``snooze`` / ``unsnooze`` are status transitions;
|
|
11
|
-
an illegal transition returns **409**.
|
|
12
|
-
* ``run_now`` previews/regenerates without changing status (back-links the run).
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
from __future__ import annotations
|
|
16
|
-
|
|
17
|
-
from typing import Any, Callable, Dict, List, Optional
|
|
18
|
-
|
|
19
|
-
from fastapi import APIRouter, HTTPException, Request
|
|
20
|
-
from pydantic import BaseModel, Field
|
|
21
|
-
|
|
22
|
-
from latticeai.core.messages import http_error, resolve_language, translate
|
|
23
|
-
from latticeai.services.change_proposals import ProposalConflictError
|
|
24
|
-
from latticeai.services.review_queue import InvalidReviewTransition, ReviewQueueService
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class ReviewItem(BaseModel):
|
|
28
|
-
id: str
|
|
29
|
-
status: str
|
|
30
|
-
effective_status: str
|
|
31
|
-
title: str
|
|
32
|
-
summary: str = ""
|
|
33
|
-
source: str = "workflow_run"
|
|
34
|
-
kind: str = "suggestion"
|
|
35
|
-
payload: Dict[str, Any] = Field(default_factory=dict)
|
|
36
|
-
provenance: Dict[str, Any] = Field(default_factory=dict)
|
|
37
|
-
snoozed_until: Optional[str] = None
|
|
38
|
-
user_email: Optional[str] = None
|
|
39
|
-
workspace_id: Optional[str] = None
|
|
40
|
-
created_at: Optional[str] = None
|
|
41
|
-
updated_at: Optional[str] = None
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
class ReviewItemList(BaseModel):
|
|
45
|
-
items: List[ReviewItem] = Field(default_factory=list)
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
class CreateReviewItemRequest(BaseModel):
|
|
49
|
-
title: str
|
|
50
|
-
summary: str = ""
|
|
51
|
-
source: str = "workflow_run"
|
|
52
|
-
kind: str = "suggestion"
|
|
53
|
-
payload: Dict[str, Any] = Field(default_factory=dict)
|
|
54
|
-
provenance: Dict[str, Any] = Field(default_factory=dict)
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
class SnoozeRequest(BaseModel):
|
|
58
|
-
until: str
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
class DismissRequest(BaseModel):
|
|
62
|
-
"""Optional dismissal context (e.g. why a change proposal was rejected)."""
|
|
63
|
-
|
|
64
|
-
reason: str = ""
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
class ReviewCounts(BaseModel):
|
|
68
|
-
pending: int = 0
|
|
69
|
-
snoozed: int = 0
|
|
70
|
-
pending_by_source: Dict[str, int] = Field(default_factory=dict)
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
class BulkActionRequest(BaseModel):
|
|
74
|
-
"""Decide several review items at once, named explicitly.
|
|
75
|
-
|
|
76
|
-
``ids`` is required and never defaults to "everything pending": a bulk
|
|
77
|
-
action whose scope is implicit is how an inbox gets emptied by accident.
|
|
78
|
-
"""
|
|
79
|
-
|
|
80
|
-
ids: List[str] = Field(default_factory=list)
|
|
81
|
-
reason: str = ""
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
class BulkActionOutcome(BaseModel):
|
|
85
|
-
"""Per-item verdict, so a partial success is legible rather than a total."""
|
|
86
|
-
|
|
87
|
-
id: str
|
|
88
|
-
status: str # ok | not_found | conflict | failed
|
|
89
|
-
item_status: Optional[str] = None
|
|
90
|
-
detail: Optional[str] = None
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
class BulkActionResult(BaseModel):
|
|
94
|
-
action: str
|
|
95
|
-
requested: int
|
|
96
|
-
succeeded: int
|
|
97
|
-
failed: int
|
|
98
|
-
results: List[BulkActionOutcome] = Field(default_factory=list)
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
#: Ceiling on one bulk call. Large enough for "clear today's inbox", small
|
|
102
|
-
#: enough that one request cannot walk the whole table inside a web worker.
|
|
103
|
-
BULK_ACTION_CAP = 200
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
def create_review_queue_router(
|
|
107
|
-
*,
|
|
108
|
-
service: ReviewQueueService,
|
|
109
|
-
require_user: Callable[[Request], str],
|
|
110
|
-
gate_read: Callable[[Request], Optional[str]],
|
|
111
|
-
gate_write: Callable[[Request], Optional[str]],
|
|
112
|
-
run_review_item: Callable[..., Any],
|
|
113
|
-
append_audit_event: Callable[..., None],
|
|
114
|
-
change_proposals: Any = None,
|
|
115
|
-
) -> APIRouter:
|
|
116
|
-
"""``change_proposals`` (optional) closes the governance loop: approving a
|
|
117
|
-
``change_proposal`` item from the Review Center applies the staged content
|
|
118
|
-
via :class:`~latticeai.services.change_proposals.ChangeProposalService`
|
|
119
|
-
instead of merely flipping the status — the same single application path
|
|
120
|
-
the /api/proposals surface uses."""
|
|
121
|
-
router = APIRouter()
|
|
122
|
-
|
|
123
|
-
@router.get("/automation/reviews", response_model=ReviewItemList)
|
|
124
|
-
async def list_items(
|
|
125
|
-
request: Request, status: Optional[str] = None, source: Optional[str] = None,
|
|
126
|
-
):
|
|
127
|
-
user = require_user(request)
|
|
128
|
-
scope = gate_read(request)
|
|
129
|
-
return service.list(workspace_id=scope, user_email=user, status=status, source=source)
|
|
130
|
-
|
|
131
|
-
@router.post("/automation/reviews", response_model=ReviewItem)
|
|
132
|
-
async def create_item(req: CreateReviewItemRequest, request: Request):
|
|
133
|
-
user = require_user(request)
|
|
134
|
-
scope = gate_write(request)
|
|
135
|
-
try:
|
|
136
|
-
item = service.create(
|
|
137
|
-
title=req.title,
|
|
138
|
-
summary=req.summary,
|
|
139
|
-
source=req.source,
|
|
140
|
-
kind=req.kind,
|
|
141
|
-
payload=req.payload,
|
|
142
|
-
provenance=req.provenance,
|
|
143
|
-
user_email=user,
|
|
144
|
-
workspace_id=scope,
|
|
145
|
-
)
|
|
146
|
-
except ValueError as exc:
|
|
147
|
-
raise HTTPException(status_code=422, detail=str(exc)) from exc
|
|
148
|
-
append_audit_event("review_item_created", user_email=user, item_id=item["id"])
|
|
149
|
-
return item
|
|
150
|
-
|
|
151
|
-
# NOTE: declared before /automation/reviews/{item_id} so "counts" never
|
|
152
|
-
# resolves as an item id.
|
|
153
|
-
@router.get("/automation/reviews/counts", response_model=ReviewCounts)
|
|
154
|
-
async def review_counts(request: Request):
|
|
155
|
-
user = require_user(request)
|
|
156
|
-
scope = gate_read(request)
|
|
157
|
-
return service.counts(workspace_id=scope, user_email=user)
|
|
158
|
-
|
|
159
|
-
# NOTE: declared *before* /automation/reviews/{item_id} for the same reason
|
|
160
|
-
# "counts" is — routes match in declaration order, so a later /bulk/... would
|
|
161
|
-
# be swallowed by the {item_id} matcher and answer 404 for a missing item.
|
|
162
|
-
@router.post("/automation/reviews/bulk/approve", response_model=BulkActionResult)
|
|
163
|
-
async def bulk_approve(req: BulkActionRequest, request: Request):
|
|
164
|
-
"""Approve several items, reporting each one's outcome individually."""
|
|
165
|
-
return _bulk(request, req, "approve")
|
|
166
|
-
|
|
167
|
-
@router.post("/automation/reviews/bulk/dismiss", response_model=BulkActionResult)
|
|
168
|
-
async def bulk_dismiss(req: BulkActionRequest, request: Request):
|
|
169
|
-
"""Dismiss several items, reporting each one's outcome individually."""
|
|
170
|
-
return _bulk(request, req, "dismiss")
|
|
171
|
-
|
|
172
|
-
@router.get("/automation/reviews/{item_id}", response_model=ReviewItem)
|
|
173
|
-
async def get_item(item_id: str, request: Request):
|
|
174
|
-
require_user(request)
|
|
175
|
-
scope = gate_read(request)
|
|
176
|
-
try:
|
|
177
|
-
return service.get(item_id, workspace_id=scope)
|
|
178
|
-
except FileNotFoundError as exc:
|
|
179
|
-
raise http_error(404, "review.item_not_found", resolve_language(request)) from exc
|
|
180
|
-
|
|
181
|
-
@router.post("/automation/reviews/{item_id}/approve", response_model=ReviewItem)
|
|
182
|
-
async def approve_item(item_id: str, request: Request):
|
|
183
|
-
user = require_user(request)
|
|
184
|
-
scope = gate_write(request)
|
|
185
|
-
# change_proposal items must apply the staged content on approve —
|
|
186
|
-
# otherwise the item flips to "approved" while nothing hits disk.
|
|
187
|
-
if change_proposals is not None:
|
|
188
|
-
try:
|
|
189
|
-
stored = service.get(item_id, workspace_id=scope)
|
|
190
|
-
except FileNotFoundError as exc:
|
|
191
|
-
raise http_error(404, "review.item_not_found", resolve_language(request)) from exc
|
|
192
|
-
if stored.get("source") == "change_proposal":
|
|
193
|
-
if stored.get("effective_status") not in ("pending", "snoozed"):
|
|
194
|
-
raise HTTPException(
|
|
195
|
-
status_code=409,
|
|
196
|
-
detail=translate(
|
|
197
|
-
"review.cannot_approve_in_status",
|
|
198
|
-
resolve_language(request),
|
|
199
|
-
status=stored.get("status"),
|
|
200
|
-
),
|
|
201
|
-
)
|
|
202
|
-
try:
|
|
203
|
-
applied = change_proposals.approve_and_apply(
|
|
204
|
-
item_id, user_email=user, workspace_id=scope
|
|
205
|
-
)
|
|
206
|
-
except ProposalConflictError as exc:
|
|
207
|
-
# The file drifted since staging (or the proposal was
|
|
208
|
-
# already resolved): same 409-on-replay semantics as the
|
|
209
|
-
# other illegal transitions, plus a rebase hint so the UI
|
|
210
|
-
# can offer "re-stage against the current content".
|
|
211
|
-
raise HTTPException(status_code=409, detail=exc.to_detail()) from exc
|
|
212
|
-
except (KeyError, FileNotFoundError) as exc:
|
|
213
|
-
raise HTTPException(status_code=404, detail=str(exc)) from exc
|
|
214
|
-
except ValueError as exc:
|
|
215
|
-
raise HTTPException(status_code=400, detail=str(exc)) from exc
|
|
216
|
-
append_audit_event("review_item_approve", user_email=user, item_id=item_id)
|
|
217
|
-
return applied["item"]
|
|
218
|
-
return _act(request, item_id, "approve")
|
|
219
|
-
|
|
220
|
-
@router.post("/automation/reviews/{item_id}/dismiss", response_model=ReviewItem)
|
|
221
|
-
async def dismiss_item(
|
|
222
|
-
item_id: str, request: Request, req: Optional[DismissRequest] = None
|
|
223
|
-
):
|
|
224
|
-
user = require_user(request)
|
|
225
|
-
scope = gate_write(request)
|
|
226
|
-
try:
|
|
227
|
-
item = service.dismiss(
|
|
228
|
-
item_id, workspace_id=scope, reason=(req.reason if req else None)
|
|
229
|
-
)
|
|
230
|
-
except FileNotFoundError as exc:
|
|
231
|
-
raise http_error(404, "review.item_not_found", resolve_language(request)) from exc
|
|
232
|
-
except InvalidReviewTransition as exc:
|
|
233
|
-
raise HTTPException(status_code=409, detail=str(exc)) from exc
|
|
234
|
-
append_audit_event("review_item_dismiss", user_email=user, item_id=item_id)
|
|
235
|
-
return item
|
|
236
|
-
|
|
237
|
-
@router.post("/automation/reviews/{item_id}/snooze", response_model=ReviewItem)
|
|
238
|
-
async def snooze_item(item_id: str, req: SnoozeRequest, request: Request):
|
|
239
|
-
user = require_user(request)
|
|
240
|
-
scope = gate_write(request)
|
|
241
|
-
try:
|
|
242
|
-
item = service.snooze(item_id, until=req.until, workspace_id=scope)
|
|
243
|
-
except FileNotFoundError as exc:
|
|
244
|
-
raise http_error(404, "review.item_not_found", resolve_language(request)) from exc
|
|
245
|
-
except InvalidReviewTransition as exc:
|
|
246
|
-
raise HTTPException(status_code=409, detail=str(exc)) from exc
|
|
247
|
-
append_audit_event("review_item_snooze", user_email=user, item_id=item_id)
|
|
248
|
-
return item
|
|
249
|
-
|
|
250
|
-
@router.post("/automation/reviews/{item_id}/unsnooze", response_model=ReviewItem)
|
|
251
|
-
async def unsnooze_item(item_id: str, request: Request):
|
|
252
|
-
return _act(request, item_id, "unsnooze")
|
|
253
|
-
|
|
254
|
-
def _bulk(request: Request, req: BulkActionRequest, action: str) -> Dict[str, Any]:
|
|
255
|
-
"""One transition applied N times through the *same* single-item guard.
|
|
256
|
-
|
|
257
|
-
Deliberately not a bulk UPDATE. Every id goes through the ordinary
|
|
258
|
-
service call, so an already-approved item still 409s, a
|
|
259
|
-
``change_proposal`` still applies its staged content, and the audit
|
|
260
|
-
trail records N decisions — because that is what happened. A failure
|
|
261
|
-
on one id never aborts the rest, and the response says exactly which
|
|
262
|
-
ones did not land instead of returning a single number the caller has
|
|
263
|
-
to interpret.
|
|
264
|
-
"""
|
|
265
|
-
user = require_user(request)
|
|
266
|
-
scope = gate_write(request)
|
|
267
|
-
language = resolve_language(request)
|
|
268
|
-
wanted = [str(item).strip() for item in req.ids if str(item).strip()]
|
|
269
|
-
if not wanted:
|
|
270
|
-
raise http_error(422, "review.bulk_ids_required", language)
|
|
271
|
-
if len(wanted) > BULK_ACTION_CAP:
|
|
272
|
-
raise http_error(422, "review.bulk_too_many", language, cap=BULK_ACTION_CAP)
|
|
273
|
-
results: List[Dict[str, Any]] = []
|
|
274
|
-
succeeded = 0
|
|
275
|
-
for item_id in wanted:
|
|
276
|
-
outcome = _bulk_one(request, item_id, action, user=user, scope=scope, reason=req.reason)
|
|
277
|
-
if outcome["status"] == "ok":
|
|
278
|
-
succeeded += 1
|
|
279
|
-
results.append(outcome)
|
|
280
|
-
return {
|
|
281
|
-
"action": action,
|
|
282
|
-
"requested": len(wanted),
|
|
283
|
-
"succeeded": succeeded,
|
|
284
|
-
"failed": len(wanted) - succeeded,
|
|
285
|
-
"results": results,
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
def _bulk_one(
|
|
289
|
-
request: Request,
|
|
290
|
-
item_id: str,
|
|
291
|
-
action: str,
|
|
292
|
-
*,
|
|
293
|
-
user: str,
|
|
294
|
-
scope: Optional[str],
|
|
295
|
-
reason: str,
|
|
296
|
-
) -> Dict[str, Any]:
|
|
297
|
-
try:
|
|
298
|
-
if action == "dismiss":
|
|
299
|
-
item = service.dismiss(item_id, workspace_id=scope, reason=reason or None)
|
|
300
|
-
else:
|
|
301
|
-
item = _approve_one(request, item_id, user=user, scope=scope)
|
|
302
|
-
except (FileNotFoundError, KeyError):
|
|
303
|
-
return {"id": item_id, "status": "not_found", "detail": None}
|
|
304
|
-
except InvalidReviewTransition as exc:
|
|
305
|
-
return {"id": item_id, "status": "conflict", "detail": str(exc)}
|
|
306
|
-
except ProposalConflictError as exc:
|
|
307
|
-
return {"id": item_id, "status": "conflict", "detail": str(exc)}
|
|
308
|
-
except HTTPException as exc:
|
|
309
|
-
return {
|
|
310
|
-
"id": item_id,
|
|
311
|
-
"status": "conflict" if exc.status_code == 409 else "failed",
|
|
312
|
-
"detail": str(exc.detail),
|
|
313
|
-
}
|
|
314
|
-
except ValueError as exc:
|
|
315
|
-
return {"id": item_id, "status": "failed", "detail": str(exc)}
|
|
316
|
-
append_audit_event(f"review_item_{action}", user_email=user, item_id=item_id)
|
|
317
|
-
return {"id": item_id, "status": "ok", "item_status": item.get("status"), "detail": None}
|
|
318
|
-
|
|
319
|
-
def _approve_one(
|
|
320
|
-
request: Request, item_id: str, *, user: str, scope: Optional[str]
|
|
321
|
-
) -> Dict[str, Any]:
|
|
322
|
-
"""Approve exactly the way the single-item route does, staged content included."""
|
|
323
|
-
if change_proposals is not None:
|
|
324
|
-
stored = service.get(item_id, workspace_id=scope)
|
|
325
|
-
if stored.get("source") == "change_proposal":
|
|
326
|
-
if stored.get("effective_status") not in ("pending", "snoozed"):
|
|
327
|
-
raise InvalidReviewTransition("approve", str(stored.get("status")))
|
|
328
|
-
applied = change_proposals.approve_and_apply(
|
|
329
|
-
item_id, user_email=user, workspace_id=scope
|
|
330
|
-
)
|
|
331
|
-
return dict(applied["item"])
|
|
332
|
-
return service.approve(item_id, workspace_id=scope)
|
|
333
|
-
|
|
334
|
-
@router.post("/automation/reviews/{item_id}/run_now", response_model=ReviewItem)
|
|
335
|
-
async def run_now_item(item_id: str, request: Request):
|
|
336
|
-
user = require_user(request)
|
|
337
|
-
scope = gate_write(request)
|
|
338
|
-
try:
|
|
339
|
-
item = service.run_now(
|
|
340
|
-
item_id,
|
|
341
|
-
runner=lambda stored: run_review_item(stored, user_email=user, scope=scope),
|
|
342
|
-
workspace_id=scope,
|
|
343
|
-
)
|
|
344
|
-
except FileNotFoundError as exc:
|
|
345
|
-
raise http_error(404, "review.item_not_found", resolve_language(request)) from exc
|
|
346
|
-
except InvalidReviewTransition as exc:
|
|
347
|
-
raise HTTPException(status_code=409, detail=str(exc)) from exc
|
|
348
|
-
append_audit_event("review_item_run_now", user_email=user, item_id=item_id)
|
|
349
|
-
return item
|
|
350
|
-
|
|
351
|
-
def _act(request: Request, item_id: str, action: str) -> Dict[str, Any]:
|
|
352
|
-
user = require_user(request)
|
|
353
|
-
scope = gate_write(request)
|
|
354
|
-
fn = getattr(service, action)
|
|
355
|
-
try:
|
|
356
|
-
item = fn(item_id, workspace_id=scope)
|
|
357
|
-
except FileNotFoundError as exc:
|
|
358
|
-
raise http_error(404, "review.item_not_found", resolve_language(request)) from exc
|
|
359
|
-
except InvalidReviewTransition as exc:
|
|
360
|
-
raise HTTPException(status_code=409, detail=str(exc)) from exc
|
|
361
|
-
append_audit_event(f"review_item_{action}", user_email=user, item_id=item_id)
|
|
362
|
-
return item
|
|
363
|
-
|
|
364
|
-
return router
|