ltcai 9.4.0 → 9.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 (51) hide show
  1. package/README.md +63 -40
  2. package/docs/CHANGELOG.md +57 -0
  3. package/docs/COMMUNITY_AND_PLUGINS.md +2 -2
  4. package/docs/DEVELOPMENT.md +8 -8
  5. package/docs/LEGACY_COMPATIBILITY.md +1 -1
  6. package/docs/ONBOARDING.md +2 -2
  7. package/docs/OPERATIONS.md +1 -1
  8. package/docs/TRUST_MODEL.md +1 -1
  9. package/docs/WHY_LATTICE.md +1 -1
  10. package/docs/kg-schema.md +1 -1
  11. package/docs/mcp-tools.md +1 -1
  12. package/lattice_brain/__init__.py +1 -1
  13. package/lattice_brain/runtime/multi_agent.py +1 -1
  14. package/latticeai/__init__.py +1 -1
  15. package/latticeai/api/change_proposals.py +60 -0
  16. package/latticeai/api/chat_agent_http.py +2 -0
  17. package/latticeai/api/command_center.py +51 -0
  18. package/latticeai/app_factory.py +39 -0
  19. package/latticeai/cli/entrypoint.py +3 -1
  20. package/latticeai/core/agent.py +127 -13
  21. package/latticeai/core/agent_eval.py +260 -0
  22. package/latticeai/core/agent_trace.py +104 -0
  23. package/latticeai/core/legacy_compatibility.py +1 -1
  24. package/latticeai/core/marketplace.py +1 -1
  25. package/latticeai/core/tool_governor.py +101 -0
  26. package/latticeai/core/workspace_os.py +1 -1
  27. package/latticeai/services/architecture_readiness.py +1 -1
  28. package/latticeai/services/change_proposals.py +270 -0
  29. package/latticeai/services/command_center.py +433 -0
  30. package/latticeai/services/product_readiness.py +1 -1
  31. package/latticeai/services/review_queue.py +4 -1
  32. package/latticeai/tools/__init__.py +6 -1
  33. package/package.json +1 -1
  34. package/scripts/agent_eval.py +46 -0
  35. package/scripts/check_current_release_docs.mjs +2 -1
  36. package/src-tauri/Cargo.lock +1 -1
  37. package/src-tauri/Cargo.toml +1 -1
  38. package/src-tauri/tauri.conf.json +1 -1
  39. package/static/app/asset-manifest.json +11 -11
  40. package/static/app/assets/{Act-t9oveJO7.js → Act-BkOEmwBi.js} +1 -1
  41. package/static/app/assets/{Brain-DP-gpcEJ.js → Brain-C9ITUsQ_.js} +1 -1
  42. package/static/app/assets/{Capture-DYknDKy8.js → Capture-C-ppTeud.js} +1 -1
  43. package/static/app/assets/{Library-DLyc_g8c.js → Library-CGQbgWTu.js} +1 -1
  44. package/static/app/assets/{System-BZgJ7tGu.js → System-djmj0n2_.js} +1 -1
  45. package/static/app/assets/{index-Cl4S_9Id.css → index-85wQvEie.css} +1 -1
  46. package/static/app/assets/index-AF0-4XVv.js +18 -0
  47. package/static/app/assets/{primitives-DawfkPR4.js → primitives-jbb2qv4Q.js} +1 -1
  48. package/static/app/assets/{textarea-a4Ir3SZS.js → textarea-CFoo0OxJ.js} +1 -1
  49. package/static/app/index.html +2 -2
  50. package/static/sw.js +1 -1
  51. package/static/app/assets/index-BeQ77vPs.js +0 -17
package/README.md CHANGED
@@ -1,9 +1,23 @@
1
1
  # Lattice AI
2
2
 
3
- **Lattice AI 9.4.0 is the local-first Digital Brain platform. Question-Driven Everyday Automation makes automating daily life effortless: the Brain mines your own recurring questions and connected knowledge folders, proposes concrete automations with your literal questions as evidence, and installs them in one click as consent-first drafts scheduled answers for questions you keep asking, digests for folders that keep growing.**
3
+ **Lattice AI 9.6.0 is the local-first Digital Brain platform. The Trusted Agent Loop makes autonomous work transparent and git-like: the reasoning loop reports every model call, format repair, and tool outcome; a deterministic evaluation harness gates every release on weak-model robustness; and change governance is proposal-first creating new files is frictionless while edits and deletions of existing content become reviewable proposals you approve or reject before anything changes.**
4
4
 
5
5
  **Lattice AI는 모델이 바뀌어도 내 지식과 맥락을 보존하는 로컬 우선 AI 브레인입니다.**
6
6
 
7
+ > The 9.6.0 release engineers trust into the agent loop: a structured
8
+ > LoopTrace makes every run observable (llm calls, parse recoveries, format
9
+ > repairs, corrections, tool outcomes — returned as `loop` in the agent API),
10
+ > weak-model tolerance gains python-literal repair and escalating format
11
+ > corrections, a deterministic agent evaluation harness gates CI, and a
12
+ > central change governor stages edits/deletions of existing files as review
13
+ > proposals (`/api/proposals`) applied exactly as reviewed — while new-file
14
+ > creation now runs without approval friction.
15
+ > The 9.5.0 release adds the Command Center: a deterministic, local
16
+ > `/api/command` surface serving a daily briefing (recent knowledge,
17
+ > conversation activity, automation state, pending reviews, health snapshot,
18
+ > top suggestions, state-derived quick actions) and a universal search across
19
+ > knowledge nodes, the user's own conversations, and installed automations —
20
+ > surfaced in the app as a Cmd+K command palette and a Today's Briefing panel.
7
21
  > The 9.4.0 release adds question-driven automation: a deterministic local
8
22
  > pattern miner clusters your recurring questions (the evidence shown is your
9
23
  > own words, no model call), an /api/automation surface turns patterns and
@@ -102,10 +116,10 @@ You need Lattice AI when:
102
116
  The screenshots below are the latest checked-in visual evidence captures. They
103
117
  keep the first-run Brain flow, memory graph, source capture, model library,
104
118
  system view, admin console, and review center visible as release gates while
105
- 9.4.0 makes everyday automation effortless: the Brain proposes automations
106
- from your own recurring questions and connected knowledge folders, and every
107
- accepted suggestion becomes a consent-first draft you review and enable. The
108
- captures below are the checked-in 9.4.0 visual release evidence for that
119
+ 9.6.0 makes autonomous work trustworthy: agents create new things freely,
120
+ but every change to existing content becomes a reviewable proposal with a
121
+ diff, and the reasoning loop itself is observable and regression-gated. The
122
+ captures below are the checked-in 9.6.0 visual release evidence for that
109
123
  product flow.
110
124
 
111
125
  ### 1. Wake Brain
@@ -118,21 +132,21 @@ confirm owner, check the computer, choose the Brain voice.
118
132
  Choose the owner of the Brain. The profile is not a SaaS account by default; it
119
133
  is the local identity for the knowledge you keep.
120
134
 
121
- ![Login](output/release/v9.4.0/screenshots/01-login.png)
135
+ ![Login](output/release/v9.6.0/screenshots/01-login.png)
122
136
 
123
137
  ### 3. Recommended Models
124
138
 
125
139
  Start with a short list: safest recommendation, faster model, stronger model.
126
140
  Advanced details stay available without overwhelming first-time users.
127
141
 
128
- ![Recommended Models](output/release/v9.4.0/screenshots/02-recommended-models.png)
142
+ ![Recommended Models](output/release/v9.6.0/screenshots/02-recommended-models.png)
129
143
 
130
144
  ### 4. Install And Load
131
145
 
132
146
  Download and load only after consent. Lattice explains model size, local
133
147
  execution, and network use before work starts.
134
148
 
135
- ![Install and Load](output/release/v9.4.0/screenshots/03-install-load-progress.png)
149
+ ![Install and Load](output/release/v9.6.0/screenshots/03-install-load-progress.png)
136
150
 
137
151
  ### 5. Brain Chat
138
152
 
@@ -144,14 +158,14 @@ and its visible life signal follow real listening, recall, synthesis, and action
144
158
  state. Detailed memory rings, provenance, conversation history, and
145
159
  model/runtime proof open as overlays only when requested.
146
160
 
147
- ![One-viewport Living Brain Home](output/release/v9.4.0/screenshots/04-brain-chat-home.png)
161
+ ![One-viewport Living Brain Home](output/release/v9.6.0/screenshots/04-brain-chat-home.png)
148
162
 
149
163
  ### 6. Review Center
150
164
 
151
165
  Automation results are staged for review before they become durable decisions.
152
166
  Snooze, unsnooze, run now, approve, and dismiss actions stay explicit.
153
167
 
154
- ![Review Center](output/release/v9.4.0/screenshots/12-review-center.png)
168
+ ![Review Center](output/release/v9.6.0/screenshots/12-review-center.png)
155
169
 
156
170
  ## Brain Depths
157
171
 
@@ -167,10 +181,10 @@ The user travels inward from everyday memory to deeper structure:
167
181
 
168
182
  Walkthrough:
169
183
 
170
- ![v9.4.0 Living Brain walkthrough](output/release/v9.4.0/gifs/v9.4.0-living-brain-walkthrough.gif)
184
+ ![v9.6.0 Living Brain walkthrough](output/release/v9.6.0/gifs/v9.6.0-living-brain-walkthrough.gif)
171
185
 
172
186
  Screenshot index and capture notes:
173
- [output/release/v9.4.0/SCREENSHOT_INDEX.md](output/release/v9.4.0/SCREENSHOT_INDEX.md)
187
+ [output/release/v9.6.0/SCREENSHOT_INDEX.md](output/release/v9.6.0/SCREENSHOT_INDEX.md)
174
188
 
175
189
  ## Install
176
190
 
@@ -255,43 +269,50 @@ See [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) for developer workflow details.
255
269
 
256
270
  ## Current Release
257
271
 
258
- The current release is **9.4.0 — Question-Driven Everyday Automation**:
259
-
260
- - A new `latticeai.core.file_generation` pipeline treats every model reply as
261
- untrusted content: extension-aware strict prompting, extraction of the real
262
- payload from fences/`<think>` blocks/chat framing, per-type structural
263
- validation (complete HTML documents, parseable JSON, CSS rule blocks), one
264
- corrective retry that tells the model what was wrong, and a deterministic
265
- repair fallback that guarantees a valid file.
266
- - Type-only requests without an explicit filename ("html 파일 만들어줘",
267
- "웹페이지 만들어줘") now resolve to an inferred target and use the
268
- deterministic direct-write path instead of the model-driven agent loop.
269
- - The agent executor tolerates small-model formatting slips: `<think>` blocks
270
- and trailing commas are stripped from action JSON, and parse failures feed a
271
- corrective format reminder back to the model instead of aborting the run.
272
- - The executor prompt pins exact file-content rules for `write_file` so
273
- agent-created files are complete and fence-free.
274
- - File writes report whether content was generated cleanly, retried, or
275
- auto-repaired in the response payload (`generation` metadata).
276
-
277
- Expected artifacts for 9.4.0 release must use exact filenames:
278
-
279
- - `dist/ltcai-9.4.0-py3-none-any.whl`
280
- - `dist/ltcai-9.4.0.tar.gz`
281
- - `ltcai-9.4.0.tgz`
282
- - `dist/ltcai-9.4.0.vsix`
283
- - `src-tauri/target/release/bundle/dmg/Lattice AI_9.4.0_aarch64.dmg`
272
+ The current release is **9.6.0 — Trusted Agent Loop**:
273
+
274
+ - The single-agent reasoning loop is fully observable: a structured
275
+ `LoopTrace` records every llm call, parse error (recovered or not), format
276
+ repair, correction, tool outcome, retry, and rollback, and its summary is
277
+ returned as `loop` with every agent API response.
278
+ - Weak-model robustness is stronger and measured: the action parser now also
279
+ repairs Python-literal dicts (single quotes, True/False/None), repairs are
280
+ reported by name, and a second formatting slip escalates the correction
281
+ with the exact list of valid tools.
282
+ - A deterministic agent evaluation harness (`scripts/agent_eval.py`, CI
283
+ gate) drives the real state machine through scripted scenarios — happy
284
+ path, weak-model format gauntlet, correction escalation, destructive
285
+ block, loop detection, critic retry, unrecoverable garbage and must stay
286
+ at 100% scenario pass.
287
+ - Change governance is proposal-first (`latticeai/core/tool_governor.py`):
288
+ additive creates run with minimal friction, while agent edits/deletions of
289
+ existing files are staged as review proposals with a unified diff and a
290
+ small/large tier, listed at `GET /api/proposals`, applied exactly as
291
+ reviewed on approve, discarded on reject. The Brain home shows a
292
+ "변경 제안 / Change proposals" panel with diff previews and one-click
293
+ approve/reject.
294
+ - Housekeeping: Ruff per-file lint ignores trimmed from 9 entries to 3,
295
+ AGENTS.md now carries a machine-checked current-release marker inside the
296
+ docs gate, and the review queue gained the `change_proposal` source.
297
+
298
+ Expected artifacts for 9.6.0 release must use exact filenames:
299
+
300
+ - `dist/ltcai-9.6.0-py3-none-any.whl`
301
+ - `dist/ltcai-9.6.0.tar.gz`
302
+ - `ltcai-9.6.0.tgz`
303
+ - `dist/ltcai-9.6.0.vsix`
304
+ - `src-tauri/target/release/bundle/dmg/Lattice AI_9.6.0_aarch64.dmg`
284
305
 
285
306
  Do not use wildcard artifact uploads. Package registry publishing remains owner-run.
286
307
 
287
308
  See [docs/ROADMAP_RECOMMENDATIONS.md](docs/ROADMAP_RECOMMENDATIONS.md) for the
288
- strategic roadmap slices applied through 9.4.0 and the follow-up tracks.
309
+ strategic roadmap slices applied through 9.6.0 and the follow-up tracks.
289
310
 
290
311
  ## Known Limitations
291
312
 
292
313
  - External package registries are owner-published and can lag behind GitHub.
293
314
  - PostgreSQL/pgvector is optional scale/migration tooling. SQLite remains the
294
- live local Brain store in 9.4.0.
315
+ live local Brain store in 9.6.0.
295
316
  - Docker, model downloads, cloud model calls, Telegram, Brain Network, and update
296
317
  checks require explicit user action.
297
318
  - Conversation does not fabricate answers when no model is loaded.
@@ -303,6 +324,8 @@ strategic roadmap slices applied through 9.4.0 and the follow-up tracks.
303
324
 
304
325
  | Version | Theme |
305
326
  | --- | --- |
327
+ | 9.6.0 | Trusted Agent Loop: observable agent reasoning (LoopTrace + loop API payload), python-literal/fence/think weak-model repairs with escalating corrections, a deterministic CI agent-eval harness, and proposal-first change governance where edits/deletions of existing files become reviewable diffs |
328
+ | 9.5.0 | Command Center: a Cmd+K palette searching knowledge, conversations, automations, and pages in one query, plus a daily briefing with Brain state at a glance and state-derived one-click quick actions |
306
329
  | 9.4.0 | Question-Driven Everyday Automation: the Brain mines recurring user questions and connected knowledge folders into one-click, consent-first automation suggestions installed as review-gated drafts |
307
330
  | 9.3.0 | Proactive Brain Intelligence: the Brain diagnoses its own health, surfaces contradictions and stale knowledge, proposes consent-first duplicate consolidation, and recalls with hybrid lexical+semantic evidence behind an honest quality gate |
308
331
  | 9.2.0 | Model-Agnostic File Generation: chat file requests always produce structurally valid files with any LLM via extraction, per-type validation, corrective retry, deterministic repair, inferred file targets, and a fault-tolerant agent JSON loop |
package/docs/CHANGELOG.md CHANGED
@@ -4,6 +4,63 @@ The top entry is either the current unreleased main-branch work or the current
4
4
  release line. Older entries are historical and may describe behavior as it
5
5
  existed at that release.
6
6
 
7
+ ## [9.6.0] - 2026-07-20
8
+
9
+ ### Added
10
+ - Added `latticeai/core/agent_trace.py` (`LoopTrace`): typed observability
11
+ for the single-agent reasoning loop, returned as `loop` with every agent
12
+ API response.
13
+ - Added `latticeai/core/agent_eval.py` + `scripts/agent_eval.py`: a
14
+ deterministic scripted-model evaluation harness over the real agent state
15
+ machine, wired into CI as a release gate.
16
+ - Added `latticeai/core/tool_governor.py` and
17
+ `latticeai/services/change_proposals.py` + `/api/proposals` router:
18
+ central read/additive/mutation/destructive classification with
19
+ proposal-first governance — edits/deletions of existing files are staged
20
+ as review-queue proposals (source `change_proposal`) with unified diffs
21
+ and applied exactly as reviewed on approval.
22
+ - Added the "변경 제안 / Change proposals" Brain home panel with diff
23
+ previews and one-click approve/reject.
24
+
25
+ ### Changed
26
+ - The action parser tolerates Python-literal dicts and reports every repair
27
+ by name; repeated formatting slips escalate the correction with the valid
28
+ tool list.
29
+ - Additive file creates in the agent loop run without plan-approval
30
+ friction; plan approval no longer hard-blocks governor-managed tools.
31
+ - Ruff per-file lint ignores trimmed from 9 entries to 3.
32
+
33
+ ### Security
34
+ - Mutations and deletions of existing workspace files by the agent can no
35
+ longer apply silently: they stage as reviewable proposals, and approve
36
+ applies the exact reviewed content with full audit events.
37
+ - AGENTS.md is now inside the machine-checked release documentation gate.
38
+
39
+ ## [9.5.0] - 2026-07-20
40
+
41
+ ### Added
42
+ - Added `latticeai/services/command_center.py` and the `/api/command/*`
43
+ router: a daily briefing aggregating recent knowledge, conversation
44
+ activity, automation state, pending reviews, a Brain-health snapshot, top
45
+ automation suggestions, and state-derived quick actions with stable ids;
46
+ and a universal search grouping knowledge nodes, the user's own
47
+ conversations (deduped per conversation), and installed automations.
48
+ - Added the Cmd+K Command Palette (grouped results, keyboard navigation,
49
+ debounced universal search, static page jumps) and the collapsible
50
+ "오늘의 브리핑 / Today's briefing" panel on the Brain home, fully ko/en
51
+ localized.
52
+ - Added `tests/unit/test_command_center.py` (11 tests) and
53
+ `frontend/src/features/command/CommandPalette.test.tsx` (3 tests).
54
+
55
+ ### Changed
56
+ - Cmd+K now opens the Command Palette instead of only focusing the chat
57
+ composer; the palette includes a direct jump to the Brain conversation.
58
+
59
+ ### Security
60
+ - Both Command Center endpoints are read-only and scoped to the requesting
61
+ user and workspace; scoped reads exclude legacy-global rows, and every
62
+ briefing section degrades independently without leaking errors.
63
+
7
64
  ## [9.4.0] - 2026-07-20
8
65
 
9
66
  ### Added
@@ -1,13 +1,13 @@
1
1
  # Community And Plugins
2
2
 
3
- Current release: **9.4.0 — Question-Driven Everyday Automation**.
3
+ Current release: **9.6.0 — Trusted Agent Loop**.
4
4
 
5
5
  LatticeAI defines the path from a strong local-first framework (8.4.0
6
6
  action-aware baseline, 8.5.0 registry+DI hardening, 8.6.0 capture/navigation
7
7
  reliability, 8.7.0 runtime-state hygiene, 8.8.0 Brain Core extraction
8
8
  readiness, 8.9.0 scoped Tool API hardening, 9.0.0 cleanup closure, 9.1.0
9
9
  fail-closed review completion, 9.2.0 model-agnostic file generation, 9.3.0
10
- proactive Brain intelligence, and 9.4.0 question-driven everyday automation)
10
+ proactive Brain intelligence, 9.4.0 question-driven everyday automation, 9.5.0 Command Center, and 9.6.0 Trusted Agent Loop)
11
11
  to a product ecosystem. The
12
12
  immediate goal is small and practical: make it clear how
13
13
  contributors can extend the Brain without weakening local-first trust,
@@ -1,10 +1,10 @@
1
1
  # Lattice AI Development
2
2
 
3
- Current release: **9.4.0 — Question-Driven Everyday Automation**.
3
+ Current release: **9.6.0 — Trusted Agent Loop**.
4
4
 
5
5
  This document is for contributors working on the local-first Digital Brain
6
6
  codebase. Product positioning and quick start stay in `README.md`; release
7
- history is intentionally limited to 8.0.0-9.4.0 in `docs/CHANGELOG.md` and
7
+ history is intentionally limited to 8.0.0-9.6.0 in `docs/CHANGELOG.md` and
8
8
  `RELEASE.md`.
9
9
 
10
10
  ## Product Contract
@@ -153,10 +153,10 @@ For user-facing, API, runtime, release, or packaging changes, check:
153
153
  Release/publish examples must use exact target-version filenames. Do not
154
154
  document wildcard artifact upload commands.
155
155
 
156
- For 9.4.0 release work, exact artifacts are:
156
+ For 9.6.0 release work, exact artifacts are:
157
157
 
158
- - `dist/ltcai-9.4.0-py3-none-any.whl`
159
- - `dist/ltcai-9.4.0.tar.gz`
160
- - `ltcai-9.4.0.tgz`
161
- - `dist/ltcai-9.4.0.vsix`
162
- - `src-tauri/target/release/bundle/dmg/Lattice AI_9.4.0_aarch64.dmg`
158
+ - `dist/ltcai-9.6.0-py3-none-any.whl`
159
+ - `dist/ltcai-9.6.0.tar.gz`
160
+ - `ltcai-9.6.0.tgz`
161
+ - `dist/ltcai-9.6.0.vsix`
162
+ - `src-tauri/target/release/bundle/dmg/Lattice AI_9.6.0_aarch64.dmg`
@@ -1,6 +1,6 @@
1
1
  # Legacy Compatibility Map
2
2
 
3
- Current target: **9.4.0 — Question-Driven Everyday Automation**.
3
+ Current target: **9.6.0 — Trusted Agent Loop**.
4
4
 
5
5
  Lattice AI is moving toward a smaller, modular architecture centered on
6
6
  `lattice_brain`, `latticeai.services`, `latticeai.api`, and `latticeai.runtime`.
@@ -1,6 +1,6 @@
1
1
  # Lattice AI Onboarding
2
2
 
3
- Current release: **9.4.0 — Question-Driven Everyday Automation**.
3
+ Current release: **9.6.0 — Trusted Agent Loop**.
4
4
 
5
5
  The first-run goal is a five-minute path from "I opened the app" to "my Brain
6
6
  has a source, a question, and proof." This page is the product contract behind
@@ -40,7 +40,7 @@ read the docs first.
40
40
 
41
41
  ## Release Gate
42
42
 
43
- 9.4.0 treats onboarding as a release gate, not marketing copy. The current
43
+ 9.6.0 treats onboarding as a release gate, not marketing copy. The current
44
44
  machine-checkable product readiness report requires this five-minute contract,
45
45
  the Brain Home surface, setup helpers, graph ingestion tests, and exact release
46
46
  artifact documentation before the release can be called complete.
@@ -1,4 +1,4 @@
1
- # Lattice AI — Operations Guide (v9.4.0)
1
+ # Lattice AI — Operations Guide (v9.6.0)
2
2
 
3
3
  ## 1. 데이터 파일 위치
4
4
 
@@ -1,6 +1,6 @@
1
1
  # Lattice AI Trust Model
2
2
 
3
- Current release: **9.4.0 — Question-Driven Everyday Automation**.
3
+ Current release: **9.6.0 — Trusted Agent Loop**.
4
4
 
5
5
  Lattice AI is local-first, explicit about external communication, and honest
6
6
  when a capability is unavailable.
@@ -1,6 +1,6 @@
1
1
  # Why Lattice AI Exists
2
2
 
3
- Current release: **9.4.0 — Question-Driven Everyday Automation**.
3
+ Current release: **9.6.0 — Trusted Agent Loop**.
4
4
 
5
5
  **Lattice AI is a local-first Digital Brain that keeps your knowledge durable
6
6
  across any AI model.**
package/docs/kg-schema.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Knowledge Graph Schema
2
2
 
3
- Current release: **9.4.0 — Question-Driven Everyday Automation**.
3
+ Current release: **9.6.0 — Trusted Agent Loop**.
4
4
 
5
5
  명세 출처: `lattice_ai_full_spec.pptx` 슬라이드 20·21·22
6
6
  구현: `kg_schema.py`
package/docs/mcp-tools.md CHANGED
@@ -1,4 +1,4 @@
1
- # MCP 도구 카탈로그 (v9.4.0)
1
+ # MCP 도구 카탈로그 (v9.6.0)
2
2
 
3
3
  Lattice AI는 MCP(Model Context Protocol) 서버로 동작하여 Claude Desktop, Cursor 등에서 직접 도구를 사용할 수 있습니다.
4
4
 
@@ -26,7 +26,7 @@ from .storage import (
26
26
  storage_from_env,
27
27
  )
28
28
 
29
- __version__ = "9.4.0"
29
+ __version__ = "9.6.0"
30
30
 
31
31
  __all__ = [
32
32
  "AgentRuntime",
@@ -21,7 +21,7 @@ from .contracts import multi_agent_contract
21
21
  from ..utils import now_iso as _now
22
22
 
23
23
 
24
- MULTI_AGENT_VERSION = "9.4.0"
24
+ MULTI_AGENT_VERSION = "9.6.0"
25
25
 
26
26
  AGENT_ROLES = ("researcher", "planner", "executor", "reviewer", "release")
27
27
  CORE_PIPELINE = ("planner", "executor", "reviewer")
@@ -1,3 +1,3 @@
1
1
  """Lattice AI - modular server package."""
2
2
 
3
- __version__ = "9.4.0"
3
+ __version__ = "9.6.0"
@@ -0,0 +1,60 @@
1
+ """Change proposal API router (v9.6.0).
2
+
3
+ Read/approve/reject surface over
4
+ :class:`~latticeai.services.change_proposals.ChangeProposalService`. The
5
+ items live in the shared review queue (source ``change_proposal``), so the
6
+ Act review center shows them too; this router adds the proposal-specific
7
+ semantics: **approve applies the staged content exactly as reviewed**,
8
+ reject discards it, and nothing touches disk while a proposal is pending.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ from typing import Callable, Optional
14
+
15
+ from fastapi import APIRouter, HTTPException, Request
16
+
17
+ from latticeai.services.change_proposals import ChangeProposalService
18
+
19
+
20
+ def create_change_proposals_router(
21
+ *,
22
+ service: ChangeProposalService,
23
+ require_user: Callable[[Request], str],
24
+ gate_read: Callable[[Request], Optional[str]],
25
+ gate_write: Callable[[Request], Optional[str]],
26
+ ) -> APIRouter:
27
+ router = APIRouter()
28
+
29
+ @router.get("/api/proposals")
30
+ async def list_proposals(request: Request):
31
+ user = require_user(request)
32
+ scope = gate_read(request)
33
+ return service.pending(user_email=user, workspace_id=scope)
34
+
35
+ @router.post("/api/proposals/{item_id}/approve")
36
+ async def approve_proposal(item_id: str, request: Request):
37
+ user = require_user(request)
38
+ scope = gate_write(request)
39
+ try:
40
+ return service.approve_and_apply(
41
+ item_id, user_email=user, workspace_id=scope
42
+ )
43
+ except (KeyError, FileNotFoundError) as exc:
44
+ raise HTTPException(status_code=404, detail=str(exc))
45
+ except ValueError as exc:
46
+ raise HTTPException(status_code=400, detail=str(exc))
47
+
48
+ @router.post("/api/proposals/{item_id}/reject")
49
+ async def reject_proposal(item_id: str, request: Request):
50
+ user = require_user(request)
51
+ scope = gate_write(request)
52
+ try:
53
+ return service.reject(item_id, user_email=user, workspace_id=scope)
54
+ except (KeyError, FileNotFoundError) as exc:
55
+ raise HTTPException(status_code=404, detail=str(exc))
56
+
57
+ return router
58
+
59
+
60
+ __all__ = ["create_change_proposals_router"]
@@ -229,6 +229,7 @@ class AgentHTTPController:
229
229
  "planning_model": req.planning_model or self.model_router.current_model_id,
230
230
  "executing_model": req.executing_model or self.model_router.current_model_id,
231
231
  "reviewing_model": req.reviewing_model or self.model_router.current_model_id,
232
+ "loop": ctx.trace.summary(),
232
233
  }
233
234
 
234
235
  self.runtime.approve(ctx, current_user, approved_by_human=False)
@@ -306,6 +307,7 @@ class AgentHTTPController:
306
307
  "state_history": ctx.state_history,
307
308
  "final_state": ctx.state.value,
308
309
  "created_files": collect_created_files(ctx.transcript),
310
+ "loop": ctx.trace.summary(),
309
311
  }
310
312
 
311
313
  async def resume(
@@ -0,0 +1,51 @@
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"]
@@ -167,6 +167,11 @@ def _build(config: "Optional[Config]" = None) -> Dict[str, Any]:
167
167
  from latticeai.api.agent_registry import create_agent_registry_router
168
168
  from latticeai.api.automation_intelligence import create_automation_intelligence_router
169
169
  from latticeai.api.brain_intelligence import create_brain_intelligence_router
170
+ from latticeai.api.command_center import create_command_center_router
171
+ from latticeai.services.command_center import CommandCenterService
172
+ from latticeai.api.change_proposals import create_change_proposals_router
173
+ from latticeai.services.change_proposals import ChangeProposalService
174
+ from latticeai.tools import resolve_workspace_path
170
175
  from latticeai.api.memory import create_memory_router
171
176
  from latticeai.api.browser import create_browser_router
172
177
  from latticeai.api.portability import create_portability_router
@@ -1032,6 +1037,40 @@ def _build(config: "Optional[Config]" = None) -> Dict[str, Any]:
1032
1037
  workspace_graph=_workspace_graph,
1033
1038
  )
1034
1039
  )
1040
+ COMMAND_CENTER = CommandCenterService(
1041
+ conversation_store=CONVERSATIONS,
1042
+ knowledge_graph=KNOWLEDGE_GRAPH,
1043
+ store=WORKSPACE_OS,
1044
+ search_service=SEARCH_SERVICE,
1045
+ brain_intelligence=BRAIN_INTELLIGENCE,
1046
+ automation_intelligence=AUTOMATION_INTELLIGENCE,
1047
+ review_queue=REVIEW_QUEUE,
1048
+ enable_graph=ENABLE_GRAPH,
1049
+ )
1050
+ app.include_router(
1051
+ create_command_center_router(
1052
+ service=COMMAND_CENTER,
1053
+ require_user=require_user,
1054
+ gate_read=PLATFORM.gate_read,
1055
+ )
1056
+ )
1057
+ CHANGE_PROPOSALS = ChangeProposalService(
1058
+ review_queue=REVIEW_QUEUE,
1059
+ resolve_path=resolve_workspace_path,
1060
+ audit=append_audit_event,
1061
+ )
1062
+ # Proposal-first mutations: the agent loop consults the governor so
1063
+ # additive creates run with minimal friction while changes/deletions of
1064
+ # existing files are staged for review instead of applied.
1065
+ CHAT_AGENT_RUNTIME.deps.change_governor = CHANGE_PROPOSALS
1066
+ app.include_router(
1067
+ create_change_proposals_router(
1068
+ service=CHANGE_PROPOSALS,
1069
+ require_user=require_user,
1070
+ gate_read=PLATFORM.gate_read,
1071
+ gate_write=PLATFORM.gate_write,
1072
+ )
1073
+ )
1035
1074
 
1036
1075
 
1037
1076
  # ── Health & Info ──────────────────────────────────────────────────────────────
@@ -157,7 +157,9 @@ def _start_tunnel(port: int) -> str | None:
157
157
  log_path = Path.home() / ".latticeai" / "tunnel.log"
158
158
  log_path.parent.mkdir(parents=True, exist_ok=True)
159
159
 
160
- proc = subprocess.Popen(
160
+ # Detached on purpose: the tunnel outlives this helper; the log file is
161
+ # the observable surface.
162
+ subprocess.Popen(
161
163
  [bin_path, "tunnel", "--url", f"http://localhost:{port}"],
162
164
  stdout=open(log_path, "w"),
163
165
  stderr=subprocess.STDOUT,