Skip to content

v2.6.0

Choose a tag to compare

@github-actions github-actions released this 25 Sep 10:14
6162349

Added

  • Native agent-session ingestion: gno sessions discovers local Codex, Claude Code, OpenClaw, and Hermes session stores and manually imports selected conversations into a dedicated archive (its own config file and named index), with structural human/assistant attribution, a provenance block per turn, best-effort credential redaction, incremental and idempotent reruns, partial-outcome receipts, status, and prune. Available through the CLI, MCP (gno_sessions_status, gno_sessions_import), REST (/api/sessions/*), the SDK (sessionsStatus, discoverSessions, importSessions), and a /sessions Web UI page. Nothing is imported, watched, or scheduled by default, and archived turns are never promoted to remembered facts. See Agent Sessions.
  • Opt-in session automation: gno sessions automation profiles name registered sources and switch on a Claude Code SessionEnd hook (one owned settings entry, verified with Claude Code 2.1.280) and/or an elapsed-cadence schedule separately. Triggers only mark a profile pending durably; gno daemon on the archive drains pending work at startup and every 30 seconds through the manual importer, and gno sessions automation run runs a profile now. Status on every surface shows daemon availability, pending/running/partial/failed state, last success, next due time, and recovery actions; missed intervals coalesce, failed runs back off, and pause/remove only touch GNO's own hook entry. Also available as MCP gno_sessions_automation_run, REST /api/sessions/automation/*, SDK runSessionsAutomation(), and an Automation panel on /sessions. Install, upgrade, repair, and restart never enable automation. See Automation.
  • Opt-in request IDs for retry-safe writes: --request-id on gno capture and gno remember, requestId on MCP gno_capture / gno_remember, REST POST /api/capture, POST /api/memory/remember, and PUT /api/docs/:id, and SDK client.capture() / client.remember(). Retrying with the same ID replays or finishes the write instead of writing twice. Requests are recorded in a private per-index ledger that index maintenance and gno reset keep.
  • Request lookup before retrying: gno request-status <id>, MCP gno_request_status (write-enabled full profile), GET /api/requests/:requestId, and client.requestStatus(), returning pending, committed, expired, or not_found with a content-free result pointer.
  • The Web UI capture dialog, editor saves, and tag saves reuse one request ID while retrying the same change, so a save whose response was lost returns the committed result instead of a false conflict.

Changed

  • REST document saves (PUT /api/docs/:id, used by the editor and tag editing) run their revision check and write under the shared write lease: two saves from the same revision can no longer both succeed (one gets 409 CONFLICT), and a lease that stays busy returns 409 LOCKED without writing.
  • gno capture and client.capture() now plan and write under the shared write lease, so a busy lease returns the busy error. Without a request ID their sync outcome is unchanged (sync.status: "failed" or "skipped"); with one, a sync failure is an error and the request stays pending until retried.
  • MCP on the full profile now registers 37 read-only tools (adds gno_sessions_status) and 59 with --enable-write (adds gno_request_status, gno_sessions_status, gno_sessions_import, and gno_sessions_automation_run).