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.
- package/README.md +63 -40
- package/docs/CHANGELOG.md +57 -0
- package/docs/COMMUNITY_AND_PLUGINS.md +2 -2
- package/docs/DEVELOPMENT.md +8 -8
- package/docs/LEGACY_COMPATIBILITY.md +1 -1
- package/docs/ONBOARDING.md +2 -2
- package/docs/OPERATIONS.md +1 -1
- package/docs/TRUST_MODEL.md +1 -1
- package/docs/WHY_LATTICE.md +1 -1
- package/docs/kg-schema.md +1 -1
- package/docs/mcp-tools.md +1 -1
- package/lattice_brain/__init__.py +1 -1
- package/lattice_brain/runtime/multi_agent.py +1 -1
- package/latticeai/__init__.py +1 -1
- package/latticeai/api/change_proposals.py +60 -0
- package/latticeai/api/chat_agent_http.py +2 -0
- package/latticeai/api/command_center.py +51 -0
- package/latticeai/app_factory.py +39 -0
- package/latticeai/cli/entrypoint.py +3 -1
- package/latticeai/core/agent.py +127 -13
- package/latticeai/core/agent_eval.py +260 -0
- package/latticeai/core/agent_trace.py +104 -0
- package/latticeai/core/legacy_compatibility.py +1 -1
- package/latticeai/core/marketplace.py +1 -1
- package/latticeai/core/tool_governor.py +101 -0
- package/latticeai/core/workspace_os.py +1 -1
- package/latticeai/services/architecture_readiness.py +1 -1
- package/latticeai/services/change_proposals.py +270 -0
- package/latticeai/services/command_center.py +433 -0
- package/latticeai/services/product_readiness.py +1 -1
- package/latticeai/services/review_queue.py +4 -1
- package/latticeai/tools/__init__.py +6 -1
- package/package.json +1 -1
- package/scripts/agent_eval.py +46 -0
- package/scripts/check_current_release_docs.mjs +2 -1
- package/src-tauri/Cargo.lock +1 -1
- package/src-tauri/Cargo.toml +1 -1
- package/src-tauri/tauri.conf.json +1 -1
- package/static/app/asset-manifest.json +11 -11
- package/static/app/assets/{Act-t9oveJO7.js → Act-BkOEmwBi.js} +1 -1
- package/static/app/assets/{Brain-DP-gpcEJ.js → Brain-C9ITUsQ_.js} +1 -1
- package/static/app/assets/{Capture-DYknDKy8.js → Capture-C-ppTeud.js} +1 -1
- package/static/app/assets/{Library-DLyc_g8c.js → Library-CGQbgWTu.js} +1 -1
- package/static/app/assets/{System-BZgJ7tGu.js → System-djmj0n2_.js} +1 -1
- package/static/app/assets/{index-Cl4S_9Id.css → index-85wQvEie.css} +1 -1
- package/static/app/assets/index-AF0-4XVv.js +18 -0
- package/static/app/assets/{primitives-DawfkPR4.js → primitives-jbb2qv4Q.js} +1 -1
- package/static/app/assets/{textarea-a4Ir3SZS.js → textarea-CFoo0OxJ.js} +1 -1
- package/static/app/index.html +2 -2
- package/static/sw.js +1 -1
- 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.
|
|
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.
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
captures below are the checked-in 9.
|
|
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
|
-

|
|
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
|
-

|
|
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
|
-

|
|
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
|
-

|
|
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
|
-

|
|
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
|
-

|
|
171
185
|
|
|
172
186
|
Screenshot index and capture notes:
|
|
173
|
-
[output/release/v9.
|
|
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.
|
|
259
|
-
|
|
260
|
-
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
-
|
|
281
|
-
-
|
|
282
|
-
|
|
283
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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,
|
|
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,
|
package/docs/DEVELOPMENT.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# Lattice AI Development
|
|
2
2
|
|
|
3
|
-
Current release: **9.
|
|
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.
|
|
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.
|
|
156
|
+
For 9.6.0 release work, exact artifacts are:
|
|
157
157
|
|
|
158
|
-
- `dist/ltcai-9.
|
|
159
|
-
- `dist/ltcai-9.
|
|
160
|
-
- `ltcai-9.
|
|
161
|
-
- `dist/ltcai-9.
|
|
162
|
-
- `src-tauri/target/release/bundle/dmg/Lattice AI_9.
|
|
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.
|
|
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`.
|
package/docs/ONBOARDING.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Lattice AI Onboarding
|
|
2
2
|
|
|
3
|
-
Current release: **9.
|
|
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.
|
|
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.
|
package/docs/OPERATIONS.md
CHANGED
package/docs/TRUST_MODEL.md
CHANGED
package/docs/WHY_LATTICE.md
CHANGED
package/docs/kg-schema.md
CHANGED
package/docs/mcp-tools.md
CHANGED
|
@@ -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.
|
|
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")
|
package/latticeai/__init__.py
CHANGED
|
@@ -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"]
|
package/latticeai/app_factory.py
CHANGED
|
@@ -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
|
-
|
|
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,
|