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,93 +0,0 @@
|
|
|
1
|
-
"""Formats, gates and the vocabulary the portability surfaces agree on.
|
|
2
|
-
|
|
3
|
-
Everything here is a literal or a gate: no I/O, no graph, no service. Keeping
|
|
4
|
-
it in one leaf module is what lets the file helpers, the sharing surface and
|
|
5
|
-
the backup surface all import the same constants without importing each other.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from __future__ import annotations
|
|
9
|
-
|
|
10
|
-
from ..gates import FeatureGate
|
|
11
|
-
from ..utils import utc_now_iso
|
|
12
|
-
|
|
13
|
-
FORMAT = "latticeai.kg.export"
|
|
14
|
-
FORMAT_VERSION = 1
|
|
15
|
-
BACKUP_FORMAT = "latticeai.kg.backup"
|
|
16
|
-
|
|
17
|
-
# ── selective subgraph share (v11.1.0 prototype, off by default) ─────────────
|
|
18
|
-
#: Logical format of a *partial* bundle: a chosen slice of the graph plus its
|
|
19
|
-
#: provenance, signed by this device. Deliberately distinct from ``FORMAT`` so
|
|
20
|
-
#: the whole-graph importer can never be handed a subgraph by accident.
|
|
21
|
-
SUBGRAPH_FORMAT = "latticeai.kg.subgraph"
|
|
22
|
-
SUBGRAPH_FORMAT_VERSION = 1
|
|
23
|
-
#: Encrypted on-disk envelope for the same bundle, reusing the ``.latticebrain``
|
|
24
|
-
#: passphrase mechanism (PBKDF2-SHA256 + AES-256-GCM) from ``archive.py``.
|
|
25
|
-
SUBGRAPH_ARCHIVE_FORMAT = "latticebrain.subgraph"
|
|
26
|
-
#: Opt-in gate. Off unless the operator sets it: sharing knowledge with another
|
|
27
|
-
#: Brain is a network act, and local-first means those are never on by default.
|
|
28
|
-
BRAIN_NETWORK_ENV = "LATTICEAI_BRAIN_NETWORK"
|
|
29
|
-
_TRUTHY = frozenset({"1", "true", "yes", "on"})
|
|
30
|
-
#: How a bundle can be encrypted. ``passphrase`` needs a secret agreed out of
|
|
31
|
-
#: band; ``recipient_public_key`` needs nothing secret to travel at all.
|
|
32
|
-
ENCRYPTION_MODES = ("passphrase", "recipient_public_key")
|
|
33
|
-
#: A received bundle becomes review items, never a merge. The cap keeps one
|
|
34
|
-
#: peer from flooding the inbox; what it dropped is reported, not hidden.
|
|
35
|
-
SUBGRAPH_PROPOSAL_CAP = 200
|
|
36
|
-
#: Review-queue vocabulary. ``kg_change_digest`` is the existing source for
|
|
37
|
-
#: "the graph would change"; the kind distinguishes shared-subgraph items.
|
|
38
|
-
SUBGRAPH_REVIEW_SOURCE = "kg_change_digest"
|
|
39
|
-
SUBGRAPH_REVIEW_KIND = "shared_subgraph_node"
|
|
40
|
-
#: Mirrors ``services.review_queue.OPEN_STATUSES``. Duplicated as a literal
|
|
41
|
-
#: rather than imported because ``lattice_brain`` must not depend on the
|
|
42
|
-
#: ``latticeai`` service layer; the review sink is injected, not imported.
|
|
43
|
-
_OPEN_REVIEW_STATUSES = frozenset({"pending", "snoozed"})
|
|
44
|
-
|
|
45
|
-
BRAIN_NETWORK_DISABLED_DETAIL = (
|
|
46
|
-
"Brain Network sharing is off. It is opt-in by design: set "
|
|
47
|
-
f"{BRAIN_NETWORK_ENV}=1 to enable selective subgraph export and receipt."
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
#: The share gate, resolved when it is asked. The environment variable is still
|
|
52
|
-
#: the default answer — an untouched install behaves exactly as it did — but a
|
|
53
|
-
#: settings surface can now bind a resolver and move it without a restart.
|
|
54
|
-
BRAIN_NETWORK_GATE = FeatureGate(
|
|
55
|
-
BRAIN_NETWORK_ENV,
|
|
56
|
-
default=False,
|
|
57
|
-
name="brain_network",
|
|
58
|
-
detail=BRAIN_NETWORK_DISABLED_DETAIL,
|
|
59
|
-
)
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
class BrainNetworkDisabled(PermissionError):
|
|
63
|
-
"""Raised when a share surface is used while the opt-in flag is off."""
|
|
64
|
-
|
|
65
|
-
def __init__(self, detail: str = BRAIN_NETWORK_DISABLED_DETAIL) -> None:
|
|
66
|
-
super().__init__(detail)
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
def brain_network_enabled() -> bool:
|
|
70
|
-
"""True only when the operator explicitly opted in (default: off)."""
|
|
71
|
-
return BRAIN_NETWORK_GATE.enabled()
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def require_brain_network() -> None:
|
|
75
|
-
if not brain_network_enabled():
|
|
76
|
-
raise BrainNetworkDisabled()
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
def _stamp() -> str:
|
|
80
|
-
return utc_now_iso().replace(":", "").replace("-", "").replace(".", "")[:15]
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
#: Sender-identifying fields stripped from a shared bundle by default. The
|
|
84
|
-
#: knowledge travels; "which account, on which machine, at which path" does not.
|
|
85
|
-
_REDACTED_FIELDS = frozenset({"owner", "user_email", "source_uri", "permissions"})
|
|
86
|
-
#: The signed payload's key set. One tuple so export and verify can never
|
|
87
|
-
#: disagree about what the digest covers.
|
|
88
|
-
_PAYLOAD_KEYS = (
|
|
89
|
-
"nodes", "chunk_nodes", "edges", "chunks", "knowledge_sources", "provenance",
|
|
90
|
-
)
|
|
91
|
-
#: Node types a one-hop expansion never admits — they describe the sender
|
|
92
|
-
#: (identity, local paths), not the knowledge being shared.
|
|
93
|
-
_NEIGHBOR_EXCLUDED_TYPES = frozenset({"Person", "Source"})
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
"""Atomic file swaps for restore, and the rollback that never masks a failure.
|
|
2
|
-
|
|
3
|
-
A restore replaces a live SQLite database and a blob tree in place. Each helper
|
|
4
|
-
here stages the new copy, keeps a pre-restore backup of what it is about to
|
|
5
|
-
overwrite, and — on any failure — puts the old files back *best-effort* while
|
|
6
|
-
always re-raising the original error. Recovery I/O that raises would hide the
|
|
7
|
-
failure being reported, which is the bug these guards exist for.
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
from __future__ import annotations
|
|
11
|
-
|
|
12
|
-
import logging
|
|
13
|
-
import os
|
|
14
|
-
import shutil
|
|
15
|
-
import sqlite3
|
|
16
|
-
from contextlib import closing
|
|
17
|
-
from pathlib import Path, PurePosixPath
|
|
18
|
-
from typing import Optional
|
|
19
|
-
|
|
20
|
-
from ..quiet import quiet
|
|
21
|
-
from .constants import _stamp
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
def _safe_zip_names(names) -> None:
|
|
25
|
-
for name in names:
|
|
26
|
-
path = PurePosixPath(name)
|
|
27
|
-
if path.is_absolute() or ".." in path.parts:
|
|
28
|
-
raise ValueError(f"Backup archive contains unsafe path: {name}")
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
def _pre_restore_backup_dir(anchor: Path) -> Path:
|
|
32
|
-
backup_dir = anchor.parent / f"{anchor.name}.pre-restore-{_stamp()}"
|
|
33
|
-
index = 1
|
|
34
|
-
while backup_dir.exists():
|
|
35
|
-
backup_dir = anchor.parent / f"{anchor.name}.pre-restore-{_stamp()}-{index}"
|
|
36
|
-
index += 1
|
|
37
|
-
backup_dir.mkdir(parents=True)
|
|
38
|
-
return backup_dir
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
def _sqlite_siblings(db_path: Path) -> tuple[Path, Path, Path]:
|
|
42
|
-
return (db_path, Path(str(db_path) + "-wal"), Path(str(db_path) + "-shm"))
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
def _checkpoint_sqlite(db_path: Path) -> None:
|
|
46
|
-
if not db_path.exists():
|
|
47
|
-
return
|
|
48
|
-
try:
|
|
49
|
-
with closing(sqlite3.connect(str(db_path))) as conn, conn:
|
|
50
|
-
conn.execute("PRAGMA wal_checkpoint(FULL)")
|
|
51
|
-
except sqlite3.Error:
|
|
52
|
-
# Best-effort only. Existing sibling backup/restore still preserves
|
|
53
|
-
# the WAL files if a live connection prevents a checkpoint.
|
|
54
|
-
return
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def _restore_sibling(path: Path, backup: Path) -> None:
|
|
58
|
-
try:
|
|
59
|
-
shutil.copy2(backup, path)
|
|
60
|
-
except FileNotFoundError:
|
|
61
|
-
# The backup vanished (or never existed — transient -wal/-shm): the
|
|
62
|
-
# honest reconstruction is "no such sibling", never a crash that
|
|
63
|
-
# masks the error that triggered the rollback.
|
|
64
|
-
path.unlink(missing_ok=True)
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
def _replace_sqlite_atomically(src: Path, dest: Path, backup_dir: Path) -> None:
|
|
68
|
-
dest.parent.mkdir(parents=True, exist_ok=True)
|
|
69
|
-
tmp = dest.parent / f".{dest.name}.restore-{_stamp()}-{os.getpid()}.tmp"
|
|
70
|
-
shutil.copyfile(src, tmp)
|
|
71
|
-
backups: dict[Path, Path] = {}
|
|
72
|
-
try:
|
|
73
|
-
_checkpoint_sqlite(dest)
|
|
74
|
-
# -wal/-shm are transient: another live connection can checkpoint and
|
|
75
|
-
# remove them between exists() and the copy/unlink. Treat a vanished
|
|
76
|
-
# sibling as "nothing to preserve" instead of crashing the restore.
|
|
77
|
-
for sibling in _sqlite_siblings(dest):
|
|
78
|
-
backup = backup_dir / sibling.name
|
|
79
|
-
try:
|
|
80
|
-
shutil.copy2(sibling, backup)
|
|
81
|
-
except FileNotFoundError:
|
|
82
|
-
quiet()
|
|
83
|
-
continue
|
|
84
|
-
backups[sibling] = backup
|
|
85
|
-
for sibling in _sqlite_siblings(dest)[1:]:
|
|
86
|
-
sibling.unlink(missing_ok=True)
|
|
87
|
-
os.replace(tmp, dest)
|
|
88
|
-
except Exception:
|
|
89
|
-
# Recovery I/O must never replace the swap error being reported —
|
|
90
|
-
# an exception raised here would mask it (the CI-observed
|
|
91
|
-
# "[Errno 2]" over the real failure). Best-effort restore, then
|
|
92
|
-
# always re-raise the original.
|
|
93
|
-
try:
|
|
94
|
-
tmp.unlink(missing_ok=True)
|
|
95
|
-
except OSError as cleanup_exc:
|
|
96
|
-
logging.warning("restore tmp cleanup failed: %s", cleanup_exc)
|
|
97
|
-
for sibling in _sqlite_siblings(dest):
|
|
98
|
-
try:
|
|
99
|
-
_restore_sibling(sibling, backups.get(sibling, backup_dir / sibling.name))
|
|
100
|
-
except OSError as rollback_exc:
|
|
101
|
-
logging.warning(
|
|
102
|
-
"restore sibling rollback incomplete for %s: %s",
|
|
103
|
-
sibling, rollback_exc,
|
|
104
|
-
)
|
|
105
|
-
raise
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
def _rollback_sqlite_from_backup(dest: Path, backup_dir: Path) -> None:
|
|
109
|
-
for sibling in _sqlite_siblings(dest):
|
|
110
|
-
_restore_sibling(sibling, backup_dir / sibling.name)
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
def _replace_tree_with_backup(src: Optional[Path], dest: Path, backup_dir: Path) -> None:
|
|
114
|
-
dest.parent.mkdir(parents=True, exist_ok=True)
|
|
115
|
-
staged = dest.parent / f".{dest.name}.restore-{_stamp()}-{os.getpid()}"
|
|
116
|
-
backup = backup_dir / dest.name
|
|
117
|
-
if src and src.exists():
|
|
118
|
-
shutil.copytree(src, staged)
|
|
119
|
-
else:
|
|
120
|
-
staged.mkdir(parents=True)
|
|
121
|
-
try:
|
|
122
|
-
if dest.exists():
|
|
123
|
-
shutil.copytree(dest, backup)
|
|
124
|
-
shutil.rmtree(dest)
|
|
125
|
-
os.replace(staged, dest)
|
|
126
|
-
except Exception:
|
|
127
|
-
# Same masking guard as the sqlite swap: rollback I/O is
|
|
128
|
-
# best-effort and the original failure always propagates.
|
|
129
|
-
try:
|
|
130
|
-
if staged.exists():
|
|
131
|
-
shutil.rmtree(staged)
|
|
132
|
-
if dest.exists():
|
|
133
|
-
shutil.rmtree(dest)
|
|
134
|
-
if backup.exists():
|
|
135
|
-
shutil.copytree(backup, dest)
|
|
136
|
-
except OSError as rollback_exc:
|
|
137
|
-
logging.warning("blob tree rollback incomplete: %s", rollback_exc)
|
|
138
|
-
raise
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
"""The composed portability service — state, availability, and the two halves.
|
|
2
|
-
|
|
3
|
-
``KGPortabilityService`` owns the constructor state every surface reads
|
|
4
|
-
(``_kg``, ``_data_dir``, ``_exports_dir``, ``_identity``, the lazily created
|
|
5
|
-
recipient key) and inherits its behaviour from the sharing and backup mixins.
|
|
6
|
-
Same public surface, same method resolution, in two readable files instead of
|
|
7
|
-
one thousand-line one.
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
from __future__ import annotations
|
|
11
|
-
|
|
12
|
-
from pathlib import Path
|
|
13
|
-
from typing import Any
|
|
14
|
-
|
|
15
|
-
from .backups import KGPortabilityBackupMixin
|
|
16
|
-
from .sharing import KGPortabilitySharingMixin
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class KGPortabilityService(KGPortabilitySharingMixin, KGPortabilityBackupMixin):
|
|
20
|
-
def __init__(self, *, knowledge_graph: Any, data_dir, enable_graph: bool = True, device_identity: Any = None) -> None:
|
|
21
|
-
self._kg = knowledge_graph
|
|
22
|
-
self._data_dir = Path(data_dir)
|
|
23
|
-
self._enable = bool(enable_graph)
|
|
24
|
-
self._exports_dir = self._data_dir / "workspace_exports"
|
|
25
|
-
# v4 sovereignty: when a DeviceIdentity is wired, exports are signed
|
|
26
|
-
# and imports record origin provenance. Pre-v4 unsigned bundles stay
|
|
27
|
-
# importable locally (origin='unsigned-legacy') — signatures are
|
|
28
|
-
# mandatory only on the Brain Network peer path.
|
|
29
|
-
self._identity = device_identity
|
|
30
|
-
# The receiving X25519 key is created lazily: a Brain that never asks
|
|
31
|
-
# anyone to seal anything to it should not be minting key material on
|
|
32
|
-
# every startup (v11.2.0).
|
|
33
|
-
self._recipient: Any = None
|
|
34
|
-
self._recipient_loaded = False
|
|
35
|
-
|
|
36
|
-
def available(self) -> bool:
|
|
37
|
-
return self._enable and self._kg is not None
|
|
38
|
-
|
|
39
|
-
def _require(self) -> None:
|
|
40
|
-
if not self.available():
|
|
41
|
-
raise RuntimeError("Knowledge Graph is disabled (LATTICEAI_ENABLE_GRAPH).")
|