Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ ignore = "=0.4.25"
notify = "=8.2.0"
notify-debouncer-full = "=0.7.0"
fs2 = "=0.4.3"
# Hermes' session database (`fragment session import`), read-only; the
# bundled SQLite, as crates/core's host side pins it
rusqlite = { version = "0.40", default-features = false, features = ["bundled"] }
tungstenite = { version = "=0.29.0", features = ["rustls-tls-webpki-roots", "rustls-tls-native-roots"] }


Expand Down
15 changes: 11 additions & 4 deletions cli/GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -858,16 +858,23 @@ The conversations you had with an agent somewhere else, kept in a
private fragment of yours (kind `sessions`, titled Session Archive, made
the first time you import): one file a conversation, under `sessions/`,
and one index a kind, under `index/`, newest first. Bring them in from
the old Finite's export (its `chats/`, or the folder holding it):
the old Finite's export (its `chats/`, or the folder holding it), or
from Hermes' own `state.db` (or the Hermes home holding it), read-only:

```
fragment session import ~/finite-import/export # the old Finite's export, unpacked
fragment session import ~/finite-import/export --kind chat # only chats (also: cron, subagent)
fragment session import ~/.hermes # a Hermes home, or its state.db
fragment session import ~/.hermes --kind chat # only chats (also: cron, subagent)
```

A `state.db` copied from elsewhere needs its `state.db-wal` beside it, or
its newest messages are not in it. On an agent's computer here, its own
Hermes databases are refused: their conversations are your chats here
already.

Each conversation is kept by its own id, so importing again adds
nothing twice, and a newer copy of one (a later export) replaces the
older; an older copy never does. It says what it added, updated and
nothing twice, and a newer copy of one (a later export, the same chats
from Hermes' database) replaces the older; an older copy never does. It says what it added, updated and
already had, and what it left out and why: at most 18,000 conversations
and 1 GiB an archive (an import past either adds nothing), 8 MiB a
conversation. A tool's output and an agent's reasoning are cut to 2,000
Expand Down
123 changes: 123 additions & 0 deletions cli/src/session/hermes-v0.21.7.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
CREATE TABLE sessions (
id TEXT PRIMARY KEY,
source TEXT NOT NULL,
created_source TEXT,
user_id TEXT,
session_key TEXT,
chat_id TEXT,
chat_type TEXT,
thread_id TEXT,
display_name TEXT,
origin_json TEXT,
expiry_finalized INTEGER DEFAULT 0,
model TEXT,
model_config TEXT,
system_prompt TEXT,
system_prompt_hash TEXT,
parent_session_id TEXT,
started_at REAL NOT NULL,
ended_at REAL,
end_reason TEXT,
message_count INTEGER DEFAULT 0,
tool_call_count INTEGER DEFAULT 0,
input_tokens INTEGER DEFAULT 0,
output_tokens INTEGER DEFAULT 0,
cache_read_tokens INTEGER DEFAULT 0,
cache_write_tokens INTEGER DEFAULT 0,
reasoning_tokens INTEGER DEFAULT 0,
cwd TEXT,
git_branch TEXT,
git_repo_root TEXT,
git_metadata_generation INTEGER NOT NULL DEFAULT 0,
billing_provider TEXT,
billing_base_url TEXT,
billing_mode TEXT,
estimated_cost_usd REAL,
actual_cost_usd REAL,
cost_status TEXT,
cost_source TEXT,
pricing_version TEXT,
title TEXT,
title_source TEXT,
last_activity_at REAL,
last_activity_description TEXT,
last_activity_provenance TEXT,
api_call_count INTEGER DEFAULT 0,
handoff_state TEXT,
handoff_platform TEXT,
handoff_error TEXT,
compression_failure_cooldown_until REAL,
compression_failure_error TEXT,
compression_fallback_streak INTEGER NOT NULL DEFAULT 0,
compression_ineffective_count INTEGER NOT NULL DEFAULT 0,
compression_recovery_deadline REAL,
compression_overload_streak INTEGER NOT NULL DEFAULT 0,
profile_name TEXT,
transport_profile TEXT,
rewind_count INTEGER NOT NULL DEFAULT 0,
archived INTEGER NOT NULL DEFAULT 0,
auto_archived INTEGER NOT NULL DEFAULT 0,
pinned INTEGER NOT NULL DEFAULT 0,
hidden INTEGER NOT NULL DEFAULT 0,
last_read_at REAL,
tool_names TEXT,
FOREIGN KEY (parent_session_id) REFERENCES sessions(id),
FOREIGN KEY (system_prompt_hash) REFERENCES system_prompts(hash)
);
CREATE TABLE messages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
session_id TEXT NOT NULL REFERENCES sessions(id),
role TEXT NOT NULL,
content TEXT,
tool_call_id TEXT,
tool_calls TEXT,
tool_name TEXT,
effect_disposition TEXT,
timestamp REAL NOT NULL,
token_count INTEGER,
finish_reason TEXT,
reasoning TEXT,
reasoning_content TEXT,
reasoning_details TEXT,
codex_reasoning_items TEXT,
codex_message_items TEXT,
platform_message_id TEXT,
observed INTEGER DEFAULT 0,
_compressed_summary INTEGER NOT NULL DEFAULT 0,
active INTEGER NOT NULL DEFAULT 1,
compacted INTEGER NOT NULL DEFAULT 0,
api_content TEXT,
display_kind TEXT,
display_metadata TEXT,
display_identity BLOB,
display_order INTEGER,
message_uid TEXT,
absorbed_message_uids TEXT,
tool_call_uids TEXT,
tool_call_uid TEXT
);
INSERT INTO sessions VALUES('20261001_090000_root01','telegram','telegram',NULL,'tg:1',NULL,NULL,NULL,'Ann',NULL,0,'m1',NULL,NULL,NULL,NULL,1793399746.8818233,1793399746.924113,'compression',5,1,0,0,0,0,0,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'Beans','user',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,0,0,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL);
INSERT INTO sessions VALUES('20261001_091000_cont01','telegram','telegram',NULL,'tg:1',NULL,NULL,NULL,'Ann',NULL,0,'m2',NULL,NULL,NULL,'20261001_090000_root01',1793399746.9262304,NULL,NULL,4,0,0,0,0,0,0,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,0,0,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL);
INSERT INTO sessions VALUES('20261001_100000_branch','cli','cli',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,'{"_branched_from": "20261001_090000_root01"}',NULL,NULL,'20261001_090000_root01',1793399746.9374292,NULL,NULL,1,0,0,0,0,0,0,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,0,0,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL);
INSERT INTO sessions VALUES('20261002_090000_reset1','telegram','telegram',NULL,'tg:1',NULL,NULL,NULL,NULL,NULL,0,NULL,'{"_reset_from": "20261001_091000_cont01"}',NULL,NULL,'20261001_091000_cont01',1793399746.9418957,1793399746.946435,'compression',1,0,0,0,0,0,0,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,0,0,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL);
INSERT INTO sessions VALUES('20261002_093000_reset2','telegram','telegram',NULL,'tg:1',NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,'20261002_090000_reset1',1793399746.9490545,NULL,NULL,1,0,0,0,0,0,0,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,0,0,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL);
INSERT INTO sessions VALUES('cron_digest_20261003_0600','cron','cron',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,1793399746.9536676,NULL,NULL,1,0,0,0,0,0,0,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,0,0,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL);
INSERT INTO sessions VALUES('20261001_091500_dlg001','cli','cli',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,'{"_delegate_from": "20261001_091000_cont01"}',NULL,NULL,'20261001_091000_cont01',1793399746.9583423,NULL,NULL,1,0,0,0,0,0,0,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,0,0,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL);
INSERT INTO sessions VALUES('20261001_092000_dlg002','cli','cli',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,'{"_delegate_from": "20261001_091000_cont01"}',NULL,NULL,NULL,1793399746.96299,NULL,NULL,1,0,0,0,0,0,0,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,0,0,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL);
INSERT INTO messages VALUES(1,'20261001_090000_root01','user','plant beans?',NULL,NULL,NULL,NULL,1790845200.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,NULL,NULL,NULL,X'04d690c92235188eb8c56dcdc5f53d80fe89a3fb2e3c33bb0366b57d3ef60c04',1,'707f051322ac446b85896f05b0679b39',NULL,NULL,NULL);
INSERT INTO messages VALUES(2,'20261001_090000_root01','assistant',NULL,NULL,'[{"id": "call_1", "type": "function", "function": {"name": "web_search", "arguments": "{\"q\": \"beans\"}"}}]',NULL,NULL,1790845201.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,NULL,NULL,NULL,X'222692f2ea5313cadd497e8ec94d6262159fa0ea4baa5311bea52dd1199e1d36',2,'4e61496094244e579163b38141a12161',NULL,'{"call_1": "1af303be9f174ea58ad2f0c6f73f3e1c"}',NULL);
INSERT INTO messages VALUES(3,'20261001_090000_root01','tool','beans like warm soil','call_1',NULL,'web_search',NULL,1790845202.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,NULL,NULL,NULL,X'28e604c3929ebd352b74c365c2388b937d234c27f23cb41e1cb99c56bb14e071',3,'a22b390e7e1048499eda9e44e92cfe53',NULL,NULL,NULL);
INSERT INTO messages VALUES(4,'20261001_090000_root01','assistant','In spring, once the soil is warm.',NULL,NULL,NULL,NULL,1790845203.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,NULL,NULL,NULL,X'33fe6b65b5631452300ced9a6fdc3941032aad34c4e638f95fca88badab22634',4,'2b64eca7445847e18707ae75040d400e',NULL,NULL,NULL);
INSERT INTO messages VALUES(5,'20261001_090000_root01','user','' || char(0) || 'json:[{"type": "text", "text": "here is my plot"}, {"type": "image_url", "image_url": {"url": "data:image/png;base64,AAAA"}}]',NULL,NULL,NULL,NULL,1790845204.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,NULL,NULL,NULL,X'90d2bef20830b1b4d7c331c3906a85f87d5b9f66a638d3edff89d55396bc619e',5,'19f80a759d904783a315bc0940b92ea4',NULL,NULL,NULL);
INSERT INTO messages VALUES(6,'20261001_091000_cont01','user','Summary: we talked about beans.
--- END OF CONTEXT SUMMARY — respond to the message below, not the summary above ---
and peas?',NULL,NULL,NULL,NULL,1790845800.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'hidden',NULL,X'4e8df5c654d8377143b485e082698470fb05d8fb2d414168625f44e326fb7fed',6,'0accbc8a08af4481a1df34cc30745c8e',NULL,NULL,NULL);
INSERT INTO messages VALUES(7,'20261001_091000_cont01','assistant','In spring, once the soil is warm.',NULL,NULL,NULL,NULL,1790845203.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,NULL,NULL,NULL,X'33fe6b65b5631452300ced9a6fdc3941032aad34c4e638f95fca88badab22634',7,'10671086a4054f0c9afe468dcc331739',NULL,NULL,NULL);
INSERT INTO messages VALUES(8,'20261001_091000_cont01','assistant','Peas too.',NULL,NULL,NULL,NULL,1790845801.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,NULL,NULL,NULL,X'8cd470f11ecdd06a37546e99a9afc5deedda91f7e2870c5fb21fcc90234ce1a8',8,'7b61451217664276adc0c0b4140c0d69',NULL,NULL,NULL);
INSERT INTO messages VALUES(9,'20261001_091000_cont01','user','for the model only',NULL,NULL,NULL,NULL,1790845802.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,NULL,NULL,'{"model_only": true}',X'1b27ae7aa3a6ef4ccb00d714a6f54643646feeb378b454d835726280cc2994a5',9,'bc8cb2dc6de74735b9f9cc27b20d2b4e',NULL,NULL,NULL);
INSERT INTO messages VALUES(10,'20261001_100000_branch','user','what about corn?',NULL,NULL,NULL,NULL,1790848800.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,NULL,NULL,NULL,X'7c5ce8cab080c26a063bed471c5e337916cc33be2b70d729fbc5fb0ef67bc8bb',10,'498c9232b4234ecaae3e3454872b05e9',NULL,NULL,NULL);
INSERT INTO messages VALUES(11,'20261002_090000_reset1','user','new day, new plan',NULL,NULL,NULL,NULL,1790931600.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,NULL,NULL,NULL,X'67f6e20ef6def8bfd1b5b44f644f39af5d9332c3699a09fd23261d3f0b5a3ea2',11,'f9203ac148ab47329bea8bf55b51c168',NULL,NULL,NULL);
INSERT INTO messages VALUES(12,'20261002_093000_reset2','assistant','here is the plan',NULL,NULL,NULL,NULL,1790933400.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,NULL,NULL,NULL,X'5d0efb5bfed69a00fc19edefca838aac2abd6a355d22fec68922da6f22aee822',12,'2bc3ec8b7db24967afd3bb09da24a4ed',NULL,NULL,NULL);
INSERT INTO messages VALUES(13,'cron_digest_20261003_0600','user','the morning digest',NULL,NULL,NULL,NULL,1791018000.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,NULL,NULL,NULL,X'2c2f98475fa13242a73cab8c007bc468032a22526df661fc16cc3e367d3a1826',13,'9fecfd69311b40f0bb42ebca6039a639',NULL,NULL,NULL);
INSERT INTO messages VALUES(14,'20261001_091500_dlg001','user','look up pea varieties',NULL,NULL,NULL,NULL,1790846100.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,NULL,NULL,NULL,X'efc03e9d88404f886d599cf09b109918ea056b44b018adffcba5721fe95cc258',14,'9ee1fa5ea19442cd9ec18ff283611663',NULL,NULL,NULL);
INSERT INTO messages VALUES(15,'20261001_092000_dlg002','user','a pruned side task',NULL,NULL,NULL,NULL,1790846400.0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,NULL,NULL,NULL,X'fa24472750f9747c90ab1136b6aed78ac9c111f752175933485eeb87fe6f2f7a',15,'8b8d5734d50246c69658076a994c1ad9',NULL,NULL,NULL);
Loading
Loading