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
package/lattice_brain/context.py
DELETED
|
@@ -1,325 +0,0 @@
|
|
|
1
|
-
"""Context System — one budgeted, provenance-carrying assembly pipeline.
|
|
2
|
-
|
|
3
|
-
Replaces the ad-hoc string concatenation that built chat context (language
|
|
4
|
-
hint + vault scan + KG LIKE search + recent chat appended in fixed order
|
|
5
|
-
with no size control). Every section the assembler emits records WHY it is
|
|
6
|
-
in the prompt (source, ids, scores), so "why is this in my context?" is
|
|
7
|
-
answerable, and the whole assembly respects a token budget.
|
|
8
|
-
|
|
9
|
-
Token counts are an explicit approximation: ``approx_tokens = ceil(len/4)``
|
|
10
|
-
(the stack ships no model-agnostic tokenizer; the field name says so —
|
|
11
|
-
design-review amendment T5).
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
from __future__ import annotations
|
|
15
|
-
|
|
16
|
-
import inspect
|
|
17
|
-
import logging
|
|
18
|
-
from dataclasses import dataclass, field
|
|
19
|
-
from typing import Any, Callable, Dict, List, Optional
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def approx_tokens(text: str) -> int:
|
|
23
|
-
"""Documented chars/4 approximation — NOT a real tokenizer count."""
|
|
24
|
-
return max(0, (len(text or "") + 3) // 4)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class _SeamUnavailable(RuntimeError):
|
|
28
|
-
"""Raised when a context seam is called but was never configured."""
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
def _call_context_seam(
|
|
32
|
-
callback: Optional[Callable[..., Any]], query: str, **context: Any
|
|
33
|
-
) -> Any:
|
|
34
|
-
"""Pass identity/scope only when a legacy seam declares support for it.
|
|
35
|
-
|
|
36
|
-
Signature inspection preserves old one-argument adapters without catching
|
|
37
|
-
a callback's own ``TypeError`` and retrying it with less restrictive scope.
|
|
38
|
-
If a callable cannot be inspected, the secure behavior is to pass every
|
|
39
|
-
context field and let the caller's failure isolation omit that section.
|
|
40
|
-
|
|
41
|
-
``callback`` is Optional because the seams themselves are: an assembler
|
|
42
|
-
built without a hybrid-search port simply has no knowledge section. The
|
|
43
|
-
section builders already run inside failure isolation, so an unconfigured
|
|
44
|
-
seam degrades to "section omitted" rather than crashing the turn.
|
|
45
|
-
"""
|
|
46
|
-
if callback is None:
|
|
47
|
-
raise _SeamUnavailable("seam is not configured")
|
|
48
|
-
try:
|
|
49
|
-
parameters = inspect.signature(callback).parameters
|
|
50
|
-
except (TypeError, ValueError):
|
|
51
|
-
return callback(query, **context)
|
|
52
|
-
accepts_kwargs = any(
|
|
53
|
-
item.kind is inspect.Parameter.VAR_KEYWORD
|
|
54
|
-
for item in parameters.values()
|
|
55
|
-
)
|
|
56
|
-
supported = context if accepts_kwargs else {
|
|
57
|
-
key: value for key, value in context.items()
|
|
58
|
-
if key in parameters
|
|
59
|
-
}
|
|
60
|
-
return callback(query, **supported)
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
def _call_keyword_seam(
|
|
64
|
-
callback: Optional[Callable[..., Any]], **context: Any
|
|
65
|
-
) -> Any:
|
|
66
|
-
"""Invoke a keyword-only seam while preserving legacy narrow signatures."""
|
|
67
|
-
if callback is None:
|
|
68
|
-
raise _SeamUnavailable("seam is not configured")
|
|
69
|
-
try:
|
|
70
|
-
parameters = inspect.signature(callback).parameters
|
|
71
|
-
except (TypeError, ValueError):
|
|
72
|
-
return callback(**context)
|
|
73
|
-
accepts_kwargs = any(
|
|
74
|
-
item.kind is inspect.Parameter.VAR_KEYWORD
|
|
75
|
-
for item in parameters.values()
|
|
76
|
-
)
|
|
77
|
-
supported = context if accepts_kwargs else {
|
|
78
|
-
key: value for key, value in context.items()
|
|
79
|
-
if key in parameters
|
|
80
|
-
}
|
|
81
|
-
return callback(**supported)
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
@dataclass
|
|
85
|
-
class ContextSection:
|
|
86
|
-
name: str
|
|
87
|
-
content: str
|
|
88
|
-
source: str # memory | knowledge | notes | recent_chat | system
|
|
89
|
-
provenance: List[Dict[str, Any]] = field(default_factory=list)
|
|
90
|
-
truncated: bool = False
|
|
91
|
-
|
|
92
|
-
@property
|
|
93
|
-
def approx_tokens(self) -> int:
|
|
94
|
-
return approx_tokens(self.content)
|
|
95
|
-
|
|
96
|
-
def as_trace(self) -> Dict[str, Any]:
|
|
97
|
-
return {
|
|
98
|
-
"name": self.name,
|
|
99
|
-
"source": self.source,
|
|
100
|
-
"approx_tokens": self.approx_tokens,
|
|
101
|
-
"truncated": self.truncated,
|
|
102
|
-
"provenance": self.provenance,
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
@dataclass
|
|
107
|
-
class AssembledContext:
|
|
108
|
-
sections: List[ContextSection]
|
|
109
|
-
budget_approx_tokens: int
|
|
110
|
-
|
|
111
|
-
@property
|
|
112
|
-
def text(self) -> str:
|
|
113
|
-
parts = []
|
|
114
|
-
for section in self.sections:
|
|
115
|
-
if section.content.strip():
|
|
116
|
-
parts.append(f"[{section.name}]\n{section.content.strip()}")
|
|
117
|
-
return "\n\n".join(parts)
|
|
118
|
-
|
|
119
|
-
@property
|
|
120
|
-
def approx_tokens(self) -> int:
|
|
121
|
-
return sum(s.approx_tokens for s in self.sections)
|
|
122
|
-
|
|
123
|
-
def trace(self) -> Dict[str, Any]:
|
|
124
|
-
return {
|
|
125
|
-
"budget_approx_tokens": self.budget_approx_tokens,
|
|
126
|
-
"used_approx_tokens": self.approx_tokens,
|
|
127
|
-
"sections": [s.as_trace() for s in self.sections],
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
class ContextAssembler:
|
|
132
|
-
"""Ordered, budgeted context assembly over injected retrieval seams.
|
|
133
|
-
|
|
134
|
-
Section priority (kept under budget in this order — semantic memories
|
|
135
|
-
first because they are cheap and durable; recency last):
|
|
136
|
-
1. memories — workspace semantic memories (preferences/decisions/…)
|
|
137
|
-
2. artifacts — files this conversation just produced (v9.9.6)
|
|
138
|
-
3. knowledge — hybrid search over the brain (the product's own engine)
|
|
139
|
-
4. notes — garden-note context
|
|
140
|
-
5. recent — the user's recent exchange
|
|
141
|
-
Every seam is optional; an absent seam contributes nothing (honest
|
|
142
|
-
absence), never a fabricated section.
|
|
143
|
-
|
|
144
|
-
The ``artifacts`` seam closes the re-search loop (review 2026-07-27 루프
|
|
145
|
-
§1): a file written moments ago may not be indexed yet — embedding and
|
|
146
|
-
graph writes are asynchronous — so asking "what did you just make?" could
|
|
147
|
-
miss it. The artifact ledger is a deterministic, high-priority section: it
|
|
148
|
-
does not depend on retrieval catching up.
|
|
149
|
-
"""
|
|
150
|
-
|
|
151
|
-
def __init__(
|
|
152
|
-
self,
|
|
153
|
-
*,
|
|
154
|
-
memory_recall: Optional[Callable[..., Dict[str, Any]]] = None,
|
|
155
|
-
hybrid_search: Optional[Callable[..., Dict[str, Any]]] = None,
|
|
156
|
-
notes_context: Optional[Callable[..., str]] = None,
|
|
157
|
-
recent_chat: Optional[Callable[..., str]] = None,
|
|
158
|
-
recent_artifacts: Optional[Callable[..., List[Dict[str, Any]]]] = None,
|
|
159
|
-
) -> None:
|
|
160
|
-
self._memory_recall = memory_recall
|
|
161
|
-
self._hybrid_search = hybrid_search
|
|
162
|
-
self._notes_context = notes_context
|
|
163
|
-
self._recent_chat = recent_chat
|
|
164
|
-
self._recent_artifacts = recent_artifacts
|
|
165
|
-
|
|
166
|
-
def assemble(
|
|
167
|
-
self,
|
|
168
|
-
query: str,
|
|
169
|
-
*,
|
|
170
|
-
user_email: Optional[str] = None,
|
|
171
|
-
workspace_id: Optional[str] = None,
|
|
172
|
-
conversation_id: Optional[str] = None,
|
|
173
|
-
budget: int = 2000,
|
|
174
|
-
memory_limit: int = 5,
|
|
175
|
-
knowledge_limit: int = 5,
|
|
176
|
-
) -> AssembledContext:
|
|
177
|
-
sections: List[ContextSection] = []
|
|
178
|
-
|
|
179
|
-
if self._memory_recall is not None:
|
|
180
|
-
sections.append(self._memories_section(query, user_email, workspace_id, memory_limit))
|
|
181
|
-
if self._recent_artifacts is not None:
|
|
182
|
-
sections.append(self._artifacts_section(user_email, conversation_id, workspace_id))
|
|
183
|
-
if self._hybrid_search is not None:
|
|
184
|
-
sections.append(self._knowledge_section(query, knowledge_limit, user_email, workspace_id))
|
|
185
|
-
if self._notes_context is not None:
|
|
186
|
-
sections.append(self._notes_section(query, user_email, workspace_id))
|
|
187
|
-
if self._recent_chat is not None:
|
|
188
|
-
sections.append(self._recent_section(user_email, conversation_id, workspace_id))
|
|
189
|
-
|
|
190
|
-
sections = [s for s in sections if s.content.strip()]
|
|
191
|
-
self._apply_budget(sections, budget)
|
|
192
|
-
return AssembledContext(sections=sections, budget_approx_tokens=budget)
|
|
193
|
-
|
|
194
|
-
# ── section builders (each failure-isolated and honest) ───────────────
|
|
195
|
-
def _memories_section(self, query, user_email, workspace_id, limit) -> ContextSection:
|
|
196
|
-
try:
|
|
197
|
-
recall_seam = self._memory_recall
|
|
198
|
-
if recall_seam is None:
|
|
199
|
-
raise _SeamUnavailable("memory_recall is not configured")
|
|
200
|
-
recall = recall_seam(query, user_email=user_email, workspace_id=workspace_id, limit=limit)
|
|
201
|
-
results = [r for r in recall.get("results", []) if r.get("source") == "workspace"][:limit]
|
|
202
|
-
except Exception as exc:
|
|
203
|
-
logging.debug("context: memory recall failed: %s", exc)
|
|
204
|
-
results = []
|
|
205
|
-
lines = [f"- ({r.get('kind') or 'memory'}) {r.get('snippet') or ''}" for r in results]
|
|
206
|
-
return ContextSection(
|
|
207
|
-
name="User memories",
|
|
208
|
-
content="\n".join(lines),
|
|
209
|
-
source="memory",
|
|
210
|
-
provenance=[
|
|
211
|
-
{"id": r.get("id"), "kind": r.get("kind"), "score": r.get("score")}
|
|
212
|
-
for r in results
|
|
213
|
-
],
|
|
214
|
-
)
|
|
215
|
-
|
|
216
|
-
def _artifacts_section(self, user_email, conversation_id, workspace_id) -> ContextSection:
|
|
217
|
-
"""Files this conversation produced, whether or not retrieval indexed them yet."""
|
|
218
|
-
try:
|
|
219
|
-
items = _call_keyword_seam(
|
|
220
|
-
self._recent_artifacts,
|
|
221
|
-
user_email=user_email,
|
|
222
|
-
conversation_id=conversation_id,
|
|
223
|
-
workspace_id=workspace_id,
|
|
224
|
-
) or []
|
|
225
|
-
except Exception as exc:
|
|
226
|
-
logging.debug("context: recent artifacts failed: %s", exc)
|
|
227
|
-
items = []
|
|
228
|
-
rows = [item for item in items if isinstance(item, dict) and item.get("path")][:10]
|
|
229
|
-
lines = [
|
|
230
|
-
f"- {item['path']}" + (f" ({item['at']})" if item.get("at") else "")
|
|
231
|
-
for item in rows
|
|
232
|
-
]
|
|
233
|
-
return ContextSection(
|
|
234
|
-
name="Files created in this conversation",
|
|
235
|
-
content="\n".join(lines),
|
|
236
|
-
source="artifacts",
|
|
237
|
-
provenance=[{"path": item.get("path"), "run_id": item.get("run_id")} for item in rows],
|
|
238
|
-
)
|
|
239
|
-
|
|
240
|
-
def _knowledge_section(self, query, limit, user_email=None, workspace_id=None) -> ContextSection:
|
|
241
|
-
try:
|
|
242
|
-
hybrid = _call_context_seam(
|
|
243
|
-
self._hybrid_search,
|
|
244
|
-
query,
|
|
245
|
-
limit=limit,
|
|
246
|
-
user_email=user_email,
|
|
247
|
-
workspace_id=workspace_id,
|
|
248
|
-
)
|
|
249
|
-
matches = hybrid.get("matches", [])[:limit]
|
|
250
|
-
except Exception as exc:
|
|
251
|
-
logging.debug("context: hybrid search failed: %s", exc)
|
|
252
|
-
matches = []
|
|
253
|
-
lines = []
|
|
254
|
-
provenance = []
|
|
255
|
-
for m in matches:
|
|
256
|
-
title = m.get("title") or m.get("id") or "item"
|
|
257
|
-
body = (m.get("summary") or m.get("snippet") or "")[:400]
|
|
258
|
-
lines.append(f"- {title}: {body}" if body else f"- {title}")
|
|
259
|
-
provenance.append({
|
|
260
|
-
"id": m.get("id"),
|
|
261
|
-
"score": m.get("score"),
|
|
262
|
-
"sources": m.get("sources"),
|
|
263
|
-
})
|
|
264
|
-
return ContextSection(
|
|
265
|
-
name="Knowledge",
|
|
266
|
-
content="\n".join(lines),
|
|
267
|
-
source="knowledge",
|
|
268
|
-
provenance=provenance,
|
|
269
|
-
)
|
|
270
|
-
|
|
271
|
-
def _notes_section(self, query, user_email=None, workspace_id=None) -> ContextSection:
|
|
272
|
-
try:
|
|
273
|
-
content = _call_context_seam(
|
|
274
|
-
self._notes_context,
|
|
275
|
-
query,
|
|
276
|
-
user_email=user_email,
|
|
277
|
-
workspace_id=workspace_id,
|
|
278
|
-
) or ""
|
|
279
|
-
except Exception as exc:
|
|
280
|
-
logging.debug("context: notes context failed: %s", exc)
|
|
281
|
-
content = ""
|
|
282
|
-
return ContextSection(
|
|
283
|
-
name="Garden notes",
|
|
284
|
-
content=content,
|
|
285
|
-
source="notes",
|
|
286
|
-
provenance=[{"source": "garden", "included": bool(content)}],
|
|
287
|
-
)
|
|
288
|
-
|
|
289
|
-
def _recent_section(self, user_email, conversation_id, workspace_id=None) -> ContextSection:
|
|
290
|
-
try:
|
|
291
|
-
content = _call_keyword_seam(
|
|
292
|
-
self._recent_chat,
|
|
293
|
-
user_email=user_email,
|
|
294
|
-
conversation_id=conversation_id,
|
|
295
|
-
workspace_id=workspace_id,
|
|
296
|
-
) or ""
|
|
297
|
-
except Exception as exc:
|
|
298
|
-
logging.debug("context: recent chat failed: %s", exc)
|
|
299
|
-
content = ""
|
|
300
|
-
return ContextSection(
|
|
301
|
-
name="Recent conversation",
|
|
302
|
-
content=content,
|
|
303
|
-
source="recent_chat",
|
|
304
|
-
provenance=[{"conversation_id": conversation_id, "user_email": user_email}],
|
|
305
|
-
)
|
|
306
|
-
|
|
307
|
-
# ── budget ─────────────────────────────────────────────────────────────
|
|
308
|
-
@staticmethod
|
|
309
|
-
def _apply_budget(sections: List[ContextSection], budget: int) -> None:
|
|
310
|
-
"""Trim from the END (lowest priority) until under budget."""
|
|
311
|
-
budget = max(1, int(budget))
|
|
312
|
-
used = 0
|
|
313
|
-
for section in sections:
|
|
314
|
-
remaining = budget - used
|
|
315
|
-
if remaining <= 0:
|
|
316
|
-
section.content = ""
|
|
317
|
-
section.truncated = True
|
|
318
|
-
continue
|
|
319
|
-
if section.approx_tokens > remaining:
|
|
320
|
-
section.content = section.content[: remaining * 4]
|
|
321
|
-
section.truncated = True
|
|
322
|
-
used += section.approx_tokens
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
__all__ = ["ContextAssembler", "ContextSection", "AssembledContext", "approx_tokens"]
|