You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
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).