feat: prepare 2.2.0 with UI and execution fixes
Add dark theme, richer Markdown and readable plugin results. Improve Android input evidence, response integrity and diagnostics. Unify lifecycle, guidance receipts and evidence sources across clients. Keep direct action dispatch without an added AI quota approval layer. Align version metadata at 2.2.0 and bundle Helper 1.2.2. Validation: 3063 backend tests before the version bump; 44 after. Frontend: 317 tests and production build passed.
This commit is contained in:
1 parent
83bcfd54d5
commit
fac4ccb760
146 files changed
+5689
-2033
No files matched your search
@@ -40,6 +40,7 @@ from typing import Any, Literal
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from artemis.runtime.cancellation import CancellationReason
|
||||
from artemis.utils.logger import get_logger
|
||||
from artemis.utils.notes import append_note_content, get_note_file_path
|
||||
from artemis.utils.plan_grammar import (
|
||||
@@ -1030,7 +1031,7 @@ async def spawn_pending_checkpoints(ctx, state, anchor_step_id: str | None) -> l
|
||||
# including failures, are never dropped), ledger-only.
|
||||
findings.extend(harvest_run(ctx, state, old_run, allow_side_effects=False))
|
||||
else:
|
||||
old_run.task.cancel()
|
||||
old_run.task.cancel(CancellationReason.SUPERSEDED)
|
||||
try:
|
||||
await old_run.task
|
||||
except (asyncio.CancelledError, Exception) as exc:
|
||||
@@ -1088,14 +1089,16 @@ async def settle_all_checkpoints(ctx, state) -> None:
|
||||
|
||||
timeout = float(_setting(ctx, "settlement_timeout", 120.0))
|
||||
tasks = [r.task for r in runs]
|
||||
cancel_reason = CancellationReason.OUTER_TIMEOUT
|
||||
try:
|
||||
_done, pending = await asyncio.wait(tasks, timeout=timeout)
|
||||
except Exception as e:
|
||||
logger.error(f"Settlement wait failed: {e}")
|
||||
cancel_reason = CancellationReason.UNKNOWN
|
||||
pending = {t for t in tasks if not t.done()}
|
||||
|
||||
for t in pending:
|
||||
t.cancel()
|
||||
t.cancel(cancel_reason)
|
||||
for t in pending:
|
||||
try:
|
||||
await t
|
||||
|
||||
@@ -63,6 +63,7 @@ from artemis.graph.perception import perception_node
|
||||
from artemis.graph.state import State
|
||||
from artemis.graph.visibility import strict_state
|
||||
from artemis.llm.diagnostics import final_review_error_text
|
||||
from artemis.runtime.cancellation import CancellationReason
|
||||
from artemis.services.llm import final_review_budget
|
||||
from artemis.tools.command_tool import (
|
||||
HANG_GUIDANCE,
|
||||
@@ -816,7 +817,7 @@ async def _process_plan_write(
|
||||
|
||||
if ctx.planner_task and not ctx.planner_task.done():
|
||||
# A newer write supersedes the in-flight validation.
|
||||
ctx.planner_task.cancel()
|
||||
ctx.planner_task.cancel(CancellationReason.SUPERSEDED)
|
||||
|
||||
ctx.pending_validated_plan = content_after
|
||||
initial_goal = (
|
||||
|
||||
@@ -148,6 +148,7 @@ async def perception_node(state: State, ctx: ArtemisContext) -> dict:
|
||||
injected_instruction = injected_payload.get("instruction")
|
||||
user_stop_requested = bool(injected_payload.get("release_loop"))
|
||||
if isinstance(injected_instruction, str) and injected_instruction.strip():
|
||||
ctx.rejected_pixel_targets = {}
|
||||
# User guidance outranks the plan's declared standards: every
|
||||
# check line that exists right now loses its machine
|
||||
# restoration for the rest of the run (kept on the run context,
|
||||
|
||||
Reference in new issue
Block a user