ltcai 7.7.0 → 7.9.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 +38 -26
- package/docs/CHANGELOG.md +37 -0
- package/docs/DEVELOPMENT.md +1 -2
- package/docs/MULTI_AGENT_RUNTIME.md +6 -5
- package/docs/V2_ARCHITECTURE.md +3 -2
- package/frontend/src/App.tsx +3 -1
- package/frontend/src/components/ProductFlow.tsx +19 -23
- package/frontend/src/components/onboarding/RecommendationScreen.tsx +11 -12
- package/frontend/src/features/brain/BrainConversation.tsx +107 -108
- package/frontend/src/features/brain/BrainHome.tsx +32 -33
- package/frontend/src/i18n.ts +53 -19
- package/frontend/src/pages/Ask.tsx +11 -2
- package/frontend/src/pages/Brain.tsx +12 -2
- package/frontend/src/styles.css +390 -65
- package/lattice_brain/__init__.py +1 -1
- package/lattice_brain/runtime/__init__.py +8 -2
- package/lattice_brain/runtime/agent_runtime.py +17 -1
- package/lattice_brain/runtime/contracts.py +64 -1
- package/lattice_brain/runtime/multi_agent.py +1 -1
- package/latticeai/__init__.py +1 -1
- package/latticeai/core/agent.py +39 -12
- package/latticeai/core/marketplace.py +1 -1
- package/latticeai/core/workspace_os.py +1 -1
- package/latticeai/services/architecture_readiness.py +1 -1
- package/latticeai/services/product_readiness.py +22 -15
- package/latticeai/services/tool_dispatch.py +15 -3
- package/package.json +1 -1
- package/scripts/product_readiness.py +1 -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 +28 -28
- package/static/app/assets/Act-DOvf59ru.js +2 -0
- package/static/app/assets/{Act-CX5hL0Z3.js.map → Act-DOvf59ru.js.map} +1 -1
- package/static/app/assets/Brain-C7_0mEiI.js +322 -0
- package/static/app/assets/Brain-C7_0mEiI.js.map +1 -0
- package/static/app/assets/Capture-B9Tlhzqr.js +2 -0
- package/static/app/assets/{Capture-CdFSrZnA.js.map → Capture-B9Tlhzqr.js.map} +1 -1
- package/static/app/assets/{Library-CZFVGSmG.js → Library-BJPEEm5O.js} +2 -2
- package/static/app/assets/{Library-CZFVGSmG.js.map → Library-BJPEEm5O.js.map} +1 -1
- package/static/app/assets/System-D6t9jo9V.js +2 -0
- package/static/app/assets/{System-CMoOoUrZ.js.map → System-D6t9jo9V.js.map} +1 -1
- package/static/app/assets/index-C7g26IF6.css +2 -0
- package/static/app/assets/index-DbcEYJQ2.js +17 -0
- package/static/app/assets/{index-B4_drWel.js.map → index-DbcEYJQ2.js.map} +1 -1
- package/static/app/assets/primitives-CD38lt4n.js +2 -0
- package/static/app/assets/{primitives-CFhU5Rka.js.map → primitives-CD38lt4n.js.map} +1 -1
- package/static/app/assets/textarea-BZk6ybp5.js +2 -0
- package/static/app/assets/{textarea-uBpGDOJM.js.map → textarea-BZk6ybp5.js.map} +1 -1
- package/static/app/index.html +2 -2
- package/frontend/src/components/BrainConversation.tsx +0 -533
- package/frontend/src/components/FirstRunGuide.tsx +0 -99
- package/static/app/assets/Act-CX5hL0Z3.js +0 -2
- package/static/app/assets/Brain-m19en5wz.js +0 -322
- package/static/app/assets/Brain-m19en5wz.js.map +0 -1
- package/static/app/assets/Capture-CdFSrZnA.js +0 -2
- package/static/app/assets/System-CMoOoUrZ.js +0 -2
- package/static/app/assets/index-B4_drWel.js +0 -17
- package/static/app/assets/index-DjpDeE0c.css +0 -2
- package/static/app/assets/primitives-CFhU5Rka.js +0 -2
- package/static/app/assets/textarea-uBpGDOJM.js +0 -2
|
@@ -30,7 +30,7 @@ from __future__ import annotations
|
|
|
30
30
|
|
|
31
31
|
from dataclasses import dataclass, field
|
|
32
32
|
from datetime import datetime
|
|
33
|
-
from typing import Any, Dict, Iterable, List, Optional
|
|
33
|
+
from typing import Any, Dict, Iterable, List, Optional, Protocol, runtime_checkable
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
def runtime_timestamp() -> str:
|
|
@@ -69,6 +69,8 @@ CONTRACT_VIEW_KEYS = (
|
|
|
69
69
|
"blocking_reasons",
|
|
70
70
|
)
|
|
71
71
|
|
|
72
|
+
RUNTIME_BOUNDARY_SCHEMA = "runtime-boundary/v1"
|
|
73
|
+
|
|
72
74
|
_SCHEMA_FOR_KIND = {
|
|
73
75
|
"agent_run": AGENT_RUN_SCHEMA,
|
|
74
76
|
"workflow_run": WORKFLOW_RUN_SCHEMA,
|
|
@@ -223,6 +225,67 @@ def multi_agent_contract(
|
|
|
223
225
|
).as_dict()
|
|
224
226
|
|
|
225
227
|
|
|
228
|
+
@dataclass(frozen=True)
|
|
229
|
+
class RuntimeBoundaryContract:
|
|
230
|
+
"""Machine-readable descriptor for an execution runtime boundary.
|
|
231
|
+
|
|
232
|
+
This is intentionally separate from run records: it lets tests, routers, and
|
|
233
|
+
docs assert which class owns which execution surface without importing the
|
|
234
|
+
wrong runtime by name.
|
|
235
|
+
"""
|
|
236
|
+
|
|
237
|
+
name: str
|
|
238
|
+
runtime: str
|
|
239
|
+
entrypoint: str
|
|
240
|
+
surface: str
|
|
241
|
+
owns: str
|
|
242
|
+
compatibility_aliases: List[str] = field(default_factory=list)
|
|
243
|
+
|
|
244
|
+
def as_dict(self) -> Dict[str, Any]:
|
|
245
|
+
return {
|
|
246
|
+
"schema_version": RUNTIME_BOUNDARY_SCHEMA,
|
|
247
|
+
"name": self.name,
|
|
248
|
+
"runtime": self.runtime,
|
|
249
|
+
"entrypoint": self.entrypoint,
|
|
250
|
+
"surface": self.surface,
|
|
251
|
+
"owns": self.owns,
|
|
252
|
+
"compatibility_aliases": list(self.compatibility_aliases),
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
def runtime_boundary_contract(
|
|
257
|
+
*,
|
|
258
|
+
name: str,
|
|
259
|
+
runtime: str,
|
|
260
|
+
entrypoint: str,
|
|
261
|
+
surface: str,
|
|
262
|
+
owns: str,
|
|
263
|
+
compatibility_aliases: Optional[List[str]] = None,
|
|
264
|
+
) -> Dict[str, Any]:
|
|
265
|
+
return RuntimeBoundaryContract(
|
|
266
|
+
name=name,
|
|
267
|
+
runtime=runtime,
|
|
268
|
+
entrypoint=entrypoint,
|
|
269
|
+
surface=surface,
|
|
270
|
+
owns=owns,
|
|
271
|
+
compatibility_aliases=list(compatibility_aliases or []),
|
|
272
|
+
).as_dict()
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
@runtime_checkable
|
|
276
|
+
class RuntimeBoundaryProtocol(Protocol):
|
|
277
|
+
"""Minimal shared surface for runtime boundary discovery.
|
|
278
|
+
|
|
279
|
+
Product ``AgentRuntime`` and core ``SingleAgentRuntime`` intentionally keep
|
|
280
|
+
different execution methods. This protocol only fixes the common inspection
|
|
281
|
+
surface that DI, readiness gates, and tests can depend on safely.
|
|
282
|
+
"""
|
|
283
|
+
|
|
284
|
+
def boundary(self) -> Dict[str, Any]: ...
|
|
285
|
+
|
|
286
|
+
def config(self) -> Dict[str, Any]: ...
|
|
287
|
+
|
|
288
|
+
|
|
226
289
|
def run_record_contract(run: Dict[str, Any], *, runtime: str = "multi_agent") -> Dict[str, Any]:
|
|
227
290
|
"""Build the family contract from a persisted agent run row."""
|
|
228
291
|
run = dict(run or {})
|
|
@@ -21,7 +21,7 @@ from typing import Any, Callable, Dict, List, Optional
|
|
|
21
21
|
from .contracts import multi_agent_contract
|
|
22
22
|
|
|
23
23
|
|
|
24
|
-
MULTI_AGENT_VERSION = "7.
|
|
24
|
+
MULTI_AGENT_VERSION = "7.9.0"
|
|
25
25
|
|
|
26
26
|
AGENT_ROLES = ("researcher", "planner", "executor", "reviewer", "release")
|
|
27
27
|
CORE_PIPELINE = ("planner", "executor", "reviewer")
|
package/latticeai/__init__.py
CHANGED
package/latticeai/core/agent.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""Single-agent runtime — the Discover→Plan→Implement→Verify state machine.
|
|
2
2
|
|
|
3
|
-
This module is the deep
|
|
4
|
-
``
|
|
3
|
+
This module is the deep single-agent loop: a small interface (``AgentDeps`` ports +
|
|
4
|
+
``SingleAgentRuntime.run_to_completion``) over the whole role-phased state machine
|
|
5
5
|
(planner → executor → critic → rollback → memory). It carries no FastAPI,
|
|
6
6
|
no globals, and no I/O of its own — every collaborator is injected through
|
|
7
7
|
``AgentDeps``.
|
|
@@ -23,14 +23,13 @@ from __future__ import annotations
|
|
|
23
23
|
import json
|
|
24
24
|
import logging
|
|
25
25
|
import re
|
|
26
|
-
import subprocess
|
|
27
26
|
from dataclasses import dataclass
|
|
28
27
|
from enum import Enum
|
|
29
28
|
from pathlib import Path
|
|
30
29
|
from typing import Any, Awaitable, Callable, Dict, FrozenSet, List, Optional
|
|
31
30
|
|
|
32
31
|
from lattice_brain.runtime.hooks import dispatch_tool
|
|
33
|
-
from lattice_brain.runtime.contracts import single_agent_contract
|
|
32
|
+
from lattice_brain.runtime.contracts import runtime_boundary_contract, single_agent_contract
|
|
34
33
|
from tools import ToolError
|
|
35
34
|
|
|
36
35
|
|
|
@@ -92,7 +91,7 @@ def extract_action(raw: str) -> Dict:
|
|
|
92
91
|
|
|
93
92
|
@dataclass
|
|
94
93
|
class AgentDeps:
|
|
95
|
-
"""The ports
|
|
94
|
+
"""The ports a :class:`SingleAgentRuntime` needs from the outside world.
|
|
96
95
|
|
|
97
96
|
Everything the state machine touches is here, so the loop can be exercised
|
|
98
97
|
against fakes. See module docstring for the two-adapter rationale.
|
|
@@ -125,6 +124,11 @@ class AgentDeps:
|
|
|
125
124
|
memory_updater_prompt: str
|
|
126
125
|
agent_root: Path
|
|
127
126
|
|
|
127
|
+
# ── rollback port (optional) ─────────────────────────────────────
|
|
128
|
+
# Production injects this from the tool dispatch service so this pure
|
|
129
|
+
# state machine does not shell out directly. Tests can pass a recorder.
|
|
130
|
+
rollback_file: Optional[Callable[[str], Dict[str, Any]]] = None
|
|
131
|
+
|
|
128
132
|
# ── lifecycle hooks port (optional) ──────────────────────────────
|
|
129
133
|
# When present, every tool execution fires the shared pre_tool/post_tool
|
|
130
134
|
# lifecycle, so the agent tool path no longer bypasses hooks.
|
|
@@ -137,12 +141,30 @@ class AgentDeps:
|
|
|
137
141
|
brain_memory: Any = None
|
|
138
142
|
|
|
139
143
|
|
|
140
|
-
class
|
|
144
|
+
class SingleAgentRuntime:
|
|
141
145
|
"""Drives the agent state machine over injected :class:`AgentDeps`."""
|
|
142
146
|
|
|
143
147
|
def __init__(self, deps: AgentDeps) -> None:
|
|
144
148
|
self.deps = deps
|
|
145
149
|
|
|
150
|
+
def boundary(self) -> Dict[str, Any]:
|
|
151
|
+
return runtime_boundary_contract(
|
|
152
|
+
name="SingleAgentRuntime",
|
|
153
|
+
runtime="single_agent",
|
|
154
|
+
entrypoint="latticeai.core.agent.SingleAgentRuntime",
|
|
155
|
+
surface="/agent",
|
|
156
|
+
owns="single-agent PLAN / EXECUTE / VERIFY state machine over injected ports",
|
|
157
|
+
compatibility_aliases=["latticeai.core.agent.AgentRuntime"],
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
def config(self) -> Dict[str, Any]:
|
|
161
|
+
return {
|
|
162
|
+
"boundary": self.boundary(),
|
|
163
|
+
"states": [state.value for state in AgentState],
|
|
164
|
+
"terminal_states": sorted(state.value for state in AGENT_TERMINAL_STATES),
|
|
165
|
+
"execution_mode": "injected_ports",
|
|
166
|
+
}
|
|
167
|
+
|
|
146
168
|
def contract(self, ctx: AgentRunContext, req: Any, *, run_id: Optional[str] = None) -> Dict[str, Any]:
|
|
147
169
|
"""Expose the shared agent-run contract for the single-agent loop."""
|
|
148
170
|
return single_agent_contract(ctx=ctx, goal=getattr(req, "message", ""), run_id=run_id)
|
|
@@ -405,12 +427,11 @@ class AgentRuntime:
|
|
|
405
427
|
path = result.get("path") or (step.get("args") or {}).get("path", "")
|
|
406
428
|
if not path:
|
|
407
429
|
continue
|
|
430
|
+
if d.rollback_file is None:
|
|
431
|
+
rolled.append({"path": path, "ok": False, "error": "rollback_file port is not configured"})
|
|
432
|
+
continue
|
|
408
433
|
try:
|
|
409
|
-
|
|
410
|
-
["git", "checkout", "--", path], cwd=str(d.agent_root),
|
|
411
|
-
capture_output=True, text=True, timeout=10,
|
|
412
|
-
)
|
|
413
|
-
rolled.append({"path": path, "ok": r.returncode == 0, "stderr": r.stderr[:200]})
|
|
434
|
+
rolled.append(d.rollback_file(str(path)))
|
|
414
435
|
except Exception as exc:
|
|
415
436
|
rolled.append({"path": path, "ok": False, "error": str(exc)})
|
|
416
437
|
|
|
@@ -491,3 +512,9 @@ class AgentRuntime:
|
|
|
491
512
|
ctx.state = AgentState.FAILED
|
|
492
513
|
|
|
493
514
|
ctx.state_history.append(ctx.state.value)
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
# Backward compatibility: external callers historically imported
|
|
518
|
+
# ``latticeai.core.agent.AgentRuntime`` for the single-agent state machine.
|
|
519
|
+
# The product/runtime facade lives at ``lattice_brain.runtime.agent_runtime``.
|
|
520
|
+
AgentRuntime = SingleAgentRuntime
|
|
@@ -21,7 +21,7 @@ from typing import Any, Callable, Dict, Iterable, List, Optional
|
|
|
21
21
|
from lattice_brain.runtime.contracts import realtime_event_contract, run_record_contract, workflow_run_contract
|
|
22
22
|
|
|
23
23
|
|
|
24
|
-
WORKSPACE_OS_VERSION = "7.
|
|
24
|
+
WORKSPACE_OS_VERSION = "7.9.0"
|
|
25
25
|
|
|
26
26
|
# Workspace types separate single-user Personal workspaces from shared
|
|
27
27
|
# Organization workspaces. Both keep the same local-first JSON store; the type
|
|
@@ -110,7 +110,7 @@ def architecture_readiness(root: Path | None = None) -> Dict[str, Any]:
|
|
|
110
110
|
runtime_module_count = len(list((root / "latticeai" / "runtime").glob("*.py")))
|
|
111
111
|
return {
|
|
112
112
|
"status": "complete" if all(gate.status == "complete" for gate in gates) else "incomplete",
|
|
113
|
-
"version_target": "7.
|
|
113
|
+
"version_target": "7.9.0",
|
|
114
114
|
"gates": [gate.__dict__ for gate in gates],
|
|
115
115
|
"metrics": {
|
|
116
116
|
"api_router_modules": api_router_count,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
"""Machine-checkable *product* readiness gates for the 7.
|
|
1
|
+
"""Machine-checkable *product* readiness gates for the 7.9 line.
|
|
2
2
|
|
|
3
3
|
Where ``architecture_readiness`` proves the internal structure is sound, this
|
|
4
|
-
module answers the product question the 7.
|
|
5
|
-
|
|
4
|
+
module answers the product question the 7.9 release exists to settle: *are the
|
|
5
|
+
runtime boundaries still clear and release-ready after hardening?* It does so honestly — every
|
|
6
6
|
gate is backed by evidence that is probed on disk, so a gate only reports
|
|
7
7
|
``complete`` when its evidence actually resolves. The same report can be printed
|
|
8
8
|
by ``scripts/product_readiness.py`` and re-run after every change, which is the
|
|
@@ -17,7 +17,7 @@ from typing import Any, Dict, List
|
|
|
17
17
|
|
|
18
18
|
from latticeai.services.architecture_readiness import architecture_readiness
|
|
19
19
|
|
|
20
|
-
PRODUCT_VERSION_TARGET = "7.
|
|
20
|
+
PRODUCT_VERSION_TARGET = "7.9.0"
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
@dataclass(frozen=True)
|
|
@@ -64,10 +64,10 @@ PRODUCT_GATES: List[ProductGate] = [
|
|
|
64
64
|
evidence=[
|
|
65
65
|
"package.json::release:artifacts",
|
|
66
66
|
"package.json::release:validate",
|
|
67
|
-
"README.md::dist/ltcai-7.
|
|
68
|
-
"README.md::dist/ltcai-7.
|
|
69
|
-
"README.md::dist/ltcai-7.
|
|
70
|
-
"README.md::ltcai-7.
|
|
67
|
+
"README.md::dist/ltcai-7.9.0-py3-none-any.whl",
|
|
68
|
+
"README.md::dist/ltcai-7.9.0.tar.gz",
|
|
69
|
+
"README.md::dist/ltcai-7.9.0.vsix",
|
|
70
|
+
"README.md::ltcai-7.9.0.tgz",
|
|
71
71
|
"scripts/validate_release_artifacts.py",
|
|
72
72
|
"scripts/release_smoke.py",
|
|
73
73
|
"Dockerfile",
|
|
@@ -83,12 +83,19 @@ PRODUCT_GATES: List[ProductGate] = [
|
|
|
83
83
|
title="Release story is documented and honest",
|
|
84
84
|
evidence=[
|
|
85
85
|
"README.md",
|
|
86
|
-
"README.md::The current release is **7.
|
|
87
|
-
"SECURITY.md::7.
|
|
88
|
-
"vscode-extension/README.md::**7.
|
|
89
|
-
"docs/CHANGELOG.md::## [7.
|
|
86
|
+
"README.md::The current release is **7.9.0",
|
|
87
|
+
"SECURITY.md::7.9.x (latest)",
|
|
88
|
+
"vscode-extension/README.md::**7.9.0",
|
|
89
|
+
"docs/CHANGELOG.md::## [7.9.0]",
|
|
90
90
|
"FEATURE_STATUS.md",
|
|
91
|
-
"RELEASE_NOTES_v7.
|
|
91
|
+
"RELEASE_NOTES_v7.9.0.md",
|
|
92
|
+
"latticeai/core/agent.py::SingleAgentRuntime",
|
|
93
|
+
"latticeai/core/agent.py::AgentRuntime = SingleAgentRuntime",
|
|
94
|
+
"lattice_brain/runtime/contracts.py::runtime-boundary/v1",
|
|
95
|
+
"lattice_brain/runtime/contracts.py::RuntimeBoundaryProtocol",
|
|
96
|
+
"lattice_brain/runtime/agent_runtime.py::def boundary",
|
|
97
|
+
"latticeai/core/agent.py::def boundary",
|
|
98
|
+
"latticeai/services/tool_dispatch.py::rollback_file",
|
|
92
99
|
],
|
|
93
100
|
),
|
|
94
101
|
ProductGate(
|
|
@@ -97,8 +104,8 @@ PRODUCT_GATES: List[ProductGate] = [
|
|
|
97
104
|
evidence=[
|
|
98
105
|
"scripts/brain_quality_eval.py",
|
|
99
106
|
"scripts/product_readiness.py",
|
|
100
|
-
"tests/unit/
|
|
101
|
-
"tests/visual/v3.spec.js
|
|
107
|
+
"tests/unit/test_v78_product_readiness.py",
|
|
108
|
+
"tests/visual/v3.spec.js::Brain Chat Home",
|
|
102
109
|
".github/workflows/ci.yml::scripts/product_readiness.py",
|
|
103
110
|
".github/workflows/release.yml::npm run lint",
|
|
104
111
|
],
|
|
@@ -8,11 +8,12 @@ from __future__ import annotations
|
|
|
8
8
|
|
|
9
9
|
from dataclasses import dataclass, field
|
|
10
10
|
from pathlib import Path
|
|
11
|
+
import subprocess
|
|
11
12
|
from typing import Any, Callable, Dict, Mapping, Optional
|
|
12
13
|
|
|
13
14
|
from fastapi import HTTPException
|
|
14
15
|
|
|
15
|
-
from latticeai.core.agent import AgentDeps,
|
|
16
|
+
from latticeai.core.agent import AgentDeps, SingleAgentRuntime
|
|
16
17
|
from latticeai.core.agent_prompts import (
|
|
17
18
|
CRITIC_PROMPT,
|
|
18
19
|
EXECUTOR_PROMPT,
|
|
@@ -106,6 +107,16 @@ class ToolDispatchService:
|
|
|
106
107
|
detail=f"'{tool_name}' 툴은 관리자 전용입니다.",
|
|
107
108
|
)
|
|
108
109
|
|
|
110
|
+
def rollback_file(self, path: str) -> Dict[str, Any]:
|
|
111
|
+
r = subprocess.run(
|
|
112
|
+
["git", "checkout", "--", path],
|
|
113
|
+
cwd=str(AGENT_ROOT),
|
|
114
|
+
capture_output=True,
|
|
115
|
+
text=True,
|
|
116
|
+
timeout=10,
|
|
117
|
+
)
|
|
118
|
+
return {"path": path, "ok": r.returncode == 0, "stderr": r.stderr[:200]}
|
|
119
|
+
|
|
109
120
|
|
|
110
121
|
DEFAULT_TOOL_DISPATCH_SERVICE = ToolDispatchService()
|
|
111
122
|
|
|
@@ -185,7 +196,7 @@ def build_agent_runtime(
|
|
|
185
196
|
hooks: Any = None,
|
|
186
197
|
brain_memory: Any = None,
|
|
187
198
|
dispatch_service: ToolDispatchService = DEFAULT_TOOL_DISPATCH_SERVICE,
|
|
188
|
-
) ->
|
|
199
|
+
) -> SingleAgentRuntime:
|
|
189
200
|
ensure_agent_root()
|
|
190
201
|
deps = AgentDeps(
|
|
191
202
|
generate_as=model_router.generate_as,
|
|
@@ -205,10 +216,11 @@ def build_agent_runtime(
|
|
|
205
216
|
critic_prompt=CRITIC_PROMPT,
|
|
206
217
|
memory_updater_prompt=MEMORY_UPDATER_PROMPT,
|
|
207
218
|
agent_root=AGENT_ROOT,
|
|
219
|
+
rollback_file=dispatch_service.rollback_file,
|
|
208
220
|
hooks=hooks,
|
|
209
221
|
brain_memory=brain_memory,
|
|
210
222
|
)
|
|
211
|
-
return
|
|
223
|
+
return SingleAgentRuntime(deps)
|
|
212
224
|
|
|
213
225
|
|
|
214
226
|
def tool_response(fn, *args):
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""Print the 7.
|
|
2
|
+
"""Print the 7.8 product-readiness scorecard and fail CI when incomplete.
|
|
3
3
|
|
|
4
4
|
Run it as often as you like — it re-probes the repo every time, so it is the
|
|
5
5
|
single objective answer to "is this a finished product yet?". Exit code is 0
|
package/src-tauri/Cargo.lock
CHANGED
package/src-tauri/Cargo.toml
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "7.
|
|
2
|
+
"version": "7.9.0",
|
|
3
3
|
"generated_at": "vite",
|
|
4
4
|
"entrypoints": {
|
|
5
5
|
"app": "/static/app/index.html"
|
|
6
6
|
},
|
|
7
7
|
"assets": {
|
|
8
8
|
"../node_modules/@tauri-apps/api/core.js": "/static/app/assets/core-CwxXejkd.js",
|
|
9
|
-
"_primitives-
|
|
10
|
-
"_textarea-
|
|
11
|
-
"index.html": "/static/app/assets/index-
|
|
12
|
-
"assets/index-
|
|
13
|
-
"src/pages/Act.tsx": "/static/app/assets/Act-
|
|
14
|
-
"src/pages/Brain.tsx": "/static/app/assets/Brain-
|
|
15
|
-
"src/pages/Capture.tsx": "/static/app/assets/Capture-
|
|
16
|
-
"src/pages/Library.tsx": "/static/app/assets/Library-
|
|
17
|
-
"src/pages/System.tsx": "/static/app/assets/System-
|
|
9
|
+
"_primitives-CD38lt4n.js": "/static/app/assets/primitives-CD38lt4n.js",
|
|
10
|
+
"_textarea-BZk6ybp5.js": "/static/app/assets/textarea-BZk6ybp5.js",
|
|
11
|
+
"index.html": "/static/app/assets/index-DbcEYJQ2.js",
|
|
12
|
+
"assets/index-C7g26IF6.css": "/static/app/assets/index-C7g26IF6.css",
|
|
13
|
+
"src/pages/Act.tsx": "/static/app/assets/Act-DOvf59ru.js",
|
|
14
|
+
"src/pages/Brain.tsx": "/static/app/assets/Brain-C7_0mEiI.js",
|
|
15
|
+
"src/pages/Capture.tsx": "/static/app/assets/Capture-B9Tlhzqr.js",
|
|
16
|
+
"src/pages/Library.tsx": "/static/app/assets/Library-BJPEEm5O.js",
|
|
17
|
+
"src/pages/System.tsx": "/static/app/assets/System-D6t9jo9V.js"
|
|
18
18
|
},
|
|
19
19
|
"vite": {
|
|
20
20
|
"../node_modules/@tauri-apps/api/core.js": {
|
|
@@ -23,22 +23,22 @@
|
|
|
23
23
|
"src": "../node_modules/@tauri-apps/api/core.js",
|
|
24
24
|
"isDynamicEntry": true
|
|
25
25
|
},
|
|
26
|
-
"_primitives-
|
|
27
|
-
"file": "assets/primitives-
|
|
26
|
+
"_primitives-CD38lt4n.js": {
|
|
27
|
+
"file": "assets/primitives-CD38lt4n.js",
|
|
28
28
|
"name": "primitives",
|
|
29
29
|
"imports": [
|
|
30
30
|
"index.html"
|
|
31
31
|
]
|
|
32
32
|
},
|
|
33
|
-
"_textarea-
|
|
34
|
-
"file": "assets/textarea-
|
|
33
|
+
"_textarea-BZk6ybp5.js": {
|
|
34
|
+
"file": "assets/textarea-BZk6ybp5.js",
|
|
35
35
|
"name": "textarea",
|
|
36
36
|
"imports": [
|
|
37
37
|
"index.html"
|
|
38
38
|
]
|
|
39
39
|
},
|
|
40
40
|
"index.html": {
|
|
41
|
-
"file": "assets/index-
|
|
41
|
+
"file": "assets/index-DbcEYJQ2.js",
|
|
42
42
|
"name": "index",
|
|
43
43
|
"src": "index.html",
|
|
44
44
|
"isEntry": true,
|
|
@@ -51,59 +51,59 @@
|
|
|
51
51
|
"src/pages/System.tsx"
|
|
52
52
|
],
|
|
53
53
|
"css": [
|
|
54
|
-
"assets/index-
|
|
54
|
+
"assets/index-C7g26IF6.css"
|
|
55
55
|
]
|
|
56
56
|
},
|
|
57
57
|
"src/pages/Act.tsx": {
|
|
58
|
-
"file": "assets/Act-
|
|
58
|
+
"file": "assets/Act-DOvf59ru.js",
|
|
59
59
|
"name": "Act",
|
|
60
60
|
"src": "src/pages/Act.tsx",
|
|
61
61
|
"isDynamicEntry": true,
|
|
62
62
|
"imports": [
|
|
63
63
|
"index.html",
|
|
64
|
-
"_primitives-
|
|
65
|
-
"_textarea-
|
|
64
|
+
"_primitives-CD38lt4n.js",
|
|
65
|
+
"_textarea-BZk6ybp5.js"
|
|
66
66
|
]
|
|
67
67
|
},
|
|
68
68
|
"src/pages/Brain.tsx": {
|
|
69
|
-
"file": "assets/Brain-
|
|
69
|
+
"file": "assets/Brain-C7_0mEiI.js",
|
|
70
70
|
"name": "Brain",
|
|
71
71
|
"src": "src/pages/Brain.tsx",
|
|
72
72
|
"isDynamicEntry": true,
|
|
73
73
|
"imports": [
|
|
74
74
|
"index.html",
|
|
75
|
-
"_primitives-
|
|
76
|
-
"_textarea-
|
|
75
|
+
"_primitives-CD38lt4n.js",
|
|
76
|
+
"_textarea-BZk6ybp5.js"
|
|
77
77
|
]
|
|
78
78
|
},
|
|
79
79
|
"src/pages/Capture.tsx": {
|
|
80
|
-
"file": "assets/Capture-
|
|
80
|
+
"file": "assets/Capture-B9Tlhzqr.js",
|
|
81
81
|
"name": "Capture",
|
|
82
82
|
"src": "src/pages/Capture.tsx",
|
|
83
83
|
"isDynamicEntry": true,
|
|
84
84
|
"imports": [
|
|
85
85
|
"index.html",
|
|
86
|
-
"_primitives-
|
|
86
|
+
"_primitives-CD38lt4n.js"
|
|
87
87
|
]
|
|
88
88
|
},
|
|
89
89
|
"src/pages/Library.tsx": {
|
|
90
|
-
"file": "assets/Library-
|
|
90
|
+
"file": "assets/Library-BJPEEm5O.js",
|
|
91
91
|
"name": "Library",
|
|
92
92
|
"src": "src/pages/Library.tsx",
|
|
93
93
|
"isDynamicEntry": true,
|
|
94
94
|
"imports": [
|
|
95
95
|
"index.html",
|
|
96
|
-
"_primitives-
|
|
96
|
+
"_primitives-CD38lt4n.js"
|
|
97
97
|
]
|
|
98
98
|
},
|
|
99
99
|
"src/pages/System.tsx": {
|
|
100
|
-
"file": "assets/System-
|
|
100
|
+
"file": "assets/System-D6t9jo9V.js",
|
|
101
101
|
"name": "System",
|
|
102
102
|
"src": "src/pages/System.tsx",
|
|
103
103
|
"isDynamicEntry": true,
|
|
104
104
|
"imports": [
|
|
105
105
|
"index.html",
|
|
106
|
-
"_primitives-
|
|
106
|
+
"_primitives-CD38lt4n.js"
|
|
107
107
|
]
|
|
108
108
|
}
|
|
109
109
|
}
|