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,10 +0,0 @@
|
|
|
1
|
-
"""Canonical lifecycle states shared by persisted agent and workflow runs."""
|
|
2
|
-
|
|
3
|
-
RUN_ACTIVE_STATUSES = frozenset(
|
|
4
|
-
{"queued", "running", "in_progress", "retrying", "cancelling"}
|
|
5
|
-
)
|
|
6
|
-
RUN_TERMINAL_STATUSES = frozenset(
|
|
7
|
-
{"ok", "retried_ok", "failed", "rejected", "cancelled", "interrupted", "partial"}
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
__all__ = ["RUN_ACTIVE_STATUSES", "RUN_TERMINAL_STATUSES"]
|
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
"""Sealing a bundle to a recipient's public key (v11.2.0).
|
|
2
|
-
|
|
3
|
-
Through 11.1.0 a shared subgraph was encrypted with a passphrase, which means
|
|
4
|
-
the sender and the receiver must first agree on a secret over some *other*
|
|
5
|
-
channel — and whatever that channel is, the passphrase is now in it. This
|
|
6
|
-
module removes that step: the receiver publishes an X25519 public key, the
|
|
7
|
-
sender seals a bundle to it, and only the holder of the matching private key
|
|
8
|
-
can open it. Nothing secret ever travels.
|
|
9
|
-
|
|
10
|
-
The construction is the standard sealed box, assembled from primitives
|
|
11
|
-
``cryptography`` already ships (it is a core dependency; nothing new is added):
|
|
12
|
-
|
|
13
|
-
1. the sender generates a **single-use ephemeral X25519 keypair**;
|
|
14
|
-
2. ``ephemeral_private × recipient_public`` yields a shared secret only the two
|
|
15
|
-
of them can compute;
|
|
16
|
-
3. **HKDF-SHA256** stretches that secret into a 256-bit key, with both public
|
|
17
|
-
keys mixed into ``info`` so a key derived for one recipient can never be
|
|
18
|
-
reused for another;
|
|
19
|
-
4. **AES-256-GCM** encrypts the payload under it.
|
|
20
|
-
|
|
21
|
-
Forward secrecy comes free: the ephemeral private key is discarded the moment
|
|
22
|
-
the box is sealed, so a later compromise of the recipient's long-term key still
|
|
23
|
-
does not decrypt an already-sent bundle — nothing else in the envelope can
|
|
24
|
-
reconstruct the shared secret.
|
|
25
|
-
|
|
26
|
-
The sender's Ed25519 signature over the bundle header is **untouched** by all
|
|
27
|
-
of this. Signing says who wrote it; sealing says who may read it. Collapsing
|
|
28
|
-
the two into one keypair is the usual way to end up with neither.
|
|
29
|
-
"""
|
|
30
|
-
|
|
31
|
-
from __future__ import annotations
|
|
32
|
-
|
|
33
|
-
import base64
|
|
34
|
-
import hashlib
|
|
35
|
-
import os
|
|
36
|
-
from pathlib import Path
|
|
37
|
-
from typing import Any, Dict, Optional
|
|
38
|
-
|
|
39
|
-
from cryptography.exceptions import InvalidTag
|
|
40
|
-
from cryptography.hazmat.primitives import hashes, serialization
|
|
41
|
-
from cryptography.hazmat.primitives.asymmetric.x25519 import (
|
|
42
|
-
X25519PrivateKey,
|
|
43
|
-
X25519PublicKey,
|
|
44
|
-
)
|
|
45
|
-
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
|
|
46
|
-
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
|
|
47
|
-
|
|
48
|
-
#: Named in the envelope so a future construction can be told apart from this
|
|
49
|
-
#: one instead of being silently mis-decrypted.
|
|
50
|
-
SEALED_BOX_ALGORITHM = "x25519-hkdf-sha256-aes256gcm"
|
|
51
|
-
#: Domain separation for the KDF — this key schedule is for subgraph bundles
|
|
52
|
-
#: and nothing else.
|
|
53
|
-
HKDF_INFO_PREFIX = b"latticeai.subgraph.sealed-box.v1"
|
|
54
|
-
KEY_BYTES = 32
|
|
55
|
-
NONCE_BYTES = 12
|
|
56
|
-
SALT_BYTES = 16
|
|
57
|
-
#: Filename of the recipient key under the data directory (0600, like the
|
|
58
|
-
#: device identity's key file).
|
|
59
|
-
RECIPIENT_KEY_FILENAME = "subgraph_recipient.key"
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
def _b64(data: bytes) -> str:
|
|
63
|
-
return base64.urlsafe_b64encode(data).decode("ascii").rstrip("=")
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
def _unb64(text: str) -> bytes:
|
|
67
|
-
padded = str(text) + "=" * (-len(str(text)) % 4)
|
|
68
|
-
return base64.urlsafe_b64decode(padded.encode("ascii"))
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
def _raw_public(key: X25519PublicKey) -> bytes:
|
|
72
|
-
return key.public_bytes(
|
|
73
|
-
serialization.Encoding.Raw, serialization.PublicFormat.Raw
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
def public_key_fingerprint(public_key_b64: str) -> str:
|
|
78
|
-
"""Human-comparable fingerprint of an X25519 public key.
|
|
79
|
-
|
|
80
|
-
Raises ``ValueError`` when the input is not a usable key — callers use this
|
|
81
|
-
as the validation gate before sealing anything to a pasted string.
|
|
82
|
-
"""
|
|
83
|
-
try:
|
|
84
|
-
raw = _unb64(public_key_b64)
|
|
85
|
-
X25519PublicKey.from_public_bytes(raw)
|
|
86
|
-
except Exception as exc: # noqa: BLE001 — any parse failure is one answer
|
|
87
|
-
raise ValueError(f"not a valid X25519 public key: {exc}") from exc
|
|
88
|
-
digest = hashlib.sha256(raw).hexdigest()
|
|
89
|
-
return ":".join(digest[i : i + 4] for i in range(0, 16, 4))
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
def _derive(shared: bytes, salt: bytes, ephemeral: bytes, recipient: bytes) -> bytes:
|
|
93
|
-
return HKDF(
|
|
94
|
-
algorithm=hashes.SHA256(),
|
|
95
|
-
length=KEY_BYTES,
|
|
96
|
-
salt=salt,
|
|
97
|
-
info=HKDF_INFO_PREFIX + b"|" + ephemeral + b"|" + recipient,
|
|
98
|
-
).derive(shared)
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
def seal(plaintext: bytes, *, recipient_public_key: str) -> Dict[str, Any]:
|
|
102
|
-
"""Encrypt ``plaintext`` so only the recipient's private key can open it.
|
|
103
|
-
|
|
104
|
-
Returns the JSON-safe crypto block that goes in the bundle envelope. The
|
|
105
|
-
recipient's own public key is echoed back into it so a receiver holding
|
|
106
|
-
several keys can tell at a glance whether this box was meant for them —
|
|
107
|
-
without trying to decrypt it, and without the sender having to be asked.
|
|
108
|
-
"""
|
|
109
|
-
try:
|
|
110
|
-
recipient_raw = _unb64(recipient_public_key)
|
|
111
|
-
peer = X25519PublicKey.from_public_bytes(recipient_raw)
|
|
112
|
-
except Exception as exc: # noqa: BLE001 — a bad key is a caller error, said plainly
|
|
113
|
-
raise ValueError(f"not a valid X25519 public key: {exc}") from exc
|
|
114
|
-
ephemeral = X25519PrivateKey.generate()
|
|
115
|
-
ephemeral_raw = _raw_public(ephemeral.public_key())
|
|
116
|
-
salt = os.urandom(SALT_BYTES)
|
|
117
|
-
nonce = os.urandom(NONCE_BYTES)
|
|
118
|
-
key = _derive(ephemeral.exchange(peer), salt, ephemeral_raw, recipient_raw)
|
|
119
|
-
ciphertext = AESGCM(key).encrypt(nonce, plaintext, None)
|
|
120
|
-
return {
|
|
121
|
-
"algorithm": SEALED_BOX_ALGORITHM,
|
|
122
|
-
"ephemeral_public_key": _b64(ephemeral_raw),
|
|
123
|
-
"recipient_public_key": _b64(recipient_raw),
|
|
124
|
-
"recipient_fingerprint": public_key_fingerprint(recipient_public_key),
|
|
125
|
-
"salt": _b64(salt),
|
|
126
|
-
"nonce": _b64(nonce),
|
|
127
|
-
"ciphertext": _b64(ciphertext),
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
def unseal(block: Dict[str, Any], private_key: X25519PrivateKey) -> bytes:
|
|
132
|
-
"""Open a sealed box with the recipient's private key.
|
|
133
|
-
|
|
134
|
-
Fail-closed and specific: an unknown algorithm, a missing field, a box
|
|
135
|
-
addressed to a different key, and a failed tag check each say which one
|
|
136
|
-
happened rather than collapsing into "decryption failed".
|
|
137
|
-
"""
|
|
138
|
-
algorithm = str((block or {}).get("algorithm") or "")
|
|
139
|
-
if algorithm != SEALED_BOX_ALGORITHM:
|
|
140
|
-
raise ValueError(
|
|
141
|
-
f"unsupported sealed-box algorithm: {algorithm or 'missing'}"
|
|
142
|
-
)
|
|
143
|
-
try:
|
|
144
|
-
ephemeral_raw = _unb64(block["ephemeral_public_key"])
|
|
145
|
-
salt = _unb64(block["salt"])
|
|
146
|
-
nonce = _unb64(block["nonce"])
|
|
147
|
-
ciphertext = _unb64(block["ciphertext"])
|
|
148
|
-
peer = X25519PublicKey.from_public_bytes(ephemeral_raw)
|
|
149
|
-
except Exception as exc: # noqa: BLE001 — a malformed envelope is one answer
|
|
150
|
-
raise ValueError(f"sealed bundle is missing encryption metadata: {exc}") from exc
|
|
151
|
-
recipient_raw = _raw_public(private_key.public_key())
|
|
152
|
-
addressed = str(block.get("recipient_public_key") or "")
|
|
153
|
-
if addressed and _unb64(addressed) != recipient_raw:
|
|
154
|
-
raise ValueError(
|
|
155
|
-
"this bundle was sealed to a different recipient key "
|
|
156
|
-
f"({block.get('recipient_fingerprint') or 'unknown fingerprint'})."
|
|
157
|
-
)
|
|
158
|
-
key = _derive(private_key.exchange(peer), salt, ephemeral_raw, recipient_raw)
|
|
159
|
-
try:
|
|
160
|
-
return bytes(AESGCM(key).decrypt(nonce, ciphertext, None))
|
|
161
|
-
except InvalidTag as exc:
|
|
162
|
-
raise ValueError(
|
|
163
|
-
"Sealed bundle decryption failed; the recipient key or the bundle is invalid."
|
|
164
|
-
) from exc
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
class RecipientIdentity:
|
|
168
|
-
"""This Brain's X25519 receiving keypair — loads or creates, file-backed.
|
|
169
|
-
|
|
170
|
-
Deliberately *not* the device's Ed25519 identity. That key signs, and a
|
|
171
|
-
signing key that also decrypts is a key whose compromise costs twice. The
|
|
172
|
-
private half lives in a 0600 file under the data directory and never leaves
|
|
173
|
-
the machine; :meth:`describe` reports exactly that rather than implying a
|
|
174
|
-
keychain this class does not use.
|
|
175
|
-
"""
|
|
176
|
-
|
|
177
|
-
def __init__(self, data_dir: Any) -> None:
|
|
178
|
-
self._data_dir = Path(data_dir)
|
|
179
|
-
self._key_file = self._data_dir / RECIPIENT_KEY_FILENAME
|
|
180
|
-
self._private = self._load_or_create()
|
|
181
|
-
|
|
182
|
-
def _load_or_create(self) -> X25519PrivateKey:
|
|
183
|
-
if self._key_file.exists():
|
|
184
|
-
return X25519PrivateKey.from_private_bytes(
|
|
185
|
-
_unb64(self._key_file.read_text(encoding="utf-8").strip())
|
|
186
|
-
)
|
|
187
|
-
key = X25519PrivateKey.generate()
|
|
188
|
-
raw = key.private_bytes(
|
|
189
|
-
serialization.Encoding.Raw,
|
|
190
|
-
serialization.PrivateFormat.Raw,
|
|
191
|
-
serialization.NoEncryption(),
|
|
192
|
-
)
|
|
193
|
-
self._data_dir.mkdir(parents=True, exist_ok=True)
|
|
194
|
-
self._key_file.write_text(_b64(raw), encoding="utf-8")
|
|
195
|
-
os.chmod(self._key_file, 0o600)
|
|
196
|
-
return key
|
|
197
|
-
|
|
198
|
-
@property
|
|
199
|
-
def public_key_b64(self) -> str:
|
|
200
|
-
return _b64(_raw_public(self._private.public_key()))
|
|
201
|
-
|
|
202
|
-
@property
|
|
203
|
-
def fingerprint(self) -> str:
|
|
204
|
-
return public_key_fingerprint(self.public_key_b64)
|
|
205
|
-
|
|
206
|
-
def describe(self) -> Dict[str, Any]:
|
|
207
|
-
return {
|
|
208
|
-
"public_key": self.public_key_b64,
|
|
209
|
-
"fingerprint": self.fingerprint,
|
|
210
|
-
"algorithm": SEALED_BOX_ALGORITHM,
|
|
211
|
-
"storage": "file",
|
|
212
|
-
"path": str(self._key_file),
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
def unseal(self, block: Dict[str, Any]) -> bytes:
|
|
216
|
-
return unseal(block, self._private)
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
def load_recipient_identity(data_dir: Any) -> Optional[RecipientIdentity]:
|
|
220
|
-
"""Best-effort recipient key, or ``None`` when the directory is unusable.
|
|
221
|
-
|
|
222
|
-
Sharing is opt-in and a missing key is a *state*, not a crash: the status
|
|
223
|
-
surface reports "no receiving key" rather than failing a status read.
|
|
224
|
-
"""
|
|
225
|
-
try:
|
|
226
|
-
return RecipientIdentity(data_dir)
|
|
227
|
-
except (OSError, ValueError): # noqa: BLE001 — unwritable dir / corrupt key file
|
|
228
|
-
return None
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
__all__ = [
|
|
232
|
-
"HKDF_INFO_PREFIX",
|
|
233
|
-
"RECIPIENT_KEY_FILENAME",
|
|
234
|
-
"SEALED_BOX_ALGORITHM",
|
|
235
|
-
"RecipientIdentity",
|
|
236
|
-
"load_recipient_identity",
|
|
237
|
-
"public_key_fingerprint",
|
|
238
|
-
"seal",
|
|
239
|
-
"unseal",
|
|
240
|
-
]
|