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,216 +0,0 @@
|
|
|
1
|
-
"""SSE framing and streamed-answer finalization for chat routes."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import asyncio
|
|
6
|
-
import json
|
|
7
|
-
import logging
|
|
8
|
-
from typing import Any, AsyncIterator, Awaitable, Callable, Dict, Optional
|
|
9
|
-
|
|
10
|
-
from fastapi.responses import JSONResponse, StreamingResponse
|
|
11
|
-
|
|
12
|
-
from latticeai.api.chat_helpers import assess_answer_grounding, single_text_stream
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def single_answer_response(req: Any, answer: str, *, model: str):
|
|
16
|
-
if req.stream:
|
|
17
|
-
# The answering surface is reported once: the same ``model`` goes in
|
|
18
|
-
# the X-Model header and in every SSE frame body, so a client reading
|
|
19
|
-
# the stream never disagrees with a client reading the headers.
|
|
20
|
-
return StreamingResponse(
|
|
21
|
-
single_text_stream(answer, model=model),
|
|
22
|
-
media_type="text/event-stream",
|
|
23
|
-
headers={"X-Model": model},
|
|
24
|
-
)
|
|
25
|
-
return JSONResponse(content={"response": answer})
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
def agent_payload_stream(
|
|
29
|
-
answer: str,
|
|
30
|
-
payload: Dict[str, Any],
|
|
31
|
-
*,
|
|
32
|
-
router: Any,
|
|
33
|
-
model_id: Optional[str] = None,
|
|
34
|
-
) -> AsyncIterator[str]:
|
|
35
|
-
async def _stream() -> AsyncIterator[str]:
|
|
36
|
-
response_model = model_id or router.current_model_id
|
|
37
|
-
yield f"data: {json.dumps({'chunk': answer, 'model': response_model, 'agent': payload}, ensure_ascii=False)}\n\n"
|
|
38
|
-
yield f"data: {json.dumps({'chunk': '', 'model': response_model, 'agent': payload}, ensure_ascii=False)}\n\n"
|
|
39
|
-
yield "data: [DONE]\n\n"
|
|
40
|
-
|
|
41
|
-
return _stream()
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
def agent_live_stream(
|
|
45
|
-
start: Callable[[Callable[[Dict[str, Any]], None]], Awaitable[Dict[str, Any]]],
|
|
46
|
-
*,
|
|
47
|
-
router: Any,
|
|
48
|
-
model_id: Optional[str] = None,
|
|
49
|
-
finalize: Optional[Callable[[Dict[str, Any]], str]] = None,
|
|
50
|
-
) -> AsyncIterator[str]:
|
|
51
|
-
"""Live SSE for an agent run (review Wave 1.1).
|
|
52
|
-
|
|
53
|
-
``start(observer)`` runs the agent with a per-run step observer; every
|
|
54
|
-
observed step is emitted immediately as a named ``agent_step`` frame, so
|
|
55
|
-
the user watches the loop work instead of staring at silence. When the
|
|
56
|
-
run finishes, ``finalize(result)`` (history/funnel side effects) produces
|
|
57
|
-
the answer text and the classic final payload frames follow — clients
|
|
58
|
-
that ignore named events see exactly the historical stream shape.
|
|
59
|
-
"""
|
|
60
|
-
|
|
61
|
-
async def _stream() -> AsyncIterator[str]:
|
|
62
|
-
response_model = model_id or router.current_model_id
|
|
63
|
-
queue: "asyncio.Queue[Dict[str, Any]]" = asyncio.Queue()
|
|
64
|
-
|
|
65
|
-
def observer(event: Dict[str, Any]) -> None:
|
|
66
|
-
# Called synchronously from the agent coroutine on this loop.
|
|
67
|
-
queue.put_nowait(event)
|
|
68
|
-
|
|
69
|
-
task = asyncio.ensure_future(start(observer))
|
|
70
|
-
try:
|
|
71
|
-
while True:
|
|
72
|
-
getter = asyncio.create_task(queue.get())
|
|
73
|
-
done, _ = await asyncio.wait(
|
|
74
|
-
{getter, task}, return_when=asyncio.FIRST_COMPLETED
|
|
75
|
-
)
|
|
76
|
-
if getter in done:
|
|
77
|
-
step = getter.result()
|
|
78
|
-
yield (
|
|
79
|
-
"event: agent_step\n"
|
|
80
|
-
f"data: {json.dumps(step, ensure_ascii=False)}\n\n"
|
|
81
|
-
)
|
|
82
|
-
continue
|
|
83
|
-
getter.cancel()
|
|
84
|
-
break
|
|
85
|
-
while not queue.empty():
|
|
86
|
-
step = queue.get_nowait()
|
|
87
|
-
yield (
|
|
88
|
-
"event: agent_step\n"
|
|
89
|
-
f"data: {json.dumps(step, ensure_ascii=False)}\n\n"
|
|
90
|
-
)
|
|
91
|
-
result = task.result()
|
|
92
|
-
except Exception as exc: # noqa: BLE001 — already streaming a 200
|
|
93
|
-
logging.warning("agent live stream failed: %s", exc)
|
|
94
|
-
detail = getattr(exc, "detail", None) or str(exc)
|
|
95
|
-
yield f"data: {json.dumps({'error': str(detail), 'model': response_model}, ensure_ascii=False)}\n\n"
|
|
96
|
-
yield "data: [DONE]\n\n"
|
|
97
|
-
return
|
|
98
|
-
|
|
99
|
-
answer = str(result.get("response") or "작업을 완료했습니다.")
|
|
100
|
-
if finalize is not None:
|
|
101
|
-
try:
|
|
102
|
-
answer = finalize(result)
|
|
103
|
-
except Exception as exc: # noqa: BLE001 — side effects must not kill the stream
|
|
104
|
-
logging.warning("agent live stream finalize failed: %s", exc)
|
|
105
|
-
yield f"data: {json.dumps({'chunk': answer, 'model': response_model, 'agent': result}, ensure_ascii=False)}\n\n"
|
|
106
|
-
yield f"data: {json.dumps({'chunk': '', 'model': response_model, 'agent': result}, ensure_ascii=False)}\n\n"
|
|
107
|
-
yield "data: [DONE]\n\n"
|
|
108
|
-
|
|
109
|
-
return _stream()
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
async def stream_chat(
|
|
113
|
-
req: Any,
|
|
114
|
-
context: str,
|
|
115
|
-
image_data: Optional[str],
|
|
116
|
-
*,
|
|
117
|
-
router: Any,
|
|
118
|
-
chat_service: Any,
|
|
119
|
-
knowledge_graph: Any,
|
|
120
|
-
enable_graph: bool,
|
|
121
|
-
notify: Any,
|
|
122
|
-
trace_seed: Optional[Dict[str, Any]] = None,
|
|
123
|
-
effective_email: Optional[str] = None,
|
|
124
|
-
history_meta: Optional[Dict[str, Any]] = None,
|
|
125
|
-
model_id: Optional[str] = None,
|
|
126
|
-
workspace_id: Optional[str] = None,
|
|
127
|
-
context_quality: Optional[Dict[str, Any]] = None,
|
|
128
|
-
) -> AsyncIterator[str]:
|
|
129
|
-
"""Stream model chunks and persist exactly one finalized answer.
|
|
130
|
-
|
|
131
|
-
``context_quality`` (v9.8.0, additive) is echoed on the final trailer
|
|
132
|
-
event alongside the answer trace so streaming clients receive the same
|
|
133
|
-
honest RAG signal as the non-streaming JSON response.
|
|
134
|
-
"""
|
|
135
|
-
|
|
136
|
-
full_response = ""
|
|
137
|
-
stream_error: Optional[str] = None
|
|
138
|
-
try:
|
|
139
|
-
async for chunk in router.stream_generate_as(
|
|
140
|
-
model_id,
|
|
141
|
-
req.message,
|
|
142
|
-
context,
|
|
143
|
-
req.max_tokens,
|
|
144
|
-
req.temperature,
|
|
145
|
-
image_data,
|
|
146
|
-
):
|
|
147
|
-
clean_chunk = chunk.text if hasattr(chunk, "text") else chunk
|
|
148
|
-
full_response += str(clean_chunk)
|
|
149
|
-
yield f"data: {json.dumps({'chunk': clean_chunk, 'model': model_id}, ensure_ascii=False)}\n\n"
|
|
150
|
-
except Exception as exc:
|
|
151
|
-
stream_error = str(exc)
|
|
152
|
-
logging.warning("chat stream failed: %s", exc)
|
|
153
|
-
yield f"data: {json.dumps({'error': stream_error, 'model': model_id}, ensure_ascii=False)}\n\n"
|
|
154
|
-
|
|
155
|
-
persisted_response = full_response
|
|
156
|
-
if stream_error and not persisted_response:
|
|
157
|
-
persisted_response = f"[stream_error] {stream_error}"
|
|
158
|
-
elif stream_error:
|
|
159
|
-
persisted_response = f"{persisted_response}\n\n[stream_error] {stream_error}"
|
|
160
|
-
|
|
161
|
-
trace_record = None
|
|
162
|
-
grounding = None
|
|
163
|
-
try:
|
|
164
|
-
answer_trace = trace_seed or chat_service.build_graph_trace(
|
|
165
|
-
req.message,
|
|
166
|
-
knowledge_graph if (enable_graph and knowledge_graph) else None,
|
|
167
|
-
context,
|
|
168
|
-
allowed_workspaces={workspace_id} if workspace_id else None,
|
|
169
|
-
)
|
|
170
|
-
# Answer-citation binding (backlog #11): same honest verdict as the
|
|
171
|
-
# non-streaming path, recorded on the persisted trace + trailer.
|
|
172
|
-
try:
|
|
173
|
-
grounding = assess_answer_grounding(
|
|
174
|
-
full_response,
|
|
175
|
-
trace=answer_trace if isinstance(answer_trace, dict) else None,
|
|
176
|
-
context_quality=context_quality,
|
|
177
|
-
)
|
|
178
|
-
if isinstance(answer_trace, dict):
|
|
179
|
-
answer_trace["grounding"] = grounding
|
|
180
|
-
except Exception as exc: # noqa: BLE001 — annotation must never break streaming
|
|
181
|
-
logging.warning("answer grounding assessment failed: %s", exc)
|
|
182
|
-
grounding = None
|
|
183
|
-
trace_record = await chat_service.persist_answer(
|
|
184
|
-
question=req.message,
|
|
185
|
-
response=persisted_response,
|
|
186
|
-
conversation_id=req.conversation_id,
|
|
187
|
-
user_email=effective_email or req.user_email,
|
|
188
|
-
user_nickname=req.user_nickname,
|
|
189
|
-
source=req.source,
|
|
190
|
-
trace=answer_trace,
|
|
191
|
-
workspace_id=workspace_id,
|
|
192
|
-
history_meta=history_meta or {},
|
|
193
|
-
notify=notify,
|
|
194
|
-
)
|
|
195
|
-
except Exception as exc:
|
|
196
|
-
logging.warning("chat stream persistence failed: %s", exc)
|
|
197
|
-
|
|
198
|
-
trailer: Dict[str, Any] = {"chunk": "", "model": model_id}
|
|
199
|
-
if trace_record:
|
|
200
|
-
trailer.update({"trace_id": trace_record["id"], "trace": trace_record})
|
|
201
|
-
if context_quality is not None:
|
|
202
|
-
trailer["context_quality"] = context_quality
|
|
203
|
-
if grounding is not None:
|
|
204
|
-
trailer["grounding"] = grounding
|
|
205
|
-
if stream_error:
|
|
206
|
-
trailer["error"] = stream_error
|
|
207
|
-
yield f"data: {json.dumps(trailer, ensure_ascii=False)}\n\n"
|
|
208
|
-
yield "data: [DONE]\n\n"
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
__all__ = [
|
|
212
|
-
"agent_live_stream",
|
|
213
|
-
"agent_payload_stream",
|
|
214
|
-
"single_answer_response",
|
|
215
|
-
"stream_chat",
|
|
216
|
-
]
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
"""Brain Chronicle API router (v11.3.0, track B).
|
|
2
|
-
|
|
3
|
-
Read-only surface over :class:`~latticeai.services.chronicle.ChronicleService`
|
|
4
|
-
— the first HTTP exposure of the bitemporal data v11.1.0 started recording:
|
|
5
|
-
|
|
6
|
-
* ``GET /api/chronicle/overview`` — the growth curve: totals, the first and
|
|
7
|
-
last thing the Brain ever saw, and one bucket per day.
|
|
8
|
-
* ``GET /api/chronicle/day/{date}`` — one day's story, grouped into what came
|
|
9
|
-
in, what was learned, what was talked about, and what changed.
|
|
10
|
-
* ``GET /api/chronicle/as-of?ts=…`` — the Brain as it stood at an instant.
|
|
11
|
-
|
|
12
|
-
All three follow the same require_user/gate_read contract as the command
|
|
13
|
-
centre, so a workspace member never reads another workspace's timeline. A
|
|
14
|
-
malformed date or timestamp answers 422 through the message catalog rather
|
|
15
|
-
than a 500 or a silently empty day.
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
from __future__ import annotations
|
|
19
|
-
|
|
20
|
-
from typing import Callable, Optional
|
|
21
|
-
|
|
22
|
-
from fastapi import APIRouter, Query, Request
|
|
23
|
-
|
|
24
|
-
from latticeai.core.messages import http_error, resolve_language
|
|
25
|
-
from latticeai.services.chronicle import ChronicleService
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
def create_chronicle_router(
|
|
29
|
-
*,
|
|
30
|
-
service: ChronicleService,
|
|
31
|
-
require_user: Callable[[Request], str],
|
|
32
|
-
gate_read: Callable[[Request], Optional[str]],
|
|
33
|
-
) -> APIRouter:
|
|
34
|
-
router = APIRouter()
|
|
35
|
-
|
|
36
|
-
@router.get("/api/chronicle/overview")
|
|
37
|
-
async def chronicle_overview(request: Request):
|
|
38
|
-
user = require_user(request)
|
|
39
|
-
scope = gate_read(request)
|
|
40
|
-
return service.overview(user_email=user, workspace_id=scope)
|
|
41
|
-
|
|
42
|
-
@router.get("/api/chronicle/day/{date}")
|
|
43
|
-
async def chronicle_day(date: str, request: Request):
|
|
44
|
-
user = require_user(request)
|
|
45
|
-
scope = gate_read(request)
|
|
46
|
-
try:
|
|
47
|
-
return service.day(date, user_email=user, workspace_id=scope)
|
|
48
|
-
except ValueError:
|
|
49
|
-
raise http_error(422, "chronicle.bad_date", resolve_language(request))
|
|
50
|
-
|
|
51
|
-
@router.get("/api/chronicle/as-of")
|
|
52
|
-
async def chronicle_as_of(request: Request, ts: str = Query(..., max_length=64)):
|
|
53
|
-
require_user(request)
|
|
54
|
-
scope = gate_read(request)
|
|
55
|
-
try:
|
|
56
|
-
return service.as_of(ts, workspace_id=scope)
|
|
57
|
-
except ValueError:
|
|
58
|
-
raise http_error(422, "chronicle.bad_timestamp", resolve_language(request))
|
|
59
|
-
|
|
60
|
-
return router
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
__all__ = ["create_chronicle_router"]
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"""Command Center API router (v9.5.0).
|
|
2
|
-
|
|
3
|
-
Read-only surface over :class:`~latticeai.services.command_center.CommandCenterService`:
|
|
4
|
-
|
|
5
|
-
* ``GET /api/command/briefing`` — the daily briefing: recent knowledge,
|
|
6
|
-
conversation activity, automation state, pending reviews, health snapshot,
|
|
7
|
-
top suggestions, and state-derived quick actions.
|
|
8
|
-
* ``GET /api/command/search?q=…`` — universal search across knowledge nodes,
|
|
9
|
-
the user's conversations, and installed automations. Powers Cmd+K.
|
|
10
|
-
|
|
11
|
-
Both endpoints are scoped to the requesting user and workspace via the same
|
|
12
|
-
require_user/gate_read contract as the rest of the platform.
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
from __future__ import annotations
|
|
16
|
-
|
|
17
|
-
from typing import Callable, Optional
|
|
18
|
-
|
|
19
|
-
from fastapi import APIRouter, Query, Request
|
|
20
|
-
|
|
21
|
-
from latticeai.services.command_center import CommandCenterService
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
def create_command_center_router(
|
|
25
|
-
*,
|
|
26
|
-
service: CommandCenterService,
|
|
27
|
-
require_user: Callable[[Request], str],
|
|
28
|
-
gate_read: Callable[[Request], Optional[str]],
|
|
29
|
-
) -> APIRouter:
|
|
30
|
-
router = APIRouter()
|
|
31
|
-
|
|
32
|
-
@router.get("/api/command/briefing")
|
|
33
|
-
async def command_briefing(request: Request):
|
|
34
|
-
user = require_user(request)
|
|
35
|
-
scope = gate_read(request)
|
|
36
|
-
return service.briefing(user_email=user, workspace_id=scope)
|
|
37
|
-
|
|
38
|
-
@router.get("/api/command/search")
|
|
39
|
-
async def command_search(
|
|
40
|
-
request: Request,
|
|
41
|
-
q: str = Query("", max_length=300),
|
|
42
|
-
limit: int = Query(8, ge=1, le=20),
|
|
43
|
-
):
|
|
44
|
-
user = require_user(request)
|
|
45
|
-
scope = gate_read(request)
|
|
46
|
-
return service.search(q, user_email=user, workspace_id=scope, limit=limit)
|
|
47
|
-
|
|
48
|
-
return router
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
__all__ = ["create_command_center_router"]
|