Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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