ltcai 11.5.1 → 11.6.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.
Files changed (473) hide show
  1. package/README.md +92 -117
  2. package/bin/ltcai.js +234 -24
  3. package/docs/CHANGELOG.md +129 -0
  4. package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
  5. package/docs/DEVELOPMENT.md +8 -6
  6. package/docs/ENTERPRISE.md +2 -1
  7. package/docs/HYBRID_CLOUD_KG_STREAMING.md +8 -4
  8. package/docs/MULTI_AGENT_RUNTIME.md +12 -5
  9. package/docs/ONBOARDING.md +1 -1
  10. package/docs/OPERATIONS.md +6 -3
  11. package/docs/REALTIME_COLLABORATION.md +1 -1
  12. package/docs/TRUST_MODEL.md +1 -1
  13. package/docs/WHY_LATTICE.md +1 -1
  14. package/docs/WORKFLOW_DESIGNER.md +3 -2
  15. package/docs/architecture.md +4 -4
  16. package/docs/kg-schema.md +1 -1
  17. package/docs/v11.5.2_TIGHT_SHIP_PLAN.md +144 -0
  18. package/docs/v11.6.0_ONE_DOOR_PLAN.md +170 -0
  19. package/lattice_brain/__init__.py +42 -79
  20. package/lattice_brain/graph/__init__.py +9 -24
  21. package/lattice_brain/graph/_kg_common/__init__.py +13 -24
  22. package/lattice_brain/ingestion/__init__.py +19 -58
  23. package/lattice_brain/ingestion/pipeline.py +20 -398
  24. package/lattice_brain/multimodal/__init__.py +7 -18
  25. package/lattice_brain/multimodal/images.py +6 -264
  26. package/lattice_brain/multimodal/video.py +8 -247
  27. package/lattice_brain/runtime/__init__.py +8 -79
  28. package/lattice_brain/runtime/hooks.py +22 -597
  29. package/latticeai/__init__.py +1 -1
  30. package/latticeai/api/agent_worker_seam.py +7 -80
  31. package/latticeai/api/health.py +26 -20
  32. package/latticeai/api/local_files.py +25 -608
  33. package/latticeai/api/models.py +12 -87
  34. package/latticeai/api/search.py +17 -231
  35. package/latticeai/api/tools.py +69 -750
  36. package/latticeai/api/voice_capture.py +8 -70
  37. package/latticeai/api/worker_compute.py +842 -0
  38. package/latticeai/api/worker_seams.py +216 -0
  39. package/latticeai/app_factory.py +23 -232
  40. package/latticeai/cli/entrypoint.py +36 -249
  41. package/latticeai/cli/runtime.py +7 -3
  42. package/latticeai/core/agent_permission.py +16 -91
  43. package/latticeai/core/config.py +47 -3
  44. package/latticeai/core/csrf.py +28 -2
  45. package/latticeai/core/embedding_providers/__init__.py +3 -5
  46. package/latticeai/core/embedding_providers/base.py +1 -1
  47. package/latticeai/core/embedding_providers/text.py +1 -1
  48. package/latticeai/core/http_origin.py +146 -0
  49. package/latticeai/core/io_utils.py +2 -11
  50. package/latticeai/core/messages.py +94 -531
  51. package/latticeai/core/model_compat.py +2 -8
  52. package/latticeai/core/module_probe.py +37 -0
  53. package/latticeai/core/security.py +13 -0
  54. package/latticeai/core/sessions.py +3 -2
  55. package/latticeai/core/sse.py +25 -0
  56. package/latticeai/core/users.py +0 -9
  57. package/latticeai/models/router/documents.py +0 -35
  58. package/latticeai/models/router/registry.py +0 -4
  59. package/latticeai/runtime/access_runtime.py +16 -18
  60. package/latticeai/runtime/bootstrap.py +10 -21
  61. package/latticeai/runtime/brain_runtime.py +35 -43
  62. package/latticeai/runtime/build_phases/__init__.py +21 -37
  63. package/latticeai/runtime/build_phases/features.py +101 -389
  64. package/latticeai/runtime/build_phases/foundation.py +82 -392
  65. package/latticeai/runtime/build_phases/web.py +91 -406
  66. package/latticeai/runtime/build_phases/worker_profile.py +244 -0
  67. package/latticeai/runtime/lifespan_runtime.py +7 -16
  68. package/latticeai/runtime/platform_services_runtime.py +1 -15
  69. package/latticeai/runtime/runtime_context.py +14 -143
  70. package/latticeai/runtime/security_runtime.py +10 -103
  71. package/latticeai/services/architecture_readiness.py +82 -43
  72. package/latticeai/services/model_capability_registry.py +0 -15
  73. package/latticeai/services/model_catalog.py +0 -7
  74. package/latticeai/services/model_loading.py +3 -2
  75. package/latticeai/services/model_runtime/__init__.py +2 -68
  76. package/latticeai/services/model_runtime/engines.py +27 -128
  77. package/latticeai/services/model_runtime/loading.py +2 -2
  78. package/latticeai/services/model_runtime/service.py +4 -28
  79. package/latticeai/services/p_reinforce.py +10 -261
  80. package/latticeai/services/product_readiness.py +31 -38
  81. package/latticeai/services/search_service.py +37 -795
  82. package/latticeai/services/tool_dispatch.py +30 -390
  83. package/latticeai/services/voice_capture.py +13 -107
  84. package/latticeai/tools/__init__.py +22 -49
  85. package/latticeai/tools/commands.py +0 -163
  86. package/latticeai/tools/computer.py +0 -39
  87. package/latticeai/tools/documents.py +1 -134
  88. package/latticeai/tools/filesystem.py +1 -247
  89. package/latticeai/tools/knowledge.py +1 -52
  90. package/latticeai/tools/local_files.py +0 -20
  91. package/latticeai/worker_app.py +75 -0
  92. package/package.json +3 -6
  93. package/requirements.txt +0 -5
  94. package/scripts/agent_eval.py +16 -28
  95. package/scripts/brain_quality_eval.py +20 -183
  96. package/scripts/bump_version.py +19 -6
  97. package/scripts/check_current_release_docs.mjs +7 -4
  98. package/scripts/check_legacy_debt.mjs +1 -1
  99. package/scripts/check_openapi_drift.mjs +10 -0
  100. package/scripts/check_server_i18n.mjs +2 -18
  101. package/scripts/compose_openapi.py +377 -0
  102. package/scripts/export_openapi.py +32 -4
  103. package/scripts/gen_messages_catalog_fixture.py +302 -0
  104. package/scripts/gen_openapi_fragments.py +365 -0
  105. package/scripts/gen_redact_fixture.py +196 -0
  106. package/scripts/gen_worker_allowlist_fixture.py +115 -0
  107. package/scripts/generate_agent_parity_fixtures.py +33 -14
  108. package/scripts/openapi_route_families.json +2161 -0
  109. package/scripts/release_screen_claims.json +31 -0
  110. package/scripts/run_integration_tests.mjs +134 -29
  111. package/scripts/run_sidecar_e2e.mjs +104 -11
  112. package/scripts/wheel_smoke.py +32 -22
  113. package/src-tauri/Cargo.lock +375 -9
  114. package/src-tauri/Cargo.toml +1 -1
  115. package/src-tauri/src/backend.rs +223 -43
  116. package/src-tauri/src/main.rs +27 -17
  117. package/src-tauri/src/topology.rs +58 -88
  118. package/src-tauri/tauri.conf.json +2 -3
  119. package/static/app/asset-manifest.json +41 -41
  120. package/static/app/assets/{Act-Drs_jd-O.js → Act-CToZnOHz.js} +1 -1
  121. package/static/app/assets/{AdminConsole-BqNx5oF6.js → AdminConsole-D5kbrBu8.js} +1 -1
  122. package/static/app/assets/{Brain-C7bdNmz-.js → Brain-C6zCdv4S.js} +1 -1
  123. package/static/app/assets/{BrainHome-DcTnINcI.js → BrainHome-D4n3EDUt.js} +1 -1
  124. package/static/app/assets/{BrainSignals-Df1MRIPD.js → BrainSignals-CzeZ-vQ9.js} +1 -1
  125. package/static/app/assets/{Capture-Dgsxvnbx.js → Capture-DPcyTczq.js} +1 -1
  126. package/static/app/assets/{Chronicle-BrkTxJK1.js → Chronicle-D3Nx-oWS.js} +1 -1
  127. package/static/app/assets/{CommandPalette-DDziw7Oj.js → CommandPalette-DPPvpp28.js} +1 -1
  128. package/static/app/assets/{Library-CYxeuraA.js → Library-Co2qTu3I.js} +1 -1
  129. package/static/app/assets/{LivingBrain-CNp6mvCm.js → LivingBrain-Bsmzwy8_.js} +1 -1
  130. package/static/app/assets/{ProductFlow-BVsowu3Z.js → ProductFlow-CBLdmesT.js} +1 -1
  131. package/static/app/assets/{ReviewCard-D1LbOfJS.js → ReviewCard-CfR6DLs7.js} +1 -1
  132. package/static/app/assets/{System-DcRAq7wj.js → System-Ce-P2YL6.js} +1 -1
  133. package/static/app/assets/arrow-left-DD5jFGHV.js +1 -0
  134. package/static/app/assets/{bot-BK2xQ9mN.js → bot-C5-XIww2.js} +1 -1
  135. package/static/app/assets/{brain-BZNztFBb.js → brain-CFRJUvdX.js} +1 -1
  136. package/static/app/assets/{button-CjueubVZ.js → button-DI1KcQP-.js} +1 -1
  137. package/static/app/assets/circle-check-CY20XMCh.js +1 -0
  138. package/static/app/assets/{circle-pause-HRjSmpyY.js → circle-pause-C8HHyood.js} +1 -1
  139. package/static/app/assets/{circle-play-CMcKDVwu.js → circle-play-Cufc235E.js} +1 -1
  140. package/static/app/assets/{cpu-B_MyTfYr.js → cpu-DW2_JVsv.js} +1 -1
  141. package/static/app/assets/{download-CTy0EByV.js → download-gbdKTBb8.js} +1 -1
  142. package/static/app/assets/{folder-open-DF6bLhTg.js → folder-open-C9ydyX33.js} +1 -1
  143. package/static/app/assets/{hard-drive-CpWHG77C.js → hard-drive-BxNMzBM3.js} +1 -1
  144. package/static/app/assets/index-BovSWRmQ.css +2 -0
  145. package/static/app/assets/{index-Dd6abJHX.js → index-q9XyDY7A.js} +3 -3
  146. package/static/app/assets/{input-bVgIRN3s.js → input-GLD94Y_K.js} +1 -1
  147. package/static/app/assets/{link-2-bg6CG5Vk.js → link-2-B4Y0gz1S.js} +1 -1
  148. package/static/app/assets/{permissionCopy-DFTf1HDZ.js → permissionCopy-CxrV0fvU.js} +1 -1
  149. package/static/app/assets/{primitives-D7D-sQ3T.js → primitives-2ANdAsu2.js} +1 -1
  150. package/static/app/assets/search-DTxtjQ07.js +1 -0
  151. package/static/app/assets/{share-2-BLzo7U4L.js → share-2-DxArfiuI.js} +1 -1
  152. package/static/app/assets/{shield-alert-BmngqnsJ.js → shield-alert-CgftuFFs.js} +1 -1
  153. package/static/app/assets/{textarea-DOSlAQQ3.js → textarea-BHVBAoCr.js} +1 -1
  154. package/static/app/assets/{useFocusTrap-pZhgeee4.js → useFocusTrap-Dzq2j_OG.js} +1 -1
  155. package/static/app/assets/{useMutation-BMDwNk4I.js → useMutation-BcqfMLNq.js} +1 -1
  156. package/static/app/assets/{useQuery-CSjKttRo.js → useQuery-DBzLKCOv.js} +1 -1
  157. package/static/app/assets/{utils-D3u_yv7B.js → utils-B-Aah1bO.js} +1 -1
  158. package/static/app/assets/{workspace-H3bMjYXC.js → workspace-B6fFhoko.js} +1 -1
  159. package/static/app/index.html +4 -4
  160. package/static/sw.js +1 -1
  161. package/desktop/electron/README.md +0 -9
  162. package/desktop/electron/main.cjs +0 -58
  163. package/desktop/electron/preload.cjs +0 -5
  164. package/lattice_brain/archive.py +0 -522
  165. package/lattice_brain/context.py +0 -325
  166. package/lattice_brain/conversations.py +0 -382
  167. package/lattice_brain/core.py +0 -82
  168. package/lattice_brain/graph/_kg_contract.py +0 -249
  169. package/lattice_brain/graph/curator.py +0 -676
  170. package/lattice_brain/graph/discovery.py +0 -595
  171. package/lattice_brain/graph/discovery_index/__init__.py +0 -35
  172. package/lattice_brain/graph/discovery_index/cleanup.py +0 -182
  173. package/lattice_brain/graph/discovery_index/extract.py +0 -137
  174. package/lattice_brain/graph/discovery_index/scan.py +0 -411
  175. package/lattice_brain/graph/discovery_index/upsert.py +0 -495
  176. package/lattice_brain/graph/documents.py +0 -380
  177. package/lattice_brain/graph/fusion.py +0 -395
  178. package/lattice_brain/graph/identity.py +0 -175
  179. package/lattice_brain/graph/image_vectors.py +0 -230
  180. package/lattice_brain/graph/ingest.py +0 -829
  181. package/lattice_brain/graph/network.py +0 -205
  182. package/lattice_brain/graph/proactive.py +0 -724
  183. package/lattice_brain/graph/projection/__init__.py +0 -42
  184. package/lattice_brain/graph/projection/curation.py +0 -500
  185. package/lattice_brain/graph/projection/v2_schema.py +0 -546
  186. package/lattice_brain/graph/provenance.py +0 -524
  187. package/lattice_brain/graph/rerank.py +0 -163
  188. package/lattice_brain/graph/retrieval/__init__.py +0 -54
  189. package/lattice_brain/graph/retrieval/context.py +0 -197
  190. package/lattice_brain/graph/retrieval/graph_view.py +0 -319
  191. package/lattice_brain/graph/retrieval/hybrid.py +0 -488
  192. package/lattice_brain/graph/retrieval/maintenance.py +0 -121
  193. package/lattice_brain/graph/retrieval/signals.py +0 -95
  194. package/lattice_brain/graph/retrieval_docgen.py +0 -253
  195. package/lattice_brain/graph/retrieval_policy.py +0 -180
  196. package/lattice_brain/graph/retrieval_reads.py +0 -769
  197. package/lattice_brain/graph/retrieval_vector/__init__.py +0 -42
  198. package/lattice_brain/graph/retrieval_vector/fingerprint.py +0 -97
  199. package/lattice_brain/graph/retrieval_vector/indexing.py +0 -347
  200. package/lattice_brain/graph/retrieval_vector/search.py +0 -560
  201. package/lattice_brain/graph/retrieval_vector/status.py +0 -374
  202. package/lattice_brain/graph/schema.py +0 -792
  203. package/lattice_brain/graph/store.py +0 -268
  204. package/lattice_brain/graph/vector_index/__init__.py +0 -85
  205. package/lattice_brain/graph/vector_index/base.py +0 -170
  206. package/lattice_brain/graph/vector_index/brute_force.py +0 -114
  207. package/lattice_brain/graph/vector_index/hnsw.py +0 -293
  208. package/lattice_brain/graph/vector_index/jobs.py +0 -287
  209. package/lattice_brain/graph/vector_index/quantized.py +0 -151
  210. package/lattice_brain/graph/vector_index/selector.py +0 -161
  211. package/lattice_brain/graph/write_master.py +0 -308
  212. package/lattice_brain/ingestion/_contract.py +0 -90
  213. package/lattice_brain/ingestion/folder_scan.py +0 -57
  214. package/lattice_brain/ingestion/folders.py +0 -258
  215. package/lattice_brain/ingestion/jobs_api.py +0 -107
  216. package/lattice_brain/ingestion/routing.py +0 -295
  217. package/lattice_brain/ingestion_jobs.py +0 -383
  218. package/lattice_brain/memory.py +0 -102
  219. package/lattice_brain/portability/__init__.py +0 -90
  220. package/lattice_brain/portability/_contract.py +0 -42
  221. package/lattice_brain/portability/backups.py +0 -338
  222. package/lattice_brain/portability/bundles.py +0 -136
  223. package/lattice_brain/portability/constants.py +0 -93
  224. package/lattice_brain/portability/fsops.py +0 -138
  225. package/lattice_brain/portability/service.py +0 -41
  226. package/lattice_brain/portability/sharing.py +0 -714
  227. package/lattice_brain/quality.py +0 -592
  228. package/lattice_brain/retrieval_benchmark_fixtures.py +0 -92
  229. package/lattice_brain/runtime/agent_runtime.py +0 -859
  230. package/lattice_brain/runtime/contracts.py +0 -460
  231. package/lattice_brain/runtime/multi_agent.py +0 -942
  232. package/lattice_brain/runtime/statuses.py +0 -10
  233. package/lattice_brain/sealed_box.py +0 -244
  234. package/lattice_brain/self_model.py +0 -675
  235. package/lattice_brain/sensitivity.py +0 -94
  236. package/lattice_brain/storage/__init__.py +0 -22
  237. package/lattice_brain/storage/base.py +0 -100
  238. package/lattice_brain/storage/docker.py +0 -105
  239. package/lattice_brain/storage/factory.py +0 -31
  240. package/lattice_brain/storage/migration.py +0 -191
  241. package/lattice_brain/storage/postgres.py +0 -123
  242. package/lattice_brain/storage/sqlite.py +0 -143
  243. package/lattice_brain/synthesis.py +0 -824
  244. package/lattice_brain/workflow.py +0 -497
  245. package/latticeai/api/admin.py +0 -471
  246. package/latticeai/api/agent_registry.py +0 -105
  247. package/latticeai/api/agents.py +0 -228
  248. package/latticeai/api/auth.py +0 -360
  249. package/latticeai/api/automation_intelligence.py +0 -401
  250. package/latticeai/api/brain_intelligence.py +0 -199
  251. package/latticeai/api/browser.py +0 -493
  252. package/latticeai/api/change_proposals.py +0 -89
  253. package/latticeai/api/chat.py +0 -572
  254. package/latticeai/api/chat_agent_http.py +0 -901
  255. package/latticeai/api/chat_contracts.py +0 -73
  256. package/latticeai/api/chat_documents.py +0 -276
  257. package/latticeai/api/chat_helpers.py +0 -463
  258. package/latticeai/api/chat_history.py +0 -101
  259. package/latticeai/api/chat_hybrid.py +0 -113
  260. package/latticeai/api/chat_intents.py +0 -646
  261. package/latticeai/api/chat_stream.py +0 -216
  262. package/latticeai/api/chronicle.py +0 -63
  263. package/latticeai/api/command_center.py +0 -51
  264. package/latticeai/api/computer_use.py +0 -485
  265. package/latticeai/api/evidence_actions.py +0 -48
  266. package/latticeai/api/features.py +0 -70
  267. package/latticeai/api/funnel_metrics.py +0 -31
  268. package/latticeai/api/garden.py +0 -34
  269. package/latticeai/api/hooks.py +0 -165
  270. package/latticeai/api/index_jobs.py +0 -145
  271. package/latticeai/api/invitations.py +0 -100
  272. package/latticeai/api/knowledge_graph.py +0 -536
  273. package/latticeai/api/marketplace.py +0 -105
  274. package/latticeai/api/mcp.py +0 -482
  275. package/latticeai/api/memory.py +0 -270
  276. package/latticeai/api/network.py +0 -81
  277. package/latticeai/api/network_boundary.py +0 -225
  278. package/latticeai/api/permission_mode.py +0 -61
  279. package/latticeai/api/permissions.py +0 -410
  280. package/latticeai/api/plugins.py +0 -126
  281. package/latticeai/api/portability.py +0 -391
  282. package/latticeai/api/project_sessions.py +0 -114
  283. package/latticeai/api/realtime.py +0 -118
  284. package/latticeai/api/review_queue.py +0 -364
  285. package/latticeai/api/security_dashboard.py +0 -604
  286. package/latticeai/api/setup.py +0 -319
  287. package/latticeai/api/static_routes.py +0 -351
  288. package/latticeai/api/ui_redirects.py +0 -26
  289. package/latticeai/api/workflow_designer.py +0 -394
  290. package/latticeai/api/workspace.py +0 -856
  291. package/latticeai/api/workspace_scope.py +0 -125
  292. package/latticeai/core/agent/__init__.py +0 -93
  293. package/latticeai/core/agent/_contract.py +0 -79
  294. package/latticeai/core/agent/context.py +0 -57
  295. package/latticeai/core/agent/deps.py +0 -125
  296. package/latticeai/core/agent/execution.py +0 -622
  297. package/latticeai/core/agent/planning.py +0 -145
  298. package/latticeai/core/agent/recovery.py +0 -157
  299. package/latticeai/core/agent/runtime.py +0 -210
  300. package/latticeai/core/agent/verification.py +0 -231
  301. package/latticeai/core/agent_eval.py +0 -739
  302. package/latticeai/core/agent_helpers.py +0 -493
  303. package/latticeai/core/agent_profiles.py +0 -110
  304. package/latticeai/core/agent_prompts.py +0 -171
  305. package/latticeai/core/agent_registry.py +0 -232
  306. package/latticeai/core/agent_state.py +0 -41
  307. package/latticeai/core/agent_trace.py +0 -104
  308. package/latticeai/core/artifact_ledger.py +0 -109
  309. package/latticeai/core/audit.py +0 -260
  310. package/latticeai/core/builtin_hooks.py +0 -105
  311. package/latticeai/core/context_builder.py +0 -394
  312. package/latticeai/core/document_generator.py +0 -103
  313. package/latticeai/core/enterprise.py +0 -157
  314. package/latticeai/core/enterprise_admin.py +0 -158
  315. package/latticeai/core/file_generation/__init__.py +0 -115
  316. package/latticeai/core/file_generation/bundles.py +0 -76
  317. package/latticeai/core/file_generation/extraction.py +0 -154
  318. package/latticeai/core/file_generation/inference.py +0 -235
  319. package/latticeai/core/file_generation/orchestration.py +0 -152
  320. package/latticeai/core/file_generation/prompting.py +0 -117
  321. package/latticeai/core/file_generation/repair.py +0 -114
  322. package/latticeai/core/file_generation/sanitize.py +0 -61
  323. package/latticeai/core/file_generation/validation.py +0 -201
  324. package/latticeai/core/graph_curator.py +0 -11
  325. package/latticeai/core/hooks.py +0 -11
  326. package/latticeai/core/invitations.py +0 -131
  327. package/latticeai/core/legacy_compatibility.py +0 -243
  328. package/latticeai/core/local_embeddings.py +0 -104
  329. package/latticeai/core/logging_safety.py +0 -46
  330. package/latticeai/core/marketplace.py +0 -293
  331. package/latticeai/core/mcp_catalog.py +0 -452
  332. package/latticeai/core/mcp_registry.py +0 -506
  333. package/latticeai/core/multi_agent.py +0 -11
  334. package/latticeai/core/network_boundary.py +0 -168
  335. package/latticeai/core/oidc.py +0 -208
  336. package/latticeai/core/plugins.py +0 -432
  337. package/latticeai/core/product_hardening.py +0 -218
  338. package/latticeai/core/project_sessions.py +0 -337
  339. package/latticeai/core/realtime.py +0 -238
  340. package/latticeai/core/run_explain.py +0 -423
  341. package/latticeai/core/run_store.py +0 -252
  342. package/latticeai/core/timezones.py +0 -80
  343. package/latticeai/core/workflow_engine.py +0 -11
  344. package/latticeai/core/workspace_computer_memory.py +0 -84
  345. package/latticeai/core/workspace_graph_trace.py +0 -161
  346. package/latticeai/core/workspace_indexing.py +0 -102
  347. package/latticeai/core/workspace_memory.py +0 -77
  348. package/latticeai/core/workspace_onboarding.py +0 -104
  349. package/latticeai/core/workspace_os.py +0 -988
  350. package/latticeai/core/workspace_os_constants.py +0 -126
  351. package/latticeai/core/workspace_os_state.py +0 -180
  352. package/latticeai/core/workspace_os_utils.py +0 -69
  353. package/latticeai/core/workspace_permissions.py +0 -101
  354. package/latticeai/core/workspace_plugins.py +0 -97
  355. package/latticeai/core/workspace_relationships.py +0 -99
  356. package/latticeai/core/workspace_reorganization.py +0 -335
  357. package/latticeai/core/workspace_review_items.py +0 -118
  358. package/latticeai/core/workspace_runs.py +0 -732
  359. package/latticeai/core/workspace_skills.py +0 -114
  360. package/latticeai/core/workspace_snapshots.py +0 -198
  361. package/latticeai/core/workspace_timeline.py +0 -110
  362. package/latticeai/integrations/__init__.py +0 -0
  363. package/latticeai/integrations/telegram_bot/__init__.py +0 -123
  364. package/latticeai/integrations/telegram_bot/__main__.py +0 -17
  365. package/latticeai/integrations/telegram_bot/config.py +0 -86
  366. package/latticeai/integrations/telegram_bot/dispatch.py +0 -311
  367. package/latticeai/integrations/telegram_bot/flows.py +0 -478
  368. package/latticeai/integrations/telegram_bot/helpers.py +0 -322
  369. package/latticeai/integrations/telegram_bot/screens.py +0 -394
  370. package/latticeai/runtime/audit_runtime.py +0 -76
  371. package/latticeai/runtime/automation_runtime.py +0 -81
  372. package/latticeai/runtime/chat_wiring.py +0 -141
  373. package/latticeai/runtime/context_runtime.py +0 -66
  374. package/latticeai/runtime/feature_toggle_wiring.py +0 -163
  375. package/latticeai/runtime/history_runtime.py +0 -163
  376. package/latticeai/runtime/history_writer.py +0 -138
  377. package/latticeai/runtime/hooks_runtime.py +0 -77
  378. package/latticeai/runtime/model_wiring.py +0 -68
  379. package/latticeai/runtime/namespace_runtime.py +0 -163
  380. package/latticeai/runtime/network_boundary_wiring.py +0 -128
  381. package/latticeai/runtime/network_config_runtime.py +0 -56
  382. package/latticeai/runtime/permission_mode_wiring.py +0 -119
  383. package/latticeai/runtime/persistence_runtime.py +0 -159
  384. package/latticeai/runtime/platform_runtime_wiring.py +0 -89
  385. package/latticeai/runtime/review_wiring.py +0 -42
  386. package/latticeai/runtime/router_registration.py +0 -689
  387. package/latticeai/runtime/sso_config_runtime.py +0 -128
  388. package/latticeai/runtime/user_key_runtime.py +0 -106
  389. package/latticeai/runtime/web_runtime.py +0 -92
  390. package/latticeai/server_app.py +0 -51
  391. package/latticeai/services/app_context.py +0 -130
  392. package/latticeai/services/automation_execution.py +0 -266
  393. package/latticeai/services/automation_intelligence.py +0 -614
  394. package/latticeai/services/brain_automation.py +0 -191
  395. package/latticeai/services/brain_intelligence/__init__.py +0 -58
  396. package/latticeai/services/brain_intelligence/_contract.py +0 -71
  397. package/latticeai/services/brain_intelligence/consistency.py +0 -193
  398. package/latticeai/services/brain_intelligence/constants.py +0 -47
  399. package/latticeai/services/brain_intelligence/digest.py +0 -258
  400. package/latticeai/services/brain_intelligence/health.py +0 -331
  401. package/latticeai/services/brain_intelligence/proposals.py +0 -264
  402. package/latticeai/services/brain_intelligence/sampling.py +0 -84
  403. package/latticeai/services/brain_intelligence/service.py +0 -48
  404. package/latticeai/services/change_proposals.py +0 -505
  405. package/latticeai/services/chat_service.py +0 -243
  406. package/latticeai/services/chronicle.py +0 -557
  407. package/latticeai/services/cloud_egress_audit.py +0 -85
  408. package/latticeai/services/cloud_extraction.py +0 -129
  409. package/latticeai/services/cloud_streaming.py +0 -268
  410. package/latticeai/services/cloud_token_guard.py +0 -84
  411. package/latticeai/services/command_center.py +0 -548
  412. package/latticeai/services/evidence_actions.py +0 -255
  413. package/latticeai/services/feature_toggles.py +0 -502
  414. package/latticeai/services/folder_watch.py +0 -520
  415. package/latticeai/services/funnel_metrics.py +0 -307
  416. package/latticeai/services/hybrid_chat.py +0 -316
  417. package/latticeai/services/hybrid_context.py +0 -228
  418. package/latticeai/services/hybrid_policy.py +0 -178
  419. package/latticeai/services/ingestion.py +0 -11
  420. package/latticeai/services/interop_bridges.py +0 -978
  421. package/latticeai/services/kg_portability.py +0 -11
  422. package/latticeai/services/local_knowledge.py +0 -465
  423. package/latticeai/services/memory_service/__init__.py +0 -52
  424. package/latticeai/services/memory_service/_contract.py +0 -100
  425. package/latticeai/services/memory_service/brief.py +0 -431
  426. package/latticeai/services/memory_service/constants.py +0 -57
  427. package/latticeai/services/memory_service/maintenance.py +0 -138
  428. package/latticeai/services/memory_service/manager.py +0 -186
  429. package/latticeai/services/memory_service/proof.py +0 -136
  430. package/latticeai/services/memory_service/recall.py +0 -225
  431. package/latticeai/services/memory_service/service.py +0 -48
  432. package/latticeai/services/memory_service/stores.py +0 -110
  433. package/latticeai/services/model_recommendation.py +0 -224
  434. package/latticeai/services/model_runtime/cloud.py +0 -87
  435. package/latticeai/services/multimodal_streaming.py +0 -129
  436. package/latticeai/services/network_boundary_service.py +0 -154
  437. package/latticeai/services/obsidian_bridge.py +0 -609
  438. package/latticeai/services/openai_compatible_adapter.py +0 -101
  439. package/latticeai/services/permission_mode_service.py +0 -170
  440. package/latticeai/services/platform_runtime.py +0 -366
  441. package/latticeai/services/review_queue.py +0 -380
  442. package/latticeai/services/router_context.py +0 -59
  443. package/latticeai/services/run_executor.py +0 -387
  444. package/latticeai/services/self_model_service.py +0 -171
  445. package/latticeai/services/setup_detection.py +0 -81
  446. package/latticeai/services/triggers.py +0 -378
  447. package/latticeai/services/upload_service.py +0 -185
  448. package/latticeai/services/workspace_service.py +0 -171
  449. package/latticeai/setup/__init__.py +0 -25
  450. package/latticeai/setup/auto_setup.py +0 -857
  451. package/latticeai/setup/demo_corpus.py +0 -98
  452. package/latticeai/setup/wizard/__init__.py +0 -126
  453. package/latticeai/setup/wizard/catalog.py +0 -172
  454. package/latticeai/setup/wizard/detect.py +0 -323
  455. package/latticeai/setup/wizard/install.py +0 -348
  456. package/latticeai/setup/wizard/paths.py +0 -168
  457. package/latticeai/setup/wizard/plans.py +0 -74
  458. package/latticeai/setup/wizard/recommend.py +0 -320
  459. package/scripts/bench_agent_smoke.py +0 -409
  460. package/scripts/bench_models.py +0 -540
  461. package/scripts/bench_vector_index.py +0 -295
  462. package/scripts/funnel_soft_gate.py +0 -192
  463. package/scripts/generate_agent_loop_fixtures.py +0 -907
  464. package/scripts/generate_rust_parity_fixtures.py +0 -1000
  465. package/scripts/measure_brain_home_fill.mjs +0 -141
  466. package/scripts/migrate_brain_storage.py +0 -57
  467. package/scripts/parity_fixture_corpus_docgen.py +0 -341
  468. package/scripts/profile_kg.py +0 -355
  469. package/server.py +0 -30
  470. package/static/app/assets/arrow-left-BHYmOTWU.js +0 -1
  471. package/static/app/assets/circle-check-CLeWJr67.js +0 -1
  472. package/static/app/assets/index-DxmOfNRi.css +0 -2
  473. package/static/app/assets/search-BgSVX6NG.js +0 -1
@@ -1,125 +0,0 @@
1
- """One answer to "which workspace is this request talking about?".
2
-
3
- Eight routers used to each re-derive this from raw headers. They did not agree:
4
- some accepted the ``workspace_id`` query parameter and some only the
5
- ``X-Workspace-Id`` header, and only three of them checked that a body's
6
- ``workspace_id`` matched the header instead of silently letting one win. A
7
- guard that exists in some handlers and not others is not a guard — this module
8
- is the single implementation they all call, so the rule is stated once and
9
- holds everywhere.
10
-
11
- The rule:
12
-
13
- * A caller may name a workspace in the ``X-Workspace-Id`` header, the
14
- ``workspace_id`` query parameter, or the request body.
15
- * If more than one of those is present they must **agree**. Disagreement is a
16
- ``403``, never a silent preference — a request that names two workspaces has
17
- no single meaning, and picking one is how a scoped write lands in the wrong
18
- vault.
19
- * Naming nothing resolves to ``None``, which every caller passes to
20
- :class:`~latticeai.services.workspace_service.WorkspaceService`, where it
21
- falls back to the active workspace (Personal by default). That is the
22
- pre-1.1 single-workspace behaviour and it stays intact.
23
-
24
- Permission is *not* decided here. ``WorkspaceService`` owns read/write gating;
25
- this module only decides what was asked for and translates the service's
26
- ``PermissionError`` into the HTTP boundary's ``403``.
27
- """
28
-
29
- from __future__ import annotations
30
-
31
- from typing import Any, List, Optional
32
-
33
- from fastapi import HTTPException, Request
34
-
35
- __all__ = [
36
- "WORKSPACE_HEADER",
37
- "WORKSPACE_PARAM",
38
- "requested_workspace",
39
- "resolve_workspace_scope",
40
- "workspace_scope_from_request",
41
- ]
42
-
43
- WORKSPACE_HEADER = "X-Workspace-Id"
44
- WORKSPACE_PARAM = "workspace_id"
45
-
46
- _MISMATCH_DETAIL = "Workspace selectors must match."
47
-
48
-
49
- def _clean(value: Any) -> Optional[str]:
50
- """Normalize one selector to a non-empty string, or ``None``."""
51
- if value is None:
52
- return None
53
- text = str(value).strip()
54
- return text or None
55
-
56
-
57
- def workspace_scope_from_request(request: Request) -> Optional[str]:
58
- """Resolve the workspace named by header/query, or ``None``.
59
-
60
- ``None`` lets the service fall back to the active workspace (Personal by
61
- default), preserving pre-1.1 behaviour for clients that send no header.
62
- """
63
- header = _clean(request.headers.get(WORKSPACE_HEADER))
64
- if header:
65
- return header
66
- return _clean(request.query_params.get(WORKSPACE_PARAM))
67
-
68
-
69
- def requested_workspace(
70
- request: Request,
71
- *,
72
- body_workspace: Any = None,
73
- ) -> Optional[str]:
74
- """The one workspace this request names, or ``None``.
75
-
76
- Raises ``403`` when the header, query parameter, and body disagree.
77
- """
78
- selectors: List[str] = []
79
- for value in (
80
- _clean(body_workspace),
81
- _clean(request.headers.get(WORKSPACE_HEADER)),
82
- _clean(request.query_params.get(WORKSPACE_PARAM)),
83
- ):
84
- if value is not None:
85
- selectors.append(value)
86
- if len(set(selectors)) > 1:
87
- raise HTTPException(status_code=403, detail=_MISMATCH_DETAIL)
88
- return selectors[0] if selectors else None
89
-
90
-
91
- def resolve_workspace_scope(
92
- request: Request,
93
- *,
94
- user: Optional[str],
95
- workspace_service: Any = None,
96
- write: bool = True,
97
- body_workspace: Any = None,
98
- allow_unscoped_anonymous: bool = False,
99
- ) -> Optional[str]:
100
- """Resolve *and authorize* the workspace a handler should act on.
101
-
102
- ``workspace_service=None`` is the standalone/embedded router contract: the
103
- named workspace passes through ungated, exactly as each local copy of this
104
- logic did. With a service present, reads are gated on ``read`` and writes
105
- on ``write``, and a denial surfaces as ``403``.
106
-
107
- ``allow_unscoped_anonymous`` preserves one deliberate exception: a no-auth
108
- local caller that names no workspace keeps its legacy *unscoped* records
109
- instead of being resolved onto the active workspace.
110
- """
111
- requested = requested_workspace(request, body_workspace=body_workspace)
112
- if workspace_service is None:
113
- return requested
114
- if allow_unscoped_anonymous and not user and requested is None:
115
- return None
116
- resolver = (
117
- workspace_service.resolve_write_scope
118
- if write
119
- else workspace_service.resolve_read_scope
120
- )
121
- try:
122
- scope: Optional[str] = resolver(requested, user or None)
123
- except PermissionError as exc:
124
- raise HTTPException(status_code=403, detail=str(exc)) from exc
125
- return scope
@@ -1,93 +0,0 @@
1
- """Single-agent runtime — the Discover→Plan→Implement→Verify state machine.
2
-
3
- This package is the deep single-agent loop: a small interface (``AgentDeps``
4
- ports + ``SingleAgentRuntime.run_to_completion``) over the whole role-phased
5
- state machine (planner → executor → critic → rollback → memory). It carries no
6
- FastAPI, no globals, and no I/O of its own — every collaborator is injected
7
- through ``AgentDeps``.
8
-
9
- Two adapters justify the seam:
10
-
11
- * production wires ``AgentDeps`` from ``latticeai.server_app``'s ``LLMRouter``, governance
12
- map, audit log, and prompts;
13
- * tests pass fake ports (an LLM that returns canned JSON, a recording tool
14
- executor) and drive a full PLAN→EXECUTE→VERIFY→DONE cycle without a server.
15
-
16
- HTTP concerns — request parsing, chat-history persistence, response shaping,
17
- scheduling the background memory update — stay in the app layer. This package
18
- only owns the state machine.
19
-
20
- v10.0.1 split the pure helpers and the state vocabulary out to sibling modules
21
- (``agent_state``, ``agent_helpers``, ``agent_trace``, …). v11.3.0 finished the
22
- job on what was left, turning the module into a package whose submodules are
23
- one phase each:
24
-
25
- * :mod:`.context` — ``AgentRunContext``, the state one run carries;
26
- * :mod:`.deps` — ``AgentDeps``, the ports;
27
- * :mod:`.planning` / :mod:`.execution` / :mod:`.verification` / :mod:`.recovery`
28
- — the four phase mixins;
29
- * :mod:`.runtime` — ``SingleAgentRuntime``, which composes them and drives the
30
- loop;
31
- * :mod:`._contract` — the typing-only seam the mixins share.
32
-
33
- Every name this module exported still resolves from ``latticeai.core.agent``.
34
-
35
- Stubbing note: a name rebound *here* changes only this module's binding — the
36
- submodule that calls it holds its own, so a test standing in for a collaborator
37
- patches the submodule that reads it.
38
- """
39
-
40
- from __future__ import annotations
41
-
42
- # The state vocabulary and the pure helpers live in sibling modules so the loop
43
- # holds only the loop. They are re-exported (see ``__all__``) because callers —
44
- # the HTTP layer, run_store, the eval harness, and the tests — have always
45
- # imported them from here, and that contract does not change.
46
- from latticeai.core.agent_helpers import PhaseBudgets as PhaseBudgets
47
- from latticeai.core.agent_helpers import TranscriptBudget as TranscriptBudget
48
- from latticeai.core.agent_helpers import _truncate_strings as _truncate_strings
49
- from latticeai.core.agent_helpers import artifact_checklist as artifact_checklist
50
- from latticeai.core.agent_helpers import compact_transcript as compact_transcript
51
- from latticeai.core.agent_helpers import extract_action as extract_action
52
- from latticeai.core.agent_helpers import (
53
- extract_action_details as extract_action_details,
54
- )
55
- from latticeai.core.agent_helpers import files_written as files_written
56
- from latticeai.core.agent_helpers import filter_learnings as filter_learnings
57
- from latticeai.core.agent_helpers import (
58
- format_artifact_checklist as format_artifact_checklist,
59
- )
60
- from latticeai.core.agent_helpers import (
61
- format_requirement_coverage as format_requirement_coverage,
62
- )
63
- from latticeai.core.agent_helpers import normalize_plan as normalize_plan
64
- from latticeai.core.agent_helpers import requirement_coverage as requirement_coverage
65
- from latticeai.core.agent_state import AGENT_TERMINAL_STATES as AGENT_TERMINAL_STATES
66
- from latticeai.core.agent_state import AgentState as AgentState
67
-
68
- from .context import AgentRunContext as AgentRunContext
69
- from .deps import AgentDeps as AgentDeps
70
- from .runtime import SingleAgentRuntime as SingleAgentRuntime
71
-
72
- __all__ = [
73
- # this module
74
- "AgentDeps",
75
- "AgentRunContext",
76
- "SingleAgentRuntime",
77
- # re-exported from agent_state
78
- "AGENT_TERMINAL_STATES",
79
- "AgentState",
80
- # re-exported from agent_helpers
81
- "PhaseBudgets",
82
- "TranscriptBudget",
83
- "artifact_checklist",
84
- "compact_transcript",
85
- "extract_action",
86
- "extract_action_details",
87
- "files_written",
88
- "filter_learnings",
89
- "format_artifact_checklist",
90
- "format_requirement_coverage",
91
- "normalize_plan",
92
- "requirement_coverage",
93
- ]
@@ -1,79 +0,0 @@
1
- """The seam the four phase mixins share.
2
-
3
- ``SingleAgentRuntime`` is assembled from the planning, execution, verification
4
- and recovery mixins. Each of them reads state it does not own and calls back
5
- into helpers defined on the runtime itself — the point of the split is that
6
- "how a plan is approved" and "how a tool call is gated" stop sharing a
7
- 1,465-line file, not that they stop sharing ``self``.
8
-
9
- Typing-only, exactly like :mod:`lattice_brain.ingestion._contract`: the
10
- declarations below are never the implementation, so the MRO and every method
11
- resolution stay byte-for-byte what the single-file class had. Adding a
12
- cross-mixin call without declaring it here is a type error.
13
- """
14
-
15
- from __future__ import annotations
16
-
17
- from typing import Any, FrozenSet, Optional
18
-
19
- from latticeai.core.agent_helpers import PhaseBudgets, TranscriptBudget
20
- from latticeai.core.agent_profiles import AgentProfile
21
- from latticeai.core.permission_mode import PermissionMode
22
-
23
- from .context import AgentRunContext
24
- from .deps import AgentDeps
25
-
26
-
27
- class AgentCore:
28
- """What any phase mixin may assume about ``self``.
29
-
30
- Never instantiated directly — see the module docstring. Members are
31
- declared, not implemented: the implementation lives in ``runtime.py`` or in
32
- whichever mixin owns it.
33
- """
34
-
35
- # ── State owned by SingleAgentRuntime.__init__ ───────────────────────────
36
- deps: AgentDeps
37
- _env_phase_budgets: Optional[PhaseBudgets]
38
- _env_transcript_budget: Optional[TranscriptBudget]
39
-
40
- # ── runtime.py: budgets, resolved from deps or the environment once ──────
41
- @property
42
- def phase_budgets(self) -> PhaseBudgets:
43
- raise NotImplementedError
44
-
45
- @property
46
- def transcript_budget(self) -> TranscriptBudget:
47
- raise NotImplementedError
48
-
49
- # ── runtime.py: the autonomy dial every gate in one run agrees on ────────
50
- def resolve_permission_mode(
51
- self,
52
- ctx: Optional[AgentRunContext] = None,
53
- *,
54
- user_email: Optional[str] = None,
55
- workspace_id: Optional[str] = None,
56
- ) -> PermissionMode:
57
- raise NotImplementedError
58
-
59
- # ── runtime.py: change-governance classification helpers ─────────────────
60
- def _governed_tools(self) -> FrozenSet[str]:
61
- raise NotImplementedError
62
-
63
- def _governed_path_exists(self, name: str, path: str) -> bool:
64
- raise NotImplementedError
65
-
66
- # ── runtime.py: how hard the loop works to keep this model on contract ───
67
- def profile_for(self, model_id: Optional[str]) -> AgentProfile:
68
- raise NotImplementedError
69
-
70
- # ── runtime.py: advisory telemetry every phase emits ─────────────────────
71
- def _emit_step(
72
- self, ctx: AgentRunContext, phase: str, event: str, **details: Any
73
- ) -> None:
74
- raise NotImplementedError
75
-
76
- # ── runtime.py: project-session prompt block, or "" for a standalone run ─
77
- @staticmethod
78
- def _project_block(ctx: AgentRunContext) -> str:
79
- raise NotImplementedError
@@ -1,57 +0,0 @@
1
- """The mutable state one agent run carries from phase to phase.
2
-
3
- Every phase reads and writes this object and nothing else: the loop itself is
4
- stateless, so a run is exactly what its :class:`AgentRunContext` says it is.
5
- ``__slots__`` is deliberate — a typo'd attribute is an error, not a silently
6
- ignored write that a later phase never sees.
7
- """
8
-
9
- from __future__ import annotations
10
-
11
- from typing import Any, Callable, Dict, Optional
12
-
13
- from latticeai.core.agent_state import AgentState
14
- from latticeai.core.agent_trace import LoopTrace
15
-
16
-
17
- class AgentRunContext:
18
- """Mutable state carrier passed through all agent phases."""
19
- __slots__ = ("state", "plan", "transcript", "retry_count",
20
- "state_history", "corrections", "final_message", "rollback_log",
21
- "executing_model", "reviewing_model", "approved_by_human", "trace",
22
- "on_step", "project_context", "permission_mode",
23
- "self_model_summary")
24
-
25
- def __init__(self) -> None:
26
- self.state: AgentState = AgentState.IDLE
27
- self.trace: LoopTrace = LoopTrace()
28
- self.plan: dict = {}
29
- self.transcript: list = []
30
- self.retry_count: int = 0
31
- self.state_history: list = []
32
- self.corrections: list = []
33
- self.final_message: str = ""
34
- self.rollback_log: list = []
35
- self.executing_model: Optional[str] = None
36
- self.reviewing_model: Optional[str] = None
37
- self.approved_by_human: bool = False
38
- # Per-run step observer (review Wave 1.1): the HTTP layer attaches a
39
- # callback here so live SSE clients see progress while EXECUTING.
40
- # Never serialized; a broken observer never breaks the loop.
41
- self.on_step: Optional[Callable[[Dict[str, Any]], None]] = None
42
- # Multi-turn project loop (v9.9.6): a prompt block describing where the
43
- # project stands — files already produced, open TODOs, the last honest
44
- # verification. Empty for a standalone run, which behaves exactly as
45
- # before. Set by the HTTP layer, read by plan/execute/verify.
46
- self.project_context: str = ""
47
- # Autonomy dial resolved once per run (v9.9.8). The HTTP layer stamps
48
- # the user/workspace-scoped mode here so the plan gate and every
49
- # per-tool gate in the same run agree; ``None`` falls back to the
50
- # process-wide resolver on ``deps``.
51
- self.permission_mode: Optional[str] = None
52
- # Self-Model summary resolved once per run (v11.2.0). The executor
53
- # prompt is rebuilt on every turn of the loop; reading the profile
54
- # once and reusing it keeps a graph query off that hot path — and
55
- # keeps every turn of one run describing the same person. ``None``
56
- # means "not resolved yet"; ``""`` is a resolved, empty profile.
57
- self.self_model_summary: Optional[str] = None
@@ -1,125 +0,0 @@
1
- """The ports the state machine needs from the outside world.
2
-
3
- Everything the loop touches is declared here, which is what lets the whole
4
- PLAN→EXECUTE→VERIFY cycle run against fakes: production wires these from the
5
- app layer's router, governance map, audit log and prompts; tests pass an LLM
6
- that returns canned JSON and a recording tool executor.
7
- """
8
-
9
- from __future__ import annotations
10
-
11
- from dataclasses import dataclass
12
- from pathlib import Path
13
- from typing import Any, Awaitable, Callable, Dict, FrozenSet, Mapping, Optional
14
-
15
- from latticeai.core.agent_helpers import PhaseBudgets, TranscriptBudget
16
- from latticeai.core.agent_profiles import AgentProfile
17
-
18
-
19
- @dataclass
20
- class AgentDeps:
21
- """The ports a :class:`SingleAgentRuntime` needs from the outside world.
22
-
23
- Everything the state machine touches is here, so the loop can be exercised
24
- against fakes. See module docstring for the two-adapter rationale.
25
- """
26
-
27
- # ── LLM port ─────────────────────────────────────────────────────
28
- # generate_as(model_id, message, context, max_tokens, temperature) -> str
29
- generate_as: Callable[..., Awaitable[Any]]
30
- # generate(message, context, max_tokens, temperature) -> str
31
- generate: Callable[..., Awaitable[Any]]
32
-
33
- # ── tool port ────────────────────────────────────────────────────
34
- execute_tool: Callable[[str, dict], dict]
35
- policy_for: Callable[[str, dict], Mapping[str, Any]] # name, args -> policy
36
- risk_level: Callable[[Any], str] # policy -> "low"|"medium"|"high"
37
- check_role: Callable[[str, str], None] # tool_name, user -> raises if not allowed
38
- tool_governance: Mapping[str, Mapping[str, Any]] # name -> policy (auto_approve set)
39
- file_create_actions: FrozenSet[str]
40
-
41
- # ── context / memory / audit ports ───────────────────────────────
42
- recent_chat_context: Callable[..., str] # (conversation_id=...) -> str
43
- clear_history: Callable[[int], dict]
44
- knowledge_save: Callable[..., Any]
45
- audit: Callable[..., None] # (event, **kw) -> None
46
-
47
- # ── prompts + config ─────────────────────────────────────────────
48
- planner_prompt: str
49
- executor_prompt: str
50
- critic_prompt: str
51
- memory_updater_prompt: str
52
- agent_root: Path
53
-
54
- # ── rollback port (optional) ─────────────────────────────────────
55
- # Production injects this from the tool dispatch service so this pure
56
- # state machine does not shell out directly. Tests can pass a recorder.
57
- rollback_file: Optional[Callable[[str], Dict[str, Any]]] = None
58
-
59
- # ── snapshot rollback ports (optional, review L7) ────────────────
60
- # git-only rollback left non-git workspaces and newly created files
61
- # unrecoverable. ``snapshot_file(path)`` captures pre-write state
62
- # ({"existed", "content", "too_large"}) before a file-create action;
63
- # ``restore_snapshot(path, content)`` restores it (content=None deletes
64
- # a file the run created). Both are production-wired with workspace
65
- # path safety; tests pass recorders.
66
- snapshot_file: Optional[Callable[[str], Dict[str, Any]]] = None
67
- restore_snapshot: Optional[Callable[[str, Optional[str]], Dict[str, Any]]] = None
68
-
69
- # ── lifecycle hooks port (optional) ──────────────────────────────
70
- # When present, every tool execution fires the shared pre_tool/post_tool
71
- # lifecycle, so the agent tool path no longer bypasses hooks.
72
- hooks: Any = None
73
-
74
- # ── brain memory port (optional) ─────────────────────────────────
75
- # When present, completed-run learnings become typed Experience records
76
- # through the unified ingestion pipeline (with provenance), replacing
77
- # the vault markdown dump.
78
- brain_memory: Any = None
79
-
80
- # ── change governor port (optional) ──────────────────────────────
81
- # When present, file writes are classified centrally: additive creates
82
- # run with minimal friction, while mutations/deletions of existing
83
- # content are staged as review proposals instead of applied. The port is
84
- # ``review(name, args, policy=..., user_email=..., workspace_id=...)``
85
- # returning None (fall through to the classic gates) or a verdict dict.
86
- change_governor: Any = None
87
-
88
- # ── phase budgets (optional) ─────────────────────────────────────
89
- # Per-phase token caps (plan/execute/verify/memory). None reads the
90
- # environment once at first use; tests inject a fixed PhaseBudgets.
91
- phase_budgets: Optional[PhaseBudgets] = None
92
-
93
- # ── transcript shaping (optional) ────────────────────────────────
94
- # Executor/critic prompt window caps. None reads the environment once;
95
- # tests inject a fixed TranscriptBudget.
96
- transcript_budget: Optional["TranscriptBudget"] = None
97
-
98
- # ── step observer port (optional) ────────────────────────────────
99
- # Default per-runtime observer for live step events; a per-run observer
100
- # can also be attached on AgentRunContext.on_step. Both are advisory.
101
- on_step: Optional[Callable[[Dict[str, Any]], None]] = None
102
-
103
- # ── agent profile (optional, v9.9.7) ─────────────────────────────
104
- # How hard the loop works to keep a weak model on contract. None selects
105
- # per-run from the executing model id (``profile_for_model``); tests
106
- # inject a fixed profile.
107
- agent_profile: Optional["AgentProfile"] = None
108
-
109
- # ── permission mode port (optional, v9.9.8) ──────────────────────
110
- # The autonomy dial. Either a static mode, or a resolver callable that
111
- # accepts ``user_email``/``workspace_id`` scope kwargs (preferred) or no
112
- # arguments at all — see ``call_mode_source``. ``None`` means strict,
113
- # which is exactly the pre-9.9.8 behaviour.
114
- permission_mode: Any = None
115
-
116
- # ── Self-Model port (optional, v11.2.0) ──────────────────────────
117
- # What the Brain has learned about its owner, injected into the executor
118
- # prompt. Either a fixed string or a resolver callable taking
119
- # ``user_email``/``workspace_id`` scope kwargs (or none at all). 11.1.0
120
- # built ``executor_prompt_for(self_model_summary=…)`` and then had nothing
121
- # to pass it, because the runtime held its executor prompt as a fixed
122
- # string; this is the port that was missing. ``None`` — and an empty
123
- # summary — produce exactly the prompt bytes the loop produced before it
124
- # existed.
125
- self_model_summary: Any = None