Skip to content

Staging#68

Merged
pnewsam merged 56 commits into
mainfrom
staging
Jun 23, 2026
Merged

Staging#68
pnewsam merged 56 commits into
mainfrom
staging

Conversation

@pnewsam

@pnewsam pnewsam commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

No description provided.

MinuraPunchihewa and others added 30 commits June 16, 2026 17:11
Creating a symlink on Windows requires Administrator or Developer Mode and
otherwise raises OSError (WinError 1314), which would crash memory layout
setup. _ensure_symlink now catches that and falls back to a one-time copy
so the app still starts, logging a clear warning that this harness's
memory will NOT be shared on such a platform (enable Developer Mode for
sharing). POSIX behavior is unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
martyna-mindsdb and others added 21 commits June 18, 2026 14:58
* return friendly message when tokens are exceeded

* add test coverage

---------

Co-authored-by: Max Stepanov <stpmax@yandex.ru>
…66)

* ENG-350: tag scratchpad results with cell_status (ok/timeout/error)

The SSE scratchpad-result event carried only the result string, so a
killed/timed-out cell was indistinguishable from a slow-but-running one in
the UI. Add a `cell_status` field (ok | timeout | error) classified from the
result text — markers mirror what anton emits (timeout/inactivity kill in
core/backends/local.py; `[error]` / empty-code "exec failed").

Additive field — older clients ignore it. The cowork desktop UI consumes it
in a follow-up PR to render killed vs running vs done. Timeout classification
takes precedence over the generic `[error]` bracket a killed cell also carries.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* ENG-350: classify cell_status from the structured cell error, not rendered text

Review fix: an exec result arrives as json.dumps(asdict(cell)), not
format_cell_result output — so the previous "[error]" sniff never matched
(runtime errors classified as ok), and sniffing the whole blob risked
misclassifying a successful cell whose own stdout contained "[error]" or
"Cell timed out".

Parse the JSON and inspect the cell's `error` field: empty -> ok; timeout/
inactivity text -> timeout; any other non-empty error -> error. Fall back to
a best-effort text sniff for non-JSON results (dump notebook, other tools).
Added a regression test for the success-with-markers-in-stdout case.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Max Stepanov <stpmax@yandex.ru>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Exposes the agent's act-first posture as a UserSettings toggle (default True),
overlaid onto AntonSettings and passed to ChatSessionConfig so the desktop
Settings switch controls whether Anton acts-and-surfaces-assumptions vs asks first.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(settings): act_first user setting wired to the agent
* feat(move): move a task to another project with its artifacts + files

Adds a task_objects index, a provenance-based reconcile (harness-agnostic),
and POST /conversations/{id}/move that relocates the task's owned artifact
folders (collision-prefixed, .published.json preserved) and re-tags its
attachment files to the destination project.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(move): attribute artifacts to a task via run-boundary snapshot

Anton runs with its own session id and never tags artifacts with the cowork
conversation_id, so provenance stays empty and moved tasks left their
artifacts behind. cowork-server now snapshots the project's artifact folders
before each turn (stream_response) and indexes any that appear afterward as
owned by that conversation — harness-agnostic, no agent change.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Max Stepanov <stpmax@yandex.ru>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
torrmal and others added 5 commits June 22, 2026 16:33
Inline artifact cards in chat previously came from a single path — the
HTML-only publish_or_preview tool — so non-HTML artifacts (datasets,
docs, images, …) never surfaced inline, and HTML only did if the agent
chose to call that tool.

Make it deterministic and uniform: at turn end each harness diffs the
project's artifacts dir (the SAME snapshot the move/index uses) and emits
a response.artifact_created event per new slug, carrying the artifact's
title/type/primary-file path. Anton rides it on its Stream* channel via a
new ArtifactCreated event; Hermes yields it as a dict its formatter maps.
Both go through the existing event-sink persistence, so cards replay
identically on reload. Older artifacts created before the index simply
have no card (acceptable).

- task_objects.new_artifact_cards(): shared payload builder over ArtifactStore
- anton/hermes harnesses: emit artifact_created after the turn
- both formatters: map it to response.artifact_created SSE

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add POST /artifacts/export — converts a document artifact (markdown/HTML)
to pdf|docx|html and writes the result into the same artifact folder.
Pure-Python pipeline (markdown → HTML → xhtml2pdf / htmldocx+python-docx),
no native deps or external binaries, so the desktop install stays clean
cross-platform. Runs in a threadpool; rejects non-document sources.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Inline artifact cards for every artifact type (both harnesses)
@pnewsam pnewsam merged commit ac18c54 into main Jun 23, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants